@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":"router.mjs","names":[],"sources":["../../../../../../@warlock.js/core/src/router/router.ts"],"sourcesContent":["import proxy, { type FastifyHttpProxyOptions } from \"@fastify/http-proxy\";\r\nimport fastifyStatic, { type FastifyStaticOptions } from \"@fastify/static\";\r\nimport concatRoute from \"@mongez/concat-route\";\r\nimport { ltrim, merge, toCamelCase, trim } from \"@mongez/reinforcements\";\r\nimport { isEmpty } from \"@mongez/supportive-is\";\r\nimport { log } from \"@warlock.js/logger\";\r\nimport type { FastifyReply, FastifyRequest } from \"fastify\";\r\nimport { container } from \"../container\";\r\nimport { Request } from \"../http/request\";\r\nimport { Response } from \"../http/response\";\r\nimport { type FastifyInstance } from \"../http/server\";\r\nimport { RouteBuilder } from \"./route-builder\";\r\nimport { RouteRegistry } from \"./route-registry\";\r\nimport type {\r\n GroupedRoutesOptions,\r\n RequestHandler,\r\n RequestHandlerType,\r\n RequestHandlerValidation,\r\n ResourceMethod,\r\n Route,\r\n RouteOptions,\r\n RouteResource,\r\n RouterGroupCallback,\r\n RouterStacks,\r\n} from \"./types\";\r\n\r\nexport class Router {\r\n /**\r\n * Routes list\r\n */\r\n private routes: Route[] = [];\r\n\r\n /**\r\n * Router Instance\r\n */\r\n private static instance: Router;\r\n\r\n /**\r\n * Static paths\r\n */\r\n protected staticDirectories: FastifyStaticOptions[] = [];\r\n\r\n /**\r\n * Event listeners\r\n */\r\n protected eventListeners: Record<string, ((router: Router, server: FastifyInstance) => void)[]> =\r\n {};\r\n\r\n /**\r\n * Stacks\r\n * Stacks will be used for grouping routes to add prefix, name or middleware\r\n */\r\n protected stacks: RouterStacks = {\r\n prefix: [],\r\n name: [],\r\n middleware: [],\r\n };\r\n\r\n /**\r\n * Get router instance\r\n */\r\n public static getInstance() {\r\n if (!Router.instance) {\r\n Router.instance = new Router();\r\n }\r\n\r\n return Router.instance;\r\n }\r\n\r\n private constructor() {\r\n //\r\n }\r\n\r\n /**\r\n * Listen to router before scan\r\n */\r\n public beforeScanning(callback: (router: Router, server: FastifyInstance) => void) {\r\n this.eventListeners.beforeScan = [...(this.eventListeners.beforeScan || []), callback];\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Listen to router after scanning\r\n */\r\n public afterScanning(callback: (router: Router, server: FastifyInstance) => void) {\r\n this.eventListeners.afterScanning = [...(this.eventListeners.afterScanning || []), callback];\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Redirect path to another path\r\n */\r\n public redirect(from: string, to: string, redirectMode: \"temporary\" | \"permanent\" = \"temporary\") {\r\n return this.get(from, (_request, response) => {\r\n response.redirect(to, redirectMode === \"temporary\" ? 302 : 301);\r\n });\r\n }\r\n\r\n /**\r\n * Server static folder\r\n */\r\n public directory(options: FastifyStaticOptions) {\r\n this.staticDirectories.push(options);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Serve file\r\n */\r\n public file(path: string, location: string, cacheTime?: number) {\r\n return this.get(path, (_request, response) => {\r\n response.sendFile(location, cacheTime);\r\n });\r\n }\r\n\r\n /**\r\n * Serve cached file, it will cache the file to 1 year by default\r\n */\r\n public cachedFile(path: string, location: string, cacheTime?: number) {\r\n return this.get(path, (_request, response) => {\r\n response.sendCachedFile(location, cacheTime);\r\n });\r\n }\r\n\r\n /**\r\n * Serve list of files\r\n */\r\n public files(files: Record<string, string>, cacheTime?: number) {\r\n for (const [path, location] of Object.entries(files)) {\r\n this.get(path, (_request, response) => {\r\n response.sendFile(location, cacheTime);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Serve list of cached files, it will cache the file to 1 year by default\r\n */\r\n public cachedFiles(files: Record<string, string>, cacheTime?: number) {\r\n for (const [path, location] of Object.entries(files)) {\r\n this.get(path, (_request, response) => {\r\n response.sendCachedFile(location, cacheTime);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Add proxy route\r\n */\r\n public proxy(\r\n path: string,\r\n baseUrl: string,\r\n options?: Omit<FastifyHttpProxyOptions, \"prefix\" | \"upstream\">,\r\n ): this;\r\n public proxy(options: FastifyHttpProxyOptions): this;\r\n public proxy(...args: any[]) {\r\n this.beforeScanning((_router, server) => {\r\n if (args.length === 1) {\r\n server.register(proxy, args[0]);\r\n } else {\r\n server.register(proxy, {\r\n prefix: args[0],\r\n upstream: args[1],\r\n ...args[2],\r\n });\r\n }\r\n });\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Add route to routes list\r\n */\r\n public add(\r\n method: Route[\"method\"],\r\n path: string | string[],\r\n handler: RequestHandlerType,\r\n options: RouteOptions = {},\r\n ) {\r\n if (Array.isArray(path)) {\r\n path.forEach((p) => this.add(method, p, handler, options));\r\n return this;\r\n }\r\n\r\n const prefix = this.stacks.prefix.reduce((path, prefix) => {\r\n return concatRoute(path, prefix);\r\n }, \"\");\r\n\r\n const name = this.stacks.name.reduceRight(\r\n (name, prefixName) => {\r\n return trim(prefixName + \".\" + name, \".\");\r\n },\r\n options.name || trim(path.replace(/\\//g, \".\"), \".\"),\r\n );\r\n\r\n path = concatRoute(prefix, path);\r\n\r\n const middlewarePrecedence = options.middlewarePrecedence || \"after\";\r\n\r\n if (middlewarePrecedence === \"before\") {\r\n options.middleware = [...(options.middleware || []), ...this.stacks.middleware];\r\n } else {\r\n options.middleware = [...this.stacks.middleware, ...(options.middleware || [])];\r\n }\r\n\r\n if (Array.isArray(handler)) {\r\n const [controller, action] = handler;\r\n\r\n if (typeof controller[action] !== \"function\") {\r\n throw new Error(\r\n `Invalid controller action \"${action}\" for controller \"${controller.constructor.name}\"`,\r\n );\r\n }\r\n\r\n handler = controller[action].bind(controller) as RequestHandler;\r\n\r\n if (!handler.validation) {\r\n handler.validation = {};\r\n if (controller[`${action}ValidationSchema`]) {\r\n handler.validation.schema = controller[`${action}ValidationSchema`]();\r\n }\r\n\r\n if (controller[`${action}Validate`]) {\r\n handler.validation.validate = controller[`${action}Validate`];\r\n }\r\n }\r\n }\r\n\r\n const routeData: Route = {\r\n method,\r\n path,\r\n handler,\r\n ...options,\r\n name,\r\n rateLimit: options.rateLimit,\r\n $prefix: prefix || \"/\",\r\n // it must be a new array to avoid modifying the original array\r\n $prefixStack: [...this.stacks.prefix],\r\n // Inject source file from stacks if set\r\n sourceFile: this.stacks.sourceFile || \"\",\r\n };\r\n\r\n if (routeData.name) {\r\n // check if the name exists\r\n const route = this.routes.find((route) => route.name === routeData.name);\r\n\r\n if (route) {\r\n // check again if the route name exists with the same method\r\n if (route.method === routeData.method) {\r\n throw new Error(`Route name \"${routeData.name}\" already exists`);\r\n } else {\r\n routeData.name += `.${routeData.method.toLowerCase()}`;\r\n }\r\n }\r\n }\r\n\r\n this.routes.push(routeData);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Add a request that accepts all methods\r\n */\r\n public any(path: string, handler: RequestHandlerType, options: RouteOptions = {}) {\r\n return this.add(\"all\" as Route[\"method\"], path, handler, options);\r\n }\r\n\r\n /**\r\n * Add get request method\r\n */\r\n public get(path: string, handler: RequestHandlerType, options: RouteOptions = {}) {\r\n return this.add(\"GET\", path, handler, options);\r\n }\r\n\r\n /**\r\n * Add post request method\r\n */\r\n public post(path: string | string[], handler: RequestHandlerType, options: RouteOptions = {}) {\r\n return this.add(\"POST\", path, handler, options);\r\n }\r\n\r\n /**\r\n * Add put request method\r\n */\r\n public put(path: string, handler: RequestHandlerType, options: RouteOptions = {}) {\r\n return this.add(\"PUT\", path, handler, options);\r\n }\r\n\r\n /**\r\n * Add delete request method\r\n */\r\n public delete(path: string | string[], handler: RequestHandlerType, options: RouteOptions = {}) {\r\n return this.add(\"DELETE\", path, handler, options);\r\n }\r\n\r\n /**\r\n * Add patch request method\r\n */\r\n public patch(path: string, handler: RequestHandlerType, options: RouteOptions = {}) {\r\n return this.add(\"PATCH\", path, handler, options);\r\n }\r\n\r\n /**\r\n * Add head request method\r\n */\r\n public head(path: string, handler: RequestHandlerType, options: RouteOptions = {}) {\r\n return this.add(\"HEAD\", path, handler, options);\r\n }\r\n\r\n /**\r\n * Add options request method\r\n */\r\n public options(path: string, handler: RequestHandlerType, options: RouteOptions = {}) {\r\n return this.add(\"OPTIONS\", path, handler, options);\r\n }\r\n\r\n /**\r\n * Get a chainable route builder for the same route path\r\n */\r\n public route(path: string, options: RouteOptions = {}) {\r\n return new RouteBuilder(this, path, options);\r\n }\r\n\r\n /**\r\n * Add full restful resource routes\r\n * This method will generate the following routes:\r\n * 1. GET /path: list all resources\r\n * 2. GET /path/:id: get a single resource\r\n * 3. POST /path: create a new resource\r\n * 4. PUT /path/:id: update a resource\r\n * 5. DELETE /path/:id: delete a resource\r\n * 6. PATCH /path/:id: update a resource partially\r\n */\r\n public restfulResource(\r\n path: string,\r\n resource: RouteResource,\r\n options: RouteOptions & {\r\n only?: ResourceMethod[];\r\n except?: ResourceMethod[];\r\n replace?: Partial<Record<ResourceMethod, RequestHandler>> & {\r\n bulkDelete?: RequestHandler;\r\n };\r\n } = {},\r\n ) {\r\n return this.prefix(path, () => {\r\n path = \"\";\r\n // get base resource name\r\n const baseResourceName = options.name || toCamelCase(ltrim(path, \"/\"));\r\n\r\n // clone the resource so we don't mess up with it\r\n const routeResource = resource;\r\n\r\n const isAcceptableResource = (type: ResourceMethod) => {\r\n return Boolean(\r\n // check if the route is not excluded\r\n (!options.except || !options.except.includes(type)) &&\r\n // check if the only option is set and the route is included\r\n (!options.only || options.only.includes(type)),\r\n );\r\n };\r\n\r\n if (routeResource.list && isAcceptableResource(\"list\")) {\r\n const resourceName = baseResourceName + \".list\";\r\n this.get(path, options.replace?.list || routeResource.list.bind(routeResource), {\r\n ...options,\r\n name: resourceName,\r\n restful: true,\r\n });\r\n }\r\n\r\n if (routeResource.get && isAcceptableResource(\"get\")) {\r\n const resourceName = baseResourceName + \".single\";\r\n\r\n this.get(path + \"/:id\", options.replace?.get || routeResource.get.bind(routeResource), {\r\n ...options,\r\n name: resourceName,\r\n restful: true,\r\n });\r\n }\r\n\r\n if (routeResource.create && isAcceptableResource(\"create\")) {\r\n const resourceName = baseResourceName + \".create\";\r\n\r\n const handler = options.replace?.create || this.manageValidation(routeResource, \"create\");\r\n\r\n this.post(path, handler, {\r\n ...options,\r\n name: resourceName,\r\n restful: true,\r\n });\r\n }\r\n\r\n if (routeResource.update && isAcceptableResource(\"update\")) {\r\n const resourceName = baseResourceName + \".update\";\r\n\r\n const handler = options.replace?.update || this.manageValidation(routeResource, \"update\");\r\n\r\n this.put(path + \"/:id\", handler, {\r\n ...options,\r\n name: resourceName,\r\n restful: true,\r\n });\r\n }\r\n\r\n if (routeResource.patch && isAcceptableResource(\"patch\")) {\r\n const resourceName = baseResourceName + \".patch\";\r\n\r\n const handler = options.replace?.patch || this.manageValidation(routeResource, \"patch\");\r\n\r\n this.patch(path + \"/:id\", handler, {\r\n ...options,\r\n name: resourceName,\r\n restful: true,\r\n });\r\n }\r\n\r\n if (routeResource.delete && isAcceptableResource(\"delete\")) {\r\n const resourceName = baseResourceName + \".delete\";\r\n\r\n this.delete(\r\n path + \"/:id\",\r\n options.replace?.delete || routeResource.delete.bind(routeResource),\r\n {\r\n ...options,\r\n name: resourceName,\r\n restful: true,\r\n },\r\n );\r\n }\r\n\r\n if (routeResource.bulkDelete && isAcceptableResource(\"delete\")) {\r\n const resourceName = baseResourceName + \".bulkDelete\";\r\n\r\n this.delete(\r\n path,\r\n options.replace?.bulkDelete || routeResource.bulkDelete.bind(routeResource),\r\n {\r\n ...options,\r\n name: resourceName,\r\n restful: true,\r\n },\r\n );\r\n }\r\n\r\n return this;\r\n });\r\n }\r\n\r\n /**\r\n * Group routes with options\r\n */\r\n public group(options: GroupedRoutesOptions, callback: RouterGroupCallback) {\r\n const {\r\n prefix,\r\n // name must always be defined because\r\n // if there are multiple groups without name\r\n // they might generate the same route name\r\n // thus causing an error\r\n // in this case we need always to make sure that\r\n // the name is always defined.\r\n name = prefix ? trim(prefix.replace(/\\//g, \".\"), \".\") : undefined,\r\n middleware,\r\n } = options;\r\n\r\n if (prefix) {\r\n this.stacks.prefix.push(prefix);\r\n }\r\n\r\n if (name) {\r\n this.stacks.name.push(name);\r\n }\r\n\r\n if (middleware) {\r\n this.stacks.middleware.push(...middleware);\r\n }\r\n\r\n callback();\r\n\r\n if (prefix) {\r\n this.stacks.prefix.pop();\r\n }\r\n\r\n if (name) {\r\n this.stacks.name.pop();\r\n }\r\n\r\n if (middleware) {\r\n this.stacks.middleware.splice(\r\n this.stacks.middleware.length - middleware.length,\r\n middleware.length,\r\n );\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Add prefix to all routes in the given callback\r\n */\r\n public prefix(prefix: string, callback: () => void) {\r\n return this.group({ prefix }, callback);\r\n }\r\n\r\n /**\r\n * Add API version prefix to all routes in the given callback\r\n * Automatically formats the version as /v{version}\r\n * @example\r\n * router.version(\"1\", () => {\r\n * router.get(\"/users\", getUsersV1); // /v1/users\r\n * });\r\n *\r\n * router.version(\"2\", () => {\r\n * router.get(\"/users\", getUsersV2); // /v2/users\r\n * });\r\n */\r\n public version(version: string | number, callback: () => void) {\r\n return this.prefix(`/v${version}`, callback);\r\n }\r\n\r\n /**\r\n * Wrap route additions with a source file path\r\n * Used for tracking which routes come from which file (for HMR)\r\n * @param sourceFile Relative path to the source file (e.g., \"src/app/users/routes.ts\")\r\n * @param callback Function that adds routes (will have sourceFile injected)\r\n */\r\n public async withSourceFile<T = any>(\r\n sourceFile: string,\r\n callback: () => T | Promise<T>,\r\n ): Promise<T | undefined> {\r\n // Set source file in stacks\r\n this.stacks.sourceFile = sourceFile;\r\n\r\n try {\r\n // Execute callback (routes added here will have sourceFile injected)\r\n return await callback();\r\n } catch (error) {\r\n console.log(\"Error in withSourceFile\", error);\r\n } finally {\r\n // Always clear source file from stacks\r\n delete this.stacks.sourceFile;\r\n }\r\n }\r\n\r\n /**\r\n * Remove all routes that belong to a specific source file\r\n * Used when reloading routes files via HMR\r\n * @param sourceFile Relative path to the source file\r\n */\r\n public removeRoutesBySourceFile(sourceFile: string): void {\r\n this.routes = this.routes.filter((route) => route.sourceFile !== sourceFile);\r\n }\r\n\r\n /**\r\n * Manage validation system for the given resource\r\n */\r\n private manageValidation(resource: RouteResource, method: \"create\" | \"update\" | \"patch\") {\r\n const handler = resource[method]?.bind(resource) as RequestHandler;\r\n\r\n const methodValidation = resource?.validation?.[method];\r\n\r\n if (method === \"patch\") {\r\n handler.validation = methodValidation;\r\n\r\n if (handler.validation?.validate) {\r\n handler.validation.validate = handler.validation.validate.bind(resource);\r\n }\r\n\r\n if (resource.validation?.patch) {\r\n handler.validation = merge(resource.validation.patch, handler.validation);\r\n }\r\n\r\n return handler;\r\n }\r\n\r\n if (!resource.validation || (!methodValidation && !resource.validation.all)) return handler;\r\n\r\n if (resource.validation.all) {\r\n const validationMethods = {\r\n all: resource?.validation?.all?.validate,\r\n [method]: methodValidation?.validate,\r\n };\r\n\r\n const validation: RequestHandlerValidation = {};\r\n\r\n if (resource.validation.all.schema || methodValidation?.schema) {\r\n if (!methodValidation?.schema && resource.validation.all.schema) {\r\n // Case 2: Only all.schema exists - clone it for this method\r\n validation.schema = resource.validation.all.schema;\r\n } else if (methodValidation?.schema && resource.validation.all.schema) {\r\n // Case 3: Both exist - merge them (all is base, method overrides)\r\n validation.schema = resource.validation.all.schema.merge(methodValidation.schema);\r\n } else if (methodValidation?.schema && !resource.validation.all.schema) {\r\n // Case 1: Only method schema exists - use it directly\r\n validation.schema = methodValidation.schema;\r\n }\r\n // Case 4: Neither exists - handled by outer if being false\r\n }\r\n\r\n if (validationMethods.all || validationMethods[method]) {\r\n validation.validate = async (request: Request, response: Response) => {\r\n if (validationMethods.all) {\r\n const output = await validationMethods.all.call(resource, request, response);\r\n\r\n if (output) return output;\r\n }\r\n\r\n if (validationMethods[method]) {\r\n return await validationMethods[method]?.call(resource, request, response);\r\n }\r\n\r\n return;\r\n };\r\n }\r\n\r\n if (!isEmpty(validation)) {\r\n handler.validation = validation;\r\n }\r\n } else {\r\n handler.validation = resource.validation[method];\r\n\r\n if (handler.validation?.validate) {\r\n handler.validation.validate = handler.validation.validate.bind(resource);\r\n }\r\n }\r\n\r\n return handler;\r\n }\r\n\r\n /**\r\n * Get all routes list\r\n */\r\n public list() {\r\n return this.routes;\r\n }\r\n\r\n /**\r\n * Register routes to the server\r\n */\r\n public scan(server: FastifyInstance) {\r\n this.eventListeners.beforeScan?.forEach((callback) => callback(this, server));\r\n\r\n this.routes.forEach((route) => {\r\n const requestMethod = route.method.toLowerCase();\r\n const requestMethodFunction = server[requestMethod].bind(server);\r\n\r\n const options = {\r\n ...route.serverOptions,\r\n config: {\r\n ...route.serverOptions?.config,\r\n ...(route.rateLimit && { rateLimit: route.rateLimit }),\r\n },\r\n };\r\n\r\n requestMethodFunction(\r\n route.path,\r\n options,\r\n async (baseRequest: FastifyRequest, reply: FastifyReply) => {\r\n const { output, response } = await this.handleRoute(route)(baseRequest, reply);\r\n\r\n return output || response.baseResponse;\r\n },\r\n );\r\n });\r\n\r\n for (const directoryOptions of this.staticDirectories) {\r\n server.register(fastifyStatic, {\r\n ...directoryOptions,\r\n decorateReply: false,\r\n });\r\n }\r\n\r\n this.eventListeners.afterScanning?.forEach((callback) => callback(this, server));\r\n }\r\n\r\n /**\r\n * Scan routes for the development server\r\n * Uses wildcard routing with find-my-way for HMR support\r\n */\r\n public scanDevServer(server: FastifyInstance) {\r\n this.eventListeners.beforeScan?.forEach((callback) => callback(this, server));\r\n\r\n // Shared handler for wildcard routing\r\n const wildcardHandler = async (fastifyRequest: FastifyRequest, fastifyReply: FastifyReply) => {\r\n // Initialize route registry once (will be rebuilt on HMR via rebuildRouteRegistry)\r\n const routeRegistry = new RouteRegistry();\r\n\r\n routeRegistry.register(this.routes);\r\n // Find matching route using find-my-way\r\n const match = routeRegistry.find(fastifyRequest.method, fastifyRequest.url);\r\n\r\n // No match found - return 404\r\n if (!match) {\r\n return fastifyReply.code(404).send({\r\n error: \"Route not found\",\r\n path: fastifyRequest.url,\r\n method: fastifyRequest.method,\r\n });\r\n }\r\n\r\n // Inject extracted params into the request\r\n fastifyRequest.params = match.params;\r\n\r\n try {\r\n // Call the matched route handler\r\n const { output, response } = await this.handleRoute(match.route)(\r\n fastifyRequest,\r\n fastifyReply,\r\n );\r\n\r\n return output || response.baseResponse;\r\n } catch (error) {\r\n console.log(error);\r\n throw error;\r\n }\r\n };\r\n\r\n // Register wildcard route for all methods EXCEPT OPTIONS (to avoid conflict with CORS)\r\n // OPTIONS is handled by @fastify/cors plugin for preflight requests\r\n const methods = [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\"] as const;\r\n for (const method of methods) {\r\n server.route({\r\n method,\r\n url: \"*\",\r\n handler: wildcardHandler,\r\n });\r\n }\r\n\r\n // Register static directories\r\n for (const directoryOptions of this.staticDirectories) {\r\n server.register(fastifyStatic, {\r\n ...directoryOptions,\r\n decorateReply: false,\r\n });\r\n }\r\n\r\n this.eventListeners.afterScanning?.forEach((callback) => callback(this, server));\r\n }\r\n\r\n /**\r\n * Get the route path for the given route name\r\n */\r\n public getRoute(name: string, params: any = {}) {\r\n const route = this.routes.find((route) => route.name === name);\r\n\r\n if (!route) {\r\n throw new Error(`Route name \"${name}\" not found`);\r\n }\r\n\r\n let path = route.path;\r\n\r\n if (route.path.includes(\":\")) {\r\n Object.keys(params).forEach((key) => {\r\n path = path.replace(\":\" + key, params[key]);\r\n });\r\n }\r\n\r\n return path;\r\n }\r\n\r\n /**\r\n * Handle the given route\r\n */\r\n private handleRoute(route: Route) {\r\n return async (fastifyRequest: FastifyRequest, fastifyResponse: FastifyReply) => {\r\n const request = new Request();\r\n const response = new Response();\r\n response.setResponse(fastifyResponse);\r\n request.response = response;\r\n\r\n response.request = request;\r\n\r\n request.setRequest(fastifyRequest).setRoute(route);\r\n\r\n log.info({\r\n module: \"route\",\r\n action: route.method + \" \" + route.path.replace(\"/*\", \"\"),\r\n message: `Starting Request: ${request.id}`,\r\n context: {\r\n request,\r\n response,\r\n },\r\n });\r\n\r\n const result = await request.execute();\r\n\r\n return {\r\n output: result,\r\n response,\r\n request,\r\n };\r\n };\r\n }\r\n}\r\n\r\nexport const router = Router.getInstance();\r\n\r\ncontainer.set(\"router\", router);\r\n"],"mappings":"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"}
1
+ {"version":3,"file":"router.mjs","names":[],"sources":["../../../../../../../@warlock.js/core/src/router/router.ts"],"sourcesContent":["import proxy, { type FastifyHttpProxyOptions } from \"@fastify/http-proxy\";\r\nimport fastifyStatic, { type FastifyStaticOptions } from \"@fastify/static\";\r\nimport concatRoute from \"@mongez/concat-route\";\r\nimport { ltrim, merge, toCamelCase, trim } from \"@mongez/reinforcements\";\r\nimport { isEmpty } from \"@mongez/supportive-is\";\r\nimport { log } from \"@warlock.js/logger\";\r\nimport type { FastifyReply, FastifyRequest } from \"fastify\";\r\nimport { container } from \"../container\";\r\nimport { Request } from \"../http/request\";\r\nimport { Response } from \"../http/response\";\r\nimport { type FastifyInstance } from \"../http/server\";\r\nimport { RouteBuilder } from \"./route-builder\";\r\nimport { RouteRegistry } from \"./route-registry\";\r\nimport type {\r\n GroupedRoutesOptions,\r\n RequestHandler,\r\n RequestHandlerType,\r\n RequestHandlerValidation,\r\n ResourceMethod,\r\n Route,\r\n RouteOptions,\r\n RouteResource,\r\n RouterGroupCallback,\r\n RouterStacks,\r\n} from \"./types\";\r\n\r\nexport class Router {\r\n /**\r\n * Routes list\r\n */\r\n private routes: Route[] = [];\r\n\r\n /**\r\n * Router Instance\r\n */\r\n private static instance: Router;\r\n\r\n /**\r\n * Static paths\r\n */\r\n protected staticDirectories: FastifyStaticOptions[] = [];\r\n\r\n /**\r\n * Event listeners\r\n */\r\n protected eventListeners: Record<string, ((router: Router, server: FastifyInstance) => void)[]> =\r\n {};\r\n\r\n /**\r\n * Stacks\r\n * Stacks will be used for grouping routes to add prefix, name or middleware\r\n */\r\n protected stacks: RouterStacks = {\r\n prefix: [],\r\n name: [],\r\n middleware: [],\r\n };\r\n\r\n /**\r\n * Get router instance\r\n */\r\n public static getInstance() {\r\n if (!Router.instance) {\r\n Router.instance = new Router();\r\n }\r\n\r\n return Router.instance;\r\n }\r\n\r\n private constructor() {\r\n //\r\n }\r\n\r\n /**\r\n * Listen to router before scan\r\n */\r\n public beforeScanning(callback: (router: Router, server: FastifyInstance) => void) {\r\n this.eventListeners.beforeScan = [...(this.eventListeners.beforeScan || []), callback];\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Listen to router after scanning\r\n */\r\n public afterScanning(callback: (router: Router, server: FastifyInstance) => void) {\r\n this.eventListeners.afterScanning = [...(this.eventListeners.afterScanning || []), callback];\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Redirect path to another path\r\n */\r\n public redirect(from: string, to: string, redirectMode: \"temporary\" | \"permanent\" = \"temporary\") {\r\n return this.get(from, (_request, response) => {\r\n response.redirect(to, redirectMode === \"temporary\" ? 302 : 301);\r\n });\r\n }\r\n\r\n /**\r\n * Server static folder\r\n */\r\n public directory(options: FastifyStaticOptions) {\r\n this.staticDirectories.push(options);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Serve file\r\n */\r\n public file(path: string, location: string, cacheTime?: number) {\r\n return this.get(path, (_request, response) => {\r\n response.sendFile(location, cacheTime);\r\n });\r\n }\r\n\r\n /**\r\n * Serve cached file, it will cache the file to 1 year by default\r\n */\r\n public cachedFile(path: string, location: string, cacheTime?: number) {\r\n return this.get(path, (_request, response) => {\r\n response.sendCachedFile(location, cacheTime);\r\n });\r\n }\r\n\r\n /**\r\n * Serve list of files\r\n */\r\n public files(files: Record<string, string>, cacheTime?: number) {\r\n for (const [path, location] of Object.entries(files)) {\r\n this.get(path, (_request, response) => {\r\n response.sendFile(location, cacheTime);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Serve list of cached files, it will cache the file to 1 year by default\r\n */\r\n public cachedFiles(files: Record<string, string>, cacheTime?: number) {\r\n for (const [path, location] of Object.entries(files)) {\r\n this.get(path, (_request, response) => {\r\n response.sendCachedFile(location, cacheTime);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Add proxy route\r\n */\r\n public proxy(\r\n path: string,\r\n baseUrl: string,\r\n options?: Omit<FastifyHttpProxyOptions, \"prefix\" | \"upstream\">,\r\n ): this;\r\n public proxy(options: FastifyHttpProxyOptions): this;\r\n public proxy(...args: any[]) {\r\n this.beforeScanning((_router, server) => {\r\n if (args.length === 1) {\r\n server.register(proxy, args[0]);\r\n } else {\r\n server.register(proxy, {\r\n prefix: args[0],\r\n upstream: args[1],\r\n ...args[2],\r\n });\r\n }\r\n });\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Add route to routes list\r\n */\r\n public add(\r\n method: Route[\"method\"],\r\n path: string | string[],\r\n handler: RequestHandlerType,\r\n options: RouteOptions = {},\r\n ) {\r\n if (Array.isArray(path)) {\r\n path.forEach((p) => this.add(method, p, handler, options));\r\n return this;\r\n }\r\n\r\n const prefix = this.stacks.prefix.reduce((path, prefix) => {\r\n return concatRoute(path, prefix);\r\n }, \"\");\r\n\r\n const name = this.stacks.name.reduceRight(\r\n (name, prefixName) => {\r\n return trim(prefixName + \".\" + name, \".\");\r\n },\r\n options.name || trim(path.replace(/\\//g, \".\"), \".\"),\r\n );\r\n\r\n path = concatRoute(prefix, path);\r\n\r\n const middlewarePrecedence = options.middlewarePrecedence || \"after\";\r\n\r\n if (middlewarePrecedence === \"before\") {\r\n options.middleware = [...(options.middleware || []), ...this.stacks.middleware];\r\n } else {\r\n options.middleware = [...this.stacks.middleware, ...(options.middleware || [])];\r\n }\r\n\r\n if (Array.isArray(handler)) {\r\n const [controller, action] = handler;\r\n\r\n if (typeof controller[action] !== \"function\") {\r\n throw new Error(\r\n `Invalid controller action \"${action}\" for controller \"${controller.constructor.name}\"`,\r\n );\r\n }\r\n\r\n handler = controller[action].bind(controller) as RequestHandler;\r\n\r\n if (!handler.validation) {\r\n handler.validation = {};\r\n if (controller[`${action}ValidationSchema`]) {\r\n handler.validation.schema = controller[`${action}ValidationSchema`]();\r\n }\r\n\r\n if (controller[`${action}Validate`]) {\r\n handler.validation.validate = controller[`${action}Validate`];\r\n }\r\n }\r\n }\r\n\r\n const routeData: Route = {\r\n method,\r\n path,\r\n handler,\r\n ...options,\r\n name,\r\n rateLimit: options.rateLimit,\r\n $prefix: prefix || \"/\",\r\n // it must be a new array to avoid modifying the original array\r\n $prefixStack: [...this.stacks.prefix],\r\n // Inject source file from stacks if set\r\n sourceFile: this.stacks.sourceFile || \"\",\r\n };\r\n\r\n if (routeData.name) {\r\n // check if the name exists\r\n const route = this.routes.find((route) => route.name === routeData.name);\r\n\r\n if (route) {\r\n // check again if the route name exists with the same method\r\n if (route.method === routeData.method) {\r\n throw new Error(`Route name \"${routeData.name}\" already exists`);\r\n } else {\r\n routeData.name += `.${routeData.method.toLowerCase()}`;\r\n }\r\n }\r\n }\r\n\r\n this.routes.push(routeData);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Add a request that accepts all methods\r\n */\r\n public any(path: string, handler: RequestHandlerType, options: RouteOptions = {}) {\r\n return this.add(\"all\" as Route[\"method\"], path, handler, options);\r\n }\r\n\r\n /**\r\n * Add get request method\r\n */\r\n public get(path: string, handler: RequestHandlerType, options: RouteOptions = {}) {\r\n return this.add(\"GET\", path, handler, options);\r\n }\r\n\r\n /**\r\n * Add post request method\r\n */\r\n public post(path: string | string[], handler: RequestHandlerType, options: RouteOptions = {}) {\r\n return this.add(\"POST\", path, handler, options);\r\n }\r\n\r\n /**\r\n * Add put request method\r\n */\r\n public put(path: string, handler: RequestHandlerType, options: RouteOptions = {}) {\r\n return this.add(\"PUT\", path, handler, options);\r\n }\r\n\r\n /**\r\n * Add delete request method\r\n */\r\n public delete(path: string | string[], handler: RequestHandlerType, options: RouteOptions = {}) {\r\n return this.add(\"DELETE\", path, handler, options);\r\n }\r\n\r\n /**\r\n * Add patch request method\r\n */\r\n public patch(path: string, handler: RequestHandlerType, options: RouteOptions = {}) {\r\n return this.add(\"PATCH\", path, handler, options);\r\n }\r\n\r\n /**\r\n * Add head request method\r\n */\r\n public head(path: string, handler: RequestHandlerType, options: RouteOptions = {}) {\r\n return this.add(\"HEAD\", path, handler, options);\r\n }\r\n\r\n /**\r\n * Add options request method\r\n */\r\n public options(path: string, handler: RequestHandlerType, options: RouteOptions = {}) {\r\n return this.add(\"OPTIONS\", path, handler, options);\r\n }\r\n\r\n /**\r\n * Get a chainable route builder for the same route path\r\n */\r\n public route(path: string, options: RouteOptions = {}) {\r\n return new RouteBuilder(this, path, options);\r\n }\r\n\r\n /**\r\n * Add full restful resource routes\r\n * This method will generate the following routes:\r\n * 1. GET /path: list all resources\r\n * 2. GET /path/:id: get a single resource\r\n * 3. POST /path: create a new resource\r\n * 4. PUT /path/:id: update a resource\r\n * 5. DELETE /path/:id: delete a resource\r\n * 6. PATCH /path/:id: update a resource partially\r\n */\r\n public restfulResource(\r\n path: string,\r\n resource: RouteResource,\r\n options: RouteOptions & {\r\n only?: ResourceMethod[];\r\n except?: ResourceMethod[];\r\n replace?: Partial<Record<ResourceMethod, RequestHandler>> & {\r\n bulkDelete?: RequestHandler;\r\n };\r\n } = {},\r\n ) {\r\n return this.prefix(path, () => {\r\n path = \"\";\r\n // get base resource name\r\n const baseResourceName = options.name || toCamelCase(ltrim(path, \"/\"));\r\n\r\n // clone the resource so we don't mess up with it\r\n const routeResource = resource;\r\n\r\n const isAcceptableResource = (type: ResourceMethod) => {\r\n return Boolean(\r\n // check if the route is not excluded\r\n (!options.except || !options.except.includes(type)) &&\r\n // check if the only option is set and the route is included\r\n (!options.only || options.only.includes(type)),\r\n );\r\n };\r\n\r\n if (routeResource.list && isAcceptableResource(\"list\")) {\r\n const resourceName = baseResourceName + \".list\";\r\n this.get(path, options.replace?.list || routeResource.list.bind(routeResource), {\r\n ...options,\r\n name: resourceName,\r\n restful: true,\r\n });\r\n }\r\n\r\n if (routeResource.get && isAcceptableResource(\"get\")) {\r\n const resourceName = baseResourceName + \".single\";\r\n\r\n this.get(path + \"/:id\", options.replace?.get || routeResource.get.bind(routeResource), {\r\n ...options,\r\n name: resourceName,\r\n restful: true,\r\n });\r\n }\r\n\r\n if (routeResource.create && isAcceptableResource(\"create\")) {\r\n const resourceName = baseResourceName + \".create\";\r\n\r\n const handler = options.replace?.create || this.manageValidation(routeResource, \"create\");\r\n\r\n this.post(path, handler, {\r\n ...options,\r\n name: resourceName,\r\n restful: true,\r\n });\r\n }\r\n\r\n if (routeResource.update && isAcceptableResource(\"update\")) {\r\n const resourceName = baseResourceName + \".update\";\r\n\r\n const handler = options.replace?.update || this.manageValidation(routeResource, \"update\");\r\n\r\n this.put(path + \"/:id\", handler, {\r\n ...options,\r\n name: resourceName,\r\n restful: true,\r\n });\r\n }\r\n\r\n if (routeResource.patch && isAcceptableResource(\"patch\")) {\r\n const resourceName = baseResourceName + \".patch\";\r\n\r\n const handler = options.replace?.patch || this.manageValidation(routeResource, \"patch\");\r\n\r\n this.patch(path + \"/:id\", handler, {\r\n ...options,\r\n name: resourceName,\r\n restful: true,\r\n });\r\n }\r\n\r\n if (routeResource.delete && isAcceptableResource(\"delete\")) {\r\n const resourceName = baseResourceName + \".delete\";\r\n\r\n this.delete(\r\n path + \"/:id\",\r\n options.replace?.delete || routeResource.delete.bind(routeResource),\r\n {\r\n ...options,\r\n name: resourceName,\r\n restful: true,\r\n },\r\n );\r\n }\r\n\r\n if (routeResource.bulkDelete && isAcceptableResource(\"delete\")) {\r\n const resourceName = baseResourceName + \".bulkDelete\";\r\n\r\n this.delete(\r\n path,\r\n options.replace?.bulkDelete || routeResource.bulkDelete.bind(routeResource),\r\n {\r\n ...options,\r\n name: resourceName,\r\n restful: true,\r\n },\r\n );\r\n }\r\n\r\n return this;\r\n });\r\n }\r\n\r\n /**\r\n * Group routes with options\r\n */\r\n public group(options: GroupedRoutesOptions, callback: RouterGroupCallback) {\r\n const {\r\n prefix,\r\n // name must always be defined because\r\n // if there are multiple groups without name\r\n // they might generate the same route name\r\n // thus causing an error\r\n // in this case we need always to make sure that\r\n // the name is always defined.\r\n name = prefix ? trim(prefix.replace(/\\//g, \".\"), \".\") : undefined,\r\n middleware,\r\n } = options;\r\n\r\n if (prefix) {\r\n this.stacks.prefix.push(prefix);\r\n }\r\n\r\n if (name) {\r\n this.stacks.name.push(name);\r\n }\r\n\r\n if (middleware) {\r\n this.stacks.middleware.push(...middleware);\r\n }\r\n\r\n callback();\r\n\r\n if (prefix) {\r\n this.stacks.prefix.pop();\r\n }\r\n\r\n if (name) {\r\n this.stacks.name.pop();\r\n }\r\n\r\n if (middleware) {\r\n this.stacks.middleware.splice(\r\n this.stacks.middleware.length - middleware.length,\r\n middleware.length,\r\n );\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Add prefix to all routes in the given callback\r\n */\r\n public prefix(prefix: string, callback: () => void) {\r\n return this.group({ prefix }, callback);\r\n }\r\n\r\n /**\r\n * Add API version prefix to all routes in the given callback\r\n * Automatically formats the version as /v{version}\r\n * @example\r\n * router.version(\"1\", () => {\r\n * router.get(\"/users\", getUsersV1); // /v1/users\r\n * });\r\n *\r\n * router.version(\"2\", () => {\r\n * router.get(\"/users\", getUsersV2); // /v2/users\r\n * });\r\n */\r\n public version(version: string | number, callback: () => void) {\r\n return this.prefix(`/v${version}`, callback);\r\n }\r\n\r\n /**\r\n * Wrap route additions with a source file path\r\n * Used for tracking which routes come from which file (for HMR)\r\n * @param sourceFile Relative path to the source file (e.g., \"src/app/users/routes.ts\")\r\n * @param callback Function that adds routes (will have sourceFile injected)\r\n */\r\n public async withSourceFile<T = any>(\r\n sourceFile: string,\r\n callback: () => T | Promise<T>,\r\n ): Promise<T | undefined> {\r\n // Set source file in stacks\r\n this.stacks.sourceFile = sourceFile;\r\n\r\n try {\r\n // Execute callback (routes added here will have sourceFile injected)\r\n return await callback();\r\n } catch (error) {\r\n console.log(\"Error in withSourceFile\", error);\r\n } finally {\r\n // Always clear source file from stacks\r\n delete this.stacks.sourceFile;\r\n }\r\n }\r\n\r\n /**\r\n * Remove all routes that belong to a specific source file\r\n * Used when reloading routes files via HMR\r\n * @param sourceFile Relative path to the source file\r\n */\r\n public removeRoutesBySourceFile(sourceFile: string): void {\r\n this.routes = this.routes.filter((route) => route.sourceFile !== sourceFile);\r\n }\r\n\r\n /**\r\n * Manage validation system for the given resource\r\n */\r\n private manageValidation(resource: RouteResource, method: \"create\" | \"update\" | \"patch\") {\r\n const handler = resource[method]?.bind(resource) as RequestHandler;\r\n\r\n const methodValidation = resource?.validation?.[method];\r\n\r\n if (method === \"patch\") {\r\n handler.validation = methodValidation;\r\n\r\n if (handler.validation?.validate) {\r\n handler.validation.validate = handler.validation.validate.bind(resource);\r\n }\r\n\r\n if (resource.validation?.patch) {\r\n handler.validation = merge(resource.validation.patch, handler.validation);\r\n }\r\n\r\n return handler;\r\n }\r\n\r\n if (!resource.validation || (!methodValidation && !resource.validation.all)) return handler;\r\n\r\n if (resource.validation.all) {\r\n const validationMethods = {\r\n all: resource?.validation?.all?.validate,\r\n [method]: methodValidation?.validate,\r\n };\r\n\r\n const validation: RequestHandlerValidation = {};\r\n\r\n if (resource.validation.all.schema || methodValidation?.schema) {\r\n if (!methodValidation?.schema && resource.validation.all.schema) {\r\n // Case 2: Only all.schema exists - clone it for this method\r\n validation.schema = resource.validation.all.schema;\r\n } else if (methodValidation?.schema && resource.validation.all.schema) {\r\n // Case 3: Both exist - merge them (all is base, method overrides)\r\n validation.schema = resource.validation.all.schema.merge(methodValidation.schema);\r\n } else if (methodValidation?.schema && !resource.validation.all.schema) {\r\n // Case 1: Only method schema exists - use it directly\r\n validation.schema = methodValidation.schema;\r\n }\r\n // Case 4: Neither exists - handled by outer if being false\r\n }\r\n\r\n if (validationMethods.all || validationMethods[method]) {\r\n validation.validate = async (request: Request, response: Response) => {\r\n if (validationMethods.all) {\r\n const output = await validationMethods.all.call(resource, request, response);\r\n\r\n if (output) return output;\r\n }\r\n\r\n if (validationMethods[method]) {\r\n return await validationMethods[method]?.call(resource, request, response);\r\n }\r\n\r\n return;\r\n };\r\n }\r\n\r\n if (!isEmpty(validation)) {\r\n handler.validation = validation;\r\n }\r\n } else {\r\n handler.validation = resource.validation[method];\r\n\r\n if (handler.validation?.validate) {\r\n handler.validation.validate = handler.validation.validate.bind(resource);\r\n }\r\n }\r\n\r\n return handler;\r\n }\r\n\r\n /**\r\n * Get all routes list\r\n */\r\n public list() {\r\n return this.routes;\r\n }\r\n\r\n /**\r\n * Register routes to the server\r\n */\r\n public scan(server: FastifyInstance) {\r\n this.eventListeners.beforeScan?.forEach((callback) => callback(this, server));\r\n\r\n this.routes.forEach((route) => {\r\n const requestMethod = route.method.toLowerCase();\r\n const requestMethodFunction = server[requestMethod].bind(server);\r\n\r\n const options = {\r\n ...route.serverOptions,\r\n config: {\r\n ...route.serverOptions?.config,\r\n ...(route.rateLimit && { rateLimit: route.rateLimit }),\r\n },\r\n };\r\n\r\n requestMethodFunction(\r\n route.path,\r\n options,\r\n async (baseRequest: FastifyRequest, reply: FastifyReply) => {\r\n const { output, response } = await this.handleRoute(route)(baseRequest, reply);\r\n\r\n return output || response.baseResponse;\r\n },\r\n );\r\n });\r\n\r\n for (const directoryOptions of this.staticDirectories) {\r\n server.register(fastifyStatic, {\r\n ...directoryOptions,\r\n decorateReply: false,\r\n });\r\n }\r\n\r\n this.eventListeners.afterScanning?.forEach((callback) => callback(this, server));\r\n }\r\n\r\n /**\r\n * Scan routes for the development server\r\n * Uses wildcard routing with find-my-way for HMR support\r\n */\r\n public scanDevServer(server: FastifyInstance) {\r\n this.eventListeners.beforeScan?.forEach((callback) => callback(this, server));\r\n\r\n // Shared handler for wildcard routing\r\n const wildcardHandler = async (fastifyRequest: FastifyRequest, fastifyReply: FastifyReply) => {\r\n // Initialize route registry once (will be rebuilt on HMR via rebuildRouteRegistry)\r\n const routeRegistry = new RouteRegistry();\r\n\r\n routeRegistry.register(this.routes);\r\n // Find matching route using find-my-way\r\n const match = routeRegistry.find(fastifyRequest.method, fastifyRequest.url);\r\n\r\n // No match found - return 404\r\n if (!match) {\r\n return fastifyReply.code(404).send({\r\n error: \"Route not found\",\r\n path: fastifyRequest.url,\r\n method: fastifyRequest.method,\r\n });\r\n }\r\n\r\n // Inject extracted params into the request\r\n fastifyRequest.params = match.params;\r\n\r\n try {\r\n // Call the matched route handler\r\n const { output, response } = await this.handleRoute(match.route)(\r\n fastifyRequest,\r\n fastifyReply,\r\n );\r\n\r\n return output || response.baseResponse;\r\n } catch (error) {\r\n console.log(error);\r\n throw error;\r\n }\r\n };\r\n\r\n // Register wildcard route for all methods EXCEPT OPTIONS (to avoid conflict with CORS)\r\n // OPTIONS is handled by @fastify/cors plugin for preflight requests\r\n const methods = [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\"] as const;\r\n for (const method of methods) {\r\n server.route({\r\n method,\r\n url: \"*\",\r\n handler: wildcardHandler,\r\n });\r\n }\r\n\r\n // Register static directories\r\n for (const directoryOptions of this.staticDirectories) {\r\n server.register(fastifyStatic, {\r\n ...directoryOptions,\r\n decorateReply: false,\r\n });\r\n }\r\n\r\n this.eventListeners.afterScanning?.forEach((callback) => callback(this, server));\r\n }\r\n\r\n /**\r\n * Get the route path for the given route name\r\n */\r\n public getRoute(name: string, params: any = {}) {\r\n const route = this.routes.find((route) => route.name === name);\r\n\r\n if (!route) {\r\n throw new Error(`Route name \"${name}\" not found`);\r\n }\r\n\r\n let path = route.path;\r\n\r\n if (route.path.includes(\":\")) {\r\n Object.keys(params).forEach((key) => {\r\n path = path.replace(\":\" + key, params[key]);\r\n });\r\n }\r\n\r\n return path;\r\n }\r\n\r\n /**\r\n * Handle the given route\r\n */\r\n private handleRoute(route: Route) {\r\n return async (fastifyRequest: FastifyRequest, fastifyResponse: FastifyReply) => {\r\n const request = new Request();\r\n const response = new Response();\r\n response.setResponse(fastifyResponse);\r\n request.response = response;\r\n\r\n response.request = request;\r\n\r\n request.setRequest(fastifyRequest).setRoute(route);\r\n\r\n log.info({\r\n module: \"route\",\r\n action: route.method + \" \" + route.path.replace(\"/*\", \"\"),\r\n message: `Starting Request: ${request.id}`,\r\n context: {\r\n request,\r\n response,\r\n },\r\n });\r\n\r\n const result = await request.execute();\r\n\r\n return {\r\n output: result,\r\n response,\r\n request,\r\n };\r\n };\r\n }\r\n}\r\n\r\nexport const router = Router.getInstance();\r\n\r\ncontainer.set(\"router\", router);\r\n"],"mappings":";;;;;;;;;;;;;AA0BA,IAAa,SAAb,MAAa,OAAO;;;;CAmClB,OAAc,cAAc;EAC1B,IAAI,CAAC,OAAO,UACV,OAAO,WAAW,IAAI,OAAO;EAG/B,OAAO,OAAO;CAChB;CAEA,AAAQ,cAAc;gBAvCI,CAAC;2BAU2B,CAAC;wBAMrD,CAAC;gBAM8B;GAC/B,QAAQ,CAAC;GACT,MAAM,CAAC;GACP,YAAY,CAAC;EACf;CAeA;;;;CAKA,AAAO,eAAe,UAA6D;EACjF,KAAK,eAAe,aAAa,CAAC,GAAI,KAAK,eAAe,cAAc,CAAC,GAAI,QAAQ;EAErF,OAAO;CACT;;;;CAKA,AAAO,cAAc,UAA6D;EAChF,KAAK,eAAe,gBAAgB,CAAC,GAAI,KAAK,eAAe,iBAAiB,CAAC,GAAI,QAAQ;EAE3F,OAAO;CACT;;;;CAKA,AAAO,SAAS,MAAc,IAAY,eAA0C,aAAa;EAC/F,OAAO,KAAK,IAAI,OAAO,UAAU,aAAa;GAC5C,SAAS,SAAS,IAAI,iBAAiB,cAAc,MAAM,GAAG;EAChE,CAAC;CACH;;;;CAKA,AAAO,UAAU,SAA+B;EAC9C,KAAK,kBAAkB,KAAK,OAAO;EAEnC,OAAO;CACT;;;;CAKA,AAAO,KAAK,MAAc,UAAkB,WAAoB;EAC9D,OAAO,KAAK,IAAI,OAAO,UAAU,aAAa;GAC5C,SAAS,SAAS,UAAU,SAAS;EACvC,CAAC;CACH;;;;CAKA,AAAO,WAAW,MAAc,UAAkB,WAAoB;EACpE,OAAO,KAAK,IAAI,OAAO,UAAU,aAAa;GAC5C,SAAS,eAAe,UAAU,SAAS;EAC7C,CAAC;CACH;;;;CAKA,AAAO,MAAM,OAA+B,WAAoB;EAC9D,KAAK,MAAM,CAAC,MAAM,aAAa,OAAO,QAAQ,KAAK,GACjD,KAAK,IAAI,OAAO,UAAU,aAAa;GACrC,SAAS,SAAS,UAAU,SAAS;EACvC,CAAC;CAEL;;;;CAKA,AAAO,YAAY,OAA+B,WAAoB;EACpE,KAAK,MAAM,CAAC,MAAM,aAAa,OAAO,QAAQ,KAAK,GACjD,KAAK,IAAI,OAAO,UAAU,aAAa;GACrC,SAAS,eAAe,UAAU,SAAS;EAC7C,CAAC;CAEL;CAWA,AAAO,MAAM,GAAG,MAAa;EAC3B,KAAK,gBAAgB,SAAS,WAAW;GACvC,IAAI,KAAK,WAAW,GAClB,OAAO,SAAS,OAAO,KAAK,EAAE;QAE9B,OAAO,SAAS,OAAO;IACrB,QAAQ,KAAK;IACb,UAAU,KAAK;IACf,GAAG,KAAK;GACV,CAAC;EAEL,CAAC;EAED,OAAO;CACT;;;;CAKA,AAAO,IACL,QACA,MACA,SACA,UAAwB,CAAC,GACzB;EACA,IAAI,MAAM,QAAQ,IAAI,GAAG;GACvB,KAAK,SAAS,MAAM,KAAK,IAAI,QAAQ,GAAG,SAAS,OAAO,CAAC;GACzD,OAAO;EACT;EAEA,MAAM,SAAS,KAAK,OAAO,OAAO,QAAQ,MAAM,WAAW;GACzD,OAAO,YAAY,MAAM,MAAM;EACjC,GAAG,EAAE;EAEL,MAAM,OAAO,KAAK,OAAO,KAAK,aAC3B,MAAM,eAAe;GACpB,OAAO,KAAK,aAAa,MAAM,MAAM,GAAG;EAC1C,GACA,QAAQ,QAAQ,KAAK,KAAK,QAAQ,OAAO,GAAG,GAAG,GAAG,CACpD;EAEA,OAAO,YAAY,QAAQ,IAAI;EAI/B,KAF6B,QAAQ,wBAAwB,aAEhC,UAC3B,QAAQ,aAAa,CAAC,GAAI,QAAQ,cAAc,CAAC,GAAI,GAAG,KAAK,OAAO,UAAU;OAE9E,QAAQ,aAAa,CAAC,GAAG,KAAK,OAAO,YAAY,GAAI,QAAQ,cAAc,CAAC,CAAE;EAGhF,IAAI,MAAM,QAAQ,OAAO,GAAG;GAC1B,MAAM,CAAC,YAAY,UAAU;GAE7B,IAAI,OAAO,WAAW,YAAY,YAChC,MAAM,IAAI,MACR,8BAA8B,OAAO,oBAAoB,WAAW,YAAY,KAAK,EACvF;GAGF,UAAU,WAAW,OAAO,CAAC,KAAK,UAAU;GAE5C,IAAI,CAAC,QAAQ,YAAY;IACvB,QAAQ,aAAa,CAAC;IACtB,IAAI,WAAW,GAAG,OAAO,oBACvB,QAAQ,WAAW,SAAS,WAAW,GAAG,OAAO,kBAAkB,CAAC;IAGtE,IAAI,WAAW,GAAG,OAAO,YACvB,QAAQ,WAAW,WAAW,WAAW,GAAG,OAAO;GAEvD;EACF;EAEA,MAAM,YAAmB;GACvB;GACA;GACA;GACA,GAAG;GACH;GACA,WAAW,QAAQ;GACnB,SAAS,UAAU;GAEnB,cAAc,CAAC,GAAG,KAAK,OAAO,MAAM;GAEpC,YAAY,KAAK,OAAO,cAAc;EACxC;EAEA,IAAI,UAAU,MAAM;GAElB,MAAM,QAAQ,KAAK,OAAO,MAAM,UAAU,MAAM,SAAS,UAAU,IAAI;GAEvE,IAAI,OAEF,IAAI,MAAM,WAAW,UAAU,QAC7B,MAAM,IAAI,MAAM,eAAe,UAAU,KAAK,iBAAiB;QAE/D,UAAU,QAAQ,IAAI,UAAU,OAAO,YAAY;EAGzD;EAEA,KAAK,OAAO,KAAK,SAAS;EAE1B,OAAO;CACT;;;;CAKA,AAAO,IAAI,MAAc,SAA6B,UAAwB,CAAC,GAAG;EAChF,OAAO,KAAK,IAAI,OAA0B,MAAM,SAAS,OAAO;CAClE;;;;CAKA,AAAO,IAAI,MAAc,SAA6B,UAAwB,CAAC,GAAG;EAChF,OAAO,KAAK,IAAI,OAAO,MAAM,SAAS,OAAO;CAC/C;;;;CAKA,AAAO,KAAK,MAAyB,SAA6B,UAAwB,CAAC,GAAG;EAC5F,OAAO,KAAK,IAAI,QAAQ,MAAM,SAAS,OAAO;CAChD;;;;CAKA,AAAO,IAAI,MAAc,SAA6B,UAAwB,CAAC,GAAG;EAChF,OAAO,KAAK,IAAI,OAAO,MAAM,SAAS,OAAO;CAC/C;;;;CAKA,AAAO,OAAO,MAAyB,SAA6B,UAAwB,CAAC,GAAG;EAC9F,OAAO,KAAK,IAAI,UAAU,MAAM,SAAS,OAAO;CAClD;;;;CAKA,AAAO,MAAM,MAAc,SAA6B,UAAwB,CAAC,GAAG;EAClF,OAAO,KAAK,IAAI,SAAS,MAAM,SAAS,OAAO;CACjD;;;;CAKA,AAAO,KAAK,MAAc,SAA6B,UAAwB,CAAC,GAAG;EACjF,OAAO,KAAK,IAAI,QAAQ,MAAM,SAAS,OAAO;CAChD;;;;CAKA,AAAO,QAAQ,MAAc,SAA6B,UAAwB,CAAC,GAAG;EACpF,OAAO,KAAK,IAAI,WAAW,MAAM,SAAS,OAAO;CACnD;;;;CAKA,AAAO,MAAM,MAAc,UAAwB,CAAC,GAAG;EACrD,OAAO,IAAI,aAAa,MAAM,MAAM,OAAO;CAC7C;;;;;;;;;;;CAYA,AAAO,gBACL,MACA,UACA,UAMI,CAAC,GACL;EACA,OAAO,KAAK,OAAO,YAAY;GAC7B,OAAO;GAEP,MAAM,mBAAmB,QAAQ,QAAQ,YAAY,MAAM,MAAM,GAAG,CAAC;GAGrE,MAAM,gBAAgB;GAEtB,MAAM,wBAAwB,SAAyB;IACrD,OAAO,SAEJ,CAAC,QAAQ,UAAU,CAAC,QAAQ,OAAO,SAAS,IAAI,OAEhD,CAAC,QAAQ,QAAQ,QAAQ,KAAK,SAAS,IAAI,EAC9C;GACF;GAEA,IAAI,cAAc,QAAQ,qBAAqB,MAAM,GAAG;IACtD,MAAM,eAAe,mBAAmB;IACxC,KAAK,IAAI,MAAM,QAAQ,SAAS,QAAQ,cAAc,KAAK,KAAK,aAAa,GAAG;KAC9E,GAAG;KACH,MAAM;KACN,SAAS;IACX,CAAC;GACH;GAEA,IAAI,cAAc,OAAO,qBAAqB,KAAK,GAAG;IACpD,MAAM,eAAe,mBAAmB;IAExC,KAAK,IAAI,OAAO,QAAQ,QAAQ,SAAS,OAAO,cAAc,IAAI,KAAK,aAAa,GAAG;KACrF,GAAG;KACH,MAAM;KACN,SAAS;IACX,CAAC;GACH;GAEA,IAAI,cAAc,UAAU,qBAAqB,QAAQ,GAAG;IAC1D,MAAM,eAAe,mBAAmB;IAExC,MAAM,UAAU,QAAQ,SAAS,UAAU,KAAK,iBAAiB,eAAe,QAAQ;IAExF,KAAK,KAAK,MAAM,SAAS;KACvB,GAAG;KACH,MAAM;KACN,SAAS;IACX,CAAC;GACH;GAEA,IAAI,cAAc,UAAU,qBAAqB,QAAQ,GAAG;IAC1D,MAAM,eAAe,mBAAmB;IAExC,MAAM,UAAU,QAAQ,SAAS,UAAU,KAAK,iBAAiB,eAAe,QAAQ;IAExF,KAAK,IAAI,OAAO,QAAQ,SAAS;KAC/B,GAAG;KACH,MAAM;KACN,SAAS;IACX,CAAC;GACH;GAEA,IAAI,cAAc,SAAS,qBAAqB,OAAO,GAAG;IACxD,MAAM,eAAe,mBAAmB;IAExC,MAAM,UAAU,QAAQ,SAAS,SAAS,KAAK,iBAAiB,eAAe,OAAO;IAEtF,KAAK,MAAM,OAAO,QAAQ,SAAS;KACjC,GAAG;KACH,MAAM;KACN,SAAS;IACX,CAAC;GACH;GAEA,IAAI,cAAc,UAAU,qBAAqB,QAAQ,GAAG;IAC1D,MAAM,eAAe,mBAAmB;IAExC,KAAK,OACH,OAAO,QACP,QAAQ,SAAS,UAAU,cAAc,OAAO,KAAK,aAAa,GAClE;KACE,GAAG;KACH,MAAM;KACN,SAAS;IACX,CACF;GACF;GAEA,IAAI,cAAc,cAAc,qBAAqB,QAAQ,GAAG;IAC9D,MAAM,eAAe,mBAAmB;IAExC,KAAK,OACH,MACA,QAAQ,SAAS,cAAc,cAAc,WAAW,KAAK,aAAa,GAC1E;KACE,GAAG;KACH,MAAM;KACN,SAAS;IACX,CACF;GACF;GAEA,OAAO;EACT,CAAC;CACH;;;;CAKA,AAAO,MAAM,SAA+B,UAA+B;EACzE,MAAM,EACJ,QAOA,OAAO,SAAS,KAAK,OAAO,QAAQ,OAAO,GAAG,GAAG,GAAG,IAAI,QACxD,eACE;EAEJ,IAAI,QACF,KAAK,OAAO,OAAO,KAAK,MAAM;EAGhC,IAAI,MACF,KAAK,OAAO,KAAK,KAAK,IAAI;EAG5B,IAAI,YACF,KAAK,OAAO,WAAW,KAAK,GAAG,UAAU;EAG3C,SAAS;EAET,IAAI,QACF,KAAK,OAAO,OAAO,IAAI;EAGzB,IAAI,MACF,KAAK,OAAO,KAAK,IAAI;EAGvB,IAAI,YACF,KAAK,OAAO,WAAW,OACrB,KAAK,OAAO,WAAW,SAAS,WAAW,QAC3C,WAAW,MACb;EAGF,OAAO;CACT;;;;CAKA,AAAO,OAAO,QAAgB,UAAsB;EAClD,OAAO,KAAK,MAAM,EAAE,OAAO,GAAG,QAAQ;CACxC;;;;;;;;;;;;;CAcA,AAAO,QAAQ,SAA0B,UAAsB;EAC7D,OAAO,KAAK,OAAO,KAAK,WAAW,QAAQ;CAC7C;;;;;;;CAQA,MAAa,eACX,YACA,UACwB;EAExB,KAAK,OAAO,aAAa;EAEzB,IAAI;GAEF,OAAO,MAAM,SAAS;EACxB,SAAS,OAAO;GACd,QAAQ,IAAI,2BAA2B,KAAK;EAC9C,UAAU;GAER,OAAO,KAAK,OAAO;EACrB;CACF;;;;;;CAOA,AAAO,yBAAyB,YAA0B;EACxD,KAAK,SAAS,KAAK,OAAO,QAAQ,UAAU,MAAM,eAAe,UAAU;CAC7E;;;;CAKA,AAAQ,iBAAiB,UAAyB,QAAuC;EACvF,MAAM,UAAU,SAAS,OAAO,EAAE,KAAK,QAAQ;EAE/C,MAAM,mBAAmB,UAAU,aAAa;EAEhD,IAAI,WAAW,SAAS;GACtB,QAAQ,aAAa;GAErB,IAAI,QAAQ,YAAY,UACtB,QAAQ,WAAW,WAAW,QAAQ,WAAW,SAAS,KAAK,QAAQ;GAGzE,IAAI,SAAS,YAAY,OACvB,QAAQ,aAAa,MAAM,SAAS,WAAW,OAAO,QAAQ,UAAU;GAG1E,OAAO;EACT;EAEA,IAAI,CAAC,SAAS,cAAe,CAAC,oBAAoB,CAAC,SAAS,WAAW,KAAM,OAAO;EAEpF,IAAI,SAAS,WAAW,KAAK;GAC3B,MAAM,oBAAoB;IACxB,KAAK,UAAU,YAAY,KAAK;KAC/B,SAAS,kBAAkB;GAC9B;GAEA,MAAM,aAAuC,CAAC;GAE9C,IAAI,SAAS,WAAW,IAAI,UAAU,kBAAkB,QACtD;QAAI,CAAC,kBAAkB,UAAU,SAAS,WAAW,IAAI,QAEvD,WAAW,SAAS,SAAS,WAAW,IAAI;SACvC,IAAI,kBAAkB,UAAU,SAAS,WAAW,IAAI,QAE7D,WAAW,SAAS,SAAS,WAAW,IAAI,OAAO,MAAM,iBAAiB,MAAM;SAC3E,IAAI,kBAAkB,UAAU,CAAC,SAAS,WAAW,IAAI,QAE9D,WAAW,SAAS,iBAAiB;GACvC;GAIF,IAAI,kBAAkB,OAAO,kBAAkB,SAC7C,WAAW,WAAW,OAAO,SAAkB,aAAuB;IACpE,IAAI,kBAAkB,KAAK;KACzB,MAAM,SAAS,MAAM,kBAAkB,IAAI,KAAK,UAAU,SAAS,QAAQ;KAE3E,IAAI,QAAQ,OAAO;IACrB;IAEA,IAAI,kBAAkB,SACpB,OAAO,MAAM,kBAAkB,OAAO,EAAE,KAAK,UAAU,SAAS,QAAQ;GAI5E;GAGF,IAAI,CAAC,QAAQ,UAAU,GACrB,QAAQ,aAAa;EAEzB,OAAO;GACL,QAAQ,aAAa,SAAS,WAAW;GAEzC,IAAI,QAAQ,YAAY,UACtB,QAAQ,WAAW,WAAW,QAAQ,WAAW,SAAS,KAAK,QAAQ;EAE3E;EAEA,OAAO;CACT;;;;CAKA,AAAO,OAAO;EACZ,OAAO,KAAK;CACd;;;;CAKA,AAAO,KAAK,QAAyB;EACnC,KAAK,eAAe,YAAY,SAAS,aAAa,SAAS,MAAM,MAAM,CAAC;EAE5E,KAAK,OAAO,SAAS,UAAU;GAE7B,MAAM,wBAAwB,OADR,MAAM,OAAO,YACc,EAAE,CAAC,KAAK,MAAM;GAE/D,MAAM,UAAU;IACd,GAAG,MAAM;IACT,QAAQ;KACN,GAAG,MAAM,eAAe;KACxB,GAAI,MAAM,aAAa,EAAE,WAAW,MAAM,UAAU;IACtD;GACF;GAEA,sBACE,MAAM,MACN,SACA,OAAO,aAA6B,UAAwB;IAC1D,MAAM,EAAE,QAAQ,aAAa,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,aAAa,KAAK;IAE7E,OAAO,UAAU,SAAS;GAC5B,CACF;EACF,CAAC;EAED,KAAK,MAAM,oBAAoB,KAAK,mBAClC,OAAO,SAAS,eAAe;GAC7B,GAAG;GACH,eAAe;EACjB,CAAC;EAGH,KAAK,eAAe,eAAe,SAAS,aAAa,SAAS,MAAM,MAAM,CAAC;CACjF;;;;;CAMA,AAAO,cAAc,QAAyB;EAC5C,KAAK,eAAe,YAAY,SAAS,aAAa,SAAS,MAAM,MAAM,CAAC;EAG5E,MAAM,kBAAkB,OAAO,gBAAgC,iBAA+B;GAE5F,MAAM,gBAAgB,IAAI,cAAc;GAExC,cAAc,SAAS,KAAK,MAAM;GAElC,MAAM,QAAQ,cAAc,KAAK,eAAe,QAAQ,eAAe,GAAG;GAG1E,IAAI,CAAC,OACH,OAAO,aAAa,KAAK,GAAG,CAAC,CAAC,KAAK;IACjC,OAAO;IACP,MAAM,eAAe;IACrB,QAAQ,eAAe;GACzB,CAAC;GAIH,eAAe,SAAS,MAAM;GAE9B,IAAI;IAEF,MAAM,EAAE,QAAQ,aAAa,MAAM,KAAK,YAAY,MAAM,KAAK,CAAC,CAC9D,gBACA,YACF;IAEA,OAAO,UAAU,SAAS;GAC5B,SAAS,OAAO;IACd,QAAQ,IAAI,KAAK;IACjB,MAAM;GACR;EACF;EAKA,KAAK,MAAM,UAAU;GADJ;GAAO;GAAQ;GAAO;GAAU;EACtB,GACzB,OAAO,MAAM;GACX;GACA,KAAK;GACL,SAAS;EACX,CAAC;EAIH,KAAK,MAAM,oBAAoB,KAAK,mBAClC,OAAO,SAAS,eAAe;GAC7B,GAAG;GACH,eAAe;EACjB,CAAC;EAGH,KAAK,eAAe,eAAe,SAAS,aAAa,SAAS,MAAM,MAAM,CAAC;CACjF;;;;CAKA,AAAO,SAAS,MAAc,SAAc,CAAC,GAAG;EAC9C,MAAM,QAAQ,KAAK,OAAO,MAAM,UAAU,MAAM,SAAS,IAAI;EAE7D,IAAI,CAAC,OACH,MAAM,IAAI,MAAM,eAAe,KAAK,YAAY;EAGlD,IAAI,OAAO,MAAM;EAEjB,IAAI,MAAM,KAAK,SAAS,GAAG,GACzB,OAAO,KAAK,MAAM,CAAC,CAAC,SAAS,QAAQ;GACnC,OAAO,KAAK,QAAQ,MAAM,KAAK,OAAO,IAAI;EAC5C,CAAC;EAGH,OAAO;CACT;;;;CAKA,AAAQ,YAAY,OAAc;EAChC,OAAO,OAAO,gBAAgC,oBAAkC;GAC9E,MAAM,UAAU,IAAI,QAAQ;GAC5B,MAAM,WAAW,IAAI,SAAS;GAC9B,SAAS,YAAY,eAAe;GACpC,QAAQ,WAAW;GAEnB,SAAS,UAAU;GAEnB,QAAQ,WAAW,cAAc,CAAC,CAAC,SAAS,KAAK;GAEjD,IAAI,KAAK;IACP,QAAQ;IACR,QAAQ,MAAM,SAAS,MAAM,MAAM,KAAK,QAAQ,MAAM,EAAE;IACxD,SAAS,qBAAqB,QAAQ;IACtC,SAAS;KACP;KACA;IACF;GACF,CAAC;GAID,OAAO;IACL,QAAQ,MAHW,QAAQ,QAAQ;IAInC;IACA;GACF;EACF;CACF;AACF;AAEA,MAAa,SAAS,OAAO,YAAY;AAEzC,UAAU,IAAI,UAAU,MAAM"}
@@ -6,7 +6,7 @@ import { ObjectValidator } from "@warlock.js/seal";
6
6
  import { GenericObject } from "@mongez/reinforcements";
7
7
  import { RouteShorthandOptions } from "fastify";
8
8
 
9
- //#region ../../@warlock.js/core/src/router/types.d.ts
9
+ //#region ../@warlock.js/core/src/router/types.d.ts
10
10
  /**
11
11
  * Middleware response
12
12
  */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.mts","names":[],"sources":["../../../../../../@warlock.js/core/src/router/types.ts"],"mappings":";;;;;;;;;;;;KASY,kBAAA,GAAqB,gBAAgB;;AAAjD;;;;KAOY,UAAA,2BAAqC,OAAA,GAAU,OAAA;EAAA,CACxD,OAAA,EAAS,iBAAA,EAAmB,QAAA,EAAU,QAAA,GAAW,kBAAA;AAAA;AAAA,KAGxC,mBAAA;AAAA,KAEA,kBAAA,GAAqB,cAAA,SAAuB,aAAa;;;;KAKzD,cAAA;AAAA,KAEA,iBAAA,GAAoB,MAAM,UAAU,UAAA;AAAA,KAEpC,wBAAA,kBAA0C,OAAA,GAAU,OAAA;EAfzC;;;EAmBrB,QAAA,GAAW,UAAA,CAAW,QAAA;EAlBrB;;;;EAuBD,UAAA;EAvBoE;AAGtE;;EAwBE,MAAA,GAAS,eAAA;AAAA;AAAA,UAGM,yBAAA;EAzBL;;;EA6BV,OAAA,EAAS,OAAA;EA7B0D;AAKrE;;EA4BE,QAAA,EAAU,QAAA;EA5Bc;AAAA;AAE1B;EA8BE,OAAA,IAAW,OAAA,CAAQ,gBAAA;;;AA9BqC;EAkCxD,WAAA;EAhCkC;;;EAoClC,UAAA,SAAmB,OAAA,CAAQ,kBAAA,IAAsB,kBAAA;AAAA;AAAA,KAGvC,cAAA,kBAAgC,OAAA,GAAU,OAAA;EA1B3C;;;EAAA,CA8BR,OAAA,EAAS,QAAA,EAAU,QAAA,EAAU,QAAA,GAAW,gBAAA;EA3CW;;;EAgDpD,UAAA,GAAa,wBAAA,CAAyB,QAAA;EA5ChB;;;EAiDtB,WAAA;EAxCwB;AAAA;AAG1B;;EA2CE,cAAA,GAAiB,cAAA;AAAA;AAAA,UAGF,YAAA;EAlCI;;;EAsCnB,UAAA,GAAa,UAAA;EA9BoC;;;EAkCjD,oBAAA;EAlDS;;;EAsDT,IAAA;EA9CW;;;;EAmDX,WAAA;EA3C2B;;;EA+C3B,aAAA,GAAgB,qBAAqB;EA5C3B;;;;;EAkDV,KAAA;EA9C8B;;;EAkD9B,OAAA;EAlCiB;;;EAsCjB,MAAA;EA1D0C;;;EA8D1C,SAAA;IA1D8B;;;IA8D5B,GAAA;IAzDW;;;IA6DX,UAAA;IAlDe;;AAAc;IAsD7B,YAAA;EAAA;AAAA;AAAA,KAIQ,aAAA;;;;KAaA,KAAA,GAAQ,YAAA;EAnDlB;;;EAuDA,MAAA,EAAQ,aAAA;EAzCR;;;EA6CA,UAAA;EA7BE;;;EAiCF,IAAA;EAzBU;;;;EA8BV,OAAA,EAAS,cAAA;EAjBC;;;;;EAuBV,OAAA;EAUY;;;;;EAJZ,YAAA;EArBA;;;EAyBA,SAAA,GAAY,YAAA;AAAA;AAAA,KAGF,WAAA,oBAA+B,CAAA,IAAK,IAAA,CAAK,CAAA,EAAG,CAAA,IAAK,OAAA,CAAQ,IAAA,CAAK,CAAA,EAAG,CAAA;;;;KAKjE,oBAAA;EALA;;;EASV,UAAA,GAAa,UAAU;EAT4B;;;EAanD,MAAA;EAb2E;;;;EAkB3E,IAAA;AAAA;;KAIU,aAAA;EAtBoC;;;EA0B9C,IAAA,GAAO,cAAA;EA1B4D;;;EA8BnE,GAAA,GAAM,cAAA;EA9BsE;AAK9E;;EA6BE,MAAA,GAAS,cAAA;EAzBc;;;EA6BvB,MAAA,GAAS,cAAA;EApBT;;AAAI;EAwBJ,KAAA,GAAQ,cAAA;EApBe;;;EAwBvB,MAAA,GAAS,cAAA;EAZA;;;EAgBT,UAAA,GAAa,cAAA;EAAA;;;EAIb,UAAA;IAgBU;;;IAZR,GAAA,GAAM,wBAAA;IAhCD;;;IAoCL,MAAA,GAAS,wBAAA;IA5BF;;;IAgCP,MAAA,GAAS,wBAAA;IAxBH;;;IA4BN,KAAA,GAAQ,wBAAA;EAAA;AAAA;AAAA,KAIA,YAAA;EACV,MAAA;EACA,IAAA;EACA,UAAA,EAAY,UAAU;EAXpB;;;EAeF,UAAA;AAAA"}
1
+ {"version":3,"file":"types.d.mts","names":[],"sources":["../../../../../../../@warlock.js/core/src/router/types.ts"],"mappings":";;;;;;;;;;;;KASY,kBAAA,GAAqB,gBAAgB;;AAAjD;;;;KAOY,UAAA,2BAAqC,OAAA,GAAU,OAAA;EAAA,CACxD,OAAA,EAAS,iBAAA,EAAmB,QAAA,EAAU,QAAA,GAAW,kBAAA;AAAA;AAAA,KAGxC,mBAAA;AAAA,KAEA,kBAAA,GAAqB,cAAA,SAAuB,aAAa;;;;KAKzD,cAAA;AAAA,KAEA,iBAAA,GAAoB,MAAM,UAAU,UAAA;AAAA,KAEpC,wBAAA,kBAA0C,OAAA,GAAU,OAAA;EAfzC;;;EAmBrB,QAAA,GAAW,UAAA,CAAW,QAAA;EAlBrB;;;;EAuBD,UAAA;EAvBoE;AAGtE;;EAwBE,MAAA,GAAS,eAAA;AAAA;AAAA,UAGM,yBAAA;EAzBL;;;EA6BV,OAAA,EAAS,OAAA;EA7B0D;AAKrE;;EA4BE,QAAA,EAAU,QAAA;EA5Bc;AAAA;AAE1B;EA8BE,OAAA,IAAW,OAAA,CAAQ,gBAAA;;;AA9BqC;EAkCxD,WAAA;EAhCkC;;;EAoClC,UAAA,SAAmB,OAAA,CAAQ,kBAAA,IAAsB,kBAAA;AAAA;AAAA,KAGvC,cAAA,kBAAgC,OAAA,GAAU,OAAA;EA1B3C;;;EAAA,CA8BR,OAAA,EAAS,QAAA,EAAU,QAAA,EAAU,QAAA,GAAW,gBAAA;EA3CW;;;EAgDpD,UAAA,GAAa,wBAAA,CAAyB,QAAA;EA5ChB;;;EAiDtB,WAAA;EAxCwB;AAAA;AAG1B;;EA2CE,cAAA,GAAiB,cAAA;AAAA;AAAA,UAGF,YAAA;EAlCI;;;EAsCnB,UAAA,GAAa,UAAA;EA9BoC;;;EAkCjD,oBAAA;EAlDS;;;EAsDT,IAAA;EA9CW;;;;EAmDX,WAAA;EA3C2B;;;EA+C3B,aAAA,GAAgB,qBAAqB;EA5C3B;;;;;EAkDV,KAAA;EA9C8B;;;EAkD9B,OAAA;EAlCiB;;;EAsCjB,MAAA;EA1D0C;;;EA8D1C,SAAA;IA1D8B;;;IA8D5B,GAAA;IAzDW;;;IA6DX,UAAA;IAlDe;;AAAc;IAsD7B,YAAA;EAAA;AAAA;AAAA,KAIQ,aAAA;;;;KAaA,KAAA,GAAQ,YAAA;EAnDlB;;;EAuDA,MAAA,EAAQ,aAAA;EAzCR;;;EA6CA,UAAA;EA7BE;;;EAiCF,IAAA;EAzBU;;;;EA8BV,OAAA,EAAS,cAAA;EAjBC;;;;;EAuBV,OAAA;EAUY;;;;;EAJZ,YAAA;EArBA;;;EAyBA,SAAA,GAAY,YAAA;AAAA;AAAA,KAGF,WAAA,oBAA+B,CAAA,IAAK,IAAA,CAAK,CAAA,EAAG,CAAA,IAAK,OAAA,CAAQ,IAAA,CAAK,CAAA,EAAG,CAAA;;;;KAKjE,oBAAA;EALA;;;EASV,UAAA,GAAa,UAAU;EAT4B;;;EAanD,MAAA;EAb2E;;;;EAkB3E,IAAA;AAAA;;KAIU,aAAA;EAtBoC;;;EA0B9C,IAAA,GAAO,cAAA;EA1B4D;;;EA8BnE,GAAA,GAAM,cAAA;EA9BsE;AAK9E;;EA6BE,MAAA,GAAS,cAAA;EAzBc;;;EA6BvB,MAAA,GAAS,cAAA;EApBT;;AAAI;EAwBJ,KAAA,GAAQ,cAAA;EApBe;;;EAwBvB,MAAA,GAAS,cAAA;EAZA;;;EAgBT,UAAA,GAAa,cAAA;EAAA;;;EAIb,UAAA;IAgBU;;;IAZR,GAAA,GAAM,wBAAA;IAhCD;;;IAoCL,MAAA,GAAS,wBAAA;IA5BF;;;IAgCP,MAAA,GAAS,wBAAA;IAxBH;;;IA4BN,KAAA,GAAQ,wBAAA;EAAA;AAAA;AAAA,KAIA,YAAA;EACV,MAAA;EACA,IAAA;EACA,UAAA,EAAY,UAAU;EAXpB;;;EAeF,UAAA;AAAA"}
@@ -1,6 +1,6 @@
1
1
  import { ServerOptions } from "node:http";
2
2
 
3
- //#region ../../@warlock.js/core/src/socket/types.d.ts
3
+ //#region ../@warlock.js/core/src/socket/types.d.ts
4
4
  /**
5
5
  * Socket options
6
6
  */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.mts","names":[],"sources":["../../../../../../@warlock.js/core/src/socket/types.ts"],"mappings":";;;;;AAKA;KAAY,aAAA;;;;EAIV,IAAA;EAIU;;AAAa;EAAvB,OAAA,GAAU,aAAa;AAAA"}
1
+ {"version":3,"file":"types.d.mts","names":[],"sources":["../../../../../../../@warlock.js/core/src/socket/types.ts"],"mappings":";;;;;AAKA;KAAY,aAAA;;;;EAIV,IAAA;EAIU;;AAAa;EAAvB,OAAA,GAAU,aAAa;AAAA"}
@@ -1,6 +1,6 @@
1
1
  import { Server } from "socket.io";
2
2
 
3
- //#region ../../@warlock.js/core/src/socket/utils.d.ts
3
+ //#region ../@warlock.js/core/src/socket/utils.d.ts
4
4
  /**
5
5
  * Get socket server instance
6
6
  */
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.mts","names":[],"sources":["../../../../../../@warlock.js/core/src/socket/utils.ts"],"mappings":";;;;;AAMA;iBAAgB,eAAA,CAAA,GAAmB,MAAM"}
1
+ {"version":3,"file":"utils.d.mts","names":[],"sources":["../../../../../../../@warlock.js/core/src/socket/utils.ts"],"mappings":";;;;;AAMA;iBAAgB,eAAA,IAAmB,MAAM"}
@@ -1,6 +1,6 @@
1
1
  import { container } from "../container/index.mjs";
2
2
 
3
- //#region ../../@warlock.js/core/src/socket/utils.ts
3
+ //#region ../@warlock.js/core/src/socket/utils.ts
4
4
  /**
5
5
  * Get socket server instance
6
6
  */
@@ -1 +1 @@
1
- {"version":3,"file":"utils.mjs","names":[],"sources":["../../../../../../@warlock.js/core/src/socket/utils.ts"],"sourcesContent":["import { type Server } from \"socket.io\";\nimport { container } from \"../container\";\n\n/**\n * Get socket server instance\n */\nexport function getSocketServer(): Server | null {\n if (container.has(\"socket\")) {\n return container.get(\"socket\");\n }\n\n return null;\n}\n"],"mappings":";;;;;;AAMA,SAAgB,kBAAiC;CAC/C,IAAI,UAAU,IAAI,QAAQ,GACxB,OAAO,UAAU,IAAI,QAAQ;CAG/B,OAAO;AACT"}
1
+ {"version":3,"file":"utils.mjs","names":[],"sources":["../../../../../../../@warlock.js/core/src/socket/utils.ts"],"sourcesContent":["import { type Server } from \"socket.io\";\nimport { container } from \"../container\";\n\n/**\n * Get socket server instance\n */\nexport function getSocketServer(): Server | null {\n if (container.has(\"socket\")) {\n return container.get(\"socket\");\n }\n\n return null;\n}\n"],"mappings":";;;;;;AAMA,SAAgB,kBAAiC;CAC/C,IAAI,UAAU,IAAI,QAAQ,GACxB,OAAO,UAAU,IAAI,QAAQ;CAG/B,OAAO;AACT"}
@@ -1,7 +1,7 @@
1
1
  import { CloudStorageDriverOptions, LocalStorageDriverOptions, R2StorageDriverOptions, StorageConfigurations, StorageDriverConfig } from "./types.mjs";
2
2
  import { S3ClientConfig } from "@aws-sdk/client-s3";
3
3
 
4
- //#region ../../@warlock.js/core/src/storage/config.d.ts
4
+ //#region ../@warlock.js/core/src/storage/config.d.ts
5
5
  /**
6
6
  * Get storage configuration
7
7
  */
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.mts","names":[],"sources":["../../../../../../@warlock.js/core/src/storage/config.ts"],"mappings":";;;;;;AAaA;iBAAgB,aAAA,CAAA,GAAiB,qBAAqB;AAAA,iBACtC,aAAA,SAAA,CAAuB,GAAA,WAAc,CAAC;AAAA,iBACtC,aAAA,SAAA,CAAuB,GAAA,UAAa,YAAA,EAAc,CAAA,GAAI,CAAC;AAAA,cAS1D,qBAAA;mBACM,yBAAA,KAA4B,mBAAA;iBAM9B,yBAAA,GAA4B,cAAA,KAAiB,mBAAA;gBAM9C,sBAAA,GAAyB,cAAA,KAAiB,mBAAA;oBAMtC,yBAAA,GAA4B,cAAA,KAAiB,mBAAA;AAAA"}
1
+ {"version":3,"file":"config.d.mts","names":[],"sources":["../../../../../../../@warlock.js/core/src/storage/config.ts"],"mappings":";;;;;;AAaA;iBAAgB,aAAA,IAAiB,qBAAqB;AAAA,iBACtC,aAAA,UAAuB,GAAA,WAAc,CAAC;AAAA,iBACtC,aAAA,UAAuB,GAAA,UAAa,YAAA,EAAc,CAAA,GAAI,CAAC;AAAA,cAS1D,qBAAA;mBACM,yBAAA,KAA4B,mBAAA;iBAM9B,yBAAA,GAA4B,cAAA,KAAiB,mBAAA;gBAM9C,sBAAA,GAAyB,cAAA,KAAiB,mBAAA;oBAMtC,yBAAA,GAA4B,cAAA,KAAiB,mBAAA;AAAA"}
@@ -1,7 +1,7 @@
1
1
  import { config } from "../config/config-getter.mjs";
2
2
  import "../config/index.mjs";
3
3
 
4
- //#region ../../@warlock.js/core/src/storage/config.ts
4
+ //#region ../@warlock.js/core/src/storage/config.ts
5
5
  function storageConfig(key, defaultValue) {
6
6
  if (!key) return config.get("storage");
7
7
  return config.get(`storage.${key}`, defaultValue);
@@ -1 +1 @@
1
- {"version":3,"file":"config.mjs","names":[],"sources":["../../../../../../@warlock.js/core/src/storage/config.ts"],"sourcesContent":["import type { S3ClientConfig } from \"@aws-sdk/client-s3\";\nimport { config } from \"../config\";\nimport type {\n CloudStorageDriverOptions,\n LocalStorageDriverOptions,\n R2StorageDriverOptions,\n StorageConfigurations,\n StorageDriverConfig,\n} from \"./types\";\n\n/**\n * Get storage configuration\n */\nexport function storageConfig(): StorageConfigurations;\nexport function storageConfig<T = any>(key: string): T;\nexport function storageConfig<T = any>(key: string, defaultValue: T): T;\nexport function storageConfig(key?: string, defaultValue?: any): any {\n if (!key) {\n return config.get(\"storage\");\n }\n\n return config.get(`storage.${key}`, defaultValue);\n}\n\nexport const storageConfigurations = {\n local: (options: LocalStorageDriverOptions): StorageDriverConfig => {\n return {\n driver: \"local\",\n ...options,\n };\n },\n aws: (options: CloudStorageDriverOptions & S3ClientConfig): StorageDriverConfig => {\n return {\n driver: \"s3\",\n ...options,\n };\n },\n r2: (options: R2StorageDriverOptions & S3ClientConfig): StorageDriverConfig => {\n return {\n driver: \"r2\",\n ...options,\n };\n },\n spaces: (options: CloudStorageDriverOptions & S3ClientConfig): StorageDriverConfig => {\n return {\n driver: \"spaces\",\n ...options,\n };\n },\n};\n"],"mappings":";;;;AAgBA,SAAgB,cAAc,KAAc,cAAyB;CACnE,IAAI,CAAC,KACH,OAAO,OAAO,IAAI,SAAS;CAG7B,OAAO,OAAO,IAAI,WAAW,OAAO,YAAY;AAClD;AAEA,MAAa,wBAAwB;CACnC,QAAQ,YAA4D;EAClE,OAAO;GACL,QAAQ;GACR,GAAG;EACL;CACF;CACA,MAAM,YAA6E;EACjF,OAAO;GACL,QAAQ;GACR,GAAG;EACL;CACF;CACA,KAAK,YAA0E;EAC7E,OAAO;GACL,QAAQ;GACR,GAAG;EACL;CACF;CACA,SAAS,YAA6E;EACpF,OAAO;GACL,QAAQ;GACR,GAAG;EACL;CACF;AACF"}
1
+ {"version":3,"file":"config.mjs","names":[],"sources":["../../../../../../../@warlock.js/core/src/storage/config.ts"],"sourcesContent":["import type { S3ClientConfig } from \"@aws-sdk/client-s3\";\nimport { config } from \"../config\";\nimport type {\n CloudStorageDriverOptions,\n LocalStorageDriverOptions,\n R2StorageDriverOptions,\n StorageConfigurations,\n StorageDriverConfig,\n} from \"./types\";\n\n/**\n * Get storage configuration\n */\nexport function storageConfig(): StorageConfigurations;\nexport function storageConfig<T = any>(key: string): T;\nexport function storageConfig<T = any>(key: string, defaultValue: T): T;\nexport function storageConfig(key?: string, defaultValue?: any): any {\n if (!key) {\n return config.get(\"storage\");\n }\n\n return config.get(`storage.${key}`, defaultValue);\n}\n\nexport const storageConfigurations = {\n local: (options: LocalStorageDriverOptions): StorageDriverConfig => {\n return {\n driver: \"local\",\n ...options,\n };\n },\n aws: (options: CloudStorageDriverOptions & S3ClientConfig): StorageDriverConfig => {\n return {\n driver: \"s3\",\n ...options,\n };\n },\n r2: (options: R2StorageDriverOptions & S3ClientConfig): StorageDriverConfig => {\n return {\n driver: \"r2\",\n ...options,\n };\n },\n spaces: (options: CloudStorageDriverOptions & S3ClientConfig): StorageDriverConfig => {\n return {\n driver: \"spaces\",\n ...options,\n };\n },\n};\n"],"mappings":";;;;AAgBA,SAAgB,cAAc,KAAc,cAAyB;CACnE,IAAI,CAAC,KACH,OAAO,OAAO,IAAI,SAAS;CAG7B,OAAO,OAAO,IAAI,WAAW,OAAO,YAAY;AAClD;AAEA,MAAa,wBAAwB;CACnC,QAAQ,YAA4D;EAClE,OAAO;GACL,QAAQ;GACR,GAAG;EACL;CACF;CACA,MAAM,YAA6E;EACjF,OAAO;GACL,QAAQ;GACR,GAAG;EACL;CACF;CACA,KAAK,YAA0E;EAC7E,OAAO;GACL,QAAQ;GACR,GAAG;EACL;CACF;CACA,SAAS,YAA6E;EACpF,OAAO;GACL,QAAQ;GACR,GAAG;EACL;CACF;AACF"}
@@ -1,7 +1,7 @@
1
1
  import { StorageDriverContract } from "../types.mjs";
2
2
  import { Context } from "@warlock.js/context";
3
3
 
4
- //#region ../../@warlock.js/core/src/storage/context/storage-driver-context.d.ts
4
+ //#region ../@warlock.js/core/src/storage/context/storage-driver-context.d.ts
5
5
  type StorageDriverContextStore = {
6
6
  driver?: StorageDriverContract;
7
7
  prefix?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"storage-driver-context.d.mts","names":[],"sources":["../../../../../../../@warlock.js/core/src/storage/context/storage-driver-context.ts"],"mappings":";;;;KAGY,yBAAA;EACV,MAAA,GAAS,qBAAA;EACT,MAAA;EACA,QAAA,GAAW,MAAM;AAAA;;;;;;;;AAAA;AACjB;;;;;;;;;;cAoBI,oBAAA,SAA6B,OAAA,CAAQ,yBAAA;EAAD;;;EAIjC,SAAA,CAAA,GAAa,qBAAA;EAAA;;;EAOb,SAAA,CAAA;EAiBA;;;EAVA,WAAA,CAAA,GAAe,MAAA;EAYS;;;;;;EAFxB,SAAA,CACL,MAAA,EAAQ,qBAAA,EACR,OAAA;IAAY,MAAA;IAAiB,QAAA,GAAW,MAAA;EAAA;EAwC/B;;;;AAAiD;;;;EAvBrD,SAAA,CAAU,MAAA;;;;EAOV,WAAA,CAAA;;;;EAOA,UAAA,CAAA,GAAc,yBAAA;AAAA;AAAA,cASV,oBAAA,EAAoB,oBAA6B"}
1
+ {"version":3,"file":"storage-driver-context.d.mts","names":[],"sources":["../../../../../../../../@warlock.js/core/src/storage/context/storage-driver-context.ts"],"mappings":";;;;KAGY,yBAAA;EACV,MAAA,GAAS,qBAAA;EACT,MAAA;EACA,QAAA,GAAW,MAAM;AAAA;;;;;;;;AAAA;AACjB;;;;;;;;;;cAoBI,oBAAA,SAA6B,OAAA,CAAQ,yBAAA;EAAD;;;EAIjC,SAAA,IAAa,qBAAA;EAAA;;;EAOb,SAAA;EAiBA;;;EAVA,WAAA,IAAe,MAAA;EAYS;;;;;;EAFxB,SAAA,CACL,MAAA,EAAQ,qBAAA,EACR,OAAA;IAAY,MAAA;IAAiB,QAAA,GAAW,MAAA;EAAA;EAwC/B;;;;AAAiD;;;;EAvBrD,SAAA,CAAU,MAAA;;;;EAOV,WAAA;;;;EAOA,UAAA,IAAc,yBAAA;AAAA;AAAA,cASV,oBAAA,EAAoB,oBAA6B"}
@@ -1,6 +1,6 @@
1
1
  import { Context, contextManager } from "@warlock.js/context";
2
2
 
3
- //#region ../../@warlock.js/core/src/storage/context/storage-driver-context.ts
3
+ //#region ../@warlock.js/core/src/storage/context/storage-driver-context.ts
4
4
  /**
5
5
  * Storage Driver Context
6
6
  *
@@ -1 +1 @@
1
- {"version":3,"file":"storage-driver-context.mjs","names":[],"sources":["../../../../../../../@warlock.js/core/src/storage/context/storage-driver-context.ts"],"sourcesContent":["import { Context, contextManager } from \"@warlock.js/context\";\nimport type { StorageDriverContract } from \"../types\";\n\nexport type StorageDriverContextStore = {\n driver?: StorageDriverContract;\n prefix?: string;\n metadata?: Record<string, any>;\n};\n\n/**\n * Storage Driver Context\n *\n * Manages the active storage driver and path prefix using AsyncLocalStorage.\n * Allows multi-tenant applications to switch drivers and isolate storage paths per request context.\n *\n * @example\n * ```typescript\n * // Set driver with tenant-specific prefix\n * storageDriverContext.setDriver(storage.getDriver(\"s3\"), {\n * prefix: \"tenant-123\",\n * metadata: { tenantId: \"123\" }\n * });\n *\n * // Or just set prefix for same driver\n * storageDriverContext.setPrefix(\"tenant-456\");\n * ```\n */\nclass StorageDriverContext extends Context<StorageDriverContextStore> {\n /**\n * Get the current storage driver\n */\n public getDriver(): StorageDriverContract | undefined {\n return this.get(\"driver\");\n }\n\n /**\n * Get the current path prefix (e.g., tenant-specific path)\n */\n public getPrefix(): string | undefined {\n return this.get(\"prefix\");\n }\n\n /**\n * Get context metadata (e.g., tenantId)\n */\n public getMetadata(): Record<string, any> | undefined {\n return this.get(\"metadata\");\n }\n\n /**\n * Set the active driver with optional prefix and metadata\n *\n * @param driver - Storage driver to use\n * @param options - Optional prefix and metadata\n */\n public setDriver(\n driver: StorageDriverContract,\n options?: { prefix?: string; metadata?: Record<string, any> },\n ): void {\n this.update({\n driver,\n prefix: options?.prefix,\n metadata: options?.metadata,\n });\n }\n\n /**\n * Set only the path prefix (keeps current driver)\n *\n * Useful for multi-tenant scenarios where you want to isolate\n * storage paths without changing the driver.\n *\n * @param prefix - Path prefix to prepend to all operations\n */\n public setPrefix(prefix: string): void {\n this.update({ prefix });\n }\n\n /**\n * Clear the prefix\n */\n public clearPrefix(): void {\n this.update({ prefix: undefined });\n }\n\n /**\n * Build the initial storage store with defaults\n */\n public buildStore(): StorageDriverContextStore {\n return {\n driver: undefined,\n prefix: undefined,\n metadata: undefined,\n };\n }\n}\n\nexport const storageDriverContext = new StorageDriverContext();\n\ncontextManager.register(\"storage\", storageDriverContext);\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AA2BA,IAAM,uBAAN,cAAmC,QAAmC;;;;CAIpE,AAAO,YAA+C;EACpD,OAAO,KAAK,IAAI,QAAQ;CAC1B;;;;CAKA,AAAO,YAAgC;EACrC,OAAO,KAAK,IAAI,QAAQ;CAC1B;;;;CAKA,AAAO,cAA+C;EACpD,OAAO,KAAK,IAAI,UAAU;CAC5B;;;;;;;CAQA,AAAO,UACL,QACA,SACM;EACN,KAAK,OAAO;GACV;GACA,QAAQ,SAAS;GACjB,UAAU,SAAS;EACrB,CAAC;CACH;;;;;;;;;CAUA,AAAO,UAAU,QAAsB;EACrC,KAAK,OAAO,EAAE,OAAO,CAAC;CACxB;;;;CAKA,AAAO,cAAoB;EACzB,KAAK,OAAO,EAAE,QAAQ,OAAU,CAAC;CACnC;;;;CAKA,AAAO,aAAwC;EAC7C,OAAO;GACL,QAAQ;GACR,QAAQ;GACR,UAAU;EACZ;CACF;AACF;AAEA,MAAa,uBAAuB,IAAI,qBAAqB;AAE7D,eAAe,SAAS,WAAW,oBAAoB"}
1
+ {"version":3,"file":"storage-driver-context.mjs","names":[],"sources":["../../../../../../../../@warlock.js/core/src/storage/context/storage-driver-context.ts"],"sourcesContent":["import { Context, contextManager } from \"@warlock.js/context\";\nimport type { StorageDriverContract } from \"../types\";\n\nexport type StorageDriverContextStore = {\n driver?: StorageDriverContract;\n prefix?: string;\n metadata?: Record<string, any>;\n};\n\n/**\n * Storage Driver Context\n *\n * Manages the active storage driver and path prefix using AsyncLocalStorage.\n * Allows multi-tenant applications to switch drivers and isolate storage paths per request context.\n *\n * @example\n * ```typescript\n * // Set driver with tenant-specific prefix\n * storageDriverContext.setDriver(storage.getDriver(\"s3\"), {\n * prefix: \"tenant-123\",\n * metadata: { tenantId: \"123\" }\n * });\n *\n * // Or just set prefix for same driver\n * storageDriverContext.setPrefix(\"tenant-456\");\n * ```\n */\nclass StorageDriverContext extends Context<StorageDriverContextStore> {\n /**\n * Get the current storage driver\n */\n public getDriver(): StorageDriverContract | undefined {\n return this.get(\"driver\");\n }\n\n /**\n * Get the current path prefix (e.g., tenant-specific path)\n */\n public getPrefix(): string | undefined {\n return this.get(\"prefix\");\n }\n\n /**\n * Get context metadata (e.g., tenantId)\n */\n public getMetadata(): Record<string, any> | undefined {\n return this.get(\"metadata\");\n }\n\n /**\n * Set the active driver with optional prefix and metadata\n *\n * @param driver - Storage driver to use\n * @param options - Optional prefix and metadata\n */\n public setDriver(\n driver: StorageDriverContract,\n options?: { prefix?: string; metadata?: Record<string, any> },\n ): void {\n this.update({\n driver,\n prefix: options?.prefix,\n metadata: options?.metadata,\n });\n }\n\n /**\n * Set only the path prefix (keeps current driver)\n *\n * Useful for multi-tenant scenarios where you want to isolate\n * storage paths without changing the driver.\n *\n * @param prefix - Path prefix to prepend to all operations\n */\n public setPrefix(prefix: string): void {\n this.update({ prefix });\n }\n\n /**\n * Clear the prefix\n */\n public clearPrefix(): void {\n this.update({ prefix: undefined });\n }\n\n /**\n * Build the initial storage store with defaults\n */\n public buildStore(): StorageDriverContextStore {\n return {\n driver: undefined,\n prefix: undefined,\n metadata: undefined,\n };\n }\n}\n\nexport const storageDriverContext = new StorageDriverContext();\n\ncontextManager.register(\"storage\", storageDriverContext);\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AA2BA,IAAM,uBAAN,cAAmC,QAAmC;;;;CAIpE,AAAO,YAA+C;EACpD,OAAO,KAAK,IAAI,QAAQ;CAC1B;;;;CAKA,AAAO,YAAgC;EACrC,OAAO,KAAK,IAAI,QAAQ;CAC1B;;;;CAKA,AAAO,cAA+C;EACpD,OAAO,KAAK,IAAI,UAAU;CAC5B;;;;;;;CAQA,AAAO,UACL,QACA,SACM;EACN,KAAK,OAAO;GACV;GACA,QAAQ,SAAS;GACjB,UAAU,SAAS;EACrB,CAAC;CACH;;;;;;;;;CAUA,AAAO,UAAU,QAAsB;EACrC,KAAK,OAAO,EAAE,OAAO,CAAC;CACxB;;;;CAKA,AAAO,cAAoB;EACzB,KAAK,OAAO,EAAE,QAAQ,OAAU,CAAC;CACnC;;;;CAKA,AAAO,aAAwC;EAC7C,OAAO;GACL,QAAQ;GACR,QAAQ;GACR,UAAU;EACZ;CACF;AACF;AAEA,MAAa,uBAAuB,IAAI,qBAAqB;AAE7D,eAAe,SAAS,WAAW,oBAAoB"}
@@ -1,7 +1,7 @@
1
1
  import { CloudStorageDriverContract, CloudStorageDriverOptions, CloudStorageFileData, DeleteManyResult, FileVisibility, ListOptions, PresignedOptions, PresignedUploadOptions, PutOptions, StorageDriverType, StorageFileInfo } from "../types.mjs";
2
2
  import { Readable } from "stream";
3
3
 
4
- //#region ../../@warlock.js/core/src/storage/drivers/cloud-driver.d.ts
4
+ //#region ../@warlock.js/core/src/storage/drivers/cloud-driver.d.ts
5
5
  /**
6
6
  * Load S3 modules lazily
7
7
  *
@@ -1 +1 @@
1
- {"version":3,"file":"cloud-driver.d.mts","names":[],"sources":["../../../../../../../@warlock.js/core/src/storage/drivers/cloud-driver.ts"],"mappings":";;;;;;AA4DA;;;;AAAuC;AAoDvC;;iBApDsB,MAAA,CAAA,GAAU,OAAO;;;;;;;;;;;;;;;;;uBAoDjB,WAAA,kBACH,OAAA,CAAQ,yBAAA,IAA6B,yBAAA,aAC3C,0BAAA;EAgBe,OAAA,EAAS,QAAA;EA0OhC;;;EAAA,UAtPO,MAAA,EAAS,YAAA,qCAAiD,QAAA;EA6T1B;;;EAAA,UAxThC,WAAA;IACR,UAAA;IACA,cAAA;IACA,UAAA;IACA,iBAAA;EAAA;cAGwB,OAAA,EAAS,QAAA;EAwfhC;;;EAAA,kBA9dsB,IAAA,EAAM,iBAAA;EAqiBsB;;;;EAAA,SA/hBrC,GAAA,CAAI,QAAA;EAilBiD;;;;EAAA,UA3kB3D,WAAA,CAAA;EA2rB4C;;;;;;;;;EA1qB/C,WAAA,CAAY,QAAA;EAvER;;;;EAAA,UA+FD,aAAA,CAAc,IAAA;EA3F4C;;;;;;;;;;EAAA,UA4GpD,SAAA,GAAA,CACd,SAAA,QAAiB,OAAA,CAAQ,CAAA,GACzB,aAAA,YACC,OAAA,CAAQ,CAAA;EAnEK;;;;;;;;;;;;;;;;;;EAAA,UAqHN,gBAAA,CAAiB,KAAA;EAoCzB;;;EADW,GAAA,CACX,IAAA,EAAM,MAAA,EACN,QAAA,UACA,OAAA,GAAU,UAAA,GACT,OAAA,CAAQ,oBAAA;EAAR;;;;EA0CU,SAAA,CACX,MAAA,EAAQ,QAAA,EACR,QAAA,UACA,OAAA,GAAU,UAAA,GACT,OAAA,CAAQ,oBAAA;EAFT;;;EAgDW,GAAA,CAAI,QAAA,WAAmB,OAAA,CAAQ,MAAA;EA9CjC;;;EAuEE,SAAA,CAAU,QAAA,WAAmB,OAAA,CAAQ,QAAA;EAzBN;;;EAkD/B,MAAA,CAAO,QAAA,WAAmB,OAAA;EAzBW;;;EA8CrC,UAAA,CAAW,SAAA,aAAsB,OAAA,CAAQ,gBAAA;EAAzC;;;;;;;;;EAqDA,eAAA,CAAgB,aAAA,WAAwB,OAAA;EAoExC;;;EA3BA,MAAA,CAAO,QAAA,WAAmB,OAAA;EAkC1B;;;EAPA,YAAA,CAAa,QAAA,UAAkB,SAAA,YAAmB,OAAA;EAOa;;;EAA/D,eAAA,CAAgB,QAAA,UAAkB,OAAA,GAAU,gBAAA,GAAmB,OAAA;EAwB1E;;;EAFW,qBAAA,CACX,QAAA,UACA,OAAA,GAAU,sBAAA,GACT,OAAA;EA4BsC;;;EAA5B,QAAA,CAAS,QAAA,WAAmB,OAAA,CAAQ,eAAA;EA+BZ;;;EAAxB,IAAA,CAAK,QAAA,WAAmB,OAAA;EAYQ;;;EAAhC,IAAA,CAAK,IAAA,UAAc,EAAA,WAAa,OAAA,CAAQ,oBAAA;EAyCrB;;;EAAnB,IAAA,CAAK,IAAA,UAAc,EAAA,WAAa,OAAA,CAAQ,oBAAA;EASnC;;;EAAL,IAAA,CAAK,SAAA,UAAmB,OAAA,GAAU,WAAA,GAAc,OAAA,CAAQ,eAAA;EAAA;;;EAwD9D,SAAA,CAAA;EAcsB;;;EAPtB,SAAA,CAAA;EA6BoB;;;EAtBd,eAAA,CAAgB,QAAA,UAAkB,YAAA,WAAuB,OAAA;EA0CzD;;;EApBA,aAAA,CAAc,QAAA,UAAkB,UAAA,EAAY,cAAA,GAAiB,OAAA;EAoDhE;;;EAhCG,aAAA,CAAc,QAAA,WAAmB,OAAA,CAAQ,cAAA;EAuC9B;;AAAgB;EAAhB,UAPd,aAAA,CAAc,MAAA,EAAQ,MAAA;;;;YAOtB,aAAA,CAAc,QAAA;AAAA"}
1
+ {"version":3,"file":"cloud-driver.d.mts","names":[],"sources":["../../../../../../../../@warlock.js/core/src/storage/drivers/cloud-driver.ts"],"mappings":";;;;;;AA4DA;;;;AAAuC;AAoDvC;;iBApDsB,MAAA,IAAU,OAAO;;;;;;;;;;;;;;;;;uBAoDjB,WAAA,kBACH,OAAA,CAAQ,yBAAA,IAA6B,yBAAA,aAC3C,0BAAA;EAgBe,OAAA,EAAS,QAAA;EA0OhC;;;EAAA,UAtPO,MAAA,EAAS,YAAA,qCAAiD,QAAA;EA6T1B;;;EAAA,UAxThC,WAAA;IACR,UAAA;IACA,cAAA;IACA,UAAA;IACA,iBAAA;EAAA;cAGwB,OAAA,EAAS,QAAA;EAwfhC;;;EAAA,kBA9dsB,IAAA,EAAM,iBAAA;EAqiBsB;;;;EAAA,SA/hBrC,GAAA,CAAI,QAAA;EAilBiD;;;;EAAA,UA3kB3D,WAAA;EA2rB4C;;;;;;;;;EA1qB/C,WAAA,CAAY,QAAA;EAvER;;;;EAAA,UA+FD,aAAA,CAAc,IAAA;EA3F4C;;;;;;;;;;EAAA,UA4GpD,SAAA,IACd,SAAA,QAAiB,OAAA,CAAQ,CAAA,GACzB,aAAA,YACC,OAAA,CAAQ,CAAA;EAnEK;;;;;;;;;;;;;;;;;;EAAA,UAqHN,gBAAA,CAAiB,KAAA;EAoCzB;;;EADW,GAAA,CACX,IAAA,EAAM,MAAA,EACN,QAAA,UACA,OAAA,GAAU,UAAA,GACT,OAAA,CAAQ,oBAAA;EAAR;;;;EA0CU,SAAA,CACX,MAAA,EAAQ,QAAA,EACR,QAAA,UACA,OAAA,GAAU,UAAA,GACT,OAAA,CAAQ,oBAAA;EAFT;;;EAgDW,GAAA,CAAI,QAAA,WAAmB,OAAA,CAAQ,MAAA;EA9CjC;;;EAuEE,SAAA,CAAU,QAAA,WAAmB,OAAA,CAAQ,QAAA;EAzBN;;;EAkD/B,MAAA,CAAO,QAAA,WAAmB,OAAA;EAzBW;;;EA8CrC,UAAA,CAAW,SAAA,aAAsB,OAAA,CAAQ,gBAAA;EAAzC;;;;;;;;;EAqDA,eAAA,CAAgB,aAAA,WAAwB,OAAA;EAoExC;;;EA3BA,MAAA,CAAO,QAAA,WAAmB,OAAA;EAkC1B;;;EAPA,YAAA,CAAa,QAAA,UAAkB,SAAA,YAAmB,OAAA;EAOa;;;EAA/D,eAAA,CAAgB,QAAA,UAAkB,OAAA,GAAU,gBAAA,GAAmB,OAAA;EAwB1E;;;EAFW,qBAAA,CACX,QAAA,UACA,OAAA,GAAU,sBAAA,GACT,OAAA;EA4BsC;;;EAA5B,QAAA,CAAS,QAAA,WAAmB,OAAA,CAAQ,eAAA;EA+BZ;;;EAAxB,IAAA,CAAK,QAAA,WAAmB,OAAA;EAYQ;;;EAAhC,IAAA,CAAK,IAAA,UAAc,EAAA,WAAa,OAAA,CAAQ,oBAAA;EAyCrB;;;EAAnB,IAAA,CAAK,IAAA,UAAc,EAAA,WAAa,OAAA,CAAQ,oBAAA;EASnC;;;EAAL,IAAA,CAAK,SAAA,UAAmB,OAAA,GAAU,WAAA,GAAc,OAAA,CAAQ,eAAA;EAAA;;;EAwD9D,SAAA;EAcsB;;;EAPtB,SAAA;EA6BoB;;;EAtBd,eAAA,CAAgB,QAAA,UAAkB,YAAA,WAAuB,OAAA;EA0CzD;;;EApBA,aAAA,CAAc,QAAA,UAAkB,UAAA,EAAY,cAAA,GAAiB,OAAA;EAoDhE;;;EAhCG,aAAA,CAAc,QAAA,WAAmB,OAAA,CAAQ,cAAA;EAuC9B;;AAAgB;EAAhB,UAPd,aAAA,CAAc,MAAA,EAAQ,MAAA;;;;YAOtB,aAAA,CAAc,QAAA;AAAA"}
@@ -2,7 +2,7 @@ import { storageDriverContext } from "../context/storage-driver-context.mjs";
2
2
  import { getMimeType } from "../utils/mime.mjs";
3
3
  import crypto from "crypto";
4
4
 
5
- //#region ../../@warlock.js/core/src/storage/drivers/cloud-driver.ts
5
+ //#region ../@warlock.js/core/src/storage/drivers/cloud-driver.ts
6
6
  /**
7
7
  * Cached S3 SDK modules (loaded once, reused)
8
8
  */
@@ -1 +1 @@
1
- {"version":3,"file":"cloud-driver.mjs","names":[],"sources":["../../../../../../../@warlock.js/core/src/storage/drivers/cloud-driver.ts"],"sourcesContent":["import crypto from \"crypto\";\nimport type { Readable } from \"stream\";\nimport { storageDriverContext } from \"../context/storage-driver-context\";\nimport type {\n CloudStorageDriverContract,\n CloudStorageDriverOptions,\n CloudStorageFileData,\n DeleteManyResult,\n FileVisibility,\n ListOptions,\n PresignedOptions,\n PresignedUploadOptions,\n PutOptions,\n StorageDriverType,\n StorageFileInfo,\n} from \"../types\";\nimport { getMimeType } from \"../utils/mime\";\n\n// ============================================================\n// Lazy-loaded S3 SDK Types\n// ============================================================\n\n/**\n * Cached S3 SDK modules (loaded once, reused)\n */\nlet S3Client: typeof import(\"@aws-sdk/client-s3\");\nlet S3Storage: typeof import(\"@aws-sdk/lib-storage\");\nlet S3Presigner: typeof import(\"@aws-sdk/s3-request-presigner\");\n\nlet isModuleExists: boolean | null = null;\n\n/**\n * Installation instructions for S3 SDK packages\n */\nconst S3_INSTALL_INSTRUCTIONS = `\nCloud storage requires the AWS S3 SDK packages.\nInstall them with:\n\n npm install @aws-sdk/client-s3 @aws-sdk/lib-storage @aws-sdk/s3-request-presigner\n\nOr with your preferred package manager:\n\n pnpm add @aws-sdk/client-s3 @aws-sdk/lib-storage @aws-sdk/s3-request-presigner\n yarn add @aws-sdk/client-s3 @aws-sdk/lib-storage @aws-sdk/s3-request-presigner\n`.trim();\n\n/**\n * Atomic initialization promise to handle concurrent calls to loadS3\n */\nlet initializationPromise: Promise<void> | null = null;\n\n/**\n * Load S3 modules lazily\n *\n * @example\n * await loadS3();\n * if (isModuleExists) {\n * // Safe to use S3Client, S3Storage, S3Presigner\n * }\n */\nexport async function loadS3(): Promise<void> {\n // If already successfully loaded, no need to do anything\n if (isModuleExists === true) return;\n\n // If currently loading, return the existing promise so the caller waits\n if (initializationPromise) return initializationPromise;\n\n initializationPromise = (async () => {\n try {\n // Use Promise.all to load modules in parallel for efficiency\n const [client, storage, presigner] = await Promise.all([\n import(\"@aws-sdk/client-s3\"),\n import(\"@aws-sdk/lib-storage\"),\n import(\"@aws-sdk/s3-request-presigner\"),\n ]);\n\n S3Client = client;\n S3Storage = storage;\n S3Presigner = presigner;\n\n isModuleExists = true;\n } catch {\n // Mark as failed if any import fails (usually means packages aren't installed)\n isModuleExists = false;\n }\n })();\n\n return initializationPromise;\n}\n\nloadS3();\n\n// ============================================================\n// CloudDriver Base Class\n// ============================================================\n\n/**\n * Base abstract class for all S3-compatible cloud storage drivers\n *\n * This class contains all shared logic for S3-compatible storage services\n * including AWS S3, Cloudflare R2, DigitalOcean Spaces, and others.\n *\n * **Important:** S3 SDK packages are lazy-loaded on first use.\n * Users must install them separately:\n * ```\n * npm install @aws-sdk/client-s3 @aws-sdk/lib-storage @aws-sdk/s3-request-presigner\n * ```\n *\n * Subclasses must implement:\n * - `name`: Driver identifier (e.g., \"s3\", \"r2\", \"spaces\")\n * - `url()`: Returns the public URL for a file (provider-specific format)\n */\nexport abstract class CloudDriver<\n TOptions extends Partial<CloudStorageDriverOptions> = CloudStorageDriverOptions,\n> implements CloudStorageDriverContract {\n /**\n * S3-compatible client (lazy-loaded)\n */\n protected client!: InstanceType<typeof import(\"@aws-sdk/client-s3\").S3Client>;\n\n /**\n * Retry configuration\n */\n protected retryConfig: {\n maxRetries: number;\n initialDelayMs: number;\n maxDelayMs: number;\n backoffMultiplier: number;\n };\n\n public constructor(public options: TOptions) {\n if (!isModuleExists) {\n throw new Error(S3_INSTALL_INSTRUCTIONS);\n }\n\n this.client = new S3Client.S3Client({\n region: this.options.region!,\n credentials: {\n accessKeyId: this.options.accessKeyId!,\n secretAccessKey: this.options.secretAccessKey!,\n },\n ...(this.getEndpoint() && { endpoint: this.getEndpoint() }),\n });\n\n // Initialize retry configuration\n this.retryConfig = {\n maxRetries: this.options.retry?.maxRetries ?? 3,\n initialDelayMs: this.options.retry?.initialDelayMs ?? 1000,\n maxDelayMs: this.options.retry?.maxDelayMs ?? 10000,\n backoffMultiplier: this.options.retry?.backoffMultiplier ?? 2,\n };\n }\n\n /**\n * Driver name identifier\n */\n public abstract readonly name: StorageDriverType;\n\n /**\n * Get public URL for file\n * Must be implemented by subclasses with provider-specific format\n */\n public abstract url(location: string): string;\n\n /**\n * Get endpoint URL\n * Can be overridden by subclasses for provider-specific endpoints\n */\n protected getEndpoint(): string | undefined {\n return this.options.endpoint;\n }\n\n // ============================================================\n // Helper Methods\n // ============================================================\n\n /**\n * Apply prefix to location path\n *\n * Priority: context prefix > driver options prefix > no prefix\n * This allows multi-tenant scenarios where context overrides driver config.\n *\n * @param location - Original location path\n * @returns Location with prefix applied if one exists\n */\n public applyPrefix(location: string): string {\n // Check context prefix first (highest priority)\n const contextPrefix = storageDriverContext.getPrefix();\n const prefix = contextPrefix || this.options.prefix;\n\n if (!prefix) {\n return location;\n }\n\n const cleanPrefix = prefix.replace(/\\/+$/, \"\");\n const cleanLocation = location.replace(/^\\/+/, \"\");\n\n // Avoid double-prefixing\n if (cleanLocation.startsWith(cleanPrefix + \"/\") || cleanLocation === cleanPrefix) {\n return cleanLocation;\n }\n\n return `${cleanPrefix}/${cleanLocation}`;\n }\n\n /**\n * Normalize storage path (remove double slashes, sanitize)\n * @internal\n */\n protected normalizePath(path: string): string {\n return path\n .replace(/\\/+/g, \"/\") // Remove multiple slashes\n .replace(/^\\//, \"\") // Remove leading slash\n .trim();\n }\n\n /**\n * Execute an operation with retry logic\n *\n * Retries on transient errors with exponential backoff.\n *\n * @param operation - Async operation to execute\n * @param operationName - Name for logging\n * @returns Result of the operation\n * @internal\n */\n protected async withRetry<T>(\n operation: () => Promise<T>,\n operationName: string = \"operation\",\n ): Promise<T> {\n const { maxRetries, initialDelayMs, backoffMultiplier, maxDelayMs } = this.retryConfig;\n\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n try {\n return await operation();\n } catch (error) {\n lastError = error as Error;\n\n // Don't retry on the last attempt\n if (attempt === maxRetries - 1) {\n break;\n }\n\n // Check if error is retryable\n if (!this.isRetryableError(error)) {\n throw error; // Non-retryable error, fail immediately\n }\n\n // Calculate delay with exponential backoff\n const delayMs = Math.min(initialDelayMs * Math.pow(backoffMultiplier, attempt), maxDelayMs);\n\n // Wait before retrying\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n }\n\n throw new Error(`${operationName} failed after ${maxRetries} attempts: ${lastError?.message}`);\n }\n\n /**\n * Check if an error is retryable\n *\n * Retries on:\n * - Network errors\n * - 5xx server errors\n * - Rate limiting (429)\n * - Timeout errors\n *\n * Does NOT retry on:\n * - 4xx client errors (except 429)\n * - Authentication errors\n * - Not found errors\n *\n * @param error - Error to check\n * @returns true if error is retryable\n * @internal\n */\n protected isRetryableError(error: any): boolean {\n // Network errors\n if (error.code === \"ECONNRESET\" || error.code === \"ETIMEDOUT\" || error.code === \"ENOTFOUND\") {\n return true;\n }\n\n // S3 SDK errors\n if (error.name === \"NetworkingError\" || error.name === \"TimeoutError\") {\n return true;\n }\n\n // HTTP status codes\n const statusCode = error.$metadata?.httpStatusCode || error.statusCode;\n if (statusCode) {\n // 5xx server errors are retryable\n if (statusCode >= 500 && statusCode < 600) {\n return true;\n }\n\n // 429 Too Many Requests is retryable\n if (statusCode === 429) {\n return true;\n }\n }\n\n return false;\n }\n\n // ============================================================\n // Core File Operations\n // ============================================================\n\n /**\n * Put file to cloud storage\n */\n public async put(\n file: Buffer,\n location: string,\n options?: PutOptions,\n ): Promise<CloudStorageFileData> {\n return this.withRetry(async () => {\n const { PutObjectCommand } = S3Client;\n\n // Apply storage prefix\n location = this.applyPrefix(location);\n\n const hash = this.calculateHash(file);\n const mimeType = options?.mimeType || this.guessMimeType(location);\n\n const command = new PutObjectCommand({\n Bucket: this.options.bucket,\n Key: location,\n Body: file,\n ContentType: mimeType,\n CacheControl: options?.cacheControl,\n ContentDisposition: options?.contentDisposition,\n Metadata: options?.metadata,\n ACL: options?.visibility === \"public\" ? \"public-read\" : undefined,\n });\n\n const result = await this.client.send(command);\n\n return {\n path: location,\n url: this.url(location),\n size: file.length,\n hash,\n mimeType,\n driver: this.name,\n bucket: this.options.bucket!,\n region: this.options.region!,\n etag: result.ETag,\n versionId: result.VersionId,\n };\n }, \"put\");\n }\n\n /**\n * Put file from a readable stream (for large files)\n * Uses S3 multipart upload for efficient streaming\n */\n public async putStream(\n stream: Readable,\n location: string,\n options?: PutOptions,\n ): Promise<CloudStorageFileData> {\n return this.withRetry(async () => {\n const { Upload } = S3Storage;\n\n // Apply storage prefix\n location = this.applyPrefix(location);\n\n const mimeType = options?.mimeType || this.guessMimeType(location);\n\n const upload = new Upload({\n client: this.client,\n params: {\n Bucket: this.options.bucket,\n Key: location,\n Body: stream,\n ContentType: mimeType,\n CacheControl: options?.cacheControl,\n ContentDisposition: options?.contentDisposition,\n Metadata: options?.metadata,\n ACL: options?.visibility === \"public\" ? \"public-read\" : undefined,\n },\n });\n\n const result = await upload.done();\n\n // Get file info for size and hash\n const info = await this.metadata(location);\n\n return {\n path: location,\n url: this.url(location),\n size: info.size,\n hash: info.etag?.replace(/\"/g, \"\") || \"\",\n mimeType,\n driver: this.name,\n bucket: this.options.bucket!,\n region: this.options.region!,\n etag: result.ETag,\n versionId: result.VersionId,\n };\n }, \"putStream\");\n }\n\n /**\n * Get file contents as Buffer\n */\n public async get(location: string): Promise<Buffer> {\n return this.withRetry(async () => {\n const { GetObjectCommand } = S3Client;\n\n // Apply storage prefix\n location = this.applyPrefix(location);\n\n const command = new GetObjectCommand({\n Bucket: this.options.bucket,\n Key: location,\n });\n\n const result = await this.client.send(command);\n\n if (!result.Body) {\n throw new Error(`File not found: ${location}`);\n }\n\n return Buffer.from(await result.Body.transformToByteArray());\n }, \"get\");\n }\n\n /**\n * Get file as a readable stream (for large files)\n */\n public async getStream(location: string): Promise<Readable> {\n return this.withRetry(async () => {\n const { GetObjectCommand } = S3Client;\n\n // Apply storage prefix\n location = this.applyPrefix(location);\n\n const command = new GetObjectCommand({\n Bucket: this.options.bucket,\n Key: location,\n });\n\n const result = await this.client.send(command);\n\n if (!result.Body) {\n throw new Error(`File not found: ${location}`);\n }\n\n return result.Body as Readable;\n }, \"getStream\");\n }\n\n /**\n * Delete a file\n */\n public async delete(location: string): Promise<boolean> {\n return this.withRetry(async () => {\n const { DeleteObjectCommand } = S3Client;\n\n // Apply storage prefix\n location = this.applyPrefix(location);\n\n const command = new DeleteObjectCommand({\n Bucket: this.options.bucket,\n Key: location,\n });\n\n await this.client.send(command);\n\n return true;\n }, \"delete\");\n }\n\n /**\n * Delete multiple files at once (uses batch delete for efficiency)\n */\n public async deleteMany(locations: string[]): Promise<DeleteManyResult[]> {\n if (locations.length === 0) {\n return [];\n }\n\n return this.withRetry(async () => {\n const { DeleteObjectsCommand } = S3Client;\n\n // Apply storage prefix to all locations\n const prefixedLocations = locations.map((loc) => this.applyPrefix(loc));\n\n const command = new DeleteObjectsCommand({\n Bucket: this.options.bucket,\n Delete: {\n Objects: prefixedLocations.map((Key) => ({ Key })),\n Quiet: false,\n },\n });\n\n const result = await this.client.send(command);\n const results: DeleteManyResult[] = [];\n\n // Process successful deletes\n for (const deleted of result.Deleted || []) {\n if (deleted.Key) {\n results.push({ location: deleted.Key, deleted: true });\n }\n }\n\n // Process errors\n for (const error of result.Errors || []) {\n if (error.Key) {\n results.push({\n location: error.Key,\n deleted: false,\n error: error.Message || \"Unknown error\",\n });\n }\n }\n\n return results;\n }, \"deleteMany\");\n }\n\n /**\n * Delete directory (recursively deletes all objects with matching prefix)\n *\n * S3/R2 doesn't have true directories - only key prefixes.\n * This method lists all objects with the prefix and deletes them in batches.\n *\n * @param directoryPath - Directory prefix to delete\n * @returns true when all objects are deleted\n */\n public async deleteDirectory(directoryPath: string): Promise<boolean> {\n // Apply storage prefix\n directoryPath = this.applyPrefix(directoryPath);\n\n // Ensure directory path ends with / for proper prefix matching\n const prefix = directoryPath.endsWith(\"/\") ? directoryPath : `${directoryPath}/`;\n\n let hasMore = true;\n\n while (hasMore) {\n // List up to 1000 objects (S3/R2 max per request)\n const objects = await this.list(prefix, {\n limit: 1000,\n recursive: true,\n });\n\n if (objects.length === 0) {\n break;\n }\n\n // Filter out directories (we only delete files)\n const filePaths = objects.filter((obj) => !obj.isDirectory).map((obj) => obj.path);\n\n if (filePaths.length === 0) {\n break;\n }\n\n // Delete batch (deleteMany already has prefix applied, so paths already have it)\n // Note: We pass the paths as-is since they already include the prefix from list()\n const results = await this.deleteMany(filePaths);\n\n // Continue if we got full batch (might be more)\n hasMore = objects.length >= 1000;\n }\n\n return true;\n }\n\n /**\n * Check if file exists\n */\n public async exists(location: string): Promise<boolean> {\n // No retry for exists - it should be fast and failure means non-existent\n try {\n const { HeadObjectCommand } = S3Client;\n\n // Apply storage prefix\n location = this.applyPrefix(location);\n\n const command = new HeadObjectCommand({\n Bucket: this.options.bucket,\n Key: location,\n });\n\n await this.client.send(command);\n return true;\n } catch {\n return false;\n }\n }\n\n // ============================================================\n // URL Operations\n // ============================================================\n\n /**\n * Get a temporary presigned URL (alias for getPresignedUrl)\n */\n public async temporaryUrl(location: string, expiresIn = 3600): Promise<string> {\n return this.getPresignedUrl(location, { expiresIn });\n }\n\n /**\n * Get presigned URL for downloading\n */\n public async getPresignedUrl(location: string, options?: PresignedOptions): Promise<string> {\n return this.withRetry(async () => {\n const { GetObjectCommand } = S3Client;\n const { getSignedUrl } = S3Presigner;\n\n // Apply storage prefix\n location = this.applyPrefix(location);\n\n const command = new GetObjectCommand({\n Bucket: this.options.bucket,\n Key: location,\n });\n\n return getSignedUrl(this.client, command, {\n expiresIn: options?.expiresIn || 3600,\n });\n }, \"getPresignedUrl\");\n }\n\n /**\n * Get presigned URL for uploading\n */\n public async getPresignedUploadUrl(\n location: string,\n options?: PresignedUploadOptions,\n ): Promise<string> {\n return this.withRetry(async () => {\n const { PutObjectCommand } = S3Client;\n const { getSignedUrl } = S3Presigner;\n\n // Apply storage prefix\n location = this.applyPrefix(location);\n\n const command = new PutObjectCommand({\n Bucket: this.options.bucket,\n Key: location,\n ContentType: options?.contentType,\n Metadata: options?.metadata,\n });\n\n return getSignedUrl(this.client, command, {\n expiresIn: options?.expiresIn || 3600,\n });\n }, \"getPresignedUploadUrl\");\n }\n\n // ============================================================\n // Metadata Operations\n // ============================================================\n\n /**\n * Get file info/metadata without downloading\n */\n public async metadata(location: string): Promise<StorageFileInfo> {\n return this.withRetry(async () => {\n const { HeadObjectCommand } = S3Client;\n\n // Apply storage prefix\n location = this.applyPrefix(location);\n\n const command = new HeadObjectCommand({\n Bucket: this.options.bucket,\n Key: location,\n });\n\n const result = await this.client.send(command);\n const name = location.split(\"/\").pop() || \"\";\n\n return {\n path: location,\n name,\n size: result.ContentLength || 0,\n isDirectory: false,\n lastModified: result.LastModified,\n mimeType: result.ContentType || this.guessMimeType(location),\n etag: result.ETag,\n storageClass: result.StorageClass,\n };\n }, \"metadata\");\n }\n\n /**\n * Get file size in bytes (shortcut for metadata().size)\n */\n public async size(location: string): Promise<number> {\n const info = await this.metadata(location);\n return info.size;\n }\n\n // ============================================================\n // File Operations\n // ============================================================\n\n /**\n * Copy file to a new location\n */\n public async copy(from: string, to: string): Promise<CloudStorageFileData> {\n return this.withRetry(async () => {\n const { CopyObjectCommand, HeadObjectCommand } = S3Client;\n\n // Apply storage prefix to both paths\n from = this.applyPrefix(from);\n to = this.applyPrefix(to);\n\n const command = new CopyObjectCommand({\n Bucket: this.options.bucket,\n CopySource: `${this.options.bucket}/${from}`,\n Key: to,\n });\n\n const result = await this.client.send(command);\n\n // Get file metadata\n const headCommand = new HeadObjectCommand({\n Bucket: this.options.bucket,\n Key: to,\n });\n const headResult = await this.client.send(headCommand);\n\n return {\n path: to,\n url: this.url(to),\n size: headResult.ContentLength || 0,\n hash: headResult.ETag?.replace(/\"/g, \"\") || \"\",\n mimeType: headResult.ContentType || this.guessMimeType(to),\n driver: this.name,\n bucket: this.options.bucket!,\n region: this.options.region!,\n etag: result.CopyObjectResult?.ETag,\n versionId: result.VersionId,\n };\n }, \"copy\");\n }\n\n /**\n * Move file to a new location\n */\n public async move(from: string, to: string): Promise<CloudStorageFileData> {\n const file = await this.copy(from, to);\n await this.delete(from);\n return file;\n }\n\n /**\n * List files in a directory\n */\n public async list(directory: string, options?: ListOptions): Promise<StorageFileInfo[]> {\n return this.withRetry(async () => {\n const { ListObjectsV2Command } = S3Client;\n\n // Apply storage prefix\n directory = this.applyPrefix(directory);\n\n const command = new ListObjectsV2Command({\n Bucket: this.options.bucket,\n Prefix: directory,\n MaxKeys: options?.limit,\n ContinuationToken: options?.cursor,\n Delimiter: options?.recursive ? undefined : \"/\",\n });\n\n const result = await this.client.send(command);\n const files: StorageFileInfo[] = [];\n\n // Add files\n for (const object of result.Contents || []) {\n if (!object.Key) continue;\n\n files.push({\n path: object.Key,\n name: object.Key.split(\"/\").pop() || \"\",\n size: object.Size || 0,\n isDirectory: false,\n lastModified: object.LastModified,\n etag: object.ETag,\n storageClass: object.StorageClass,\n });\n }\n\n // Add directories\n for (const prefix of result.CommonPrefixes || []) {\n if (!prefix.Prefix) continue;\n\n files.push({\n path: prefix.Prefix,\n name: prefix.Prefix.split(\"/\").filter(Boolean).pop() || \"\",\n size: 0,\n isDirectory: true,\n });\n }\n\n return files;\n }, \"list\");\n }\n\n // ============================================================\n // Cloud-Specific Operations\n // ============================================================\n\n /**\n * Get bucket name\n */\n public getBucket(): string {\n return this.options.bucket!;\n }\n\n /**\n * Get region\n */\n public getRegion(): string {\n return this.options.region!;\n }\n\n /**\n * Set storage class (e.g., STANDARD, GLACIER, etc.)\n */\n public async setStorageClass(location: string, storageClass: string): Promise<void> {\n return this.withRetry(async () => {\n const { CopyObjectCommand } = S3Client;\n\n // Apply storage prefix\n location = this.applyPrefix(location);\n\n const command = new CopyObjectCommand({\n Bucket: this.options.bucket,\n CopySource: `${this.options.bucket}/${location}`,\n Key: location,\n StorageClass: storageClass as any,\n MetadataDirective: \"COPY\",\n });\n\n await this.client.send(command);\n }, \"setStorageClass\");\n }\n\n /**\n * Set file visibility (public or private)\n */\n public async setVisibility(location: string, visibility: FileVisibility): Promise<void> {\n return this.withRetry(async () => {\n const { PutObjectAclCommand } = S3Client;\n\n // Apply storage prefix\n location = this.applyPrefix(location);\n\n const command = new PutObjectAclCommand({\n Bucket: this.options.bucket,\n Key: location,\n ACL: visibility === \"public\" ? \"public-read\" : \"private\",\n });\n\n await this.client.send(command);\n }, \"setVisibility\");\n }\n\n /**\n * Get file visibility\n */\n public async getVisibility(location: string): Promise<FileVisibility> {\n return this.withRetry(async () => {\n const { GetObjectAclCommand } = S3Client;\n\n // Apply storage prefix\n location = this.applyPrefix(location);\n\n const command = new GetObjectAclCommand({\n Bucket: this.options.bucket,\n Key: location,\n });\n\n const result = await this.client.send(command);\n\n // Check if any grant allows public read\n const hasPublicRead = result.Grants?.some(\n (grant) =>\n grant.Grantee?.URI === \"http://acs.amazonaws.com/groups/global/AllUsers\" &&\n grant.Permission === \"READ\",\n );\n\n return hasPublicRead ? \"public\" : \"private\";\n }, \"getVisibility\");\n }\n\n // ============================================================\n // Utilities\n // ============================================================\n\n /**\n * Calculate SHA-256 hash\n */\n protected calculateHash(buffer: Buffer): string {\n return crypto.createHash(\"sha256\").update(new Uint8Array(buffer)).digest(\"hex\");\n }\n\n /**\n * Guess MIME type from file extension\n */\n protected guessMimeType(location: string): string {\n return getMimeType(location);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"cloud-driver.mjs","names":[],"sources":["../../../../../../../../@warlock.js/core/src/storage/drivers/cloud-driver.ts"],"sourcesContent":["import crypto from \"crypto\";\nimport type { Readable } from \"stream\";\nimport { storageDriverContext } from \"../context/storage-driver-context\";\nimport type {\n CloudStorageDriverContract,\n CloudStorageDriverOptions,\n CloudStorageFileData,\n DeleteManyResult,\n FileVisibility,\n ListOptions,\n PresignedOptions,\n PresignedUploadOptions,\n PutOptions,\n StorageDriverType,\n StorageFileInfo,\n} from \"../types\";\nimport { getMimeType } from \"../utils/mime\";\n\n// ============================================================\n// Lazy-loaded S3 SDK Types\n// ============================================================\n\n/**\n * Cached S3 SDK modules (loaded once, reused)\n */\nlet S3Client: typeof import(\"@aws-sdk/client-s3\");\nlet S3Storage: typeof import(\"@aws-sdk/lib-storage\");\nlet S3Presigner: typeof import(\"@aws-sdk/s3-request-presigner\");\n\nlet isModuleExists: boolean | null = null;\n\n/**\n * Installation instructions for S3 SDK packages\n */\nconst S3_INSTALL_INSTRUCTIONS = `\nCloud storage requires the AWS S3 SDK packages.\nInstall them with:\n\n npm install @aws-sdk/client-s3 @aws-sdk/lib-storage @aws-sdk/s3-request-presigner\n\nOr with your preferred package manager:\n\n pnpm add @aws-sdk/client-s3 @aws-sdk/lib-storage @aws-sdk/s3-request-presigner\n yarn add @aws-sdk/client-s3 @aws-sdk/lib-storage @aws-sdk/s3-request-presigner\n`.trim();\n\n/**\n * Atomic initialization promise to handle concurrent calls to loadS3\n */\nlet initializationPromise: Promise<void> | null = null;\n\n/**\n * Load S3 modules lazily\n *\n * @example\n * await loadS3();\n * if (isModuleExists) {\n * // Safe to use S3Client, S3Storage, S3Presigner\n * }\n */\nexport async function loadS3(): Promise<void> {\n // If already successfully loaded, no need to do anything\n if (isModuleExists === true) return;\n\n // If currently loading, return the existing promise so the caller waits\n if (initializationPromise) return initializationPromise;\n\n initializationPromise = (async () => {\n try {\n // Use Promise.all to load modules in parallel for efficiency\n const [client, storage, presigner] = await Promise.all([\n import(\"@aws-sdk/client-s3\"),\n import(\"@aws-sdk/lib-storage\"),\n import(\"@aws-sdk/s3-request-presigner\"),\n ]);\n\n S3Client = client;\n S3Storage = storage;\n S3Presigner = presigner;\n\n isModuleExists = true;\n } catch {\n // Mark as failed if any import fails (usually means packages aren't installed)\n isModuleExists = false;\n }\n })();\n\n return initializationPromise;\n}\n\nloadS3();\n\n// ============================================================\n// CloudDriver Base Class\n// ============================================================\n\n/**\n * Base abstract class for all S3-compatible cloud storage drivers\n *\n * This class contains all shared logic for S3-compatible storage services\n * including AWS S3, Cloudflare R2, DigitalOcean Spaces, and others.\n *\n * **Important:** S3 SDK packages are lazy-loaded on first use.\n * Users must install them separately:\n * ```\n * npm install @aws-sdk/client-s3 @aws-sdk/lib-storage @aws-sdk/s3-request-presigner\n * ```\n *\n * Subclasses must implement:\n * - `name`: Driver identifier (e.g., \"s3\", \"r2\", \"spaces\")\n * - `url()`: Returns the public URL for a file (provider-specific format)\n */\nexport abstract class CloudDriver<\n TOptions extends Partial<CloudStorageDriverOptions> = CloudStorageDriverOptions,\n> implements CloudStorageDriverContract {\n /**\n * S3-compatible client (lazy-loaded)\n */\n protected client!: InstanceType<typeof import(\"@aws-sdk/client-s3\").S3Client>;\n\n /**\n * Retry configuration\n */\n protected retryConfig: {\n maxRetries: number;\n initialDelayMs: number;\n maxDelayMs: number;\n backoffMultiplier: number;\n };\n\n public constructor(public options: TOptions) {\n if (!isModuleExists) {\n throw new Error(S3_INSTALL_INSTRUCTIONS);\n }\n\n this.client = new S3Client.S3Client({\n region: this.options.region!,\n credentials: {\n accessKeyId: this.options.accessKeyId!,\n secretAccessKey: this.options.secretAccessKey!,\n },\n ...(this.getEndpoint() && { endpoint: this.getEndpoint() }),\n });\n\n // Initialize retry configuration\n this.retryConfig = {\n maxRetries: this.options.retry?.maxRetries ?? 3,\n initialDelayMs: this.options.retry?.initialDelayMs ?? 1000,\n maxDelayMs: this.options.retry?.maxDelayMs ?? 10000,\n backoffMultiplier: this.options.retry?.backoffMultiplier ?? 2,\n };\n }\n\n /**\n * Driver name identifier\n */\n public abstract readonly name: StorageDriverType;\n\n /**\n * Get public URL for file\n * Must be implemented by subclasses with provider-specific format\n */\n public abstract url(location: string): string;\n\n /**\n * Get endpoint URL\n * Can be overridden by subclasses for provider-specific endpoints\n */\n protected getEndpoint(): string | undefined {\n return this.options.endpoint;\n }\n\n // ============================================================\n // Helper Methods\n // ============================================================\n\n /**\n * Apply prefix to location path\n *\n * Priority: context prefix > driver options prefix > no prefix\n * This allows multi-tenant scenarios where context overrides driver config.\n *\n * @param location - Original location path\n * @returns Location with prefix applied if one exists\n */\n public applyPrefix(location: string): string {\n // Check context prefix first (highest priority)\n const contextPrefix = storageDriverContext.getPrefix();\n const prefix = contextPrefix || this.options.prefix;\n\n if (!prefix) {\n return location;\n }\n\n const cleanPrefix = prefix.replace(/\\/+$/, \"\");\n const cleanLocation = location.replace(/^\\/+/, \"\");\n\n // Avoid double-prefixing\n if (cleanLocation.startsWith(cleanPrefix + \"/\") || cleanLocation === cleanPrefix) {\n return cleanLocation;\n }\n\n return `${cleanPrefix}/${cleanLocation}`;\n }\n\n /**\n * Normalize storage path (remove double slashes, sanitize)\n * @internal\n */\n protected normalizePath(path: string): string {\n return path\n .replace(/\\/+/g, \"/\") // Remove multiple slashes\n .replace(/^\\//, \"\") // Remove leading slash\n .trim();\n }\n\n /**\n * Execute an operation with retry logic\n *\n * Retries on transient errors with exponential backoff.\n *\n * @param operation - Async operation to execute\n * @param operationName - Name for logging\n * @returns Result of the operation\n * @internal\n */\n protected async withRetry<T>(\n operation: () => Promise<T>,\n operationName: string = \"operation\",\n ): Promise<T> {\n const { maxRetries, initialDelayMs, backoffMultiplier, maxDelayMs } = this.retryConfig;\n\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n try {\n return await operation();\n } catch (error) {\n lastError = error as Error;\n\n // Don't retry on the last attempt\n if (attempt === maxRetries - 1) {\n break;\n }\n\n // Check if error is retryable\n if (!this.isRetryableError(error)) {\n throw error; // Non-retryable error, fail immediately\n }\n\n // Calculate delay with exponential backoff\n const delayMs = Math.min(initialDelayMs * Math.pow(backoffMultiplier, attempt), maxDelayMs);\n\n // Wait before retrying\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n }\n\n throw new Error(`${operationName} failed after ${maxRetries} attempts: ${lastError?.message}`);\n }\n\n /**\n * Check if an error is retryable\n *\n * Retries on:\n * - Network errors\n * - 5xx server errors\n * - Rate limiting (429)\n * - Timeout errors\n *\n * Does NOT retry on:\n * - 4xx client errors (except 429)\n * - Authentication errors\n * - Not found errors\n *\n * @param error - Error to check\n * @returns true if error is retryable\n * @internal\n */\n protected isRetryableError(error: any): boolean {\n // Network errors\n if (error.code === \"ECONNRESET\" || error.code === \"ETIMEDOUT\" || error.code === \"ENOTFOUND\") {\n return true;\n }\n\n // S3 SDK errors\n if (error.name === \"NetworkingError\" || error.name === \"TimeoutError\") {\n return true;\n }\n\n // HTTP status codes\n const statusCode = error.$metadata?.httpStatusCode || error.statusCode;\n if (statusCode) {\n // 5xx server errors are retryable\n if (statusCode >= 500 && statusCode < 600) {\n return true;\n }\n\n // 429 Too Many Requests is retryable\n if (statusCode === 429) {\n return true;\n }\n }\n\n return false;\n }\n\n // ============================================================\n // Core File Operations\n // ============================================================\n\n /**\n * Put file to cloud storage\n */\n public async put(\n file: Buffer,\n location: string,\n options?: PutOptions,\n ): Promise<CloudStorageFileData> {\n return this.withRetry(async () => {\n const { PutObjectCommand } = S3Client;\n\n // Apply storage prefix\n location = this.applyPrefix(location);\n\n const hash = this.calculateHash(file);\n const mimeType = options?.mimeType || this.guessMimeType(location);\n\n const command = new PutObjectCommand({\n Bucket: this.options.bucket,\n Key: location,\n Body: file,\n ContentType: mimeType,\n CacheControl: options?.cacheControl,\n ContentDisposition: options?.contentDisposition,\n Metadata: options?.metadata,\n ACL: options?.visibility === \"public\" ? \"public-read\" : undefined,\n });\n\n const result = await this.client.send(command);\n\n return {\n path: location,\n url: this.url(location),\n size: file.length,\n hash,\n mimeType,\n driver: this.name,\n bucket: this.options.bucket!,\n region: this.options.region!,\n etag: result.ETag,\n versionId: result.VersionId,\n };\n }, \"put\");\n }\n\n /**\n * Put file from a readable stream (for large files)\n * Uses S3 multipart upload for efficient streaming\n */\n public async putStream(\n stream: Readable,\n location: string,\n options?: PutOptions,\n ): Promise<CloudStorageFileData> {\n return this.withRetry(async () => {\n const { Upload } = S3Storage;\n\n // Apply storage prefix\n location = this.applyPrefix(location);\n\n const mimeType = options?.mimeType || this.guessMimeType(location);\n\n const upload = new Upload({\n client: this.client,\n params: {\n Bucket: this.options.bucket,\n Key: location,\n Body: stream,\n ContentType: mimeType,\n CacheControl: options?.cacheControl,\n ContentDisposition: options?.contentDisposition,\n Metadata: options?.metadata,\n ACL: options?.visibility === \"public\" ? \"public-read\" : undefined,\n },\n });\n\n const result = await upload.done();\n\n // Get file info for size and hash\n const info = await this.metadata(location);\n\n return {\n path: location,\n url: this.url(location),\n size: info.size,\n hash: info.etag?.replace(/\"/g, \"\") || \"\",\n mimeType,\n driver: this.name,\n bucket: this.options.bucket!,\n region: this.options.region!,\n etag: result.ETag,\n versionId: result.VersionId,\n };\n }, \"putStream\");\n }\n\n /**\n * Get file contents as Buffer\n */\n public async get(location: string): Promise<Buffer> {\n return this.withRetry(async () => {\n const { GetObjectCommand } = S3Client;\n\n // Apply storage prefix\n location = this.applyPrefix(location);\n\n const command = new GetObjectCommand({\n Bucket: this.options.bucket,\n Key: location,\n });\n\n const result = await this.client.send(command);\n\n if (!result.Body) {\n throw new Error(`File not found: ${location}`);\n }\n\n return Buffer.from(await result.Body.transformToByteArray());\n }, \"get\");\n }\n\n /**\n * Get file as a readable stream (for large files)\n */\n public async getStream(location: string): Promise<Readable> {\n return this.withRetry(async () => {\n const { GetObjectCommand } = S3Client;\n\n // Apply storage prefix\n location = this.applyPrefix(location);\n\n const command = new GetObjectCommand({\n Bucket: this.options.bucket,\n Key: location,\n });\n\n const result = await this.client.send(command);\n\n if (!result.Body) {\n throw new Error(`File not found: ${location}`);\n }\n\n return result.Body as Readable;\n }, \"getStream\");\n }\n\n /**\n * Delete a file\n */\n public async delete(location: string): Promise<boolean> {\n return this.withRetry(async () => {\n const { DeleteObjectCommand } = S3Client;\n\n // Apply storage prefix\n location = this.applyPrefix(location);\n\n const command = new DeleteObjectCommand({\n Bucket: this.options.bucket,\n Key: location,\n });\n\n await this.client.send(command);\n\n return true;\n }, \"delete\");\n }\n\n /**\n * Delete multiple files at once (uses batch delete for efficiency)\n */\n public async deleteMany(locations: string[]): Promise<DeleteManyResult[]> {\n if (locations.length === 0) {\n return [];\n }\n\n return this.withRetry(async () => {\n const { DeleteObjectsCommand } = S3Client;\n\n // Apply storage prefix to all locations\n const prefixedLocations = locations.map((loc) => this.applyPrefix(loc));\n\n const command = new DeleteObjectsCommand({\n Bucket: this.options.bucket,\n Delete: {\n Objects: prefixedLocations.map((Key) => ({ Key })),\n Quiet: false,\n },\n });\n\n const result = await this.client.send(command);\n const results: DeleteManyResult[] = [];\n\n // Process successful deletes\n for (const deleted of result.Deleted || []) {\n if (deleted.Key) {\n results.push({ location: deleted.Key, deleted: true });\n }\n }\n\n // Process errors\n for (const error of result.Errors || []) {\n if (error.Key) {\n results.push({\n location: error.Key,\n deleted: false,\n error: error.Message || \"Unknown error\",\n });\n }\n }\n\n return results;\n }, \"deleteMany\");\n }\n\n /**\n * Delete directory (recursively deletes all objects with matching prefix)\n *\n * S3/R2 doesn't have true directories - only key prefixes.\n * This method lists all objects with the prefix and deletes them in batches.\n *\n * @param directoryPath - Directory prefix to delete\n * @returns true when all objects are deleted\n */\n public async deleteDirectory(directoryPath: string): Promise<boolean> {\n // Apply storage prefix\n directoryPath = this.applyPrefix(directoryPath);\n\n // Ensure directory path ends with / for proper prefix matching\n const prefix = directoryPath.endsWith(\"/\") ? directoryPath : `${directoryPath}/`;\n\n let hasMore = true;\n\n while (hasMore) {\n // List up to 1000 objects (S3/R2 max per request)\n const objects = await this.list(prefix, {\n limit: 1000,\n recursive: true,\n });\n\n if (objects.length === 0) {\n break;\n }\n\n // Filter out directories (we only delete files)\n const filePaths = objects.filter((obj) => !obj.isDirectory).map((obj) => obj.path);\n\n if (filePaths.length === 0) {\n break;\n }\n\n // Delete batch (deleteMany already has prefix applied, so paths already have it)\n // Note: We pass the paths as-is since they already include the prefix from list()\n const results = await this.deleteMany(filePaths);\n\n // Continue if we got full batch (might be more)\n hasMore = objects.length >= 1000;\n }\n\n return true;\n }\n\n /**\n * Check if file exists\n */\n public async exists(location: string): Promise<boolean> {\n // No retry for exists - it should be fast and failure means non-existent\n try {\n const { HeadObjectCommand } = S3Client;\n\n // Apply storage prefix\n location = this.applyPrefix(location);\n\n const command = new HeadObjectCommand({\n Bucket: this.options.bucket,\n Key: location,\n });\n\n await this.client.send(command);\n return true;\n } catch {\n return false;\n }\n }\n\n // ============================================================\n // URL Operations\n // ============================================================\n\n /**\n * Get a temporary presigned URL (alias for getPresignedUrl)\n */\n public async temporaryUrl(location: string, expiresIn = 3600): Promise<string> {\n return this.getPresignedUrl(location, { expiresIn });\n }\n\n /**\n * Get presigned URL for downloading\n */\n public async getPresignedUrl(location: string, options?: PresignedOptions): Promise<string> {\n return this.withRetry(async () => {\n const { GetObjectCommand } = S3Client;\n const { getSignedUrl } = S3Presigner;\n\n // Apply storage prefix\n location = this.applyPrefix(location);\n\n const command = new GetObjectCommand({\n Bucket: this.options.bucket,\n Key: location,\n });\n\n return getSignedUrl(this.client, command, {\n expiresIn: options?.expiresIn || 3600,\n });\n }, \"getPresignedUrl\");\n }\n\n /**\n * Get presigned URL for uploading\n */\n public async getPresignedUploadUrl(\n location: string,\n options?: PresignedUploadOptions,\n ): Promise<string> {\n return this.withRetry(async () => {\n const { PutObjectCommand } = S3Client;\n const { getSignedUrl } = S3Presigner;\n\n // Apply storage prefix\n location = this.applyPrefix(location);\n\n const command = new PutObjectCommand({\n Bucket: this.options.bucket,\n Key: location,\n ContentType: options?.contentType,\n Metadata: options?.metadata,\n });\n\n return getSignedUrl(this.client, command, {\n expiresIn: options?.expiresIn || 3600,\n });\n }, \"getPresignedUploadUrl\");\n }\n\n // ============================================================\n // Metadata Operations\n // ============================================================\n\n /**\n * Get file info/metadata without downloading\n */\n public async metadata(location: string): Promise<StorageFileInfo> {\n return this.withRetry(async () => {\n const { HeadObjectCommand } = S3Client;\n\n // Apply storage prefix\n location = this.applyPrefix(location);\n\n const command = new HeadObjectCommand({\n Bucket: this.options.bucket,\n Key: location,\n });\n\n const result = await this.client.send(command);\n const name = location.split(\"/\").pop() || \"\";\n\n return {\n path: location,\n name,\n size: result.ContentLength || 0,\n isDirectory: false,\n lastModified: result.LastModified,\n mimeType: result.ContentType || this.guessMimeType(location),\n etag: result.ETag,\n storageClass: result.StorageClass,\n };\n }, \"metadata\");\n }\n\n /**\n * Get file size in bytes (shortcut for metadata().size)\n */\n public async size(location: string): Promise<number> {\n const info = await this.metadata(location);\n return info.size;\n }\n\n // ============================================================\n // File Operations\n // ============================================================\n\n /**\n * Copy file to a new location\n */\n public async copy(from: string, to: string): Promise<CloudStorageFileData> {\n return this.withRetry(async () => {\n const { CopyObjectCommand, HeadObjectCommand } = S3Client;\n\n // Apply storage prefix to both paths\n from = this.applyPrefix(from);\n to = this.applyPrefix(to);\n\n const command = new CopyObjectCommand({\n Bucket: this.options.bucket,\n CopySource: `${this.options.bucket}/${from}`,\n Key: to,\n });\n\n const result = await this.client.send(command);\n\n // Get file metadata\n const headCommand = new HeadObjectCommand({\n Bucket: this.options.bucket,\n Key: to,\n });\n const headResult = await this.client.send(headCommand);\n\n return {\n path: to,\n url: this.url(to),\n size: headResult.ContentLength || 0,\n hash: headResult.ETag?.replace(/\"/g, \"\") || \"\",\n mimeType: headResult.ContentType || this.guessMimeType(to),\n driver: this.name,\n bucket: this.options.bucket!,\n region: this.options.region!,\n etag: result.CopyObjectResult?.ETag,\n versionId: result.VersionId,\n };\n }, \"copy\");\n }\n\n /**\n * Move file to a new location\n */\n public async move(from: string, to: string): Promise<CloudStorageFileData> {\n const file = await this.copy(from, to);\n await this.delete(from);\n return file;\n }\n\n /**\n * List files in a directory\n */\n public async list(directory: string, options?: ListOptions): Promise<StorageFileInfo[]> {\n return this.withRetry(async () => {\n const { ListObjectsV2Command } = S3Client;\n\n // Apply storage prefix\n directory = this.applyPrefix(directory);\n\n const command = new ListObjectsV2Command({\n Bucket: this.options.bucket,\n Prefix: directory,\n MaxKeys: options?.limit,\n ContinuationToken: options?.cursor,\n Delimiter: options?.recursive ? undefined : \"/\",\n });\n\n const result = await this.client.send(command);\n const files: StorageFileInfo[] = [];\n\n // Add files\n for (const object of result.Contents || []) {\n if (!object.Key) continue;\n\n files.push({\n path: object.Key,\n name: object.Key.split(\"/\").pop() || \"\",\n size: object.Size || 0,\n isDirectory: false,\n lastModified: object.LastModified,\n etag: object.ETag,\n storageClass: object.StorageClass,\n });\n }\n\n // Add directories\n for (const prefix of result.CommonPrefixes || []) {\n if (!prefix.Prefix) continue;\n\n files.push({\n path: prefix.Prefix,\n name: prefix.Prefix.split(\"/\").filter(Boolean).pop() || \"\",\n size: 0,\n isDirectory: true,\n });\n }\n\n return files;\n }, \"list\");\n }\n\n // ============================================================\n // Cloud-Specific Operations\n // ============================================================\n\n /**\n * Get bucket name\n */\n public getBucket(): string {\n return this.options.bucket!;\n }\n\n /**\n * Get region\n */\n public getRegion(): string {\n return this.options.region!;\n }\n\n /**\n * Set storage class (e.g., STANDARD, GLACIER, etc.)\n */\n public async setStorageClass(location: string, storageClass: string): Promise<void> {\n return this.withRetry(async () => {\n const { CopyObjectCommand } = S3Client;\n\n // Apply storage prefix\n location = this.applyPrefix(location);\n\n const command = new CopyObjectCommand({\n Bucket: this.options.bucket,\n CopySource: `${this.options.bucket}/${location}`,\n Key: location,\n StorageClass: storageClass as any,\n MetadataDirective: \"COPY\",\n });\n\n await this.client.send(command);\n }, \"setStorageClass\");\n }\n\n /**\n * Set file visibility (public or private)\n */\n public async setVisibility(location: string, visibility: FileVisibility): Promise<void> {\n return this.withRetry(async () => {\n const { PutObjectAclCommand } = S3Client;\n\n // Apply storage prefix\n location = this.applyPrefix(location);\n\n const command = new PutObjectAclCommand({\n Bucket: this.options.bucket,\n Key: location,\n ACL: visibility === \"public\" ? \"public-read\" : \"private\",\n });\n\n await this.client.send(command);\n }, \"setVisibility\");\n }\n\n /**\n * Get file visibility\n */\n public async getVisibility(location: string): Promise<FileVisibility> {\n return this.withRetry(async () => {\n const { GetObjectAclCommand } = S3Client;\n\n // Apply storage prefix\n location = this.applyPrefix(location);\n\n const command = new GetObjectAclCommand({\n Bucket: this.options.bucket,\n Key: location,\n });\n\n const result = await this.client.send(command);\n\n // Check if any grant allows public read\n const hasPublicRead = result.Grants?.some(\n (grant) =>\n grant.Grantee?.URI === \"http://acs.amazonaws.com/groups/global/AllUsers\" &&\n grant.Permission === \"READ\",\n );\n\n return hasPublicRead ? \"public\" : \"private\";\n }, \"getVisibility\");\n }\n\n // ============================================================\n // Utilities\n // ============================================================\n\n /**\n * Calculate SHA-256 hash\n */\n protected calculateHash(buffer: Buffer): string {\n return crypto.createHash(\"sha256\").update(new Uint8Array(buffer)).digest(\"hex\");\n }\n\n /**\n * Guess MIME type from file extension\n */\n protected guessMimeType(location: string): string {\n return getMimeType(location);\n }\n}\n"],"mappings":";;;;;;;;AAyBA,IAAI;AACJ,IAAI;AACJ,IAAI;AAEJ,IAAI,iBAAiC;;;;AAKrC,MAAM,0BAA0B;;;;;;;;;;EAU9B,KAAK;;;;AAKP,IAAI,wBAA8C;;;;;;;;;;AAWlD,eAAsB,SAAwB;CAE5C,IAAI,mBAAmB,MAAM;CAG7B,IAAI,uBAAuB,OAAO;CAElC,yBAAyB,YAAY;EACnC,IAAI;GAEF,MAAM,CAAC,QAAQ,SAAS,aAAa,MAAM,QAAQ,IAAI;IACrD,OAAO;IACP,OAAO;IACP,OAAO;GACT,CAAC;GAED,WAAW;GACX,YAAY;GACZ,cAAc;GAEd,iBAAiB;EACnB,QAAQ;GAEN,iBAAiB;EACnB;CACF,EAAC,CAAE;CAEH,OAAO;AACT;AAEA,OAAO;;;;;;;;;;;;;;;;;AAsBP,IAAsB,cAAtB,MAEwC;CAgBtC,AAAO,YAAY,AAAO,SAAmB;EAAnB;EACxB,IAAI,CAAC,gBACH,MAAM,IAAI,MAAM,uBAAuB;EAGzC,KAAK,SAAS,IAAI,SAAS,SAAS;GAClC,QAAQ,KAAK,QAAQ;GACrB,aAAa;IACX,aAAa,KAAK,QAAQ;IAC1B,iBAAiB,KAAK,QAAQ;GAChC;GACA,GAAI,KAAK,YAAY,KAAK,EAAE,UAAU,KAAK,YAAY,EAAE;EAC3D,CAAC;EAGD,KAAK,cAAc;GACjB,YAAY,KAAK,QAAQ,OAAO,cAAc;GAC9C,gBAAgB,KAAK,QAAQ,OAAO,kBAAkB;GACtD,YAAY,KAAK,QAAQ,OAAO,cAAc;GAC9C,mBAAmB,KAAK,QAAQ,OAAO,qBAAqB;EAC9D;CACF;;;;;CAiBA,AAAU,cAAkC;EAC1C,OAAO,KAAK,QAAQ;CACtB;;;;;;;;;;CAeA,AAAO,YAAY,UAA0B;EAG3C,MAAM,SADgB,qBAAqB,UAChB,KAAK,KAAK,QAAQ;EAE7C,IAAI,CAAC,QACH,OAAO;EAGT,MAAM,cAAc,OAAO,QAAQ,QAAQ,EAAE;EAC7C,MAAM,gBAAgB,SAAS,QAAQ,QAAQ,EAAE;EAGjD,IAAI,cAAc,WAAW,cAAc,GAAG,KAAK,kBAAkB,aACnE,OAAO;EAGT,OAAO,GAAG,YAAY,GAAG;CAC3B;;;;;CAMA,AAAU,cAAc,MAAsB;EAC5C,OAAO,KACJ,QAAQ,QAAQ,GAAG,CAAC,CACpB,QAAQ,OAAO,EAAE,CAAC,CAClB,KAAK;CACV;;;;;;;;;;;CAYA,MAAgB,UACd,WACA,gBAAwB,aACZ;EACZ,MAAM,EAAE,YAAY,gBAAgB,mBAAmB,eAAe,KAAK;EAE3E,IAAI;EAEJ,KAAK,IAAI,UAAU,GAAG,UAAU,YAAY,WAC1C,IAAI;GACF,OAAO,MAAM,UAAU;EACzB,SAAS,OAAO;GACd,YAAY;GAGZ,IAAI,YAAY,aAAa,GAC3B;GAIF,IAAI,CAAC,KAAK,iBAAiB,KAAK,GAC9B,MAAM;GAIR,MAAM,UAAU,KAAK,IAAI,iBAAiB,KAAK,IAAI,mBAAmB,OAAO,GAAG,UAAU;GAG1F,MAAM,IAAI,SAAS,YAAY,WAAW,SAAS,OAAO,CAAC;EAC7D;EAGF,MAAM,IAAI,MAAM,GAAG,cAAc,gBAAgB,WAAW,aAAa,WAAW,SAAS;CAC/F;;;;;;;;;;;;;;;;;;;CAoBA,AAAU,iBAAiB,OAAqB;EAE9C,IAAI,MAAM,SAAS,gBAAgB,MAAM,SAAS,eAAe,MAAM,SAAS,aAC9E,OAAO;EAIT,IAAI,MAAM,SAAS,qBAAqB,MAAM,SAAS,gBACrD,OAAO;EAIT,MAAM,aAAa,MAAM,WAAW,kBAAkB,MAAM;EAC5D,IAAI,YAAY;GAEd,IAAI,cAAc,OAAO,aAAa,KACpC,OAAO;GAIT,IAAI,eAAe,KACjB,OAAO;EAEX;EAEA,OAAO;CACT;;;;CASA,MAAa,IACX,MACA,UACA,SAC+B;EAC/B,OAAO,KAAK,UAAU,YAAY;GAChC,MAAM,EAAE,qBAAqB;GAG7B,WAAW,KAAK,YAAY,QAAQ;GAEpC,MAAM,OAAO,KAAK,cAAc,IAAI;GACpC,MAAM,WAAW,SAAS,YAAY,KAAK,cAAc,QAAQ;GAEjE,MAAM,UAAU,IAAI,iBAAiB;IACnC,QAAQ,KAAK,QAAQ;IACrB,KAAK;IACL,MAAM;IACN,aAAa;IACb,cAAc,SAAS;IACvB,oBAAoB,SAAS;IAC7B,UAAU,SAAS;IACnB,KAAK,SAAS,eAAe,WAAW,gBAAgB;GAC1D,CAAC;GAED,MAAM,SAAS,MAAM,KAAK,OAAO,KAAK,OAAO;GAE7C,OAAO;IACL,MAAM;IACN,KAAK,KAAK,IAAI,QAAQ;IACtB,MAAM,KAAK;IACX;IACA;IACA,QAAQ,KAAK;IACb,QAAQ,KAAK,QAAQ;IACrB,QAAQ,KAAK,QAAQ;IACrB,MAAM,OAAO;IACb,WAAW,OAAO;GACpB;EACF,GAAG,KAAK;CACV;;;;;CAMA,MAAa,UACX,QACA,UACA,SAC+B;EAC/B,OAAO,KAAK,UAAU,YAAY;GAChC,MAAM,EAAE,WAAW;GAGnB,WAAW,KAAK,YAAY,QAAQ;GAEpC,MAAM,WAAW,SAAS,YAAY,KAAK,cAAc,QAAQ;GAgBjE,MAAM,SAAS,MAAM,IAdF,OAAO;IACxB,QAAQ,KAAK;IACb,QAAQ;KACN,QAAQ,KAAK,QAAQ;KACrB,KAAK;KACL,MAAM;KACN,aAAa;KACb,cAAc,SAAS;KACvB,oBAAoB,SAAS;KAC7B,UAAU,SAAS;KACnB,KAAK,SAAS,eAAe,WAAW,gBAAgB;IAC1D;GACF,CAE0B,CAAC,CAAC,KAAK;GAGjC,MAAM,OAAO,MAAM,KAAK,SAAS,QAAQ;GAEzC,OAAO;IACL,MAAM;IACN,KAAK,KAAK,IAAI,QAAQ;IACtB,MAAM,KAAK;IACX,MAAM,KAAK,MAAM,QAAQ,MAAM,EAAE,KAAK;IACtC;IACA,QAAQ,KAAK;IACb,QAAQ,KAAK,QAAQ;IACrB,QAAQ,KAAK,QAAQ;IACrB,MAAM,OAAO;IACb,WAAW,OAAO;GACpB;EACF,GAAG,WAAW;CAChB;;;;CAKA,MAAa,IAAI,UAAmC;EAClD,OAAO,KAAK,UAAU,YAAY;GAChC,MAAM,EAAE,qBAAqB;GAG7B,WAAW,KAAK,YAAY,QAAQ;GAEpC,MAAM,UAAU,IAAI,iBAAiB;IACnC,QAAQ,KAAK,QAAQ;IACrB,KAAK;GACP,CAAC;GAED,MAAM,SAAS,MAAM,KAAK,OAAO,KAAK,OAAO;GAE7C,IAAI,CAAC,OAAO,MACV,MAAM,IAAI,MAAM,mBAAmB,UAAU;GAG/C,OAAO,OAAO,KAAK,MAAM,OAAO,KAAK,qBAAqB,CAAC;EAC7D,GAAG,KAAK;CACV;;;;CAKA,MAAa,UAAU,UAAqC;EAC1D,OAAO,KAAK,UAAU,YAAY;GAChC,MAAM,EAAE,qBAAqB;GAG7B,WAAW,KAAK,YAAY,QAAQ;GAEpC,MAAM,UAAU,IAAI,iBAAiB;IACnC,QAAQ,KAAK,QAAQ;IACrB,KAAK;GACP,CAAC;GAED,MAAM,SAAS,MAAM,KAAK,OAAO,KAAK,OAAO;GAE7C,IAAI,CAAC,OAAO,MACV,MAAM,IAAI,MAAM,mBAAmB,UAAU;GAG/C,OAAO,OAAO;EAChB,GAAG,WAAW;CAChB;;;;CAKA,MAAa,OAAO,UAAoC;EACtD,OAAO,KAAK,UAAU,YAAY;GAChC,MAAM,EAAE,wBAAwB;GAGhC,WAAW,KAAK,YAAY,QAAQ;GAEpC,MAAM,UAAU,IAAI,oBAAoB;IACtC,QAAQ,KAAK,QAAQ;IACrB,KAAK;GACP,CAAC;GAED,MAAM,KAAK,OAAO,KAAK,OAAO;GAE9B,OAAO;EACT,GAAG,QAAQ;CACb;;;;CAKA,MAAa,WAAW,WAAkD;EACxE,IAAI,UAAU,WAAW,GACvB,OAAO,CAAC;EAGV,OAAO,KAAK,UAAU,YAAY;GAChC,MAAM,EAAE,yBAAyB;GAGjC,MAAM,oBAAoB,UAAU,KAAK,QAAQ,KAAK,YAAY,GAAG,CAAC;GAEtE,MAAM,UAAU,IAAI,qBAAqB;IACvC,QAAQ,KAAK,QAAQ;IACrB,QAAQ;KACN,SAAS,kBAAkB,KAAK,SAAS,EAAE,IAAI,EAAE;KACjD,OAAO;IACT;GACF,CAAC;GAED,MAAM,SAAS,MAAM,KAAK,OAAO,KAAK,OAAO;GAC7C,MAAM,UAA8B,CAAC;GAGrC,KAAK,MAAM,WAAW,OAAO,WAAW,CAAC,GACvC,IAAI,QAAQ,KACV,QAAQ,KAAK;IAAE,UAAU,QAAQ;IAAK,SAAS;GAAK,CAAC;GAKzD,KAAK,MAAM,SAAS,OAAO,UAAU,CAAC,GACpC,IAAI,MAAM,KACR,QAAQ,KAAK;IACX,UAAU,MAAM;IAChB,SAAS;IACT,OAAO,MAAM,WAAW;GAC1B,CAAC;GAIL,OAAO;EACT,GAAG,YAAY;CACjB;;;;;;;;;;CAWA,MAAa,gBAAgB,eAAyC;EAEpE,gBAAgB,KAAK,YAAY,aAAa;EAG9C,MAAM,SAAS,cAAc,SAAS,GAAG,IAAI,gBAAgB,GAAG,cAAc;EAE9E,IAAI,UAAU;EAEd,OAAO,SAAS;GAEd,MAAM,UAAU,MAAM,KAAK,KAAK,QAAQ;IACtC,OAAO;IACP,WAAW;GACb,CAAC;GAED,IAAI,QAAQ,WAAW,GACrB;GAIF,MAAM,YAAY,QAAQ,QAAQ,QAAQ,CAAC,IAAI,WAAW,CAAC,CAAC,KAAK,QAAQ,IAAI,IAAI;GAEjF,IAAI,UAAU,WAAW,GACvB;GAKc,MAAM,KAAK,WAAW,SAAS;GAG/C,UAAU,QAAQ,UAAU;EAC9B;EAEA,OAAO;CACT;;;;CAKA,MAAa,OAAO,UAAoC;EAEtD,IAAI;GACF,MAAM,EAAE,sBAAsB;GAG9B,WAAW,KAAK,YAAY,QAAQ;GAEpC,MAAM,UAAU,IAAI,kBAAkB;IACpC,QAAQ,KAAK,QAAQ;IACrB,KAAK;GACP,CAAC;GAED,MAAM,KAAK,OAAO,KAAK,OAAO;GAC9B,OAAO;EACT,QAAQ;GACN,OAAO;EACT;CACF;;;;CASA,MAAa,aAAa,UAAkB,YAAY,MAAuB;EAC7E,OAAO,KAAK,gBAAgB,UAAU,EAAE,UAAU,CAAC;CACrD;;;;CAKA,MAAa,gBAAgB,UAAkB,SAA6C;EAC1F,OAAO,KAAK,UAAU,YAAY;GAChC,MAAM,EAAE,qBAAqB;GAC7B,MAAM,EAAE,iBAAiB;GAGzB,WAAW,KAAK,YAAY,QAAQ;GAEpC,MAAM,UAAU,IAAI,iBAAiB;IACnC,QAAQ,KAAK,QAAQ;IACrB,KAAK;GACP,CAAC;GAED,OAAO,aAAa,KAAK,QAAQ,SAAS,EACxC,WAAW,SAAS,aAAa,KACnC,CAAC;EACH,GAAG,iBAAiB;CACtB;;;;CAKA,MAAa,sBACX,UACA,SACiB;EACjB,OAAO,KAAK,UAAU,YAAY;GAChC,MAAM,EAAE,qBAAqB;GAC7B,MAAM,EAAE,iBAAiB;GAGzB,WAAW,KAAK,YAAY,QAAQ;GAEpC,MAAM,UAAU,IAAI,iBAAiB;IACnC,QAAQ,KAAK,QAAQ;IACrB,KAAK;IACL,aAAa,SAAS;IACtB,UAAU,SAAS;GACrB,CAAC;GAED,OAAO,aAAa,KAAK,QAAQ,SAAS,EACxC,WAAW,SAAS,aAAa,KACnC,CAAC;EACH,GAAG,uBAAuB;CAC5B;;;;CASA,MAAa,SAAS,UAA4C;EAChE,OAAO,KAAK,UAAU,YAAY;GAChC,MAAM,EAAE,sBAAsB;GAG9B,WAAW,KAAK,YAAY,QAAQ;GAEpC,MAAM,UAAU,IAAI,kBAAkB;IACpC,QAAQ,KAAK,QAAQ;IACrB,KAAK;GACP,CAAC;GAED,MAAM,SAAS,MAAM,KAAK,OAAO,KAAK,OAAO;GAC7C,MAAM,OAAO,SAAS,MAAM,GAAG,CAAC,CAAC,IAAI,KAAK;GAE1C,OAAO;IACL,MAAM;IACN;IACA,MAAM,OAAO,iBAAiB;IAC9B,aAAa;IACb,cAAc,OAAO;IACrB,UAAU,OAAO,eAAe,KAAK,cAAc,QAAQ;IAC3D,MAAM,OAAO;IACb,cAAc,OAAO;GACvB;EACF,GAAG,UAAU;CACf;;;;CAKA,MAAa,KAAK,UAAmC;EAEnD,QAAO,MADY,KAAK,SAAS,QAAQ,EAC9B,CAAC;CACd;;;;CASA,MAAa,KAAK,MAAc,IAA2C;EACzE,OAAO,KAAK,UAAU,YAAY;GAChC,MAAM,EAAE,mBAAmB,sBAAsB;GAGjD,OAAO,KAAK,YAAY,IAAI;GAC5B,KAAK,KAAK,YAAY,EAAE;GAExB,MAAM,UAAU,IAAI,kBAAkB;IACpC,QAAQ,KAAK,QAAQ;IACrB,YAAY,GAAG,KAAK,QAAQ,OAAO,GAAG;IACtC,KAAK;GACP,CAAC;GAED,MAAM,SAAS,MAAM,KAAK,OAAO,KAAK,OAAO;GAG7C,MAAM,cAAc,IAAI,kBAAkB;IACxC,QAAQ,KAAK,QAAQ;IACrB,KAAK;GACP,CAAC;GACD,MAAM,aAAa,MAAM,KAAK,OAAO,KAAK,WAAW;GAErD,OAAO;IACL,MAAM;IACN,KAAK,KAAK,IAAI,EAAE;IAChB,MAAM,WAAW,iBAAiB;IAClC,MAAM,WAAW,MAAM,QAAQ,MAAM,EAAE,KAAK;IAC5C,UAAU,WAAW,eAAe,KAAK,cAAc,EAAE;IACzD,QAAQ,KAAK;IACb,QAAQ,KAAK,QAAQ;IACrB,QAAQ,KAAK,QAAQ;IACrB,MAAM,OAAO,kBAAkB;IAC/B,WAAW,OAAO;GACpB;EACF,GAAG,MAAM;CACX;;;;CAKA,MAAa,KAAK,MAAc,IAA2C;EACzE,MAAM,OAAO,MAAM,KAAK,KAAK,MAAM,EAAE;EACrC,MAAM,KAAK,OAAO,IAAI;EACtB,OAAO;CACT;;;;CAKA,MAAa,KAAK,WAAmB,SAAmD;EACtF,OAAO,KAAK,UAAU,YAAY;GAChC,MAAM,EAAE,yBAAyB;GAGjC,YAAY,KAAK,YAAY,SAAS;GAEtC,MAAM,UAAU,IAAI,qBAAqB;IACvC,QAAQ,KAAK,QAAQ;IACrB,QAAQ;IACR,SAAS,SAAS;IAClB,mBAAmB,SAAS;IAC5B,WAAW,SAAS,YAAY,SAAY;GAC9C,CAAC;GAED,MAAM,SAAS,MAAM,KAAK,OAAO,KAAK,OAAO;GAC7C,MAAM,QAA2B,CAAC;GAGlC,KAAK,MAAM,UAAU,OAAO,YAAY,CAAC,GAAG;IAC1C,IAAI,CAAC,OAAO,KAAK;IAEjB,MAAM,KAAK;KACT,MAAM,OAAO;KACb,MAAM,OAAO,IAAI,MAAM,GAAG,CAAC,CAAC,IAAI,KAAK;KACrC,MAAM,OAAO,QAAQ;KACrB,aAAa;KACb,cAAc,OAAO;KACrB,MAAM,OAAO;KACb,cAAc,OAAO;IACvB,CAAC;GACH;GAGA,KAAK,MAAM,UAAU,OAAO,kBAAkB,CAAC,GAAG;IAChD,IAAI,CAAC,OAAO,QAAQ;IAEpB,MAAM,KAAK;KACT,MAAM,OAAO;KACb,MAAM,OAAO,OAAO,MAAM,GAAG,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,IAAI,KAAK;KACxD,MAAM;KACN,aAAa;IACf,CAAC;GACH;GAEA,OAAO;EACT,GAAG,MAAM;CACX;;;;CASA,AAAO,YAAoB;EACzB,OAAO,KAAK,QAAQ;CACtB;;;;CAKA,AAAO,YAAoB;EACzB,OAAO,KAAK,QAAQ;CACtB;;;;CAKA,MAAa,gBAAgB,UAAkB,cAAqC;EAClF,OAAO,KAAK,UAAU,YAAY;GAChC,MAAM,EAAE,sBAAsB;GAG9B,WAAW,KAAK,YAAY,QAAQ;GAEpC,MAAM,UAAU,IAAI,kBAAkB;IACpC,QAAQ,KAAK,QAAQ;IACrB,YAAY,GAAG,KAAK,QAAQ,OAAO,GAAG;IACtC,KAAK;IACL,cAAc;IACd,mBAAmB;GACrB,CAAC;GAED,MAAM,KAAK,OAAO,KAAK,OAAO;EAChC,GAAG,iBAAiB;CACtB;;;;CAKA,MAAa,cAAc,UAAkB,YAA2C;EACtF,OAAO,KAAK,UAAU,YAAY;GAChC,MAAM,EAAE,wBAAwB;GAGhC,WAAW,KAAK,YAAY,QAAQ;GAEpC,MAAM,UAAU,IAAI,oBAAoB;IACtC,QAAQ,KAAK,QAAQ;IACrB,KAAK;IACL,KAAK,eAAe,WAAW,gBAAgB;GACjD,CAAC;GAED,MAAM,KAAK,OAAO,KAAK,OAAO;EAChC,GAAG,eAAe;CACpB;;;;CAKA,MAAa,cAAc,UAA2C;EACpE,OAAO,KAAK,UAAU,YAAY;GAChC,MAAM,EAAE,wBAAwB;GAGhC,WAAW,KAAK,YAAY,QAAQ;GAEpC,MAAM,UAAU,IAAI,oBAAoB;IACtC,QAAQ,KAAK,QAAQ;IACrB,KAAK;GACP,CAAC;GAWD,QANsB,MAHD,KAAK,OAAO,KAAK,OAAO,EAGjB,CAAC,QAAQ,MAClC,UACC,MAAM,SAAS,QAAQ,qDACvB,MAAM,eAAe,MACzB,IAEuB,WAAW;EACpC,GAAG,eAAe;CACpB;;;;CASA,AAAU,cAAc,QAAwB;EAC9C,OAAO,OAAO,WAAW,QAAQ,CAAC,CAAC,OAAO,IAAI,WAAW,MAAM,CAAC,CAAC,CAAC,OAAO,KAAK;CAChF;;;;CAKA,AAAU,cAAc,UAA0B;EAChD,OAAO,YAAY,QAAQ;CAC7B;AACF"}
@@ -1,7 +1,7 @@
1
1
  import { CloudStorageDriverOptions } from "../types.mjs";
2
2
  import { CloudDriver } from "./cloud-driver.mjs";
3
3
 
4
- //#region ../../@warlock.js/core/src/storage/drivers/do-spaces-driver.d.ts
4
+ //#region ../@warlock.js/core/src/storage/drivers/do-spaces-driver.d.ts
5
5
  /**
6
6
  * DigitalOcean Spaces Storage Driver
7
7
  *
@@ -1 +1 @@
1
- {"version":3,"file":"do-spaces-driver.d.mts","names":[],"sources":["../../../../../../../@warlock.js/core/src/storage/drivers/do-spaces-driver.ts"],"mappings":";;;;;;AA0BA;;;;;;;;;;;AAoB6B;;;;;;;;;cApBhB,cAAA,SAAuB,WAAW,CAAC,yBAAA;;;;WAI9B,IAAA;;;;;;YAON,WAAA,CAAA;;;;;;EASH,GAAA,CAAI,QAAA;AAAA"}
1
+ {"version":3,"file":"do-spaces-driver.d.mts","names":[],"sources":["../../../../../../../../@warlock.js/core/src/storage/drivers/do-spaces-driver.ts"],"mappings":";;;;;;AA0BA;;;;;;;;;;;AAoB6B;;;;;;;;;cApBhB,cAAA,SAAuB,WAAW,CAAC,yBAAA;;;;WAI9B,IAAA;;;;;;YAON,WAAA;;;;;;EASH,GAAA,CAAI,QAAA;AAAA"}
@@ -1,7 +1,7 @@
1
1
  import { CloudDriver } from "./cloud-driver.mjs";
2
2
  import { ltrim } from "@mongez/reinforcements";
3
3
 
4
- //#region ../../@warlock.js/core/src/storage/drivers/do-spaces-driver.ts
4
+ //#region ../@warlock.js/core/src/storage/drivers/do-spaces-driver.ts
5
5
  /**
6
6
  * DigitalOcean Spaces Storage Driver
7
7
  *
@@ -1 +1 @@
1
- {"version":3,"file":"do-spaces-driver.mjs","names":[],"sources":["../../../../../../../@warlock.js/core/src/storage/drivers/do-spaces-driver.ts"],"sourcesContent":["import { ltrim } from \"@mongez/reinforcements\";\nimport type { CloudStorageDriverOptions } from \"../types\";\nimport { CloudDriver } from \"./cloud-driver\";\n\n/**\n * DigitalOcean Spaces Storage Driver\n *\n * Spaces is S3-compatible with a different URL structure.\n *\n * URL Patterns:\n * - With urlPrefix: {urlPrefix}/{key}\n * - CDN URL: https://{bucket}.{region}.cdn.digitaloceanspaces.com/{key}\n * - Origin URL: https://{bucket}.{region}.digitaloceanspaces.com/{key}\n *\n * Regions: nyc3, sfo3, ams3, sgp1, fra1, etc.\n *\n * @example\n * ```typescript\n * const driver = new DOSpacesDriver({\n * bucket: \"my-space\",\n * region: \"nyc3\",\n * accessKeyId: process.env.DO_SPACES_KEY,\n * secretAccessKey: process.env.DO_SPACES_SECRET,\n * });\n * ```\n */\nexport class DOSpacesDriver extends CloudDriver<CloudStorageDriverOptions> {\n /**\n * Driver name\n */\n public readonly name = \"spaces\";\n\n /**\n * Get Spaces endpoint URL\n *\n * Spaces endpoint format: https://{region}.digitaloceanspaces.com\n */\n protected getEndpoint(): string {\n return this.options.endpoint || `https://${this.options.region}.digitaloceanspaces.com`;\n }\n\n /**\n * Get public URL for file\n *\n * Note: DO Spaces includes automatic CDN with the `.cdn.` subdomain\n */\n public url(location: string): string {\n // 1. Use urlPrefix if configured\n if (this.options.urlPrefix) {\n const prefix = this.options.urlPrefix.replace(/\\/+$/, \"\");\n location = `${prefix}/${ltrim(location, \"/\")}`;\n }\n\n // 2. Default Spaces CDN URL\n return `https://${this.options.bucket}.${this.options.region}.cdn.digitaloceanspaces.com/${location}`;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AA0BA,IAAa,iBAAb,cAAoC,YAAuC;;;cAIlD;;;;;;;CAOvB,AAAU,cAAsB;EAC9B,OAAO,KAAK,QAAQ,YAAY,WAAW,KAAK,QAAQ,OAAO;CACjE;;;;;;CAOA,AAAO,IAAI,UAA0B;EAEnC,IAAI,KAAK,QAAQ,WAEf,WAAW,GADI,KAAK,QAAQ,UAAU,QAAQ,QAAQ,EACnC,EAAE,GAAG,MAAM,UAAU,GAAG;EAI7C,OAAO,WAAW,KAAK,QAAQ,OAAO,GAAG,KAAK,QAAQ,OAAO,8BAA8B;CAC7F;AACF"}
1
+ {"version":3,"file":"do-spaces-driver.mjs","names":[],"sources":["../../../../../../../../@warlock.js/core/src/storage/drivers/do-spaces-driver.ts"],"sourcesContent":["import { ltrim } from \"@mongez/reinforcements\";\nimport type { CloudStorageDriverOptions } from \"../types\";\nimport { CloudDriver } from \"./cloud-driver\";\n\n/**\n * DigitalOcean Spaces Storage Driver\n *\n * Spaces is S3-compatible with a different URL structure.\n *\n * URL Patterns:\n * - With urlPrefix: {urlPrefix}/{key}\n * - CDN URL: https://{bucket}.{region}.cdn.digitaloceanspaces.com/{key}\n * - Origin URL: https://{bucket}.{region}.digitaloceanspaces.com/{key}\n *\n * Regions: nyc3, sfo3, ams3, sgp1, fra1, etc.\n *\n * @example\n * ```typescript\n * const driver = new DOSpacesDriver({\n * bucket: \"my-space\",\n * region: \"nyc3\",\n * accessKeyId: process.env.DO_SPACES_KEY,\n * secretAccessKey: process.env.DO_SPACES_SECRET,\n * });\n * ```\n */\nexport class DOSpacesDriver extends CloudDriver<CloudStorageDriverOptions> {\n /**\n * Driver name\n */\n public readonly name = \"spaces\";\n\n /**\n * Get Spaces endpoint URL\n *\n * Spaces endpoint format: https://{region}.digitaloceanspaces.com\n */\n protected getEndpoint(): string {\n return this.options.endpoint || `https://${this.options.region}.digitaloceanspaces.com`;\n }\n\n /**\n * Get public URL for file\n *\n * Note: DO Spaces includes automatic CDN with the `.cdn.` subdomain\n */\n public url(location: string): string {\n // 1. Use urlPrefix if configured\n if (this.options.urlPrefix) {\n const prefix = this.options.urlPrefix.replace(/\\/+$/, \"\");\n location = `${prefix}/${ltrim(location, \"/\")}`;\n }\n\n // 2. Default Spaces CDN URL\n return `https://${this.options.bucket}.${this.options.region}.cdn.digitaloceanspaces.com/${location}`;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AA0BA,IAAa,iBAAb,cAAoC,YAAuC;;;cAIlD;;;;;;;CAOvB,AAAU,cAAsB;EAC9B,OAAO,KAAK,QAAQ,YAAY,WAAW,KAAK,QAAQ,OAAO;CACjE;;;;;;CAOA,AAAO,IAAI,UAA0B;EAEnC,IAAI,KAAK,QAAQ,WAEf,WAAW,GADI,KAAK,QAAQ,UAAU,QAAQ,QAAQ,EACnC,EAAE,GAAG,MAAM,UAAU,GAAG;EAI7C,OAAO,WAAW,KAAK,QAAQ,OAAO,GAAG,KAAK,QAAQ,OAAO,8BAA8B;CAC7F;AACF"}
@@ -2,7 +2,7 @@ import { DeleteManyResult, ListOptions, LocalStorageDriverOptions, PutOptions, S
2
2
  import { UploadedFile } from "../../http/uploaded-file.mjs";
3
3
  import { Readable } from "stream";
4
4
 
5
- //#region ../../@warlock.js/core/src/storage/drivers/local-driver.d.ts
5
+ //#region ../@warlock.js/core/src/storage/drivers/local-driver.d.ts
6
6
  /**
7
7
  * Local filesystem storage driver
8
8
  *