jimpex 7.0.2 → 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 +80 -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,4 @@
1
+ export * from './others';
2
+ export * from './routes';
3
+ export * from './statuses';
4
+ export * from './text';
@@ -0,0 +1,15 @@
1
+ /**
2
+ * A utility function that can be used in `.filter` calls to remove `undefined` values and
3
+ * assert that the type is not longer `undefined`.
4
+ *
5
+ * @param value The value to check.
6
+ * @template T The type that is not `undefined`.
7
+ * @example
8
+ *
9
+ * const arr: (number | undefined)[] = [1, 2, 3, undefined];
10
+ * const filtered = arr.filter(notUndefined);
11
+ * // filtered = [1, 2, 3] and its type is number[]
12
+ *
13
+ * @group Utilities
14
+ */
15
+ export const notUndefined = <T>(value: T | undefined): value is T => value !== undefined;
@@ -0,0 +1,64 @@
1
+ import { escapeForRegExp } from './text';
2
+
3
+ /**
4
+ * Removes any leading slash from a URL.
5
+ *
6
+ * @param url The URL to format.
7
+ * @group Utilities
8
+ */
9
+ export const removeLeadingSlash = (url: string): string => url.replace(/^\/+/, '');
10
+ /**
11
+ * Removes any trailing slash from a URL.
12
+ *
13
+ * @param url The URL to format.
14
+ * @group Utilities
15
+ */
16
+ export const removeTrailingSlash = (url: string): string => url.replace(/\/+$/, '');
17
+ /**
18
+ * Remove any leading and trailing slash from a URL.
19
+ *
20
+ * @param url The URL to format.
21
+ * @param leading Whether or not to remove any leading slash.
22
+ * @param trailing Whether or not to remove the trailing slash.
23
+ * @group Utilities
24
+ */
25
+ export const removeSlashes = (
26
+ url: string,
27
+ leading: boolean = true,
28
+ trailing: boolean = true,
29
+ ) => {
30
+ const newUrl = leading ? removeLeadingSlash(url) : url;
31
+ return trailing ? removeTrailingSlash(newUrl) : newUrl;
32
+ };
33
+
34
+ /**
35
+ * Given a server route definition, this function creates a regular expression to match
36
+ * it: The expression replaces the routes parameters with placeholders so it can be
37
+ * compared with real routes.
38
+ *
39
+ * @param route The route from which the expression will be created.
40
+ * @param leadingSlash Whether or not the expression should match a leading slash.
41
+ * @param trailingSlash Whether or not the expression should match a trailing slash.
42
+ * The reason this is `false` by default is because these
43
+ * expressions are often used to match against incoming requests,
44
+ * and they don't have a trailing slash.
45
+ * @group Utilities
46
+ */
47
+ export const createRouteExpression = (
48
+ route: string,
49
+ leadingSlash: boolean = true,
50
+ trailingSlash: boolean = false,
51
+ ): RegExp => {
52
+ let expression = removeSlashes(route)
53
+ .split('/')
54
+ .map((part) => (part.startsWith(':') ? '(?:([^\\/]+?))' : escapeForRegExp(part)))
55
+ .join('\\/');
56
+ if (leadingSlash) {
57
+ expression = `\\/${expression}`;
58
+ }
59
+ if (trailingSlash) {
60
+ expression = `${expression}\\/`;
61
+ }
62
+
63
+ return new RegExp(expression);
64
+ };
@@ -0,0 +1,44 @@
1
+ import statuses from 'statuses';
2
+ /**
3
+ * The type definitions for the `statuses` library.
4
+ *
5
+ * While the library has type definitions, TypeScript throws an error that they can't be
6
+ * exported, so that's why they are copied in there.
7
+ */
8
+ export type Statuses = {
9
+ /**
10
+ * Given a status code, returns the status text, and given a status text, returns the
11
+ * status code.
12
+ *
13
+ * @param code The status code or status text to look up.
14
+ * @throws If the status is invalid.
15
+ */
16
+ (code: number | string): number | string;
17
+ /**
18
+ * A list of all the supported status codes.
19
+ */
20
+ codes: number[];
21
+ /**
22
+ * A dictionary with the status texts and their corresponding status codes.
23
+ */
24
+ code: Record<string, number | undefined>;
25
+ /**
26
+ * A dictionary with the status codes and their corresponding status texts, for
27
+ * responses that expect an empty body.
28
+ */
29
+ empty: Record<number, boolean | undefined>;
30
+ /**
31
+ * A dictionary with the status codes and their corresponding status texts.
32
+ */
33
+ message: Record<number, string | undefined>;
34
+ /**
35
+ * A dictionary with status codes for responses that are valid for redirections.
36
+ */
37
+ redirect: Record<number, boolean | undefined>;
38
+ /**
39
+ * A dictionary with status codes that should be retried.
40
+ */
41
+ retry: Record<number, boolean | undefined>;
42
+ };
43
+
44
+ export { statuses };
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Escapes a string to be used on `new RegExp(...)`.
3
+ *
4
+ * @param text The text to escape.
5
+ * @group Utilities
6
+ */
7
+ export const escapeForRegExp = (text: string): string =>
8
+ text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
@@ -0,0 +1,2 @@
1
+ export * from './fns';
2
+ export * from './wrappers';
@@ -0,0 +1,537 @@
1
+ import {
2
+ createProvider,
3
+ createProviderCreator,
4
+ createProviders,
5
+ resourceFactory,
6
+ type ProviderRegisterFn as OriginalProviderRegisterFn,
7
+ type GenericCurriedFn,
8
+ resourceCreatorFactory,
9
+ } from '@homer0/jimple';
10
+ import type { Jimpex } from '../app';
11
+ import type { Router, ExpressMiddlewareLike, NoStringIndex } from '../types';
12
+ /**
13
+ * The function a provider uses to configure a resource in the container.
14
+ *
15
+ * @group Wrappers
16
+ */
17
+ export type ProviderRegisterFn = OriginalProviderRegisterFn<Jimpex>;
18
+ /**
19
+ * Creates an object that can configure/extend the container by registering services and
20
+ * resources.
21
+ *
22
+ * @example
23
+ *
24
+ * class APIClient {}
25
+ * const apiClientProvider = provider((app) => {
26
+ * app.set('apiClient', () => new APIClient());
27
+ * });
28
+ *
29
+ * @group Wrappers
30
+ */
31
+ export const provider = createProvider<Jimpex>();
32
+ /**
33
+ * Creates an object like a provider, but that it can also be used as a function, as it
34
+ * normally expose options for the resources it will configure.
35
+ *
36
+ * @example
37
+ *
38
+ * <caption>Registering as a common provider</caption>
39
+ *
40
+ * const apiClientProvider = providerCreator(
41
+ * ({ serviceName = 'apiClient' }) =>
42
+ * (app) => {
43
+ * app.set(serviceName, () => new APIClient());
44
+ * },
45
+ * );
46
+ *
47
+ * container.register(apiClientProvider);
48
+ *
49
+ * @example
50
+ *
51
+ * <caption>Registering a created provider</caption>
52
+ *
53
+ * container.register(
54
+ * apiClientProvider({
55
+ * serviceName: 'myApiClient',
56
+ * }),
57
+ * );
58
+ *
59
+ * @group Wrappers
60
+ */
61
+ export const providerCreator = createProviderCreator<Jimpex>();
62
+ /**
63
+ * Creates a collection of providers that can be registered one by one, or all at once.
64
+ *
65
+ * @example
66
+ *
67
+ * <caption>Registering all the providers at once</caption>
68
+ *
69
+ * const collection = providers({
70
+ * apiClient: apiClientProvider,
71
+ * http: httpProvider,
72
+ * });
73
+ *
74
+ * container.register(collection);
75
+ *
76
+ * @example
77
+ *
78
+ * <caption>Registering one by one</caption>
79
+ *
80
+ * container.register(collection.http);
81
+ *
82
+ * @group Wrappers
83
+ */
84
+ export const providers = createProviders<Jimpex>();
85
+ /**
86
+ * An object that can configure/extend the container by registering services and
87
+ * resources.
88
+ *
89
+ * @group Wrappers
90
+ */
91
+ export type Provider = ReturnType<typeof provider>;
92
+ /**
93
+ * A provider creator is like a provider, but it can also be used as a function, and it
94
+ * expose options for the resources it will configure.
95
+ *
96
+ * @group Wrappers
97
+ */
98
+ export type ProviderCreator = ReturnType<typeof providerCreator>;
99
+ /**
100
+ * A collection of providers that can be registered one by one, or all at once.
101
+ *
102
+ * @group Wrappers
103
+ */
104
+ export type Providers = ReturnType<typeof providers>;
105
+ /**
106
+ * A union of all types that can be registered in the provider with a `register` function.
107
+ *
108
+ * @group Wrappers
109
+ */
110
+ export type ProviderLike = Provider | ProviderCreator | Providers;
111
+
112
+ // --
113
+ /**
114
+ * The function a controller uses to mount a controller/middleware in the container.
115
+ *
116
+ * @param container The reference to the Jimpex container.
117
+ * @param route The route on which the controller will be mounted on.
118
+ * @group Wrappers
119
+ */
120
+ export type ControllerConnectFn = <ContainerType extends Jimpex = Jimpex>(
121
+ container: ContainerType,
122
+ route: string,
123
+ ) => Router | ExpressMiddlewareLike;
124
+
125
+ const controllerFactory = resourceFactory<ControllerConnectFn>();
126
+ /**
127
+ * Generates a routes controller for the application container to mount.
128
+ *
129
+ * @param connect A function that will be called the moment the application mounts the
130
+ * controller, and that is in charge of registering routes and
131
+ * middlewares.
132
+ * @example
133
+ *
134
+ * const myController = controller((app) => {
135
+ * const router = app.getRouter();
136
+ * const ctrl = new MyController();
137
+ * return router.get('...', ctrl.doSomething()).post('...', ctrl.doSomethingElse());
138
+ * });
139
+ *
140
+ * // ...
141
+ * container.mount('/charo', myController);
142
+ *
143
+ * @group Wrappers
144
+ */
145
+ export const controller = (connect: ControllerConnectFn) =>
146
+ controllerFactory('controller', 'connect', connect);
147
+ /**
148
+ * A high order function that generates a controller. It's used on the definitions of a
149
+ * controller creator.
150
+ *
151
+ * @group Wrappers
152
+ */
153
+ export type ControllerCreatorFn = GenericCurriedFn<ControllerConnectFn>;
154
+ const controllerCreatorFactory = resourceCreatorFactory<ControllerConnectFn>();
155
+ /**
156
+ * Generates a configurable routes controller for the application to mount. It's
157
+ * configurable because the `creator`, instead of just being sent to the container to
158
+ * mount, it can also be called as a function with custom parameters the controller can
159
+ * receive.
160
+ *
161
+ * @param creator A function that will generate a controller.
162
+ * @example
163
+ *
164
+ * <caption>Basic usage</caption>
165
+ *
166
+ * const myController = controllerCreator((options = {}) => (app) => {
167
+ * const router = app.getRouter();
168
+ * const ctrl = new MyController(options);
169
+ * return router.get('...', ctrl.doSomething()).post('...', ctrl.doSomethingElse());
170
+ * });
171
+ *
172
+ * // ...
173
+ * container.mount('/charo', myController);
174
+ *
175
+ * @example
176
+ *
177
+ * <caption>Custom parameters</caption>
178
+ *
179
+ * container.mount('/pili', myController({ foo: 'bar' }));
180
+ *
181
+ * @group Wrappers
182
+ */
183
+ export const controllerCreator = <CreatorFn extends ControllerCreatorFn>(
184
+ creator: CreatorFn,
185
+ ) => controllerCreatorFactory('controller', 'connect', creator);
186
+ /**
187
+ * A resource that will define middlewares for specific routes.
188
+ *
189
+ * @group Wrappers
190
+ */
191
+ export type Controller = ReturnType<typeof controller>;
192
+ /**
193
+ * A controller creator is like a controller, but it can also be used as a function, and
194
+ * it can receive custom parameters to configure its behavior.
195
+ *
196
+ * @group Wrappers
197
+ */
198
+ export type ControllerCreator = ReturnType<typeof controllerCreator>;
199
+
200
+ // --
201
+ /**
202
+ * The function a controller provider uses to configure/extend the container before
203
+ * returning an actual controller.
204
+ *
205
+ * @param container The reference to the Jimpex container.
206
+ * @param route The route on which the controller will be mounted on.
207
+ * @group Wrappers
208
+ */
209
+ export type ControllerProviderRegisterFn = <ContainerType extends Jimpex = Jimpex>(
210
+ container: ContainerType,
211
+ route: string,
212
+ ) => Controller;
213
+
214
+ const controllerProviderFactory = resourceFactory<ControllerProviderRegisterFn>();
215
+ /**
216
+ * Creates a "controller provider", which is a controller that can configure/extend the
217
+ * container before the application mounts it.
218
+ *
219
+ * @param register A function that will be called the moment the application mounts
220
+ * the controller provider.
221
+ * @example
222
+ *
223
+ * class MyController {}
224
+ * const myControllerProvider = controllerProvider((app) => {
225
+ * app.set('myController', () => new MyController());
226
+ * return controller(() => {
227
+ * const ctrl = app.get<MyController>('myController');
228
+ * const router = app.getRouter();
229
+ * return router.get('/', ctrl.doSomething());
230
+ * });
231
+ * });
232
+ *
233
+ * @group Wrappers
234
+ */
235
+ export const controllerProvider = (register: ControllerProviderRegisterFn) =>
236
+ controllerProviderFactory('provider', 'register', register);
237
+ /**
238
+ * A high order function that generates a controller provider. It's used on the
239
+ * definitions of a controller provider creator.
240
+ *
241
+ * @group Wrappers
242
+ */
243
+ export type ControllerProviderCreatorFn = GenericCurriedFn<ControllerProviderRegisterFn>;
244
+ const controllerProviderCreatorFactory =
245
+ resourceCreatorFactory<ControllerProviderRegisterFn>();
246
+ /**
247
+ * Generates a configurable controller provider for the application to mount. This is a
248
+ * mix of a controller creator and a controller provider: it gives you the flexibility of
249
+ * the creator, with the resources of the provider.
250
+ *
251
+ * @param creator A function that will generate a controller provider.
252
+ * @example
253
+ *
254
+ * <caption>Basic usage</caption>
255
+ *
256
+ * class MyController {}
257
+ * const myControllerProvider = controllerProviderCreator(
258
+ * ({ serviceName = 'myController' }) =>
259
+ * (app) => {
260
+ * app.set(serviceName, () => new MyController());
261
+ * return controller(() => {
262
+ * const ctrl = app.get<MyController>(serviceName);
263
+ * const router = app.getRouter();
264
+ * return router.get('/', ctrl.doSomething());
265
+ * });
266
+ * },
267
+ * );
268
+ *
269
+ * // ...
270
+ * container.mount('/charo', myControllerProvider);
271
+ *
272
+ * @example
273
+ *
274
+ * <caption>Custom parameters</caption>
275
+ *
276
+ * container.mount('/pili', myControllerProvider({ serviceName: 'something' }));
277
+ *
278
+ * @group Wrappers
279
+ */
280
+ export const controllerProviderCreator = <CreatorFn extends ControllerProviderCreatorFn>(
281
+ creator: CreatorFn,
282
+ ) => controllerProviderCreatorFactory('provider', 'register', creator);
283
+ /**
284
+ * A special kind of controller that can be used to configure/extend the container before
285
+ * returning an actual controller.
286
+ *
287
+ * @group Wrappers
288
+ */
289
+ export type ControllerProvider = ReturnType<typeof controllerProvider>;
290
+ /**
291
+ * A "creator version" of a controller provider: a controller that can be used to
292
+ * configure/extend the container before returning an actual controller, but that can also
293
+ * be called as a function, and it can receive custom parameters to configure its
294
+ * behavior.
295
+ *
296
+ * @group Wrappers
297
+ */
298
+ export type ControllerProviderCreator = ReturnType<typeof controllerProviderCreator>;
299
+
300
+ // --
301
+ /**
302
+ * The function a middleware uses to mount itself in the container.
303
+ *
304
+ * @param container The reference to the Jimpex container.
305
+ * @param route This is optional because the implementation can use it as a
306
+ * "global widdleware", or for a specific route.
307
+ * @returns The resource can choose to be enabled or not by returning the function, or
308
+ * `undefined`.
309
+ * @group Wrappers
310
+ */
311
+ export type MiddlewareConnectFn = <ContainerType extends Jimpex = Jimpex>(
312
+ app: ContainerType,
313
+ route?: string,
314
+ ) => Router | ExpressMiddlewareLike | undefined;
315
+
316
+ const middlewareFactory = resourceFactory<MiddlewareConnectFn>();
317
+ /**
318
+ * Generates a middleware for the application container to mount.
319
+ *
320
+ * @param connect A function that will be called the moment the application tries to
321
+ * mount the middleware.
322
+ * @example
323
+ *
324
+ * <caption>Basic usage</caption>
325
+ *
326
+ * const myMiddleware = controller((app) => {
327
+ * const responsesBuilder = app.get<ResponsesBuilder>('responsesBuilder');
328
+ * return (_, res) => {
329
+ * responsesBuilder.json({ res, data: { hello: 'world' } });
330
+ * };
331
+ * });
332
+ *
333
+ * // ...
334
+ * container.use(myMiddleware);
335
+ *
336
+ * @example
337
+ *
338
+ * <caption>On a specific route</caption>
339
+ *
340
+ * container.mount('/charo', myMiddleware);
341
+ *
342
+ * @group Wrappers
343
+ */
344
+ export const middleware = (connect: MiddlewareConnectFn) =>
345
+ middlewareFactory('middleware', 'connect', connect);
346
+ /**
347
+ * A high order function that generates a middleware. It's used on the definitions of a
348
+ * middleware creator.
349
+ *
350
+ * @group Wrappers
351
+ */
352
+ export type MiddlewareCreatorFn = GenericCurriedFn<MiddlewareConnectFn>;
353
+ const middlewareCreatorFactory = resourceCreatorFactory<MiddlewareConnectFn>();
354
+ /**
355
+ * Generates a configurable middleware for the application to use. It's configurable
356
+ * because the `creator`, instead of just being sent to the container to mount, it can
357
+ * also be called as a function with custom parameters the middleware can receive.
358
+ *
359
+ * @param creator A function that will generate a middleware.
360
+ * @example
361
+ *
362
+ * <caption>Basic usage</caption>
363
+ *
364
+ * const myMiddleware = middlewareCreator((options = {}) => (app) => {
365
+ * const message = options.message || 'Hello Charo!';
366
+ * const responsesBuilder = app.get<ResponsesBuilder>('responsesBuilder');
367
+ * return (_, res) => {
368
+ * responsesBuilder.json({ res, data: { message } });
369
+ * };
370
+ * });
371
+ *
372
+ * // ...
373
+ * container.use(myMiddleware);
374
+ *
375
+ * @example
376
+ *
377
+ * <caption>Custom parameters</caption>
378
+ *
379
+ * container.use(myMiddleware({ message: 'Hello Pili!' }));
380
+ *
381
+ * @group Wrappers
382
+ */
383
+ export const middlewareCreator = <CreatorFn extends MiddlewareCreatorFn>(
384
+ creator: CreatorFn,
385
+ ) => middlewareCreatorFactory('middleware', 'connect', creator);
386
+ /**
387
+ * A resource that will define middlewares the application can use.
388
+ *
389
+ * @group Wrappers
390
+ */
391
+ export type Middleware = ReturnType<typeof middleware>;
392
+ /**
393
+ * A middleware creator is like a middleware, but i can also be used as a function, and it
394
+ * can receive custom parameters to configure its behavior.
395
+ *
396
+ * @group Wrappers
397
+ */
398
+ export type MiddlewareCreator = ReturnType<typeof middlewareCreator>;
399
+
400
+ // --
401
+ /**
402
+ * The function a middelware provider uses to configure/extend the container before
403
+ * returning an actual middleware.
404
+ *
405
+ * @param container The reference to the Jimpex container.
406
+ * @param route This is available only in the case the middleware is mounted on a
407
+ * specific route.
408
+ * @group Wrappers
409
+ */
410
+ export type MiddlewareProviderRegisterFn = <ContainerType extends Jimpex = Jimpex>(
411
+ container: ContainerType,
412
+ route?: string,
413
+ ) => Middleware;
414
+ const middlewareProviderFactory = resourceFactory<MiddlewareProviderRegisterFn>();
415
+ /**
416
+ * Creates a "middleware provider", which is a middleware that can configure/extend the
417
+ * container before the application uses it.
418
+ *
419
+ * @param register A function that will be called the moment the application uses the
420
+ * middleware provider.
421
+ * @example
422
+ *
423
+ * class MyServiceWithMiddleware {
424
+ * constructor(private readonly responsesBuilder: ResponsesBuilder) {}
425
+ * getMiddleware() {
426
+ * return (_, res) => {
427
+ * this.responsesBuilder.json({ res, data: { message } });
428
+ * };
429
+ * }
430
+ * }
431
+ *
432
+ * const myMiddlewareProvider = middlewareProvider((app) => {
433
+ * app.set(
434
+ * 'myMiddleware',
435
+ * () => new MyServiceWithMiddleware(app.get('responsesBuilder')),
436
+ * );
437
+ * return middleware(() =>
438
+ * app.get<MyServiceWithMiddleware>('myMiddleware').getMiddleware(),
439
+ * );
440
+ * });
441
+ *
442
+ * @group Wrappers
443
+ */
444
+ export const middlewareProvider = (register: MiddlewareProviderRegisterFn) =>
445
+ middlewareProviderFactory('provider', 'register', register);
446
+ /**
447
+ * A high order function that generates a middleware provider. It's used on the
448
+ * definitions of a middleware provider creator.
449
+ *
450
+ * @group Wrappers
451
+ */
452
+ export type MiddlewareProviderCreatorFn = GenericCurriedFn<MiddlewareProviderRegisterFn>;
453
+ const middlewareProviderCreatorFactory =
454
+ resourceCreatorFactory<MiddlewareProviderRegisterFn>();
455
+ /**
456
+ * Generates a configurable middleware provider for the application to use. This is a mix
457
+ * of a middleware creator and a middleware provider: it gives you the flexibility of the
458
+ * creator, with the resources of the provider.
459
+ *
460
+ * @param creator A function that will generate a middleware provider.
461
+ * @example
462
+ *
463
+ * <caption>Basic usage</caption>
464
+ *
465
+ * class MyServiceWithMiddleware {
466
+ * constructor(private readonly responsesBuilder: ResponsesBuilder) {}
467
+ * getMiddleware() {
468
+ * return (_, res) => {
469
+ * this.responsesBuilder.json({ res, data: { message } });
470
+ * };
471
+ * }
472
+ * }
473
+ * const myMiddlewareProvider = middlewareProviderCreator(
474
+ * ({ serviceName = 'myMiddleware' }) =>
475
+ * (app) => {
476
+ * app.set(
477
+ * serviceName,
478
+ * () => new MyServiceWithMiddleware(app.get('responsesBuilder')),
479
+ * );
480
+ * return middleware(() =>
481
+ * app.get<MyServiceWithMiddleware>(serviceName).getMiddleware(),
482
+ * );
483
+ * },
484
+ * );
485
+ *
486
+ * // ...
487
+ * container.use(myMiddlewareProvider);
488
+ *
489
+ * @example
490
+ *
491
+ * <caption>Custom parameters</caption>
492
+ *
493
+ * container.use(myMiddlewareProvider({ serviceName: 'something' }));
494
+ *
495
+ * @group Wrappers
496
+ */
497
+ export const middlewareProviderCreator = <CreatorFn extends MiddlewareProviderCreatorFn>(
498
+ creator: CreatorFn,
499
+ ) => middlewareProviderCreatorFactory('provider', 'register', creator);
500
+ /**
501
+ * A special kind of middleware that can be used to configure/extend the container before
502
+ * returning an actual middleware.
503
+ *
504
+ * @group Wrappers
505
+ */
506
+ export type MiddlewareProvider = ReturnType<typeof middlewareProvider>;
507
+ /**
508
+ * A "creator version" of a middleware provider: a middleware that can be used to
509
+ * configure/extend the container before returning an actual middleware, but that can also
510
+ * be called as a function, and it can receive custom parameters to configure its
511
+ * behavior.
512
+ *
513
+ * @group Wrappers
514
+ */
515
+ export type MiddlewareProviderCreator = ReturnType<typeof middlewareProviderCreator>;
516
+
517
+ // --
518
+ /**
519
+ * A union types of the different kinds of middlewares that can be used by the
520
+ * application.
521
+ *
522
+ * @group Wrappers
523
+ */
524
+ export type MiddlewareLike =
525
+ | NoStringIndex<Middleware>
526
+ | NoStringIndex<MiddlewareProvider>
527
+ | ExpressMiddlewareLike;
528
+ /**
529
+ * A union types of the different kinds of controllers that can be mounted by the
530
+ * application.
531
+ *
532
+ * @group Wrappers
533
+ */
534
+ export type ControllerLike =
535
+ | NoStringIndex<Controller>
536
+ | NoStringIndex<ControllerProvider>
537
+ | MiddlewareLike;
package/tsconfig.json CHANGED
@@ -1,12 +1,9 @@
1
1
  {
2
+ "extends": "@homer0/tsconfig/tsconfig.node.json",
2
3
  "compilerOptions": {
3
- "declaration": true,
4
- "allowJs": true,
5
- "emitDeclarationOnly": true,
6
- "outDir": "types/",
7
- "rootDir": "./",
8
- "target": "es6",
9
- "module": "commonjs"
4
+ "outDir": "dist",
5
+ "emitDecoratorMetadata": false,
6
+ "incremental": false
10
7
  },
11
- "include": ["src"]
8
+ "include": ["src/**/*.ts", "examples/**/*.ts", "tsup.config.ts"]
12
9
  }