@warlock.js/core 4.1.15 → 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 (782) 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 +6 -6
  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 +3 -3
  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 +3 -3
  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 +3 -3
  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 +4 -4
  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 +8 -6
  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 +3 -3
  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 +3 -3
  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 +4 -4
  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 +3 -3
  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 +3 -3
  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 +6 -6
  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 +3 -3
  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 +5 -5
  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 +10 -10
  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 +6 -6
  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 +3 -3
  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 +4 -1
  362. package/esm/index.mjs +5 -1
  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 +3 -3
  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 +3 -3
  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/types.d.mts +1 -1
  647. package/esm/warlock-config/types.d.mts.map +1 -1
  648. package/esm/warlock-config/warlock-config.manager.d.mts +1 -1
  649. package/esm/warlock-config/warlock-config.manager.d.mts.map +1 -1
  650. package/esm/warlock-config/warlock-config.manager.mjs +1 -1
  651. package/esm/warlock-config/warlock-config.manager.mjs.map +1 -1
  652. package/llms-full.txt +64 -4
  653. package/llms.txt +1 -0
  654. package/package.json +9 -33
  655. package/skills/lower-stage3-decorators/SKILL.md +54 -0
  656. package/skills/test-http/SKILL.md +3 -2
  657. package/skills/test-service/SKILL.md +3 -2
  658. package/bin/warlock.js +0 -3
  659. package/esm/_virtual/_rolldown/runtime.mjs +0 -7
  660. package/esm/cli/cli-commands.manager.mjs +0 -290
  661. package/esm/cli/cli-commands.manager.mjs.map +0 -1
  662. package/esm/cli/cli-commands.utils.mjs +0 -217
  663. package/esm/cli/cli-commands.utils.mjs.map +0 -1
  664. package/esm/cli/commands/add.command.mjs +0 -27
  665. package/esm/cli/commands/add.command.mjs.map +0 -1
  666. package/esm/cli/commands/build.command.mjs +0 -14
  667. package/esm/cli/commands/build.command.mjs.map +0 -1
  668. package/esm/cli/commands/create-database.command.mjs +0 -24
  669. package/esm/cli/commands/create-database.command.mjs.map +0 -1
  670. package/esm/cli/commands/dev-server.command.mjs +0 -48
  671. package/esm/cli/commands/dev-server.command.mjs.map +0 -1
  672. package/esm/cli/commands/drop-tables.command.mjs +0 -23
  673. package/esm/cli/commands/drop-tables.command.mjs.map +0 -1
  674. package/esm/cli/commands/generate/generate.command.mjs +0 -201
  675. package/esm/cli/commands/generate/generate.command.mjs.map +0 -1
  676. package/esm/cli/commands/generate/generators/column-dsl-parser.mjs +0 -49
  677. package/esm/cli/commands/generate/generators/column-dsl-parser.mjs.map +0 -1
  678. package/esm/cli/commands/generate/generators/controller.generator.mjs +0 -48
  679. package/esm/cli/commands/generate/generators/controller.generator.mjs.map +0 -1
  680. package/esm/cli/commands/generate/generators/migration.generator.mjs +0 -81
  681. package/esm/cli/commands/generate/generators/migration.generator.mjs.map +0 -1
  682. package/esm/cli/commands/generate/generators/model.generator.mjs +0 -60
  683. package/esm/cli/commands/generate/generators/model.generator.mjs.map +0 -1
  684. package/esm/cli/commands/generate/generators/module.generator.mjs +0 -113
  685. package/esm/cli/commands/generate/generators/module.generator.mjs.map +0 -1
  686. package/esm/cli/commands/generate/generators/repository.generator.mjs +0 -42
  687. package/esm/cli/commands/generate/generators/repository.generator.mjs.map +0 -1
  688. package/esm/cli/commands/generate/generators/resource.generator.mjs +0 -42
  689. package/esm/cli/commands/generate/generators/resource.generator.mjs.map +0 -1
  690. package/esm/cli/commands/generate/generators/service.generator.mjs +0 -42
  691. package/esm/cli/commands/generate/generators/service.generator.mjs.map +0 -1
  692. package/esm/cli/commands/generate/templates/stubs.mjs +0 -514
  693. package/esm/cli/commands/generate/templates/stubs.mjs.map +0 -1
  694. package/esm/cli/commands/generate/utils/name-parser.mjs +0 -69
  695. package/esm/cli/commands/generate/utils/name-parser.mjs.map +0 -1
  696. package/esm/cli/commands/generate/utils/path-resolver.mjs +0 -56
  697. package/esm/cli/commands/generate/utils/path-resolver.mjs.map +0 -1
  698. package/esm/cli/commands/generate/utils/prompt.mjs +0 -28
  699. package/esm/cli/commands/generate/utils/prompt.mjs.map +0 -1
  700. package/esm/cli/commands/generate/utils/writer.mjs +0 -60
  701. package/esm/cli/commands/generate/utils/writer.mjs.map +0 -1
  702. package/esm/cli/commands/migrate.command.mjs +0 -60
  703. package/esm/cli/commands/migrate.command.mjs.map +0 -1
  704. package/esm/cli/commands/seed.command.mjs +0 -41
  705. package/esm/cli/commands/seed.command.mjs.map +0 -1
  706. package/esm/cli/commands/start-production.command.mjs +0 -50
  707. package/esm/cli/commands/start-production.command.mjs.map +0 -1
  708. package/esm/cli/commands/storage-put.action.mjs +0 -75
  709. package/esm/cli/commands/storage-put.action.mjs.map +0 -1
  710. package/esm/cli/commands/storage-put.command.mjs +0 -46
  711. package/esm/cli/commands/storage-put.command.mjs.map +0 -1
  712. package/esm/cli/commands/typings-generator.command.mjs +0 -38
  713. package/esm/cli/commands/typings-generator.command.mjs.map +0 -1
  714. package/esm/cli/commands-loader.mjs +0 -50
  715. package/esm/cli/commands-loader.mjs.map +0 -1
  716. package/esm/cli/framework-cli-commands.mjs +0 -37
  717. package/esm/cli/framework-cli-commands.mjs.map +0 -1
  718. package/esm/cli/parse-cli-args.mjs +0 -62
  719. package/esm/cli/parse-cli-args.mjs.map +0 -1
  720. package/esm/cli/start.d.mts +0 -1
  721. package/esm/cli/start.mjs +0 -8
  722. package/esm/cli/start.mjs.map +0 -1
  723. package/esm/cli/string-similarity.mjs +0 -56
  724. package/esm/cli/string-similarity.mjs.map +0 -1
  725. package/esm/database/create-database-action.mjs +0 -32
  726. package/esm/database/create-database-action.mjs.map +0 -1
  727. package/esm/database/drop-tables-action.mjs +0 -35
  728. package/esm/database/drop-tables-action.mjs.map +0 -1
  729. package/esm/database/migrate-action.mjs +0 -99
  730. package/esm/database/migrate-action.mjs.map +0 -1
  731. package/esm/database/seed-command-action.mjs +0 -74
  732. package/esm/database/seed-command-action.mjs.map +0 -1
  733. package/esm/database/seeds/seeders.manager.mjs +0 -129
  734. package/esm/database/seeds/seeders.manager.mjs.map +0 -1
  735. package/esm/database/seeds/seeds-table-migration.mjs +0 -31
  736. package/esm/database/seeds/seeds-table-migration.mjs.map +0 -1
  737. package/esm/database/seeds/utils.mjs +0 -6
  738. package/esm/database/seeds/utils.mjs.map +0 -1
  739. package/esm/dev-server/development-server.mjs +0 -115
  740. package/esm/dev-server/development-server.mjs.map +0 -1
  741. package/esm/dev-server/health-checker/workers/eslint-health.worker.d.mts +0 -1
  742. package/esm/dev-server/health-checker/workers/ts-health.worker.d.mts +0 -1
  743. package/esm/dev-server/layer-executor.mjs +0 -114
  744. package/esm/dev-server/layer-executor.mjs.map +0 -1
  745. package/esm/dev-server/loader/hook-thread.d.mts +0 -48
  746. package/esm/dev-server/loader/hook-thread.d.mts.map +0 -1
  747. package/esm/dev-server/loader/hook-thread.mjs +0 -47
  748. package/esm/dev-server/loader/hook-thread.mjs.map +0 -1
  749. package/esm/dev-server/loader/load-hook.d.mts +0 -58
  750. package/esm/dev-server/loader/load-hook.d.mts.map +0 -1
  751. package/esm/dev-server/loader/load-hook.mjs +0 -86
  752. package/esm/dev-server/loader/load-hook.mjs.map +0 -1
  753. package/esm/dev-server/loader/own-resolver.mjs +0 -69
  754. package/esm/dev-server/loader/own-resolver.mjs.map +0 -1
  755. package/esm/dev-server/loader/resolve-capture.mjs +0 -43
  756. package/esm/dev-server/loader/resolve-capture.mjs.map +0 -1
  757. package/esm/dev-server/loader/resolve-hook.d.mts +0 -41
  758. package/esm/dev-server/loader/resolve-hook.d.mts.map +0 -1
  759. package/esm/dev-server/loader/resolve-hook.mjs +0 -87
  760. package/esm/dev-server/loader/resolve-hook.mjs.map +0 -1
  761. package/esm/dev-server/loader/source-slug.mjs +0 -22
  762. package/esm/dev-server/loader/source-slug.mjs.map +0 -1
  763. package/esm/dev-server/loader/version-registry.mjs +0 -45
  764. package/esm/dev-server/loader/version-registry.mjs.map +0 -1
  765. package/esm/dev-server/start-development-server.mjs +0 -63
  766. package/esm/dev-server/start-development-server.mjs.map +0 -1
  767. package/esm/dev-server/type-generator.mjs +0 -453
  768. package/esm/dev-server/type-generator.mjs.map +0 -1
  769. package/esm/generations/add-command.action.mjs +0 -376
  770. package/esm/generations/add-command.action.mjs.map +0 -1
  771. package/esm/generations/stubs.mjs +0 -103
  772. package/esm/generations/stubs.mjs.map +0 -1
  773. package/esm/manifest/manifest-manager.mjs +0 -79
  774. package/esm/manifest/manifest-manager.mjs.map +0 -1
  775. package/esm/production/build-app-production.mjs +0 -14
  776. package/esm/production/build-app-production.mjs.map +0 -1
  777. package/esm/production/esbuild-plugins.mjs +0 -37
  778. package/esm/production/esbuild-plugins.mjs.map +0 -1
  779. package/esm/production/production-builder.mjs +0 -264
  780. package/esm/production/production-builder.mjs.map +0 -1
  781. package/esm/production/resolve-build-config.mjs +0 -28
  782. package/esm/production/resolve-build-config.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"scoped-storage.mjs","names":["fs"],"sources":["../../../../../../@warlock.js/core/src/storage/scoped-storage.ts"],"sourcesContent":["import { fileExistsAsync } from \"@warlock.js/fs\";\r\nimport { createReadStream } from \"fs\";\r\nimport fs from \"fs/promises\";\r\nimport path from \"path\";\r\nimport type { Readable } from \"stream\";\r\nimport type { UploadedFile } from \"../http\";\r\nimport { StorageFile } from \"./storage-file\";\r\nimport type {\r\n DeleteManyResult,\r\n ListOptions,\r\n PutDirectoryOptions,\r\n PutDirectoryResult,\r\n PutOptions,\r\n ScopedStorageContract,\r\n StorageDriverContract,\r\n StorageDriverType,\r\n StorageFileInfo,\r\n} from \"./types\";\r\n\r\n/**\r\n * ScopedStorage - Base class for storage operations\r\n *\r\n * Wraps a storage driver and provides a consistent, developer-friendly API\r\n * that returns `StorageFile` instances instead of raw data objects.\r\n *\r\n * This class serves as the base for both direct driver usage and the\r\n * full `Storage` manager class.\r\n *\r\n * @example\r\n * ```typescript\r\n * // Using via storage.use()\r\n * const s3Storage = storage.use(\"s3\");\r\n * const file = await s3Storage.put(buffer, \"images/photo.jpg\");\r\n *\r\n * // file is a StorageFile instance with rich API\r\n * console.log(file.name); // \"photo.jpg\"\r\n * console.log(file.url); // \"https://...\"\r\n * await file.copy(\"backup/photo.jpg\");\r\n * ```\r\n */\r\nexport class ScopedStorage implements ScopedStorageContract {\r\n /**\r\n * The underlying storage driver instance\r\n * @internal\r\n */\r\n protected _driver: StorageDriverContract;\r\n\r\n /**\r\n * Create a new ScopedStorage instance\r\n *\r\n * @param driver - The storage driver to wrap\r\n */\r\n public constructor(driver: StorageDriverContract) {\r\n this._driver = driver;\r\n }\r\n\r\n // ============================================================\r\n // Properties\r\n // ============================================================\r\n\r\n /**\r\n * Get the driver name\r\n *\r\n * @returns The name identifier of the underlying driver (e.g., \"local\", \"s3\", \"r2\")\r\n */\r\n public get name(): StorageDriverType {\r\n return this.activeDriver.name;\r\n }\r\n\r\n /**\r\n * Get the default driver instance\r\n *\r\n * Use this for advanced operations that require direct driver access.\r\n *\r\n * @returns The raw storage driver\r\n */\r\n public get defaultDriver(): StorageDriverContract {\r\n return this._driver;\r\n }\r\n\r\n /**\r\n * Get the currently active driver\r\n *\r\n * Returns the driver being used for storage operations.\r\n * Can be overridden in subclasses for dynamic driver resolution (e.g., multi-tenant contexts).\r\n *\r\n * @returns The active storage driver\r\n */\r\n public get activeDriver(): StorageDriverContract {\r\n return this._driver;\r\n }\r\n\r\n // ============================================================\r\n // File Operations\r\n // ============================================================\r\n\r\n /**\r\n * Store a file in storage\r\n *\r\n * Accepts multiple input types and stores the file at the specified location.\r\n * Returns a `StorageFile` instance for further operations.\r\n *\r\n * @param file - File content as Buffer, string path, UploadedFile, or Readable stream\r\n * @param location - Destination path in storage (e.g., \"uploads/images/photo.jpg\")\r\n * @param options - Optional storage options\r\n * @returns StorageFile instance with cached metadata\r\n *\r\n * @example\r\n * ```typescript\r\n * // From buffer\r\n * const file = await storage.put(buffer, \"documents/report.pdf\");\r\n *\r\n * // From uploaded file\r\n * const file = await storage.put(uploadedFile, \"avatars/user-123.jpg\");\r\n *\r\n * // With options\r\n * const file = await storage.put(buffer, \"images/photo.jpg\", {\r\n * mimeType: \"image/jpeg\",\r\n * cacheControl: \"max-age=31536000\"\r\n * });\r\n * ```\r\n */\r\n public async put(\r\n file: UploadedFile | Buffer | string | Readable,\r\n location: string,\r\n options?: PutOptions,\r\n ): Promise<StorageFile> {\r\n const buffer = await this.toBuffer(file);\r\n const data = await this.activeDriver.put(buffer, location, options);\r\n return StorageFile.fromData(data, this.activeDriver);\r\n }\r\n\r\n /**\r\n * Store a file from a readable stream\r\n *\r\n * Optimized for large files - streams data directly without full buffering.\r\n * Ideal for file uploads, remote file fetching, or processing pipelines.\r\n *\r\n * @param stream - Readable stream of file content\r\n * @param location - Destination path in storage\r\n * @param options - Optional storage options\r\n * @returns StorageFile instance with cached metadata\r\n *\r\n * @example\r\n * ```typescript\r\n * import { createReadStream } from \"fs\";\r\n *\r\n * const stream = createReadStream(\"./large-video.mp4\");\r\n * const file = await storage.putStream(stream, \"videos/upload.mp4\");\r\n * ```\r\n */\r\n public async putStream(\r\n stream: Readable,\r\n location: string,\r\n options?: PutOptions,\r\n ): Promise<StorageFile> {\r\n const data = await this.activeDriver.putStream(stream, location, options);\r\n return StorageFile.fromData(data, this.activeDriver);\r\n }\r\n\r\n /**\r\n * Store a file from a URL\r\n *\r\n * Downloads the file from the URL and stores it.\r\n *\r\n * @param url - URL to download from\r\n * @param location - Destination path in storage\r\n * @param options - Optional storage options\r\n * @returns StorageFile instance\r\n *\r\n * @example\r\n * ```typescript\r\n * const file = await storage.putFromUrl(\r\n * \"https://example.com/image.jpg\",\r\n * \"images/downloaded.jpg\"\r\n * );\r\n * ```\r\n */\r\n public async putFromUrl(\r\n url: string,\r\n location: string,\r\n options?: PutOptions,\r\n ): Promise<StorageFile> {\r\n const response = await fetch(url);\r\n\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch file from ${url}: ${response.statusText}`);\r\n }\r\n\r\n const buffer = Buffer.from(await response.arrayBuffer());\r\n return this.put(buffer, location, options);\r\n }\r\n\r\n /**\r\n * Store a file from base64 data URL\r\n *\r\n * @param dataUrl - Data URL (data:image/png;base64,iVBORw0KG...)\r\n * @param location - Destination path in storage\r\n * @param options - Optional storage options\r\n * @returns StorageFile instance\r\n *\r\n * @example\r\n * ```typescript\r\n * const file = await storage.putFromBase64(\r\n * \"data:image/png;base64,iVBORw0KGgoAAAANS...\",\r\n * \"images/upload.png\"\r\n * );\r\n * ```\r\n */\r\n public async putFromBase64(\r\n dataUrl: string,\r\n location: string,\r\n options?: PutOptions,\r\n ): Promise<StorageFile> {\r\n // Parse data URL: data:image/png;base64,iVBORw0KG...\r\n const matches = dataUrl.match(/^data:([^;]+);base64,(.+)$/);\r\n\r\n if (!matches) {\r\n throw new Error(\"Invalid base64 data URL format. Expected: data:mime/type;base64,<data>\");\r\n }\r\n\r\n const [, mimeType, base64Data] = matches;\r\n const buffer = Buffer.from(base64Data, \"base64\");\r\n\r\n return this.put(buffer, location, {\r\n ...options,\r\n mimeType: options?.mimeType || mimeType,\r\n });\r\n }\r\n\r\n /**\r\n * Retrieve file contents as a Buffer\r\n *\r\n * Downloads the entire file into memory. For large files,\r\n * consider using `getStream()` instead.\r\n *\r\n * @param location - Path to the file in storage\r\n * @returns Buffer containing file contents\r\n * @throws Error if file not found\r\n *\r\n * @example\r\n * ```typescript\r\n * const buffer = await storage.get(\"documents/report.pdf\");\r\n * const content = buffer.toString(\"utf-8\");\r\n * ```\r\n */\r\n public async get(location: string): Promise<Buffer> {\r\n return this.activeDriver.get(location);\r\n }\r\n\r\n /**\r\n * Retrieve file contents as a readable stream\r\n *\r\n * Streams file data without loading entire file into memory.\r\n * Ideal for large files or when piping to a response.\r\n *\r\n * @param location - Path to the file in storage\r\n * @returns Readable stream of file contents\r\n * @throws Error if file not found\r\n *\r\n * @example\r\n * ```typescript\r\n * const stream = await storage.getStream(\"videos/large.mp4\");\r\n * stream.pipe(response.raw);\r\n * ```\r\n */\r\n public async getStream(location: string): Promise<Readable> {\r\n return this.activeDriver.getStream(location);\r\n }\r\n\r\n /**\r\n * Delete a file from storage\r\n *\r\n * @param location - Path to the file, or a StorageFile instance\r\n * @returns `true` if deleted, `false` if file not found\r\n *\r\n * @example\r\n * ```typescript\r\n * // By path\r\n * await storage.delete(\"temp/old-file.txt\");\r\n *\r\n * // From StorageFile instance\r\n * const file = await storage.put(buffer, \"temp/file.txt\");\r\n * await storage.delete(file);\r\n * ```\r\n */\r\n public async delete(location: string | StorageFile): Promise<boolean> {\r\n const path = typeof location === \"string\" ? location : location.path;\r\n return this.activeDriver.delete(path);\r\n }\r\n\r\n /**\r\n * Delete multiple files at once\r\n *\r\n * Performs batch deletion for efficiency. Returns results for each file\r\n * including success/failure status.\r\n *\r\n * @param locations - Array of file paths to delete\r\n * @returns Array of delete results with status for each file\r\n *\r\n * @example\r\n * ```typescript\r\n * const results = await storage.deleteMany([\r\n * \"temp/file1.txt\",\r\n * \"temp/file2.txt\",\r\n * \"temp/file3.txt\"\r\n * ]);\r\n *\r\n * for (const result of results) {\r\n * console.log(`${result.location}: ${result.deleted ? \"deleted\" : result.error}`);\r\n * }\r\n * ```\r\n */\r\n public async deleteMany(locations: string[]): Promise<DeleteManyResult[]> {\r\n return this.activeDriver.deleteMany(locations);\r\n }\r\n\r\n /**\r\n * Delete a directory\r\n *\r\n * @param directoryPath - Path to the directory\r\n */\r\n public async deleteDirectory(directoryPath: string): Promise<boolean> {\r\n return await this.activeDriver.deleteDirectory(directoryPath);\r\n }\r\n\r\n /**\r\n * Check if a file exists in storage\r\n *\r\n * @param location - Path to check\r\n * @returns `true` if file exists, `false` otherwise\r\n *\r\n * @example\r\n * ```typescript\r\n * if (await storage.exists(\"config/settings.json\")) {\r\n * const config = await storage.get(\"config/settings.json\");\r\n * }\r\n * ```\r\n */\r\n public async exists(location: string): Promise<boolean> {\r\n return this.activeDriver.exists(location);\r\n }\r\n\r\n /**\r\n * Copy a file to a new location\r\n *\r\n * Creates a copy of the file at the destination path.\r\n * The original file remains unchanged.\r\n *\r\n * @param from - Source path or StorageFile instance\r\n * @param to - Destination path\r\n * @returns StorageFile instance at the new location\r\n *\r\n * @example\r\n * ```typescript\r\n * // Copy by path\r\n * const backup = await storage.copy(\"documents/report.pdf\", \"backups/report.pdf\");\r\n *\r\n * // Copy from StorageFile\r\n * const original = await storage.file(\"documents/report.pdf\");\r\n * const backup = await storage.copy(original, \"backups/report.pdf\");\r\n * ```\r\n */\r\n public async copy(from: string | StorageFile, to: string): Promise<StorageFile> {\r\n const fromPath = typeof from === \"string\" ? from : from.path;\r\n const data = await this.activeDriver.copy(fromPath, to);\r\n return StorageFile.fromData(data, this.activeDriver);\r\n }\r\n\r\n /**\r\n * Move a file to a new location\r\n *\r\n * Moves the file to the destination path. The original file\r\n * is deleted after successful copy.\r\n *\r\n * @param from - Source path or StorageFile instance\r\n * @param to - Destination path\r\n * @returns StorageFile instance at the new location\r\n *\r\n * @example\r\n * ```typescript\r\n * // Move by path\r\n * const file = await storage.move(\"uploads/temp.jpg\", \"images/photo.jpg\");\r\n *\r\n * // Move from StorageFile\r\n * const temp = await storage.file(\"uploads/temp.jpg\");\r\n * const final = await storage.move(temp, \"images/photo.jpg\");\r\n * ```\r\n */\r\n public async move(from: string | StorageFile, to: string): Promise<StorageFile> {\r\n const fromPath = typeof from === \"string\" ? from : from.path;\r\n const data = await this.activeDriver.move(fromPath, to);\r\n return StorageFile.fromData(data, this.activeDriver);\r\n }\r\n\r\n /**\r\n * Copy an entire directory recursively\r\n *\r\n * Copies all files from the source directory to the destination directory,\r\n * preserving the directory structure.\r\n *\r\n * @param from - Source directory path\r\n * @param to - Destination directory path\r\n * @param options - Optional concurrency control\r\n * @returns Number of files copied\r\n *\r\n * @example\r\n * ```typescript\r\n * // Copy entire directory\r\n * const count = await storage.copyDirectory(\"uploads/temp\", \"uploads/final\");\r\n * console.log(`Copied ${count} files`);\r\n *\r\n * // With concurrency limit\r\n * const count = await storage.copyDirectory(\"large-dir\", \"backup\", {\r\n * concurrency: 10\r\n * });\r\n * ```\r\n */\r\n public async copyDirectory(\r\n from: string,\r\n to: string,\r\n options?: { concurrency?: number },\r\n ): Promise<number> {\r\n const concurrency = options?.concurrency || 5;\r\n\r\n // List all files recursively\r\n const files = await this.list(from, { recursive: true });\r\n const filesToCopy = files.filter((f) => !f.isDirectory);\r\n\r\n // Copy files in batches for efficiency\r\n let copied = 0;\r\n for (let i = 0; i < filesToCopy.length; i += concurrency) {\r\n const batch = filesToCopy.slice(i, i + concurrency);\r\n await Promise.all(\r\n batch.map(async (file) => {\r\n // Calculate relative path and new destination\r\n const relativePath = file.path.substring(from.length).replace(/^\\//, \"\");\r\n const newPath = `${to}/${relativePath}`;\r\n await this.copy(file.path, newPath);\r\n copied++;\r\n }),\r\n );\r\n }\r\n\r\n return copied;\r\n }\r\n\r\n /**\r\n * Move an entire directory recursively\r\n *\r\n * Moves all files from the source directory to the destination directory,\r\n * then deletes the source directory.\r\n *\r\n * @param from - Source directory path\r\n * @param to - Destination directory path\r\n * @param options - Optional concurrency control\r\n * @returns Number of files moved\r\n *\r\n * @example\r\n * ```typescript\r\n * const count = await storage.moveDirectory(\"uploads/temp\", \"uploads/final\");\r\n * console.log(`Moved ${count} files`);\r\n * ```\r\n */\r\n public async moveDirectory(\r\n from: string,\r\n to: string,\r\n options?: { concurrency?: number },\r\n ): Promise<number> {\r\n // Copy all files first\r\n const count = await this.copyDirectory(from, to, options);\r\n\r\n // Delete source directory\r\n await this.deleteDirectory(from);\r\n\r\n return count;\r\n }\r\n\r\n /**\r\n * Upload a local filesystem directory into storage\r\n *\r\n * Recursively walks the local directory, applies an optional filter, then\r\n * streams each file into storage. Uploads run in concurrent batches for\r\n * efficiency. Failures are collected — a single failed file never aborts\r\n * the entire operation (mirrors the contract of `deleteMany`).\r\n *\r\n * @param localDirPath - Absolute path of the local directory to upload\r\n * @param destination - Target prefix in storage (e.g. \"uploads/assets\")\r\n * @param options - Concurrency, filter, progress callback, put options\r\n * @returns - { uploaded, failed, total }\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = await storage.putDirectory(\"./public/assets\", \"cdn/assets\", {\r\n * concurrency: 10,\r\n * filter: (_, rel) => !rel.startsWith(\".\"),\r\n * onProgress: (done, total) => console.log(`${done}/${total}`),\r\n * });\r\n *\r\n * console.log(`Uploaded: ${result.uploaded.length}, Failed: ${result.failed.length}`);\r\n * ```\r\n */\r\n public async putDirectory(\r\n localDirPath: string,\r\n destination: string,\r\n options?: PutDirectoryOptions,\r\n ): Promise<PutDirectoryResult> {\r\n const concurrency = options?.concurrency ?? 5;\r\n\r\n // Collect all local file paths recursively\r\n const localFiles = await this.walkLocalDirectory(localDirPath);\r\n\r\n // Apply the user-supplied filter if any\r\n const filteredFiles = options?.filter\r\n ? localFiles.filter(({ absolute, relative }) => options.filter!(absolute, relative))\r\n : localFiles;\r\n\r\n const total = filteredFiles.length;\r\n const uploaded: StorageFile[] = [];\r\n const failed: Array<{ localPath: string; error: Error }> = [];\r\n let doneCount = 0;\r\n\r\n // Upload in concurrent batches\r\n for (let i = 0; i < filteredFiles.length; i += concurrency) {\r\n const batch = filteredFiles.slice(i, i + concurrency);\r\n\r\n await Promise.all(\r\n batch.map(async ({ absolute, relative }) => {\r\n const storagePath = `${destination.replace(/\\/$/, \"\")}/${relative}`;\r\n\r\n try {\r\n const stream = createReadStream(absolute);\r\n const file = await this.putStream(stream, storagePath, options?.putOptions);\r\n uploaded.push(file);\r\n doneCount++;\r\n options?.onProgress?.(doneCount, total, file);\r\n } catch (err) {\r\n failed.push({\r\n localPath: absolute,\r\n error: err instanceof Error ? err : new Error(String(err)),\r\n });\r\n }\r\n }),\r\n );\r\n }\r\n\r\n return { uploaded, failed, total };\r\n }\r\n\r\n /**\r\n * Walk a local directory recursively and return all file paths\r\n *\r\n * @param dirPath - Absolute local directory path\r\n * @returns Array of { absolute, relative } file path pairs\r\n * @internal\r\n */\r\n private async walkLocalDirectory(\r\n dirPath: string,\r\n baseDir?: string,\r\n ): Promise<Array<{ absolute: string; relative: string }>> {\r\n const root = baseDir ?? dirPath;\r\n const entries = await fs.readdir(dirPath, { withFileTypes: true });\r\n const results: Array<{ absolute: string; relative: string }> = [];\r\n\r\n for (const entry of entries) {\r\n const absolute = path.join(dirPath, entry.name);\r\n const relative = path.relative(root, absolute).replace(/\\\\/g, \"/\");\r\n\r\n if (entry.isDirectory()) {\r\n const nested = await this.walkLocalDirectory(absolute, root);\r\n results.push(...nested);\r\n } else if (entry.isFile()) {\r\n results.push({ absolute, relative });\r\n }\r\n // Symlinks are intentionally skipped\r\n }\r\n\r\n return results;\r\n }\r\n\r\n /**\r\n * Empty a directory without deleting the directory itself\r\n *\r\n * Deletes all files within the directory but preserves the directory structure.\r\n *\r\n * @param path - Directory path to empty\r\n * @returns Number of files deleted\r\n *\r\n * @example\r\n * ```typescript\r\n * const count = await storage.emptyDirectory(\"uploads/temp\");\r\n * console.log(`Deleted ${count} files`);\r\n * ```\r\n */\r\n public async emptyDirectory(path: string): Promise<number> {\r\n // List all files in directory\r\n const files = await this.list(path, { recursive: true });\r\n const filePaths = files.filter((f) => !f.isDirectory).map((f) => f.path);\r\n\r\n if (filePaths.length === 0) {\r\n return 0;\r\n }\r\n\r\n // Delete all files\r\n await this.deleteMany(filePaths);\r\n\r\n return filePaths.length;\r\n }\r\n\r\n /**\r\n * List files in a directory\r\n *\r\n * Returns file information for all files in the specified directory.\r\n * Supports recursive listing and pagination.\r\n *\r\n * @param directory - Directory path (defaults to root)\r\n * @param options - List options (recursive, limit, cursor)\r\n * @returns Array of file information objects\r\n *\r\n * @example\r\n * ```typescript\r\n * // List all files in uploads\r\n * const files = await storage.list(\"uploads\");\r\n *\r\n * // Recursive listing with limit\r\n * const files = await storage.list(\"uploads\", {\r\n * recursive: true,\r\n * limit: 100\r\n * });\r\n * ```\r\n */\r\n public async list(directory?: string, options?: ListOptions): Promise<StorageFileInfo[]> {\r\n return this.activeDriver.list(directory || \"\", options);\r\n }\r\n\r\n // ============================================================\r\n // URL Operations\r\n // ============================================================\r\n\r\n /**\r\n * Get the public URL for a file\r\n *\r\n * Returns the URL where the file can be accessed. For local storage,\r\n * this is typically a path prefix. For cloud storage, this is the\r\n * bucket URL or CDN URL.\r\n *\r\n * @param location - File path\r\n * @returns Public URL string\r\n *\r\n * @example\r\n * ```typescript\r\n * const url = storage.url(\"images/photo.jpg\");\r\n * // Local: \"/uploads/images/photo.jpg\"\r\n * // S3: \"https://bucket.s3.amazonaws.com/images/photo.jpg\"\r\n * ```\r\n */\r\n public url(location: string): string {\r\n return this.activeDriver.url(location);\r\n }\r\n\r\n /**\r\n * Get a temporary signed URL with expiration\r\n *\r\n * Creates a URL that provides temporary access to the file.\r\n * For cloud storage, this uses presigned URLs.\r\n * For local storage, this uses HMAC-signed tokens.\r\n *\r\n * @param location - File path\r\n * @param expiresIn - Seconds until URL expires (default: 3600)\r\n * @returns Signed URL string\r\n *\r\n * @example\r\n * ```typescript\r\n * // URL valid for 1 hour\r\n * const url = await storage.temporaryUrl(\"private/document.pdf\");\r\n *\r\n * // URL valid for 24 hours\r\n * const url = await storage.temporaryUrl(\"private/document.pdf\", 86400);\r\n * ```\r\n */\r\n public async temporaryUrl(location: string, expiresIn?: number): Promise<string> {\r\n return this.activeDriver.temporaryUrl(location, expiresIn);\r\n }\r\n\r\n // ============================================================\r\n // Metadata Operations\r\n // ============================================================\r\n\r\n /**\r\n * Get file metadata without downloading the file\r\n *\r\n * Retrieves information about a file including size, last modified date,\r\n * and MIME type without downloading the file contents.\r\n *\r\n * @param location - File path\r\n * @returns File information object\r\n * @throws Error if file not found\r\n *\r\n * @example\r\n * ```typescript\r\n * const info = await storage.metadata(\"documents/report.pdf\");\r\n * console.log(`Size: ${info.size} bytes`);\r\n * console.log(`Type: ${info.mimeType}`);\r\n * console.log(`Modified: ${info.lastModified}`);\r\n * ```\r\n */\r\n public async metadata(location: string): Promise<StorageFileInfo> {\r\n return this.activeDriver.metadata(location);\r\n }\r\n\r\n /**\r\n * Get file size in bytes\r\n *\r\n * Shortcut for `metadata(location).size`.\r\n *\r\n * @param location - File path\r\n * @returns File size in bytes\r\n * @throws Error if file not found\r\n */\r\n public async size(location: string): Promise<number> {\r\n return this.activeDriver.size(location);\r\n }\r\n\r\n /**\r\n * Get a StorageFile instance for OOP-style operations\r\n *\r\n * Creates a `StorageFile` wrapper for the specified path,\r\n * allowing fluent method chaining for file operations.\r\n *\r\n * @param location - File path\r\n * @returns StorageFile instance\r\n *\r\n * @example\r\n * ```typescript\r\n * const file = await storage.file(\"uploads/image.jpg\");\r\n *\r\n * // Properties\r\n * console.log(file.name); // \"image.jpg\"\r\n * console.log(file.extension); // \"jpg\"\r\n *\r\n * // Operations\r\n * await file.copy(\"backup/image.jpg\");\r\n * await file.delete();\r\n * ```\r\n */\r\n public file(location: string): StorageFile {\r\n return new StorageFile(location, this.activeDriver);\r\n }\r\n\r\n // ============================================================\r\n // Utilities\r\n // ============================================================\r\n\r\n /**\r\n * Convert various input types to Buffer\r\n *\r\n * @param file - Input file in various formats\r\n * @returns Buffer containing file contents\r\n * @internal\r\n */\r\n protected async toBuffer(file: UploadedFile | Buffer | string | Readable): Promise<Buffer> {\r\n // Already a buffer\r\n if (Buffer.isBuffer(file)) {\r\n return file;\r\n }\r\n\r\n // Readable stream - collect into buffer\r\n if (this.isReadable(file)) {\r\n return this.streamToBuffer(file as Readable);\r\n }\r\n\r\n // String content\r\n if (typeof file === \"string\") {\r\n if (await fileExistsAsync(file)) {\r\n return fs.readFile(file);\r\n }\r\n\r\n return Buffer.from(file);\r\n }\r\n\r\n // UploadedFile\r\n return (file as UploadedFile).buffer();\r\n }\r\n\r\n /**\r\n * Check if value is a Readable stream\r\n *\r\n * @param value - Value to check\r\n * @returns True if value is a Readable stream\r\n * @internal\r\n */\r\n protected isReadable(value: unknown): value is Readable {\r\n return (\r\n typeof value === \"object\" &&\r\n value !== null &&\r\n \"pipe\" in value &&\r\n typeof (value as Readable).pipe === \"function\"\r\n );\r\n }\r\n\r\n /**\r\n * Convert a Readable stream to Buffer\r\n *\r\n * @param stream - Readable stream\r\n * @returns Buffer containing stream contents\r\n * @internal\r\n */\r\n protected async streamToBuffer(stream: Readable): Promise<Buffer> {\r\n const chunks: Buffer[] = [];\r\n for await (const chunk of stream) {\r\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\r\n }\r\n return Buffer.concat(chunks as unknown as Uint8Array[]);\r\n }\r\n\r\n /**\r\n * Prepend a prefix to a location path\r\n *\r\n * Useful for organizing files into directories.\r\n *\r\n * @param prefix - Prefix to add (e.g., \"uploads\")\r\n * @param location - Original location path\r\n * @returns Combined path with prefix\r\n *\r\n * @example\r\n * ```typescript\r\n * storage.prepend(\"uploads\", \"image.jpg\"); // \"uploads/image.jpg\"\r\n * storage.prepend(\"uploads/\", \"/image.jpg\"); // \"uploads/image.jpg\"\r\n * ```\r\n */\r\n public prepend(prefix: string, location: string): string {\r\n return `${prefix.replace(/\\/$/, \"\")}/${location.replace(/^\\//, \"\")}`;\r\n }\r\n\r\n /**\r\n * Append a suffix to a location path (before extension)\r\n *\r\n * Useful for creating variants of files (thumbnails, etc.).\r\n *\r\n * @param location - Original location path\r\n * @param suffix - Suffix to add before extension\r\n * @returns Path with suffix added before extension\r\n *\r\n * @example\r\n * ```typescript\r\n * storage.append(\"image.jpg\", \"_thumb\"); // \"image_thumb.jpg\"\r\n * storage.append(\"document.pdf\", \"_v2\"); // \"document_v2.pdf\"\r\n * ```\r\n */\r\n public append(location: string, suffix: string): string {\r\n const lastDot = location.lastIndexOf(\".\");\r\n if (lastDot === -1) {\r\n return `${location}${suffix}`;\r\n }\r\n return `${location.substring(0, lastDot)}${suffix}${location.substring(lastDot)}`;\r\n }\r\n}\r\n"],"mappings":"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"}
1
+ {"version":3,"file":"scoped-storage.mjs","names":["fs"],"sources":["../../../../../../../@warlock.js/core/src/storage/scoped-storage.ts"],"sourcesContent":["import { fileExistsAsync } from \"@warlock.js/fs\";\r\nimport { createReadStream } from \"fs\";\r\nimport fs from \"fs/promises\";\r\nimport path from \"path\";\r\nimport type { Readable } from \"stream\";\r\nimport type { UploadedFile } from \"../http\";\r\nimport { StorageFile } from \"./storage-file\";\r\nimport type {\r\n DeleteManyResult,\r\n ListOptions,\r\n PutDirectoryOptions,\r\n PutDirectoryResult,\r\n PutOptions,\r\n ScopedStorageContract,\r\n StorageDriverContract,\r\n StorageDriverType,\r\n StorageFileInfo,\r\n} from \"./types\";\r\n\r\n/**\r\n * ScopedStorage - Base class for storage operations\r\n *\r\n * Wraps a storage driver and provides a consistent, developer-friendly API\r\n * that returns `StorageFile` instances instead of raw data objects.\r\n *\r\n * This class serves as the base for both direct driver usage and the\r\n * full `Storage` manager class.\r\n *\r\n * @example\r\n * ```typescript\r\n * // Using via storage.use()\r\n * const s3Storage = storage.use(\"s3\");\r\n * const file = await s3Storage.put(buffer, \"images/photo.jpg\");\r\n *\r\n * // file is a StorageFile instance with rich API\r\n * console.log(file.name); // \"photo.jpg\"\r\n * console.log(file.url); // \"https://...\"\r\n * await file.copy(\"backup/photo.jpg\");\r\n * ```\r\n */\r\nexport class ScopedStorage implements ScopedStorageContract {\r\n /**\r\n * The underlying storage driver instance\r\n * @internal\r\n */\r\n protected _driver: StorageDriverContract;\r\n\r\n /**\r\n * Create a new ScopedStorage instance\r\n *\r\n * @param driver - The storage driver to wrap\r\n */\r\n public constructor(driver: StorageDriverContract) {\r\n this._driver = driver;\r\n }\r\n\r\n // ============================================================\r\n // Properties\r\n // ============================================================\r\n\r\n /**\r\n * Get the driver name\r\n *\r\n * @returns The name identifier of the underlying driver (e.g., \"local\", \"s3\", \"r2\")\r\n */\r\n public get name(): StorageDriverType {\r\n return this.activeDriver.name;\r\n }\r\n\r\n /**\r\n * Get the default driver instance\r\n *\r\n * Use this for advanced operations that require direct driver access.\r\n *\r\n * @returns The raw storage driver\r\n */\r\n public get defaultDriver(): StorageDriverContract {\r\n return this._driver;\r\n }\r\n\r\n /**\r\n * Get the currently active driver\r\n *\r\n * Returns the driver being used for storage operations.\r\n * Can be overridden in subclasses for dynamic driver resolution (e.g., multi-tenant contexts).\r\n *\r\n * @returns The active storage driver\r\n */\r\n public get activeDriver(): StorageDriverContract {\r\n return this._driver;\r\n }\r\n\r\n // ============================================================\r\n // File Operations\r\n // ============================================================\r\n\r\n /**\r\n * Store a file in storage\r\n *\r\n * Accepts multiple input types and stores the file at the specified location.\r\n * Returns a `StorageFile` instance for further operations.\r\n *\r\n * @param file - File content as Buffer, string path, UploadedFile, or Readable stream\r\n * @param location - Destination path in storage (e.g., \"uploads/images/photo.jpg\")\r\n * @param options - Optional storage options\r\n * @returns StorageFile instance with cached metadata\r\n *\r\n * @example\r\n * ```typescript\r\n * // From buffer\r\n * const file = await storage.put(buffer, \"documents/report.pdf\");\r\n *\r\n * // From uploaded file\r\n * const file = await storage.put(uploadedFile, \"avatars/user-123.jpg\");\r\n *\r\n * // With options\r\n * const file = await storage.put(buffer, \"images/photo.jpg\", {\r\n * mimeType: \"image/jpeg\",\r\n * cacheControl: \"max-age=31536000\"\r\n * });\r\n * ```\r\n */\r\n public async put(\r\n file: UploadedFile | Buffer | string | Readable,\r\n location: string,\r\n options?: PutOptions,\r\n ): Promise<StorageFile> {\r\n const buffer = await this.toBuffer(file);\r\n const data = await this.activeDriver.put(buffer, location, options);\r\n return StorageFile.fromData(data, this.activeDriver);\r\n }\r\n\r\n /**\r\n * Store a file from a readable stream\r\n *\r\n * Optimized for large files - streams data directly without full buffering.\r\n * Ideal for file uploads, remote file fetching, or processing pipelines.\r\n *\r\n * @param stream - Readable stream of file content\r\n * @param location - Destination path in storage\r\n * @param options - Optional storage options\r\n * @returns StorageFile instance with cached metadata\r\n *\r\n * @example\r\n * ```typescript\r\n * import { createReadStream } from \"fs\";\r\n *\r\n * const stream = createReadStream(\"./large-video.mp4\");\r\n * const file = await storage.putStream(stream, \"videos/upload.mp4\");\r\n * ```\r\n */\r\n public async putStream(\r\n stream: Readable,\r\n location: string,\r\n options?: PutOptions,\r\n ): Promise<StorageFile> {\r\n const data = await this.activeDriver.putStream(stream, location, options);\r\n return StorageFile.fromData(data, this.activeDriver);\r\n }\r\n\r\n /**\r\n * Store a file from a URL\r\n *\r\n * Downloads the file from the URL and stores it.\r\n *\r\n * @param url - URL to download from\r\n * @param location - Destination path in storage\r\n * @param options - Optional storage options\r\n * @returns StorageFile instance\r\n *\r\n * @example\r\n * ```typescript\r\n * const file = await storage.putFromUrl(\r\n * \"https://example.com/image.jpg\",\r\n * \"images/downloaded.jpg\"\r\n * );\r\n * ```\r\n */\r\n public async putFromUrl(\r\n url: string,\r\n location: string,\r\n options?: PutOptions,\r\n ): Promise<StorageFile> {\r\n const response = await fetch(url);\r\n\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch file from ${url}: ${response.statusText}`);\r\n }\r\n\r\n const buffer = Buffer.from(await response.arrayBuffer());\r\n return this.put(buffer, location, options);\r\n }\r\n\r\n /**\r\n * Store a file from base64 data URL\r\n *\r\n * @param dataUrl - Data URL (data:image/png;base64,iVBORw0KG...)\r\n * @param location - Destination path in storage\r\n * @param options - Optional storage options\r\n * @returns StorageFile instance\r\n *\r\n * @example\r\n * ```typescript\r\n * const file = await storage.putFromBase64(\r\n * \"data:image/png;base64,iVBORw0KGgoAAAANS...\",\r\n * \"images/upload.png\"\r\n * );\r\n * ```\r\n */\r\n public async putFromBase64(\r\n dataUrl: string,\r\n location: string,\r\n options?: PutOptions,\r\n ): Promise<StorageFile> {\r\n // Parse data URL: data:image/png;base64,iVBORw0KG...\r\n const matches = dataUrl.match(/^data:([^;]+);base64,(.+)$/);\r\n\r\n if (!matches) {\r\n throw new Error(\"Invalid base64 data URL format. Expected: data:mime/type;base64,<data>\");\r\n }\r\n\r\n const [, mimeType, base64Data] = matches;\r\n const buffer = Buffer.from(base64Data, \"base64\");\r\n\r\n return this.put(buffer, location, {\r\n ...options,\r\n mimeType: options?.mimeType || mimeType,\r\n });\r\n }\r\n\r\n /**\r\n * Retrieve file contents as a Buffer\r\n *\r\n * Downloads the entire file into memory. For large files,\r\n * consider using `getStream()` instead.\r\n *\r\n * @param location - Path to the file in storage\r\n * @returns Buffer containing file contents\r\n * @throws Error if file not found\r\n *\r\n * @example\r\n * ```typescript\r\n * const buffer = await storage.get(\"documents/report.pdf\");\r\n * const content = buffer.toString(\"utf-8\");\r\n * ```\r\n */\r\n public async get(location: string): Promise<Buffer> {\r\n return this.activeDriver.get(location);\r\n }\r\n\r\n /**\r\n * Retrieve file contents as a readable stream\r\n *\r\n * Streams file data without loading entire file into memory.\r\n * Ideal for large files or when piping to a response.\r\n *\r\n * @param location - Path to the file in storage\r\n * @returns Readable stream of file contents\r\n * @throws Error if file not found\r\n *\r\n * @example\r\n * ```typescript\r\n * const stream = await storage.getStream(\"videos/large.mp4\");\r\n * stream.pipe(response.raw);\r\n * ```\r\n */\r\n public async getStream(location: string): Promise<Readable> {\r\n return this.activeDriver.getStream(location);\r\n }\r\n\r\n /**\r\n * Delete a file from storage\r\n *\r\n * @param location - Path to the file, or a StorageFile instance\r\n * @returns `true` if deleted, `false` if file not found\r\n *\r\n * @example\r\n * ```typescript\r\n * // By path\r\n * await storage.delete(\"temp/old-file.txt\");\r\n *\r\n * // From StorageFile instance\r\n * const file = await storage.put(buffer, \"temp/file.txt\");\r\n * await storage.delete(file);\r\n * ```\r\n */\r\n public async delete(location: string | StorageFile): Promise<boolean> {\r\n const path = typeof location === \"string\" ? location : location.path;\r\n return this.activeDriver.delete(path);\r\n }\r\n\r\n /**\r\n * Delete multiple files at once\r\n *\r\n * Performs batch deletion for efficiency. Returns results for each file\r\n * including success/failure status.\r\n *\r\n * @param locations - Array of file paths to delete\r\n * @returns Array of delete results with status for each file\r\n *\r\n * @example\r\n * ```typescript\r\n * const results = await storage.deleteMany([\r\n * \"temp/file1.txt\",\r\n * \"temp/file2.txt\",\r\n * \"temp/file3.txt\"\r\n * ]);\r\n *\r\n * for (const result of results) {\r\n * console.log(`${result.location}: ${result.deleted ? \"deleted\" : result.error}`);\r\n * }\r\n * ```\r\n */\r\n public async deleteMany(locations: string[]): Promise<DeleteManyResult[]> {\r\n return this.activeDriver.deleteMany(locations);\r\n }\r\n\r\n /**\r\n * Delete a directory\r\n *\r\n * @param directoryPath - Path to the directory\r\n */\r\n public async deleteDirectory(directoryPath: string): Promise<boolean> {\r\n return await this.activeDriver.deleteDirectory(directoryPath);\r\n }\r\n\r\n /**\r\n * Check if a file exists in storage\r\n *\r\n * @param location - Path to check\r\n * @returns `true` if file exists, `false` otherwise\r\n *\r\n * @example\r\n * ```typescript\r\n * if (await storage.exists(\"config/settings.json\")) {\r\n * const config = await storage.get(\"config/settings.json\");\r\n * }\r\n * ```\r\n */\r\n public async exists(location: string): Promise<boolean> {\r\n return this.activeDriver.exists(location);\r\n }\r\n\r\n /**\r\n * Copy a file to a new location\r\n *\r\n * Creates a copy of the file at the destination path.\r\n * The original file remains unchanged.\r\n *\r\n * @param from - Source path or StorageFile instance\r\n * @param to - Destination path\r\n * @returns StorageFile instance at the new location\r\n *\r\n * @example\r\n * ```typescript\r\n * // Copy by path\r\n * const backup = await storage.copy(\"documents/report.pdf\", \"backups/report.pdf\");\r\n *\r\n * // Copy from StorageFile\r\n * const original = await storage.file(\"documents/report.pdf\");\r\n * const backup = await storage.copy(original, \"backups/report.pdf\");\r\n * ```\r\n */\r\n public async copy(from: string | StorageFile, to: string): Promise<StorageFile> {\r\n const fromPath = typeof from === \"string\" ? from : from.path;\r\n const data = await this.activeDriver.copy(fromPath, to);\r\n return StorageFile.fromData(data, this.activeDriver);\r\n }\r\n\r\n /**\r\n * Move a file to a new location\r\n *\r\n * Moves the file to the destination path. The original file\r\n * is deleted after successful copy.\r\n *\r\n * @param from - Source path or StorageFile instance\r\n * @param to - Destination path\r\n * @returns StorageFile instance at the new location\r\n *\r\n * @example\r\n * ```typescript\r\n * // Move by path\r\n * const file = await storage.move(\"uploads/temp.jpg\", \"images/photo.jpg\");\r\n *\r\n * // Move from StorageFile\r\n * const temp = await storage.file(\"uploads/temp.jpg\");\r\n * const final = await storage.move(temp, \"images/photo.jpg\");\r\n * ```\r\n */\r\n public async move(from: string | StorageFile, to: string): Promise<StorageFile> {\r\n const fromPath = typeof from === \"string\" ? from : from.path;\r\n const data = await this.activeDriver.move(fromPath, to);\r\n return StorageFile.fromData(data, this.activeDriver);\r\n }\r\n\r\n /**\r\n * Copy an entire directory recursively\r\n *\r\n * Copies all files from the source directory to the destination directory,\r\n * preserving the directory structure.\r\n *\r\n * @param from - Source directory path\r\n * @param to - Destination directory path\r\n * @param options - Optional concurrency control\r\n * @returns Number of files copied\r\n *\r\n * @example\r\n * ```typescript\r\n * // Copy entire directory\r\n * const count = await storage.copyDirectory(\"uploads/temp\", \"uploads/final\");\r\n * console.log(`Copied ${count} files`);\r\n *\r\n * // With concurrency limit\r\n * const count = await storage.copyDirectory(\"large-dir\", \"backup\", {\r\n * concurrency: 10\r\n * });\r\n * ```\r\n */\r\n public async copyDirectory(\r\n from: string,\r\n to: string,\r\n options?: { concurrency?: number },\r\n ): Promise<number> {\r\n const concurrency = options?.concurrency || 5;\r\n\r\n // List all files recursively\r\n const files = await this.list(from, { recursive: true });\r\n const filesToCopy = files.filter((f) => !f.isDirectory);\r\n\r\n // Copy files in batches for efficiency\r\n let copied = 0;\r\n for (let i = 0; i < filesToCopy.length; i += concurrency) {\r\n const batch = filesToCopy.slice(i, i + concurrency);\r\n await Promise.all(\r\n batch.map(async (file) => {\r\n // Calculate relative path and new destination\r\n const relativePath = file.path.substring(from.length).replace(/^\\//, \"\");\r\n const newPath = `${to}/${relativePath}`;\r\n await this.copy(file.path, newPath);\r\n copied++;\r\n }),\r\n );\r\n }\r\n\r\n return copied;\r\n }\r\n\r\n /**\r\n * Move an entire directory recursively\r\n *\r\n * Moves all files from the source directory to the destination directory,\r\n * then deletes the source directory.\r\n *\r\n * @param from - Source directory path\r\n * @param to - Destination directory path\r\n * @param options - Optional concurrency control\r\n * @returns Number of files moved\r\n *\r\n * @example\r\n * ```typescript\r\n * const count = await storage.moveDirectory(\"uploads/temp\", \"uploads/final\");\r\n * console.log(`Moved ${count} files`);\r\n * ```\r\n */\r\n public async moveDirectory(\r\n from: string,\r\n to: string,\r\n options?: { concurrency?: number },\r\n ): Promise<number> {\r\n // Copy all files first\r\n const count = await this.copyDirectory(from, to, options);\r\n\r\n // Delete source directory\r\n await this.deleteDirectory(from);\r\n\r\n return count;\r\n }\r\n\r\n /**\r\n * Upload a local filesystem directory into storage\r\n *\r\n * Recursively walks the local directory, applies an optional filter, then\r\n * streams each file into storage. Uploads run in concurrent batches for\r\n * efficiency. Failures are collected — a single failed file never aborts\r\n * the entire operation (mirrors the contract of `deleteMany`).\r\n *\r\n * @param localDirPath - Absolute path of the local directory to upload\r\n * @param destination - Target prefix in storage (e.g. \"uploads/assets\")\r\n * @param options - Concurrency, filter, progress callback, put options\r\n * @returns - { uploaded, failed, total }\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = await storage.putDirectory(\"./public/assets\", \"cdn/assets\", {\r\n * concurrency: 10,\r\n * filter: (_, rel) => !rel.startsWith(\".\"),\r\n * onProgress: (done, total) => console.log(`${done}/${total}`),\r\n * });\r\n *\r\n * console.log(`Uploaded: ${result.uploaded.length}, Failed: ${result.failed.length}`);\r\n * ```\r\n */\r\n public async putDirectory(\r\n localDirPath: string,\r\n destination: string,\r\n options?: PutDirectoryOptions,\r\n ): Promise<PutDirectoryResult> {\r\n const concurrency = options?.concurrency ?? 5;\r\n\r\n // Collect all local file paths recursively\r\n const localFiles = await this.walkLocalDirectory(localDirPath);\r\n\r\n // Apply the user-supplied filter if any\r\n const filteredFiles = options?.filter\r\n ? localFiles.filter(({ absolute, relative }) => options.filter!(absolute, relative))\r\n : localFiles;\r\n\r\n const total = filteredFiles.length;\r\n const uploaded: StorageFile[] = [];\r\n const failed: Array<{ localPath: string; error: Error }> = [];\r\n let doneCount = 0;\r\n\r\n // Upload in concurrent batches\r\n for (let i = 0; i < filteredFiles.length; i += concurrency) {\r\n const batch = filteredFiles.slice(i, i + concurrency);\r\n\r\n await Promise.all(\r\n batch.map(async ({ absolute, relative }) => {\r\n const storagePath = `${destination.replace(/\\/$/, \"\")}/${relative}`;\r\n\r\n try {\r\n const stream = createReadStream(absolute);\r\n const file = await this.putStream(stream, storagePath, options?.putOptions);\r\n uploaded.push(file);\r\n doneCount++;\r\n options?.onProgress?.(doneCount, total, file);\r\n } catch (err) {\r\n failed.push({\r\n localPath: absolute,\r\n error: err instanceof Error ? err : new Error(String(err)),\r\n });\r\n }\r\n }),\r\n );\r\n }\r\n\r\n return { uploaded, failed, total };\r\n }\r\n\r\n /**\r\n * Walk a local directory recursively and return all file paths\r\n *\r\n * @param dirPath - Absolute local directory path\r\n * @returns Array of { absolute, relative } file path pairs\r\n * @internal\r\n */\r\n private async walkLocalDirectory(\r\n dirPath: string,\r\n baseDir?: string,\r\n ): Promise<Array<{ absolute: string; relative: string }>> {\r\n const root = baseDir ?? dirPath;\r\n const entries = await fs.readdir(dirPath, { withFileTypes: true });\r\n const results: Array<{ absolute: string; relative: string }> = [];\r\n\r\n for (const entry of entries) {\r\n const absolute = path.join(dirPath, entry.name);\r\n const relative = path.relative(root, absolute).replace(/\\\\/g, \"/\");\r\n\r\n if (entry.isDirectory()) {\r\n const nested = await this.walkLocalDirectory(absolute, root);\r\n results.push(...nested);\r\n } else if (entry.isFile()) {\r\n results.push({ absolute, relative });\r\n }\r\n // Symlinks are intentionally skipped\r\n }\r\n\r\n return results;\r\n }\r\n\r\n /**\r\n * Empty a directory without deleting the directory itself\r\n *\r\n * Deletes all files within the directory but preserves the directory structure.\r\n *\r\n * @param path - Directory path to empty\r\n * @returns Number of files deleted\r\n *\r\n * @example\r\n * ```typescript\r\n * const count = await storage.emptyDirectory(\"uploads/temp\");\r\n * console.log(`Deleted ${count} files`);\r\n * ```\r\n */\r\n public async emptyDirectory(path: string): Promise<number> {\r\n // List all files in directory\r\n const files = await this.list(path, { recursive: true });\r\n const filePaths = files.filter((f) => !f.isDirectory).map((f) => f.path);\r\n\r\n if (filePaths.length === 0) {\r\n return 0;\r\n }\r\n\r\n // Delete all files\r\n await this.deleteMany(filePaths);\r\n\r\n return filePaths.length;\r\n }\r\n\r\n /**\r\n * List files in a directory\r\n *\r\n * Returns file information for all files in the specified directory.\r\n * Supports recursive listing and pagination.\r\n *\r\n * @param directory - Directory path (defaults to root)\r\n * @param options - List options (recursive, limit, cursor)\r\n * @returns Array of file information objects\r\n *\r\n * @example\r\n * ```typescript\r\n * // List all files in uploads\r\n * const files = await storage.list(\"uploads\");\r\n *\r\n * // Recursive listing with limit\r\n * const files = await storage.list(\"uploads\", {\r\n * recursive: true,\r\n * limit: 100\r\n * });\r\n * ```\r\n */\r\n public async list(directory?: string, options?: ListOptions): Promise<StorageFileInfo[]> {\r\n return this.activeDriver.list(directory || \"\", options);\r\n }\r\n\r\n // ============================================================\r\n // URL Operations\r\n // ============================================================\r\n\r\n /**\r\n * Get the public URL for a file\r\n *\r\n * Returns the URL where the file can be accessed. For local storage,\r\n * this is typically a path prefix. For cloud storage, this is the\r\n * bucket URL or CDN URL.\r\n *\r\n * @param location - File path\r\n * @returns Public URL string\r\n *\r\n * @example\r\n * ```typescript\r\n * const url = storage.url(\"images/photo.jpg\");\r\n * // Local: \"/uploads/images/photo.jpg\"\r\n * // S3: \"https://bucket.s3.amazonaws.com/images/photo.jpg\"\r\n * ```\r\n */\r\n public url(location: string): string {\r\n return this.activeDriver.url(location);\r\n }\r\n\r\n /**\r\n * Get a temporary signed URL with expiration\r\n *\r\n * Creates a URL that provides temporary access to the file.\r\n * For cloud storage, this uses presigned URLs.\r\n * For local storage, this uses HMAC-signed tokens.\r\n *\r\n * @param location - File path\r\n * @param expiresIn - Seconds until URL expires (default: 3600)\r\n * @returns Signed URL string\r\n *\r\n * @example\r\n * ```typescript\r\n * // URL valid for 1 hour\r\n * const url = await storage.temporaryUrl(\"private/document.pdf\");\r\n *\r\n * // URL valid for 24 hours\r\n * const url = await storage.temporaryUrl(\"private/document.pdf\", 86400);\r\n * ```\r\n */\r\n public async temporaryUrl(location: string, expiresIn?: number): Promise<string> {\r\n return this.activeDriver.temporaryUrl(location, expiresIn);\r\n }\r\n\r\n // ============================================================\r\n // Metadata Operations\r\n // ============================================================\r\n\r\n /**\r\n * Get file metadata without downloading the file\r\n *\r\n * Retrieves information about a file including size, last modified date,\r\n * and MIME type without downloading the file contents.\r\n *\r\n * @param location - File path\r\n * @returns File information object\r\n * @throws Error if file not found\r\n *\r\n * @example\r\n * ```typescript\r\n * const info = await storage.metadata(\"documents/report.pdf\");\r\n * console.log(`Size: ${info.size} bytes`);\r\n * console.log(`Type: ${info.mimeType}`);\r\n * console.log(`Modified: ${info.lastModified}`);\r\n * ```\r\n */\r\n public async metadata(location: string): Promise<StorageFileInfo> {\r\n return this.activeDriver.metadata(location);\r\n }\r\n\r\n /**\r\n * Get file size in bytes\r\n *\r\n * Shortcut for `metadata(location).size`.\r\n *\r\n * @param location - File path\r\n * @returns File size in bytes\r\n * @throws Error if file not found\r\n */\r\n public async size(location: string): Promise<number> {\r\n return this.activeDriver.size(location);\r\n }\r\n\r\n /**\r\n * Get a StorageFile instance for OOP-style operations\r\n *\r\n * Creates a `StorageFile` wrapper for the specified path,\r\n * allowing fluent method chaining for file operations.\r\n *\r\n * @param location - File path\r\n * @returns StorageFile instance\r\n *\r\n * @example\r\n * ```typescript\r\n * const file = await storage.file(\"uploads/image.jpg\");\r\n *\r\n * // Properties\r\n * console.log(file.name); // \"image.jpg\"\r\n * console.log(file.extension); // \"jpg\"\r\n *\r\n * // Operations\r\n * await file.copy(\"backup/image.jpg\");\r\n * await file.delete();\r\n * ```\r\n */\r\n public file(location: string): StorageFile {\r\n return new StorageFile(location, this.activeDriver);\r\n }\r\n\r\n // ============================================================\r\n // Utilities\r\n // ============================================================\r\n\r\n /**\r\n * Convert various input types to Buffer\r\n *\r\n * @param file - Input file in various formats\r\n * @returns Buffer containing file contents\r\n * @internal\r\n */\r\n protected async toBuffer(file: UploadedFile | Buffer | string | Readable): Promise<Buffer> {\r\n // Already a buffer\r\n if (Buffer.isBuffer(file)) {\r\n return file;\r\n }\r\n\r\n // Readable stream - collect into buffer\r\n if (this.isReadable(file)) {\r\n return this.streamToBuffer(file as Readable);\r\n }\r\n\r\n // String content\r\n if (typeof file === \"string\") {\r\n if (await fileExistsAsync(file)) {\r\n return fs.readFile(file);\r\n }\r\n\r\n return Buffer.from(file);\r\n }\r\n\r\n // UploadedFile\r\n return (file as UploadedFile).buffer();\r\n }\r\n\r\n /**\r\n * Check if value is a Readable stream\r\n *\r\n * @param value - Value to check\r\n * @returns True if value is a Readable stream\r\n * @internal\r\n */\r\n protected isReadable(value: unknown): value is Readable {\r\n return (\r\n typeof value === \"object\" &&\r\n value !== null &&\r\n \"pipe\" in value &&\r\n typeof (value as Readable).pipe === \"function\"\r\n );\r\n }\r\n\r\n /**\r\n * Convert a Readable stream to Buffer\r\n *\r\n * @param stream - Readable stream\r\n * @returns Buffer containing stream contents\r\n * @internal\r\n */\r\n protected async streamToBuffer(stream: Readable): Promise<Buffer> {\r\n const chunks: Buffer[] = [];\r\n for await (const chunk of stream) {\r\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\r\n }\r\n return Buffer.concat(chunks as unknown as Uint8Array[]);\r\n }\r\n\r\n /**\r\n * Prepend a prefix to a location path\r\n *\r\n * Useful for organizing files into directories.\r\n *\r\n * @param prefix - Prefix to add (e.g., \"uploads\")\r\n * @param location - Original location path\r\n * @returns Combined path with prefix\r\n *\r\n * @example\r\n * ```typescript\r\n * storage.prepend(\"uploads\", \"image.jpg\"); // \"uploads/image.jpg\"\r\n * storage.prepend(\"uploads/\", \"/image.jpg\"); // \"uploads/image.jpg\"\r\n * ```\r\n */\r\n public prepend(prefix: string, location: string): string {\r\n return `${prefix.replace(/\\/$/, \"\")}/${location.replace(/^\\//, \"\")}`;\r\n }\r\n\r\n /**\r\n * Append a suffix to a location path (before extension)\r\n *\r\n * Useful for creating variants of files (thumbnails, etc.).\r\n *\r\n * @param location - Original location path\r\n * @param suffix - Suffix to add before extension\r\n * @returns Path with suffix added before extension\r\n *\r\n * @example\r\n * ```typescript\r\n * storage.append(\"image.jpg\", \"_thumb\"); // \"image_thumb.jpg\"\r\n * storage.append(\"document.pdf\", \"_v2\"); // \"document_v2.pdf\"\r\n * ```\r\n */\r\n public append(location: string, suffix: string): string {\r\n const lastDot = location.lastIndexOf(\".\");\r\n if (lastDot === -1) {\r\n return `${location}${suffix}`;\r\n }\r\n return `${location.substring(0, lastDot)}${suffix}${location.substring(lastDot)}`;\r\n }\r\n}\r\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { CloudStorageFileData, FileVisibility, StorageDriverContract, StorageFileData, StorageFileInfo } from "./types.mjs";
2
2
  import { Readable } from "stream";
3
3
 
4
- //#region ../../@warlock.js/core/src/storage/storage-file.d.ts
4
+ //#region ../@warlock.js/core/src/storage/storage-file.d.ts
5
5
  /**
6
6
  * StorageFile class - OOP wrapper for storage file operations
7
7
  *
@@ -1 +1 @@
1
- {"version":3,"file":"storage-file.d.mts","names":[],"sources":["../../../../../../@warlock.js/core/src/storage/storage-file.ts"],"mappings":";;;;;;AAqCA;;;;;;;;;;;;;;;;;;;;;;;;cAAa,WAAA;EA6P6B;;;EAAA,UAzP9B,KAAA;EAkS8C;;;EAAA,UA7R9C,OAAA,EAAS,qBAAA;EA4VX;;;EAAA,UAvVE,KAAA,GAAQ,eAAA;EAgWe;;;EAAA,UA3VvB,QAAA;EAmXQ;;;;;;;cA1WC,IAAA,UAAc,MAAA,EAAQ,qBAAA,EAAuB,IAAA,GAAO,eAAA;EAnB7D;;;EAAA,IAgCC,IAAA,CAAA;EAtBD;;;EAAA,IA6BC,IAAA,CAAA;EApBsB;;;EAAA,IA2BtB,SAAA,CAAA;EAPA;;;EAAA,IAcA,SAAA,CAAA;EAcA;;;EAAA,IAPA,MAAA,CAAA;EA6CE;;;EAAA,IAtCF,SAAA,CAAA;EA0DU;;;EAAA,IAnDV,GAAA,CAAA;EAmEkB;;;EAAA,IA3DlB,YAAA,CAAA;EAiFE;;;EAAA,IArEF,IAAA,CAAA;EA6EY;;;EAlEV,IAAA,CAAA,GAAQ,OAAA,CAAQ,eAAA;EAkFhB;;;EA9DA,IAAA,CAAA,GAAQ,OAAA;EAoFR;;;EA5EA,QAAA,CAAA,GAAY,OAAA;EAwFF;;;EAhFV,YAAA,CAAA,GAAgB,OAAA,CAAQ,IAAA;EA2FW;;;EAlFnC,IAAA,CAAA,GAAQ,OAAA;EA4GR;;;EA/FA,QAAA,CAAA,GAAY,OAAA,CAAQ,MAAA;EAyGV;;;EAjGV,MAAA,CAAA,GAAU,OAAA,CAAQ,QAAA;EAkHyB;;;EA1G3C,IAAA,CAAA,GAAQ,OAAA;EA0IR;;;EAlIA,MAAA,CAAA,GAAU,OAAA;EAgKT;;;EAxJD,OAAA,CAAA,GAAW,OAAA;EA0Jd;;;;;EA5IG,YAAA,CAAa,SAAA,YAAmB,OAAA;EA4JhC;;;EAhJA,MAAA,CAAA,GAAU,OAAA;EAgKV;;;;;;EArJA,IAAA,CAAK,WAAA,WAAsB,OAAA,CAAQ,WAAA;EAsL5B;;;;;;EA1KP,IAAA,CAAK,WAAA,WAAsB,OAAA;EA8LtC;;;;;;EAhLW,MAAA,CAAO,OAAA,WAAkB,OAAA;EAqMvB;;;;;EA3LF,MAAA,CAAA,GAAU,OAAA;;;;;;;EAiBV,aAAA,CAAc,UAAA,EAAY,cAAA,GAAiB,OAAA;;;;;;EAgB3C,aAAA,CAAA,GAAiB,OAAA,CAAQ,cAAA;;;;;;;EAgBzB,eAAA,CAAgB,YAAA,WAAuB,OAAA;;;;YAkB1C,gBAAA,CAAA;;;;;;;SAYI,QAAA,CACZ,IAAA,EAAM,eAAA,GAAkB,oBAAA,EACxB,MAAA,EAAQ,qBAAA,GACP,WAAA;;;;EAOU,QAAA,CAAA,GAAY,OAAA,CAAQ,eAAA;;;;EAQpB,OAAA,CAAA,GAAO,OAAA;;;;EAQP,UAAA,CAAA,GAAU,OAAA;;;;EAQV,KAAA,CAAA,GAAK,OAAA;;;;EAQL,OAAA,CAAA,GAAO,OAAA;;;;EAYP,KAAA,CAAA,GAAK,OAAA;;;;EAaL,OAAA,CAAA,GAAO,OAAA;;;;EAQP,OAAA,CAAA,GAAO,OAAA;;;;EAQb,MAAA,CAAA;IACL,IAAA;IACA,IAAA;IACA,SAAA;IACA,MAAA;IACA,GAAA;IACA,IAAA;IACA,IAAA;IACA,QAAA;EAAA;;;;EAiBK,QAAA,CAAA;AAAA"}
1
+ {"version":3,"file":"storage-file.d.mts","names":[],"sources":["../../../../../../../@warlock.js/core/src/storage/storage-file.ts"],"mappings":";;;;;;AAqCA;;;;;;;;;;;;;;;;;;;;;;;;cAAa,WAAA;EA6P6B;;;EAAA,UAzP9B,KAAA;EAkS8C;;;EAAA,UA7R9C,OAAA,EAAS,qBAAA;EA4VX;;;EAAA,UAvVE,KAAA,GAAQ,eAAA;EAgWe;;;EAAA,UA3VvB,QAAA;EAmXQ;;;;;;;cA1WC,IAAA,UAAc,MAAA,EAAQ,qBAAA,EAAuB,IAAA,GAAO,eAAA;EAnB7D;;;EAAA,IAgCC,IAAA;EAtBD;;;EAAA,IA6BC,IAAA;EApBsB;;;EAAA,IA2BtB,SAAA;EAPA;;;EAAA,IAcA,SAAA;EAcA;;;EAAA,IAPA,MAAA;EA6CE;;;EAAA,IAtCF,SAAA;EA0DU;;;EAAA,IAnDV,GAAA;EAmEkB;;;EAAA,IA3DlB,YAAA;EAiFE;;;EAAA,IArEF,IAAA;EA6EY;;;EAlEV,IAAA,IAAQ,OAAA,CAAQ,eAAA;EAkFhB;;;EA9DA,IAAA,IAAQ,OAAA;EAoFR;;;EA5EA,QAAA,IAAY,OAAA;EAwFF;;;EAhFV,YAAA,IAAgB,OAAA,CAAQ,IAAA;EA2FW;;;EAlFnC,IAAA,IAAQ,OAAA;EA4GR;;;EA/FA,QAAA,IAAY,OAAA,CAAQ,MAAA;EAyGV;;;EAjGV,MAAA,IAAU,OAAA,CAAQ,QAAA;EAkHyB;;;EA1G3C,IAAA,IAAQ,OAAA;EA0IR;;;EAlIA,MAAA,IAAU,OAAA;EAgKT;;;EAxJD,OAAA,IAAW,OAAA;EA0Jd;;;;;EA5IG,YAAA,CAAa,SAAA,YAAmB,OAAA;EA4JhC;;;EAhJA,MAAA,IAAU,OAAA;EAgKV;;;;;;EArJA,IAAA,CAAK,WAAA,WAAsB,OAAA,CAAQ,WAAA;EAsL5B;;;;;;EA1KP,IAAA,CAAK,WAAA,WAAsB,OAAA;EA8LtC;;;;;;EAhLW,MAAA,CAAO,OAAA,WAAkB,OAAA;EAqMvB;;;;;EA3LF,MAAA,IAAU,OAAA;;;;;;;EAiBV,aAAA,CAAc,UAAA,EAAY,cAAA,GAAiB,OAAA;;;;;;EAgB3C,aAAA,IAAiB,OAAA,CAAQ,cAAA;;;;;;;EAgBzB,eAAA,CAAgB,YAAA,WAAuB,OAAA;;;;YAkB1C,gBAAA;;;;;;;SAYI,QAAA,CACZ,IAAA,EAAM,eAAA,GAAkB,oBAAA,EACxB,MAAA,EAAQ,qBAAA,GACP,WAAA;;;;EAOU,QAAA,IAAY,OAAA,CAAQ,eAAA;;;;EAQpB,OAAA,IAAO,OAAA;;;;EAQP,UAAA,IAAU,OAAA;;;;EAQV,KAAA,IAAK,OAAA;;;;EAQL,OAAA,IAAO,OAAA;;;;EAYP,KAAA,IAAK,OAAA;;;;EAaL,OAAA,IAAO,OAAA;;;;EAQP,OAAA,IAAO,OAAA;;;;EAQb,MAAA;IACL,IAAA;IACA,IAAA;IACA,SAAA;IACA,MAAA;IACA,GAAA;IACA,IAAA;IACA,IAAA;IACA,QAAA;EAAA;;;;EAiBK,QAAA;AAAA"}
@@ -1,6 +1,6 @@
1
1
  import { basename, dirname, extname } from "path";
2
2
 
3
- //#region ../../@warlock.js/core/src/storage/storage-file.ts
3
+ //#region ../@warlock.js/core/src/storage/storage-file.ts
4
4
  /**
5
5
  * StorageFile class - OOP wrapper for storage file operations
6
6
  *
@@ -1 +1 @@
1
- {"version":3,"file":"storage-file.mjs","names":[],"sources":["../../../../../../@warlock.js/core/src/storage/storage-file.ts"],"sourcesContent":["import { basename, dirname, extname } from \"path\";\nimport type { Readable } from \"stream\";\nimport type {\n CloudStorageDriverContract,\n CloudStorageFileData,\n FileVisibility,\n StorageDriverContract,\n StorageFileData,\n StorageFileInfo,\n} from \"./types\";\n\n/**\n * StorageFile class - OOP wrapper for storage file operations\n *\n * Provides a fluent interface for working with files in storage,\n * wrapping the underlying driver operations.\n *\n * @example\n * ```typescript\n * const file = await storage.put(buffer, \"uploads/image.jpg\");\n *\n * // Properties (sync, from cached data)\n * file.name // \"image.jpg\"\n * file.extension // \"jpg\"\n * file.path // \"uploads/image.jpg\"\n * file.hash // \"sha256:abc123...\"\n *\n * // Operations\n * await file.copy(\"uploads/backup.jpg\")\n * await file.move(\"archive/image.jpg\")\n * await file.delete()\n *\n * // Content\n * const buffer = await file.contents();\n * const stream = await file.stream();\n * ```\n */\nexport class StorageFile {\n /**\n * Relative file path\n */\n protected _path: string;\n\n /**\n * The driver instance\n */\n protected _driver: StorageDriverContract;\n\n /**\n * Cached file data (from put operations or lazy loaded)\n */\n protected _data?: StorageFileData;\n\n /**\n * Whether the file has been deleted\n */\n protected _deleted = false;\n\n /**\n * Create a new StorageFile instance\n *\n * @param path - Relative file path\n * @param driver - Driver instance\n * @param data - Optional initial data from put/copy operations\n */\n public constructor(path: string, driver: StorageDriverContract, data?: StorageFileData) {\n this._path = path;\n this._driver = driver;\n this._data = data;\n }\n\n // ============================================================\n // Properties\n // ============================================================\n\n /**\n * Get the relative file path\n */\n public get path(): string {\n return this._path;\n }\n\n /**\n * Get the file name (with extension)\n */\n public get name(): string {\n return basename(this._path);\n }\n\n /**\n * Get the file extension (without dot)\n */\n public get extension(): string {\n return extname(this._path).slice(1).toLowerCase();\n }\n\n /**\n * Get the directory path\n */\n public get directory(): string {\n return dirname(this._path);\n }\n\n /**\n * Get the driver name\n */\n public get driver(): string {\n return this._driver.name;\n }\n\n /**\n * Check if file has been deleted\n */\n public get isDeleted(): boolean {\n return this._deleted;\n }\n\n /**\n * Get public URL (sync if data cached, otherwise computed)\n */\n public get url(): string {\n this.ensureNotDeleted();\n return this._data?.url || this._driver.url(this._path);\n }\n\n /**\n * Get the absolute filesystem path (local driver only)\n */\n public get absolutePath(): string | undefined {\n this.ensureNotDeleted();\n if (\"path\" in this._driver && typeof this._driver.path === \"function\") {\n return this._driver.path(this._path);\n }\n\n return undefined;\n }\n\n /**\n * Get file hash (SHA-256, available from put operations)\n */\n public get hash(): string | undefined {\n return this._data?.hash;\n }\n\n // ============================================================\n // Data Methods (Lazy Loaded)\n // ============================================================\n\n /**\n * Get cached file data, or fetch it if not available\n */\n public async data(): Promise<StorageFileData> {\n this.ensureNotDeleted();\n if (!this._data) {\n // Fetch info and construct data\n const info = await this.metadata();\n this._data = {\n path: info.path,\n url: this._driver.url(this._path),\n size: info.size,\n hash: \"\", // Not available from metadata\n mimeType: info.mimeType || \"application/octet-stream\",\n driver: this._driver.name,\n };\n }\n return this._data;\n }\n\n /**\n * Get file size in bytes\n */\n public async size(): Promise<number> {\n const data = await this.data();\n return data.size;\n }\n\n /**\n * Get MIME type\n */\n public async mimeType(): Promise<string> {\n const data = await this.data();\n return data.mimeType;\n }\n\n /**\n * Get last modified date (fetches from driver)\n */\n public async lastModified(): Promise<Date | undefined> {\n this.ensureNotDeleted();\n const info = await this.metadata();\n return info.lastModified;\n }\n\n /**\n * Get ETag (cloud drivers, fetches from driver)\n */\n public async etag(): Promise<string | undefined> {\n this.ensureNotDeleted();\n const info = await this.metadata();\n return info.etag;\n }\n\n // ============================================================\n // Content Methods\n // ============================================================\n\n /**\n * Get file contents as Buffer\n */\n public async contents(): Promise<Buffer> {\n this.ensureNotDeleted();\n return this._driver.get(this._path);\n }\n\n /**\n * Get file contents as readable stream\n */\n public async stream(): Promise<Readable> {\n this.ensureNotDeleted();\n return this._driver.getStream(this._path);\n }\n\n /**\n * Get file contents as UTF-8 text\n */\n public async text(): Promise<string> {\n const buffer = await this.contents();\n return buffer.toString(\"utf-8\");\n }\n\n /**\n * Get file contents as base64 string\n */\n public async base64(): Promise<string> {\n const buffer = await this.contents();\n return buffer.toString(\"base64\");\n }\n\n /**\n * Get file contents as data URL\n */\n public async dataUrl(): Promise<string> {\n const [buffer, data] = await Promise.all([this.contents(), this.data()]);\n return `data:${data.mimeType};base64,${buffer.toString(\"base64\")}`;\n }\n\n // ============================================================\n // URL Methods\n // ============================================================\n\n /**\n * Get a temporary signed URL\n *\n * @param expiresIn - Seconds until expiration (default: 3600)\n */\n public async temporaryUrl(expiresIn = 3600): Promise<string> {\n this.ensureNotDeleted();\n return this._driver.temporaryUrl(this._path, expiresIn);\n }\n\n // ============================================================\n // File Operations\n // ============================================================\n\n /**\n * Check if the file exists\n */\n public async exists(): Promise<boolean> {\n if (this._deleted) return false;\n return this._driver.exists(this._path);\n }\n\n /**\n * Copy the file to a new location\n *\n * @param destination - Destination path\n * @returns New StorageFile instance at destination\n */\n public async copy(destination: string): Promise<StorageFile> {\n this.ensureNotDeleted();\n const result = await this._driver.copy(this._path, destination);\n return new StorageFile(destination, this._driver, result);\n }\n\n /**\n * Move the file to a new location\n *\n * @param destination - Destination path\n * @returns This StorageFile instance with updated path\n */\n public async move(destination: string): Promise<this> {\n this.ensureNotDeleted();\n const result = await this._driver.move(this._path, destination);\n this._path = destination;\n this._data = result; // Update cached data\n return this;\n }\n\n /**\n * Rename the file (move within same directory)\n *\n * @param newName - New file name\n * @returns This StorageFile instance with updated path\n */\n public async rename(newName: string): Promise<this> {\n const newPath = this.directory === \".\" ? newName : `${this.directory}/${newName}`;\n return this.move(newPath);\n }\n\n /**\n * Delete the file\n *\n * @returns true if deleted, false if not found\n */\n public async delete(): Promise<boolean> {\n this.ensureNotDeleted();\n const result = await this._driver.delete(this._path);\n this._deleted = true;\n return result;\n }\n\n // ============================================================\n // Cloud-Specific Methods\n // ============================================================\n\n /**\n * Set file visibility (cloud drivers only)\n *\n * @param visibility - \"public\" or \"private\"\n * @throws Error if driver doesn't support visibility\n */\n public async setVisibility(visibility: FileVisibility): Promise<this> {\n this.ensureNotDeleted();\n\n if (!(\"setVisibility\" in this._driver)) {\n throw new Error(\"setVisibility is only available for cloud storage drivers\");\n }\n\n await (this._driver as CloudStorageDriverContract).setVisibility(this._path, visibility);\n return this;\n }\n\n /**\n * Get file visibility (cloud drivers only)\n *\n * @throws Error if driver doesn't support visibility\n */\n public async getVisibility(): Promise<FileVisibility> {\n this.ensureNotDeleted();\n\n if (!(\"getVisibility\" in this._driver)) {\n throw new Error(\"getVisibility is only available for cloud storage drivers\");\n }\n\n return (this._driver as CloudStorageDriverContract).getVisibility(this._path);\n }\n\n /**\n * Set storage class (cloud drivers only)\n *\n * @param storageClass - Storage class (e.g., \"STANDARD\", \"GLACIER\")\n * @throws Error if driver doesn't support storage class\n */\n public async setStorageClass(storageClass: string): Promise<this> {\n this.ensureNotDeleted();\n\n if (!(\"setStorageClass\" in this._driver)) {\n throw new Error(\"setStorageClass is only available for cloud storage drivers\");\n }\n\n await (this._driver as CloudStorageDriverContract).setStorageClass(this._path, storageClass);\n return this;\n }\n\n // ============================================================\n // Utilities\n // ============================================================\n\n /**\n * Ensure the file has not been deleted\n */\n protected ensureNotDeleted(): void {\n if (this._deleted) {\n throw new Error(`File \"${this._path}\" has been deleted`);\n }\n }\n\n /**\n * Create a StorageFile instance from StorageFileData\n *\n * @param data - Storage file data from put/copy/move operations\n * @param driver - Driver instance\n */\n public static fromData(\n data: StorageFileData | CloudStorageFileData,\n driver: StorageDriverContract,\n ): StorageFile {\n return new StorageFile(data.path, driver, data);\n }\n\n /**\n * Get file metadata\n */\n public async metadata(): Promise<StorageFileInfo> {\n this.ensureNotDeleted();\n return this._driver.metadata(this._path);\n }\n\n /**\n * Determine if this file is an image type\n */\n public async isImage() {\n const metadata = await this.metadata();\n return metadata.mimeType!.startsWith(\"image/\");\n }\n\n /**\n * Determine if this file is a document type\n */\n public async isDocument() {\n const metadata = await this.metadata();\n return metadata.mimeType!.startsWith(\"application/\");\n }\n\n /**\n * Determine if this file is a pdf type\n */\n public async isPdf() {\n const metadata = await this.metadata();\n return metadata.mimeType!.startsWith(\"application/pdf\");\n }\n\n /**\n * Determine if this file is an excel file (any support excel file)\n */\n public async isExcel() {\n const metadata = await this.metadata();\n return (\n metadata.mimeType!.startsWith(\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n ) || metadata.mimeType!.startsWith(\"application/vnd.ms-excel\")\n );\n }\n\n /**\n * Determine if this file is a doc file\n */\n public async isDoc() {\n const metadata = await this.metadata();\n return (\n metadata.mimeType!.startsWith(\"application/msword\") ||\n metadata.mimeType!.startsWith(\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n )\n );\n }\n\n /**\n * Determine if this file is an audio type\n */\n public async isAudio() {\n const metadata = await this.metadata();\n return metadata.mimeType!.startsWith(\"audio/\");\n }\n\n /**\n * Determine if this file is a video type\n */\n public async isVideo() {\n const metadata = await this.metadata();\n return metadata.mimeType!.startsWith(\"video/\");\n }\n\n /**\n * Convert to plain object (returns cached data or constructs it)\n */\n public toJSON(): {\n path: string;\n name: string;\n extension: string;\n driver: string;\n url: string;\n hash?: string;\n size?: number;\n mimeType?: string;\n } {\n return {\n path: this._path,\n name: this.name,\n extension: this.extension,\n driver: this._driver.name,\n url: this._deleted ? \"\" : this.url,\n hash: this._data?.hash,\n size: this._data?.size,\n mimeType: this._data?.mimeType,\n };\n }\n\n /**\n * String representation\n */\n public toString(): string {\n return this._path;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCA,IAAa,cAAb,MAAa,YAAY;;;;;;;;CA4BvB,AAAO,YAAY,MAAc,QAA+B,MAAwB;kBATnE;EAUnB,KAAK,QAAQ;EACb,KAAK,UAAU;EACf,KAAK,QAAQ;CACf;;;;CASA,IAAW,OAAe;EACxB,OAAO,KAAK;CACd;;;;CAKA,IAAW,OAAe;EACxB,OAAO,SAAS,KAAK,KAAK;CAC5B;;;;CAKA,IAAW,YAAoB;EAC7B,OAAO,QAAQ,KAAK,KAAK,EAAE,MAAM,CAAC,EAAE,YAAY;CAClD;;;;CAKA,IAAW,YAAoB;EAC7B,OAAO,QAAQ,KAAK,KAAK;CAC3B;;;;CAKA,IAAW,SAAiB;EAC1B,OAAO,KAAK,QAAQ;CACtB;;;;CAKA,IAAW,YAAqB;EAC9B,OAAO,KAAK;CACd;;;;CAKA,IAAW,MAAc;EACvB,KAAK,iBAAiB;EACtB,OAAO,KAAK,OAAO,OAAO,KAAK,QAAQ,IAAI,KAAK,KAAK;CACvD;;;;CAKA,IAAW,eAAmC;EAC5C,KAAK,iBAAiB;EACtB,IAAI,UAAU,KAAK,WAAW,OAAO,KAAK,QAAQ,SAAS,YACzD,OAAO,KAAK,QAAQ,KAAK,KAAK,KAAK;CAIvC;;;;CAKA,IAAW,OAA2B;EACpC,OAAO,KAAK,OAAO;CACrB;;;;CASA,MAAa,OAAiC;EAC5C,KAAK,iBAAiB;EACtB,IAAI,CAAC,KAAK,OAAO;GAEf,MAAM,OAAO,MAAM,KAAK,SAAS;GACjC,KAAK,QAAQ;IACX,MAAM,KAAK;IACX,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK;IAChC,MAAM,KAAK;IACX,MAAM;IACN,UAAU,KAAK,YAAY;IAC3B,QAAQ,KAAK,QAAQ;GACvB;EACF;EACA,OAAO,KAAK;CACd;;;;CAKA,MAAa,OAAwB;EAEnC,QAAO,MADY,KAAK,KAAK,GACjB;CACd;;;;CAKA,MAAa,WAA4B;EAEvC,QAAO,MADY,KAAK,KAAK,GACjB;CACd;;;;CAKA,MAAa,eAA0C;EACrD,KAAK,iBAAiB;EAEtB,QAAO,MADY,KAAK,SAAS,GACrB;CACd;;;;CAKA,MAAa,OAAoC;EAC/C,KAAK,iBAAiB;EAEtB,QAAO,MADY,KAAK,SAAS,GACrB;CACd;;;;CASA,MAAa,WAA4B;EACvC,KAAK,iBAAiB;EACtB,OAAO,KAAK,QAAQ,IAAI,KAAK,KAAK;CACpC;;;;CAKA,MAAa,SAA4B;EACvC,KAAK,iBAAiB;EACtB,OAAO,KAAK,QAAQ,UAAU,KAAK,KAAK;CAC1C;;;;CAKA,MAAa,OAAwB;EAEnC,QAAO,MADc,KAAK,SAAS,GACrB,SAAS,OAAO;CAChC;;;;CAKA,MAAa,SAA0B;EAErC,QAAO,MADc,KAAK,SAAS,GACrB,SAAS,QAAQ;CACjC;;;;CAKA,MAAa,UAA2B;EACtC,MAAM,CAAC,QAAQ,QAAQ,MAAM,QAAQ,IAAI,CAAC,KAAK,SAAS,GAAG,KAAK,KAAK,CAAC,CAAC;EACvE,OAAO,QAAQ,KAAK,SAAS,UAAU,OAAO,SAAS,QAAQ;CACjE;;;;;;CAWA,MAAa,aAAa,YAAY,MAAuB;EAC3D,KAAK,iBAAiB;EACtB,OAAO,KAAK,QAAQ,aAAa,KAAK,OAAO,SAAS;CACxD;;;;CASA,MAAa,SAA2B;EACtC,IAAI,KAAK,UAAU,OAAO;EAC1B,OAAO,KAAK,QAAQ,OAAO,KAAK,KAAK;CACvC;;;;;;;CAQA,MAAa,KAAK,aAA2C;EAC3D,KAAK,iBAAiB;EACtB,MAAM,SAAS,MAAM,KAAK,QAAQ,KAAK,KAAK,OAAO,WAAW;EAC9D,OAAO,IAAI,YAAY,aAAa,KAAK,SAAS,MAAM;CAC1D;;;;;;;CAQA,MAAa,KAAK,aAAoC;EACpD,KAAK,iBAAiB;EACtB,MAAM,SAAS,MAAM,KAAK,QAAQ,KAAK,KAAK,OAAO,WAAW;EAC9D,KAAK,QAAQ;EACb,KAAK,QAAQ;EACb,OAAO;CACT;;;;;;;CAQA,MAAa,OAAO,SAAgC;EAClD,MAAM,UAAU,KAAK,cAAc,MAAM,UAAU,GAAG,KAAK,UAAU,GAAG;EACxE,OAAO,KAAK,KAAK,OAAO;CAC1B;;;;;;CAOA,MAAa,SAA2B;EACtC,KAAK,iBAAiB;EACtB,MAAM,SAAS,MAAM,KAAK,QAAQ,OAAO,KAAK,KAAK;EACnD,KAAK,WAAW;EAChB,OAAO;CACT;;;;;;;CAYA,MAAa,cAAc,YAA2C;EACpE,KAAK,iBAAiB;EAEtB,IAAI,EAAE,mBAAmB,KAAK,UAC5B,MAAM,IAAI,MAAM,2DAA2D;EAG7E,MAAO,KAAK,QAAuC,cAAc,KAAK,OAAO,UAAU;EACvF,OAAO;CACT;;;;;;CAOA,MAAa,gBAAyC;EACpD,KAAK,iBAAiB;EAEtB,IAAI,EAAE,mBAAmB,KAAK,UAC5B,MAAM,IAAI,MAAM,2DAA2D;EAG7E,OAAQ,KAAK,QAAuC,cAAc,KAAK,KAAK;CAC9E;;;;;;;CAQA,MAAa,gBAAgB,cAAqC;EAChE,KAAK,iBAAiB;EAEtB,IAAI,EAAE,qBAAqB,KAAK,UAC9B,MAAM,IAAI,MAAM,6DAA6D;EAG/E,MAAO,KAAK,QAAuC,gBAAgB,KAAK,OAAO,YAAY;EAC3F,OAAO;CACT;;;;CASA,AAAU,mBAAyB;EACjC,IAAI,KAAK,UACP,MAAM,IAAI,MAAM,SAAS,KAAK,MAAM,mBAAmB;CAE3D;;;;;;;CAQA,OAAc,SACZ,MACA,QACa;EACb,OAAO,IAAI,YAAY,KAAK,MAAM,QAAQ,IAAI;CAChD;;;;CAKA,MAAa,WAAqC;EAChD,KAAK,iBAAiB;EACtB,OAAO,KAAK,QAAQ,SAAS,KAAK,KAAK;CACzC;;;;CAKA,MAAa,UAAU;EAErB,QAAO,MADgB,KAAK,SAAS,GACrB,SAAU,WAAW,QAAQ;CAC/C;;;;CAKA,MAAa,aAAa;EAExB,QAAO,MADgB,KAAK,SAAS,GACrB,SAAU,WAAW,cAAc;CACrD;;;;CAKA,MAAa,QAAQ;EAEnB,QAAO,MADgB,KAAK,SAAS,GACrB,SAAU,WAAW,iBAAiB;CACxD;;;;CAKA,MAAa,UAAU;EACrB,MAAM,WAAW,MAAM,KAAK,SAAS;EACrC,OACE,SAAS,SAAU,WACjB,mEACF,KAAK,SAAS,SAAU,WAAW,0BAA0B;CAEjE;;;;CAKA,MAAa,QAAQ;EACnB,MAAM,WAAW,MAAM,KAAK,SAAS;EACrC,OACE,SAAS,SAAU,WAAW,oBAAoB,KAClD,SAAS,SAAU,WACjB,yEACF;CAEJ;;;;CAKA,MAAa,UAAU;EAErB,QAAO,MADgB,KAAK,SAAS,GACrB,SAAU,WAAW,QAAQ;CAC/C;;;;CAKA,MAAa,UAAU;EAErB,QAAO,MADgB,KAAK,SAAS,GACrB,SAAU,WAAW,QAAQ;CAC/C;;;;CAKA,AAAO,SASL;EACA,OAAO;GACL,MAAM,KAAK;GACX,MAAM,KAAK;GACX,WAAW,KAAK;GAChB,QAAQ,KAAK,QAAQ;GACrB,KAAK,KAAK,WAAW,KAAK,KAAK;GAC/B,MAAM,KAAK,OAAO;GAClB,MAAM,KAAK,OAAO;GAClB,UAAU,KAAK,OAAO;EACxB;CACF;;;;CAKA,AAAO,WAAmB;EACxB,OAAO,KAAK;CACd;AACF"}
1
+ {"version":3,"file":"storage-file.mjs","names":[],"sources":["../../../../../../../@warlock.js/core/src/storage/storage-file.ts"],"sourcesContent":["import { basename, dirname, extname } from \"path\";\nimport type { Readable } from \"stream\";\nimport type {\n CloudStorageDriverContract,\n CloudStorageFileData,\n FileVisibility,\n StorageDriverContract,\n StorageFileData,\n StorageFileInfo,\n} from \"./types\";\n\n/**\n * StorageFile class - OOP wrapper for storage file operations\n *\n * Provides a fluent interface for working with files in storage,\n * wrapping the underlying driver operations.\n *\n * @example\n * ```typescript\n * const file = await storage.put(buffer, \"uploads/image.jpg\");\n *\n * // Properties (sync, from cached data)\n * file.name // \"image.jpg\"\n * file.extension // \"jpg\"\n * file.path // \"uploads/image.jpg\"\n * file.hash // \"sha256:abc123...\"\n *\n * // Operations\n * await file.copy(\"uploads/backup.jpg\")\n * await file.move(\"archive/image.jpg\")\n * await file.delete()\n *\n * // Content\n * const buffer = await file.contents();\n * const stream = await file.stream();\n * ```\n */\nexport class StorageFile {\n /**\n * Relative file path\n */\n protected _path: string;\n\n /**\n * The driver instance\n */\n protected _driver: StorageDriverContract;\n\n /**\n * Cached file data (from put operations or lazy loaded)\n */\n protected _data?: StorageFileData;\n\n /**\n * Whether the file has been deleted\n */\n protected _deleted = false;\n\n /**\n * Create a new StorageFile instance\n *\n * @param path - Relative file path\n * @param driver - Driver instance\n * @param data - Optional initial data from put/copy operations\n */\n public constructor(path: string, driver: StorageDriverContract, data?: StorageFileData) {\n this._path = path;\n this._driver = driver;\n this._data = data;\n }\n\n // ============================================================\n // Properties\n // ============================================================\n\n /**\n * Get the relative file path\n */\n public get path(): string {\n return this._path;\n }\n\n /**\n * Get the file name (with extension)\n */\n public get name(): string {\n return basename(this._path);\n }\n\n /**\n * Get the file extension (without dot)\n */\n public get extension(): string {\n return extname(this._path).slice(1).toLowerCase();\n }\n\n /**\n * Get the directory path\n */\n public get directory(): string {\n return dirname(this._path);\n }\n\n /**\n * Get the driver name\n */\n public get driver(): string {\n return this._driver.name;\n }\n\n /**\n * Check if file has been deleted\n */\n public get isDeleted(): boolean {\n return this._deleted;\n }\n\n /**\n * Get public URL (sync if data cached, otherwise computed)\n */\n public get url(): string {\n this.ensureNotDeleted();\n return this._data?.url || this._driver.url(this._path);\n }\n\n /**\n * Get the absolute filesystem path (local driver only)\n */\n public get absolutePath(): string | undefined {\n this.ensureNotDeleted();\n if (\"path\" in this._driver && typeof this._driver.path === \"function\") {\n return this._driver.path(this._path);\n }\n\n return undefined;\n }\n\n /**\n * Get file hash (SHA-256, available from put operations)\n */\n public get hash(): string | undefined {\n return this._data?.hash;\n }\n\n // ============================================================\n // Data Methods (Lazy Loaded)\n // ============================================================\n\n /**\n * Get cached file data, or fetch it if not available\n */\n public async data(): Promise<StorageFileData> {\n this.ensureNotDeleted();\n if (!this._data) {\n // Fetch info and construct data\n const info = await this.metadata();\n this._data = {\n path: info.path,\n url: this._driver.url(this._path),\n size: info.size,\n hash: \"\", // Not available from metadata\n mimeType: info.mimeType || \"application/octet-stream\",\n driver: this._driver.name,\n };\n }\n return this._data;\n }\n\n /**\n * Get file size in bytes\n */\n public async size(): Promise<number> {\n const data = await this.data();\n return data.size;\n }\n\n /**\n * Get MIME type\n */\n public async mimeType(): Promise<string> {\n const data = await this.data();\n return data.mimeType;\n }\n\n /**\n * Get last modified date (fetches from driver)\n */\n public async lastModified(): Promise<Date | undefined> {\n this.ensureNotDeleted();\n const info = await this.metadata();\n return info.lastModified;\n }\n\n /**\n * Get ETag (cloud drivers, fetches from driver)\n */\n public async etag(): Promise<string | undefined> {\n this.ensureNotDeleted();\n const info = await this.metadata();\n return info.etag;\n }\n\n // ============================================================\n // Content Methods\n // ============================================================\n\n /**\n * Get file contents as Buffer\n */\n public async contents(): Promise<Buffer> {\n this.ensureNotDeleted();\n return this._driver.get(this._path);\n }\n\n /**\n * Get file contents as readable stream\n */\n public async stream(): Promise<Readable> {\n this.ensureNotDeleted();\n return this._driver.getStream(this._path);\n }\n\n /**\n * Get file contents as UTF-8 text\n */\n public async text(): Promise<string> {\n const buffer = await this.contents();\n return buffer.toString(\"utf-8\");\n }\n\n /**\n * Get file contents as base64 string\n */\n public async base64(): Promise<string> {\n const buffer = await this.contents();\n return buffer.toString(\"base64\");\n }\n\n /**\n * Get file contents as data URL\n */\n public async dataUrl(): Promise<string> {\n const [buffer, data] = await Promise.all([this.contents(), this.data()]);\n return `data:${data.mimeType};base64,${buffer.toString(\"base64\")}`;\n }\n\n // ============================================================\n // URL Methods\n // ============================================================\n\n /**\n * Get a temporary signed URL\n *\n * @param expiresIn - Seconds until expiration (default: 3600)\n */\n public async temporaryUrl(expiresIn = 3600): Promise<string> {\n this.ensureNotDeleted();\n return this._driver.temporaryUrl(this._path, expiresIn);\n }\n\n // ============================================================\n // File Operations\n // ============================================================\n\n /**\n * Check if the file exists\n */\n public async exists(): Promise<boolean> {\n if (this._deleted) return false;\n return this._driver.exists(this._path);\n }\n\n /**\n * Copy the file to a new location\n *\n * @param destination - Destination path\n * @returns New StorageFile instance at destination\n */\n public async copy(destination: string): Promise<StorageFile> {\n this.ensureNotDeleted();\n const result = await this._driver.copy(this._path, destination);\n return new StorageFile(destination, this._driver, result);\n }\n\n /**\n * Move the file to a new location\n *\n * @param destination - Destination path\n * @returns This StorageFile instance with updated path\n */\n public async move(destination: string): Promise<this> {\n this.ensureNotDeleted();\n const result = await this._driver.move(this._path, destination);\n this._path = destination;\n this._data = result; // Update cached data\n return this;\n }\n\n /**\n * Rename the file (move within same directory)\n *\n * @param newName - New file name\n * @returns This StorageFile instance with updated path\n */\n public async rename(newName: string): Promise<this> {\n const newPath = this.directory === \".\" ? newName : `${this.directory}/${newName}`;\n return this.move(newPath);\n }\n\n /**\n * Delete the file\n *\n * @returns true if deleted, false if not found\n */\n public async delete(): Promise<boolean> {\n this.ensureNotDeleted();\n const result = await this._driver.delete(this._path);\n this._deleted = true;\n return result;\n }\n\n // ============================================================\n // Cloud-Specific Methods\n // ============================================================\n\n /**\n * Set file visibility (cloud drivers only)\n *\n * @param visibility - \"public\" or \"private\"\n * @throws Error if driver doesn't support visibility\n */\n public async setVisibility(visibility: FileVisibility): Promise<this> {\n this.ensureNotDeleted();\n\n if (!(\"setVisibility\" in this._driver)) {\n throw new Error(\"setVisibility is only available for cloud storage drivers\");\n }\n\n await (this._driver as CloudStorageDriverContract).setVisibility(this._path, visibility);\n return this;\n }\n\n /**\n * Get file visibility (cloud drivers only)\n *\n * @throws Error if driver doesn't support visibility\n */\n public async getVisibility(): Promise<FileVisibility> {\n this.ensureNotDeleted();\n\n if (!(\"getVisibility\" in this._driver)) {\n throw new Error(\"getVisibility is only available for cloud storage drivers\");\n }\n\n return (this._driver as CloudStorageDriverContract).getVisibility(this._path);\n }\n\n /**\n * Set storage class (cloud drivers only)\n *\n * @param storageClass - Storage class (e.g., \"STANDARD\", \"GLACIER\")\n * @throws Error if driver doesn't support storage class\n */\n public async setStorageClass(storageClass: string): Promise<this> {\n this.ensureNotDeleted();\n\n if (!(\"setStorageClass\" in this._driver)) {\n throw new Error(\"setStorageClass is only available for cloud storage drivers\");\n }\n\n await (this._driver as CloudStorageDriverContract).setStorageClass(this._path, storageClass);\n return this;\n }\n\n // ============================================================\n // Utilities\n // ============================================================\n\n /**\n * Ensure the file has not been deleted\n */\n protected ensureNotDeleted(): void {\n if (this._deleted) {\n throw new Error(`File \"${this._path}\" has been deleted`);\n }\n }\n\n /**\n * Create a StorageFile instance from StorageFileData\n *\n * @param data - Storage file data from put/copy/move operations\n * @param driver - Driver instance\n */\n public static fromData(\n data: StorageFileData | CloudStorageFileData,\n driver: StorageDriverContract,\n ): StorageFile {\n return new StorageFile(data.path, driver, data);\n }\n\n /**\n * Get file metadata\n */\n public async metadata(): Promise<StorageFileInfo> {\n this.ensureNotDeleted();\n return this._driver.metadata(this._path);\n }\n\n /**\n * Determine if this file is an image type\n */\n public async isImage() {\n const metadata = await this.metadata();\n return metadata.mimeType!.startsWith(\"image/\");\n }\n\n /**\n * Determine if this file is a document type\n */\n public async isDocument() {\n const metadata = await this.metadata();\n return metadata.mimeType!.startsWith(\"application/\");\n }\n\n /**\n * Determine if this file is a pdf type\n */\n public async isPdf() {\n const metadata = await this.metadata();\n return metadata.mimeType!.startsWith(\"application/pdf\");\n }\n\n /**\n * Determine if this file is an excel file (any support excel file)\n */\n public async isExcel() {\n const metadata = await this.metadata();\n return (\n metadata.mimeType!.startsWith(\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n ) || metadata.mimeType!.startsWith(\"application/vnd.ms-excel\")\n );\n }\n\n /**\n * Determine if this file is a doc file\n */\n public async isDoc() {\n const metadata = await this.metadata();\n return (\n metadata.mimeType!.startsWith(\"application/msword\") ||\n metadata.mimeType!.startsWith(\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n )\n );\n }\n\n /**\n * Determine if this file is an audio type\n */\n public async isAudio() {\n const metadata = await this.metadata();\n return metadata.mimeType!.startsWith(\"audio/\");\n }\n\n /**\n * Determine if this file is a video type\n */\n public async isVideo() {\n const metadata = await this.metadata();\n return metadata.mimeType!.startsWith(\"video/\");\n }\n\n /**\n * Convert to plain object (returns cached data or constructs it)\n */\n public toJSON(): {\n path: string;\n name: string;\n extension: string;\n driver: string;\n url: string;\n hash?: string;\n size?: number;\n mimeType?: string;\n } {\n return {\n path: this._path,\n name: this.name,\n extension: this.extension,\n driver: this._driver.name,\n url: this._deleted ? \"\" : this.url,\n hash: this._data?.hash,\n size: this._data?.size,\n mimeType: this._data?.mimeType,\n };\n }\n\n /**\n * String representation\n */\n public toString(): string {\n return this._path;\n }\n}\n"],"mappings":"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"}
@@ -5,7 +5,7 @@ import { UploadedFile } from "../http/uploaded-file.mjs";
5
5
  import { EventSubscription } from "@mongez/events";
6
6
  import { Readable } from "stream";
7
7
 
8
- //#region ../../@warlock.js/core/src/storage/storage.d.ts
8
+ //#region ../@warlock.js/core/src/storage/storage.d.ts
9
9
  /**
10
10
  * Storage Manager
11
11
  *
@@ -1 +1 @@
1
- {"version":3,"file":"storage.d.mts","names":[],"sources":["../../../../../../@warlock.js/core/src/storage/storage.ts"],"mappings":"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"}
1
+ {"version":3,"file":"storage.d.mts","names":[],"sources":["../../../../../../../@warlock.js/core/src/storage/storage.ts"],"mappings":"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"}
@@ -10,7 +10,7 @@ import path from "path";
10
10
  import events from "@mongez/events";
11
11
  import fs from "fs";
12
12
 
13
- //#region ../../@warlock.js/core/src/storage/storage.ts
13
+ //#region ../@warlock.js/core/src/storage/storage.ts
14
14
  /**
15
15
  * Storage Manager
16
16
  *
@@ -1 +1 @@
1
- {"version":3,"file":"storage.mjs","names":[],"sources":["../../../../../../@warlock.js/core/src/storage/storage.ts"],"sourcesContent":["import events, { type EventSubscription } from \"@mongez/events\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport type { Readable } from \"stream\";\nimport type { UploadedFile } from \"../http\";\nimport { storageConfig } from \"./config\";\nimport { storageDriverContext } from \"./context/storage-driver-context\";\nimport { DOSpacesDriver } from \"./drivers/do-spaces-driver\";\nimport { LocalDriver } from \"./drivers/local-driver\";\nimport { R2Driver } from \"./drivers/r2-driver\";\nimport { S3Driver } from \"./drivers/s3-driver\";\nimport { ScopedStorage } from \"./scoped-storage\";\nimport { StorageFile } from \"./storage-file\";\nimport type {\n CloudStorageDriverContract,\n CloudStorageDriverOptions,\n DeleteManyResult,\n FileVisibility,\n ListOptions,\n LocalStorageDriverOptions,\n PresignedOptions,\n PresignedUploadOptions,\n PutOptions,\n R2StorageDriverOptions,\n ScopedStorageContract,\n StorageCopyEventPayload,\n StorageDriverConfig,\n StorageDriverContract,\n StorageDriverName,\n StorageEventHandler,\n StorageEventPayload,\n StorageEventType,\n StorageFileInfo,\n StorageManagerContract,\n StoragePutEventPayload,\n TemporaryTokenValidation,\n} from \"./types\";\n\n/**\n * Storage Manager\n *\n * Provides a unified interface for file storage operations across multiple\n * drivers (local, S3, R2, DigitalOcean Spaces). Extends `ScopedStorage` to\n * inherit all base operations while adding driver management and events.\n *\n * All operations return `StorageFile` instances for a consistent, rich DX.\n *\n * @example\n * ```typescript\n * // Basic usage (uses default driver)\n * const file = await storage.put(buffer, \"uploads/image.jpg\");\n *\n * // With options\n * const file = await storage.put(buffer, \"uploads/image.jpg\", {\n * mimeType: \"image/jpeg\",\n * cacheControl: \"max-age=31536000\"\n * });\n *\n * // Using specific driver (also returns StorageFile)\n * const file = await storage.use(\"s3\").put(buffer, \"path/to/file\");\n *\n * // Get raw driver for advanced use\n * const driver = storage.driver(\"s3\");\n * const data = await driver.put(buffer, \"path/to/file\"); // Returns StorageFileData\n *\n * // Stream operations for large files\n * const stream = await storage.getStream(\"large-file.zip\");\n * await storage.putStream(readableStream, \"output/file.zip\");\n *\n * // Batch operations\n * const results = await storage.deleteMany([\"file1.txt\", \"file2.txt\"]);\n *\n * // Event hooks\n * storage.on(\"afterPut\", ({ location, file }) => {\n * console.log(`Uploaded ${location}`);\n * });\n * ```\n */\nexport class Storage extends ScopedStorage implements StorageManagerContract {\n /**\n * Registered drivers (cached instances)\n * @internal\n */\n protected drivers = new Map<string, StorageDriverContract>();\n\n /**\n * Driver configurations\n * @internal\n */\n protected configs = new Map<string, StorageDriverConfig>();\n\n /**\n * Default driver name\n * @internal\n */\n protected defaultDriverName!: StorageDriverName;\n\n /**\n * Whether the storage has been initialized\n * @internal\n */\n private initialized = false;\n\n /**\n * Create a new Storage manager instance\n *\n * Uses lazy initialization - driver is resolved on first access.\n */\n public constructor() {\n // Temp placeholder - will be replaced on first access\n super(null as unknown as StorageDriverContract);\n }\n\n /**\n * Ensure storage is initialized (lazy initialization)\n *\n * Called automatically on first driver access.\n */\n public async init(): Promise<void> {\n if (this.initialized) return;\n\n // Mark as initialized FIRST to prevent infinite recursion\n this.initialized = true;\n\n // Get default driver name from config\n\n const defaultName = storageConfig(\"default\", \"local\");\n\n this.defaultDriverName = defaultName as StorageDriverName;\n this.loadDriversFromConfig();\n\n // Now set the actual driver\n this._driver = this.resolveDriver(this.defaultDriverName);\n }\n\n /**\n * Reset storage defaults\n */\n public reset(): void {\n this.initialized = false;\n this.drivers.clear();\n this.configs.clear();\n this.defaultDriverName = null as unknown as StorageDriverName;\n this._driver = null as unknown as StorageDriverContract;\n }\n\n /**\n * Get the currently active driver (context-aware in future)\n *\n * Currently returns the default driver.\n * Will be enhanced to check AsyncLocalStorage context for multi-tenant support.\n *\n * @returns The active storage driver\n */\n public override get activeDriver(): StorageDriverContract {\n // Check context for tenant-specific driver\n const contextDriver = storageDriverContext.getDriver();\n\n if (contextDriver) return contextDriver;\n\n return this._driver;\n }\n\n // ============================================================\n // Driver Management\n // ============================================================\n\n /**\n * Load drivers from configuration\n * @internal\n */\n protected loadDriversFromConfig(): void {\n const drivers = storageConfig<Record<string, StorageDriverConfig>>(\"drivers\", {});\n\n for (const [name, config] of Object.entries(drivers)) {\n this.configs.set(name, config);\n }\n }\n\n /**\n * Get a scoped storage for a specific driver\n *\n * Returns a `ScopedStorage` instance that wraps the specified driver.\n * Operations on the returned instance also return `StorageFile` objects.\n *\n * @param name - Driver name as defined in configuration\n * @returns ScopedStorage instance for the specified driver\n *\n * @example\n * ```typescript\n * // Upload to S3\n * const s3File = await storage.use(\"s3\").put(buffer, \"images/photo.jpg\");\n *\n * // Upload to local\n * const localFile = await storage.use(\"local\").put(buffer, \"temp/file.txt\");\n *\n * // Both return StorageFile with identical API\n * console.log(s3File.url);\n * console.log(localFile.url);\n * ```\n */\n public use(name: StorageDriverName): ScopedStorageContract {\n return new ScopedStorage(this.getDriver(name));\n }\n\n /**\n * Get a raw driver instance\n *\n * Returns the underlying driver directly for advanced use cases.\n * Unlike `use()`, calling methods on the raw driver returns\n * `StorageFileData` instead of `StorageFile`.\n *\n * @param name - Driver name as defined in configuration\n * @returns Raw driver instance implementing StorageDriverContract\n *\n * @example\n * ```typescript\n * const driver = storage.getDriver(\"s3\");\n * const data = await driver.put(buffer, \"path/to/file\");\n * // data is StorageFileData, not StorageFile\n * ```\n */\n public getDriver(name: StorageDriverName): StorageDriverContract {\n return this.resolveDriver(name);\n }\n\n /**\n * Get root directory of current driver\n */\n public root(apepndedPath?: string): string {\n const rootPath = this.activeDriver.options?.root || \"\";\n\n return path.join(rootPath, apepndedPath || \"\");\n }\n\n /**\n * Use a cloud storage driver with extended cloud capabilities\n *\n * @param name - Cloud driver name (s3, r2, spaces)\n * @returns Driver instance implementing CloudStorageDriverContract\n * @throws Error if driver doesn't support cloud operations\n *\n * @example\n * ```typescript\n * const cloudDriver = storage.useCloud(\"s3\");\n * const presignedUrl = await cloudDriver.getPresignedUrl(\"private/doc.pdf\");\n * ```\n */\n public useCloud(name: StorageDriverName): CloudStorageDriverContract {\n const instance = this.getDriver(name);\n\n if (!this.isCloudDriver(instance)) {\n throw new Error(`Driver \"${name}\" does not support cloud operations`);\n }\n\n return instance as CloudStorageDriverContract;\n }\n\n /**\n * Register a new driver configuration at runtime\n *\n * Allows dynamic driver registration for multi-tenancy or\n * runtime configuration scenarios.\n *\n * @param name - Unique driver name\n * @param config - Driver configuration\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * storage.register(\"tenant-s3\", {\n * driver: \"s3\",\n * bucket: \"tenant-bucket\",\n * region: \"us-east-1\",\n * accessKeyId: process.env.TENANT_AWS_KEY,\n * secretAccessKey: process.env.TENANT_AWS_SECRET\n * });\n *\n * await storage.use(\"tenant-s3\").put(buffer, \"file.txt\");\n * ```\n */\n public register(name: StorageDriverName, config: StorageDriverConfig): this {\n this.configs.set(name, config);\n this.drivers.delete(name); // Clear cached instance\n return this;\n }\n\n /**\n * Set the default driver name\n *\n * @param name - Driver name to use as default\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * storage.setDefault(\"s3\");\n * await storage.put(buffer, \"file.txt\"); // Now uses S3\n * ```\n */\n public setDefault(name: StorageDriverName): this {\n this.defaultDriverName = name;\n this._driver = this.getDriver(name);\n return this;\n }\n\n /**\n * Check if current driver is a cloud driver\n *\n * @returns Promise resolving to true if the current driver supports cloud operations\n */\n public async isCloud(): Promise<boolean> {\n return this.isCloudDriver(this.activeDriver);\n }\n\n /**\n * Check if a driver instance supports cloud operations\n * @internal\n */\n protected isCloudDriver(driver: StorageDriverContract): driver is CloudStorageDriverContract {\n return \"getPresignedUrl\" in driver;\n }\n\n // ============================================================\n // Event System\n // ============================================================\n\n /**\n * Register an event handler\n *\n * Subscribe to storage events for logging, analytics, or side effects.\n *\n * @param event - Event type to listen for\n * @param handler - Handler function\n * @returns Event subscription for unsubscribing\n *\n * @example\n * ```typescript\n * // Log all uploads\n * storage.on(\"afterPut\", ({ location, file }) => {\n * console.log(`Uploaded ${file?.size} bytes to ${location}`);\n * });\n *\n * // Track deletions\n * storage.on(\"afterDelete\", ({ location }) => {\n * analytics.track(\"file_deleted\", { path: location });\n * });\n * ```\n */\n public on<T extends StorageEventPayload = StorageEventPayload>(\n event: StorageEventType,\n handler: StorageEventHandler<T>,\n ): EventSubscription {\n return events.subscribe(`storage.${event}`, handler);\n }\n\n /**\n * Remove all handlers for an event type\n *\n * @param event - Event type to remove handlers for\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * storage.off(\"afterPut\"); // Remove all afterPut handlers\n * ```\n */\n public off(event: StorageEventType): this {\n events.off(`storage.${event}`);\n return this;\n }\n\n /**\n * Emit an event to all registered handlers\n * @internal\n */\n protected async emit<T extends StorageEventPayload>(\n event: StorageEventType,\n payload: T,\n ): Promise<void> {\n await events.triggerAll(`storage.${event}`, payload);\n }\n\n // ============================================================\n // Overridden Operations with Events\n // ============================================================\n\n /**\n * Store a file in storage\n *\n * Extends base `put()` with event emission for beforePut/afterPut hooks.\n *\n * @param file - File content as Buffer, string, UploadedFile, or Readable stream\n * @param location - Destination path\n * @param options - Storage options (mimeType, cacheControl, etc.)\n * @returns StorageFile instance with cached metadata\n */\n public override async put(\n file: UploadedFile | Buffer | string | Readable,\n location: string,\n options?: PutOptions,\n ): Promise<StorageFile> {\n const driver = this.activeDriver;\n const buffer = await this.toBuffer(file);\n\n await this.emit<StoragePutEventPayload>(\"beforePut\", {\n driver: driver.name,\n location,\n timestamp: new Date(),\n size: buffer.length,\n });\n\n const result = await driver.put(buffer, location, options);\n\n await this.emit<StoragePutEventPayload>(\"afterPut\", {\n driver: driver.name,\n location,\n timestamp: new Date(),\n file: result,\n });\n\n if (!result.size) {\n result.size = buffer.length;\n }\n\n return StorageFile.fromData(result, driver);\n }\n\n /**\n * Store a file from a readable stream (for large files)\n *\n * Extends base `putStream()` with event emission.\n *\n * @param stream - Readable stream\n * @param location - Destination path\n * @param options - Storage options\n * @returns StorageFile instance with cached metadata\n */\n public override async putStream(\n stream: Readable | string,\n location: string,\n options?: PutOptions,\n ): Promise<StorageFile> {\n const driver = this.activeDriver;\n\n await this.emit<StoragePutEventPayload>(\"beforePut\", {\n driver: driver.name,\n location,\n timestamp: new Date(),\n });\n\n if (typeof stream === \"string\") {\n stream = fs.createReadStream(stream);\n }\n\n const result = await driver.putStream(stream, location, options);\n\n await this.emit<StoragePutEventPayload>(\"afterPut\", {\n driver: driver.name,\n location,\n timestamp: new Date(),\n file: result,\n });\n\n return StorageFile.fromData(result, driver);\n }\n\n /**\n * Store a file from a URL\n *\n * Downloads content from the URL and stores it at the specified location.\n *\n * @param url - Source URL to download from\n * @param location - Destination path\n * @param options - Storage options\n * @returns StorageFile instance with cached metadata\n *\n * @example\n * ```typescript\n * const file = await storage.putFromUrl(\n * \"https://example.com/image.jpg\",\n * \"downloads/image.jpg\"\n * );\n * ```\n */\n public async putFromUrl(\n url: string,\n location: string,\n options?: PutOptions,\n ): Promise<StorageFile> {\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch file from URL: ${response.statusText}`);\n }\n\n const arrayBuffer = await response.arrayBuffer();\n const buffer = Buffer.from(arrayBuffer);\n const mimeType = options?.mimeType || response.headers.get(\"content-type\") || undefined;\n\n return this.put(buffer, location, { ...options, mimeType });\n }\n\n /**\n * Store a file from base64 encoded string\n *\n * Decodes base64 content (with optional data URL prefix) and stores it.\n *\n * @param base64 - Base64 encoded file content (or data URL)\n * @param location - Destination path\n * @param options - Storage options\n * @returns StorageFile instance with cached metadata\n *\n * @example\n * ```typescript\n * // From plain base64\n * const file = await storage.putFromBase64(base64String, \"images/photo.jpg\");\n *\n * // From data URL (auto-extracts MIME type)\n * const file = await storage.putFromBase64(\n * \"data:image/png;base64,iVBORw0KGgo...\",\n * \"images/photo.png\"\n * );\n * ```\n */\n public async putFromBase64(\n base64: string,\n location: string,\n options?: PutOptions,\n ): Promise<StorageFile> {\n let data = base64;\n let mimeType = options?.mimeType;\n\n if (base64.startsWith(\"data:\")) {\n const match = base64.match(/^data:([^;]+);base64,(.+)$/);\n if (match) {\n mimeType = mimeType || match[1];\n data = match[2];\n }\n }\n\n const buffer = Buffer.from(data, \"base64\");\n return this.put(buffer, location, { ...options, mimeType });\n }\n\n /**\n * Retrieve file contents as Buffer\n *\n * Uses the current driver (with async resolution).\n *\n * @param location - File path\n * @returns Buffer containing file contents\n */\n public override async get(location: string): Promise<Buffer> {\n return this.activeDriver.get(location);\n }\n\n /**\n * Get JSON content from a file\n *\n * Downloads and parses JSON file content.\n *\n * @param location - File path\n * @returns Parsed JSON content\n *\n * @example\n * ```typescript\n * const config = await storage.getJson(\"config/settings.json\");\n * console.log(config.apiKey);\n * ```\n */\n public async getJson(location: string): Promise<any> {\n const buffer = await this.get(location);\n return JSON.parse(buffer.toString());\n }\n\n /**\n * Retrieve a file as a readable stream (for large files)\n *\n * @param location - File path\n * @returns Readable stream of file contents\n */\n public override async getStream(location: string): Promise<Readable> {\n return this.activeDriver.getStream(location);\n }\n\n /**\n * Delete a file\n *\n * Extends base `delete()` with event emission.\n *\n * @param location - File path or StorageFile\n * @returns true if deleted, false if not found\n */\n public override async delete(location: string | StorageFile): Promise<boolean> {\n const driver = this.activeDriver;\n const path = typeof location === \"string\" ? location : location.path;\n\n await this.emit<StorageEventPayload>(\"beforeDelete\", {\n driver: driver.name,\n location: path,\n timestamp: new Date(),\n });\n\n const result = await driver.delete(path);\n\n await this.emit<StorageEventPayload>(\"afterDelete\", {\n driver: driver.name,\n location: path,\n timestamp: new Date(),\n });\n\n return result;\n }\n\n /**\n * Delete multiple files at once\n *\n * @param locations - Array of file paths\n * @returns Array of delete results with status for each file\n */\n public override async deleteMany(locations: string[]): Promise<DeleteManyResult[]> {\n return this.activeDriver.deleteMany(locations);\n }\n\n /**\n * Check if a file exists\n *\n * @param location - File path\n * @returns true if file exists\n */\n public override async exists(location: string): Promise<boolean> {\n return this.activeDriver.exists(location);\n }\n\n /**\n * Copy a file to a new location\n *\n * Extends base `copy()` with event emission.\n *\n * @param from - Source path or StorageFile\n * @param to - Destination path\n * @returns StorageFile instance at destination\n */\n public override async copy(from: string | StorageFile, to: string): Promise<StorageFile> {\n const driver = this.activeDriver;\n const fromPath = typeof from === \"string\" ? from : from.path;\n\n await this.emit<StorageCopyEventPayload>(\"beforeCopy\", {\n driver: driver.name,\n location: to,\n from: fromPath,\n to,\n timestamp: new Date(),\n });\n\n const result = await driver.copy(fromPath, to);\n\n await this.emit<StorageCopyEventPayload>(\"afterCopy\", {\n driver: driver.name,\n location: to,\n from: fromPath,\n to,\n timestamp: new Date(),\n file: result,\n });\n\n return StorageFile.fromData(result, driver);\n }\n\n /**\n * Move a file to a new location\n *\n * Extends base `move()` with event emission.\n *\n * @param from - Source path or StorageFile\n * @param to - Destination path\n * @returns StorageFile instance at destination\n */\n public override async move(from: string | StorageFile, to: string): Promise<StorageFile> {\n const driver = this.activeDriver;\n const fromPath = typeof from === \"string\" ? from : from.path;\n\n await this.emit<StorageCopyEventPayload>(\"beforeMove\", {\n driver: driver.name,\n location: to,\n from: fromPath,\n to,\n timestamp: new Date(),\n });\n\n const result = await driver.move(fromPath, to);\n\n await this.emit<StorageCopyEventPayload>(\"afterMove\", {\n driver: driver.name,\n location: to,\n from: fromPath,\n to,\n timestamp: new Date(),\n file: result,\n });\n\n return StorageFile.fromData(result, driver);\n }\n\n /**\n * List files in a directory\n *\n * @param directory - Directory path (defaults to root)\n * @param options - List options (recursive, limit, etc.)\n * @returns Array of file information objects\n */\n public override async list(\n directory?: string,\n options?: ListOptions,\n ): Promise<StorageFileInfo[]> {\n return this.activeDriver.list(directory || \"\", options);\n }\n\n // ============================================================\n // Metadata Operations\n // ============================================================\n\n /**\n * Get file metadata without downloading\n *\n * @param location - File path\n * @returns File information object\n */\n public override async metadata(location: string): Promise<StorageFileInfo> {\n return this.activeDriver.metadata(location);\n }\n\n /**\n * Get file size in bytes\n *\n * @param location - File path\n * @returns File size in bytes\n */\n public override async size(location: string): Promise<number> {\n return this.activeDriver.size(location);\n }\n\n // ============================================================\n // Path Operations (Local Driver Only)\n // ============================================================\n\n /**\n * Get the absolute filesystem path for a location\n *\n * Only available for local driver.\n *\n * @param location - File path\n * @throws Error if current driver is not a local driver\n * @returns Absolute filesystem path\n */\n public async path(location: string): Promise<string> {\n const driver = this.activeDriver;\n\n if (!(\"path\" in driver) || typeof driver.path !== \"function\") {\n throw new Error(\"path() is only available for local storage drivers\");\n }\n\n return driver.path(location);\n }\n\n // ============================================================\n // Cloud-Specific Operations\n // ============================================================\n\n /**\n * Get a presigned URL for downloading a file\n *\n * Only available for cloud drivers.\n *\n * @param location - File path\n * @param options - Presigned URL options (expiresIn)\n * @throws Error if current driver is not a cloud driver\n * @returns Presigned download URL\n *\n * @example\n * ```typescript\n * const url = await storage.getPresignedUrl(\"private/document.pdf\", {\n * expiresIn: 3600 // 1 hour\n * });\n * ```\n */\n public async getPresignedUrl(location: string, options?: PresignedOptions): Promise<string> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Presigned URLs are only available for cloud storage drivers\");\n }\n\n return driver.getPresignedUrl(location, options);\n }\n\n /**\n * Get a presigned URL for uploading a file directly to cloud storage\n *\n * Only available for cloud drivers.\n *\n * @param location - Destination path\n * @param options - Upload options (expiresIn, contentType, maxSize)\n * @throws Error if current driver is not a cloud driver\n * @returns Presigned upload URL\n *\n * @example\n * ```typescript\n * const uploadUrl = await storage.getPresignedUploadUrl(\"uploads/file.pdf\", {\n * expiresIn: 3600,\n * contentType: \"application/pdf\"\n * });\n *\n * // Client can PUT directly to this URL\n * ```\n */\n public async getPresignedUploadUrl(\n location: string,\n options?: PresignedUploadOptions,\n ): Promise<string> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Presigned upload URLs are only available for cloud storage drivers\");\n }\n\n return driver.getPresignedUploadUrl(location, options);\n }\n\n /**\n * Get the bucket name for cloud storage\n *\n * Only available for cloud drivers.\n *\n * @throws Error if current driver is not a cloud driver\n * @returns Bucket name\n */\n public async getBucket(): Promise<string> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Bucket information is only available for cloud storage drivers\");\n }\n\n return driver.getBucket();\n }\n\n /**\n * Get the region for cloud storage\n *\n * Only available for cloud drivers.\n *\n * @throws Error if current driver is not a cloud driver\n * @returns Region name\n */\n public async getRegion(): Promise<string> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Region information is only available for cloud storage drivers\");\n }\n\n return driver.getRegion();\n }\n\n /**\n * Set storage class for a file (e.g., STANDARD, GLACIER, etc.)\n *\n * Only available for cloud drivers.\n *\n * @param location - File path\n * @param storageClass - Target storage class\n * @throws Error if current driver is not a cloud driver\n */\n public async setStorageClass(location: string, storageClass: string): Promise<void> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Storage class is only available for cloud storage drivers\");\n }\n\n return driver.setStorageClass(location, storageClass);\n }\n\n /**\n * Set file visibility (public or private)\n *\n * Only available for cloud drivers.\n *\n * @param location - File path\n * @param visibility - \"public\" or \"private\"\n * @throws Error if current driver is not a cloud driver\n */\n public async setVisibility(location: string, visibility: FileVisibility): Promise<void> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Visibility is only available for cloud storage drivers\");\n }\n\n return driver.setVisibility(location, visibility);\n }\n\n /**\n * Get file visibility\n *\n * Only available for cloud drivers.\n *\n * @param location - File path\n * @throws Error if current driver is not a cloud driver\n * @returns Current visibility setting\n */\n public async getVisibility(location: string): Promise<FileVisibility> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Visibility is only available for cloud storage drivers\");\n }\n\n return driver.getVisibility(location);\n }\n\n /**\n * Get a temporary signed URL\n *\n * Creates a URL that provides temporary access to the file.\n *\n * @param location - File path\n * @param expiresIn - Seconds until expiration (default: 3600)\n * @returns Signed URL string\n */\n public override async temporaryUrl(location: string, expiresIn?: number): Promise<string> {\n return this.activeDriver.temporaryUrl(location, expiresIn);\n }\n\n /**\n * Validate a temporary URL token\n *\n * For local driver: validates HMAC-signed tokens\n * For cloud drivers: returns invalid (cloud validates via presigned URL)\n *\n * @param token - The token from the temporary URL\n * @returns Validation result with file info and convenience methods\n *\n * @example\n * ```typescript\n * const result = await storage.validateTemporaryToken(token);\n *\n * if (!result.valid) {\n * return response.status(403).send(result.error);\n * }\n *\n * // For local driver - use sendFile for efficiency\n * if (result.absolutePath) {\n * return response.sendFile(result.absolutePath);\n * }\n *\n * // For cloud driver - stream the file\n * const stream = await result.getStream!();\n * stream.pipe(response.raw);\n * ```\n */\n public async validateTemporaryToken(token: string): Promise<TemporaryTokenValidation> {\n // Check if driver supports token validation\n if (\n !(\"validateTemporaryToken\" in this.activeDriver) ||\n typeof this.activeDriver.validateTemporaryToken !== \"function\"\n ) {\n // For cloud drivers, temporary URLs are presigned and validated by the cloud provider\n return {\n valid: false,\n error: \"invalid_token\",\n };\n }\n\n return this.activeDriver.validateTemporaryToken(token);\n }\n\n // ============================================================\n // Configuration Parsing\n // ============================================================\n\n /**\n * Parse config into driver-specific options\n * @internal\n */\n protected parseOptions(\n config: StorageDriverConfig,\n ): LocalStorageDriverOptions | CloudStorageDriverOptions | R2StorageDriverOptions {\n const { driver, ...options } = config;\n\n switch (driver) {\n case \"local\":\n return {\n root: options.root,\n urlPrefix: options.urlPrefix,\n signatureKey: options.signatureKey,\n } satisfies LocalStorageDriverOptions;\n\n case \"s3\":\n this.validateCloudConfig(config, \"s3\");\n return {\n ...options,\n bucket: options.bucket!,\n region: options.region!,\n accessKeyId: options.accessKeyId!,\n secretAccessKey: options.secretAccessKey!,\n endpoint: options.endpoint,\n urlPrefix: options.urlPrefix,\n } satisfies CloudStorageDriverOptions;\n\n case \"r2\":\n this.validateCloudConfig(config, \"r2\");\n if (!options.accountId) {\n throw new Error('R2 driver requires \"accountId\" configuration');\n }\n\n return {\n ...options,\n region: options.region || \"auto\",\n bucket: options.bucket!,\n accessKeyId: options.accessKeyId!,\n secretAccessKey: options.secretAccessKey!,\n endpoint: options.endpoint,\n urlPrefix: options.urlPrefix,\n accountId: options.accountId,\n publicDomain: options.publicDomain,\n } satisfies R2StorageDriverOptions;\n\n case \"spaces\":\n this.validateCloudConfig(config, \"spaces\");\n return {\n ...options,\n bucket: options.bucket!,\n region: options.region!,\n accessKeyId: options.accessKeyId!,\n secretAccessKey: options.secretAccessKey!,\n endpoint: options.endpoint,\n urlPrefix: options.urlPrefix,\n } satisfies CloudStorageDriverOptions;\n\n default:\n throw new Error(`Unknown driver type: ${driver}`);\n }\n }\n\n /**\n * Validate cloud driver configuration has required fields\n * @internal\n */\n protected validateCloudConfig(config: StorageDriverConfig, driverName: string): void {\n const required = [\"bucket\", \"accessKeyId\", \"secretAccessKey\"];\n\n if (driverName !== \"r2\") {\n required.push(\"region\");\n }\n\n for (const field of required) {\n if (!config[field as keyof StorageDriverConfig]) {\n throw new Error(`${driverName.toUpperCase()} driver requires \"${field}\" configuration`);\n }\n }\n }\n\n /**\n * Get or create driver instance from cache\n * @internal\n */\n protected resolveDriver(name: string): StorageDriverContract {\n // Ensure configs are loaded\n\n if (this.drivers.has(name)) {\n return this.drivers.get(name)!;\n }\n\n const config = this.configs.get(name);\n\n if (!config) {\n throw new Error(`Storage driver \"${name}\" is not configured`);\n }\n\n const options = this.parseOptions(config);\n let driver: StorageDriverContract;\n\n switch (config.driver) {\n case \"local\":\n driver = new LocalDriver(options as LocalStorageDriverOptions);\n break;\n case \"s3\":\n driver = new S3Driver(options as CloudStorageDriverOptions);\n break;\n case \"r2\":\n driver = new R2Driver(options as R2StorageDriverOptions);\n break;\n case \"spaces\":\n driver = new DOSpacesDriver(options as CloudStorageDriverOptions);\n break;\n default:\n throw new Error(`Unknown storage driver type: ${config.driver}`);\n }\n\n this.drivers.set(name, driver);\n return driver;\n }\n\n /**\n * Resolve the default driver name (supports async resolver for multi-tenancy)\n * @internal\n */\n protected async resolveDefaultDriver(): Promise<StorageDriverName> {\n const resolver = storageConfig(\"resolver\");\n\n if (resolver) {\n const resolved = await resolver();\n return resolved || this.defaultDriverName;\n }\n\n return this.defaultDriverName;\n }\n}\n\n/**\n * Singleton storage instance\n *\n * Pre-configured storage manager ready for use throughout the application.\n *\n * @example\n * ```typescript\n * import { storage } from \"@warlock.js/core\";\n *\n * const file = await storage.put(buffer, \"uploads/file.txt\");\n * ```\n */\nexport const storage = new Storage();\n"],"mappings":"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"}
1
+ {"version":3,"file":"storage.mjs","names":[],"sources":["../../../../../../../@warlock.js/core/src/storage/storage.ts"],"sourcesContent":["import events, { type EventSubscription } from \"@mongez/events\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport type { Readable } from \"stream\";\nimport type { UploadedFile } from \"../http\";\nimport { storageConfig } from \"./config\";\nimport { storageDriverContext } from \"./context/storage-driver-context\";\nimport { DOSpacesDriver } from \"./drivers/do-spaces-driver\";\nimport { LocalDriver } from \"./drivers/local-driver\";\nimport { R2Driver } from \"./drivers/r2-driver\";\nimport { S3Driver } from \"./drivers/s3-driver\";\nimport { ScopedStorage } from \"./scoped-storage\";\nimport { StorageFile } from \"./storage-file\";\nimport type {\n CloudStorageDriverContract,\n CloudStorageDriverOptions,\n DeleteManyResult,\n FileVisibility,\n ListOptions,\n LocalStorageDriverOptions,\n PresignedOptions,\n PresignedUploadOptions,\n PutOptions,\n R2StorageDriverOptions,\n ScopedStorageContract,\n StorageCopyEventPayload,\n StorageDriverConfig,\n StorageDriverContract,\n StorageDriverName,\n StorageEventHandler,\n StorageEventPayload,\n StorageEventType,\n StorageFileInfo,\n StorageManagerContract,\n StoragePutEventPayload,\n TemporaryTokenValidation,\n} from \"./types\";\n\n/**\n * Storage Manager\n *\n * Provides a unified interface for file storage operations across multiple\n * drivers (local, S3, R2, DigitalOcean Spaces). Extends `ScopedStorage` to\n * inherit all base operations while adding driver management and events.\n *\n * All operations return `StorageFile` instances for a consistent, rich DX.\n *\n * @example\n * ```typescript\n * // Basic usage (uses default driver)\n * const file = await storage.put(buffer, \"uploads/image.jpg\");\n *\n * // With options\n * const file = await storage.put(buffer, \"uploads/image.jpg\", {\n * mimeType: \"image/jpeg\",\n * cacheControl: \"max-age=31536000\"\n * });\n *\n * // Using specific driver (also returns StorageFile)\n * const file = await storage.use(\"s3\").put(buffer, \"path/to/file\");\n *\n * // Get raw driver for advanced use\n * const driver = storage.driver(\"s3\");\n * const data = await driver.put(buffer, \"path/to/file\"); // Returns StorageFileData\n *\n * // Stream operations for large files\n * const stream = await storage.getStream(\"large-file.zip\");\n * await storage.putStream(readableStream, \"output/file.zip\");\n *\n * // Batch operations\n * const results = await storage.deleteMany([\"file1.txt\", \"file2.txt\"]);\n *\n * // Event hooks\n * storage.on(\"afterPut\", ({ location, file }) => {\n * console.log(`Uploaded ${location}`);\n * });\n * ```\n */\nexport class Storage extends ScopedStorage implements StorageManagerContract {\n /**\n * Registered drivers (cached instances)\n * @internal\n */\n protected drivers = new Map<string, StorageDriverContract>();\n\n /**\n * Driver configurations\n * @internal\n */\n protected configs = new Map<string, StorageDriverConfig>();\n\n /**\n * Default driver name\n * @internal\n */\n protected defaultDriverName!: StorageDriverName;\n\n /**\n * Whether the storage has been initialized\n * @internal\n */\n private initialized = false;\n\n /**\n * Create a new Storage manager instance\n *\n * Uses lazy initialization - driver is resolved on first access.\n */\n public constructor() {\n // Temp placeholder - will be replaced on first access\n super(null as unknown as StorageDriverContract);\n }\n\n /**\n * Ensure storage is initialized (lazy initialization)\n *\n * Called automatically on first driver access.\n */\n public async init(): Promise<void> {\n if (this.initialized) return;\n\n // Mark as initialized FIRST to prevent infinite recursion\n this.initialized = true;\n\n // Get default driver name from config\n\n const defaultName = storageConfig(\"default\", \"local\");\n\n this.defaultDriverName = defaultName as StorageDriverName;\n this.loadDriversFromConfig();\n\n // Now set the actual driver\n this._driver = this.resolveDriver(this.defaultDriverName);\n }\n\n /**\n * Reset storage defaults\n */\n public reset(): void {\n this.initialized = false;\n this.drivers.clear();\n this.configs.clear();\n this.defaultDriverName = null as unknown as StorageDriverName;\n this._driver = null as unknown as StorageDriverContract;\n }\n\n /**\n * Get the currently active driver (context-aware in future)\n *\n * Currently returns the default driver.\n * Will be enhanced to check AsyncLocalStorage context for multi-tenant support.\n *\n * @returns The active storage driver\n */\n public override get activeDriver(): StorageDriverContract {\n // Check context for tenant-specific driver\n const contextDriver = storageDriverContext.getDriver();\n\n if (contextDriver) return contextDriver;\n\n return this._driver;\n }\n\n // ============================================================\n // Driver Management\n // ============================================================\n\n /**\n * Load drivers from configuration\n * @internal\n */\n protected loadDriversFromConfig(): void {\n const drivers = storageConfig<Record<string, StorageDriverConfig>>(\"drivers\", {});\n\n for (const [name, config] of Object.entries(drivers)) {\n this.configs.set(name, config);\n }\n }\n\n /**\n * Get a scoped storage for a specific driver\n *\n * Returns a `ScopedStorage` instance that wraps the specified driver.\n * Operations on the returned instance also return `StorageFile` objects.\n *\n * @param name - Driver name as defined in configuration\n * @returns ScopedStorage instance for the specified driver\n *\n * @example\n * ```typescript\n * // Upload to S3\n * const s3File = await storage.use(\"s3\").put(buffer, \"images/photo.jpg\");\n *\n * // Upload to local\n * const localFile = await storage.use(\"local\").put(buffer, \"temp/file.txt\");\n *\n * // Both return StorageFile with identical API\n * console.log(s3File.url);\n * console.log(localFile.url);\n * ```\n */\n public use(name: StorageDriverName): ScopedStorageContract {\n return new ScopedStorage(this.getDriver(name));\n }\n\n /**\n * Get a raw driver instance\n *\n * Returns the underlying driver directly for advanced use cases.\n * Unlike `use()`, calling methods on the raw driver returns\n * `StorageFileData` instead of `StorageFile`.\n *\n * @param name - Driver name as defined in configuration\n * @returns Raw driver instance implementing StorageDriverContract\n *\n * @example\n * ```typescript\n * const driver = storage.getDriver(\"s3\");\n * const data = await driver.put(buffer, \"path/to/file\");\n * // data is StorageFileData, not StorageFile\n * ```\n */\n public getDriver(name: StorageDriverName): StorageDriverContract {\n return this.resolveDriver(name);\n }\n\n /**\n * Get root directory of current driver\n */\n public root(apepndedPath?: string): string {\n const rootPath = this.activeDriver.options?.root || \"\";\n\n return path.join(rootPath, apepndedPath || \"\");\n }\n\n /**\n * Use a cloud storage driver with extended cloud capabilities\n *\n * @param name - Cloud driver name (s3, r2, spaces)\n * @returns Driver instance implementing CloudStorageDriverContract\n * @throws Error if driver doesn't support cloud operations\n *\n * @example\n * ```typescript\n * const cloudDriver = storage.useCloud(\"s3\");\n * const presignedUrl = await cloudDriver.getPresignedUrl(\"private/doc.pdf\");\n * ```\n */\n public useCloud(name: StorageDriverName): CloudStorageDriverContract {\n const instance = this.getDriver(name);\n\n if (!this.isCloudDriver(instance)) {\n throw new Error(`Driver \"${name}\" does not support cloud operations`);\n }\n\n return instance as CloudStorageDriverContract;\n }\n\n /**\n * Register a new driver configuration at runtime\n *\n * Allows dynamic driver registration for multi-tenancy or\n * runtime configuration scenarios.\n *\n * @param name - Unique driver name\n * @param config - Driver configuration\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * storage.register(\"tenant-s3\", {\n * driver: \"s3\",\n * bucket: \"tenant-bucket\",\n * region: \"us-east-1\",\n * accessKeyId: process.env.TENANT_AWS_KEY,\n * secretAccessKey: process.env.TENANT_AWS_SECRET\n * });\n *\n * await storage.use(\"tenant-s3\").put(buffer, \"file.txt\");\n * ```\n */\n public register(name: StorageDriverName, config: StorageDriverConfig): this {\n this.configs.set(name, config);\n this.drivers.delete(name); // Clear cached instance\n return this;\n }\n\n /**\n * Set the default driver name\n *\n * @param name - Driver name to use as default\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * storage.setDefault(\"s3\");\n * await storage.put(buffer, \"file.txt\"); // Now uses S3\n * ```\n */\n public setDefault(name: StorageDriverName): this {\n this.defaultDriverName = name;\n this._driver = this.getDriver(name);\n return this;\n }\n\n /**\n * Check if current driver is a cloud driver\n *\n * @returns Promise resolving to true if the current driver supports cloud operations\n */\n public async isCloud(): Promise<boolean> {\n return this.isCloudDriver(this.activeDriver);\n }\n\n /**\n * Check if a driver instance supports cloud operations\n * @internal\n */\n protected isCloudDriver(driver: StorageDriverContract): driver is CloudStorageDriverContract {\n return \"getPresignedUrl\" in driver;\n }\n\n // ============================================================\n // Event System\n // ============================================================\n\n /**\n * Register an event handler\n *\n * Subscribe to storage events for logging, analytics, or side effects.\n *\n * @param event - Event type to listen for\n * @param handler - Handler function\n * @returns Event subscription for unsubscribing\n *\n * @example\n * ```typescript\n * // Log all uploads\n * storage.on(\"afterPut\", ({ location, file }) => {\n * console.log(`Uploaded ${file?.size} bytes to ${location}`);\n * });\n *\n * // Track deletions\n * storage.on(\"afterDelete\", ({ location }) => {\n * analytics.track(\"file_deleted\", { path: location });\n * });\n * ```\n */\n public on<T extends StorageEventPayload = StorageEventPayload>(\n event: StorageEventType,\n handler: StorageEventHandler<T>,\n ): EventSubscription {\n return events.subscribe(`storage.${event}`, handler);\n }\n\n /**\n * Remove all handlers for an event type\n *\n * @param event - Event type to remove handlers for\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * storage.off(\"afterPut\"); // Remove all afterPut handlers\n * ```\n */\n public off(event: StorageEventType): this {\n events.off(`storage.${event}`);\n return this;\n }\n\n /**\n * Emit an event to all registered handlers\n * @internal\n */\n protected async emit<T extends StorageEventPayload>(\n event: StorageEventType,\n payload: T,\n ): Promise<void> {\n await events.triggerAll(`storage.${event}`, payload);\n }\n\n // ============================================================\n // Overridden Operations with Events\n // ============================================================\n\n /**\n * Store a file in storage\n *\n * Extends base `put()` with event emission for beforePut/afterPut hooks.\n *\n * @param file - File content as Buffer, string, UploadedFile, or Readable stream\n * @param location - Destination path\n * @param options - Storage options (mimeType, cacheControl, etc.)\n * @returns StorageFile instance with cached metadata\n */\n public override async put(\n file: UploadedFile | Buffer | string | Readable,\n location: string,\n options?: PutOptions,\n ): Promise<StorageFile> {\n const driver = this.activeDriver;\n const buffer = await this.toBuffer(file);\n\n await this.emit<StoragePutEventPayload>(\"beforePut\", {\n driver: driver.name,\n location,\n timestamp: new Date(),\n size: buffer.length,\n });\n\n const result = await driver.put(buffer, location, options);\n\n await this.emit<StoragePutEventPayload>(\"afterPut\", {\n driver: driver.name,\n location,\n timestamp: new Date(),\n file: result,\n });\n\n if (!result.size) {\n result.size = buffer.length;\n }\n\n return StorageFile.fromData(result, driver);\n }\n\n /**\n * Store a file from a readable stream (for large files)\n *\n * Extends base `putStream()` with event emission.\n *\n * @param stream - Readable stream\n * @param location - Destination path\n * @param options - Storage options\n * @returns StorageFile instance with cached metadata\n */\n public override async putStream(\n stream: Readable | string,\n location: string,\n options?: PutOptions,\n ): Promise<StorageFile> {\n const driver = this.activeDriver;\n\n await this.emit<StoragePutEventPayload>(\"beforePut\", {\n driver: driver.name,\n location,\n timestamp: new Date(),\n });\n\n if (typeof stream === \"string\") {\n stream = fs.createReadStream(stream);\n }\n\n const result = await driver.putStream(stream, location, options);\n\n await this.emit<StoragePutEventPayload>(\"afterPut\", {\n driver: driver.name,\n location,\n timestamp: new Date(),\n file: result,\n });\n\n return StorageFile.fromData(result, driver);\n }\n\n /**\n * Store a file from a URL\n *\n * Downloads content from the URL and stores it at the specified location.\n *\n * @param url - Source URL to download from\n * @param location - Destination path\n * @param options - Storage options\n * @returns StorageFile instance with cached metadata\n *\n * @example\n * ```typescript\n * const file = await storage.putFromUrl(\n * \"https://example.com/image.jpg\",\n * \"downloads/image.jpg\"\n * );\n * ```\n */\n public async putFromUrl(\n url: string,\n location: string,\n options?: PutOptions,\n ): Promise<StorageFile> {\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch file from URL: ${response.statusText}`);\n }\n\n const arrayBuffer = await response.arrayBuffer();\n const buffer = Buffer.from(arrayBuffer);\n const mimeType = options?.mimeType || response.headers.get(\"content-type\") || undefined;\n\n return this.put(buffer, location, { ...options, mimeType });\n }\n\n /**\n * Store a file from base64 encoded string\n *\n * Decodes base64 content (with optional data URL prefix) and stores it.\n *\n * @param base64 - Base64 encoded file content (or data URL)\n * @param location - Destination path\n * @param options - Storage options\n * @returns StorageFile instance with cached metadata\n *\n * @example\n * ```typescript\n * // From plain base64\n * const file = await storage.putFromBase64(base64String, \"images/photo.jpg\");\n *\n * // From data URL (auto-extracts MIME type)\n * const file = await storage.putFromBase64(\n * \"data:image/png;base64,iVBORw0KGgo...\",\n * \"images/photo.png\"\n * );\n * ```\n */\n public async putFromBase64(\n base64: string,\n location: string,\n options?: PutOptions,\n ): Promise<StorageFile> {\n let data = base64;\n let mimeType = options?.mimeType;\n\n if (base64.startsWith(\"data:\")) {\n const match = base64.match(/^data:([^;]+);base64,(.+)$/);\n if (match) {\n mimeType = mimeType || match[1];\n data = match[2];\n }\n }\n\n const buffer = Buffer.from(data, \"base64\");\n return this.put(buffer, location, { ...options, mimeType });\n }\n\n /**\n * Retrieve file contents as Buffer\n *\n * Uses the current driver (with async resolution).\n *\n * @param location - File path\n * @returns Buffer containing file contents\n */\n public override async get(location: string): Promise<Buffer> {\n return this.activeDriver.get(location);\n }\n\n /**\n * Get JSON content from a file\n *\n * Downloads and parses JSON file content.\n *\n * @param location - File path\n * @returns Parsed JSON content\n *\n * @example\n * ```typescript\n * const config = await storage.getJson(\"config/settings.json\");\n * console.log(config.apiKey);\n * ```\n */\n public async getJson(location: string): Promise<any> {\n const buffer = await this.get(location);\n return JSON.parse(buffer.toString());\n }\n\n /**\n * Retrieve a file as a readable stream (for large files)\n *\n * @param location - File path\n * @returns Readable stream of file contents\n */\n public override async getStream(location: string): Promise<Readable> {\n return this.activeDriver.getStream(location);\n }\n\n /**\n * Delete a file\n *\n * Extends base `delete()` with event emission.\n *\n * @param location - File path or StorageFile\n * @returns true if deleted, false if not found\n */\n public override async delete(location: string | StorageFile): Promise<boolean> {\n const driver = this.activeDriver;\n const path = typeof location === \"string\" ? location : location.path;\n\n await this.emit<StorageEventPayload>(\"beforeDelete\", {\n driver: driver.name,\n location: path,\n timestamp: new Date(),\n });\n\n const result = await driver.delete(path);\n\n await this.emit<StorageEventPayload>(\"afterDelete\", {\n driver: driver.name,\n location: path,\n timestamp: new Date(),\n });\n\n return result;\n }\n\n /**\n * Delete multiple files at once\n *\n * @param locations - Array of file paths\n * @returns Array of delete results with status for each file\n */\n public override async deleteMany(locations: string[]): Promise<DeleteManyResult[]> {\n return this.activeDriver.deleteMany(locations);\n }\n\n /**\n * Check if a file exists\n *\n * @param location - File path\n * @returns true if file exists\n */\n public override async exists(location: string): Promise<boolean> {\n return this.activeDriver.exists(location);\n }\n\n /**\n * Copy a file to a new location\n *\n * Extends base `copy()` with event emission.\n *\n * @param from - Source path or StorageFile\n * @param to - Destination path\n * @returns StorageFile instance at destination\n */\n public override async copy(from: string | StorageFile, to: string): Promise<StorageFile> {\n const driver = this.activeDriver;\n const fromPath = typeof from === \"string\" ? from : from.path;\n\n await this.emit<StorageCopyEventPayload>(\"beforeCopy\", {\n driver: driver.name,\n location: to,\n from: fromPath,\n to,\n timestamp: new Date(),\n });\n\n const result = await driver.copy(fromPath, to);\n\n await this.emit<StorageCopyEventPayload>(\"afterCopy\", {\n driver: driver.name,\n location: to,\n from: fromPath,\n to,\n timestamp: new Date(),\n file: result,\n });\n\n return StorageFile.fromData(result, driver);\n }\n\n /**\n * Move a file to a new location\n *\n * Extends base `move()` with event emission.\n *\n * @param from - Source path or StorageFile\n * @param to - Destination path\n * @returns StorageFile instance at destination\n */\n public override async move(from: string | StorageFile, to: string): Promise<StorageFile> {\n const driver = this.activeDriver;\n const fromPath = typeof from === \"string\" ? from : from.path;\n\n await this.emit<StorageCopyEventPayload>(\"beforeMove\", {\n driver: driver.name,\n location: to,\n from: fromPath,\n to,\n timestamp: new Date(),\n });\n\n const result = await driver.move(fromPath, to);\n\n await this.emit<StorageCopyEventPayload>(\"afterMove\", {\n driver: driver.name,\n location: to,\n from: fromPath,\n to,\n timestamp: new Date(),\n file: result,\n });\n\n return StorageFile.fromData(result, driver);\n }\n\n /**\n * List files in a directory\n *\n * @param directory - Directory path (defaults to root)\n * @param options - List options (recursive, limit, etc.)\n * @returns Array of file information objects\n */\n public override async list(\n directory?: string,\n options?: ListOptions,\n ): Promise<StorageFileInfo[]> {\n return this.activeDriver.list(directory || \"\", options);\n }\n\n // ============================================================\n // Metadata Operations\n // ============================================================\n\n /**\n * Get file metadata without downloading\n *\n * @param location - File path\n * @returns File information object\n */\n public override async metadata(location: string): Promise<StorageFileInfo> {\n return this.activeDriver.metadata(location);\n }\n\n /**\n * Get file size in bytes\n *\n * @param location - File path\n * @returns File size in bytes\n */\n public override async size(location: string): Promise<number> {\n return this.activeDriver.size(location);\n }\n\n // ============================================================\n // Path Operations (Local Driver Only)\n // ============================================================\n\n /**\n * Get the absolute filesystem path for a location\n *\n * Only available for local driver.\n *\n * @param location - File path\n * @throws Error if current driver is not a local driver\n * @returns Absolute filesystem path\n */\n public async path(location: string): Promise<string> {\n const driver = this.activeDriver;\n\n if (!(\"path\" in driver) || typeof driver.path !== \"function\") {\n throw new Error(\"path() is only available for local storage drivers\");\n }\n\n return driver.path(location);\n }\n\n // ============================================================\n // Cloud-Specific Operations\n // ============================================================\n\n /**\n * Get a presigned URL for downloading a file\n *\n * Only available for cloud drivers.\n *\n * @param location - File path\n * @param options - Presigned URL options (expiresIn)\n * @throws Error if current driver is not a cloud driver\n * @returns Presigned download URL\n *\n * @example\n * ```typescript\n * const url = await storage.getPresignedUrl(\"private/document.pdf\", {\n * expiresIn: 3600 // 1 hour\n * });\n * ```\n */\n public async getPresignedUrl(location: string, options?: PresignedOptions): Promise<string> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Presigned URLs are only available for cloud storage drivers\");\n }\n\n return driver.getPresignedUrl(location, options);\n }\n\n /**\n * Get a presigned URL for uploading a file directly to cloud storage\n *\n * Only available for cloud drivers.\n *\n * @param location - Destination path\n * @param options - Upload options (expiresIn, contentType, maxSize)\n * @throws Error if current driver is not a cloud driver\n * @returns Presigned upload URL\n *\n * @example\n * ```typescript\n * const uploadUrl = await storage.getPresignedUploadUrl(\"uploads/file.pdf\", {\n * expiresIn: 3600,\n * contentType: \"application/pdf\"\n * });\n *\n * // Client can PUT directly to this URL\n * ```\n */\n public async getPresignedUploadUrl(\n location: string,\n options?: PresignedUploadOptions,\n ): Promise<string> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Presigned upload URLs are only available for cloud storage drivers\");\n }\n\n return driver.getPresignedUploadUrl(location, options);\n }\n\n /**\n * Get the bucket name for cloud storage\n *\n * Only available for cloud drivers.\n *\n * @throws Error if current driver is not a cloud driver\n * @returns Bucket name\n */\n public async getBucket(): Promise<string> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Bucket information is only available for cloud storage drivers\");\n }\n\n return driver.getBucket();\n }\n\n /**\n * Get the region for cloud storage\n *\n * Only available for cloud drivers.\n *\n * @throws Error if current driver is not a cloud driver\n * @returns Region name\n */\n public async getRegion(): Promise<string> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Region information is only available for cloud storage drivers\");\n }\n\n return driver.getRegion();\n }\n\n /**\n * Set storage class for a file (e.g., STANDARD, GLACIER, etc.)\n *\n * Only available for cloud drivers.\n *\n * @param location - File path\n * @param storageClass - Target storage class\n * @throws Error if current driver is not a cloud driver\n */\n public async setStorageClass(location: string, storageClass: string): Promise<void> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Storage class is only available for cloud storage drivers\");\n }\n\n return driver.setStorageClass(location, storageClass);\n }\n\n /**\n * Set file visibility (public or private)\n *\n * Only available for cloud drivers.\n *\n * @param location - File path\n * @param visibility - \"public\" or \"private\"\n * @throws Error if current driver is not a cloud driver\n */\n public async setVisibility(location: string, visibility: FileVisibility): Promise<void> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Visibility is only available for cloud storage drivers\");\n }\n\n return driver.setVisibility(location, visibility);\n }\n\n /**\n * Get file visibility\n *\n * Only available for cloud drivers.\n *\n * @param location - File path\n * @throws Error if current driver is not a cloud driver\n * @returns Current visibility setting\n */\n public async getVisibility(location: string): Promise<FileVisibility> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Visibility is only available for cloud storage drivers\");\n }\n\n return driver.getVisibility(location);\n }\n\n /**\n * Get a temporary signed URL\n *\n * Creates a URL that provides temporary access to the file.\n *\n * @param location - File path\n * @param expiresIn - Seconds until expiration (default: 3600)\n * @returns Signed URL string\n */\n public override async temporaryUrl(location: string, expiresIn?: number): Promise<string> {\n return this.activeDriver.temporaryUrl(location, expiresIn);\n }\n\n /**\n * Validate a temporary URL token\n *\n * For local driver: validates HMAC-signed tokens\n * For cloud drivers: returns invalid (cloud validates via presigned URL)\n *\n * @param token - The token from the temporary URL\n * @returns Validation result with file info and convenience methods\n *\n * @example\n * ```typescript\n * const result = await storage.validateTemporaryToken(token);\n *\n * if (!result.valid) {\n * return response.status(403).send(result.error);\n * }\n *\n * // For local driver - use sendFile for efficiency\n * if (result.absolutePath) {\n * return response.sendFile(result.absolutePath);\n * }\n *\n * // For cloud driver - stream the file\n * const stream = await result.getStream!();\n * stream.pipe(response.raw);\n * ```\n */\n public async validateTemporaryToken(token: string): Promise<TemporaryTokenValidation> {\n // Check if driver supports token validation\n if (\n !(\"validateTemporaryToken\" in this.activeDriver) ||\n typeof this.activeDriver.validateTemporaryToken !== \"function\"\n ) {\n // For cloud drivers, temporary URLs are presigned and validated by the cloud provider\n return {\n valid: false,\n error: \"invalid_token\",\n };\n }\n\n return this.activeDriver.validateTemporaryToken(token);\n }\n\n // ============================================================\n // Configuration Parsing\n // ============================================================\n\n /**\n * Parse config into driver-specific options\n * @internal\n */\n protected parseOptions(\n config: StorageDriverConfig,\n ): LocalStorageDriverOptions | CloudStorageDriverOptions | R2StorageDriverOptions {\n const { driver, ...options } = config;\n\n switch (driver) {\n case \"local\":\n return {\n root: options.root,\n urlPrefix: options.urlPrefix,\n signatureKey: options.signatureKey,\n } satisfies LocalStorageDriverOptions;\n\n case \"s3\":\n this.validateCloudConfig(config, \"s3\");\n return {\n ...options,\n bucket: options.bucket!,\n region: options.region!,\n accessKeyId: options.accessKeyId!,\n secretAccessKey: options.secretAccessKey!,\n endpoint: options.endpoint,\n urlPrefix: options.urlPrefix,\n } satisfies CloudStorageDriverOptions;\n\n case \"r2\":\n this.validateCloudConfig(config, \"r2\");\n if (!options.accountId) {\n throw new Error('R2 driver requires \"accountId\" configuration');\n }\n\n return {\n ...options,\n region: options.region || \"auto\",\n bucket: options.bucket!,\n accessKeyId: options.accessKeyId!,\n secretAccessKey: options.secretAccessKey!,\n endpoint: options.endpoint,\n urlPrefix: options.urlPrefix,\n accountId: options.accountId,\n publicDomain: options.publicDomain,\n } satisfies R2StorageDriverOptions;\n\n case \"spaces\":\n this.validateCloudConfig(config, \"spaces\");\n return {\n ...options,\n bucket: options.bucket!,\n region: options.region!,\n accessKeyId: options.accessKeyId!,\n secretAccessKey: options.secretAccessKey!,\n endpoint: options.endpoint,\n urlPrefix: options.urlPrefix,\n } satisfies CloudStorageDriverOptions;\n\n default:\n throw new Error(`Unknown driver type: ${driver}`);\n }\n }\n\n /**\n * Validate cloud driver configuration has required fields\n * @internal\n */\n protected validateCloudConfig(config: StorageDriverConfig, driverName: string): void {\n const required = [\"bucket\", \"accessKeyId\", \"secretAccessKey\"];\n\n if (driverName !== \"r2\") {\n required.push(\"region\");\n }\n\n for (const field of required) {\n if (!config[field as keyof StorageDriverConfig]) {\n throw new Error(`${driverName.toUpperCase()} driver requires \"${field}\" configuration`);\n }\n }\n }\n\n /**\n * Get or create driver instance from cache\n * @internal\n */\n protected resolveDriver(name: string): StorageDriverContract {\n // Ensure configs are loaded\n\n if (this.drivers.has(name)) {\n return this.drivers.get(name)!;\n }\n\n const config = this.configs.get(name);\n\n if (!config) {\n throw new Error(`Storage driver \"${name}\" is not configured`);\n }\n\n const options = this.parseOptions(config);\n let driver: StorageDriverContract;\n\n switch (config.driver) {\n case \"local\":\n driver = new LocalDriver(options as LocalStorageDriverOptions);\n break;\n case \"s3\":\n driver = new S3Driver(options as CloudStorageDriverOptions);\n break;\n case \"r2\":\n driver = new R2Driver(options as R2StorageDriverOptions);\n break;\n case \"spaces\":\n driver = new DOSpacesDriver(options as CloudStorageDriverOptions);\n break;\n default:\n throw new Error(`Unknown storage driver type: ${config.driver}`);\n }\n\n this.drivers.set(name, driver);\n return driver;\n }\n\n /**\n * Resolve the default driver name (supports async resolver for multi-tenancy)\n * @internal\n */\n protected async resolveDefaultDriver(): Promise<StorageDriverName> {\n const resolver = storageConfig(\"resolver\");\n\n if (resolver) {\n const resolved = await resolver();\n return resolved || this.defaultDriverName;\n }\n\n return this.defaultDriverName;\n }\n}\n\n/**\n * Singleton storage instance\n *\n * Pre-configured storage manager ready for use throughout the application.\n *\n * @example\n * ```typescript\n * import { storage } from \"@warlock.js/core\";\n *\n * const file = await storage.put(buffer, \"uploads/file.txt\");\n * ```\n */\nexport const storage = new Storage();\n"],"mappings":"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"}
@@ -2,7 +2,7 @@ import { StorageFile } from "./storage-file.mjs";
2
2
  import { UploadedFile } from "../http/uploaded-file.mjs";
3
3
  import { Readable } from "stream";
4
4
 
5
- //#region ../../@warlock.js/core/src/storage/types.d.ts
5
+ //#region ../@warlock.js/core/src/storage/types.d.ts
6
6
  /**
7
7
  * Options for local storage driver
8
8
  */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.mts","names":[],"sources":["../../../../../../@warlock.js/core/src/storage/types.ts"],"mappings":"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"}
1
+ {"version":3,"file":"types.d.mts","names":[],"sources":["../../../../../../../@warlock.js/core/src/storage/types.ts"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- //#region ../../@warlock.js/core/src/storage/utils/mime.d.ts
1
+ //#region ../@warlock.js/core/src/storage/utils/mime.d.ts
2
2
  /**
3
3
  * Get MIME type from file path or extension
4
4
  *
@@ -1 +1 @@
1
- {"version":3,"file":"mime.d.mts","names":[],"sources":["../../../../../../../@warlock.js/core/src/storage/utils/mime.ts"],"mappings":";;AAcA;;;;AAAwC;iBAAxB,WAAA,CAAY,IAAY;;;;cAO3B,SAAA;EAAA"}
1
+ {"version":3,"file":"mime.d.mts","names":[],"sources":["../../../../../../../../@warlock.js/core/src/storage/utils/mime.ts"],"mappings":";;AAcA;;;;AAAwC;iBAAxB,WAAA,CAAY,IAAY;;;;cAO3B,SAAA;EAAA"}