@bgord/bun 0.30.1 → 1.0.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 (503) hide show
  1. package/dist/antivirus-clamav.adapter.d.ts.map +1 -1
  2. package/dist/antivirus-clamav.adapter.js +6 -6
  3. package/dist/antivirus-clamav.adapter.js.map +1 -1
  4. package/dist/antivirus.port.d.ts +3 -6
  5. package/dist/antivirus.port.d.ts.map +1 -1
  6. package/dist/antivirus.port.js +1 -12
  7. package/dist/antivirus.port.js.map +1 -1
  8. package/dist/api-version.middleware.d.ts +4 -2
  9. package/dist/api-version.middleware.d.ts.map +1 -1
  10. package/dist/api-version.middleware.js.map +1 -1
  11. package/dist/basic-auth-password.vo.d.ts +9 -0
  12. package/dist/basic-auth-password.vo.d.ts.map +1 -0
  13. package/dist/basic-auth-password.vo.js +12 -0
  14. package/dist/basic-auth-password.vo.js.map +1 -0
  15. package/dist/basic-auth-username.vo.d.ts +9 -0
  16. package/dist/basic-auth-username.vo.d.ts.map +1 -0
  17. package/dist/basic-auth-username.vo.js +12 -0
  18. package/dist/basic-auth-username.vo.js.map +1 -0
  19. package/dist/basic-auth.service.d.ts +5 -22
  20. package/dist/basic-auth.service.d.ts.map +1 -1
  21. package/dist/basic-auth.service.js +0 -15
  22. package/dist/basic-auth.service.js.map +1 -1
  23. package/dist/better-auth-logger.service.d.ts.map +1 -1
  24. package/dist/better-auth-logger.service.js +4 -2
  25. package/dist/better-auth-logger.service.js.map +1 -1
  26. package/dist/binary.vo.d.ts +10 -0
  27. package/dist/binary.vo.d.ts.map +1 -0
  28. package/dist/binary.vo.js +16 -0
  29. package/dist/binary.vo.js.map +1 -0
  30. package/dist/build-info-repository.service.d.ts +2 -1
  31. package/dist/build-info-repository.service.d.ts.map +1 -1
  32. package/dist/build-info-repository.service.js +2 -5
  33. package/dist/build-info-repository.service.js.map +1 -1
  34. package/dist/cache-file.service.d.ts.map +1 -1
  35. package/dist/cache-file.service.js +1 -1
  36. package/dist/cache-file.service.js.map +1 -1
  37. package/dist/cache-response.middleware.d.ts.map +1 -1
  38. package/dist/cache-response.middleware.js.map +1 -1
  39. package/dist/certificate-inspector-tls.adapter.d.ts +1 -1
  40. package/dist/certificate-inspector-tls.adapter.d.ts.map +1 -1
  41. package/dist/certificate-inspector-tls.adapter.js +2 -2
  42. package/dist/certificate-inspector-tls.adapter.js.map +1 -1
  43. package/dist/client-from-hono.adapter.d.ts +1 -1
  44. package/dist/client-from-hono.adapter.d.ts.map +1 -1
  45. package/dist/client-from-hono.adapter.js +1 -1
  46. package/dist/client-from-hono.adapter.js.map +1 -1
  47. package/dist/clock-system.adapter.d.ts.map +1 -1
  48. package/dist/clock-system.adapter.js +1 -2
  49. package/dist/clock-system.adapter.js.map +1 -1
  50. package/dist/clock.port.d.ts.map +1 -1
  51. package/dist/context.middleware.d.ts.map +1 -1
  52. package/dist/context.middleware.js.map +1 -1
  53. package/dist/correlation-id.vo.d.ts.map +1 -1
  54. package/dist/correlation-storage.service.d.ts +3 -0
  55. package/dist/correlation-storage.service.d.ts.map +1 -1
  56. package/dist/correlation-storage.service.js +2 -1
  57. package/dist/correlation-storage.service.js.map +1 -1
  58. package/dist/env-validator.service.d.ts +3 -1
  59. package/dist/env-validator.service.d.ts.map +1 -1
  60. package/dist/env-validator.service.js +2 -2
  61. package/dist/env-validator.service.js.map +1 -1
  62. package/dist/etag-extractor.middleware.js +2 -2
  63. package/dist/etag-extractor.middleware.js.map +1 -1
  64. package/dist/event-store-like.types.d.ts.map +1 -1
  65. package/dist/event-stream.vo.d.ts +4 -2
  66. package/dist/event-stream.vo.d.ts.map +1 -1
  67. package/dist/event-stream.vo.js +8 -4
  68. package/dist/event-stream.vo.js.map +1 -1
  69. package/dist/file-cleaner-bun-forgiving.adapter.d.ts +6 -0
  70. package/dist/file-cleaner-bun-forgiving.adapter.d.ts.map +1 -0
  71. package/dist/file-cleaner-bun-forgiving.adapter.js +9 -0
  72. package/dist/file-cleaner-bun-forgiving.adapter.js.map +1 -0
  73. package/dist/file-cleaner-bun.adapter.d.ts +6 -0
  74. package/dist/file-cleaner-bun.adapter.d.ts.map +1 -0
  75. package/dist/file-cleaner-bun.adapter.js +6 -0
  76. package/dist/file-cleaner-bun.adapter.js.map +1 -0
  77. package/dist/file-cleaner-noop.adapter.d.ts +6 -0
  78. package/dist/file-cleaner-noop.adapter.d.ts.map +1 -0
  79. package/dist/file-cleaner-noop.adapter.js +4 -0
  80. package/dist/file-cleaner-noop.adapter.js.map +1 -0
  81. package/dist/file-cleaner.port.d.ts +5 -0
  82. package/dist/file-cleaner.port.d.ts.map +1 -0
  83. package/dist/file-cleaner.port.js +2 -0
  84. package/dist/file-cleaner.port.js.map +1 -0
  85. package/dist/file-draft.service.js +2 -2
  86. package/dist/file-draft.service.js.map +1 -1
  87. package/dist/file-renamer-fs-forgiving.adapter.d.ts +6 -0
  88. package/dist/file-renamer-fs-forgiving.adapter.d.ts.map +1 -0
  89. package/dist/file-renamer-fs-forgiving.adapter.js +12 -0
  90. package/dist/file-renamer-fs-forgiving.adapter.js.map +1 -0
  91. package/dist/file-renamer-fs.adapter.d.ts +6 -0
  92. package/dist/file-renamer-fs.adapter.d.ts.map +1 -0
  93. package/dist/file-renamer-fs.adapter.js +9 -0
  94. package/dist/file-renamer-fs.adapter.js.map +1 -0
  95. package/dist/file-renamer-noop.adapter.d.ts +6 -0
  96. package/dist/file-renamer-noop.adapter.d.ts.map +1 -0
  97. package/dist/file-renamer-noop.adapter.js +4 -0
  98. package/dist/file-renamer-noop.adapter.js.map +1 -0
  99. package/dist/file-renamer.port.d.ts +5 -0
  100. package/dist/file-renamer.port.d.ts.map +1 -0
  101. package/dist/file-renamer.port.js +2 -0
  102. package/dist/file-renamer.port.js.map +1 -0
  103. package/dist/graceful-shutdown.service.d.ts.map +1 -1
  104. package/dist/graceful-shutdown.service.js +1 -3
  105. package/dist/graceful-shutdown.service.js.map +1 -1
  106. package/dist/hcaptcha-secret-key.vo.d.ts +8 -0
  107. package/dist/hcaptcha-secret-key.vo.d.ts.map +1 -0
  108. package/dist/hcaptcha-secret-key.vo.js +10 -0
  109. package/dist/hcaptcha-secret-key.vo.js.map +1 -0
  110. package/dist/hcaptcha-site-key.vo.d.ts +8 -0
  111. package/dist/hcaptcha-site-key.vo.d.ts.map +1 -0
  112. package/dist/hcaptcha-site-key.vo.js +10 -0
  113. package/dist/hcaptcha-site-key.vo.js.map +1 -0
  114. package/dist/healthcheck.service.d.ts +4 -0
  115. package/dist/healthcheck.service.d.ts.map +1 -1
  116. package/dist/healthcheck.service.js +3 -3
  117. package/dist/healthcheck.service.js.map +1 -1
  118. package/dist/http-logger.middleware.d.ts.map +1 -1
  119. package/dist/http-logger.middleware.js +9 -9
  120. package/dist/http-logger.middleware.js.map +1 -1
  121. package/dist/i18n.service.d.ts +10 -3
  122. package/dist/i18n.service.d.ts.map +1 -1
  123. package/dist/i18n.service.js +7 -11
  124. package/dist/i18n.service.js.map +1 -1
  125. package/dist/id-provider-deterministic.adapter.d.ts +3 -0
  126. package/dist/id-provider-deterministic.adapter.d.ts.map +1 -1
  127. package/dist/id-provider-deterministic.adapter.js +4 -1
  128. package/dist/id-provider-deterministic.adapter.js.map +1 -1
  129. package/dist/image-alpha-noop.adapter.d.ts +1 -1
  130. package/dist/image-alpha-sharp.adapter.d.ts +8 -1
  131. package/dist/image-alpha-sharp.adapter.d.ts.map +1 -1
  132. package/dist/image-alpha-sharp.adapter.js +6 -3
  133. package/dist/image-alpha-sharp.adapter.js.map +1 -1
  134. package/dist/image-blur-noop.adapter.d.ts +1 -1
  135. package/dist/image-blur-sharp.adapter.d.ts +8 -1
  136. package/dist/image-blur-sharp.adapter.d.ts.map +1 -1
  137. package/dist/image-blur-sharp.adapter.js +6 -3
  138. package/dist/image-blur-sharp.adapter.js.map +1 -1
  139. package/dist/image-compressor-noop.adapter.d.ts +1 -1
  140. package/dist/image-compressor-sharp.adapter.d.ts +8 -1
  141. package/dist/image-compressor-sharp.adapter.d.ts.map +1 -1
  142. package/dist/image-compressor-sharp.adapter.js +5 -2
  143. package/dist/image-compressor-sharp.adapter.js.map +1 -1
  144. package/dist/image-exif-clear-noop.adapter.d.ts +1 -1
  145. package/dist/image-exif-clear-sharp.adapter.d.ts +8 -1
  146. package/dist/image-exif-clear-sharp.adapter.d.ts.map +1 -1
  147. package/dist/image-exif-clear-sharp.adapter.js +5 -2
  148. package/dist/image-exif-clear-sharp.adapter.js.map +1 -1
  149. package/dist/image-formatter-sharp.adapter.d.ts +10 -1
  150. package/dist/image-formatter-sharp.adapter.d.ts.map +1 -1
  151. package/dist/image-formatter-sharp.adapter.js +8 -5
  152. package/dist/image-formatter-sharp.adapter.js.map +1 -1
  153. package/dist/image-info-noop.adapter.d.ts +2 -2
  154. package/dist/image-info-sharp.adapter.d.ts +2 -2
  155. package/dist/image-info-sharp.adapter.d.ts.map +1 -1
  156. package/dist/image-info-sharp.adapter.js +5 -9
  157. package/dist/image-info-sharp.adapter.js.map +1 -1
  158. package/dist/image-processor-sharp.adapter.d.ts +9 -0
  159. package/dist/image-processor-sharp.adapter.d.ts.map +1 -1
  160. package/dist/image-processor-sharp.adapter.js +8 -5
  161. package/dist/image-processor-sharp.adapter.js.map +1 -1
  162. package/dist/image-resizer-noop.adapter.d.ts +1 -1
  163. package/dist/image-resizer-sharp.adapter.d.ts +8 -1
  164. package/dist/image-resizer-sharp.adapter.d.ts.map +1 -1
  165. package/dist/image-resizer-sharp.adapter.js +5 -2
  166. package/dist/image-resizer-sharp.adapter.js.map +1 -1
  167. package/dist/index.d.ts +25 -5
  168. package/dist/index.d.ts.map +1 -1
  169. package/dist/index.js +25 -5
  170. package/dist/index.js.map +1 -1
  171. package/dist/json-file-reader-bun-forgiving.adapter.d.ts +6 -0
  172. package/dist/json-file-reader-bun-forgiving.adapter.d.ts.map +1 -0
  173. package/dist/json-file-reader-bun-forgiving.adapter.js +11 -0
  174. package/dist/json-file-reader-bun-forgiving.adapter.js.map +1 -0
  175. package/dist/json-file-reader-bun.adapter.d.ts +6 -0
  176. package/dist/json-file-reader-bun.adapter.d.ts.map +1 -0
  177. package/dist/json-file-reader-bun.adapter.js +6 -0
  178. package/dist/json-file-reader-bun.adapter.js.map +1 -0
  179. package/dist/json-file-reader-noop.adapter.d.ts +8 -0
  180. package/dist/json-file-reader-noop.adapter.d.ts.map +1 -0
  181. package/dist/json-file-reader-noop.adapter.js +10 -0
  182. package/dist/json-file-reader-noop.adapter.js.map +1 -0
  183. package/dist/json-file-reader.port.d.ts +5 -0
  184. package/dist/json-file-reader.port.d.ts.map +1 -0
  185. package/dist/json-file-reader.port.js +2 -0
  186. package/dist/json-file-reader.port.js.map +1 -0
  187. package/dist/logger-format-error.service.d.ts +1 -1
  188. package/dist/logger-format-error.service.d.ts.map +1 -1
  189. package/dist/logger-format-error.service.js +9 -9
  190. package/dist/logger-format-error.service.js.map +1 -1
  191. package/dist/logger.port.d.ts +0 -4
  192. package/dist/logger.port.d.ts.map +1 -1
  193. package/dist/mailer-smtp-with-logger.adapter.d.ts.map +1 -1
  194. package/dist/mailer-smtp-with-logger.adapter.js.map +1 -1
  195. package/dist/mailer-smtp.adapter.d.ts +2 -23
  196. package/dist/mailer-smtp.adapter.d.ts.map +1 -1
  197. package/dist/mailer-smtp.adapter.js +0 -10
  198. package/dist/mailer-smtp.adapter.js.map +1 -1
  199. package/dist/mailer.vo.d.ts +34 -0
  200. package/dist/mailer.vo.d.ts.map +1 -0
  201. package/dist/mailer.vo.js +21 -0
  202. package/dist/mailer.vo.js.map +1 -0
  203. package/dist/modules/history/event-handlers/onHistoryPopulatedEvent.d.ts.map +1 -1
  204. package/dist/modules/history/event-handlers/onHistoryPopulatedEvent.js.map +1 -1
  205. package/dist/modules/history/events/HISTORY_CLEARED_EVENT.d.ts +4 -4
  206. package/dist/modules/history/events/HISTORY_CLEARED_EVENT.d.ts.map +1 -1
  207. package/dist/modules/history/events/HISTORY_CLEARED_EVENT.js +2 -8
  208. package/dist/modules/history/events/HISTORY_CLEARED_EVENT.js.map +1 -1
  209. package/dist/modules/history/events/HISTORY_POPULATED_EVENT.d.ts +6 -6
  210. package/dist/modules/history/events/HISTORY_POPULATED_EVENT.d.ts.map +1 -1
  211. package/dist/modules/history/events/HISTORY_POPULATED_EVENT.js +2 -8
  212. package/dist/modules/history/events/HISTORY_POPULATED_EVENT.js.map +1 -1
  213. package/dist/modules/history/ports/history-writer.d.ts.map +1 -1
  214. package/dist/modules/history/value-objects/history-subject.d.ts.map +1 -1
  215. package/dist/modules/preferences/open-host-queries/user-language.d.ts.map +1 -1
  216. package/dist/modules/preferences/open-host-queries/user-language.js.map +1 -1
  217. package/dist/modules/preferences/ports/user-language-resolver.d.ts +3 -3
  218. package/dist/modules/preferences/ports/user-language-resolver.d.ts.map +1 -1
  219. package/dist/modules/preferences/ports/user-language-resolver.js +2 -7
  220. package/dist/modules/preferences/ports/user-language-resolver.js.map +1 -1
  221. package/dist/modules/preferences/value-objects/supported-languages-set.d.ts +3 -3
  222. package/dist/modules/preferences/value-objects/supported-languages-set.d.ts.map +1 -1
  223. package/dist/modules/preferences/value-objects/supported-languages-set.js +2 -7
  224. package/dist/modules/preferences/value-objects/supported-languages-set.js.map +1 -1
  225. package/dist/pdf-generator-noop.adapter.d.ts +1 -1
  226. package/dist/pdf-generator-noop.adapter.d.ts.map +1 -1
  227. package/dist/pdf-generator-noop.adapter.js +1 -1
  228. package/dist/pdf-generator-noop.adapter.js.map +1 -1
  229. package/dist/port.vo.d.ts +4 -0
  230. package/dist/port.vo.d.ts.map +1 -1
  231. package/dist/port.vo.js +7 -1
  232. package/dist/port.vo.js.map +1 -1
  233. package/dist/prerequisites/binary.d.ts +2 -5
  234. package/dist/prerequisites/binary.d.ts.map +1 -1
  235. package/dist/prerequisites/binary.js +1 -8
  236. package/dist/prerequisites/binary.js.map +1 -1
  237. package/dist/prerequisites/dependency-vulnerabilities.js +3 -3
  238. package/dist/prerequisites/dependency-vulnerabilities.js.map +1 -1
  239. package/dist/prerequisites/directory.d.ts.map +1 -1
  240. package/dist/prerequisites/directory.js.map +1 -1
  241. package/dist/prerequisites/jobs.d.ts.map +1 -1
  242. package/dist/prerequisites/jobs.js +1 -2
  243. package/dist/prerequisites/jobs.js.map +1 -1
  244. package/dist/prerequisites/log-file.d.ts.map +1 -1
  245. package/dist/prerequisites/log-file.js.map +1 -1
  246. package/dist/prerequisites/mailer.d.ts.map +1 -1
  247. package/dist/prerequisites/mailer.js.map +1 -1
  248. package/dist/prerequisites/memory.js +1 -1
  249. package/dist/prerequisites/memory.js.map +1 -1
  250. package/dist/prerequisites/node.d.ts.map +1 -1
  251. package/dist/prerequisites/node.js.map +1 -1
  252. package/dist/prerequisites/port.d.ts.map +1 -1
  253. package/dist/prerequisites/port.js.map +1 -1
  254. package/dist/prerequisites/ram.d.ts.map +1 -1
  255. package/dist/prerequisites/ram.js +1 -1
  256. package/dist/prerequisites/ram.js.map +1 -1
  257. package/dist/prerequisites/running-user.d.ts.map +1 -1
  258. package/dist/prerequisites/running-user.js.map +1 -1
  259. package/dist/prerequisites/space.d.ts.map +1 -1
  260. package/dist/prerequisites/space.js +1 -1
  261. package/dist/prerequisites/space.js.map +1 -1
  262. package/dist/prerequisites/sqlite.d.ts.map +1 -1
  263. package/dist/prerequisites/sqlite.js +1 -1
  264. package/dist/prerequisites/sqlite.js.map +1 -1
  265. package/dist/prerequisites/ssl-certificate-expiry.js +1 -1
  266. package/dist/prerequisites/ssl-certificate-expiry.js.map +1 -1
  267. package/dist/prerequisites/timezone-utc.d.ts.map +1 -1
  268. package/dist/prerequisites/timezone-utc.js.map +1 -1
  269. package/dist/prerequisites/translations.d.ts +10 -3
  270. package/dist/prerequisites/translations.d.ts.map +1 -1
  271. package/dist/prerequisites/translations.js +15 -10
  272. package/dist/prerequisites/translations.js.map +1 -1
  273. package/dist/prerequisites.service.d.ts +3 -0
  274. package/dist/prerequisites.service.d.ts.map +1 -1
  275. package/dist/prerequisites.service.js +3 -3
  276. package/dist/prerequisites.service.js.map +1 -1
  277. package/dist/rate-limit-store-node-cache.adapter.d.ts +2 -2
  278. package/dist/rate-limit-store-node-cache.adapter.d.ts.map +1 -1
  279. package/dist/rate-limit-store-node-cache.adapter.js +1 -1
  280. package/dist/rate-limit-store-node-cache.adapter.js.map +1 -1
  281. package/dist/rate-limit-store.port.d.ts +1 -1
  282. package/dist/rate-limit-store.port.d.ts.map +1 -1
  283. package/dist/recaptcha-secret-key.vo.d.ts +8 -0
  284. package/dist/recaptcha-secret-key.vo.d.ts.map +1 -0
  285. package/dist/recaptcha-secret-key.vo.js +10 -0
  286. package/dist/recaptcha-secret-key.vo.js.map +1 -0
  287. package/dist/recaptcha-site-key.vo.d.ts +8 -0
  288. package/dist/recaptcha-site-key.vo.d.ts.map +1 -0
  289. package/dist/recaptcha-site-key.vo.js +10 -0
  290. package/dist/recaptcha-site-key.vo.js.map +1 -0
  291. package/dist/redactor-encrypt.adapter.js +2 -2
  292. package/dist/redactor-encrypt.adapter.js.map +1 -1
  293. package/dist/redactor-mask.adapter.d.ts.map +1 -1
  294. package/dist/redactor-mask.adapter.js +0 -3
  295. package/dist/redactor-mask.adapter.js.map +1 -1
  296. package/dist/remote-file-storage-disk.adapter.d.ts +9 -2
  297. package/dist/remote-file-storage-disk.adapter.d.ts.map +1 -1
  298. package/dist/remote-file-storage-disk.adapter.js +7 -9
  299. package/dist/remote-file-storage-disk.adapter.js.map +1 -1
  300. package/dist/safe-parse-body.service.d.ts.map +1 -1
  301. package/dist/safe-parse-body.service.js +1 -1
  302. package/dist/safe-parse-body.service.js.map +1 -1
  303. package/dist/setup.service.d.ts +3 -1
  304. package/dist/setup.service.d.ts.map +1 -1
  305. package/dist/setup.service.js +1 -1
  306. package/dist/setup.service.js.map +1 -1
  307. package/dist/shield-api-key.middleware.d.ts.map +1 -1
  308. package/dist/shield-api-key.middleware.js +1 -2
  309. package/dist/shield-api-key.middleware.js.map +1 -1
  310. package/dist/shield-auth.middleware.d.ts.map +1 -1
  311. package/dist/shield-auth.middleware.js +1 -3
  312. package/dist/shield-auth.middleware.js.map +1 -1
  313. package/dist/shield-captcha-hcaptcha-local.adapter.d.ts +2 -2
  314. package/dist/shield-captcha-hcaptcha-local.adapter.d.ts.map +1 -1
  315. package/dist/shield-captcha-hcaptcha-local.adapter.js +2 -2
  316. package/dist/shield-captcha-hcaptcha-local.adapter.js.map +1 -1
  317. package/dist/shield-captcha-hcaptcha.adapter.d.ts +2 -8
  318. package/dist/shield-captcha-hcaptcha.adapter.d.ts.map +1 -1
  319. package/dist/shield-captcha-hcaptcha.adapter.js +2 -6
  320. package/dist/shield-captcha-hcaptcha.adapter.js.map +1 -1
  321. package/dist/shield-captcha-noop.adapter.d.ts +1 -1
  322. package/dist/shield-captcha-noop.adapter.d.ts.map +1 -1
  323. package/dist/shield-captcha-noop.adapter.js +1 -1
  324. package/dist/shield-captcha-noop.adapter.js.map +1 -1
  325. package/dist/shield-captcha-recaptcha.adapter.d.ts +3 -7
  326. package/dist/shield-captcha-recaptcha.adapter.d.ts.map +1 -1
  327. package/dist/shield-captcha-recaptcha.adapter.js +12 -17
  328. package/dist/shield-captcha-recaptcha.adapter.js.map +1 -1
  329. package/dist/shield-rate-limit.middleware.d.ts +2 -2
  330. package/dist/shield-rate-limit.middleware.d.ts.map +1 -1
  331. package/dist/slower.middleware.d.ts.map +1 -1
  332. package/dist/slower.middleware.js.map +1 -1
  333. package/dist/temporary-file-absolute.adapter.d.ts +11 -3
  334. package/dist/temporary-file-absolute.adapter.d.ts.map +1 -1
  335. package/dist/temporary-file-absolute.adapter.js +11 -14
  336. package/dist/temporary-file-absolute.adapter.js.map +1 -1
  337. package/dist/temporary-file-noop.adapter.d.ts +1 -1
  338. package/dist/temporary-file-noop.adapter.d.ts.map +1 -1
  339. package/dist/temporary-file-noop.adapter.js +1 -1
  340. package/dist/temporary-file-noop.adapter.js.map +1 -1
  341. package/dist/temporary-file.port.d.ts +1 -1
  342. package/dist/temporary-file.port.d.ts.map +1 -1
  343. package/dist/time-zone-offset.middleware.d.ts.map +1 -1
  344. package/dist/time-zone-offset.middleware.js +2 -2
  345. package/dist/time-zone-offset.middleware.js.map +1 -1
  346. package/dist/translations.service.d.ts +8 -1
  347. package/dist/translations.service.d.ts.map +1 -1
  348. package/dist/translations.service.js +2 -2
  349. package/dist/translations.service.js.map +1 -1
  350. package/dist/tsconfig.tsbuildinfo +1 -1
  351. package/dist/uptime.service.js +3 -3
  352. package/dist/uptime.service.js.map +1 -1
  353. package/dist/uuid.vo.d.ts +3 -0
  354. package/dist/uuid.vo.d.ts.map +1 -1
  355. package/dist/uuid.vo.js +2 -1
  356. package/dist/uuid.vo.js.map +1 -1
  357. package/dist/visitor-id-hash-hono.adapter.d.ts +1 -1
  358. package/dist/visitor-id-hash-hono.adapter.d.ts.map +1 -1
  359. package/dist/visitor-id-hash-hono.adapter.js +4 -4
  360. package/dist/visitor-id-hash-hono.adapter.js.map +1 -1
  361. package/dist/visitor-id-hash.adapter.d.ts +1 -1
  362. package/dist/visitor-id-hash.adapter.d.ts.map +1 -1
  363. package/dist/visitor-id-hash.adapter.js +3 -3
  364. package/dist/visitor-id-hash.adapter.js.map +1 -1
  365. package/dist/weak-etag-extractor.middleware.js +2 -2
  366. package/dist/weak-etag-extractor.middleware.js.map +1 -1
  367. package/package.json +7 -7
  368. package/readme.md +20 -5
  369. package/src/antivirus-clamav.adapter.ts +7 -12
  370. package/src/antivirus.port.ts +1 -13
  371. package/src/api-version.middleware.ts +4 -4
  372. package/src/basic-auth-password.vo.ts +15 -0
  373. package/src/basic-auth-username.vo.ts +15 -0
  374. package/src/basic-auth.service.ts +3 -22
  375. package/src/better-auth-logger.service.ts +4 -3
  376. package/src/binary.vo.ts +20 -0
  377. package/src/build-info-repository.service.ts +5 -7
  378. package/src/cache-file.service.ts +2 -1
  379. package/src/cache-response.middleware.ts +3 -0
  380. package/src/certificate-inspector-tls.adapter.ts +3 -2
  381. package/src/client-from-hono.adapter.ts +1 -1
  382. package/src/clock-system.adapter.ts +2 -2
  383. package/src/clock.port.ts +1 -0
  384. package/src/context.middleware.ts +1 -0
  385. package/src/correlation-id.vo.ts +1 -0
  386. package/src/correlation-storage.service.ts +4 -1
  387. package/src/env-validator.service.ts +2 -2
  388. package/src/etag-extractor.middleware.ts +2 -2
  389. package/src/event-store-like.types.ts +1 -0
  390. package/src/event-stream.vo.ts +9 -4
  391. package/src/file-cleaner-bun-forgiving.adapter.ts +10 -0
  392. package/src/file-cleaner-bun.adapter.ts +8 -0
  393. package/src/file-cleaner-noop.adapter.ts +6 -0
  394. package/src/file-cleaner.port.ts +5 -0
  395. package/src/file-draft.service.ts +2 -2
  396. package/src/file-renamer-fs-forgiving.adapter.ts +17 -0
  397. package/src/file-renamer-fs.adapter.ts +15 -0
  398. package/src/file-renamer-noop.adapter.ts +9 -0
  399. package/src/file-renamer.port.ts +8 -0
  400. package/src/graceful-shutdown.service.ts +1 -3
  401. package/src/hcaptcha-secret-key.vo.ts +13 -0
  402. package/src/hcaptcha-site-key.vo.ts +13 -0
  403. package/src/healthcheck.service.ts +6 -4
  404. package/src/http-logger.middleware.ts +9 -10
  405. package/src/i18n.service.ts +14 -11
  406. package/src/id-provider-deterministic.adapter.ts +5 -1
  407. package/src/image-alpha-sharp.adapter.ts +7 -4
  408. package/src/image-blur-sharp.adapter.ts +7 -4
  409. package/src/image-compressor-sharp.adapter.ts +6 -2
  410. package/src/image-exif-clear-sharp.adapter.ts +6 -2
  411. package/src/image-formatter-sharp.adapter.ts +10 -5
  412. package/src/image-info-sharp.adapter.ts +5 -11
  413. package/src/image-processor-sharp.adapter.ts +10 -5
  414. package/src/image-resizer-sharp.adapter.ts +6 -3
  415. package/src/index.ts +25 -5
  416. package/src/json-file-reader-bun-forgiving.adapter.ts +12 -0
  417. package/src/json-file-reader-bun.adapter.ts +8 -0
  418. package/src/json-file-reader-noop.adapter.ts +10 -0
  419. package/src/json-file-reader.port.ts +5 -0
  420. package/src/logger-format-error.service.ts +10 -9
  421. package/src/logger.port.ts +0 -4
  422. package/src/mailer-smtp-with-logger.adapter.ts +2 -0
  423. package/src/mailer-smtp.adapter.ts +2 -31
  424. package/src/mailer.vo.ts +38 -0
  425. package/src/modules/history/event-handlers/onHistoryPopulatedEvent.ts +1 -0
  426. package/src/modules/history/events/HISTORY_CLEARED_EVENT.ts +2 -8
  427. package/src/modules/history/events/HISTORY_POPULATED_EVENT.ts +2 -8
  428. package/src/modules/history/ports/history-writer.ts +1 -0
  429. package/src/modules/history/value-objects/history-subject.ts +1 -0
  430. package/src/modules/preferences/open-host-queries/user-language.ts +1 -0
  431. package/src/modules/preferences/ports/user-language-resolver.ts +2 -7
  432. package/src/modules/preferences/value-objects/supported-languages-set.ts +2 -8
  433. package/src/pdf-generator-noop.adapter.ts +1 -1
  434. package/src/port.vo.ts +9 -1
  435. package/src/prerequisites/binary.ts +4 -14
  436. package/src/prerequisites/dependency-vulnerabilities.ts +3 -3
  437. package/src/prerequisites/directory.ts +1 -0
  438. package/src/prerequisites/jobs.ts +2 -4
  439. package/src/prerequisites/log-file.ts +1 -0
  440. package/src/prerequisites/mailer.ts +1 -0
  441. package/src/prerequisites/memory.ts +1 -1
  442. package/src/prerequisites/node.ts +1 -0
  443. package/src/prerequisites/port.ts +1 -0
  444. package/src/prerequisites/ram.ts +2 -1
  445. package/src/prerequisites/running-user.ts +1 -0
  446. package/src/prerequisites/space.ts +2 -1
  447. package/src/prerequisites/sqlite.ts +1 -2
  448. package/src/prerequisites/ssl-certificate-expiry.ts +1 -1
  449. package/src/prerequisites/timezone-utc.ts +1 -0
  450. package/src/prerequisites/translations.ts +29 -17
  451. package/src/prerequisites.service.ts +4 -4
  452. package/src/rate-limit-store-node-cache.adapter.ts +2 -2
  453. package/src/rate-limit-store.port.ts +1 -1
  454. package/src/recaptcha-secret-key.vo.ts +13 -0
  455. package/src/recaptcha-site-key.vo.ts +13 -0
  456. package/src/redactor-encrypt.adapter.ts +2 -2
  457. package/src/redactor-mask.adapter.ts +0 -3
  458. package/src/remote-file-storage-disk.adapter.ts +13 -14
  459. package/src/safe-parse-body.service.ts +2 -1
  460. package/src/setup.service.ts +3 -1
  461. package/src/shield-api-key.middleware.ts +1 -3
  462. package/src/shield-auth.middleware.ts +5 -3
  463. package/src/shield-captcha-hcaptcha-local.adapter.ts +4 -3
  464. package/src/shield-captcha-hcaptcha.adapter.ts +5 -13
  465. package/src/shield-captcha-noop.adapter.ts +1 -1
  466. package/src/shield-captcha-recaptcha.adapter.ts +15 -25
  467. package/src/shield-rate-limit.middleware.ts +2 -2
  468. package/src/slower.middleware.ts +1 -0
  469. package/src/temporary-file-absolute.adapter.ts +16 -14
  470. package/src/temporary-file-noop.adapter.ts +1 -1
  471. package/src/temporary-file.port.ts +2 -1
  472. package/src/time-zone-offset.middleware.ts +2 -5
  473. package/src/translations.service.ts +7 -4
  474. package/src/uptime.service.ts +3 -3
  475. package/src/uuid.vo.ts +4 -1
  476. package/src/visitor-id-hash-hono.adapter.ts +5 -5
  477. package/src/visitor-id-hash.adapter.ts +3 -3
  478. package/src/weak-etag-extractor.middleware.ts +2 -2
  479. package/dist/encryption.service.d.ts +0 -25
  480. package/dist/encryption.service.d.ts.map +0 -1
  481. package/dist/encryption.service.js +0 -35
  482. package/dist/encryption.service.js.map +0 -1
  483. package/dist/gzip.service.d.ts +0 -13
  484. package/dist/gzip.service.d.ts.map +0 -1
  485. package/dist/gzip.service.js +0 -18
  486. package/dist/gzip.service.js.map +0 -1
  487. package/dist/open-graph.service.d.ts +0 -104
  488. package/dist/open-graph.service.d.ts.map +0 -1
  489. package/dist/open-graph.service.js +0 -159
  490. package/dist/open-graph.service.js.map +0 -1
  491. package/dist/sitemap.service.d.ts +0 -28
  492. package/dist/sitemap.service.d.ts.map +0 -1
  493. package/dist/sitemap.service.js +0 -57
  494. package/dist/sitemap.service.js.map +0 -1
  495. package/dist/url-wo-trailing-slash.vo.d.ts +0 -4
  496. package/dist/url-wo-trailing-slash.vo.d.ts.map +0 -1
  497. package/dist/url-wo-trailing-slash.vo.js +0 -8
  498. package/dist/url-wo-trailing-slash.vo.js.map +0 -1
  499. package/src/encryption.service.ts +0 -45
  500. package/src/gzip.service.ts +0 -23
  501. package/src/open-graph.service.ts +0 -242
  502. package/src/sitemap.service.ts +0 -91
  503. package/src/url-wo-trailing-slash.vo.ts +0 -9
@@ -5,7 +5,7 @@ type NodeEnvironmentEnumType = z.infer<typeof NodeEnvironment>;
5
5
  type AnyZodSchema = z.ZodSchema<any, any>;
6
6
  type EnvironmentValidatorConfig = { type: unknown; schema: AnyZodSchema };
7
7
 
8
- export const InvalidNodeEnvironmentError = "invalid.node.environment" as const;
8
+ export const EnvironmentValidatorError = { Invalid: "environment.validator.invalid" } as const;
9
9
 
10
10
  export class EnvironmentValidator<SchemaType> {
11
11
  type: NodeEnvironmentEnumType;
@@ -21,7 +21,7 @@ export class EnvironmentValidator<SchemaType> {
21
21
  return;
22
22
  }
23
23
 
24
- throw new Error(InvalidNodeEnvironmentError);
24
+ throw new Error(EnvironmentValidatorError.Invalid);
25
25
  }
26
26
 
27
27
  load(): SchemaType & { type: NodeEnvironmentEnumType } {
@@ -6,11 +6,11 @@ export type EtagVariables = { ETag: tools.ETag | null; WeakETag: tools.WeakETag
6
6
  export class ETagExtractor {
7
7
  static attach = createMiddleware<{ Variables: EtagVariables }>(async (c, next) => {
8
8
  try {
9
- const header = String(c.req.header(tools.ETag.IF_MATCH_HEADER_NAME));
9
+ const header = c.req.header(tools.ETag.IF_MATCH_HEADER_NAME);
10
10
 
11
11
  if (!header || header === "undefined") c.set("ETag", null);
12
12
  else c.set("ETag", tools.ETag.fromHeader(header));
13
- } catch (_error) {
13
+ } catch {
14
14
  c.set("ETag", null);
15
15
  }
16
16
 
@@ -1,4 +1,5 @@
1
1
  export type EventStoreLike<E extends { name: string }> = {
2
2
  save(events: E[]): Promise<unknown>;
3
+
3
4
  saveAfter(events: E[], delay: { ms: number }): Promise<unknown>;
4
5
  };
@@ -1,9 +1,14 @@
1
1
  import { z } from "zod/v4";
2
2
 
3
- export const EventStreamInvalidError = { error: "event.stream.invalid.error" } as const;
3
+ export const EventStreamError = {
4
+ Type: "event.store.type",
5
+ Empty: "event.stream.empty",
6
+ TooLong: "event.stream.too.long",
7
+ } as const;
4
8
 
5
9
  export const EventStream = z
6
- .string(EventStreamInvalidError)
7
- .min(1, EventStreamInvalidError)
8
- .max(256, EventStreamInvalidError);
10
+ .string(EventStreamError.Type)
11
+ .min(1, EventStreamError.Empty)
12
+ .max(256, EventStreamError.TooLong);
13
+
9
14
  export type EventStreamType = z.infer<typeof EventStream>;
@@ -0,0 +1,10 @@
1
+ import type * as tools from "@bgord/tools";
2
+ import type { FileCleanerPort } from "./file-cleaner.port";
3
+
4
+ export class FileCleanerBunForgivingAdapter implements FileCleanerPort {
5
+ async delete(path: tools.FilePathRelative | tools.FilePathAbsolute | string): Promise<void> {
6
+ try {
7
+ await Bun.file(typeof path === "string" ? path : path.get()).delete();
8
+ } catch {}
9
+ }
10
+ }
@@ -0,0 +1,8 @@
1
+ import type * as tools from "@bgord/tools";
2
+ import type { FileCleanerPort } from "./file-cleaner.port";
3
+
4
+ export class FileCleanerBunAdapter implements FileCleanerPort {
5
+ async delete(path: tools.FilePathRelative | tools.FilePathAbsolute | string): Promise<void> {
6
+ await Bun.file(typeof path === "string" ? path : path.get()).delete();
7
+ }
8
+ }
@@ -0,0 +1,6 @@
1
+ import type * as tools from "@bgord/tools";
2
+ import type { FileCleanerPort } from "./file-cleaner.port";
3
+
4
+ export class FileCleanerNoopAdapter implements FileCleanerPort {
5
+ async delete(_path: tools.FilePathRelative | tools.FilePathAbsolute | string): Promise<void> {}
6
+ }
@@ -0,0 +1,5 @@
1
+ import type * as tools from "@bgord/tools";
2
+
3
+ export interface FileCleanerPort {
4
+ delete(path: tools.FilePathRelative | tools.FilePathAbsolute | string): Promise<void>;
5
+ }
@@ -8,7 +8,7 @@ export abstract class FileDraft {
8
8
 
9
9
  getHeaders(): Headers {
10
10
  return new Headers({
11
- "Content-Type": this.config.mime.raw,
11
+ "Content-Type": this.config.mime.toString(),
12
12
  "Content-Disposition": `attachment; filename="${this.config.filename}"`,
13
13
  });
14
14
  }
@@ -24,6 +24,6 @@ export abstract class FileDraft {
24
24
  async toAttachment() {
25
25
  const body = await this.create();
26
26
 
27
- return { filename: this.config.filename, content: body, contentType: this.config.mime.raw };
27
+ return { filename: this.config.filename, content: body, contentType: this.config.mime.toString() };
28
28
  }
29
29
  }
@@ -0,0 +1,17 @@
1
+ import fs from "node:fs/promises";
2
+ import type * as tools from "@bgord/tools";
3
+ import type { FileRenamerPort } from "./file-renamer.port";
4
+
5
+ export class FileRenamerFsForgivingAdapter implements FileRenamerPort {
6
+ async rename(
7
+ input: tools.FilePathRelative | tools.FilePathAbsolute | string,
8
+ output: tools.FilePathRelative | tools.FilePathAbsolute | string,
9
+ ): Promise<void> {
10
+ const from = typeof input === "string" ? input : input.get();
11
+ const to = typeof output === "string" ? output : output.get();
12
+
13
+ try {
14
+ await fs.rename(from, to);
15
+ } catch {}
16
+ }
17
+ }
@@ -0,0 +1,15 @@
1
+ import fs from "node:fs/promises";
2
+ import type * as tools from "@bgord/tools";
3
+ import type { FileRenamerPort } from "./file-renamer.port";
4
+
5
+ export class FileRenamerFsAdapter implements FileRenamerPort {
6
+ async rename(
7
+ input: tools.FilePathRelative | tools.FilePathAbsolute | string,
8
+ output: tools.FilePathRelative | tools.FilePathAbsolute | string,
9
+ ): Promise<void> {
10
+ const from = typeof input === "string" ? input : input.get();
11
+ const to = typeof output === "string" ? output : output.get();
12
+
13
+ await fs.rename(from, to);
14
+ }
15
+ }
@@ -0,0 +1,9 @@
1
+ import type * as tools from "@bgord/tools";
2
+ import type { FileRenamerPort } from "./file-renamer.port";
3
+
4
+ export class FileRenamerNoopAdapter implements FileRenamerPort {
5
+ async rename(
6
+ _input: tools.FilePathRelative | tools.FilePathAbsolute | string,
7
+ _output: tools.FilePathRelative | tools.FilePathAbsolute | string,
8
+ ): Promise<void> {}
9
+ }
@@ -0,0 +1,8 @@
1
+ import type * as tools from "@bgord/tools";
2
+
3
+ export interface FileRenamerPort {
4
+ rename(
5
+ input: tools.FilePathRelative | tools.FilePathAbsolute | string,
6
+ output: tools.FilePathRelative | tools.FilePathAbsolute | string,
7
+ ): Promise<void>;
8
+ }
@@ -29,9 +29,7 @@ export class GracefulShutdown {
29
29
  .catch((error) =>
30
30
  this.logger.error({ message: "Cleanup hook failed", error: formatError(error), ...this.base }),
31
31
  )
32
- .finally(() => {
33
- this.exitFn(exitCode);
34
- });
32
+ .finally(() => this.exitFn(exitCode));
35
33
  }
36
34
 
37
35
  applyTo(server: ServerType, cleanup: () => any = tools.noop) {
@@ -0,0 +1,13 @@
1
+ import { z } from "zod/v4";
2
+
3
+ export const HCaptchaSecretKeyError = {
4
+ Type: "hcaptcha.secret.key.type",
5
+ Length: "hcaptcha.secret.key.length",
6
+ } as const;
7
+
8
+ export const HCaptchaSecretKey = z
9
+ .string(HCaptchaSecretKeyError.Type)
10
+ .length(42, HCaptchaSecretKeyError.Length)
11
+ .brand("HCaptchaSecretKey");
12
+
13
+ export type HCaptchaSecretKeyType = z.infer<typeof HCaptchaSecretKey>;
@@ -0,0 +1,13 @@
1
+ import { z } from "zod/v4";
2
+
3
+ export const HCaptchaSiteKeyError = {
4
+ Type: "hcaptcha.site.key.type",
5
+ Length: "hcaptcha.site.key.length",
6
+ } as const;
7
+
8
+ export const HCaptchaSiteKey = z
9
+ .string(HCaptchaSiteKeyError.Type)
10
+ .length(36, HCaptchaSiteKeyError.Length)
11
+ .brand("HCaptchaSiteKey");
12
+
13
+ export type HCaptchaSiteKeyType = z.infer<typeof HCaptchaSiteKey>;
@@ -2,6 +2,8 @@ import * as tools from "@bgord/tools";
2
2
  import { createFactory } from "hono/factory";
3
3
  import { BuildInfoRepository } from "./build-info-repository.service";
4
4
  import type { ClockPort } from "./clock.port";
5
+ import type { JsonFileReaderPort } from "./json-file-reader.port";
6
+ import type { LoggerPort } from "./logger.port";
5
7
  import { MemoryConsumption } from "./memory-consumption.service";
6
8
  import * as prereqs from "./prerequisites.service";
7
9
  import { Uptime, type UptimeResultType } from "./uptime.service";
@@ -17,14 +19,14 @@ type HealthcheckResultType = {
17
19
  durationMs: tools.Duration["ms"];
18
20
  };
19
21
 
20
- type Dependencies = { Clock: ClockPort };
22
+ type Dependencies = { Clock: ClockPort; JsonFileReader: JsonFileReaderPort; Logger: LoggerPort };
21
23
 
22
24
  export class Healthcheck {
23
25
  static build = (prerequisites: prereqs.Prerequisite[], deps: Dependencies) =>
24
26
  handler.createHandlers(async (c) => {
25
27
  const stopwatch = new tools.Stopwatch(deps.Clock.nowMs());
26
28
 
27
- const build = await BuildInfoRepository.extract(deps);
29
+ const buildInfo = await BuildInfoRepository.extract(deps);
28
30
 
29
31
  const details: HealthcheckResultType["details"][number][] = [];
30
32
 
@@ -41,11 +43,11 @@ export class Healthcheck {
41
43
  const result: HealthcheckResultType = {
42
44
  ok,
43
45
  details,
44
- version: build.BUILD_VERSION ?? "unknown",
46
+ version: buildInfo.BUILD_VERSION ?? "unknown",
45
47
  uptime: Uptime.get(deps.Clock),
46
48
  memory: {
47
49
  bytes: MemoryConsumption.get().toBytes(),
48
- formatted: MemoryConsumption.get().format(tools.SizeUnit.MB),
50
+ formatted: MemoryConsumption.get().format(tools.Size.unit.MB),
49
51
  },
50
52
  durationMs: stopwatch.stop().ms,
51
53
  };
@@ -3,9 +3,8 @@ import { createMiddleware } from "hono/factory";
3
3
  import _ from "lodash";
4
4
  import { CacheHitEnum } from "./cache-resolver.service";
5
5
  import { CacheResponse } from "./cache-response.middleware";
6
- import { ClientFromHono } from "./client-from-hono.adapter";
6
+ import { ClientFromHonoAdapter } from "./client-from-hono.adapter";
7
7
  import type { ClockPort } from "./clock.port";
8
- import type { CorrelationIdType } from "./correlation-id.vo";
9
8
  import type { LoggerPort } from "./logger.port";
10
9
 
11
10
  const UNINFORMATIVE_HEADERS = [
@@ -36,8 +35,8 @@ export type HttpLoggerOptions = { skip?: readonly string[] };
36
35
 
37
36
  export class HttpLogger {
38
37
  static build = (deps: Dependencies, options?: HttpLoggerOptions) =>
39
- createMiddleware(async (c, next) => {
40
- const request = c.req.raw.clone();
38
+ createMiddleware(async (context, next) => {
39
+ const request = context.req.raw.clone();
41
40
 
42
41
  const pathname = new URL(request.url).pathname;
43
42
 
@@ -46,15 +45,15 @@ export class HttpLogger {
46
45
  return;
47
46
  }
48
47
 
49
- const correlationId = c.get("requestId") as CorrelationIdType;
50
- const client = ClientFromHono.extract(c).toJSON();
48
+ const correlationId = context.get("requestId");
49
+ const client = ClientFromHonoAdapter.extract(context).toJSON();
51
50
 
52
51
  const httpRequestBeforeMetadata = {
53
- params: c.req.param(),
52
+ params: context.req.param(),
54
53
  // @ts-expect-error
55
54
  headers: _.omit(Object.fromEntries(request.headers), UNINFORMATIVE_HEADERS),
56
55
  body: await HttpLogger.parseJSON(request),
57
- query: c.req.queries(),
56
+ query: context.req.queries(),
58
57
  };
59
58
 
60
59
  deps.Logger.http({
@@ -72,7 +71,7 @@ export class HttpLogger {
72
71
  await next();
73
72
  const duration = stopwatch.stop();
74
73
 
75
- const response = c.res.clone();
74
+ const response = context.res.clone();
76
75
 
77
76
  deps.Logger.http({
78
77
  component: "http",
@@ -93,7 +92,7 @@ export class HttpLogger {
93
92
  let result: any;
94
93
  try {
95
94
  result = await resource.json();
96
- } catch (_error) {}
95
+ } catch {}
97
96
 
98
97
  return result;
99
98
  }
@@ -1,4 +1,5 @@
1
1
  import * as tools from "@bgord/tools";
2
+ import type { JsonFileReaderPort } from "../src/json-file-reader.port";
2
3
  import type { LoggerPort } from "../src/logger.port";
3
4
 
4
5
  export type TranslationsKeyType = string;
@@ -14,29 +15,30 @@ export type I18nConfigType = {
14
15
  defaultLanguage?: string;
15
16
  };
16
17
 
18
+ type Dependencies = { JsonFileReader: JsonFileReaderPort; Logger: LoggerPort };
19
+
17
20
  export class I18n {
18
21
  private readonly base = { component: "infra", operation: "translations" };
19
22
 
20
23
  static DEFAULT_TRANSLATIONS_PATH = tools.DirectoryPathRelativeSchema.parse("infra/translations");
21
24
 
22
- constructor(private translationsPath: tools.DirectoryPathRelativeType = I18n.DEFAULT_TRANSLATIONS_PATH) {}
25
+ constructor(
26
+ private readonly deps: Dependencies,
27
+ private translationsPath: tools.DirectoryPathRelativeType = I18n.DEFAULT_TRANSLATIONS_PATH,
28
+ ) {}
23
29
 
24
30
  async getTranslations(language: tools.LanguageType): Promise<TranslationsType> {
25
- try {
26
- return Bun.file(this.getTranslationPathForLanguage(language).get()).json();
27
- } catch (_error) {
28
- return {};
29
- }
31
+ return this.deps.JsonFileReader.read(this.getTranslationPathForLanguage(language));
30
32
  }
31
33
 
32
- useTranslations(logger: LoggerPort, translations: TranslationsType) {
34
+ useTranslations(translations: TranslationsType) {
33
35
  const that = this;
34
36
 
35
37
  return function translate(key: TranslationsKeyType, variables?: TranslationVariableType) {
36
38
  const translation = translations[key];
37
39
 
38
40
  if (!translation) {
39
- logger.warn({ message: `Missing translation for key ${key}`, ...that.base });
41
+ that.deps.Logger.warn({ message: `Missing translation for key ${key}`, ...that.base });
40
42
  return key;
41
43
  }
42
44
 
@@ -50,8 +52,9 @@ export class I18n {
50
52
  }
51
53
 
52
54
  getTranslationPathForLanguage(language: tools.LanguageType): tools.FilePathRelative {
53
- const filename = tools.Filename.fromParts(language, "json");
54
-
55
- return tools.FilePathRelative.fromParts(this.translationsPath, filename);
55
+ return tools.FilePathRelative.fromParts(
56
+ this.translationsPath,
57
+ tools.Filename.fromParts(language, "json"),
58
+ );
56
59
  }
57
60
  }
@@ -1,6 +1,10 @@
1
1
  import type { IdProviderPort } from "./id-provider.port";
2
2
  import type { UUIDType } from "./uuid.vo";
3
3
 
4
+ export const IdProviderDeterministicAdapterError = {
5
+ SequenceExhausted: "id.provider.deterministic.adapter.sequence.exhausted",
6
+ } as const;
7
+
4
8
  export class IdProviderDeterministicAdapter implements IdProviderPort {
5
9
  private readonly queue: UUIDType[];
6
10
 
@@ -11,7 +15,7 @@ export class IdProviderDeterministicAdapter implements IdProviderPort {
11
15
  generate(): string {
12
16
  const next = this.queue.shift();
13
17
 
14
- if (!next) throw new Error("IdProviderDeterministicAdapter: sequence exhausted");
18
+ if (!next) throw new Error(IdProviderDeterministicAdapterError.SequenceExhausted);
15
19
  return next;
16
20
  }
17
21
  }
@@ -1,15 +1,19 @@
1
- import fs from "node:fs/promises";
2
1
  import sharp from "sharp";
2
+ import type { FileRenamerPort } from "./file-renamer.port";
3
3
  import type { ImageAlphaPort, ImageAlphaStrategy } from "./image-alpha.port";
4
4
 
5
+ type Dependencies = { FileRenamer: FileRenamerPort };
6
+
5
7
  export class ImageAlphaSharpAdapter implements ImageAlphaPort {
8
+ constructor(private readonly deps: Dependencies) {}
9
+
6
10
  async flatten(recipe: ImageAlphaStrategy) {
7
11
  const final = recipe.strategy === "output_path" ? recipe.output : recipe.input;
8
12
 
9
13
  const filename = final.getFilename();
10
14
  const temporary = final.withFilename(filename.withSuffix("-flattened"));
11
15
 
12
- const extension = String(final.getFilename().getExtension());
16
+ const extension = final.getFilename().getExtension();
13
17
  const format = (extension === "jpg" ? "jpeg" : extension) as keyof sharp.FormatEnum;
14
18
 
15
19
  const pipeline = sharp(recipe.input.get());
@@ -20,8 +24,7 @@ export class ImageAlphaSharpAdapter implements ImageAlphaPort {
20
24
  .flatten({ background: recipe.background })
21
25
  .toFormat(format)
22
26
  .toFile(temporary.get());
23
-
24
- await fs.rename(temporary.get(), final.get());
27
+ await this.deps.FileRenamer.rename(temporary, final);
25
28
 
26
29
  return final;
27
30
  }
@@ -1,23 +1,26 @@
1
- import fs from "node:fs/promises";
2
1
  import sharp from "sharp";
2
+ import type { FileRenamerPort } from "./file-renamer.port";
3
3
  import type { ImageBlurPort, ImageBlurStrategy } from "./image-blur.port";
4
4
 
5
+ type Dependencies = { FileRenamer: FileRenamerPort };
6
+
5
7
  export class ImageBlurSharpAdapter implements ImageBlurPort {
8
+ constructor(private readonly deps: Dependencies) {}
9
+
6
10
  async blur(recipe: ImageBlurStrategy) {
7
11
  const final = recipe.strategy === "output_path" ? recipe.output : recipe.input;
8
12
 
9
13
  const filename = final.getFilename();
10
14
  const temporary = final.withFilename(filename.withSuffix("-blurred"));
11
15
 
12
- const extension = String(final.getFilename().getExtension());
16
+ const extension = final.getFilename().getExtension();
13
17
  const format = (extension === "jpg" ? "jpeg" : extension) as keyof sharp.FormatEnum;
14
18
 
15
19
  const pipeline = sharp(recipe.input.get());
16
20
  using _sharp_ = { [Symbol.dispose]: () => pipeline.destroy() };
17
21
 
18
22
  await pipeline.rotate().blur(recipe.sigma).toFormat(format).toFile(temporary.get());
19
-
20
- await fs.rename(temporary.get(), final.get());
23
+ await this.deps.FileRenamer.rename(temporary, final);
21
24
 
22
25
  return final;
23
26
  }
@@ -1,8 +1,12 @@
1
- import fs from "node:fs/promises";
2
1
  import sharp from "sharp";
2
+ import type { FileRenamerPort } from "./file-renamer.port";
3
3
  import type { ImageCompressorPort, ImageCompressorStrategy } from "./image-compressor.port";
4
4
 
5
+ type Dependencies = { FileRenamer: FileRenamerPort };
6
+
5
7
  export class ImageCompressorSharpAdapter implements ImageCompressorPort {
8
+ constructor(private readonly deps: Dependencies) {}
9
+
6
10
  private static readonly DEFAULT_QUALITY = 85;
7
11
 
8
12
  async compress(recipe: ImageCompressorStrategy) {
@@ -19,7 +23,7 @@ export class ImageCompressorSharpAdapter implements ImageCompressorPort {
19
23
  using _sharp_ = { [Symbol.dispose]: () => pipeline.destroy() };
20
24
 
21
25
  await pipeline.rotate().toFormat(format, { quality }).toFile(temporary.get());
22
- await fs.rename(temporary.get(), final.get());
26
+ await this.deps.FileRenamer.rename(temporary, final);
23
27
 
24
28
  return final;
25
29
  }
@@ -1,8 +1,12 @@
1
- import fs from "node:fs/promises";
2
1
  import sharp from "sharp";
2
+ import type { FileRenamerPort } from "./file-renamer.port";
3
3
  import type { ImageExifClearPort, ImageExifClearStrategy } from "./image-exif-clear.port";
4
4
 
5
+ type Dependencies = { FileRenamer: FileRenamerPort };
6
+
5
7
  export class ImageExifClearSharpAdapter implements ImageExifClearPort {
8
+ constructor(private readonly deps: Dependencies) {}
9
+
6
10
  async clear(recipe: ImageExifClearStrategy) {
7
11
  const final = recipe.strategy === "output_path" ? recipe.output : recipe.input;
8
12
 
@@ -13,7 +17,7 @@ export class ImageExifClearSharpAdapter implements ImageExifClearPort {
13
17
  using _sharp_ = { [Symbol.dispose]: () => pipeline.destroy() };
14
18
 
15
19
  await pipeline.rotate().toFile(temporary.get());
16
- await fs.rename(temporary.get(), final.get());
20
+ await this.deps.FileRenamer.rename(temporary, final);
17
21
 
18
22
  return final;
19
23
  }
@@ -1,8 +1,13 @@
1
- import fs from "node:fs/promises";
2
1
  import sharp from "sharp";
2
+ import type { FileCleanerPort } from "./file-cleaner.port";
3
+ import type { FileRenamerPort } from "./file-renamer.port";
3
4
  import type { ImageFormatterPort, ImageFormatterStrategy } from "./image-formatter.port";
4
5
 
6
+ type Dependencies = { FileCleaner: FileCleanerPort; FileRenamer: FileRenamerPort };
7
+
5
8
  export class ImageFormatterSharpAdapter implements ImageFormatterPort {
9
+ constructor(private readonly deps: Dependencies) {}
10
+
6
11
  async format(recipe: ImageFormatterStrategy) {
7
12
  const final =
8
13
  recipe.strategy === "output_path"
@@ -11,17 +16,17 @@ export class ImageFormatterSharpAdapter implements ImageFormatterPort {
11
16
 
12
17
  const temporary = final.withFilename(final.getFilename().withSuffix("-formatted"));
13
18
 
14
- const finalExtension = String(final.getFilename().getExtension());
15
- const encoder = (finalExtension === "jpg" ? "jpeg" : finalExtension) as keyof sharp.FormatEnum;
19
+ const extension = final.getFilename().getExtension();
20
+ const encoder = (extension === "jpg" ? "jpeg" : extension) as keyof sharp.FormatEnum;
16
21
 
17
22
  const pipeline = sharp((recipe.strategy === "output_path" ? recipe.input : recipe.input).get());
18
23
  using _sharp_ = { [Symbol.dispose]: () => pipeline.destroy() };
19
24
 
20
25
  await pipeline.toFormat(encoder).toFile(temporary.get());
21
- await fs.rename(temporary.get(), final.get());
26
+ await this.deps.FileRenamer.rename(temporary, final);
22
27
 
23
28
  if (recipe.strategy === "in_place" && final.get() !== recipe.input.get()) {
24
- await fs.unlink(recipe.input.get());
29
+ await this.deps.FileCleaner.delete(recipe.input.get());
25
30
  }
26
31
 
27
32
  return final;
@@ -6,22 +6,16 @@ export class ImageInfoSharpAdapter implements ImageInfoPort {
6
6
  async inspect(filePath: tools.FilePathRelative | tools.FilePathAbsolute) {
7
7
  const path = filePath.get();
8
8
 
9
- const image = sharp(path);
9
+ const pipeline = sharp(path);
10
+ using _sharp_ = { [Symbol.dispose]: () => pipeline.destroy() };
10
11
 
11
- using _sharp_ = {
12
- [Symbol.dispose]: () => image.destroy(),
13
- };
14
-
15
- const metadata = await image.metadata();
16
- const extension = tools.Extension.parse(metadata.format);
17
-
18
- const sizeBytes = Bun.file(path).size;
12
+ const metadata = await pipeline.metadata();
19
13
 
20
14
  return {
21
15
  width: tools.ImageWidth.parse(metadata.width),
22
16
  height: tools.ImageHeight.parse(metadata.height),
23
- mime: tools.Mime.fromExtension(extension),
24
- size: tools.Size.fromBytes(sizeBytes),
17
+ mime: tools.Mime.fromExtension(tools.Extension.parse(metadata.format)),
18
+ size: tools.Size.fromBytes(Bun.file(path).size),
25
19
  };
26
20
  }
27
21
  }
@@ -1,11 +1,16 @@
1
- import fs from "node:fs/promises";
2
1
  import type * as tools from "@bgord/tools";
3
2
  import sharp from "sharp";
3
+ import type { FileCleanerPort } from "./file-cleaner.port";
4
+ import type { FileRenamerPort } from "./file-renamer.port";
4
5
  import type { ImageProcessorPort, ImageProcessorStrategy } from "./image-processor.port";
5
6
 
7
+ type Dependencies = { FileCleaner: FileCleanerPort; FileRenamer: FileRenamerPort };
8
+
6
9
  export class ImageProcessorSharpAdapter implements ImageProcessorPort {
7
10
  private static readonly DEFAULT_QUALITY = 85;
8
11
 
12
+ constructor(private readonly deps: Dependencies) {}
13
+
9
14
  async process(recipe: ImageProcessorStrategy): Promise<tools.FilePathRelative | tools.FilePathAbsolute> {
10
15
  const final =
11
16
  recipe.strategy === "output_path"
@@ -14,8 +19,8 @@ export class ImageProcessorSharpAdapter implements ImageProcessorPort {
14
19
 
15
20
  const temporary = final.withFilename(final.getFilename().withSuffix("-processed"));
16
21
 
17
- const finalExtension = final.getFilename().getExtension();
18
- const encoder = (finalExtension === "jpg" ? "jpeg" : finalExtension) as keyof sharp.FormatEnum;
22
+ const extension = final.getFilename().getExtension();
23
+ const encoder = (extension === "jpg" ? "jpeg" : extension) as keyof sharp.FormatEnum;
19
24
 
20
25
  const quality = recipe.quality ?? ImageProcessorSharpAdapter.DEFAULT_QUALITY;
21
26
 
@@ -38,10 +43,10 @@ export class ImageProcessorSharpAdapter implements ImageProcessorPort {
38
43
  processor = processor.toFormat(encoder, { quality });
39
44
 
40
45
  await processor.toFile(temporary.get());
41
- await fs.rename(temporary.get(), final.get());
46
+ await this.deps.FileRenamer.rename(temporary, final);
42
47
 
43
48
  if (recipe.strategy === "in_place" && final.get() !== recipe.input.get()) {
44
- await fs.unlink(recipe.input.get());
49
+ await this.deps.FileCleaner.delete(recipe.input.get());
45
50
  }
46
51
 
47
52
  return final;
@@ -1,8 +1,12 @@
1
- import fs from "node:fs/promises";
2
1
  import sharp from "sharp";
2
+ import type { FileRenamerPort } from "./file-renamer.port";
3
3
  import type { ImageResizerPort, ImageResizerStrategy } from "./image-resizer.port";
4
4
 
5
+ type Dependencies = { FileRenamer: FileRenamerPort };
6
+
5
7
  export class ImageResizerSharpAdapter implements ImageResizerPort {
8
+ constructor(private readonly deps: Dependencies) {}
9
+
6
10
  async resize(recipe: ImageResizerStrategy) {
7
11
  const final = recipe.strategy === "output_path" ? recipe.output : recipe.input;
8
12
  const filename = final.getFilename();
@@ -24,8 +28,7 @@ export class ImageResizerSharpAdapter implements ImageResizerPort {
24
28
  })
25
29
  .toFormat(format)
26
30
  .toFile(temporary.get());
27
-
28
- await fs.rename(temporary.get(), final.get());
31
+ await this.deps.FileRenamer.rename(temporary, final);
29
32
 
30
33
  return final;
31
34
  }