jimpex 7.0.1 → 8.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 (388) hide show
  1. package/CHANGELOG.md +87 -0
  2. package/LICENSE +1 -1
  3. package/README.md +446 -434
  4. package/dist/app/index.d.ts +13 -0
  5. package/dist/app/index.js +19 -0
  6. package/dist/app/index.js.map +1 -0
  7. package/dist/app/jimpex.d.ts +13 -0
  8. package/dist/app/jimpex.js +440 -0
  9. package/dist/app/jimpex.js.map +1 -0
  10. package/dist/controllers/common/config.d.ts +78 -0
  11. package/dist/controllers/common/config.js +89 -0
  12. package/dist/controllers/common/config.js.map +1 -0
  13. package/dist/controllers/common/health.d.ts +82 -0
  14. package/dist/controllers/common/health.js +97 -0
  15. package/dist/controllers/common/health.js.map +1 -0
  16. package/dist/controllers/common/index.d.ts +21 -0
  17. package/dist/controllers/common/index.js +21 -0
  18. package/dist/controllers/common/index.js.map +1 -0
  19. package/dist/controllers/common/statics.d.ts +215 -0
  20. package/dist/controllers/common/statics.js +202 -0
  21. package/dist/controllers/common/statics.js.map +1 -0
  22. package/dist/controllers/index.d.ts +24 -0
  23. package/dist/controllers/index.js +20 -0
  24. package/dist/controllers/index.js.map +1 -0
  25. package/dist/controllers/utils/gateway.d.ts +724 -0
  26. package/dist/controllers/utils/gateway.js +425 -0
  27. package/dist/controllers/utils/gateway.js.map +1 -0
  28. package/dist/controllers/utils/index.d.ts +16 -0
  29. package/dist/controllers/utils/index.js +19 -0
  30. package/dist/controllers/utils/index.js.map +1 -0
  31. package/dist/esm/app/index.js +2 -0
  32. package/dist/esm/app/index.js.map +1 -0
  33. package/dist/esm/app/jimpex.js +415 -0
  34. package/dist/esm/app/jimpex.js.map +1 -0
  35. package/dist/esm/chunk-T2T6Q22Z.js +11 -0
  36. package/dist/esm/chunk-T2T6Q22Z.js.map +1 -0
  37. package/dist/esm/controllers/common/config.js +62 -0
  38. package/dist/esm/controllers/common/config.js.map +1 -0
  39. package/dist/esm/controllers/common/health.js +70 -0
  40. package/dist/esm/controllers/common/health.js.map +1 -0
  41. package/dist/esm/controllers/common/index.js +4 -0
  42. package/dist/esm/controllers/common/index.js.map +1 -0
  43. package/dist/esm/controllers/common/statics.js +173 -0
  44. package/dist/esm/controllers/common/statics.js.map +1 -0
  45. package/dist/esm/controllers/index.js +3 -0
  46. package/dist/esm/controllers/index.js.map +1 -0
  47. package/dist/esm/controllers/utils/gateway.js +404 -0
  48. package/dist/esm/controllers/utils/gateway.js.map +1 -0
  49. package/dist/esm/controllers/utils/index.js +2 -0
  50. package/dist/esm/controllers/utils/index.js.map +1 -0
  51. package/dist/esm/index.js +7 -0
  52. package/dist/esm/index.js.map +1 -0
  53. package/dist/esm/middlewares/common/errorHandler.js +92 -0
  54. package/dist/esm/middlewares/common/errorHandler.js.map +1 -0
  55. package/dist/esm/middlewares/common/forceHTTPS.js +41 -0
  56. package/dist/esm/middlewares/common/forceHTTPS.js.map +1 -0
  57. package/dist/esm/middlewares/common/hsts.js +53 -0
  58. package/dist/esm/middlewares/common/hsts.js.map +1 -0
  59. package/dist/esm/middlewares/common/index.js +4 -0
  60. package/dist/esm/middlewares/common/index.js.map +1 -0
  61. package/dist/esm/middlewares/html/fastHTML.js +104 -0
  62. package/dist/esm/middlewares/html/fastHTML.js.map +1 -0
  63. package/dist/esm/middlewares/html/index.js +3 -0
  64. package/dist/esm/middlewares/html/index.js.map +1 -0
  65. package/dist/esm/middlewares/html/showHTML.js +68 -0
  66. package/dist/esm/middlewares/html/showHTML.js.map +1 -0
  67. package/dist/esm/middlewares/index.js +4 -0
  68. package/dist/esm/middlewares/index.js.map +1 -0
  69. package/dist/esm/middlewares/utils/index.js +2 -0
  70. package/dist/esm/middlewares/utils/index.js.map +1 -0
  71. package/dist/esm/middlewares/utils/versionValidator.js +101 -0
  72. package/dist/esm/middlewares/utils/versionValidator.js.map +1 -0
  73. package/dist/esm/services/common/appError.js +52 -0
  74. package/dist/esm/services/common/appError.js.map +1 -0
  75. package/dist/esm/services/common/httpError.js +19 -0
  76. package/dist/esm/services/common/httpError.js.map +1 -0
  77. package/dist/esm/services/common/index.js +17 -0
  78. package/dist/esm/services/common/index.js.map +1 -0
  79. package/dist/esm/services/common/sendFile.js +27 -0
  80. package/dist/esm/services/common/sendFile.js.map +1 -0
  81. package/dist/esm/services/frontend/frontendFs.js +38 -0
  82. package/dist/esm/services/frontend/frontendFs.js.map +1 -0
  83. package/dist/esm/services/frontend/index.js +11 -0
  84. package/dist/esm/services/frontend/index.js.map +1 -0
  85. package/dist/esm/services/html/htmlGenerator.js +144 -0
  86. package/dist/esm/services/html/htmlGenerator.js.map +1 -0
  87. package/dist/esm/services/html/index.js +11 -0
  88. package/dist/esm/services/html/index.js.map +1 -0
  89. package/dist/esm/services/http/apiClient.js +71 -0
  90. package/dist/esm/services/http/apiClient.js.map +1 -0
  91. package/dist/esm/services/http/http.js +125 -0
  92. package/dist/esm/services/http/http.js.map +1 -0
  93. package/dist/esm/services/http/index.js +17 -0
  94. package/dist/esm/services/http/index.js.map +1 -0
  95. package/dist/esm/services/http/responsesBuilder.js +105 -0
  96. package/dist/esm/services/http/responsesBuilder.js.map +1 -0
  97. package/dist/esm/services/index.js +6 -0
  98. package/dist/esm/services/index.js.map +1 -0
  99. package/dist/esm/services/utils/ensureBearerToken.js +78 -0
  100. package/dist/esm/services/utils/ensureBearerToken.js.map +1 -0
  101. package/dist/esm/services/utils/index.js +11 -0
  102. package/dist/esm/services/utils/index.js.map +1 -0
  103. package/dist/esm/types/events.js +1 -0
  104. package/dist/esm/types/events.js.map +1 -0
  105. package/dist/esm/types/express.js +1 -0
  106. package/dist/esm/types/express.js.map +1 -0
  107. package/dist/esm/types/http.js +1 -0
  108. package/dist/esm/types/http.js.map +1 -0
  109. package/dist/esm/types/index.js +7 -0
  110. package/dist/esm/types/index.js.map +1 -0
  111. package/dist/esm/types/options.js +1 -0
  112. package/dist/esm/types/options.js.map +1 -0
  113. package/dist/esm/types/utils.js +1 -0
  114. package/dist/esm/types/utils.js.map +1 -0
  115. package/dist/esm/types/wootils.js +1 -0
  116. package/dist/esm/types/wootils.js.map +1 -0
  117. package/dist/esm/utils/fns/index.js +5 -0
  118. package/dist/esm/utils/fns/index.js.map +1 -0
  119. package/dist/esm/utils/fns/others.js +6 -0
  120. package/dist/esm/utils/fns/others.js.map +1 -0
  121. package/dist/esm/utils/fns/routes.js +25 -0
  122. package/dist/esm/utils/fns/routes.js.map +1 -0
  123. package/dist/esm/utils/fns/statuses.js +6 -0
  124. package/dist/esm/utils/fns/statuses.js.map +1 -0
  125. package/dist/esm/utils/fns/text.js +6 -0
  126. package/dist/esm/utils/fns/text.js.map +1 -0
  127. package/dist/esm/utils/index.js +3 -0
  128. package/dist/esm/utils/index.js.map +1 -0
  129. package/dist/esm/utils/wrappers.js +41 -0
  130. package/dist/esm/utils/wrappers.js.map +1 -0
  131. package/dist/index.d.ts +46 -0
  132. package/dist/index.js +24 -0
  133. package/dist/index.js.map +1 -0
  134. package/dist/jimpex-7eaee271.d.ts +1278 -0
  135. package/dist/middlewares/common/errorHandler.d.ts +131 -0
  136. package/dist/middlewares/common/errorHandler.js +119 -0
  137. package/dist/middlewares/common/errorHandler.js.map +1 -0
  138. package/dist/middlewares/common/forceHTTPS.d.ts +68 -0
  139. package/dist/middlewares/common/forceHTTPS.js +68 -0
  140. package/dist/middlewares/common/forceHTTPS.js.map +1 -0
  141. package/dist/middlewares/common/hsts.d.ts +109 -0
  142. package/dist/middlewares/common/hsts.js +80 -0
  143. package/dist/middlewares/common/hsts.js.map +1 -0
  144. package/dist/middlewares/common/index.d.ts +21 -0
  145. package/dist/middlewares/common/index.js +21 -0
  146. package/dist/middlewares/common/index.js.map +1 -0
  147. package/dist/middlewares/html/fastHTML.d.ts +180 -0
  148. package/dist/middlewares/html/fastHTML.js +131 -0
  149. package/dist/middlewares/html/fastHTML.js.map +1 -0
  150. package/dist/middlewares/html/index.d.ts +21 -0
  151. package/dist/middlewares/html/index.js +20 -0
  152. package/dist/middlewares/html/index.js.map +1 -0
  153. package/dist/middlewares/html/showHTML.d.ts +127 -0
  154. package/dist/middlewares/html/showHTML.js +95 -0
  155. package/dist/middlewares/html/showHTML.js.map +1 -0
  156. package/dist/middlewares/index.d.ts +30 -0
  157. package/dist/middlewares/index.js +21 -0
  158. package/dist/middlewares/index.js.map +1 -0
  159. package/dist/middlewares/utils/index.d.ts +19 -0
  160. package/dist/middlewares/utils/index.js +19 -0
  161. package/dist/middlewares/utils/index.js.map +1 -0
  162. package/dist/middlewares/utils/versionValidator.d.ts +214 -0
  163. package/dist/middlewares/utils/versionValidator.js +128 -0
  164. package/dist/middlewares/utils/versionValidator.js.map +1 -0
  165. package/dist/services/common/appError.d.ts +138 -0
  166. package/dist/services/common/appError.js +80 -0
  167. package/dist/services/common/appError.js.map +1 -0
  168. package/dist/services/common/httpError.d.ts +79 -0
  169. package/dist/services/common/httpError.js +44 -0
  170. package/dist/services/common/httpError.js.map +1 -0
  171. package/dist/services/common/index.d.ts +47 -0
  172. package/dist/services/common/index.js +41 -0
  173. package/dist/services/common/index.js.map +1 -0
  174. package/dist/services/common/sendFile.d.ts +102 -0
  175. package/dist/services/common/sendFile.js +51 -0
  176. package/dist/services/common/sendFile.js.map +1 -0
  177. package/dist/services/frontend/frontendFs.d.ts +96 -0
  178. package/dist/services/frontend/frontendFs.js +71 -0
  179. package/dist/services/frontend/frontendFs.js.map +1 -0
  180. package/dist/services/frontend/index.d.ts +40 -0
  181. package/dist/services/frontend/index.js +35 -0
  182. package/dist/services/frontend/index.js.map +1 -0
  183. package/dist/services/html/htmlGenerator.d.ts +237 -0
  184. package/dist/services/html/htmlGenerator.js +171 -0
  185. package/dist/services/html/htmlGenerator.js.map +1 -0
  186. package/dist/services/html/index.d.ts +43 -0
  187. package/dist/services/html/index.js +35 -0
  188. package/dist/services/html/index.js.map +1 -0
  189. package/dist/services/http/apiClient.d.ts +169 -0
  190. package/dist/services/http/apiClient.js +96 -0
  191. package/dist/services/http/apiClient.js.map +1 -0
  192. package/dist/services/http/http.d.ts +175 -0
  193. package/dist/services/http/http.js +158 -0
  194. package/dist/services/http/http.js.map +1 -0
  195. package/dist/services/http/index.d.ts +50 -0
  196. package/dist/services/http/index.js +41 -0
  197. package/dist/services/http/index.js.map +1 -0
  198. package/dist/services/http/responsesBuilder.d.ts +178 -0
  199. package/dist/services/http/responsesBuilder.js +132 -0
  200. package/dist/services/http/responsesBuilder.js.map +1 -0
  201. package/dist/services/index.d.ts +33 -0
  202. package/dist/services/index.js +23 -0
  203. package/dist/services/index.js.map +1 -0
  204. package/dist/services/utils/ensureBearerToken.d.ts +157 -0
  205. package/dist/services/utils/ensureBearerToken.js +105 -0
  206. package/dist/services/utils/ensureBearerToken.js.map +1 -0
  207. package/dist/services/utils/index.d.ts +43 -0
  208. package/dist/services/utils/index.js +35 -0
  209. package/dist/services/utils/index.js.map +1 -0
  210. package/dist/types/events.d.ts +13 -0
  211. package/dist/types/events.js +17 -0
  212. package/dist/types/events.js.map +1 -0
  213. package/dist/types/express.d.ts +10 -0
  214. package/dist/types/express.js +17 -0
  215. package/dist/types/express.js.map +1 -0
  216. package/dist/types/http.d.ts +79 -0
  217. package/dist/types/http.js +17 -0
  218. package/dist/types/http.js.map +1 -0
  219. package/dist/types/index.d.ts +14 -0
  220. package/dist/types/index.js +24 -0
  221. package/dist/types/index.js.map +1 -0
  222. package/dist/types/options.d.ts +13 -0
  223. package/dist/types/options.js +17 -0
  224. package/dist/types/options.js.map +1 -0
  225. package/dist/types/utils.d.ts +48 -0
  226. package/dist/types/utils.js +17 -0
  227. package/dist/types/utils.js.map +1 -0
  228. package/dist/types/wootils.d.ts +4 -0
  229. package/dist/types/wootils.js +17 -0
  230. package/dist/types/wootils.js.map +1 -0
  231. package/dist/utils/fns/index.d.ts +5 -0
  232. package/dist/utils/fns/index.js +22 -0
  233. package/dist/utils/fns/index.js.map +1 -0
  234. package/dist/utils/fns/others.d.ts +17 -0
  235. package/dist/utils/fns/others.js +29 -0
  236. package/dist/utils/fns/others.js.map +1 -0
  237. package/dist/utils/fns/routes.d.ts +39 -0
  238. package/dist/utils/fns/routes.js +51 -0
  239. package/dist/utils/fns/routes.js.map +1 -0
  240. package/dist/utils/fns/statuses.d.ts +45 -0
  241. package/dist/utils/fns/statuses.js +35 -0
  242. package/dist/utils/fns/statuses.js.map +1 -0
  243. package/dist/utils/fns/text.d.ts +9 -0
  244. package/dist/utils/fns/text.js +29 -0
  245. package/dist/utils/fns/text.js.map +1 -0
  246. package/dist/utils/index.d.ts +18 -0
  247. package/dist/utils/index.js +20 -0
  248. package/dist/utils/index.js.map +1 -0
  249. package/dist/utils/wrappers.d.ts +13 -0
  250. package/dist/utils/wrappers.js +68 -0
  251. package/dist/utils/wrappers.js.map +1 -0
  252. package/examples/basic/404.html +12 -0
  253. package/examples/basic/README.md +30 -0
  254. package/examples/basic/app.ts +18 -0
  255. package/examples/basic/controller.ts +45 -0
  256. package/examples/basic/index.ts +19 -0
  257. package/examples/basic/middleware.ts +13 -0
  258. package/examples/basic/service.ts +11 -0
  259. package/package.json +59 -38
  260. package/src/app/index.ts +1 -0
  261. package/src/app/jimpex.ts +743 -0
  262. package/src/controllers/common/config.ts +115 -0
  263. package/src/controllers/common/health.ts +128 -0
  264. package/src/controllers/common/index.ts +3 -0
  265. package/src/controllers/common/statics.ts +380 -0
  266. package/src/controllers/index.ts +2 -0
  267. package/src/controllers/utils/gateway.ts +1186 -0
  268. package/src/controllers/utils/index.ts +1 -0
  269. package/src/index.ts +6 -0
  270. package/src/middlewares/common/errorHandler.ts +203 -0
  271. package/src/middlewares/common/forceHTTPS.ts +83 -0
  272. package/src/middlewares/common/hsts.ts +135 -0
  273. package/src/middlewares/common/index.ts +3 -0
  274. package/src/middlewares/html/fastHTML.ts +255 -0
  275. package/src/middlewares/html/index.ts +2 -0
  276. package/src/middlewares/html/showHTML.ts +165 -0
  277. package/src/middlewares/index.ts +3 -0
  278. package/src/middlewares/utils/index.ts +1 -0
  279. package/src/middlewares/utils/versionValidator.ts +289 -0
  280. package/src/services/common/appError.ts +158 -0
  281. package/src/services/common/httpError.ts +74 -0
  282. package/src/services/common/index.ts +29 -0
  283. package/src/services/common/sendFile.ts +106 -0
  284. package/src/services/frontend/frontendFs.ts +101 -0
  285. package/src/services/frontend/index.ts +21 -0
  286. package/src/services/html/htmlGenerator.ts +356 -0
  287. package/src/services/html/index.ts +21 -0
  288. package/src/services/http/apiClient.ts +221 -0
  289. package/src/services/http/http.ts +286 -0
  290. package/src/services/http/index.ts +29 -0
  291. package/src/services/http/responsesBuilder.ts +265 -0
  292. package/src/services/index.ts +5 -0
  293. package/src/services/utils/ensureBearerToken.ts +202 -0
  294. package/src/services/utils/index.ts +21 -0
  295. package/src/types/events.ts +303 -0
  296. package/src/types/express.ts +21 -0
  297. package/src/types/http.ts +77 -0
  298. package/src/types/index.ts +6 -0
  299. package/src/types/options.ts +248 -0
  300. package/src/types/utils.ts +52 -0
  301. package/src/types/wootils.ts +4 -0
  302. package/src/utils/fns/index.ts +4 -0
  303. package/src/utils/fns/others.ts +15 -0
  304. package/src/utils/fns/routes.ts +64 -0
  305. package/src/utils/fns/statuses.ts +44 -0
  306. package/src/utils/fns/text.ts +8 -0
  307. package/src/utils/index.ts +2 -0
  308. package/src/utils/wrappers.ts +537 -0
  309. package/tsconfig.json +5 -8
  310. package/tsup.config.ts +10 -0
  311. package/src/app/index.js +0 -692
  312. package/src/constants/eventNames.js +0 -48
  313. package/src/constants/index.js +0 -7
  314. package/src/controllers/common/configuration.js +0 -116
  315. package/src/controllers/common/health.js +0 -79
  316. package/src/controllers/common/index.js +0 -7
  317. package/src/controllers/common/statics.js +0 -336
  318. package/src/controllers/index.js +0 -9
  319. package/src/controllers/utils/gateway.js +0 -1039
  320. package/src/controllers/utils/index.js +0 -3
  321. package/src/index.js +0 -30
  322. package/src/middlewares/common/errorHandler.js +0 -185
  323. package/src/middlewares/common/forceHTTPS.js +0 -80
  324. package/src/middlewares/common/hsts.js +0 -122
  325. package/src/middlewares/common/index.js +0 -7
  326. package/src/middlewares/html/fastHTML.js +0 -298
  327. package/src/middlewares/html/index.js +0 -5
  328. package/src/middlewares/html/showHTML.js +0 -167
  329. package/src/middlewares/index.js +0 -11
  330. package/src/middlewares/utils/index.js +0 -3
  331. package/src/middlewares/utils/versionValidator.js +0 -261
  332. package/src/services/common/appError.js +0 -136
  333. package/src/services/common/httpError.js +0 -60
  334. package/src/services/common/index.js +0 -25
  335. package/src/services/common/sendFile.js +0 -68
  336. package/src/services/frontend/frontendFs.js +0 -85
  337. package/src/services/frontend/index.js +0 -17
  338. package/src/services/html/htmlGenerator.js +0 -391
  339. package/src/services/html/index.js +0 -17
  340. package/src/services/http/apiClient.js +0 -148
  341. package/src/services/http/http.js +0 -256
  342. package/src/services/http/index.js +0 -25
  343. package/src/services/http/responsesBuilder.js +0 -193
  344. package/src/services/index.js +0 -15
  345. package/src/services/utils/ensureBearerToken.js +0 -147
  346. package/src/services/utils/index.js +0 -19
  347. package/src/types.js +0 -377
  348. package/src/utils/functions.js +0 -78
  349. package/src/utils/wrappers.js +0 -131
  350. package/types/app/index.d.ts +0 -417
  351. package/types/constants/eventNames.d.ts +0 -93
  352. package/types/constants/index.d.ts +0 -2
  353. package/types/controllers/common/configuration.d.ts +0 -71
  354. package/types/controllers/common/health.d.ts +0 -55
  355. package/types/controllers/common/index.d.ts +0 -4
  356. package/types/controllers/common/statics.d.ts +0 -271
  357. package/types/controllers/index.d.ts +0 -3
  358. package/types/controllers/utils/gateway.d.ts +0 -947
  359. package/types/controllers/utils/index.d.ts +0 -2
  360. package/types/index.d.ts +0 -15
  361. package/types/middlewares/common/errorHandler.d.ts +0 -143
  362. package/types/middlewares/common/forceHTTPS.d.ts +0 -64
  363. package/types/middlewares/common/hsts.d.ts +0 -111
  364. package/types/middlewares/common/index.d.ts +0 -4
  365. package/types/middlewares/html/fastHTML.d.ts +0 -238
  366. package/types/middlewares/html/index.d.ts +0 -3
  367. package/types/middlewares/html/showHTML.d.ts +0 -128
  368. package/types/middlewares/index.d.ts +0 -4
  369. package/types/middlewares/utils/index.d.ts +0 -2
  370. package/types/middlewares/utils/versionValidator.d.ts +0 -247
  371. package/types/services/common/appError.d.ts +0 -89
  372. package/types/services/common/httpError.d.ts +0 -37
  373. package/types/services/common/index.d.ts +0 -18
  374. package/types/services/common/sendFile.d.ts +0 -56
  375. package/types/services/frontend/frontendFs.d.ts +0 -72
  376. package/types/services/frontend/index.d.ts +0 -3
  377. package/types/services/html/htmlGenerator.d.ts +0 -298
  378. package/types/services/html/index.d.ts +0 -3
  379. package/types/services/http/apiClient.d.ts +0 -141
  380. package/types/services/http/http.d.ts +0 -159
  381. package/types/services/http/index.d.ts +0 -18
  382. package/types/services/http/responsesBuilder.d.ts +0 -140
  383. package/types/services/index.d.ts +0 -6
  384. package/types/services/utils/ensureBearerToken.d.ts +0 -137
  385. package/types/services/utils/index.d.ts +0 -16
  386. package/types/types.d.ts +0 -280
  387. package/types/utils/functions.d.ts +0 -55
  388. package/types/utils/wrappers.d.ts +0 -127
@@ -0,0 +1,265 @@
1
+ import type { Config, Response } from '../../types';
2
+ import { provider, type Statuses } from '../../utils';
3
+ /**
4
+ * The options to construct a {@link ResponsesBuilder}.
5
+ *
6
+ * @group Services/ResponsesBuilder
7
+ */
8
+ export type ResponsesBuilderConstructorOptions = {
9
+ /**
10
+ * A dictionary with the dependencies to inject.
11
+ */
12
+ inject: {
13
+ config: Config;
14
+ statuses: Statuses;
15
+ };
16
+ };
17
+ /**
18
+ * The options to build a response for a post message.
19
+ *
20
+ * @group Services/ResponsesBuilder
21
+ */
22
+ export type HTMLPostMessageResponseOptions = {
23
+ /**
24
+ * The response object generated by the application.
25
+ */
26
+ res: Response;
27
+ /**
28
+ * The title for the HTML.
29
+ */
30
+ title: string;
31
+ /**
32
+ * The contents of the post message.
33
+ */
34
+ message: string;
35
+ /**
36
+ * The status code for the response.
37
+ *
38
+ * @default 200
39
+ */
40
+ status?: number | string;
41
+ /**
42
+ * From which object will the `postMessage` method called from.
43
+ *
44
+ * @default 'window.opener'
45
+ */
46
+ target?: string;
47
+ /**
48
+ * Whether or not to call `window.close` after sending the message.
49
+ *
50
+ * @default true
51
+ */
52
+ close?: boolean;
53
+ /**
54
+ * In case `close` is set to `true`, this option is to specify how many milliseconds
55
+ * should be waited before closing the window.
56
+ *
57
+ * @default 700
58
+ */
59
+ closeDelay?: number;
60
+ };
61
+ /**
62
+ * The options to build a reponse for JSON.
63
+ *
64
+ * @group Services/ResponsesBuilder
65
+ */
66
+ export type JSONResponseOptions = {
67
+ /**
68
+ * The response object generated by the application.
69
+ */
70
+ res: Response;
71
+ /**
72
+ * The actual data for the response. It will be added in a `data` property.
73
+ */
74
+ data: unknown;
75
+ /**
76
+ * The status code for the response.
77
+ *
78
+ * @default 200
79
+ */
80
+ status?: number | string;
81
+ /**
82
+ * Extra information to include inside the `metadata` object.
83
+ */
84
+ metadata?: object;
85
+ };
86
+ /**
87
+ * The default time to wait before closing a window, in case it's enabled.
88
+ */
89
+ const DEFAULT_CLOSE_DELAY_FOR_POST_MESSAGE = 700;
90
+ /**
91
+ * A utility service to build responses.
92
+ *
93
+ * @group Services
94
+ * @group Services/ResponsesBuilder
95
+ */
96
+ export class ResponsesBuilder {
97
+ /**
98
+ * The application configuration, to get the `version` and the `postMessagesPrefix`.
99
+ */
100
+ protected readonly _config: Config;
101
+ /**
102
+ * The uility service to get HTTP status codes.
103
+ */
104
+ protected readonly _statuses: Statuses;
105
+ /**
106
+ * @param options The options to construct the service.
107
+ */
108
+ constructor({ inject: { config, statuses } }: ResponsesBuilderConstructorOptions) {
109
+ this._config = config;
110
+ this._statuses = statuses;
111
+ }
112
+ /**
113
+ * Generates and send an HTML response that emits a post message.
114
+ * The post message will be prefixed with the value of the configuration setting
115
+ * `postMessagesPrefix`.
116
+ *
117
+ * @param options The options to customize how the HTML is generated.
118
+ */
119
+ htmlPostMessage(options: HTMLPostMessageResponseOptions): void {
120
+ const {
121
+ res,
122
+ title,
123
+ message,
124
+ status,
125
+ target = 'window.opener',
126
+ close = true,
127
+ closeDelay = DEFAULT_CLOSE_DELAY_FOR_POST_MESSAGE,
128
+ } = options;
129
+ const prefix = this._config.get<string | undefined>('postMessagesPrefix') ?? '';
130
+ const closeCode = close
131
+ ? `setTimeout(function() { window.close(); }, ${closeDelay});`
132
+ : '';
133
+
134
+ const html = this._htmlTemplate(
135
+ title,
136
+ `
137
+ (function() {
138
+ if (${target}) {
139
+ ${target}.postMessage('${prefix}${message}', '*');
140
+ ${closeCode}
141
+ }
142
+ })();
143
+ `,
144
+ );
145
+
146
+ const useStatus =
147
+ typeof status === 'undefined'
148
+ ? (this._statuses('ok') as number)
149
+ : this._normalizeStatus(status);
150
+
151
+ res.setHeader('Content-Type', 'text/html');
152
+ res.setHeader('Cache-Control', 'no-cache, max-age=0, must-revalidate, no-store');
153
+ res.status(useStatus);
154
+ res.write(html);
155
+ res.end();
156
+ }
157
+ /**
158
+ * Generates and sends a JSON response.
159
+ *
160
+ * @param options The options to customize how the JSON is generated.
161
+ * @example
162
+ *
163
+ * <caption>The generated looks like this.</caption>
164
+ *
165
+ * {
166
+ * metadata: {
167
+ * version: 'dev',
168
+ * status: 200,
169
+ * },
170
+ * data: { foo: 'bar' },
171
+ * }
172
+ *
173
+ */
174
+ json(options: JSONResponseOptions): void {
175
+ const { res, data, status, metadata = {} } = options;
176
+ const useStatus =
177
+ typeof status === 'undefined'
178
+ ? (this._statuses('ok') as number)
179
+ : this._normalizeStatus(status);
180
+
181
+ res.status(useStatus);
182
+ res.json({
183
+ metadata: {
184
+ version: this._config.get<string>('version'),
185
+ status: useStatus,
186
+ ...metadata,
187
+ },
188
+ data,
189
+ });
190
+ res.end();
191
+ }
192
+ /**
193
+ * Generates a basic HTML template for the service to use when generating a post message
194
+ * response.
195
+ *
196
+ * @param title The HTML `<title />` attribute.
197
+ * @param code Javascript code to be wrapped on a `<script />` tag.
198
+ */
199
+ protected _htmlTemplate(title: string, code: string): string {
200
+ return `
201
+ <!DOCTYPE html>
202
+ <html>
203
+ <head>
204
+ <meta charset="utf-8" />
205
+ <meta http-equiv="x-ua-compatible" content="ie=edge" />
206
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
207
+ <title>${title}</title>
208
+ </head>
209
+ <body>
210
+ <script type="text/javascript">
211
+ ${code}
212
+ </script>
213
+ </body>
214
+ </html>
215
+ `;
216
+ }
217
+ /**
218
+ * Utility method used to make sure a recevied status is a valid status code. If the
219
+ * status is a string, the method will try to find the code from the `statuses` package.
220
+ *
221
+ * @param status The status to normalize.
222
+ * @returns If `status` is a string, but there's no valid code, it will return 200.
223
+ */
224
+ protected _normalizeStatus(status: number | string): number {
225
+ let useStatus: number;
226
+ try {
227
+ if (typeof status === 'string') {
228
+ useStatus = this._statuses(status) as number;
229
+ } else {
230
+ this._statuses(status);
231
+ useStatus = status;
232
+ }
233
+ } catch (_) {
234
+ useStatus = this._statuses('ok') as number;
235
+ }
236
+
237
+ return useStatus;
238
+ }
239
+ }
240
+ /**
241
+ * The service provider that once registered on the container will set an instance of
242
+ * {@link ResponsesBuilder} as the `responsesBuilder` service.
243
+ *
244
+ * @example
245
+ *
246
+ * // Register it on the container
247
+ * container.register(responsesBuilderProvider);
248
+ * // Getting access to the service instance
249
+ * const responsesBuilder = container.get<ResponsesBuilder>('responsesBuilder');
250
+ *
251
+ * @group Providers
252
+ * @group Services/ResponsesBuilder
253
+ */
254
+ export const responsesBuilderProvider = provider((app) => {
255
+ app.set(
256
+ 'responsesBuilder',
257
+ () =>
258
+ new ResponsesBuilder({
259
+ inject: {
260
+ config: app.getConfig(),
261
+ statuses: app.get('statuses'),
262
+ },
263
+ }),
264
+ );
265
+ });
@@ -0,0 +1,5 @@
1
+ export * from './common';
2
+ export * from './frontend';
3
+ export * from './html';
4
+ export * from './http';
5
+ export * from './utils';
@@ -0,0 +1,202 @@
1
+ import { deepAssignWithOverwrite } from '@homer0/deep-assign';
2
+ import { providerCreator, type Statuses } from '../../utils';
3
+ import type { HTTPErrorClass } from '../common';
4
+ import type { DeepPartial, ExpressMiddleware } from '../../types';
5
+ /**
6
+ * The options for the error the middleare can generate.
7
+ *
8
+ * @group Services/EnsureBearerToken
9
+ */
10
+ export type EnsureBearerTokenErrorOptions = {
11
+ /**
12
+ * The error message for the response.
13
+ *
14
+ * @default 'Unauthorized'
15
+ */
16
+ message: string;
17
+ /**
18
+ * The HTTP status that will be added to the error context.
19
+ *
20
+ * @default 401
21
+ */
22
+ status: number;
23
+ /**
24
+ * Context information for the error handler and that can be added to the actual
25
+ * response.
26
+ */
27
+ response: unknown;
28
+ };
29
+ /**
30
+ * The options to customize the service/middleware.
31
+ *
32
+ * @group Services/EnsureBearerToken
33
+ */
34
+ export type EnsureBearerTokenOptions = {
35
+ error: EnsureBearerTokenErrorOptions;
36
+ expression: RegExp;
37
+ local: string;
38
+ };
39
+ /**
40
+ * The options to construct a {@link EnsureBearerToken}.
41
+ *
42
+ * @group Services/EnsureBearerToken
43
+ */
44
+ export type EnsureBearerConstructorOptions = DeepPartial<EnsureBearerTokenOptions> & {
45
+ /**
46
+ * A dictionary with the dependencies to inject.
47
+ */
48
+ inject: {
49
+ HTTPError: HTTPErrorClass;
50
+ statuses: Statuses;
51
+ };
52
+ };
53
+ /**
54
+ * Custom options for the provider that will register an instance of
55
+ * {@link EnsureBearerToken}
56
+ * as a service.
57
+ *
58
+ * @group Services/EnsureBearerToken
59
+ */
60
+ export type EnsureBearerTokenProviderOptions = DeepPartial<EnsureBearerTokenOptions> & {
61
+ /**
62
+ * The name that will be used to register the service on the container. This is to allow
63
+ * multiple "instances" of the service to be created.
64
+ *
65
+ * @default 'ensureBearerToken'
66
+ */
67
+ serviceName?: string;
68
+ };
69
+ /**
70
+ * This service gives you a middleware that verifies if a request has an `Authorization`
71
+ * header with a bearer token; if it does, the token will be saved on the `res.locals`,
72
+ * otherwise, it will generate an error.
73
+ *
74
+ * This is a "service middleware" to allow certain flexibility: you can have controllers
75
+ * where some routes are protected and others are not. For those cases, you get the
76
+ * service from the container, and include it only in the routes that need it.
77
+ *
78
+ * @group Services
79
+ * @group Services/EnsureBearerToken
80
+ */
81
+ export class EnsureBearerToken {
82
+ /**
83
+ * To generate the errors when the validation fails.
84
+ */
85
+ protected readonly _HTTPError: HTTPErrorClass;
86
+ /**
87
+ * The customization options for the service.
88
+ */
89
+ protected readonly _options: EnsureBearerTokenOptions;
90
+ /**
91
+ * @param options The options to construct the class.
92
+ */
93
+ constructor({
94
+ inject: { HTTPError, statuses },
95
+ ...options
96
+ }: EnsureBearerConstructorOptions) {
97
+ this._HTTPError = HTTPError;
98
+ this._options = deepAssignWithOverwrite(
99
+ {
100
+ error: {
101
+ message: 'Unauthorized',
102
+ status: statuses('unauthorized'),
103
+ response: {},
104
+ },
105
+ expression: /bearer (.*?)(?:$|\s)/i,
106
+ local: 'token',
107
+ },
108
+ options,
109
+ );
110
+ }
111
+ /**
112
+ * Generates the middleware that verifies if a request has an `Authorization` header
113
+ * with a bearer token.
114
+ */
115
+ getMiddleware(): ExpressMiddleware {
116
+ return (req, res, next) => {
117
+ let unauthorized = true;
118
+ const {
119
+ headers: { authorization },
120
+ } = req;
121
+ if (authorization) {
122
+ const matches = this._options.expression.exec(authorization);
123
+ if (matches) {
124
+ const [, token] = matches;
125
+ res.locals[this._options.local] = token;
126
+ unauthorized = false;
127
+ }
128
+ }
129
+
130
+ if (unauthorized) {
131
+ const {
132
+ error: { message, status, response },
133
+ } = this._options;
134
+ next(
135
+ new this._HTTPError(message, status, {
136
+ response,
137
+ }),
138
+ );
139
+ } else {
140
+ next();
141
+ }
142
+ };
143
+ }
144
+ /**
145
+ * The customization options.
146
+ */
147
+ get options(): Readonly<EnsureBearerTokenOptions> {
148
+ return deepAssignWithOverwrite({}, this._options);
149
+ }
150
+ }
151
+ /**
152
+ * Generates a "service middleware" that can be used on route controllers in order to
153
+ * validate the presence of a bearer token on the requests authorization header.
154
+ *
155
+ * The registered service is an instance of {@link EnsureBearerToken}, and it uses the key
156
+ * `ensureBearerToken`.
157
+ *
158
+ * Since it's a "provider creator", when registering it, you can pass custom options.
159
+ *
160
+ * @example
161
+ *
162
+ * <caption>Basic usage</caption>
163
+ *
164
+ * // Register it on the container
165
+ * container.register(ensureBearerTokenProvider);
166
+ *
167
+ * // Let's assume we are in a controller now...
168
+ * // Getting access to the middleware.
169
+ * const ensureBearerToken = container.get<ExpressMiddleware>('ensureBearerToken');
170
+ *
171
+ * @example
172
+ *
173
+ * <caption>Customizing the service</caption>
174
+ *
175
+ * // Register it on the container
176
+ * container.register(
177
+ * ensureBearerTokenProvider({
178
+ * serviceName: 'ensureBearerTokenCustom',
179
+ * error: {
180
+ * message: 'Missing token!',
181
+ * },
182
+ * }),
183
+ * );
184
+ *
185
+ * @group Providers
186
+ * @group Services/EnsureBearerToken
187
+ */
188
+ export const ensureBearerTokenProvider = providerCreator(
189
+ (options: EnsureBearerTokenProviderOptions = {}) =>
190
+ (app) => {
191
+ const { serviceName = 'ensureBearerToken', ...rest } = options;
192
+ app.set(serviceName, () =>
193
+ new EnsureBearerToken({
194
+ inject: {
195
+ HTTPError: app.get('HTTPError'),
196
+ statuses: app.get('statuses'),
197
+ },
198
+ ...rest,
199
+ }).getMiddleware(),
200
+ );
201
+ },
202
+ );
@@ -0,0 +1,21 @@
1
+ import { providers } from '../../utils';
2
+ import { ensureBearerTokenProvider } from './ensureBearerToken';
3
+ /**
4
+ * Registers all the utility services on the container.
5
+ *
6
+ * - {@link EnsureBearerToken | ensureBearerToken}
7
+ *
8
+ * @example
9
+ *
10
+ * // Register the collection on the container
11
+ * container.register(utilsServicesProvider);
12
+ * // Getting access to one the services instance
13
+ * const ensureBearerToken = container.get<EnsureBearerToken>('ensureBearerToken');
14
+ *
15
+ * @group Providers
16
+ */
17
+ export const utilsServicesProvider = providers({
18
+ ensureBearerTokenProvider,
19
+ });
20
+
21
+ export * from './ensureBearerToken';