alepha 0.13.0 → 0.13.2

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 (461) hide show
  1. package/README.md +1 -1
  2. package/dist/api-files/index.d.ts +28 -91
  3. package/dist/api-files/index.js +10 -755
  4. package/dist/api-files/index.js.map +1 -1
  5. package/dist/api-jobs/index.d.ts +67 -67
  6. package/dist/api-jobs/index.js +13 -13
  7. package/dist/api-jobs/index.js.map +1 -1
  8. package/dist/api-notifications/index.d.ts +129 -146
  9. package/dist/api-notifications/index.js +17 -39
  10. package/dist/api-notifications/index.js.map +1 -1
  11. package/dist/api-parameters/index.d.ts +21 -22
  12. package/dist/api-parameters/index.js +22 -22
  13. package/dist/api-parameters/index.js.map +1 -1
  14. package/dist/api-users/index.d.ts +224 -2001
  15. package/dist/api-users/index.js +914 -4787
  16. package/dist/api-users/index.js.map +1 -1
  17. package/dist/api-verifications/index.d.ts +96 -96
  18. package/dist/batch/index.d.ts +13 -13
  19. package/dist/batch/index.js +8 -8
  20. package/dist/batch/index.js.map +1 -1
  21. package/dist/bucket/index.d.ts +14 -14
  22. package/dist/bucket/index.js +12 -12
  23. package/dist/bucket/index.js.map +1 -1
  24. package/dist/cache/index.d.ts +11 -11
  25. package/dist/cache/index.js +9 -9
  26. package/dist/cache/index.js.map +1 -1
  27. package/dist/cli/{dist-Sz2EXvQX.cjs → dist-Dl9Vl7Ur.js} +17 -13
  28. package/dist/cli/{dist-BBPjuQ56.js.map → dist-Dl9Vl7Ur.js.map} +1 -1
  29. package/dist/cli/index.d.ts +31 -37
  30. package/dist/cli/index.js +152 -83
  31. package/dist/cli/index.js.map +1 -1
  32. package/dist/command/index.d.ts +19 -19
  33. package/dist/command/index.js +25 -25
  34. package/dist/command/index.js.map +1 -1
  35. package/dist/core/index.browser.js +218 -218
  36. package/dist/core/index.browser.js.map +1 -1
  37. package/dist/core/index.d.ts +232 -232
  38. package/dist/core/index.js +218 -218
  39. package/dist/core/index.js.map +1 -1
  40. package/dist/core/{index.cjs → index.native.js} +304 -455
  41. package/dist/core/index.native.js.map +1 -0
  42. package/dist/datetime/index.d.ts +9 -9
  43. package/dist/datetime/index.js +7 -7
  44. package/dist/datetime/index.js.map +1 -1
  45. package/dist/email/index.d.ts +16 -16
  46. package/dist/email/index.js +80 -82
  47. package/dist/email/index.js.map +1 -1
  48. package/dist/file/index.js +1 -1
  49. package/dist/file/index.js.map +1 -1
  50. package/dist/lock/index.d.ts +9 -9
  51. package/dist/lock/index.js +8 -8
  52. package/dist/lock/index.js.map +1 -1
  53. package/dist/lock-redis/index.js +3 -66
  54. package/dist/lock-redis/index.js.map +1 -1
  55. package/dist/logger/index.d.ts +5 -5
  56. package/dist/logger/index.js +8 -8
  57. package/dist/logger/index.js.map +1 -1
  58. package/dist/orm/index.browser.js +114 -114
  59. package/dist/orm/index.browser.js.map +1 -1
  60. package/dist/orm/index.d.ts +219 -219
  61. package/dist/orm/index.js +46 -46
  62. package/dist/orm/index.js.map +1 -1
  63. package/dist/queue/index.d.ts +25 -25
  64. package/dist/queue/index.js +20 -20
  65. package/dist/queue/index.js.map +1 -1
  66. package/dist/queue-redis/index.d.ts +2 -2
  67. package/dist/redis/index.d.ts +10 -10
  68. package/dist/retry/index.d.ts +20 -20
  69. package/dist/retry/index.js +9 -9
  70. package/dist/retry/index.js.map +1 -1
  71. package/dist/scheduler/index.d.ts +12 -12
  72. package/dist/scheduler/index.js +9 -9
  73. package/dist/scheduler/index.js.map +1 -1
  74. package/dist/security/index.d.ts +53 -53
  75. package/dist/security/index.js +32 -32
  76. package/dist/security/index.js.map +1 -1
  77. package/dist/server/index.browser.js +1 -1
  78. package/dist/server/index.browser.js.map +1 -1
  79. package/dist/server/index.d.ts +101 -101
  80. package/dist/server/index.js +17 -17
  81. package/dist/server/index.js.map +1 -1
  82. package/dist/server-auth/index.browser.js +4 -982
  83. package/dist/server-auth/index.browser.js.map +1 -1
  84. package/dist/server-auth/index.d.ts +204 -785
  85. package/dist/server-auth/index.js +47 -1239
  86. package/dist/server-auth/index.js.map +1 -1
  87. package/dist/server-cache/index.d.ts +10 -10
  88. package/dist/server-cache/index.js +2 -2
  89. package/dist/server-cache/index.js.map +1 -1
  90. package/dist/server-compress/index.d.ts +4 -4
  91. package/dist/server-compress/index.js +1 -1
  92. package/dist/server-compress/index.js.map +1 -1
  93. package/dist/server-cookies/index.browser.js +8 -8
  94. package/dist/server-cookies/index.browser.js.map +1 -1
  95. package/dist/server-cookies/index.d.ts +17 -17
  96. package/dist/server-cookies/index.js +10 -10
  97. package/dist/server-cookies/index.js.map +1 -1
  98. package/dist/server-cors/index.d.ts +17 -17
  99. package/dist/server-cors/index.js +9 -9
  100. package/dist/server-cors/index.js.map +1 -1
  101. package/dist/server-health/index.d.ts +2 -2
  102. package/dist/server-helmet/index.d.ts +1 -1
  103. package/dist/server-links/index.browser.js +12 -12
  104. package/dist/server-links/index.browser.js.map +1 -1
  105. package/dist/server-links/index.d.ts +59 -251
  106. package/dist/server-links/index.js +23 -502
  107. package/dist/server-links/index.js.map +1 -1
  108. package/dist/server-metrics/index.d.ts +4 -4
  109. package/dist/server-metrics/index.js +170 -174
  110. package/dist/server-metrics/index.js.map +1 -1
  111. package/dist/server-multipart/index.d.ts +2 -2
  112. package/dist/server-proxy/index.d.ts +12 -12
  113. package/dist/server-proxy/index.js +10 -10
  114. package/dist/server-proxy/index.js.map +1 -1
  115. package/dist/server-rate-limit/index.d.ts +22 -22
  116. package/dist/server-rate-limit/index.js +12 -12
  117. package/dist/server-rate-limit/index.js.map +1 -1
  118. package/dist/server-security/index.d.ts +24 -24
  119. package/dist/server-security/index.js +15 -15
  120. package/dist/server-security/index.js.map +1 -1
  121. package/dist/server-static/index.d.ts +14 -14
  122. package/dist/server-static/index.js +8 -8
  123. package/dist/server-static/index.js.map +1 -1
  124. package/dist/server-swagger/index.d.ts +25 -184
  125. package/dist/server-swagger/index.js +21 -724
  126. package/dist/server-swagger/index.js.map +1 -1
  127. package/dist/sms/index.d.ts +14 -14
  128. package/dist/sms/index.js +9 -9
  129. package/dist/sms/index.js.map +1 -1
  130. package/dist/thread/index.d.ts +11 -11
  131. package/dist/thread/index.js +17 -17
  132. package/dist/thread/index.js.map +1 -1
  133. package/dist/topic/index.d.ts +26 -26
  134. package/dist/topic/index.js +16 -16
  135. package/dist/topic/index.js.map +1 -1
  136. package/dist/topic-redis/index.d.ts +1 -1
  137. package/dist/vite/index.d.ts +3 -3
  138. package/dist/vite/index.js +12 -13
  139. package/dist/vite/index.js.map +1 -1
  140. package/dist/websocket/index.browser.js +11 -11
  141. package/dist/websocket/index.browser.js.map +1 -1
  142. package/dist/websocket/index.d.ts +51 -51
  143. package/dist/websocket/index.js +13 -13
  144. package/dist/websocket/index.js.map +1 -1
  145. package/package.json +62 -52
  146. package/src/api-files/services/FileService.ts +5 -7
  147. package/src/api-jobs/index.ts +1 -1
  148. package/src/api-jobs/{descriptors → primitives}/$job.ts +8 -8
  149. package/src/api-jobs/providers/JobProvider.ts +9 -9
  150. package/src/api-jobs/services/JobService.ts +5 -5
  151. package/src/api-notifications/index.ts +5 -15
  152. package/src/api-notifications/{descriptors → primitives}/$notification.ts +10 -10
  153. package/src/api-notifications/services/NotificationSenderService.ts +3 -3
  154. package/src/api-parameters/index.ts +1 -1
  155. package/src/api-parameters/{descriptors → primitives}/$config.ts +7 -12
  156. package/src/api-users/index.ts +1 -1
  157. package/src/api-users/{descriptors → primitives}/$userRealm.ts +8 -8
  158. package/src/api-users/providers/UserRealmProvider.ts +1 -1
  159. package/src/batch/index.ts +3 -3
  160. package/src/batch/{descriptors → primitives}/$batch.ts +13 -16
  161. package/src/bucket/index.ts +8 -8
  162. package/src/bucket/{descriptors → primitives}/$bucket.ts +8 -8
  163. package/src/bucket/providers/LocalFileStorageProvider.ts +3 -3
  164. package/src/cache/index.ts +4 -4
  165. package/src/cache/{descriptors → primitives}/$cache.ts +15 -15
  166. package/src/cli/apps/AlephaPackageBuilderCli.ts +30 -3
  167. package/src/cli/assets/appRouterTs.ts +9 -0
  168. package/src/cli/assets/indexHtml.ts +2 -1
  169. package/src/cli/assets/mainBrowserTs.ts +10 -0
  170. package/src/cli/commands/CoreCommands.ts +6 -5
  171. package/src/cli/commands/DrizzleCommands.ts +69 -61
  172. package/src/cli/commands/VerifyCommands.ts +2 -2
  173. package/src/cli/commands/ViteCommands.ts +6 -1
  174. package/src/cli/services/ProjectUtils.ts +78 -41
  175. package/src/command/index.ts +5 -5
  176. package/src/command/{descriptors → primitives}/$command.ts +9 -12
  177. package/src/command/providers/CliProvider.ts +10 -10
  178. package/src/core/Alepha.ts +30 -33
  179. package/src/core/constants/KIND.ts +1 -1
  180. package/src/core/constants/OPTIONS.ts +1 -1
  181. package/src/core/helpers/{descriptor.ts → primitive.ts} +18 -18
  182. package/src/core/helpers/ref.ts +1 -1
  183. package/src/core/index.shared.ts +8 -8
  184. package/src/core/{descriptors → primitives}/$context.ts +5 -5
  185. package/src/core/{descriptors → primitives}/$hook.ts +4 -4
  186. package/src/core/{descriptors → primitives}/$inject.ts +2 -2
  187. package/src/core/{descriptors → primitives}/$module.ts +9 -9
  188. package/src/core/{descriptors → primitives}/$use.ts +2 -2
  189. package/src/core/providers/CodecManager.ts +1 -1
  190. package/src/core/providers/JsonSchemaCodec.ts +1 -1
  191. package/src/core/providers/StateManager.ts +2 -2
  192. package/src/datetime/index.ts +3 -3
  193. package/src/datetime/{descriptors → primitives}/$interval.ts +6 -6
  194. package/src/email/index.ts +4 -4
  195. package/src/email/{descriptors → primitives}/$email.ts +8 -8
  196. package/src/file/index.ts +1 -1
  197. package/src/lock/index.ts +3 -3
  198. package/src/lock/{descriptors → primitives}/$lock.ts +10 -10
  199. package/src/logger/index.ts +8 -8
  200. package/src/logger/{descriptors → primitives}/$logger.ts +2 -2
  201. package/src/logger/services/Logger.ts +1 -1
  202. package/src/orm/constants/PG_SYMBOLS.ts +2 -2
  203. package/src/orm/index.browser.ts +2 -2
  204. package/src/orm/index.ts +8 -8
  205. package/src/orm/{descriptors → primitives}/$entity.ts +11 -11
  206. package/src/orm/{descriptors → primitives}/$repository.ts +2 -2
  207. package/src/orm/{descriptors → primitives}/$sequence.ts +8 -8
  208. package/src/orm/{descriptors → primitives}/$transaction.ts +4 -4
  209. package/src/orm/providers/DrizzleKitProvider.ts +1 -1
  210. package/src/orm/providers/PostgresTypeProvider.ts +3 -3
  211. package/src/orm/providers/RepositoryProvider.ts +4 -4
  212. package/src/orm/providers/drivers/DatabaseProvider.ts +7 -7
  213. package/src/orm/services/ModelBuilder.ts +9 -9
  214. package/src/orm/services/PgRelationManager.ts +2 -2
  215. package/src/orm/services/PostgresModelBuilder.ts +5 -5
  216. package/src/orm/services/Repository.ts +7 -7
  217. package/src/orm/services/SqliteModelBuilder.ts +5 -5
  218. package/src/queue/index.ts +7 -7
  219. package/src/queue/{descriptors → primitives}/$consumer.ts +15 -15
  220. package/src/queue/{descriptors → primitives}/$queue.ts +12 -12
  221. package/src/queue/providers/WorkerProvider.ts +7 -7
  222. package/src/retry/index.ts +3 -3
  223. package/src/retry/{descriptors → primitives}/$retry.ts +19 -17
  224. package/src/scheduler/index.ts +3 -3
  225. package/src/scheduler/{descriptors → primitives}/$scheduler.ts +9 -9
  226. package/src/scheduler/providers/CronProvider.ts +1 -1
  227. package/src/security/index.ts +9 -9
  228. package/src/security/{descriptors → primitives}/$permission.ts +7 -7
  229. package/src/security/{descriptors → primitives}/$realm.ts +6 -12
  230. package/src/security/{descriptors → primitives}/$role.ts +12 -12
  231. package/src/security/{descriptors → primitives}/$serviceAccount.ts +8 -8
  232. package/src/server/index.browser.ts +1 -1
  233. package/src/server/index.ts +14 -14
  234. package/src/server/{descriptors → primitives}/$action.ts +13 -13
  235. package/src/server/{descriptors → primitives}/$route.ts +9 -9
  236. package/src/server/providers/NodeHttpServerProvider.ts +2 -2
  237. package/src/server/services/HttpClient.ts +1 -1
  238. package/src/server-auth/index.browser.ts +1 -1
  239. package/src/server-auth/index.ts +6 -6
  240. package/src/server-auth/{descriptors → primitives}/$auth.ts +10 -10
  241. package/src/server-auth/{descriptors → primitives}/$authCredentials.ts +4 -4
  242. package/src/server-auth/{descriptors → primitives}/$authGithub.ts +4 -4
  243. package/src/server-auth/{descriptors → primitives}/$authGoogle.ts +4 -4
  244. package/src/server-auth/providers/ServerAuthProvider.ts +4 -4
  245. package/src/server-cache/providers/ServerCacheProvider.ts +7 -7
  246. package/src/server-compress/providers/ServerCompressProvider.ts +3 -3
  247. package/src/server-cookies/index.browser.ts +2 -2
  248. package/src/server-cookies/index.ts +5 -5
  249. package/src/server-cookies/{descriptors → primitives}/$cookie.browser.ts +12 -12
  250. package/src/server-cookies/{descriptors → primitives}/$cookie.ts +13 -13
  251. package/src/server-cookies/providers/ServerCookiesProvider.ts +4 -4
  252. package/src/server-cookies/services/CookieParser.ts +1 -1
  253. package/src/server-cors/index.ts +3 -3
  254. package/src/server-cors/{descriptors → primitives}/$cors.ts +11 -13
  255. package/src/server-cors/providers/ServerCorsProvider.ts +5 -5
  256. package/src/server-links/index.browser.ts +5 -5
  257. package/src/server-links/index.ts +9 -9
  258. package/src/server-links/{descriptors → primitives}/$remote.ts +11 -11
  259. package/src/server-links/providers/LinkProvider.ts +7 -7
  260. package/src/server-links/providers/{RemoteDescriptorProvider.ts → RemotePrimitiveProvider.ts} +6 -6
  261. package/src/server-links/providers/ServerLinksProvider.ts +3 -3
  262. package/src/server-proxy/index.ts +3 -3
  263. package/src/server-proxy/{descriptors → primitives}/$proxy.ts +8 -8
  264. package/src/server-proxy/providers/ServerProxyProvider.ts +4 -4
  265. package/src/server-rate-limit/index.ts +6 -6
  266. package/src/server-rate-limit/{descriptors → primitives}/$rateLimit.ts +13 -13
  267. package/src/server-rate-limit/providers/ServerRateLimitProvider.ts +5 -5
  268. package/src/server-security/index.ts +3 -3
  269. package/src/server-security/{descriptors → primitives}/$basicAuth.ts +13 -13
  270. package/src/server-security/providers/ServerBasicAuthProvider.ts +5 -5
  271. package/src/server-security/providers/ServerSecurityProvider.ts +4 -4
  272. package/src/server-static/index.ts +3 -3
  273. package/src/server-static/{descriptors → primitives}/$serve.ts +8 -10
  274. package/src/server-static/providers/ServerStaticProvider.ts +6 -6
  275. package/src/server-swagger/index.ts +5 -5
  276. package/src/server-swagger/{descriptors → primitives}/$swagger.ts +9 -9
  277. package/src/server-swagger/providers/ServerSwaggerProvider.ts +11 -10
  278. package/src/sms/index.ts +4 -4
  279. package/src/sms/{descriptors → primitives}/$sms.ts +8 -8
  280. package/src/thread/index.ts +3 -3
  281. package/src/thread/{descriptors → primitives}/$thread.ts +13 -13
  282. package/src/thread/providers/ThreadProvider.ts +7 -9
  283. package/src/topic/index.ts +5 -5
  284. package/src/topic/{descriptors → primitives}/$subscriber.ts +14 -14
  285. package/src/topic/{descriptors → primitives}/$topic.ts +10 -10
  286. package/src/topic/providers/TopicProvider.ts +4 -4
  287. package/src/vite/helpers/boot.ts +3 -3
  288. package/src/vite/tasks/copyAssets.ts +1 -1
  289. package/src/vite/tasks/generateSitemap.ts +3 -3
  290. package/src/vite/tasks/prerenderPages.ts +2 -2
  291. package/src/vite/tasks/runAlepha.ts +2 -2
  292. package/src/websocket/index.browser.ts +3 -3
  293. package/src/websocket/index.shared.ts +2 -2
  294. package/src/websocket/index.ts +4 -4
  295. package/src/websocket/interfaces/WebSocketInterfaces.ts +3 -3
  296. package/src/websocket/{descriptors → primitives}/$channel.ts +10 -10
  297. package/src/websocket/{descriptors → primitives}/$websocket.ts +8 -8
  298. package/src/websocket/providers/NodeWebSocketServerProvider.ts +7 -7
  299. package/src/websocket/providers/WebSocketServerProvider.ts +3 -3
  300. package/src/websocket/services/WebSocketClient.ts +5 -5
  301. package/dist/api-files/index.cjs +0 -1293
  302. package/dist/api-files/index.cjs.map +0 -1
  303. package/dist/api-files/index.d.cts +0 -829
  304. package/dist/api-jobs/index.cjs +0 -274
  305. package/dist/api-jobs/index.cjs.map +0 -1
  306. package/dist/api-jobs/index.d.cts +0 -654
  307. package/dist/api-notifications/index.cjs +0 -380
  308. package/dist/api-notifications/index.cjs.map +0 -1
  309. package/dist/api-notifications/index.d.cts +0 -289
  310. package/dist/api-parameters/index.cjs +0 -66
  311. package/dist/api-parameters/index.cjs.map +0 -1
  312. package/dist/api-parameters/index.d.cts +0 -84
  313. package/dist/api-users/index.cjs +0 -6009
  314. package/dist/api-users/index.cjs.map +0 -1
  315. package/dist/api-users/index.d.cts +0 -4740
  316. package/dist/api-verifications/index.cjs +0 -407
  317. package/dist/api-verifications/index.cjs.map +0 -1
  318. package/dist/api-verifications/index.d.cts +0 -207
  319. package/dist/batch/index.cjs +0 -408
  320. package/dist/batch/index.cjs.map +0 -1
  321. package/dist/batch/index.d.cts +0 -330
  322. package/dist/bin/index.cjs +0 -17
  323. package/dist/bin/index.cjs.map +0 -1
  324. package/dist/bin/index.d.cts +0 -1
  325. package/dist/bucket/index.cjs +0 -303
  326. package/dist/bucket/index.cjs.map +0 -1
  327. package/dist/bucket/index.d.cts +0 -355
  328. package/dist/cache/index.cjs +0 -241
  329. package/dist/cache/index.cjs.map +0 -1
  330. package/dist/cache/index.d.cts +0 -202
  331. package/dist/cache-redis/index.cjs +0 -84
  332. package/dist/cache-redis/index.cjs.map +0 -1
  333. package/dist/cache-redis/index.d.cts +0 -40
  334. package/dist/cli/chunk-DSlc6foC.cjs +0 -43
  335. package/dist/cli/dist-BBPjuQ56.js +0 -2778
  336. package/dist/cli/dist-Sz2EXvQX.cjs.map +0 -1
  337. package/dist/cli/index.cjs +0 -1241
  338. package/dist/cli/index.cjs.map +0 -1
  339. package/dist/cli/index.d.cts +0 -422
  340. package/dist/command/index.cjs +0 -693
  341. package/dist/command/index.cjs.map +0 -1
  342. package/dist/command/index.d.cts +0 -340
  343. package/dist/core/index.cjs.map +0 -1
  344. package/dist/core/index.d.cts +0 -1927
  345. package/dist/datetime/index.cjs +0 -318
  346. package/dist/datetime/index.cjs.map +0 -1
  347. package/dist/datetime/index.d.cts +0 -145
  348. package/dist/email/index.cjs +0 -10874
  349. package/dist/email/index.cjs.map +0 -1
  350. package/dist/email/index.d.cts +0 -186
  351. package/dist/fake/index.cjs +0 -34641
  352. package/dist/fake/index.cjs.map +0 -1
  353. package/dist/fake/index.d.cts +0 -74
  354. package/dist/file/index.cjs +0 -1212
  355. package/dist/file/index.cjs.map +0 -1
  356. package/dist/file/index.d.cts +0 -698
  357. package/dist/lock/index.cjs +0 -226
  358. package/dist/lock/index.cjs.map +0 -1
  359. package/dist/lock/index.d.cts +0 -361
  360. package/dist/lock-redis/index.cjs +0 -113
  361. package/dist/lock-redis/index.cjs.map +0 -1
  362. package/dist/lock-redis/index.d.cts +0 -24
  363. package/dist/logger/index.cjs +0 -521
  364. package/dist/logger/index.cjs.map +0 -1
  365. package/dist/logger/index.d.cts +0 -281
  366. package/dist/orm/index.cjs +0 -2986
  367. package/dist/orm/index.cjs.map +0 -1
  368. package/dist/orm/index.d.cts +0 -2213
  369. package/dist/queue/index.cjs +0 -1044
  370. package/dist/queue/index.cjs.map +0 -1
  371. package/dist/queue/index.d.cts +0 -1265
  372. package/dist/queue-redis/index.cjs +0 -873
  373. package/dist/queue-redis/index.cjs.map +0 -1
  374. package/dist/queue-redis/index.d.cts +0 -82
  375. package/dist/redis/index.cjs +0 -153
  376. package/dist/redis/index.cjs.map +0 -1
  377. package/dist/redis/index.d.cts +0 -82
  378. package/dist/retry/index.cjs +0 -146
  379. package/dist/retry/index.cjs.map +0 -1
  380. package/dist/retry/index.d.cts +0 -172
  381. package/dist/router/index.cjs +0 -111
  382. package/dist/router/index.cjs.map +0 -1
  383. package/dist/router/index.d.cts +0 -46
  384. package/dist/scheduler/index.cjs +0 -576
  385. package/dist/scheduler/index.cjs.map +0 -1
  386. package/dist/scheduler/index.d.cts +0 -145
  387. package/dist/security/index.cjs +0 -2402
  388. package/dist/security/index.cjs.map +0 -1
  389. package/dist/security/index.d.cts +0 -598
  390. package/dist/server/index.cjs +0 -1680
  391. package/dist/server/index.cjs.map +0 -1
  392. package/dist/server/index.d.cts +0 -810
  393. package/dist/server-auth/index.cjs +0 -3146
  394. package/dist/server-auth/index.cjs.map +0 -1
  395. package/dist/server-auth/index.d.cts +0 -1164
  396. package/dist/server-cache/index.cjs +0 -252
  397. package/dist/server-cache/index.cjs.map +0 -1
  398. package/dist/server-cache/index.d.cts +0 -164
  399. package/dist/server-compress/index.cjs +0 -141
  400. package/dist/server-compress/index.cjs.map +0 -1
  401. package/dist/server-compress/index.d.cts +0 -38
  402. package/dist/server-cookies/index.cjs +0 -234
  403. package/dist/server-cookies/index.cjs.map +0 -1
  404. package/dist/server-cookies/index.d.cts +0 -144
  405. package/dist/server-cors/index.cjs +0 -201
  406. package/dist/server-cors/index.cjs.map +0 -1
  407. package/dist/server-cors/index.d.cts +0 -140
  408. package/dist/server-health/index.cjs +0 -62
  409. package/dist/server-health/index.cjs.map +0 -1
  410. package/dist/server-health/index.d.cts +0 -58
  411. package/dist/server-helmet/index.cjs +0 -131
  412. package/dist/server-helmet/index.cjs.map +0 -1
  413. package/dist/server-helmet/index.d.cts +0 -97
  414. package/dist/server-links/index.cjs +0 -992
  415. package/dist/server-links/index.cjs.map +0 -1
  416. package/dist/server-links/index.d.cts +0 -513
  417. package/dist/server-metrics/index.cjs +0 -4535
  418. package/dist/server-metrics/index.cjs.map +0 -1
  419. package/dist/server-metrics/index.d.cts +0 -35
  420. package/dist/server-multipart/index.cjs +0 -237
  421. package/dist/server-multipart/index.cjs.map +0 -1
  422. package/dist/server-multipart/index.d.cts +0 -50
  423. package/dist/server-proxy/index.cjs +0 -186
  424. package/dist/server-proxy/index.cjs.map +0 -1
  425. package/dist/server-proxy/index.d.cts +0 -234
  426. package/dist/server-rate-limit/index.cjs +0 -241
  427. package/dist/server-rate-limit/index.cjs.map +0 -1
  428. package/dist/server-rate-limit/index.d.cts +0 -183
  429. package/dist/server-security/index.cjs +0 -316
  430. package/dist/server-security/index.cjs.map +0 -1
  431. package/dist/server-security/index.d.cts +0 -173
  432. package/dist/server-static/index.cjs +0 -170
  433. package/dist/server-static/index.cjs.map +0 -1
  434. package/dist/server-static/index.d.cts +0 -121
  435. package/dist/server-swagger/index.cjs +0 -1021
  436. package/dist/server-swagger/index.cjs.map +0 -1
  437. package/dist/server-swagger/index.d.cts +0 -382
  438. package/dist/sms/index.cjs +0 -221
  439. package/dist/sms/index.cjs.map +0 -1
  440. package/dist/sms/index.d.cts +0 -130
  441. package/dist/thread/index.cjs +0 -350
  442. package/dist/thread/index.cjs.map +0 -1
  443. package/dist/thread/index.d.cts +0 -260
  444. package/dist/topic/index.cjs +0 -282
  445. package/dist/topic/index.cjs.map +0 -1
  446. package/dist/topic/index.d.cts +0 -523
  447. package/dist/topic-redis/index.cjs +0 -71
  448. package/dist/topic-redis/index.cjs.map +0 -1
  449. package/dist/topic-redis/index.d.cts +0 -42
  450. package/dist/vite/index.cjs +0 -1077
  451. package/dist/vite/index.cjs.map +0 -1
  452. package/dist/vite/index.d.cts +0 -542
  453. package/dist/websocket/index.cjs +0 -1117
  454. package/dist/websocket/index.cjs.map +0 -1
  455. package/dist/websocket/index.d.cts +0 -861
  456. package/src/api-notifications/providers/MemorySmsProvider.ts +0 -20
  457. package/src/api-notifications/providers/SmsProvider.ts +0 -8
  458. /package/src/core/{descriptors → primitives}/$atom.ts +0 -0
  459. /package/src/core/{descriptors → primitives}/$env.ts +0 -0
  460. /package/src/server-auth/{descriptors → primitives}/$authApple.ts +0 -0
  461. /package/src/server-links/{descriptors → primitives}/$client.ts +0 -0
@@ -1,992 +0,0 @@
1
- let alepha = require("alepha");
2
- let alepha_security = require("alepha/security");
3
- let alepha_server = require("alepha/server");
4
- let node_crypto = require("node:crypto");
5
- let alepha_logger = require("alepha/logger");
6
- let alepha_retry = require("alepha/retry");
7
- let node_stream_web = require("node:stream/web");
8
-
9
- //#region src/server-security/providers/ServerBasicAuthProvider.ts
10
- var ServerBasicAuthProvider = class {
11
- alepha = (0, alepha.$inject)(alepha.Alepha);
12
- log = (0, alepha_logger.$logger)();
13
- routerProvider = (0, alepha.$inject)(alepha_server.ServerRouterProvider);
14
- realm = "Secure Area";
15
- /**
16
- * Registered basic auth descriptors with their configurations
17
- */
18
- registeredAuths = [];
19
- /**
20
- * Register a basic auth configuration (called by descriptors)
21
- */
22
- registerAuth(config) {
23
- this.registeredAuths.push(config);
24
- }
25
- onStart = (0, alepha.$hook)({
26
- on: "start",
27
- handler: async () => {
28
- for (const auth of this.registeredAuths) if (auth.paths) for (const pattern of auth.paths) {
29
- const matchedRoutes = this.routerProvider.getRoutes(pattern);
30
- for (const route of matchedRoutes) route.secure = { basic: {
31
- username: auth.username,
32
- password: auth.password
33
- } };
34
- }
35
- if (this.registeredAuths.length > 0) this.log.info(`Initialized with ${this.registeredAuths.length} registered basic-auth configurations.`);
36
- }
37
- });
38
- /**
39
- * Hook into server:onRequest to check basic auth
40
- */
41
- onRequest = (0, alepha.$hook)({
42
- on: "server:onRequest",
43
- handler: async ({ route, request }) => {
44
- const routeAuth = route.secure;
45
- if (typeof routeAuth === "object" && "basic" in routeAuth && routeAuth.basic) this.checkAuth(request, routeAuth.basic);
46
- }
47
- });
48
- /**
49
- * Hook into action:onRequest to check basic auth for actions
50
- */
51
- onActionRequest = (0, alepha.$hook)({
52
- on: "action:onRequest",
53
- handler: async ({ action, request }) => {
54
- const routeAuth = action.route.secure;
55
- if (isBasicAuth(routeAuth)) this.checkAuth(request, routeAuth.basic);
56
- }
57
- });
58
- /**
59
- * Check basic authentication
60
- */
61
- checkAuth(request, options) {
62
- const authHeader = request.headers?.authorization;
63
- if (!authHeader || !authHeader.startsWith("Basic ")) {
64
- this.sendAuthRequired(request);
65
- throw new alepha_server.HttpError({
66
- status: 401,
67
- message: "Authentication required"
68
- });
69
- }
70
- const base64Credentials = authHeader.slice(6);
71
- const credentials = Buffer.from(base64Credentials, "base64").toString("utf-8");
72
- const colonIndex = credentials.indexOf(":");
73
- const username = colonIndex !== -1 ? credentials.slice(0, colonIndex) : credentials;
74
- const password = colonIndex !== -1 ? credentials.slice(colonIndex + 1) : "";
75
- if (!this.timingSafeCredentialCheck(username, password, options.username, options.password)) {
76
- this.sendAuthRequired(request);
77
- this.log.warn(`Failed basic auth attempt for user`, { username });
78
- throw new alepha_server.HttpError({
79
- status: 401,
80
- message: "Invalid credentials"
81
- });
82
- }
83
- }
84
- /**
85
- * Performs a timing-safe comparison of credentials to prevent timing attacks.
86
- * Always compares both username and password to avoid leaking which one is wrong.
87
- */
88
- timingSafeCredentialCheck(inputUsername, inputPassword, expectedUsername, expectedPassword) {
89
- const inputUserBuf = Buffer.from(inputUsername, "utf-8");
90
- const expectedUserBuf = Buffer.from(expectedUsername, "utf-8");
91
- const inputPassBuf = Buffer.from(inputPassword, "utf-8");
92
- const expectedPassBuf = Buffer.from(expectedPassword, "utf-8");
93
- return (this.safeCompare(inputUserBuf, expectedUserBuf) & this.safeCompare(inputPassBuf, expectedPassBuf)) === 1;
94
- }
95
- /**
96
- * Compares two buffers in constant time, handling different lengths safely.
97
- * Returns 1 if equal, 0 if not equal.
98
- */
99
- safeCompare(input, expected) {
100
- if (input.length !== expected.length) {
101
- (0, node_crypto.timingSafeEqual)(input, input);
102
- return 0;
103
- }
104
- return (0, node_crypto.timingSafeEqual)(input, expected) ? 1 : 0;
105
- }
106
- /**
107
- * Send WWW-Authenticate header
108
- */
109
- sendAuthRequired(request) {
110
- request.reply.setHeader("WWW-Authenticate", `Basic realm="${this.realm}"`);
111
- }
112
- };
113
- const isBasicAuth = (value) => {
114
- return typeof value === "object" && !!value && "basic" in value && !!value.basic;
115
- };
116
-
117
- //#endregion
118
- //#region src/server-security/descriptors/$basicAuth.ts
119
- /**
120
- * Declares HTTP Basic Authentication for server routes.
121
- * This descriptor provides methods to protect routes with username/password authentication.
122
- */
123
- const $basicAuth = (options) => {
124
- return (0, alepha.createDescriptor)(BasicAuthDescriptor, options);
125
- };
126
- var BasicAuthDescriptor = class extends alepha.Descriptor {
127
- serverBasicAuthProvider = (0, alepha.$inject)(ServerBasicAuthProvider);
128
- get name() {
129
- return this.options.name ?? `${this.config.propertyKey}`;
130
- }
131
- onInit() {
132
- this.serverBasicAuthProvider.registerAuth(this.options);
133
- }
134
- /**
135
- * Checks basic auth for the given request using this descriptor's configuration.
136
- */
137
- check(request, options) {
138
- const mergedOptions = {
139
- ...this.options,
140
- ...options
141
- };
142
- this.serverBasicAuthProvider.checkAuth(request, mergedOptions);
143
- }
144
- };
145
- $basicAuth[alepha.KIND] = BasicAuthDescriptor;
146
-
147
- //#endregion
148
- //#region src/server-security/providers/ServerSecurityProvider.ts
149
- var ServerSecurityProvider = class {
150
- log = (0, alepha_logger.$logger)();
151
- securityProvider = (0, alepha.$inject)(alepha_security.SecurityProvider);
152
- jwtProvider = (0, alepha.$inject)(alepha_security.JwtProvider);
153
- alepha = (0, alepha.$inject)(alepha.Alepha);
154
- onConfigure = (0, alepha.$hook)({
155
- on: "configure",
156
- handler: async () => {
157
- for (const action of this.alepha.descriptors(alepha_server.$action)) {
158
- if (action.options.disabled || action.options.secure === false || this.securityProvider.getRealms().length === 0) continue;
159
- if (typeof action.options.secure !== "object") this.securityProvider.createPermission({
160
- name: action.name,
161
- group: action.group,
162
- method: action.route.method,
163
- path: action.route.path
164
- });
165
- }
166
- }
167
- });
168
- onActionRequest = (0, alepha.$hook)({
169
- on: "action:onRequest",
170
- handler: async ({ action, request, options }) => {
171
- if (action.options.secure === false && !options.user) {
172
- this.log.trace("Skipping security check for route");
173
- return;
174
- }
175
- if (isBasicAuth(action.route.secure)) return;
176
- const permission = this.securityProvider.getPermissions().find((it) => it.path === action.route.path && it.method === action.route.method);
177
- try {
178
- request.user = this.createUserFromLocalFunctionContext(options, permission);
179
- const route = action.route;
180
- if (typeof route.secure === "object") this.check(request.user, route.secure);
181
- this.alepha.state.set("alepha.server.request.user", this.alepha.codec.decode(alepha_security.userAccountInfoSchema, request.user));
182
- } catch (error) {
183
- if (action.options.secure || permission) throw error;
184
- this.log.trace("Skipping security check for action");
185
- }
186
- }
187
- });
188
- onRequest = (0, alepha.$hook)({
189
- on: "server:onRequest",
190
- priority: "last",
191
- handler: async ({ request, route }) => {
192
- if (route.secure === false) {
193
- this.log.trace("Skipping security check for route - explicitly disabled");
194
- return;
195
- }
196
- if (isBasicAuth(route.secure)) return;
197
- const permission = this.securityProvider.getPermissions().find((it) => it.path === route.path && it.method === route.method);
198
- if (!request.headers.authorization && !route.secure && !permission) {
199
- this.log.trace("Skipping security check for route - no authorization header and not secure");
200
- return;
201
- }
202
- try {
203
- request.user = await this.securityProvider.createUserFromToken(request.headers.authorization, { permission });
204
- if (typeof route.secure === "object") this.check(request.user, route.secure);
205
- this.alepha.state.set("alepha.server.request.user", this.alepha.codec.decode(alepha_security.userAccountInfoSchema, request.user));
206
- this.log.trace("User set from request token", {
207
- user: request.user,
208
- permission
209
- });
210
- } catch (error) {
211
- if (route.secure || permission) throw error;
212
- this.log.trace("Skipping security check for route - error occurred", error);
213
- }
214
- }
215
- });
216
- check(user, secure) {
217
- if (secure.realm) {
218
- if (user.realm !== secure.realm) throw new alepha_server.ForbiddenError(`User must belong to realm '${secure.realm}' to access this route`);
219
- }
220
- }
221
- /**
222
- * Get the user account token for a local action call.
223
- * There are three possible sources for the user:
224
- * - `options.user`: the user passed in the options
225
- * - `"system"`: the system user from the state (you MUST set state `server.security.system.user`)
226
- * - `"context"`: the user from the request context (you MUST be in an HTTP request context)
227
- *
228
- * Priority order: `options.user` > `"system"` > `"context"`.
229
- *
230
- * In testing environment, if no user is provided, a test user is created based on the SecurityProvider's roles.
231
- */
232
- createUserFromLocalFunctionContext(options, permission) {
233
- const fromOptions = typeof options.user === "object" ? options.user : void 0;
234
- const type = typeof options.user === "string" ? options.user : void 0;
235
- let user;
236
- const fromContext = this.alepha.context.get("request")?.user;
237
- const fromSystem = this.alepha.state.get("alepha.server.security.system.user");
238
- if (type === "system") user = fromSystem;
239
- else if (type === "context") user = fromContext;
240
- else user = fromOptions ?? fromContext ?? fromSystem;
241
- if (!user) {
242
- if (this.alepha.isTest() && !("user" in options)) return this.createTestUser();
243
- throw new alepha_server.UnauthorizedError("User is required for calling this action");
244
- }
245
- const roles = user.roles ?? (this.alepha.isTest() ? this.securityProvider.getRoles().map((role) => role.name) : []);
246
- let ownership;
247
- if (permission) {
248
- const result = this.securityProvider.checkPermission(permission, ...roles);
249
- if (!result.isAuthorized) throw new alepha_server.ForbiddenError(`Permission '${this.securityProvider.permissionToString(permission)}' is required for this route`);
250
- ownership = result.ownership;
251
- }
252
- return {
253
- ...user,
254
- ownership
255
- };
256
- }
257
- createTestUser() {
258
- return {
259
- id: (0, node_crypto.randomUUID)(),
260
- name: "Test",
261
- roles: this.securityProvider.getRoles().map((role) => role.name)
262
- };
263
- }
264
- onClientRequest = (0, alepha.$hook)({
265
- on: "client:onRequest",
266
- handler: async ({ request, options }) => {
267
- if (!this.alepha.isTest()) return;
268
- if ("user" in options && options.user === void 0) return;
269
- request.headers = new Headers(request.headers);
270
- if (!request.headers.has("authorization")) {
271
- const test = this.createTestUser();
272
- const user = typeof options?.user === "object" ? options.user : void 0;
273
- const sub = user?.id ?? test.id;
274
- const roles = user?.roles ?? test.roles;
275
- const token = await this.jwtProvider.create({
276
- sub,
277
- roles
278
- }, user?.realm ?? this.securityProvider.getRealms()[0]?.name);
279
- request.headers.set("authorization", `Bearer ${token}`);
280
- }
281
- }
282
- });
283
- };
284
-
285
- //#endregion
286
- //#region src/server-security/index.ts
287
- /**
288
- * Plugin for Alepha Server that provides security features. Based on the Alepha Security module.
289
- *
290
- * By default, all $action will be guarded by a permission check.
291
- *
292
- * @see {@link ServerSecurityProvider}
293
- * @module alepha.server.security
294
- */
295
- const AlephaServerSecurity = (0, alepha.$module)({
296
- name: "alepha.server.security",
297
- descriptors: [
298
- alepha_security.$realm,
299
- alepha_security.$role,
300
- alepha_security.$permission,
301
- $basicAuth
302
- ],
303
- services: [
304
- alepha_server.AlephaServer,
305
- alepha_security.AlephaSecurity,
306
- ServerSecurityProvider,
307
- ServerBasicAuthProvider
308
- ]
309
- });
310
-
311
- //#endregion
312
- //#region src/server-links/schemas/apiLinksResponseSchema.ts
313
- const apiLinkSchema = alepha.t.object({
314
- name: alepha.t.text({ description: "Name of the API link, used for identification." }),
315
- group: alepha.t.optional(alepha.t.text({ description: "Group to which the API link belongs, used for categorization." })),
316
- path: alepha.t.text({ description: "Pathname used to access the API link." }),
317
- method: alepha.t.optional(alepha.t.text({ description: "HTTP method used for the API link, e.g., GET, POST, etc. If not specified, defaults to GET." })),
318
- requestBodyType: alepha.t.optional(alepha.t.text({ description: "Type of the request body for the API link. Default is application/json for POST/PUT/PATCH, null for others." })),
319
- service: alepha.t.optional(alepha.t.text({ description: "Service name associated with the API link, used for service discovery." }))
320
- });
321
- const apiLinksResponseSchema = alepha.t.object({
322
- prefix: alepha.t.optional(alepha.t.text()),
323
- links: alepha.t.array(apiLinkSchema)
324
- });
325
-
326
- //#endregion
327
- //#region src/server-links/providers/LinkProvider.ts
328
- /**
329
- * Browser, SSR friendly, service to handle links.
330
- */
331
- var LinkProvider = class LinkProvider {
332
- static path = {
333
- apiLinks: "/api/_links",
334
- apiSchema: "/api/_links/:name/schema"
335
- };
336
- log = (0, alepha_logger.$logger)();
337
- alepha = (0, alepha.$inject)(alepha.Alepha);
338
- httpClient = (0, alepha.$inject)(alepha_server.HttpClient);
339
- serverLinks = [];
340
- /**
341
- * Get applicative links registered on the server.
342
- * This does not include lazy-loaded remote links.
343
- */
344
- getServerLinks() {
345
- if (this.alepha.isBrowser()) {
346
- this.log.warn("Getting server links in the browser is not supported. Use `fetchLinks` to get links from the server.");
347
- return [];
348
- }
349
- return this.serverLinks;
350
- }
351
- /**
352
- * Register a new link for the application.
353
- */
354
- registerLink(link) {
355
- if (this.alepha.isBrowser()) {
356
- this.log.warn("Registering links in the browser is not supported. Use `fetchLinks` to get links from the server.");
357
- return;
358
- }
359
- if (!link.handler && !link.host) throw new alepha.AlephaError("Can't create link - 'handler' or 'host' is required");
360
- if (this.serverLinks.some((l) => l.name === link.name)) this.serverLinks = this.serverLinks.filter((l) => l.name !== link.name);
361
- this.serverLinks.push(link);
362
- }
363
- get links() {
364
- const apiLinks = this.alepha.state.get("alepha.server.request.apiLinks")?.links;
365
- if (apiLinks) {
366
- if (this.alepha.isBrowser()) return apiLinks;
367
- const links = [];
368
- for (const link of apiLinks) {
369
- const originalLink = this.serverLinks.find((l) => l.name === link.name);
370
- if (originalLink) links.push(originalLink);
371
- }
372
- return links;
373
- }
374
- return this.serverLinks ?? [];
375
- }
376
- /**
377
- * Force browser to refresh links from the server.
378
- */
379
- async fetchLinks() {
380
- const { data } = await this.httpClient.fetch(`${LinkProvider.path.apiLinks}`, {
381
- method: "GET",
382
- schema: { response: apiLinksResponseSchema }
383
- });
384
- this.alepha.state.set("alepha.server.request.apiLinks", data);
385
- return data.links;
386
- }
387
- /**
388
- * Create a virtual client that can be used to call actions.
389
- *
390
- * Use js Proxy under the hood.
391
- */
392
- client(scope = {}) {
393
- return new Proxy({}, { get: (_, prop) => {
394
- if (typeof prop !== "string") return;
395
- return this.createVirtualAction(prop, scope);
396
- } });
397
- }
398
- /**
399
- * Check if a link with the given name exists.
400
- * @param name
401
- */
402
- can(name) {
403
- return this.links.some((link) => link.name === name);
404
- }
405
- /**
406
- * Resolve a link by its name and call it.
407
- * - If link is local, it will call the local handler.
408
- * - If link is remote, it will make a fetch request to the remote server.
409
- */
410
- async follow(name, config = {}, options = {}) {
411
- this.log.trace("Following link", {
412
- name,
413
- config,
414
- options
415
- });
416
- const link = await this.getLinkByName(name, options);
417
- if (link.handler && !options.request) {
418
- this.log.trace("Local link found", { name });
419
- return link.handler({
420
- method: link.method,
421
- url: new URL(`http://localhost${link.path}`),
422
- query: config.query ?? {},
423
- body: config.body ?? {},
424
- params: config.params ?? {},
425
- headers: config.headers ?? {},
426
- metadata: {},
427
- reply: new alepha_server.ServerReply()
428
- }, options);
429
- }
430
- this.log.trace("Remote link found", {
431
- name,
432
- host: link.host,
433
- service: link.service
434
- });
435
- return this.followRemote(link, config, options).then((response) => response.data);
436
- }
437
- createVirtualAction(name, scope = {}) {
438
- const $ = async (config = {}, options = {}) => {
439
- return this.follow(name, config, {
440
- ...scope,
441
- ...options
442
- });
443
- };
444
- Object.defineProperty($, "name", {
445
- value: name,
446
- writable: false
447
- });
448
- $.run = async (config = {}, options = {}) => {
449
- return this.follow(name, config, {
450
- ...scope,
451
- ...options
452
- });
453
- };
454
- $.fetch = async (config = {}, options = {}) => {
455
- const link = await this.getLinkByName(name, scope);
456
- return this.followRemote(link, config, options);
457
- };
458
- $.can = () => {
459
- return this.can(name);
460
- };
461
- return $;
462
- }
463
- async followRemote(link, config = {}, options = {}) {
464
- options.request ??= {};
465
- options.request.headers = new Headers(options.request.headers);
466
- const als = this.alepha.context.get("request");
467
- if (als?.headers.authorization) options.request.headers.set("authorization", als.headers.authorization);
468
- const context = this.alepha.context.get("context");
469
- if (typeof context === "string") options.request.headers.set("x-request-id", context);
470
- const action = {
471
- ...link,
472
- schema: {
473
- body: alepha.t.any(),
474
- response: alepha.t.any()
475
- }
476
- };
477
- if (!link.host && link.service) action.path = `/${link.service}${action.path}`;
478
- action.path = `${action.prefix ?? "/api"}${action.path}`;
479
- action.prefix = void 0;
480
- return this.httpClient.fetchAction({
481
- host: link.host,
482
- config,
483
- options,
484
- action
485
- });
486
- }
487
- async getLinkByName(name, options = {}) {
488
- if (this.alepha.isBrowser() && !this.alepha.state.get("alepha.server.request.apiLinks")) await this.fetchLinks();
489
- const link = this.links.find((a) => a.name === name && (!options.group || a.group === options.group) && (!options.service || options.service === a.service));
490
- if (!link) {
491
- const error = new alepha_server.UnauthorizedError(`Action ${name} not found.`);
492
- await this.alepha.events.emit("client:onError", {
493
- route: link,
494
- error
495
- });
496
- throw error;
497
- }
498
- if (options.hostname) return {
499
- ...link,
500
- host: options.hostname
501
- };
502
- return link;
503
- }
504
- };
505
-
506
- //#endregion
507
- //#region src/server-links/descriptors/$client.ts
508
- /**
509
- * Create a new client.
510
- */
511
- const $client = (scope) => {
512
- return (0, alepha.$inject)(LinkProvider).client(scope);
513
- };
514
- $client[alepha.KIND] = "$client";
515
-
516
- //#endregion
517
- //#region src/server-links/descriptors/$remote.ts
518
- /**
519
- * $remote is a descriptor that allows you to define remote service access.
520
- *
521
- * Use it only when you have 2 or more services that need to communicate with each other.
522
- *
523
- * All remote services can be exposed as actions, ... or not.
524
- *
525
- * You can add a service account if you want to use a security layer.
526
- */
527
- const $remote = (options) => {
528
- return (0, alepha.createDescriptor)(RemoteDescriptor, options);
529
- };
530
- var RemoteDescriptor = class extends alepha.Descriptor {
531
- get name() {
532
- return this.options.name ?? this.config.propertyKey;
533
- }
534
- };
535
- $remote[alepha.KIND] = RemoteDescriptor;
536
-
537
- //#endregion
538
- //#region src/server-proxy/descriptors/$proxy.ts
539
- /**
540
- * Creates a proxy descriptor to forward requests to another server.
541
- *
542
- * This descriptor enables you to create reverse proxy functionality, allowing your Alepha server
543
- * to forward requests to other services while maintaining a unified API surface. It's particularly
544
- * useful for microservice architectures, API gateways, or when you need to aggregate multiple
545
- * services behind a single endpoint.
546
- *
547
- * **Key Features**
548
- *
549
- * - **Path-based routing**: Match specific paths or patterns to proxy
550
- * - **Dynamic targets**: Support both static and dynamic target resolution
551
- * - **Request/Response hooks**: Modify requests before forwarding and responses after receiving
552
- * - **URL rewriting**: Transform URLs before forwarding to the target
553
- * - **Conditional proxying**: Enable/disable proxies based on environment or conditions
554
- *
555
- * @example
556
- * **Basic proxy setup:**
557
- * ```ts
558
- * import { $proxy } from "alepha/server/proxy";
559
- *
560
- * class ApiGateway {
561
- * // Forward all /api/* requests to external service
562
- * api = $proxy({
563
- * path: "/api/*",
564
- * target: "https://api.example.com"
565
- * });
566
- * }
567
- * ```
568
- *
569
- * @example
570
- * **Dynamic target with environment-based routing:**
571
- * ```ts
572
- * class ApiGateway {
573
- * // Route to different environments based on configuration
574
- * api = $proxy({
575
- * path: "/api/*",
576
- * target: () => process.env.NODE_ENV === "production"
577
- * ? "https://api.prod.example.com"
578
- * : "https://api.dev.example.com"
579
- * });
580
- * }
581
- * ```
582
- *
583
- * @example
584
- * **Advanced proxy with request/response modification:**
585
- * ```ts
586
- * class SecureProxy {
587
- * secure = $proxy({
588
- * path: "/secure/*",
589
- * target: "https://secure-api.example.com",
590
- * beforeRequest: async (request, proxyRequest) => {
591
- * // Add authentication headers
592
- * proxyRequest.headers = {
593
- * ...proxyRequest.headers,
594
- * 'Authorization': `Bearer ${await getServiceToken()}`,
595
- * 'X-Forwarded-For': request.headers['x-forwarded-for'] || request.ip
596
- * };
597
- * },
598
- * afterResponse: async (request, proxyResponse) => {
599
- * // Log response for monitoring
600
- * console.log(`Proxied ${request.url} -> ${proxyResponse.status}`);
601
- * },
602
- * rewrite: (url) => {
603
- * // Remove /secure prefix when forwarding
604
- * url.pathname = url.pathname.replace('/secure', '');
605
- * }
606
- * });
607
- * }
608
- * ```
609
- *
610
- * @example
611
- * **Conditional proxy based on feature flags:**
612
- * ```ts
613
- * class FeatureProxy {
614
- * newApi = $proxy({
615
- * path: "/v2/*",
616
- * target: "https://new-api.example.com",
617
- * disabled: !process.env.ENABLE_V2_API // Disable if feature flag is off
618
- * });
619
- * }
620
- * ```
621
- */
622
- const $proxy = (options) => {
623
- return (0, alepha.createDescriptor)(ProxyDescriptor, options);
624
- };
625
- var ProxyDescriptor = class extends alepha.Descriptor {};
626
- $proxy[alepha.KIND] = ProxyDescriptor;
627
-
628
- //#endregion
629
- //#region src/server-proxy/providers/ServerProxyProvider.ts
630
- var ServerProxyProvider = class {
631
- log = (0, alepha_logger.$logger)();
632
- routerProvider = (0, alepha.$inject)(alepha_server.ServerRouterProvider);
633
- alepha = (0, alepha.$inject)(alepha.Alepha);
634
- configure = (0, alepha.$hook)({
635
- on: "configure",
636
- handler: () => {
637
- for (const proxy of this.alepha.descriptors($proxy)) this.createProxy(proxy.options);
638
- }
639
- });
640
- createProxy(options) {
641
- if (options.disabled) return;
642
- const path = options.path;
643
- const target = typeof options.target === "function" ? options.target() : options.target;
644
- if (!path.endsWith("/*")) throw new alepha.AlephaError("Proxy path should end with '/*'");
645
- const handler = this.createProxyHandler(target, options);
646
- for (const method of alepha_server.routeMethods) this.routerProvider.createRoute({
647
- method,
648
- path,
649
- handler
650
- });
651
- this.log.info("Proxying", {
652
- path,
653
- target
654
- });
655
- }
656
- createProxyHandler(target, options) {
657
- return async (request) => {
658
- const url = new URL(target + request.url.pathname);
659
- if (request.url.search) url.search = request.url.search;
660
- options.rewrite?.(url);
661
- const requestInit = {
662
- url: url.toString(),
663
- method: request.method,
664
- headers: {
665
- ...request.headers,
666
- "accept-encoding": "identity"
667
- },
668
- body: this.getRawRequestBody(request)
669
- };
670
- if (requestInit.body) requestInit.duplex = "half";
671
- if (options.beforeRequest) await options.beforeRequest(request, requestInit);
672
- this.log.debug("Proxying request", {
673
- url: url.toString(),
674
- method: request.method,
675
- headers: request.headers
676
- });
677
- const response = await fetch(requestInit.url, requestInit);
678
- request.reply.status = response.status;
679
- request.reply.headers = Object.fromEntries(response.headers.entries());
680
- request.reply.body = response.body;
681
- this.log.debug("Received response", {
682
- status: request.reply.status,
683
- headers: request.reply.headers
684
- });
685
- if (options.afterResponse) await options.afterResponse(request, response);
686
- };
687
- }
688
- getRawRequestBody(req) {
689
- const { method } = req;
690
- if (method === "GET" || method === "HEAD" || method === "OPTIONS") return;
691
- if (req.raw?.web?.req) return req.raw.web.req.body;
692
- if (req.raw?.node?.req) {
693
- const nodeReq = req.raw.node.req;
694
- return node_stream_web.ReadableStream.from(nodeReq);
695
- }
696
- }
697
- };
698
-
699
- //#endregion
700
- //#region src/server-proxy/index.ts
701
- /**
702
- * Plugin for Alepha that provides a proxy server functionality.
703
- *
704
- * @see {@link $proxy}
705
- * @module alepha.server.proxy
706
- */
707
- const AlephaServerProxy = (0, alepha.$module)({
708
- name: "alepha.server.proxy",
709
- descriptors: [$proxy],
710
- services: [alepha_server.AlephaServer, ServerProxyProvider]
711
- });
712
-
713
- //#endregion
714
- //#region src/server-links/providers/RemoteDescriptorProvider.ts
715
- const envSchema$1 = alepha.t.object({ SERVER_API_PREFIX: alepha.t.text({
716
- description: "Prefix for all API routes (e.g. $action).",
717
- default: "/api"
718
- }) });
719
- var RemoteDescriptorProvider = class {
720
- env = (0, alepha.$env)(envSchema$1);
721
- alepha = (0, alepha.$inject)(alepha.Alepha);
722
- proxyProvider = (0, alepha.$inject)(ServerProxyProvider);
723
- linkProvider = (0, alepha.$inject)(LinkProvider);
724
- remotes = [];
725
- log = (0, alepha_logger.$logger)();
726
- getRemotes() {
727
- return this.remotes;
728
- }
729
- configure = (0, alepha.$hook)({
730
- on: "configure",
731
- handler: async () => {
732
- const remotes = this.alepha.descriptors($remote);
733
- for (const remote of remotes) await this.registerRemote(remote);
734
- }
735
- });
736
- start = (0, alepha.$hook)({
737
- on: "start",
738
- handler: async () => {
739
- for (const remote of this.remotes) {
740
- const token = typeof remote.serviceAccount?.token === "function" ? await remote.serviceAccount.token() : void 0;
741
- if (!remote.internal) continue;
742
- const { links } = await remote.links({ authorization: token });
743
- for (const link of links) {
744
- let path = link.path.replace(remote.prefix, "");
745
- if (link.service) path = `/${link.service}${path}`;
746
- this.linkProvider.registerLink({
747
- ...link,
748
- prefix: remote.prefix,
749
- path,
750
- method: link.method ?? "GET",
751
- host: remote.url,
752
- service: remote.name
753
- });
754
- }
755
- this.log.info(`Remote '${remote.name}' OK`, {
756
- links: remote.links.length,
757
- prefix: remote.prefix
758
- });
759
- }
760
- }
761
- });
762
- async registerRemote(value) {
763
- const options = value.options;
764
- const url = typeof options.url === "string" ? options.url : options.url();
765
- const linkPath = LinkProvider.path.apiLinks;
766
- const name = value.name;
767
- const proxy = typeof options.proxy === "object" ? options.proxy : {};
768
- const remote = {
769
- url,
770
- name,
771
- prefix: "/api",
772
- serviceAccount: options.serviceAccount,
773
- proxy: !!options.proxy,
774
- internal: !proxy.noInternal,
775
- schema: async (opts) => {
776
- const { authorization, name: name$1 } = opts;
777
- return await fetch(`${url}${linkPath}/${name$1}/schema`, { headers: new Headers(authorization ? { authorization } : {}) }).then((it) => it.json());
778
- },
779
- links: async (opts) => {
780
- const { authorization } = opts;
781
- const remoteApi = await this.fetchLinks.run({
782
- service: name,
783
- url: `${url}${linkPath}`,
784
- authorization
785
- });
786
- if (remoteApi.prefix != null) remote.prefix = remoteApi.prefix;
787
- return remoteApi;
788
- }
789
- };
790
- this.remotes.push(remote);
791
- if (options.proxy) this.proxyProvider.createProxy({
792
- path: `${this.env.SERVER_API_PREFIX}/${name}/*`,
793
- target: url,
794
- rewrite: (url$1) => {
795
- url$1.pathname = url$1.pathname.replace(`${this.env.SERVER_API_PREFIX}/${name}`, remote.prefix);
796
- },
797
- ...proxy
798
- });
799
- }
800
- fetchLinks = (0, alepha_retry.$retry)({
801
- max: 10,
802
- backoff: { initial: 1e3 },
803
- onError: (_, attempt, { service, url }) => {
804
- this.log.warn(`Failed to fetch links, retry (${attempt})...`, {
805
- service,
806
- url
807
- });
808
- },
809
- handler: async (opts) => {
810
- const { url, authorization } = opts;
811
- const response = await fetch(url, { headers: new Headers(authorization ? { authorization } : {}) });
812
- if (!response.ok) throw new Error(`Failed to fetch links from ${url}`);
813
- return this.alepha.codec.decode(apiLinksResponseSchema, await response.json());
814
- }
815
- });
816
- };
817
-
818
- //#endregion
819
- //#region src/server-links/providers/ServerLinksProvider.ts
820
- const envSchema = alepha.t.object({ SERVER_API_PREFIX: alepha.t.text({
821
- description: "Prefix for all API routes (e.g. $action).",
822
- default: "/api"
823
- }) });
824
- var ServerLinksProvider = class {
825
- env = (0, alepha.$env)(envSchema);
826
- alepha = (0, alepha.$inject)(alepha.Alepha);
827
- linkProvider = (0, alepha.$inject)(LinkProvider);
828
- remoteProvider = (0, alepha.$inject)(RemoteDescriptorProvider);
829
- serverTimingProvider = (0, alepha.$inject)(alepha_server.ServerTimingProvider);
830
- get prefix() {
831
- return this.env.SERVER_API_PREFIX;
832
- }
833
- onRoute = (0, alepha.$hook)({
834
- on: "configure",
835
- handler: () => {
836
- for (const action of this.alepha.descriptors(alepha_server.$action)) this.linkProvider.registerLink({
837
- name: action.name,
838
- group: action.group,
839
- schema: action.options.schema,
840
- requestBodyType: action.getBodyContentType(),
841
- secured: action.options.secure ?? true,
842
- method: action.method === "GET" ? void 0 : action.method,
843
- prefix: action.prefix,
844
- path: action.path,
845
- handler: (config, options = {}) => action.run(config, options)
846
- });
847
- }
848
- });
849
- /**
850
- * First API - Get all API links for the user.
851
- *
852
- * This is based on the user's permissions.
853
- */
854
- links = (0, alepha_server.$route)({
855
- path: LinkProvider.path.apiLinks,
856
- schema: { response: apiLinksResponseSchema },
857
- handler: ({ user, headers }) => {
858
- return this.getUserApiLinks({
859
- user,
860
- authorization: headers.authorization
861
- });
862
- }
863
- });
864
- /**
865
- * Second API - Get schema for a specific API link.
866
- *
867
- * Note: Body/Response schema are not included in `links` API because it's TOO BIG.
868
- * I mean for 150+ links, you got 50ms of serialization time.
869
- */
870
- schema = (0, alepha_server.$route)({
871
- path: LinkProvider.path.apiSchema,
872
- schema: {
873
- params: alepha.t.object({ name: alepha.t.text() }),
874
- response: alepha.t.json()
875
- },
876
- handler: ({ params, user, headers }) => {
877
- return this.getSchemaByName(params.name, {
878
- user,
879
- authorization: headers.authorization
880
- });
881
- }
882
- });
883
- async getSchemaByName(name, options = {}) {
884
- const authorization = options.authorization;
885
- const api = await this.getUserApiLinks({
886
- user: options.user,
887
- authorization
888
- });
889
- for (const link of api.links) if (link.name === name) {
890
- if (link.service) return this.remoteProvider.getRemotes().find((it) => it.name === link.service)?.schema({
891
- name,
892
- authorization
893
- });
894
- return this.linkProvider.getServerLinks().find((it) => it.name === name)?.schema ?? {};
895
- }
896
- return {};
897
- }
898
- /**
899
- * Retrieves API links for the user based on their permissions.
900
- * Will check on local links and remote links.
901
- */
902
- async getUserApiLinks(options) {
903
- const { user } = options;
904
- let permissions;
905
- let permissionMap;
906
- const hasSecurity = this.alepha.has(alepha_security.SecurityProvider);
907
- if (hasSecurity && user) {
908
- permissions = this.alepha.inject(alepha_security.SecurityProvider).getPermissions(user);
909
- permissionMap = new Map(permissions.map((it) => [`${it.group}:${it.name}`, it]));
910
- }
911
- const userLinks = [];
912
- for (const permission of permissions ?? []) if (!permission.path && !permission.method && permission.name && permission.group) userLinks.push({
913
- path: "",
914
- name: permission.name,
915
- group: permission.group
916
- });
917
- for (const link of this.linkProvider.getServerLinks()) {
918
- if (link.host) continue;
919
- if (hasSecurity && link.secured) {
920
- if (!user) continue;
921
- if (typeof link.secured === "object" && link.secured.realm) {
922
- if (user.realm !== link.secured.realm) continue;
923
- } else if (permissionMap) {
924
- if (!permissionMap.has(`${link.group}:${link.name}`)) continue;
925
- }
926
- }
927
- userLinks.push({
928
- name: link.name,
929
- group: link.group,
930
- requestBodyType: link.requestBodyType,
931
- method: link.method,
932
- path: link.path
933
- });
934
- }
935
- this.serverTimingProvider.beginTiming("fetchRemoteLinks");
936
- const promises = this.remoteProvider.getRemotes().filter((it) => it.proxy).map(async (remote) => {
937
- const { links, prefix } = await remote.links(options);
938
- return links.map((link) => {
939
- let path = link.path.replace(prefix ?? "/api", "");
940
- if (link.service) path = `/${link.service}${path}`;
941
- return {
942
- ...link,
943
- path,
944
- proxy: true,
945
- service: remote.name
946
- };
947
- });
948
- });
949
- userLinks.push(...(await Promise.all(promises)).flat());
950
- this.serverTimingProvider.endTiming("fetchRemoteLinks");
951
- return {
952
- prefix: this.env.SERVER_API_PREFIX,
953
- links: userLinks
954
- };
955
- }
956
- };
957
-
958
- //#endregion
959
- //#region src/server-links/index.ts
960
- /**
961
- * Provides server-side link management and remote capabilities for client-server interactions.
962
- *
963
- * The server-links module enables declarative link definitions using `$remote` and `$client` descriptors,
964
- * facilitating seamless API endpoint management and client-server communication. It integrates with server
965
- * security features to ensure safe and controlled access to resources.
966
- *
967
- * @see {@link $remote}
968
- * @see {@link $client}
969
- * @module alepha.server.links
970
- */
971
- const AlephaServerLinks = (0, alepha.$module)({
972
- name: "alepha.server.links",
973
- descriptors: [$remote, $client],
974
- services: [
975
- alepha_server.AlephaServer,
976
- ServerLinksProvider,
977
- RemoteDescriptorProvider,
978
- LinkProvider
979
- ]
980
- });
981
-
982
- //#endregion
983
- exports.$client = $client;
984
- exports.$remote = $remote;
985
- exports.AlephaServerLinks = AlephaServerLinks;
986
- exports.LinkProvider = LinkProvider;
987
- exports.RemoteDescriptor = RemoteDescriptor;
988
- exports.RemoteDescriptorProvider = RemoteDescriptorProvider;
989
- exports.ServerLinksProvider = ServerLinksProvider;
990
- exports.apiLinkSchema = apiLinkSchema;
991
- exports.apiLinksResponseSchema = apiLinksResponseSchema;
992
- //# sourceMappingURL=index.cjs.map