@bgord/bun 0.7.0 → 0.8.1

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 (459) hide show
  1. package/README.md +1 -3
  2. package/dist/api-key-shield.middleware.d.ts +14 -0
  3. package/dist/api-key-shield.middleware.d.ts.map +1 -0
  4. package/dist/api-key-shield.middleware.js +19 -0
  5. package/dist/api-key-shield.middleware.js.map +1 -0
  6. package/dist/api-version.middleware.d.ts +6 -0
  7. package/dist/api-version.middleware.d.ts.map +1 -0
  8. package/dist/api-version.middleware.js +12 -0
  9. package/dist/api-version.middleware.js.map +1 -0
  10. package/dist/auth-shield.middleware.d.ts +31 -0
  11. package/dist/auth-shield.middleware.d.ts.map +1 -0
  12. package/dist/auth-shield.middleware.js +83 -0
  13. package/dist/auth-shield.middleware.js.map +1 -0
  14. package/dist/basic-auth.d.ts +8 -0
  15. package/dist/basic-auth.d.ts.map +1 -1
  16. package/dist/basic-auth.js +9 -0
  17. package/dist/basic-auth.js.map +1 -1
  18. package/dist/basic-auth.service.d.ts +14 -0
  19. package/dist/basic-auth.service.d.ts.map +1 -0
  20. package/dist/basic-auth.service.js +13 -0
  21. package/dist/basic-auth.service.js.map +1 -0
  22. package/dist/build-info-repository.service.d.ts +10 -0
  23. package/dist/build-info-repository.service.d.ts.map +1 -0
  24. package/dist/build-info-repository.service.js +18 -0
  25. package/dist/build-info-repository.service.js.map +1 -0
  26. package/dist/cache-resolver.service.d.ts +46 -0
  27. package/dist/cache-resolver.service.d.ts.map +1 -0
  28. package/dist/cache-resolver.service.js +44 -0
  29. package/dist/cache-resolver.service.js.map +1 -0
  30. package/dist/cache-response.middleware.d.ts +9 -0
  31. package/dist/cache-response.middleware.d.ts.map +1 -0
  32. package/dist/cache-response.middleware.js +25 -0
  33. package/dist/cache-response.middleware.js.map +1 -0
  34. package/dist/cache-static-files.middleware.d.ts +9 -0
  35. package/dist/cache-static-files.middleware.d.ts.map +1 -0
  36. package/dist/cache-static-files.middleware.js +25 -0
  37. package/dist/cache-static-files.middleware.js.map +1 -0
  38. package/dist/context.middleware.d.ts +14 -0
  39. package/dist/context.middleware.d.ts.map +1 -0
  40. package/dist/context.middleware.js +11 -0
  41. package/dist/context.middleware.js.map +1 -0
  42. package/dist/correlation-id.d.ts.map +1 -1
  43. package/dist/correlation-id.vo.d.ts +4 -0
  44. package/dist/correlation-id.vo.d.ts.map +1 -0
  45. package/dist/correlation-id.vo.js +3 -0
  46. package/dist/correlation-id.vo.js.map +1 -0
  47. package/dist/decorators.d.ts +4 -0
  48. package/dist/decorators.d.ts.map +1 -0
  49. package/dist/decorators.js +62 -0
  50. package/dist/decorators.js.map +1 -0
  51. package/dist/decorators.service.d.ts +12 -0
  52. package/dist/decorators.service.d.ts.map +1 -0
  53. package/dist/decorators.service.js +62 -0
  54. package/dist/decorators.service.js.map +1 -0
  55. package/dist/download-file.service.d.ts +13 -0
  56. package/dist/download-file.service.d.ts.map +1 -0
  57. package/dist/download-file.service.js +11 -0
  58. package/dist/download-file.service.js.map +1 -0
  59. package/dist/encryption.d.ts +8 -3
  60. package/dist/encryption.d.ts.map +1 -0
  61. package/dist/encryption.js +37 -0
  62. package/dist/encryption.js.map +1 -0
  63. package/dist/encryption.service.d.ts +25 -0
  64. package/dist/encryption.service.d.ts.map +1 -0
  65. package/dist/encryption.service.js +37 -0
  66. package/dist/encryption.service.js.map +1 -0
  67. package/dist/env-validator.service.d.ts +21 -0
  68. package/dist/env-validator.service.d.ts.map +1 -0
  69. package/dist/env-validator.service.js +28 -0
  70. package/dist/env-validator.service.js.map +1 -0
  71. package/dist/etag-extractor.middleware.d.ts +11 -0
  72. package/dist/etag-extractor.middleware.d.ts.map +1 -0
  73. package/dist/etag-extractor.middleware.js +18 -0
  74. package/dist/etag-extractor.middleware.js.map +1 -0
  75. package/dist/event-handler.d.ts +8 -0
  76. package/dist/event-handler.d.ts.map +1 -0
  77. package/dist/event-handler.js +21 -0
  78. package/dist/event-handler.js.map +1 -0
  79. package/dist/event-handler.service.d.ts +8 -0
  80. package/dist/event-handler.service.d.ts.map +1 -0
  81. package/dist/event-handler.service.js +21 -0
  82. package/dist/event-handler.service.js.map +1 -0
  83. package/dist/event-logger.d.ts +8 -0
  84. package/dist/event-logger.d.ts.map +1 -0
  85. package/dist/event-logger.js +19 -0
  86. package/dist/event-logger.js.map +1 -0
  87. package/dist/event-logger.service.d.ts +8 -0
  88. package/dist/event-logger.service.d.ts.map +1 -0
  89. package/dist/event-logger.service.js +19 -0
  90. package/dist/event-logger.service.js.map +1 -0
  91. package/dist/event.d.ts +7 -46
  92. package/dist/event.d.ts.map +1 -0
  93. package/dist/event.js +23 -0
  94. package/dist/event.js.map +1 -0
  95. package/dist/event.vo.d.ts +20 -0
  96. package/dist/event.vo.d.ts.map +1 -0
  97. package/dist/event.vo.js +23 -0
  98. package/dist/event.vo.js.map +1 -0
  99. package/dist/file-location.d.ts +10 -9
  100. package/dist/file-location.d.ts.map +1 -0
  101. package/dist/file-location.js +46 -0
  102. package/dist/file-location.js.map +1 -0
  103. package/dist/file-location.service.d.ts +32 -0
  104. package/dist/file-location.service.d.ts.map +1 -0
  105. package/dist/file-location.service.js +46 -0
  106. package/dist/file-location.service.js.map +1 -0
  107. package/dist/file-uploader.middleware.d.ts +13 -0
  108. package/dist/file-uploader.middleware.d.ts.map +1 -0
  109. package/dist/file-uploader.middleware.js +35 -0
  110. package/dist/file-uploader.middleware.js.map +1 -0
  111. package/dist/graceful-shutdown.service.d.ts +7 -0
  112. package/dist/graceful-shutdown.service.d.ts.map +1 -0
  113. package/dist/graceful-shutdown.service.js +32 -0
  114. package/dist/graceful-shutdown.service.js.map +1 -0
  115. package/dist/gzip.d.ts +1 -0
  116. package/dist/gzip.d.ts.map +1 -0
  117. package/dist/gzip.js +18 -0
  118. package/dist/gzip.js.map +1 -0
  119. package/dist/gzip.service.d.ts +13 -0
  120. package/dist/gzip.service.d.ts.map +1 -0
  121. package/dist/gzip.service.js +18 -0
  122. package/dist/gzip.service.js.map +1 -0
  123. package/dist/hcaptcha-shield.d.ts +12 -13
  124. package/dist/hcaptcha-shield.d.ts.map +1 -0
  125. package/dist/hcaptcha-shield.js +34 -0
  126. package/dist/hcaptcha-shield.js.map +1 -0
  127. package/dist/hcaptcha-shield.middleware.d.ts +23 -0
  128. package/dist/hcaptcha-shield.middleware.d.ts.map +1 -0
  129. package/dist/hcaptcha-shield.middleware.js +34 -0
  130. package/dist/hcaptcha-shield.middleware.js.map +1 -0
  131. package/dist/healthcheck.d.ts +5 -5
  132. package/dist/healthcheck.d.ts.map +1 -1
  133. package/dist/healthcheck.js +5 -5
  134. package/dist/healthcheck.js.map +1 -1
  135. package/dist/healthcheck.service.d.ts +22 -0
  136. package/dist/healthcheck.service.d.ts.map +1 -0
  137. package/dist/healthcheck.service.js +35 -0
  138. package/dist/healthcheck.service.js.map +1 -0
  139. package/dist/http-logger.middleware.d.ts +7 -0
  140. package/dist/http-logger.middleware.d.ts.map +1 -0
  141. package/dist/http-logger.middleware.js +89 -0
  142. package/dist/http-logger.middleware.js.map +1 -0
  143. package/dist/i18n.d.ts.map +1 -1
  144. package/dist/i18n.js.map +1 -1
  145. package/dist/i18n.service.d.ts +22 -0
  146. package/dist/i18n.service.d.ts.map +1 -0
  147. package/dist/i18n.service.js +35 -0
  148. package/dist/i18n.service.js.map +1 -0
  149. package/dist/image-compressor.d.ts +9 -4
  150. package/dist/image-compressor.d.ts.map +1 -0
  151. package/dist/image-compressor.js +13 -0
  152. package/dist/image-compressor.js.map +1 -0
  153. package/dist/image-compressor.service.d.ts +15 -0
  154. package/dist/image-compressor.service.d.ts.map +1 -0
  155. package/dist/image-compressor.service.js +13 -0
  156. package/dist/image-compressor.service.js.map +1 -0
  157. package/dist/image-exif.d.ts +10 -9
  158. package/dist/image-exif.d.ts.map +1 -0
  159. package/dist/image-exif.js +21 -0
  160. package/dist/image-exif.js.map +1 -0
  161. package/dist/image-exif.service.d.ts +19 -0
  162. package/dist/image-exif.service.d.ts.map +1 -0
  163. package/dist/image-exif.service.js +21 -0
  164. package/dist/image-exif.service.js.map +1 -0
  165. package/dist/index.d.ts +51 -34
  166. package/dist/index.d.ts.map +1 -1
  167. package/dist/index.js +51 -34
  168. package/dist/index.js.map +1 -1
  169. package/dist/jobs.d.ts.map +1 -1
  170. package/dist/jobs.js.map +1 -1
  171. package/dist/jobs.service.d.ts +33 -0
  172. package/dist/jobs.service.d.ts.map +1 -0
  173. package/dist/jobs.service.js +72 -0
  174. package/dist/jobs.service.js.map +1 -0
  175. package/dist/logger.d.ts.map +1 -1
  176. package/dist/logger.js.map +1 -1
  177. package/dist/logger.service.d.ts +69 -0
  178. package/dist/logger.service.d.ts.map +1 -0
  179. package/dist/logger.service.js +87 -0
  180. package/dist/logger.service.js.map +1 -0
  181. package/dist/mailer.d.ts.map +1 -1
  182. package/dist/mailer.js.map +1 -1
  183. package/dist/mailer.service.d.ts +38 -0
  184. package/dist/mailer.service.d.ts.map +1 -0
  185. package/dist/mailer.service.js +33 -0
  186. package/dist/mailer.service.js.map +1 -0
  187. package/dist/memory-consumption.service.d.ts +5 -0
  188. package/dist/memory-consumption.service.d.ts.map +1 -0
  189. package/dist/memory-consumption.service.js +8 -0
  190. package/dist/memory-consumption.service.js.map +1 -0
  191. package/dist/new-uuid.service.d.ts +4 -0
  192. package/dist/new-uuid.service.d.ts.map +1 -0
  193. package/dist/new-uuid.service.js +6 -0
  194. package/dist/new-uuid.service.js.map +1 -0
  195. package/dist/node-env.vo.d.ts.map +1 -1
  196. package/dist/node-env.vo.js.map +1 -1
  197. package/dist/open-graph.d.ts +31 -12
  198. package/dist/open-graph.d.ts.map +1 -0
  199. package/dist/open-graph.js +172 -0
  200. package/dist/open-graph.js.map +1 -0
  201. package/dist/open-graph.service.d.ts +110 -0
  202. package/dist/open-graph.service.d.ts.map +1 -0
  203. package/dist/open-graph.service.js +172 -0
  204. package/dist/open-graph.service.js.map +1 -0
  205. package/dist/passwords.d.ts.map +1 -1
  206. package/dist/passwords.js.map +1 -1
  207. package/dist/passwords.vo.d.ts +21 -0
  208. package/dist/passwords.vo.d.ts.map +1 -0
  209. package/dist/passwords.vo.js +42 -0
  210. package/dist/passwords.vo.js.map +1 -0
  211. package/dist/path.d.ts.map +1 -1
  212. package/dist/path.vo.d.ts +4 -0
  213. package/dist/path.vo.d.ts.map +1 -0
  214. package/dist/path.vo.js +3 -0
  215. package/dist/path.vo.js.map +1 -0
  216. package/dist/policy.service.d.ts +12 -0
  217. package/dist/policy.service.d.ts.map +1 -0
  218. package/dist/policy.service.js +14 -0
  219. package/dist/policy.service.js.map +1 -0
  220. package/dist/port.d.ts.map +1 -1
  221. package/dist/port.vo.d.ts +4 -0
  222. package/dist/port.vo.d.ts.map +1 -0
  223. package/dist/port.vo.js +3 -0
  224. package/dist/port.vo.js.map +1 -0
  225. package/dist/prerequisites/binary.d.ts +5 -5
  226. package/dist/prerequisites/binary.d.ts.map +1 -1
  227. package/dist/prerequisites/binary.js +4 -4
  228. package/dist/prerequisites/binary.js.map +1 -1
  229. package/dist/prerequisites/bun.d.ts +5 -5
  230. package/dist/prerequisites/bun.d.ts.map +1 -1
  231. package/dist/prerequisites/bun.js +5 -3
  232. package/dist/prerequisites/bun.js.map +1 -1
  233. package/dist/prerequisites/dependency-vulnerabilities.d.ts +13 -0
  234. package/dist/prerequisites/dependency-vulnerabilities.d.ts.map +1 -0
  235. package/dist/prerequisites/dependency-vulnerabilities.js +30 -0
  236. package/dist/prerequisites/dependency-vulnerabilities.js.map +1 -0
  237. package/dist/prerequisites/external-api.d.ts +14 -0
  238. package/dist/prerequisites/external-api.d.ts.map +1 -0
  239. package/dist/prerequisites/external-api.js +21 -0
  240. package/dist/prerequisites/external-api.js.map +1 -0
  241. package/dist/prerequisites/index.d.ts +2 -0
  242. package/dist/prerequisites/index.d.ts.map +1 -1
  243. package/dist/prerequisites/index.js +2 -0
  244. package/dist/prerequisites/index.js.map +1 -1
  245. package/dist/prerequisites/jobs.d.ts +6 -6
  246. package/dist/prerequisites/jobs.d.ts.map +1 -1
  247. package/dist/prerequisites/jobs.js +5 -5
  248. package/dist/prerequisites/jobs.js.map +1 -1
  249. package/dist/prerequisites/log-file.d.ts +6 -6
  250. package/dist/prerequisites/log-file.d.ts.map +1 -1
  251. package/dist/prerequisites/log-file.js +4 -4
  252. package/dist/prerequisites/log-file.js.map +1 -1
  253. package/dist/prerequisites/mailer.d.ts +6 -6
  254. package/dist/prerequisites/mailer.d.ts.map +1 -1
  255. package/dist/prerequisites/mailer.js +4 -4
  256. package/dist/prerequisites/mailer.js.map +1 -1
  257. package/dist/prerequisites/memory.d.ts +5 -5
  258. package/dist/prerequisites/memory.d.ts.map +1 -1
  259. package/dist/prerequisites/memory.js +5 -5
  260. package/dist/prerequisites/memory.js.map +1 -1
  261. package/dist/prerequisites/node.d.ts +5 -5
  262. package/dist/prerequisites/node.d.ts.map +1 -1
  263. package/dist/prerequisites/node.js +4 -4
  264. package/dist/prerequisites/node.js.map +1 -1
  265. package/dist/prerequisites/outside-connectivity.d.ts +5 -5
  266. package/dist/prerequisites/outside-connectivity.d.ts.map +1 -1
  267. package/dist/prerequisites/outside-connectivity.js +4 -4
  268. package/dist/prerequisites/outside-connectivity.js.map +1 -1
  269. package/dist/prerequisites/path.d.ts +5 -5
  270. package/dist/prerequisites/path.d.ts.map +1 -1
  271. package/dist/prerequisites/path.js +4 -4
  272. package/dist/prerequisites/path.js.map +1 -1
  273. package/dist/prerequisites/port.d.ts +6 -6
  274. package/dist/prerequisites/port.d.ts.map +1 -1
  275. package/dist/prerequisites/port.js +6 -6
  276. package/dist/prerequisites/port.js.map +1 -1
  277. package/dist/prerequisites/ram.d.ts +5 -5
  278. package/dist/prerequisites/ram.d.ts.map +1 -1
  279. package/dist/prerequisites/ram.js +4 -4
  280. package/dist/prerequisites/ram.js.map +1 -1
  281. package/dist/prerequisites/self.d.ts +5 -5
  282. package/dist/prerequisites/self.d.ts.map +1 -1
  283. package/dist/prerequisites/self.js +4 -4
  284. package/dist/prerequisites/self.js.map +1 -1
  285. package/dist/prerequisites/space.d.ts +5 -5
  286. package/dist/prerequisites/space.d.ts.map +1 -1
  287. package/dist/prerequisites/space.js +4 -4
  288. package/dist/prerequisites/space.js.map +1 -1
  289. package/dist/prerequisites/ssl-certificate-expiry.d.ts +5 -5
  290. package/dist/prerequisites/ssl-certificate-expiry.d.ts.map +1 -1
  291. package/dist/prerequisites/ssl-certificate-expiry.js +5 -5
  292. package/dist/prerequisites/ssl-certificate-expiry.js.map +1 -1
  293. package/dist/prerequisites/timezone-utc.d.ts +5 -5
  294. package/dist/prerequisites/timezone-utc.d.ts.map +1 -1
  295. package/dist/prerequisites/timezone-utc.js +4 -4
  296. package/dist/prerequisites/timezone-utc.js.map +1 -1
  297. package/dist/prerequisites/translations.d.ts +8 -8
  298. package/dist/prerequisites/translations.d.ts.map +1 -1
  299. package/dist/prerequisites/translations.js +8 -8
  300. package/dist/prerequisites/translations.js.map +1 -1
  301. package/dist/prerequisites.d.ts +2 -0
  302. package/dist/prerequisites.d.ts.map +1 -1
  303. package/dist/prerequisites.js +2 -0
  304. package/dist/prerequisites.js.map +1 -1
  305. package/dist/prerequisites.service.d.ts +49 -0
  306. package/dist/prerequisites.service.d.ts.map +1 -0
  307. package/dist/prerequisites.service.js +86 -0
  308. package/dist/prerequisites.service.js.map +1 -0
  309. package/dist/rate-limit-shield.middleware.d.ts +10 -0
  310. package/dist/rate-limit-shield.middleware.d.ts.map +1 -0
  311. package/dist/rate-limit-shield.middleware.js +21 -0
  312. package/dist/rate-limit-shield.middleware.js.map +1 -0
  313. package/dist/recaptcha-shield.d.ts +13 -5
  314. package/dist/recaptcha-shield.d.ts.map +1 -0
  315. package/dist/recaptcha-shield.js +50 -0
  316. package/dist/recaptcha-shield.js.map +1 -0
  317. package/dist/recaptcha-shield.middleware.d.ts +20 -0
  318. package/dist/recaptcha-shield.middleware.d.ts.map +1 -0
  319. package/dist/recaptcha-shield.middleware.js +50 -0
  320. package/dist/recaptcha-shield.middleware.js.map +1 -0
  321. package/dist/session-id.vo.d.ts +7 -0
  322. package/dist/session-id.vo.d.ts.map +1 -0
  323. package/dist/session-id.vo.js +10 -0
  324. package/dist/session-id.vo.js.map +1 -0
  325. package/dist/setup.js +1 -1
  326. package/dist/setup.js.map +1 -1
  327. package/dist/setup.service.d.ts +9 -0
  328. package/dist/setup.service.d.ts.map +1 -0
  329. package/dist/setup.service.js +39 -0
  330. package/dist/setup.service.js.map +1 -0
  331. package/dist/simulated-error.d.ts +2 -2
  332. package/dist/simulated-error.d.ts.map +1 -0
  333. package/dist/simulated-error.js +7 -0
  334. package/dist/simulated-error.js.map +1 -0
  335. package/dist/simulated-error.middleware.d.ts +4 -0
  336. package/dist/simulated-error.middleware.d.ts.map +1 -0
  337. package/dist/simulated-error.middleware.js +7 -0
  338. package/dist/simulated-error.middleware.js.map +1 -0
  339. package/dist/sitemap.d.ts +19 -27
  340. package/dist/sitemap.d.ts.map +1 -0
  341. package/dist/sitemap.js +57 -0
  342. package/dist/sitemap.js.map +1 -0
  343. package/dist/sitemap.service.d.ts +29 -0
  344. package/dist/sitemap.service.d.ts.map +1 -0
  345. package/dist/sitemap.service.js +57 -0
  346. package/dist/sitemap.service.js.map +1 -0
  347. package/dist/slower.d.ts +3 -6
  348. package/dist/slower.d.ts.map +1 -0
  349. package/dist/slower.js +8 -0
  350. package/dist/slower.js.map +1 -0
  351. package/dist/slower.middleware.d.ts +5 -0
  352. package/dist/slower.middleware.d.ts.map +1 -0
  353. package/dist/slower.middleware.js +8 -0
  354. package/dist/slower.middleware.js.map +1 -0
  355. package/dist/time-zone-offset.middleware.d.ts +15 -0
  356. package/dist/time-zone-offset.middleware.d.ts.map +1 -0
  357. package/dist/time-zone-offset.middleware.js +22 -0
  358. package/dist/time-zone-offset.middleware.js.map +1 -0
  359. package/dist/tsconfig.tsbuildinfo +1 -1
  360. package/dist/uptime.service.d.ts +9 -0
  361. package/dist/uptime.service.d.ts.map +1 -0
  362. package/dist/uptime.service.js +10 -0
  363. package/dist/uptime.service.js.map +1 -0
  364. package/dist/url-wo-trailing-slash.d.ts +4 -0
  365. package/dist/url-wo-trailing-slash.d.ts.map +1 -0
  366. package/dist/url-wo-trailing-slash.js +9 -0
  367. package/dist/url-wo-trailing-slash.js.map +1 -0
  368. package/dist/url-wo-trailing-slash.vo.d.ts +4 -0
  369. package/dist/url-wo-trailing-slash.vo.d.ts.map +1 -0
  370. package/dist/url-wo-trailing-slash.vo.js +9 -0
  371. package/dist/url-wo-trailing-slash.vo.js.map +1 -0
  372. package/dist/username.vo.d.ts +11 -0
  373. package/dist/username.vo.d.ts.map +1 -0
  374. package/dist/username.vo.js +13 -0
  375. package/dist/username.vo.js.map +1 -0
  376. package/dist/uuid.d.ts.map +1 -1
  377. package/dist/uuid.vo.d.ts +4 -0
  378. package/dist/uuid.vo.d.ts.map +1 -0
  379. package/dist/uuid.vo.js +4 -0
  380. package/dist/uuid.vo.js.map +1 -0
  381. package/dist/weak-etag-extractor.middleware.d.ts +7 -0
  382. package/dist/weak-etag-extractor.middleware.d.ts.map +1 -0
  383. package/dist/weak-etag-extractor.middleware.js +18 -0
  384. package/dist/weak-etag-extractor.middleware.js.map +1 -0
  385. package/package.json +5 -2
  386. package/src/{api-version.ts → api-version.middleware.ts} +1 -1
  387. package/src/{auth-shield.ts → auth-shield.middleware.ts} +3 -3
  388. package/src/basic-auth.service.ts +26 -0
  389. package/src/{cache-response.ts → cache-response.middleware.ts} +1 -1
  390. package/src/{context.ts → context.middleware.ts} +2 -2
  391. package/src/{correlation-id.ts → correlation-id.vo.ts} +2 -1
  392. package/src/decorators.service.ts +78 -0
  393. package/src/encryption.service.ts +60 -0
  394. package/src/event-handler.service.ts +20 -0
  395. package/src/event-logger.service.ts +24 -0
  396. package/src/event.vo.ts +29 -0
  397. package/src/file-location.service.ts +70 -0
  398. package/src/gzip.service.ts +23 -0
  399. package/src/hcaptcha-shield.middleware.ts +57 -0
  400. package/src/{healthcheck.ts → healthcheck.service.ts} +12 -17
  401. package/src/{http-logger.ts → http-logger.middleware.ts} +4 -4
  402. package/src/{i18n.ts → i18n.service.ts} +6 -2
  403. package/src/image-compressor.service.ts +26 -0
  404. package/src/image-exif.service.ts +38 -0
  405. package/src/index.ts +51 -34
  406. package/src/{jobs.ts → jobs.service.ts} +4 -3
  407. package/src/{logger.ts → logger.service.ts} +8 -2
  408. package/src/{mailer.ts → mailer.service.ts} +11 -2
  409. package/src/node-env.vo.ts +1 -0
  410. package/src/open-graph.service.ts +259 -0
  411. package/src/{passwords.ts → passwords.vo.ts} +1 -0
  412. package/src/{path.ts → path.vo.ts} +1 -0
  413. package/src/policy.service.ts +25 -0
  414. package/src/{port.ts → port.vo.ts} +1 -0
  415. package/src/prerequisites/binary.ts +6 -10
  416. package/src/prerequisites/bun.ts +7 -10
  417. package/src/prerequisites/dependency-vulnerabilities.ts +54 -0
  418. package/src/prerequisites/external-api.ts +27 -0
  419. package/src/prerequisites/index.ts +2 -0
  420. package/src/prerequisites/jobs.ts +7 -13
  421. package/src/prerequisites/log-file.ts +7 -12
  422. package/src/prerequisites/mailer.ts +7 -12
  423. package/src/prerequisites/memory.ts +7 -12
  424. package/src/prerequisites/node.ts +6 -11
  425. package/src/prerequisites/outside-connectivity.ts +6 -11
  426. package/src/prerequisites/path.ts +6 -11
  427. package/src/prerequisites/port.ts +9 -15
  428. package/src/prerequisites/ram.ts +6 -11
  429. package/src/prerequisites/self.ts +6 -11
  430. package/src/prerequisites/space.ts +6 -11
  431. package/src/prerequisites/ssl-certificate-expiry.ts +7 -12
  432. package/src/prerequisites/timezone-utc.ts +6 -11
  433. package/src/prerequisites/translations.ts +14 -19
  434. package/src/{prerequisites.ts → prerequisites.service.ts} +3 -0
  435. package/src/{rate-limit-shield.ts → rate-limit-shield.middleware.ts} +8 -2
  436. package/src/recaptcha-shield.middleware.ts +76 -0
  437. package/src/{setup.ts → setup.service.ts} +9 -9
  438. package/src/simulated-error.middleware.ts +8 -0
  439. package/src/sitemap.service.ts +98 -0
  440. package/src/slower.middleware.ts +10 -0
  441. package/src/url-wo-trailing-slash.vo.ts +11 -0
  442. package/src/{uuid.ts → uuid.vo.ts} +2 -1
  443. package/src/{weak-etag-extractor.ts → weak-etag-extractor.middleware.ts} +1 -1
  444. package/src/basic-auth.ts +0 -7
  445. /package/src/{api-key-shield.ts → api-key-shield.middleware.ts} +0 -0
  446. /package/src/{build-info-repository.ts → build-info-repository.service.ts} +0 -0
  447. /package/src/{cache-resolver.ts → cache-resolver.service.ts} +0 -0
  448. /package/src/{cache-static-files.ts → cache-static-files.middleware.ts} +0 -0
  449. /package/src/{download-file.ts → download-file.service.ts} +0 -0
  450. /package/src/{env-validator.ts → env-validator.service.ts} +0 -0
  451. /package/src/{etag-extractor.ts → etag-extractor.middleware.ts} +0 -0
  452. /package/src/{file-uploader.ts → file-uploader.middleware.ts} +0 -0
  453. /package/src/{graceful-shutdown.ts → graceful-shutdown.service.ts} +0 -0
  454. /package/src/{memory-consumption.ts → memory-consumption.service.ts} +0 -0
  455. /package/src/{new-uuid.ts → new-uuid.service.ts} +0 -0
  456. /package/src/{session-id.ts → session-id.vo.ts} +0 -0
  457. /package/src/{time-zone-offset.ts → time-zone-offset.middleware.ts} +0 -0
  458. /package/src/{uptime.ts → uptime.service.ts} +0 -0
  459. /package/src/{username.ts → username.vo.ts} +0 -0
@@ -1,24 +1,19 @@
1
1
  import * as tools from "@bgord/tools";
2
2
  import { createFactory } from "hono/factory";
3
3
 
4
- import { BuildInfoRepository } from "./build-info-repository";
5
- import { MemoryConsumption } from "./memory-consumption";
6
- import {
7
- AbstractPrerequisite,
8
- BasePrerequisiteConfig,
9
- PrerequisiteLabelType,
10
- PrerequisiteStatusEnum,
11
- } from "./prerequisites";
12
- import { Uptime, UptimeResultType } from "./uptime";
4
+ import { BuildInfoRepository } from "./build-info-repository.service";
5
+ import { MemoryConsumption } from "./memory-consumption.service";
6
+ import * as prereqs from "./prerequisites.service";
7
+ import { Uptime, UptimeResultType } from "./uptime.service";
13
8
 
14
9
  const handler = createFactory();
15
10
 
16
11
  type HealthcheckResultType = {
17
- ok: PrerequisiteStatusEnum;
12
+ ok: prereqs.PrerequisiteStatusEnum;
18
13
  version: tools.BuildVersionType;
19
14
  details: {
20
- label: PrerequisiteLabelType;
21
- status: PrerequisiteStatusEnum;
15
+ label: prereqs.PrerequisiteLabelType;
16
+ status: prereqs.PrerequisiteStatusEnum;
22
17
  }[];
23
18
  uptime: UptimeResultType;
24
19
  memory: {
@@ -28,7 +23,7 @@ type HealthcheckResultType = {
28
23
  } & tools.StopwatchResultType;
29
24
 
30
25
  export class Healthcheck {
31
- static build = (prerequisites: AbstractPrerequisite<BasePrerequisiteConfig>[]) =>
26
+ static build = (prerequisites: prereqs.AbstractPrerequisite<prereqs.BasePrerequisiteConfig>[]) =>
32
27
  handler.createHandlers(async (c) => {
33
28
  const stopwatch = new tools.Stopwatch();
34
29
 
@@ -41,11 +36,11 @@ export class Healthcheck {
41
36
  details.push({ label: prerequisite.label, status });
42
37
  }
43
38
 
44
- const ok = details.every((result) => result.status !== PrerequisiteStatusEnum.failure)
45
- ? PrerequisiteStatusEnum.success
46
- : PrerequisiteStatusEnum.failure;
39
+ const ok = details.every((result) => result.status !== prereqs.PrerequisiteStatusEnum.failure)
40
+ ? prereqs.PrerequisiteStatusEnum.success
41
+ : prereqs.PrerequisiteStatusEnum.failure;
47
42
 
48
- const code = ok === PrerequisiteStatusEnum.success ? 200 : 424;
43
+ const code = ok === prereqs.PrerequisiteStatusEnum.success ? 200 : 424;
49
44
 
50
45
  const result: HealthcheckResultType = {
51
46
  ok,
@@ -2,10 +2,10 @@ import { getConnInfo } from "hono/bun";
2
2
  import { createMiddleware } from "hono/factory";
3
3
  import _ from "lodash";
4
4
 
5
- import { CacheHitEnum } from "./cache-resolver";
6
- import { CacheResponse } from "./cache-response";
7
- import { CorrelationIdType } from "./correlation-id";
8
- import { Logger } from "./logger";
5
+ import { CacheHitEnum } from "./cache-resolver.service";
6
+ import { CacheResponse } from "./cache-response.middleware";
7
+ import type { CorrelationIdType } from "./correlation-id.vo";
8
+ import { Logger } from "./logger.service";
9
9
 
10
10
  export class HttpLogger {
11
11
  private static simplify(response: unknown) {
@@ -1,20 +1,24 @@
1
1
  import path from "node:path";
2
2
  import * as tools from "@bgord/tools";
3
3
 
4
- import { Path, PathType } from "./path";
4
+ import { Path, PathType } from "./path.vo";
5
5
 
6
6
  export type TranslationsKeyType = string;
7
+
7
8
  export type TranslationsValueType = string;
9
+
8
10
  export type TranslationsType = Record<TranslationsKeyType, TranslationsValueType>;
9
11
 
10
12
  export type TranslationPlaceholderType = string;
13
+
11
14
  export type TranslationPlaceholderValueType = string | number;
15
+
12
16
  export type TranslationVariableType = Record<TranslationPlaceholderType, TranslationPlaceholderValueType>;
13
17
 
14
18
  export type I18nConfigType = {
19
+ supportedLanguages: Record<string, tools.LanguageType>;
15
20
  translationsPath?: PathType;
16
21
  defaultLanguage?: tools.LanguageType;
17
- supportedLanguages: Record<string, tools.LanguageType>;
18
22
  };
19
23
 
20
24
  export class I18n {
@@ -0,0 +1,26 @@
1
+ import sharp from "sharp";
2
+ import { z } from "zod/v4";
3
+
4
+ import type { PathType } from "../src/path.vo";
5
+
6
+ export const ImageCompressionQuality = z.number().int().min(1).max(100).default(85);
7
+
8
+ type ImageCompressionQualityType = z.infer<typeof ImageCompressionQuality>;
9
+
10
+ export type ImageCompressorConfigType = {
11
+ input: PathType;
12
+ output: PathType;
13
+ quality?: ImageCompressionQualityType;
14
+ };
15
+
16
+ export class ImageCompressor {
17
+ static async compress(config: ImageCompressorConfigType): Promise<sharp.OutputInfo> {
18
+ const quality = config.quality ?? 85;
19
+
20
+ const image = sharp(config.input);
21
+ const metadata = await image.metadata();
22
+ const format = metadata.format as keyof sharp.FormatEnum;
23
+
24
+ return image.toFormat(format, { quality }).toFile(config.output);
25
+ }
26
+ }
@@ -0,0 +1,38 @@
1
+ import path from "node:path";
2
+ import * as tools from "@bgord/tools";
3
+ import mime from "mime-types";
4
+ import sharp from "sharp";
5
+
6
+ import type { PathType } from "./path.vo";
7
+
8
+ export type ImageExifOutputType = {
9
+ width: tools.WidthType;
10
+ height: tools.HeightType;
11
+ name: path.ParsedPath["base"];
12
+ mimeType: tools.MimeRawType;
13
+ };
14
+
15
+ export type ImageExifClearConfigType = {
16
+ input: PathType;
17
+ output: PathType;
18
+ };
19
+
20
+ export class ImageEXIF {
21
+ static async read(input: PathType): Promise<ImageExifOutputType> {
22
+ const image = sharp(input);
23
+ const metadata = await image.metadata();
24
+
25
+ const name = path.parse(input).base;
26
+
27
+ return {
28
+ width: tools.Width.parse(metadata.width),
29
+ height: tools.Height.parse(metadata.height),
30
+ name,
31
+ mimeType: String(mime.contentType(String(metadata.format))),
32
+ };
33
+ }
34
+
35
+ static async clear(config: ImageExifClearConfigType): Promise<sharp.OutputInfo> {
36
+ return sharp(config.input).rotate().toFile(config.output);
37
+ }
38
+ }
package/src/index.ts CHANGED
@@ -1,38 +1,55 @@
1
- export * from "./api-key-shield";
2
- export * from "./api-version";
3
- export * from "./auth-shield";
4
- export * from "./basic-auth";
5
- export * from "./build-info-repository";
6
- export * from "./cache-resolver";
7
- export * from "./cache-response";
8
- export * from "./cache-static-files";
9
- export * from "./context";
10
- export * from "./correlation-id";
11
- export * from "./download-file";
12
- export * from "./env-validator";
13
- export * from "./etag-extractor";
14
- export * from "./file-uploader";
15
- export * from "./graceful-shutdown";
16
- export * from "./healthcheck";
17
- export * from "./http-logger";
18
- export * from "./i18n";
19
- export * from "./jobs";
20
- export * from "./logger";
21
- export * from "./mailer";
22
- export * from "./memory-consumption";
23
- export * from "./new-uuid";
1
+ export * from "./api-key-shield.middleware";
2
+ export * from "./api-version.middleware";
3
+ export * from "./auth-shield.middleware";
4
+ export * from "./basic-auth.service";
5
+ export * from "./build-info-repository.service";
6
+ export * from "./cache-resolver.service";
7
+ export * from "./cache-response.middleware";
8
+ export * from "./cache-static-files.middleware";
9
+ export * from "./context.middleware";
10
+ export * from "./correlation-id.vo";
11
+ export * from "./decorators.service";
12
+ export * from "./download-file.service";
13
+ export * from "./encryption.service";
14
+ export * from "./env-validator.service";
15
+ export * from "./etag-extractor.middleware";
16
+ export * from "./event-handler.service";
17
+ export * from "./event-logger.service";
18
+ export * from "./event.vo";
19
+ export * from "./file-location.service";
20
+ export * from "./file-uploader.middleware";
21
+ export * from "./graceful-shutdown.service";
22
+ export * from "./gzip.service";
23
+ export * from "./hcaptcha-shield.middleware";
24
+ export * from "./healthcheck.service";
25
+ export * from "./http-logger.middleware";
26
+ export * from "./i18n.service";
27
+ export * from "./image-compressor.service";
28
+ export * from "./image-exif.service";
29
+ export * from "./jobs.service";
30
+ export * from "./logger.service";
31
+ export * from "./mailer.service";
32
+ export * from "./memory-consumption.service";
33
+ export * from "./new-uuid.service";
24
34
  export * from "./node-env.vo";
25
- export * from "./passwords";
26
- export * from "./path";
27
- export * from "./port";
35
+ export * from "./open-graph.service";
36
+ export * from "./passwords.vo";
37
+ export * from "./path.vo";
38
+ export * from "./policy.service";
39
+ export * from "./port.vo";
28
40
  export * from "./prerequisites";
29
41
  export * from "./prerequisites/index";
30
- export * from "./rate-limit-shield";
31
- export * from "./session-id";
32
- export * from "./setup";
33
- export * from "./time-zone-offset";
34
- export * from "./uptime";
35
- export * from "./username";
36
- export * from "./uuid";
37
- export * from "./weak-etag-extractor";
42
+ export * from "./rate-limit-shield.middleware";
43
+ export * from "./recaptcha-shield.middleware";
44
+ export * from "./session-id.vo";
45
+ export * from "./setup.service";
46
+ export * from "./simulated-error.middleware";
47
+ export * from "./sitemap.service";
48
+ export * from "./slower.middleware";
49
+ export * from "./time-zone-offset.middleware";
50
+ export * from "./uptime.service";
51
+ export * from "./url-wo-trailing-slash.vo";
52
+ export * from "./username.vo";
53
+ export * from "./uuid.vo";
54
+ export * from "./weak-etag-extractor.middleware";
38
55
  export { default as sharp } from "sharp";
@@ -1,11 +1,12 @@
1
1
  import * as tools from "@bgord/tools";
2
2
  import { Cron } from "croner";
3
3
 
4
- import { CorrelationId } from "./correlation-id";
5
- import { Logger } from "./logger";
6
- import { NewUUID } from "./new-uuid";
4
+ import { CorrelationId } from "./correlation-id.vo";
5
+ import { Logger } from "./logger.service";
6
+ import { NewUUID } from "./new-uuid.service";
7
7
 
8
8
  export type JobNameType = string;
9
+
9
10
  export type MultipleJobsType = Record<JobNameType, Cron>;
10
11
 
11
12
  export enum UTC_DAY_OF_THE_WEEK {
@@ -2,9 +2,9 @@ import * as tools from "@bgord/tools";
2
2
  import * as winston from "winston";
3
3
  import { z } from "zod/v4";
4
4
 
5
- import { CorrelationIdType } from "./correlation-id";
5
+ import { CorrelationIdType } from "./correlation-id.vo";
6
6
  import { NodeEnvironmentEnum } from "./node-env.vo";
7
- import { PathType } from "./path";
7
+ import { PathType } from "./path.vo";
8
8
 
9
9
  export enum LogLevelEnum {
10
10
  /** @public */
@@ -18,11 +18,17 @@ export enum LogLevelEnum {
18
18
  export const LogLevel = z.enum(LogLevelEnum);
19
19
 
20
20
  type LogTimestampType = number;
21
+
21
22
  type LogAppType = string;
23
+
22
24
  type LogEnvironmentType = NodeEnvironmentEnum;
25
+
23
26
  type LogMessageType = string;
27
+
24
28
  type LogOperationType = string;
29
+
25
30
  type LogMetadataType = Record<string, any>;
31
+
26
32
  type LogCorrelationIdType = CorrelationIdType;
27
33
 
28
34
  const levels: Record<LogLevelEnum, number> = {
@@ -1,19 +1,23 @@
1
1
  import nodemailer, { SendMailOptions } from "nodemailer";
2
2
  import { z } from "zod/v4";
3
3
 
4
- import { Path } from "./path";
5
- import { Port } from "./port";
4
+ import { Path } from "./path.vo";
5
+ import { Port } from "./port.vo";
6
6
 
7
7
  export const SmtpHost = z.string().trim().min(1);
8
+
8
9
  export type SmtpHostType = z.infer<typeof SmtpHost>;
9
10
 
10
11
  export const SmtpPort = Port;
12
+
11
13
  export type SmtpPortType = z.infer<typeof SmtpPort>;
12
14
 
13
15
  export const SmtpUser = z.string().trim().min(1);
16
+
14
17
  export type SmtpUserType = z.infer<typeof SmtpUser>;
15
18
 
16
19
  export const SmtpPass = z.string().trim().min(1);
20
+
17
21
  export type SmtpPassType = z.infer<typeof SmtpPass>;
18
22
 
19
23
  type MailerConfigType = {
@@ -26,18 +30,23 @@ type MailerConfigType = {
26
30
  type MailerSendOptionsType = SendMailOptions;
27
31
 
28
32
  export const EmailSubject = z.string().min(1).max(128);
33
+
29
34
  export type EmailSubjectType = z.infer<typeof EmailSubject>;
30
35
 
31
36
  export const EmailContentHtml = z.string().min(1).max(10_000);
37
+
32
38
  export type EmailContentHtmlType = z.infer<typeof EmailContentHtml>;
33
39
 
34
40
  export const EmailFrom = z.email();
41
+
35
42
  export type EmailFromType = z.infer<typeof EmailFrom>;
36
43
 
37
44
  export const EmailTo = z.email();
45
+
38
46
  export type EmailToType = z.infer<typeof EmailTo>;
39
47
 
40
48
  export const EmailAttachment = z.object({ filename: Path, path: Path });
49
+
41
50
  export type EmailAttachmentType = z.infer<typeof EmailAttachment>;
42
51
 
43
52
  export class Mailer {
@@ -6,4 +6,5 @@ export enum NodeEnvironmentEnum {
6
6
  staging = "staging",
7
7
  production = "production",
8
8
  }
9
+
9
10
  export const NodeEnvironment = z.enum(NodeEnvironmentEnum);
@@ -0,0 +1,259 @@
1
+ import { z } from "zod/v4";
2
+
3
+ import { ImageEXIF } from "./image-exif.service";
4
+ import { Path, PathType } from "./path.vo";
5
+ import { UrlWithoutTrailingSlashType } from "./url-wo-trailing-slash.vo";
6
+
7
+ export const OpenGraphTitleValue = z.string().min(1);
8
+
9
+ export type OpenGraphTitleValueType = z.infer<typeof OpenGraphTitleValue>;
10
+
11
+ export const OpenGraphDescriptionValue = z.string().min(1);
12
+
13
+ export type OpenGraphDescriptionValueType = z.infer<typeof OpenGraphDescriptionValue>;
14
+
15
+ export const OpenGraphUrlValue = z.string().min(1);
16
+
17
+ export type OpenGraphUrlValueType = z.infer<typeof OpenGraphUrlValue>;
18
+
19
+ export const OpenGraphTypeValue = z.union([z.literal("website"), z.literal("article")]);
20
+
21
+ export type OpenGraphTypeValueType = z.infer<typeof OpenGraphTypeValue>;
22
+
23
+ export const OpenGraphImageUrlValue = z.url();
24
+
25
+ export type OpenGraphImageUrlValueType = z.infer<typeof OpenGraphImageUrlValue>;
26
+
27
+ export const OpenGraphImageTypeValue = z.string().min(1);
28
+
29
+ export type OpenGraphImageTypeValueType = z.infer<typeof OpenGraphImageTypeValue>;
30
+
31
+ export const OpenGraphImageWidthValue = z
32
+ .number()
33
+ .int()
34
+ .positive()
35
+ .refine((value) => value === 1200, {
36
+ message: "open.graph.image.width.invalid",
37
+ });
38
+
39
+ export type OpenGraphImageWidthValueType = z.infer<typeof OpenGraphImageWidthValue>;
40
+
41
+ export const OpenGraphImageHeightValue = z
42
+ .number()
43
+ .int()
44
+ .positive()
45
+ .refine((value) => value === 630, {
46
+ message: "open.graph.image.height.invalid",
47
+ });
48
+
49
+ export type OpenGraphImageHeightValueType = z.infer<typeof OpenGraphImageHeightValue>;
50
+
51
+ class OpenGraphTitle {
52
+ private readonly value: OpenGraphTitleValueType;
53
+
54
+ constructor(value: OpenGraphTitleValueType) {
55
+ this.value = OpenGraphTitleValue.parse(value);
56
+ }
57
+
58
+ toMetatag(): string {
59
+ return `<meta property="og:title" content="${this.value}" />`;
60
+ }
61
+
62
+ toMeta(): string {
63
+ return `${this.toMetatag()}\n\t`;
64
+ }
65
+ }
66
+
67
+ class OpenGraphDescription {
68
+ private readonly value: OpenGraphDescriptionValueType;
69
+
70
+ constructor(value: OpenGraphDescriptionValueType) {
71
+ this.value = OpenGraphDescriptionValue.parse(value);
72
+ }
73
+
74
+ toMetatag(): string {
75
+ return `<meta property="og:description" content="${this.value}" />`;
76
+ }
77
+
78
+ toMeta(): string {
79
+ return `${this.toMetatag()}\n\t`;
80
+ }
81
+ }
82
+
83
+ class OpenGraphUrl {
84
+ private readonly value: OpenGraphUrlValueType;
85
+
86
+ constructor(value: OpenGraphUrlValueType) {
87
+ this.value = OpenGraphUrlValue.parse(value);
88
+ }
89
+
90
+ toMetatag(): string {
91
+ return `<meta property="og:url" content="${this.value}" />`;
92
+ }
93
+
94
+ toMeta(): string {
95
+ return `${this.toMetatag()}\n\t`;
96
+ }
97
+ }
98
+
99
+ class OpenGraphType {
100
+ private readonly value: OpenGraphTypeValueType;
101
+
102
+ constructor(value: OpenGraphTypeValueType) {
103
+ this.value = OpenGraphTypeValue.parse(value);
104
+ }
105
+
106
+ toMetatag(): string {
107
+ return `<meta property="og:type" content="${this.value}" />`;
108
+ }
109
+
110
+ toMeta(): string {
111
+ return `${this.toMetatag()}\n\t`;
112
+ }
113
+ }
114
+
115
+ class OpenGraphImageUrl {
116
+ private readonly value: OpenGraphImageUrlValueType;
117
+
118
+ constructor(path: PathType) {
119
+ this.value = OpenGraphImageUrlValue.parse(path);
120
+ }
121
+
122
+ toMetatag(): string {
123
+ return `<meta property="og:image" content="${this.value}" />`;
124
+ }
125
+
126
+ toMeta(): string {
127
+ return `${this.toMetatag()}\n\t`;
128
+ }
129
+ }
130
+
131
+ class OpenGraphImageType {
132
+ private readonly value: OpenGraphImageTypeValueType;
133
+
134
+ constructor(value: OpenGraphImageTypeValueType) {
135
+ this.value = OpenGraphImageTypeValue.parse(value);
136
+ }
137
+
138
+ toMetatag(): string {
139
+ return `<meta property="og:image:type" content="${this.value}" />`;
140
+ }
141
+
142
+ toMeta(): string {
143
+ return `${this.toMetatag()}\n\t`;
144
+ }
145
+ }
146
+
147
+ class OpenGraphImageWidth {
148
+ private readonly value: OpenGraphImageWidthValueType;
149
+
150
+ constructor(value: OpenGraphImageWidthValueType) {
151
+ this.value = OpenGraphImageWidthValue.parse(value);
152
+ }
153
+
154
+ toMetatag(): string {
155
+ return `<meta property="og:image:width" content="${this.value}" />`;
156
+ }
157
+
158
+ toMeta(): string {
159
+ return `${this.toMetatag()}\n\t`;
160
+ }
161
+ }
162
+
163
+ class OpenGraphImageHeight {
164
+ private readonly value: OpenGraphImageHeightValueType;
165
+
166
+ constructor(value: OpenGraphImageHeightValueType) {
167
+ this.value = OpenGraphImageHeightValue.parse(value);
168
+ }
169
+
170
+ toMetatag(): string {
171
+ return `<meta property="og:image:height" content="${this.value}" />`;
172
+ }
173
+
174
+ toMeta(): string {
175
+ return `${this.toMetatag()}\n\t`;
176
+ }
177
+ }
178
+
179
+ export type OpenGraphImageConfigType = {
180
+ url: OpenGraphImageUrl;
181
+ width: OpenGraphImageWidth;
182
+ height: OpenGraphImageHeight;
183
+ type: OpenGraphImageType;
184
+ };
185
+
186
+ export class OpenGraphImage {
187
+ private readonly value: OpenGraphImageConfigType;
188
+
189
+ constructor(value: OpenGraphImageConfigType) {
190
+ this.value = value;
191
+ }
192
+
193
+ toString() {
194
+ let output = "";
195
+
196
+ output += this.value.url.toMeta();
197
+ output += this.value.width.toMeta();
198
+ output += this.value.height.toMeta();
199
+ output += this.value.type.toMeta();
200
+
201
+ return output;
202
+ }
203
+ }
204
+
205
+ class OpenGraphImageGenerator {
206
+ static async generate(config: {
207
+ path: PathType;
208
+ BASE_URL: UrlWithoutTrailingSlashType;
209
+ }) {
210
+ const exif = await ImageEXIF.read(config.path);
211
+
212
+ return new OpenGraphImage({
213
+ url: new OpenGraph.image.url(Path.parse(`${config.BASE_URL}/${exif.name}`)),
214
+ type: new OpenGraph.image.type(exif.mimeType),
215
+ width: new OpenGraph.image.width(exif.width),
216
+ height: new OpenGraph.image.height(exif.height),
217
+ });
218
+ }
219
+ }
220
+
221
+ type OpenGraphConfigType = {
222
+ title: OpenGraphTitle;
223
+ description: OpenGraphDescription;
224
+ url: OpenGraphUrl;
225
+ type: OpenGraphType;
226
+ image?: OpenGraphImage;
227
+ };
228
+
229
+ class OpenGraphGenerator {
230
+ static toString(config: OpenGraphConfigType) {
231
+ let output = "";
232
+
233
+ output += config.title.toMeta();
234
+ output += config.description.toMeta();
235
+ output += config.url.toMeta();
236
+ output += config.type.toMeta();
237
+
238
+ if (config.image) {
239
+ output += config.image.toString();
240
+ }
241
+
242
+ return output;
243
+ }
244
+ }
245
+
246
+ export const OpenGraph = {
247
+ generator: OpenGraphGenerator,
248
+ title: OpenGraphTitle,
249
+ description: OpenGraphDescription,
250
+ url: OpenGraphUrl,
251
+ type: OpenGraphType,
252
+ image: {
253
+ generator: OpenGraphImageGenerator,
254
+ url: OpenGraphImageUrl,
255
+ width: OpenGraphImageWidth,
256
+ height: OpenGraphImageHeight,
257
+ type: OpenGraphImageType,
258
+ },
259
+ };
@@ -1,6 +1,7 @@
1
1
  import { z } from "zod/v4";
2
2
 
3
3
  export type PasswordType = string;
4
+
4
5
  type HashedPasswordType = string;
5
6
 
6
7
  export class Password {
@@ -1,4 +1,5 @@
1
1
  import { z } from "zod/v4";
2
2
 
3
3
  export const Path = z.string().min(1);
4
+
4
5
  export type PathType = z.infer<typeof Path>;
@@ -0,0 +1,25 @@
1
+ import type { Constructor } from "@bgord/tools";
2
+
3
+ type BasePolicyConfig = Record<string, unknown>;
4
+
5
+ export abstract class Policy<T extends BasePolicyConfig> {
6
+ abstract fails(config: T): Promise<boolean> | boolean;
7
+
8
+ abstract error: Constructor<Error>;
9
+
10
+ abstract message: string;
11
+
12
+ throw() {
13
+ throw new this.error();
14
+ }
15
+
16
+ async perform(config: T) {
17
+ if (await this.fails(config)) {
18
+ this.throw();
19
+ }
20
+ }
21
+
22
+ async passes(config: T) {
23
+ return !(await this.fails(config));
24
+ }
25
+ }
@@ -1,4 +1,5 @@
1
1
  import { z } from "zod/v4";
2
2
 
3
3
  export const Port = z.coerce.number().min(0).max(99999);
4
+
4
5
  export type PortType = z.infer<typeof Port>;