@lakutata/entrypoint 3.0.0-beta.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 (325) hide show
  1. package/LICENSE +23 -0
  2. package/README.md +183 -0
  3. package/THIRD_PARTY_NOTICES.md +206 -0
  4. package/dist/cjs/Entrypoint.d.ts +868 -0
  5. package/dist/cjs/Entrypoint.js +998 -0
  6. package/dist/cjs/adapter/commander/CommanderCLIEntrypoint.d.ts +192 -0
  7. package/dist/cjs/adapter/commander/CommanderCLIEntrypoint.js +439 -0
  8. package/dist/cjs/adapter/commander/Prompt.d.ts +22 -0
  9. package/dist/cjs/adapter/commander/Prompt.js +164 -0
  10. package/dist/cjs/adapter/commander/Width.d.ts +12 -0
  11. package/dist/cjs/adapter/commander/Width.js +67 -0
  12. package/dist/cjs/adapter/electron/ElectronIPCServiceEntrypoint.d.ts +203 -0
  13. package/dist/cjs/adapter/electron/ElectronIPCServiceEntrypoint.js +249 -0
  14. package/dist/cjs/adapter/express/ExpressHTTPEntrypoint.d.ts +172 -0
  15. package/dist/cjs/adapter/express/ExpressHTTPEntrypoint.js +301 -0
  16. package/dist/cjs/adapter/express/Responders.d.ts +89 -0
  17. package/dist/cjs/adapter/express/Responders.js +71 -0
  18. package/dist/cjs/adapter/express/StaticUI.d.ts +83 -0
  19. package/dist/cjs/adapter/express/StaticUI.js +104 -0
  20. package/dist/cjs/adapter/fastify/FastifyHTTPEntrypoint.d.ts +156 -0
  21. package/dist/cjs/adapter/fastify/FastifyHTTPEntrypoint.js +339 -0
  22. package/dist/cjs/adapter/fastify/Responders.d.ts +88 -0
  23. package/dist/cjs/adapter/fastify/Responders.js +77 -0
  24. package/dist/cjs/adapter/http/HTTPServiceEntrypoint.d.ts +117 -0
  25. package/dist/cjs/adapter/http/HTTPServiceEntrypoint.js +257 -0
  26. package/dist/cjs/adapter/jsonrpc/JSONRPCProtocol.d.ts +194 -0
  27. package/dist/cjs/adapter/jsonrpc/JSONRPCProtocol.js +187 -0
  28. package/dist/cjs/adapter/jsonrpc/JSONRPCServiceEntrypoint.d.ts +154 -0
  29. package/dist/cjs/adapter/jsonrpc/JSONRPCServiceEntrypoint.js +397 -0
  30. package/dist/cjs/adapter/schedule/ScheduleEntrypoint.d.ts +86 -0
  31. package/dist/cjs/adapter/schedule/ScheduleEntrypoint.js +275 -0
  32. package/dist/cjs/adapter/socket.io/SocketIOServiceEntrypoint.d.ts +138 -0
  33. package/dist/cjs/adapter/socket.io/SocketIOServiceEntrypoint.js +216 -0
  34. package/dist/cjs/channel/BuiltinChannels.d.ts +18 -0
  35. package/dist/cjs/channel/BuiltinChannels.js +128 -0
  36. package/dist/cjs/channel/Channel.d.ts +196 -0
  37. package/dist/cjs/channel/Channel.js +106 -0
  38. package/dist/cjs/channel/EntrypointAdapter.d.ts +195 -0
  39. package/dist/cjs/channel/EntrypointAdapter.js +43 -0
  40. package/dist/cjs/context/BaseContext.d.ts +75 -0
  41. package/dist/cjs/context/BaseContext.js +90 -0
  42. package/dist/cjs/context/CLIContext.d.ts +38 -0
  43. package/dist/cjs/context/CLIContext.js +53 -0
  44. package/dist/cjs/context/HTTPContext.d.ts +52 -0
  45. package/dist/cjs/context/HTTPContext.js +78 -0
  46. package/dist/cjs/context/ScheduleContext.d.ts +47 -0
  47. package/dist/cjs/context/ScheduleContext.js +65 -0
  48. package/dist/cjs/context/ServiceContext.d.ts +47 -0
  49. package/dist/cjs/context/ServiceContext.js +62 -0
  50. package/dist/cjs/decorators/CLIAction.d.ts +120 -0
  51. package/dist/cjs/decorators/CLIAction.js +13 -0
  52. package/dist/cjs/decorators/HTTPAction.d.ts +178 -0
  53. package/dist/cjs/decorators/HTTPAction.js +14 -0
  54. package/dist/cjs/decorators/Prefix.d.ts +44 -0
  55. package/dist/cjs/decorators/Prefix.js +48 -0
  56. package/dist/cjs/decorators/Schedule.d.ts +120 -0
  57. package/dist/cjs/decorators/Schedule.js +64 -0
  58. package/dist/cjs/decorators/ServiceAction.d.ts +116 -0
  59. package/dist/cjs/decorators/ServiceAction.js +12 -0
  60. package/dist/cjs/decorators/UseMiddlewares.d.ts +52 -0
  61. package/dist/cjs/decorators/UseMiddlewares.js +58 -0
  62. package/dist/cjs/decorators/http/DELETE.d.ts +87 -0
  63. package/dist/cjs/decorators/http/DELETE.js +7 -0
  64. package/dist/cjs/decorators/http/GET.d.ts +89 -0
  65. package/dist/cjs/decorators/http/GET.js +7 -0
  66. package/dist/cjs/decorators/http/HEAD.d.ts +84 -0
  67. package/dist/cjs/decorators/http/HEAD.js +7 -0
  68. package/dist/cjs/decorators/http/OPTIONS.d.ts +80 -0
  69. package/dist/cjs/decorators/http/OPTIONS.js +7 -0
  70. package/dist/cjs/decorators/http/PATCH.d.ts +90 -0
  71. package/dist/cjs/decorators/http/PATCH.js +7 -0
  72. package/dist/cjs/decorators/http/POST.d.ts +91 -0
  73. package/dist/cjs/decorators/http/POST.js +7 -0
  74. package/dist/cjs/decorators/http/PUT.d.ts +92 -0
  75. package/dist/cjs/decorators/http/PUT.js +7 -0
  76. package/dist/cjs/exceptions/AccessDeniedException.d.ts +10 -0
  77. package/dist/cjs/exceptions/AccessDeniedException.js +17 -0
  78. package/dist/cjs/exceptions/ControllerActionNotFoundException.d.ts +9 -0
  79. package/dist/cjs/exceptions/ControllerActionNotFoundException.js +16 -0
  80. package/dist/cjs/exceptions/DuplicateActionNameException.d.ts +8 -0
  81. package/dist/cjs/exceptions/DuplicateActionNameException.js +15 -0
  82. package/dist/cjs/exceptions/EntrypointStoppedException.d.ts +9 -0
  83. package/dist/cjs/exceptions/EntrypointStoppedException.js +16 -0
  84. package/dist/cjs/exceptions/InvalidActionGroupException.d.ts +4 -0
  85. package/dist/cjs/exceptions/InvalidActionGroupException.js +11 -0
  86. package/dist/cjs/exceptions/InvalidChannelException.d.ts +8 -0
  87. package/dist/cjs/exceptions/InvalidChannelException.js +15 -0
  88. package/dist/cjs/exceptions/InvalidEntrypointAdapterException.d.ts +9 -0
  89. package/dist/cjs/exceptions/InvalidEntrypointAdapterException.js +16 -0
  90. package/dist/cjs/exceptions/InvalidMiddlewareException.d.ts +8 -0
  91. package/dist/cjs/exceptions/InvalidMiddlewareException.js +15 -0
  92. package/dist/cjs/exceptions/InvalidPrefixException.d.ts +8 -0
  93. package/dist/cjs/exceptions/InvalidPrefixException.js +15 -0
  94. package/dist/cjs/exceptions/MiddlewareNextCalledException.d.ts +8 -0
  95. package/dist/cjs/exceptions/MiddlewareNextCalledException.js +15 -0
  96. package/dist/cjs/exceptions/RouteNotFoundException.d.ts +9 -0
  97. package/dist/cjs/exceptions/RouteNotFoundException.js +16 -0
  98. package/dist/cjs/exceptions/ServiceInvokeException.d.ts +11 -0
  99. package/dist/cjs/exceptions/ServiceInvokeException.js +14 -0
  100. package/dist/cjs/exports/CTRLDecorators.d.ts +13 -0
  101. package/dist/cjs/exports/CTRLDecorators.js +38 -0
  102. package/dist/cjs/exports/Channel.d.ts +14 -0
  103. package/dist/cjs/exports/Channel.js +33 -0
  104. package/dist/cjs/exports/CommanderAdapter.d.ts +1 -0
  105. package/dist/cjs/exports/CommanderAdapter.js +8 -0
  106. package/dist/cjs/exports/ElectronAdapter.d.ts +1 -0
  107. package/dist/cjs/exports/ElectronAdapter.js +9 -0
  108. package/dist/cjs/exports/Entrypoint.d.ts +24 -0
  109. package/dist/cjs/exports/Entrypoint.js +55 -0
  110. package/dist/cjs/exports/ExpressAdapter.d.ts +4 -0
  111. package/dist/cjs/exports/ExpressAdapter.js +15 -0
  112. package/dist/cjs/exports/FastifyAdapter.d.ts +4 -0
  113. package/dist/cjs/exports/FastifyAdapter.js +14 -0
  114. package/dist/cjs/exports/JSONRPCAdapter.d.ts +2 -0
  115. package/dist/cjs/exports/JSONRPCAdapter.js +11 -0
  116. package/dist/cjs/exports/SocketIOAdapter.d.ts +1 -0
  117. package/dist/cjs/exports/SocketIOAdapter.js +9 -0
  118. package/dist/cjs/lib/AccessControl.d.ts +118 -0
  119. package/dist/cjs/lib/AccessControl.js +208 -0
  120. package/dist/cjs/lib/AccessControlRule.d.ts +91 -0
  121. package/dist/cjs/lib/AccessControlRule.js +76 -0
  122. package/dist/cjs/lib/ActionOptions.d.ts +67 -0
  123. package/dist/cjs/lib/ActionOptions.js +67 -0
  124. package/dist/cjs/lib/ActionResult.d.ts +28 -0
  125. package/dist/cjs/lib/ActionResult.js +28 -0
  126. package/dist/cjs/lib/ApplicationOf.d.ts +6 -0
  127. package/dist/cjs/lib/ApplicationOf.js +14 -0
  128. package/dist/cjs/lib/Controller.d.ts +59 -0
  129. package/dist/cjs/lib/Controller.js +64 -0
  130. package/dist/cjs/lib/ControllerEntrypoint.d.ts +168 -0
  131. package/dist/cjs/lib/ControllerEntrypoint.js +239 -0
  132. package/dist/cjs/lib/GetActionDTOAndOptions.d.ts +29 -0
  133. package/dist/cjs/lib/GetActionDTOAndOptions.js +49 -0
  134. package/dist/cjs/lib/HTTPErrors.d.ts +55 -0
  135. package/dist/cjs/lib/HTTPErrors.js +52 -0
  136. package/dist/cjs/lib/Middleware.d.ts +146 -0
  137. package/dist/cjs/lib/Middleware.js +144 -0
  138. package/dist/cjs/lib/Prefix.d.ts +98 -0
  139. package/dist/cjs/lib/Prefix.js +151 -0
  140. package/dist/cjs/lib/Result.d.ts +173 -0
  141. package/dist/cjs/lib/Result.js +153 -0
  142. package/dist/cjs/lib/ServiceResponseCodec.d.ts +82 -0
  143. package/dist/cjs/lib/ServiceResponseCodec.js +117 -0
  144. package/dist/cjs/lib/StringifyPattern.d.ts +7 -0
  145. package/dist/cjs/lib/StringifyPattern.js +58 -0
  146. package/dist/cjs/lib/UnsetValue.d.ts +12 -0
  147. package/dist/cjs/lib/UnsetValue.js +216 -0
  148. package/dist/cjs/lib/pattern/GlobPattern.d.ts +34 -0
  149. package/dist/cjs/lib/pattern/GlobPattern.js +68 -0
  150. package/dist/cjs/lib/pattern/PatternManager.d.ts +103 -0
  151. package/dist/cjs/lib/pattern/PatternManager.js +233 -0
  152. package/dist/cjs/lib/schedule/Cron.d.ts +56 -0
  153. package/dist/cjs/lib/schedule/Cron.js +282 -0
  154. package/dist/cjs/package.json +1 -0
  155. package/dist/cjs/types/CLIContextParams.d.ts +14 -0
  156. package/dist/cjs/types/CLIContextParams.js +2 -0
  157. package/dist/cjs/types/ErrorDescription.d.ts +14 -0
  158. package/dist/cjs/types/ErrorDescription.js +2 -0
  159. package/dist/cjs/types/HTTPContextParams.d.ts +27 -0
  160. package/dist/cjs/types/HTTPContextParams.js +2 -0
  161. package/dist/cjs/types/ScheduleContextParams.d.ts +21 -0
  162. package/dist/cjs/types/ScheduleContextParams.js +2 -0
  163. package/dist/cjs/types/ServiceContextParams.d.ts +16 -0
  164. package/dist/cjs/types/ServiceContextParams.js +2 -0
  165. package/dist/esm/Entrypoint.js +985 -0
  166. package/dist/esm/adapter/commander/CommanderCLIEntrypoint.js +433 -0
  167. package/dist/esm/adapter/commander/Prompt.js +127 -0
  168. package/dist/esm/adapter/commander/Width.js +63 -0
  169. package/dist/esm/adapter/electron/ElectronIPCServiceEntrypoint.js +212 -0
  170. package/dist/esm/adapter/express/ExpressHTTPEntrypoint.js +295 -0
  171. package/dist/esm/adapter/express/Responders.js +66 -0
  172. package/dist/esm/adapter/express/StaticUI.js +96 -0
  173. package/dist/esm/adapter/fastify/FastifyHTTPEntrypoint.js +333 -0
  174. package/dist/esm/adapter/fastify/Responders.js +73 -0
  175. package/dist/esm/adapter/http/HTTPServiceEntrypoint.js +253 -0
  176. package/dist/esm/adapter/jsonrpc/JSONRPCProtocol.js +182 -0
  177. package/dist/esm/adapter/jsonrpc/JSONRPCServiceEntrypoint.js +361 -0
  178. package/dist/esm/adapter/schedule/ScheduleEntrypoint.js +272 -0
  179. package/dist/esm/adapter/socket.io/SocketIOServiceEntrypoint.js +212 -0
  180. package/dist/esm/channel/BuiltinChannels.js +125 -0
  181. package/dist/esm/channel/Channel.js +100 -0
  182. package/dist/esm/channel/EntrypointAdapter.js +39 -0
  183. package/dist/esm/context/BaseContext.js +87 -0
  184. package/dist/esm/context/CLIContext.js +49 -0
  185. package/dist/esm/context/HTTPContext.js +74 -0
  186. package/dist/esm/context/ScheduleContext.js +61 -0
  187. package/dist/esm/context/ServiceContext.js +58 -0
  188. package/dist/esm/decorators/CLIAction.js +10 -0
  189. package/dist/esm/decorators/HTTPAction.js +11 -0
  190. package/dist/esm/decorators/Prefix.js +45 -0
  191. package/dist/esm/decorators/Schedule.js +61 -0
  192. package/dist/esm/decorators/ServiceAction.js +9 -0
  193. package/dist/esm/decorators/UseMiddlewares.js +55 -0
  194. package/dist/esm/decorators/http/DELETE.js +4 -0
  195. package/dist/esm/decorators/http/GET.js +4 -0
  196. package/dist/esm/decorators/http/HEAD.js +4 -0
  197. package/dist/esm/decorators/http/OPTIONS.js +4 -0
  198. package/dist/esm/decorators/http/PATCH.js +4 -0
  199. package/dist/esm/decorators/http/POST.js +4 -0
  200. package/dist/esm/decorators/http/PUT.js +4 -0
  201. package/dist/esm/exceptions/AccessDeniedException.js +13 -0
  202. package/dist/esm/exceptions/ControllerActionNotFoundException.js +12 -0
  203. package/dist/esm/exceptions/DuplicateActionNameException.js +11 -0
  204. package/dist/esm/exceptions/EntrypointStoppedException.js +12 -0
  205. package/dist/esm/exceptions/InvalidActionGroupException.js +7 -0
  206. package/dist/esm/exceptions/InvalidChannelException.js +11 -0
  207. package/dist/esm/exceptions/InvalidEntrypointAdapterException.js +12 -0
  208. package/dist/esm/exceptions/InvalidMiddlewareException.js +11 -0
  209. package/dist/esm/exceptions/InvalidPrefixException.js +11 -0
  210. package/dist/esm/exceptions/MiddlewareNextCalledException.js +11 -0
  211. package/dist/esm/exceptions/RouteNotFoundException.js +12 -0
  212. package/dist/esm/exceptions/ServiceInvokeException.js +10 -0
  213. package/dist/esm/exports/CTRLDecorators.js +19 -0
  214. package/dist/esm/exports/Channel.js +11 -0
  215. package/dist/esm/exports/CommanderAdapter.js +1 -0
  216. package/dist/esm/exports/ElectronAdapter.js +1 -0
  217. package/dist/esm/exports/Entrypoint.js +22 -0
  218. package/dist/esm/exports/ExpressAdapter.js +3 -0
  219. package/dist/esm/exports/FastifyAdapter.js +3 -0
  220. package/dist/esm/exports/JSONRPCAdapter.js +2 -0
  221. package/dist/esm/exports/SocketIOAdapter.js +1 -0
  222. package/dist/esm/lib/AccessControl.js +204 -0
  223. package/dist/esm/lib/AccessControlRule.js +72 -0
  224. package/dist/esm/lib/ActionOptions.js +63 -0
  225. package/dist/esm/lib/ActionResult.js +24 -0
  226. package/dist/esm/lib/ApplicationOf.js +11 -0
  227. package/dist/esm/lib/Controller.js +61 -0
  228. package/dist/esm/lib/ControllerEntrypoint.js +229 -0
  229. package/dist/esm/lib/GetActionDTOAndOptions.js +46 -0
  230. package/dist/esm/lib/HTTPErrors.js +48 -0
  231. package/dist/esm/lib/Middleware.js +134 -0
  232. package/dist/esm/lib/Prefix.js +143 -0
  233. package/dist/esm/lib/Result.js +147 -0
  234. package/dist/esm/lib/ServiceResponseCodec.js +113 -0
  235. package/dist/esm/lib/StringifyPattern.js +55 -0
  236. package/dist/esm/lib/UnsetValue.js +213 -0
  237. package/dist/esm/lib/pattern/GlobPattern.js +64 -0
  238. package/dist/esm/lib/pattern/PatternManager.js +229 -0
  239. package/dist/esm/lib/schedule/Cron.js +277 -0
  240. package/dist/esm/types/CLIContextParams.js +1 -0
  241. package/dist/esm/types/ErrorDescription.js +1 -0
  242. package/dist/esm/types/HTTPContextParams.js +1 -0
  243. package/dist/esm/types/ScheduleContextParams.js +1 -0
  244. package/dist/esm/types/ServiceContextParams.js +1 -0
  245. package/dist/types/Entrypoint.d.ts +868 -0
  246. package/dist/types/adapter/commander/CommanderCLIEntrypoint.d.ts +192 -0
  247. package/dist/types/adapter/commander/Prompt.d.ts +22 -0
  248. package/dist/types/adapter/commander/Width.d.ts +12 -0
  249. package/dist/types/adapter/electron/ElectronIPCServiceEntrypoint.d.ts +203 -0
  250. package/dist/types/adapter/express/ExpressHTTPEntrypoint.d.ts +172 -0
  251. package/dist/types/adapter/express/Responders.d.ts +89 -0
  252. package/dist/types/adapter/express/StaticUI.d.ts +83 -0
  253. package/dist/types/adapter/fastify/FastifyHTTPEntrypoint.d.ts +156 -0
  254. package/dist/types/adapter/fastify/Responders.d.ts +88 -0
  255. package/dist/types/adapter/http/HTTPServiceEntrypoint.d.ts +117 -0
  256. package/dist/types/adapter/jsonrpc/JSONRPCProtocol.d.ts +194 -0
  257. package/dist/types/adapter/jsonrpc/JSONRPCServiceEntrypoint.d.ts +154 -0
  258. package/dist/types/adapter/schedule/ScheduleEntrypoint.d.ts +86 -0
  259. package/dist/types/adapter/socket.io/SocketIOServiceEntrypoint.d.ts +138 -0
  260. package/dist/types/channel/BuiltinChannels.d.ts +18 -0
  261. package/dist/types/channel/Channel.d.ts +196 -0
  262. package/dist/types/channel/EntrypointAdapter.d.ts +195 -0
  263. package/dist/types/context/BaseContext.d.ts +75 -0
  264. package/dist/types/context/CLIContext.d.ts +38 -0
  265. package/dist/types/context/HTTPContext.d.ts +52 -0
  266. package/dist/types/context/ScheduleContext.d.ts +47 -0
  267. package/dist/types/context/ServiceContext.d.ts +47 -0
  268. package/dist/types/decorators/CLIAction.d.ts +120 -0
  269. package/dist/types/decorators/HTTPAction.d.ts +178 -0
  270. package/dist/types/decorators/Prefix.d.ts +44 -0
  271. package/dist/types/decorators/Schedule.d.ts +120 -0
  272. package/dist/types/decorators/ServiceAction.d.ts +116 -0
  273. package/dist/types/decorators/UseMiddlewares.d.ts +52 -0
  274. package/dist/types/decorators/http/DELETE.d.ts +87 -0
  275. package/dist/types/decorators/http/GET.d.ts +89 -0
  276. package/dist/types/decorators/http/HEAD.d.ts +84 -0
  277. package/dist/types/decorators/http/OPTIONS.d.ts +80 -0
  278. package/dist/types/decorators/http/PATCH.d.ts +90 -0
  279. package/dist/types/decorators/http/POST.d.ts +91 -0
  280. package/dist/types/decorators/http/PUT.d.ts +92 -0
  281. package/dist/types/exceptions/AccessDeniedException.d.ts +10 -0
  282. package/dist/types/exceptions/ControllerActionNotFoundException.d.ts +9 -0
  283. package/dist/types/exceptions/DuplicateActionNameException.d.ts +8 -0
  284. package/dist/types/exceptions/EntrypointStoppedException.d.ts +9 -0
  285. package/dist/types/exceptions/InvalidActionGroupException.d.ts +4 -0
  286. package/dist/types/exceptions/InvalidChannelException.d.ts +8 -0
  287. package/dist/types/exceptions/InvalidEntrypointAdapterException.d.ts +9 -0
  288. package/dist/types/exceptions/InvalidMiddlewareException.d.ts +8 -0
  289. package/dist/types/exceptions/InvalidPrefixException.d.ts +8 -0
  290. package/dist/types/exceptions/MiddlewareNextCalledException.d.ts +8 -0
  291. package/dist/types/exceptions/RouteNotFoundException.d.ts +9 -0
  292. package/dist/types/exceptions/ServiceInvokeException.d.ts +11 -0
  293. package/dist/types/exports/CTRLDecorators.d.ts +13 -0
  294. package/dist/types/exports/Channel.d.ts +14 -0
  295. package/dist/types/exports/CommanderAdapter.d.ts +1 -0
  296. package/dist/types/exports/ElectronAdapter.d.ts +1 -0
  297. package/dist/types/exports/Entrypoint.d.ts +24 -0
  298. package/dist/types/exports/ExpressAdapter.d.ts +4 -0
  299. package/dist/types/exports/FastifyAdapter.d.ts +4 -0
  300. package/dist/types/exports/JSONRPCAdapter.d.ts +2 -0
  301. package/dist/types/exports/SocketIOAdapter.d.ts +1 -0
  302. package/dist/types/lib/AccessControl.d.ts +118 -0
  303. package/dist/types/lib/AccessControlRule.d.ts +91 -0
  304. package/dist/types/lib/ActionOptions.d.ts +67 -0
  305. package/dist/types/lib/ActionResult.d.ts +28 -0
  306. package/dist/types/lib/ApplicationOf.d.ts +6 -0
  307. package/dist/types/lib/Controller.d.ts +59 -0
  308. package/dist/types/lib/ControllerEntrypoint.d.ts +168 -0
  309. package/dist/types/lib/GetActionDTOAndOptions.d.ts +29 -0
  310. package/dist/types/lib/HTTPErrors.d.ts +55 -0
  311. package/dist/types/lib/Middleware.d.ts +146 -0
  312. package/dist/types/lib/Prefix.d.ts +98 -0
  313. package/dist/types/lib/Result.d.ts +173 -0
  314. package/dist/types/lib/ServiceResponseCodec.d.ts +82 -0
  315. package/dist/types/lib/StringifyPattern.d.ts +7 -0
  316. package/dist/types/lib/UnsetValue.d.ts +12 -0
  317. package/dist/types/lib/pattern/GlobPattern.d.ts +34 -0
  318. package/dist/types/lib/pattern/PatternManager.d.ts +103 -0
  319. package/dist/types/lib/schedule/Cron.d.ts +56 -0
  320. package/dist/types/types/CLIContextParams.d.ts +14 -0
  321. package/dist/types/types/ErrorDescription.d.ts +14 -0
  322. package/dist/types/types/HTTPContextParams.d.ts +27 -0
  323. package/dist/types/types/ScheduleContextParams.d.ts +21 -0
  324. package/dist/types/types/ServiceContextParams.d.ts +16 -0
  325. package/package.json +152 -0
@@ -0,0 +1,192 @@
1
+ import { Command } from 'commander';
2
+ import { type Module } from '@lakutata/core';
3
+ import type { EntrypointAdapter } from '../../channel/EntrypointAdapter.js';
4
+ import type { MiddlewareDefinition } from '../../lib/Middleware.js';
5
+ import { CLIContext } from '../../context/CLIContext.js';
6
+ /**
7
+ * The JSON schema of a property of the input of an action
8
+ */
9
+ export type PropertySchema = {
10
+ type?: string | string[];
11
+ enum?: unknown[];
12
+ items?: PropertySchema;
13
+ default?: unknown;
14
+ description?: string;
15
+ format?: string;
16
+ [key: string]: unknown;
17
+ };
18
+ /**
19
+ * A text of the help or of the prompts of {@link commanderCLIEntrypoint}, given to its `translate` function.
20
+ */
21
+ export type CLIText = {
22
+ /**
23
+ * The key identifying the text: `description` (the program), `commands.<command>.description`,
24
+ * `commands.<command>.options.<property>`, `commands.<command>.arguments.<name>` (a nested command's words are joined
25
+ * with dots: `package.exe`), the help titles and labels (`help.usage`, `help.options`, `help.commands`,
26
+ * `help.default`, `help.choices`…), the prompt messages (`prompt.json`).
27
+ */
28
+ key: string;
29
+ /**
30
+ * The English text, with its `{name}` placeholders.
31
+ */
32
+ text: string;
33
+ /**
34
+ * The values of the text's `{name}` placeholders, by name.
35
+ */
36
+ params?: Record<string, string>;
37
+ };
38
+ /**
39
+ * Translate a text of the help or of the prompts into the user's language: return the translated text, its `{name}`
40
+ * placeholders filled from `params`.
41
+ */
42
+ export type CLITranslate = (text: CLIText) => string;
43
+ /**
44
+ * The options of {@link commanderCLIEntrypoint}.
45
+ */
46
+ export type CommanderCLIEntrypointOptions = {
47
+ /**
48
+ * The adapter name, to tell apart several CLI adapters of one entrypoint.
49
+ */
50
+ name?: string;
51
+ /**
52
+ * The program name shown in the help.
53
+ * @default the name of the script run, without its extension
54
+ */
55
+ bin?: string;
56
+ /**
57
+ * The program description shown in the help.
58
+ */
59
+ description?: string;
60
+ /**
61
+ * The descriptions of the command groups, by group name: the first words of the nested commands (`'package'` for
62
+ * the command `'package exe <file>'`), whose help (`tool package --help`) lists their commands.
63
+ */
64
+ groups?: Record<string, string>;
65
+ /**
66
+ * The program version; adds the `-V, --version` option.
67
+ */
68
+ version?: string;
69
+ /**
70
+ * The command-line arguments to parse, without the node executable and the script.
71
+ * @default process.argv.slice(2)
72
+ */
73
+ argv?: string[];
74
+ /**
75
+ * Prompt for the missing required options (it needs the optional package `@inquirer/prompts`): `'auto'` when both
76
+ * stdin and stdout are terminals, `true` always, `false` never. While prompting is on, the required options are not
77
+ * enforced by the parser; without `@inquirer/prompts` installed, prompting is off (the parser requires them).
78
+ * @default 'auto'
79
+ */
80
+ interactive?: boolean | 'auto';
81
+ /**
82
+ * The input stream of the prompts.
83
+ * @default process.stdin
84
+ */
85
+ stdin?: NodeJS.ReadableStream;
86
+ /**
87
+ * The output stream of the results, the help and the prompts.
88
+ * @default process.stdout
89
+ */
90
+ stdout?: NodeJS.WritableStream;
91
+ /**
92
+ * The output stream of the errors.
93
+ * @default process.stderr
94
+ */
95
+ stderr?: NodeJS.WritableStream;
96
+ /**
97
+ * Turn an action's result into the text or bytes written to stdout; `undefined` writes nothing.
98
+ * @default a string as is (with a final newline), bytes as is, `null` and `undefined` as nothing, any other value as
99
+ * indented JSON (the bigints as strings)
100
+ */
101
+ format?: (result: unknown) => string | Uint8Array | undefined;
102
+ /**
103
+ * What happens when no argument is given: `'help'` writes the help and ends with the code 1, `'ignore'` runs no
104
+ * command and leaves the application running (an application also serving other channels).
105
+ * @default 'help'
106
+ */
107
+ noCommand?: 'help' | 'ignore';
108
+ /**
109
+ * What happens once the command ended, with its exit code (0 on success, 1 on failure, the parser's code for a
110
+ * usage error): `'application'` exits the application with the code, `'process'` only sets `process.exitCode`,
111
+ * `'none'` does nothing, or a function receiving the code.
112
+ * @default 'application'
113
+ */
114
+ exit?: 'application' | 'process' | 'none' | ((code: number) => void | Promise<void>);
115
+ /**
116
+ * Customize the commander program (hooks, global options, additional commands) after the action commands are
117
+ * added and before the arguments are parsed.
118
+ */
119
+ configure?: (program: Command) => void | Promise<void>;
120
+ /**
121
+ * The middlewares of this adapter's actions, run after the entrypoint's global middlewares.
122
+ */
123
+ middlewares?: MiddlewareDefinition[];
124
+ /**
125
+ * Translate the texts of the help and of the prompts (the program, command, argument and option descriptions, the
126
+ * help titles) into the user's language: given the entrypoint's module when the arguments are parsed, it returns the
127
+ * translating function (`commanderTranslator` of `lakutata/com/i18n` returns the one of an i18n component). The
128
+ * command and option names are never translated.
129
+ * @default the English texts
130
+ */
131
+ translate?: (module: Module) => CLITranslate | Promise<CLITranslate>;
132
+ };
133
+ /**
134
+ * Create the CLI adapter of an entrypoint, parsing the command-line arguments with commander: each CLI action
135
+ * (`@CLIAction`) becomes a command, and the properties of its input DTO become its options. It needs the optional peer
136
+ * dependency `commander` (and `@inquirer/prompts` for the interactive prompts).
137
+ *
138
+ * A property becomes a kebab-case option (`deviceId` → `--device-id <value>`), parsed by its type: a number, `true` or
139
+ * `false`, a JSON object, an array (`--tags <values...>`), a boolean as a flag (with a `--no-<name>` negation when it
140
+ * defaults to `true`); the enums, the defaults and the descriptions appear in the help. The command text may declare
141
+ * positional arguments, given to the properties of their names (`'copy <files...> [target]'`), and its leading words
142
+ * before the last one name its groups (`'package exe <file>'` is the command `exe` of the group `package`).
143
+ *
144
+ * The command runs once the application has launched (all its objects, its bootstrap and the other adapters are
145
+ * ready). Its result is written to stdout (see `format`; an `EventsResult` writes each event's data, a `FileResult`
146
+ * the file's bytes); a failure writes `error: <message>` to stderr and ends with the code 1. Then the application exits
147
+ * with the command's code (see `exit`). When the entrypoint stops first, a command not started yet does not run, and
148
+ * the prompts and the event streams end.
149
+ * @param options The adapter options; by default it parses `process.argv`, prompts in a terminal, and exits the
150
+ * application once the command ended.
151
+ * @returns The adapter, to give to the `cli` option of `buildEntrypoints`.
152
+ * @example
153
+ * ```typescript
154
+ * import {Application, DTO} from 'lakutata'
155
+ * import {buildEntrypoints, Controller} from 'lakutata/com/entrypoint'
156
+ * import {CLIAction} from 'lakutata/decorator/ctrl'
157
+ * import {Expect} from 'lakutata/decorator/dto'
158
+ * import {commanderCLIEntrypoint} from 'lakutata/adapter/commander'
159
+ *
160
+ * class GreetDTO extends DTO {
161
+ * @Expect(DTO.String().required().description('The name to greet'))
162
+ * public name!: string
163
+ *
164
+ * @Expect(DTO.Number().integer().optional().default(1).description('How many times'))
165
+ * public times?: number
166
+ *
167
+ * @Expect(DTO.Boolean().optional().default(false))
168
+ * public loud?: boolean
169
+ * }
170
+ *
171
+ * class GreetController extends Controller {
172
+ * //tool greet Ada --times 2 --loud
173
+ * @CLIAction('greet <name>', GreetDTO)
174
+ * public async greet(input: GreetDTO): Promise<string> {
175
+ * const text: string = `Hello, ${input.name}`
176
+ * return (input.loud ? text.toUpperCase() : text).repeat(input.times ?? 1)
177
+ * }
178
+ * }
179
+ *
180
+ * Application.run({
181
+ * id: 'tool.app',
182
+ * name: 'Tool',
183
+ * components: {
184
+ * entrypoint: buildEntrypoints({
185
+ * controllers: [GreetController],
186
+ * cli: commanderCLIEntrypoint({bin: 'tool', description: 'A greeting tool', version: '1.0.0'})
187
+ * })
188
+ * }
189
+ * })
190
+ * ```
191
+ */
192
+ export declare function commanderCLIEntrypoint(options?: CommanderCLIEntrypointOptions): EntrypointAdapter<CLIContext>;
@@ -0,0 +1,22 @@
1
+ import type { ChannelActionInfo } from '../../channel/EntrypointAdapter.js';
2
+ /**
3
+ * The streams of the prompts
4
+ */
5
+ export type PromptStreams = {
6
+ input: NodeJS.ReadableStream;
7
+ output: NodeJS.WritableStream;
8
+ signal: AbortSignal;
9
+ };
10
+ /**
11
+ * Load the prompts
12
+ */
13
+ export declare function loadPrompts(): Promise<any>;
14
+ /**
15
+ * Prompt for the required properties missing from the input of an action, when @inquirer/prompts is installed
16
+ * @param action
17
+ * @param data
18
+ * @param streams
19
+ * @param describe the description of a property in the language of the user
20
+ * @param say the text of the prompts in the language of the user
21
+ */
22
+ export declare function prompt(action: ChannelActionInfo, data: Record<string, unknown>, streams: PromptStreams, describe?: (property: string) => string | undefined, say?: (key: string, text: string) => string): Promise<void>;
@@ -0,0 +1,12 @@
1
+ /**
2
+ * The width of a text in a terminal, the wide characters taking two columns
3
+ * @param text
4
+ */
5
+ export declare function displayWidth(text: string): number;
6
+ /**
7
+ * Wrap a text to a width, as commander does, the lines of wide characters wrapped between them
8
+ * @param text
9
+ * @param width
10
+ * @param minimum the width under which the text is not wrapped
11
+ */
12
+ export declare function boxWrap(text: string, width: number, minimum?: number): string;
@@ -0,0 +1,203 @@
1
+ import type { EntrypointAdapter } from '../../channel/EntrypointAdapter.js';
2
+ import type { MiddlewareDefinition } from '../../lib/Middleware.js';
3
+ import { ServiceContext } from '../../context/ServiceContext.js';
4
+ /**
5
+ * The part of Electron's `WebContents` (a renderer) that {@link electronIPCServiceEntrypoint} uses: the sender of the
6
+ * invocations and the receiver of the events pushed to its pages.
7
+ */
8
+ export type IPCSender = {
9
+ /**
10
+ * Listen once to the renderer's destruction, which aborts its requests in progress and removes its clients.
11
+ * @param event The `'destroyed'` event.
12
+ * @param listener Called when the renderer is destroyed.
13
+ */
14
+ once(event: 'destroyed', listener: () => void): unknown;
15
+ /**
16
+ * Remove a `'destroyed'` listener (`removeListener` is used without it).
17
+ * @param event The `'destroyed'` event.
18
+ * @param listener The listener to remove.
19
+ */
20
+ off?(event: 'destroyed', listener: () => void): unknown;
21
+ /**
22
+ * Remove a `'destroyed'` listener, when `off` is missing.
23
+ * @param event The `'destroyed'` event.
24
+ * @param listener The listener to remove.
25
+ */
26
+ removeListener?(event: 'destroyed', listener: () => void): unknown;
27
+ /**
28
+ * Send a message to the renderer's main frame, used to push an event to a client without a known frame.
29
+ * @param channel The IPC channel.
30
+ * @param args The message's arguments.
31
+ */
32
+ send?(channel: string, ...args: unknown[]): void;
33
+ /**
34
+ * Send a message to a frame of the renderer, used to push an event to the page of a client.
35
+ * @param frame The frame's process id and frame id.
36
+ * @param channel The IPC channel.
37
+ * @param args The message's arguments.
38
+ */
39
+ sendToFrame?(frame: [number, number], channel: string, ...args: unknown[]): void;
40
+ /**
41
+ * Tell whether the renderer is destroyed; its clients are then dropped instead of receiving the events.
42
+ * @returns Whether the renderer is destroyed.
43
+ */
44
+ isDestroyed?(): boolean;
45
+ };
46
+ /**
47
+ * The part of Electron's `IpcMainInvokeEvent` that {@link electronIPCServiceEntrypoint} uses, given to the service
48
+ * actions through {@link ipcEventOfContext}.
49
+ */
50
+ export type IPCInvokeEvent = {
51
+ /**
52
+ * The renderer that invoked.
53
+ */
54
+ readonly sender: IPCSender;
55
+ /**
56
+ * The id of the renderer process of the invoking frame.
57
+ */
58
+ readonly processId?: number;
59
+ /**
60
+ * The id of the invoking frame within its process.
61
+ */
62
+ readonly frameId?: number;
63
+ /**
64
+ * The invoking frame; a frame without `parent` is the main frame of its window.
65
+ */
66
+ readonly senderFrame?: {
67
+ readonly parent?: unknown;
68
+ } | null;
69
+ };
70
+ /**
71
+ * The part of Electron's `ipcMain` that {@link electronIPCServiceEntrypoint} uses (give a stand-in in the tests).
72
+ */
73
+ export type IPCMain = {
74
+ /**
75
+ * Handle the invocations of a channel (`ipcRenderer.invoke`).
76
+ * @param channel The IPC channel.
77
+ * @param listener Answers an invocation with its result.
78
+ */
79
+ handle(channel: string, listener: (event: any, ...args: any[]) => unknown): void;
80
+ /**
81
+ * Remove the handler of a channel, when the adapter closes.
82
+ * @param channel The IPC channel.
83
+ */
84
+ removeHandler(channel: string): void;
85
+ /**
86
+ * Listen to the messages of a channel (`ipcRenderer.send`), used for the event subscriptions; without it, the pages
87
+ * are registered as clients only when they invoke with their id.
88
+ * @param channel The IPC channel.
89
+ * @param listener Called with each message.
90
+ */
91
+ on?(channel: string, listener: (event: any, ...args: any[]) => void): unknown;
92
+ /**
93
+ * Remove the listeners of a channel, when the adapter closes.
94
+ * @param channel The IPC channel.
95
+ */
96
+ removeAllListeners?(channel: string): unknown;
97
+ };
98
+ /**
99
+ * The options of {@link electronIPCServiceEntrypoint}.
100
+ */
101
+ export type ElectronIPCServiceEntrypointOptions = {
102
+ /**
103
+ * The adapter name, to tell apart several service adapters of one entrypoint.
104
+ */
105
+ name?: string;
106
+ /**
107
+ * The IPC channel of the requests (`ipcRenderer.invoke(channel, data, clientId)`). The events pushed to the pages are
108
+ * sent on `<channel>:event`, and a page subscribes to them by sending its client id on `<channel>:subscribe`.
109
+ * @default 'lakutata:service'
110
+ */
111
+ channel?: string;
112
+ /**
113
+ * The `ipcMain` to serve the requests on.
114
+ * @default the `ipcMain` of Electron's main process
115
+ */
116
+ ipcMain?: IPCMain;
117
+ /**
118
+ * The middlewares of this adapter's actions, run after the entrypoint's global middlewares.
119
+ */
120
+ middlewares?: MiddlewareDefinition[];
121
+ };
122
+ /**
123
+ * Get the IPC event of a service action's request, when {@link electronIPCServiceEntrypoint} serves it (to reach the
124
+ * invoking renderer or frame).
125
+ * @param context The service action's context (`this.context` in a controller).
126
+ * @returns The IPC event (Electron's `IpcMainInvokeEvent`, typed as `Event`), or `undefined` when another adapter serves
127
+ * the request.
128
+ * @example
129
+ * ```typescript
130
+ * import {Controller, ServiceContext} from 'lakutata/com/entrypoint'
131
+ * import {ipcEventOfContext} from 'lakutata/adapter/electron'
132
+ * import {ServiceAction} from 'lakutata/decorator/ctrl'
133
+ * import type {IpcMainInvokeEvent} from 'electron'
134
+ *
135
+ * class WindowController extends Controller {
136
+ * //ipcRenderer.invoke('lakutata:service', {cmd: 'window.url'})
137
+ * @ServiceAction({cmd: 'window.url'})
138
+ * public async url(): Promise<string | undefined> {
139
+ * return ipcEventOfContext<IpcMainInvokeEvent>(this.context as ServiceContext)?.sender.getURL()
140
+ * }
141
+ * }
142
+ * ```
143
+ */
144
+ export declare function ipcEventOfContext<Event extends IPCInvokeEvent = IPCInvokeEvent>(context: ServiceContext): Event | undefined;
145
+ /**
146
+ * Create a service adapter of an entrypoint served over Electron's IPC, in the main process. It needs the optional
147
+ * peer dependency `electron`: without the `ipcMain` option, the entrypoint fails to start outside Electron's main
148
+ * process.
149
+ *
150
+ * A renderer invokes the channel with the action's pattern and input, and optionally its client id:
151
+ * `ipcRenderer.invoke('lakutata:service', {cmd: 'echo', text: 'hi'}, clientId)`. The invocation resolves to
152
+ * `{success, error, payload}` (see `ServiceResponseCodec`): `payload` is the result, or `error` the whole error object
153
+ * when the action failed (no matching action, validation…).
154
+ *
155
+ * Each page is a client, identified by the id it gives (a non-empty string of at most 200 characters), which its
156
+ * requests carry as `ServiceContext.clientId`. A page registers by sending its id on `<channel>:subscribe` (or with
157
+ * any invocation giving it); a page reloaded in the same frame replaces its previous id. The events pushed by
158
+ * `Entrypoint.notify` and `Entrypoint.broadcast` are sent to the page's frame on `<channel>:event` with the event name
159
+ * and its arguments array. A destroyed renderer drops its clients.
160
+ *
161
+ * When a renderer is destroyed, its requests in progress are aborted (their abort signal fires). When the entrypoint
162
+ * stops, the new invocations resolve to an `EntrypointStoppedException` error; once the requests in progress end, the
163
+ * IPC handlers are removed.
164
+ * @param options The adapter options; by default it serves the channel `'lakutata:service'` on Electron's `ipcMain`.
165
+ * @returns The adapter, to give to the `service` option of `buildEntrypoints`.
166
+ * @example
167
+ * ```typescript
168
+ * import {Application} from 'lakutata'
169
+ * import {buildEntrypoints, Controller} from 'lakutata/com/entrypoint'
170
+ * import {ServiceAction} from 'lakutata/decorator/ctrl'
171
+ * import {electronIPCServiceEntrypoint} from 'lakutata/adapter/electron'
172
+ * import type {IpcRenderer, IpcRendererEvent} from 'electron'
173
+ *
174
+ * class EchoController extends Controller {
175
+ * @ServiceAction({cmd: 'echo'})
176
+ * public async echo(input: {text: string}): Promise<string> {
177
+ * return input.text
178
+ * }
179
+ * }
180
+ *
181
+ * //In the main process
182
+ * Application.run({
183
+ * id: 'desktop.app',
184
+ * name: 'Desktop',
185
+ * components: {
186
+ * entrypoint: buildEntrypoints({
187
+ * controllers: [EchoController],
188
+ * service: electronIPCServiceEntrypoint()
189
+ * })
190
+ * }
191
+ * })
192
+ *
193
+ * //In the preload script of a window
194
+ * declare const ipcRenderer: IpcRenderer
195
+ * const clientId: string = crypto.randomUUID()
196
+ * //The events pushed by entrypoint.notify(clientId, 'progress', 50)
197
+ * ipcRenderer.on('lakutata:service:event', (event: IpcRendererEvent, name: string, args: unknown[]): void => console.log(name, ...args))
198
+ * ipcRenderer.send('lakutata:service:subscribe', clientId)
199
+ * //{success: true, error: null, payload: 'hi'}
200
+ * console.log(await ipcRenderer.invoke('lakutata:service', {cmd: 'echo', text: 'hi'}, clientId))
201
+ * ```
202
+ */
203
+ export declare function electronIPCServiceEntrypoint(options?: ElectronIPCServiceEntrypointOptions): EntrypointAdapter<ServiceContext>;
@@ -0,0 +1,172 @@
1
+ import { type Express, type Request, type RequestHandler } from 'express';
2
+ import { type Server, type ServerOptions } from 'node:http';
3
+ import type { Module } from '@lakutata/core';
4
+ import type { EntrypointAdapter } from '../../channel/EntrypointAdapter.js';
5
+ import type { MiddlewareDefinition } from '../../lib/Middleware.js';
6
+ import { HTTPContext } from '../../context/HTTPContext.js';
7
+ import { ExpressResponder } from './Responders.js';
8
+ /**
9
+ * What the `before` hook of {@link expressHTTPEntrypoint} receives besides the express application: the entrypoint's
10
+ * module, the HTTP server (not listening yet) and the routes the actions will occupy.
11
+ */
12
+ export type ExpressHookContext = {
13
+ /**
14
+ * The module owning the entrypoint, to get the application's objects from (`await module.getObject('db')`).
15
+ */
16
+ readonly module: Module;
17
+ /**
18
+ * The HTTP server serving the express application. It does not listen yet when the hook runs; attach other servers
19
+ * to it there (such as a socket.io server, see the `server` option of `socketIOServiceEntrypoint`).
20
+ */
21
+ readonly server: Server;
22
+ /**
23
+ * Each action route mapped to its HTTP methods, in lower case as declared (`'/users/:id'` → `{'get', 'delete'}`).
24
+ */
25
+ readonly routes: Map<string, Set<string>>;
26
+ /**
27
+ * The first segment of each action route (`'/device'`, `'/user'`…). A route starting with a parameter (`/:id`)
28
+ * adds none.
29
+ */
30
+ readonly actionPrefixes: string[];
31
+ /**
32
+ * Tell whether a request path belongs to the actions: it equals one of the action prefixes or starts with one
33
+ * followed by `/`.
34
+ */
35
+ readonly isActionPath: (requestPath: string) => boolean;
36
+ };
37
+ /**
38
+ * The options of {@link expressHTTPEntrypoint}.
39
+ */
40
+ export type ExpressHTTPEntrypointOptions = {
41
+ /**
42
+ * The adapter name, to tell apart several HTTP adapters of one entrypoint.
43
+ */
44
+ name?: string;
45
+ /**
46
+ * The port the server listens on; 0 picks a random free port. The entrypoint fails to start when the port is in use.
47
+ * @default 80
48
+ */
49
+ port?: number;
50
+ /**
51
+ * The host or address the server listens on.
52
+ * @default all the interfaces
53
+ */
54
+ host?: string;
55
+ /**
56
+ * The options of the Node.js HTTP server (`keepAliveTimeout`, `headersTimeout`, `requestTimeout`, in milliseconds…).
57
+ */
58
+ server?: ServerOptions & {
59
+ keepAliveTimeout?: number;
60
+ headersTimeout?: number;
61
+ requestTimeout?: number;
62
+ };
63
+ /**
64
+ * An existing express application to add the action routes to.
65
+ * @default a new express application
66
+ */
67
+ app?: Express;
68
+ /**
69
+ * The JSON and URL-encoded body parsers, with their size limit (bytes, or a text such as `'5mb'`); a larger body is
70
+ * answered with an error (413). `false` installs no parser, leaving the parsing to the application. The parsers are
71
+ * installed after the `before` hook, so the middlewares added there do not see a parsed body.
72
+ * @default {limit: '1mb'}
73
+ */
74
+ body?: false | {
75
+ limit?: string | number;
76
+ };
77
+ /**
78
+ * Build an action's input from a request. The route parameters are always merged over its result.
79
+ * @default the query parameters, then the properties of an object body over them
80
+ */
81
+ input?: (request: Request) => Record<string, unknown>;
82
+ /**
83
+ * How the results and the errors of the actions are written.
84
+ * @default JSONResponder
85
+ */
86
+ respond?: ExpressResponder;
87
+ /**
88
+ * The middlewares of this adapter's actions, run after the entrypoint's global middlewares.
89
+ */
90
+ middlewares?: MiddlewareDefinition[];
91
+ /**
92
+ * Run before the action routes are added, to add the application's own express middlewares and routes (they take
93
+ * precedence over the actions). A failure fails the entrypoint start.
94
+ */
95
+ before?: (app: Express, context: ExpressHookContext) => void | Promise<void>;
96
+ /**
97
+ * The handler of the requests that match no action and whose path is outside the action prefixes, such as the pages
98
+ * of a web application (see {@link staticUI}). The unmatched requests inside the action prefixes, and all of them
99
+ * without a fallback, are answered with a `RouteNotFoundException` (404).
100
+ */
101
+ fallback?: RequestHandler;
102
+ /**
103
+ * Run when the adapter stops, after the server is closed.
104
+ */
105
+ stop?: () => void | Promise<void>;
106
+ /**
107
+ * The interval between the comments keeping the event streams (`EventsResult`) alive through the proxies, in
108
+ * milliseconds.
109
+ * @default 15000
110
+ */
111
+ heartbeat?: number;
112
+ };
113
+ /**
114
+ * Create the HTTP adapter of an entrypoint served by an express application: each HTTP action (`@GET`, `@POST`,
115
+ * `@HTTPAction`…) becomes an express route. It needs the optional peer dependency `express`.
116
+ *
117
+ * An action's input is the request's query and body (see the `input` option) with the route parameters merged over
118
+ * them. Its result is written by the responder (JSON by default, 204 for no result); a `StatusResult` sets the status
119
+ * and the headers, a `FileResult` sends a file, a buffer or a stream (304 when its ETag matches `If-None-Match`), and an
120
+ * `EventsResult` streams Server-Sent Events. An action that writes the response itself (through
121
+ * `HTTPContext.response`) is left alone. The errors are written by the responder with their status (400 for the
122
+ * validation failures, 500 by default).
123
+ *
124
+ * When the client disconnects before the response, the action's abort signal fires and nothing is written. When the
125
+ * entrypoint stops, the server stops accepting connections, the event streams end, and the requests in progress are
126
+ * given up to one second after they settle to send their responses before the remaining connections are closed.
127
+ * @param options The adapter options; by default it listens on port 80 of all the interfaces with a new express
128
+ * application.
129
+ * @returns The adapter, to give to the `http` option of `buildEntrypoints`.
130
+ * @example
131
+ * ```typescript
132
+ * import {Application} from 'lakutata'
133
+ * import {buildEntrypoints, Controller} from 'lakutata/com/entrypoint'
134
+ * import {GET, POST} from 'lakutata/decorator/ctrl'
135
+ * import {expressHTTPEntrypoint, staticUI} from 'lakutata/adapter/express'
136
+ *
137
+ * class UserController extends Controller {
138
+ * //GET /users/1?verbose=true: the route parameter id merged over the query
139
+ * @GET('/users/:id')
140
+ * public async get(input: {id: string, verbose?: string}): Promise<{id: string}> {
141
+ * return {id: input.id}
142
+ * }
143
+ *
144
+ * //POST /users with the JSON body {"name": "Ada"}
145
+ * @POST('/users')
146
+ * public async create(input: {name: string}): Promise<{name: string}> {
147
+ * return {name: input.name}
148
+ * }
149
+ * }
150
+ *
151
+ * Application.run({
152
+ * id: 'web.app',
153
+ * name: 'Web',
154
+ * components: {
155
+ * entrypoint: buildEntrypoints({
156
+ * controllers: [UserController],
157
+ * http: expressHTTPEntrypoint({
158
+ * port: 8080,
159
+ * body: {limit: '5mb'},
160
+ * //The application's own routes, before the actions
161
+ * before: (app): void => {
162
+ * app.get('/health', (request, response): void => void response.send('ok'))
163
+ * },
164
+ * //The pages of the UI built in ./ui/dist, for the paths outside /users
165
+ * fallback: staticUI('./ui/dist')
166
+ * })
167
+ * })
168
+ * }
169
+ * })
170
+ * ```
171
+ */
172
+ export declare function expressHTTPEntrypoint(options?: ExpressHTTPEntrypointOptions): EntrypointAdapter<HTTPContext>;