alepha 0.21.1 → 0.22.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 (481) hide show
  1. package/README.md +0 -1
  2. package/dist/api/audits/index.browser.js.map +1 -1
  3. package/dist/api/audits/index.d.ts +393 -403
  4. package/dist/api/audits/index.d.ts.map +1 -1
  5. package/dist/api/audits/index.js +25 -56
  6. package/dist/api/audits/index.js.map +1 -1
  7. package/dist/api/files/index.browser.js +31 -1
  8. package/dist/api/files/index.browser.js.map +1 -1
  9. package/dist/api/files/index.d.ts +353 -207
  10. package/dist/api/files/index.d.ts.map +1 -1
  11. package/dist/api/files/index.js +211 -45
  12. package/dist/api/files/index.js.map +1 -1
  13. package/dist/api/jobs/index.browser.js +2 -2
  14. package/dist/api/jobs/index.browser.js.map +1 -1
  15. package/dist/api/jobs/index.d.ts +289 -292
  16. package/dist/api/jobs/index.d.ts.map +1 -1
  17. package/dist/api/jobs/index.js +39 -33
  18. package/dist/api/jobs/index.js.map +1 -1
  19. package/dist/api/keys/index.d.ts +211 -216
  20. package/dist/api/keys/index.d.ts.map +1 -1
  21. package/dist/api/keys/index.js.map +1 -1
  22. package/dist/api/notifications/index.browser.js.map +1 -1
  23. package/dist/api/notifications/index.d.ts +188 -195
  24. package/dist/api/notifications/index.d.ts.map +1 -1
  25. package/dist/api/notifications/index.js.map +1 -1
  26. package/dist/api/oauth/index.d.ts +71 -76
  27. package/dist/api/oauth/index.d.ts.map +1 -1
  28. package/dist/api/oauth/index.js.map +1 -1
  29. package/dist/api/organizations/index.browser.js.map +1 -1
  30. package/dist/api/organizations/index.d.ts +104 -109
  31. package/dist/api/organizations/index.d.ts.map +1 -1
  32. package/dist/api/organizations/index.js.map +1 -1
  33. package/dist/api/parameters/index.browser.js +43 -16
  34. package/dist/api/parameters/index.browser.js.map +1 -1
  35. package/dist/api/parameters/index.d.ts +488 -344
  36. package/dist/api/parameters/index.d.ts.map +1 -1
  37. package/dist/api/parameters/index.js +175 -35
  38. package/dist/api/parameters/index.js.map +1 -1
  39. package/dist/api/payments/index.d.ts +396 -402
  40. package/dist/api/payments/index.d.ts.map +1 -1
  41. package/dist/api/payments/index.js.map +1 -1
  42. package/dist/api/subscriptions/index.d.ts +644 -652
  43. package/dist/api/subscriptions/index.d.ts.map +1 -1
  44. package/dist/api/subscriptions/index.js +1 -1
  45. package/dist/api/subscriptions/index.js.map +1 -1
  46. package/dist/api/users/index.browser.js +7 -0
  47. package/dist/api/users/index.browser.js.map +1 -1
  48. package/dist/api/users/index.d.ts +1072 -1005
  49. package/dist/api/users/index.d.ts.map +1 -1
  50. package/dist/api/users/index.js +311 -87
  51. package/dist/api/users/index.js.map +1 -1
  52. package/dist/api/verifications/index.browser.js +1 -0
  53. package/dist/api/verifications/index.browser.js.map +1 -1
  54. package/dist/api/verifications/index.d.ts +144 -133
  55. package/dist/api/verifications/index.d.ts.map +1 -1
  56. package/dist/api/verifications/index.js +5 -1
  57. package/dist/api/verifications/index.js.map +1 -1
  58. package/dist/background/index.d.ts +95 -0
  59. package/dist/background/index.d.ts.map +1 -0
  60. package/dist/background/index.js +121 -0
  61. package/dist/background/index.js.map +1 -0
  62. package/dist/background/index.workerd.js +110 -0
  63. package/dist/background/index.workerd.js.map +1 -0
  64. package/dist/batch/index.d.ts +5 -7
  65. package/dist/batch/index.d.ts.map +1 -1
  66. package/dist/batch/index.js.map +1 -1
  67. package/dist/bin/index.js.map +1 -1
  68. package/dist/bucket/index.d.ts +76 -54
  69. package/dist/bucket/index.d.ts.map +1 -1
  70. package/dist/bucket/index.js +58 -11
  71. package/dist/bucket/index.js.map +1 -1
  72. package/dist/bucket/index.workerd.js +200 -5
  73. package/dist/bucket/index.workerd.js.map +1 -1
  74. package/dist/cache/core/index.d.ts +7 -10
  75. package/dist/cache/core/index.d.ts.map +1 -1
  76. package/dist/cache/core/index.js.map +1 -1
  77. package/dist/cache/core/index.workerd.js.map +1 -1
  78. package/dist/cache/database/index.d.ts +22 -26
  79. package/dist/cache/database/index.d.ts.map +1 -1
  80. package/dist/cache/database/index.js.map +1 -1
  81. package/dist/cache/redis/index.d.ts +4 -7
  82. package/dist/cache/redis/index.d.ts.map +1 -1
  83. package/dist/cache/redis/index.js.map +1 -1
  84. package/dist/captcha/index.d.ts +3 -6
  85. package/dist/captcha/index.d.ts.map +1 -1
  86. package/dist/captcha/index.js.map +1 -1
  87. package/dist/cli/config/index.d.ts.map +1 -1
  88. package/dist/cli/config/index.js.map +1 -1
  89. package/dist/cli/core/index.d.ts +460 -188
  90. package/dist/cli/core/index.d.ts.map +1 -1
  91. package/dist/cli/core/index.js +411 -551
  92. package/dist/cli/core/index.js.map +1 -1
  93. package/dist/cli/devtools/index.d.ts +3 -5
  94. package/dist/cli/devtools/index.d.ts.map +1 -1
  95. package/dist/cli/devtools/index.js.map +1 -1
  96. package/dist/cli/i18n/index.d.ts +8 -12
  97. package/dist/cli/i18n/index.d.ts.map +1 -1
  98. package/dist/cli/i18n/index.js.map +1 -1
  99. package/dist/cli/platform/index.d.ts +127 -1382
  100. package/dist/cli/platform/index.d.ts.map +1 -1
  101. package/dist/cli/platform/index.js +188 -2493
  102. package/dist/cli/platform/index.js.map +1 -1
  103. package/dist/cli/platform-lib/index.d.ts +1446 -0
  104. package/dist/cli/platform-lib/index.d.ts.map +1 -0
  105. package/dist/cli/platform-lib/index.js +2597 -0
  106. package/dist/cli/platform-lib/index.js.map +1 -0
  107. package/dist/cli/vendor/index.d.ts +17 -21
  108. package/dist/cli/vendor/index.d.ts.map +1 -1
  109. package/dist/cli/vendor/index.js.map +1 -1
  110. package/dist/command/index.d.ts +21 -20
  111. package/dist/command/index.d.ts.map +1 -1
  112. package/dist/command/index.js +39 -10
  113. package/dist/command/index.js.map +1 -1
  114. package/dist/container/core/index.d.ts +236 -0
  115. package/dist/container/core/index.d.ts.map +1 -0
  116. package/dist/container/core/index.js +231 -0
  117. package/dist/container/core/index.js.map +1 -0
  118. package/dist/container/core/index.workerd.js +192 -0
  119. package/dist/container/core/index.workerd.js.map +1 -0
  120. package/dist/core/index.browser.js +27 -1
  121. package/dist/core/index.browser.js.map +1 -1
  122. package/dist/core/index.d.ts +48 -24
  123. package/dist/core/index.d.ts.map +1 -1
  124. package/dist/core/index.js +27 -1
  125. package/dist/core/index.js.map +1 -1
  126. package/dist/core/index.native.js +27 -1
  127. package/dist/core/index.native.js.map +1 -1
  128. package/dist/core/index.workerd.js +27 -1
  129. package/dist/core/index.workerd.js.map +1 -1
  130. package/dist/crypto/index.browser.js.map +1 -1
  131. package/dist/crypto/index.d.ts +5 -8
  132. package/dist/crypto/index.d.ts.map +1 -1
  133. package/dist/crypto/index.js.map +1 -1
  134. package/dist/datetime/index.d.ts +3 -4
  135. package/dist/datetime/index.d.ts.map +1 -1
  136. package/dist/datetime/index.js.map +1 -1
  137. package/dist/email/brevo/index.d.ts +2 -4
  138. package/dist/email/brevo/index.d.ts.map +1 -1
  139. package/dist/email/brevo/index.js.map +1 -1
  140. package/dist/email/cloudflare/index.d.ts +103 -0
  141. package/dist/email/cloudflare/index.d.ts.map +1 -0
  142. package/dist/email/cloudflare/index.js +153 -0
  143. package/dist/email/cloudflare/index.js.map +1 -0
  144. package/dist/email/core/index.d.ts +6 -9
  145. package/dist/email/core/index.d.ts.map +1 -1
  146. package/dist/email/core/index.js.map +1 -1
  147. package/dist/email/core/index.workerd.js.map +1 -1
  148. package/dist/email/smtp/index.d.ts +10 -13
  149. package/dist/email/smtp/index.d.ts.map +1 -1
  150. package/dist/email/smtp/index.js +107 -32
  151. package/dist/email/smtp/index.js.map +1 -1
  152. package/dist/fake/index.d.ts +1 -2
  153. package/dist/fake/index.d.ts.map +1 -1
  154. package/dist/fake/index.js.map +1 -1
  155. package/dist/lock/core/index.d.ts +9 -14
  156. package/dist/lock/core/index.d.ts.map +1 -1
  157. package/dist/lock/core/index.js.map +1 -1
  158. package/dist/lock/redis/index.d.ts +2 -4
  159. package/dist/lock/redis/index.d.ts.map +1 -1
  160. package/dist/lock/redis/index.js.map +1 -1
  161. package/dist/logger/index.d.ts +105 -76
  162. package/dist/logger/index.d.ts.map +1 -1
  163. package/dist/logger/index.js +196 -174
  164. package/dist/logger/index.js.map +1 -1
  165. package/dist/mcp/index.d.ts +16 -20
  166. package/dist/mcp/index.d.ts.map +1 -1
  167. package/dist/mcp/index.js.map +1 -1
  168. package/dist/orm/core/index.browser.js.map +1 -1
  169. package/dist/orm/core/index.bun.js +21 -3
  170. package/dist/orm/core/index.bun.js.map +1 -1
  171. package/dist/orm/core/index.d.ts +76 -62
  172. package/dist/orm/core/index.d.ts.map +1 -1
  173. package/dist/orm/core/index.js +22 -4
  174. package/dist/orm/core/index.js.map +1 -1
  175. package/dist/orm/postgres/index.bun.js.map +1 -1
  176. package/dist/orm/postgres/index.d.ts +28 -20
  177. package/dist/orm/postgres/index.d.ts.map +1 -1
  178. package/dist/orm/postgres/index.js.map +1 -1
  179. package/dist/queue/core/index.d.ts +12 -15
  180. package/dist/queue/core/index.d.ts.map +1 -1
  181. package/dist/queue/core/index.js.map +1 -1
  182. package/dist/queue/core/index.workerd.js.map +1 -1
  183. package/dist/queue/redis/index.d.ts +3 -5
  184. package/dist/queue/redis/index.d.ts.map +1 -1
  185. package/dist/queue/redis/index.js.map +1 -1
  186. package/dist/react/auth/index.browser.js +9 -2
  187. package/dist/react/auth/index.browser.js.map +1 -1
  188. package/dist/react/auth/index.d.ts +14 -9
  189. package/dist/react/auth/index.d.ts.map +1 -1
  190. package/dist/react/auth/index.js +9 -2
  191. package/dist/react/auth/index.js.map +1 -1
  192. package/dist/react/core/index.d.ts +7 -8
  193. package/dist/react/core/index.d.ts.map +1 -1
  194. package/dist/react/core/index.js +6 -3
  195. package/dist/react/core/index.js.map +1 -1
  196. package/dist/react/form/index.d.ts +38 -5
  197. package/dist/react/form/index.d.ts.map +1 -1
  198. package/dist/react/form/index.js +91 -3
  199. package/dist/react/form/index.js.map +1 -1
  200. package/dist/react/head/index.browser.js.map +1 -1
  201. package/dist/react/head/index.d.ts +2 -4
  202. package/dist/react/head/index.d.ts.map +1 -1
  203. package/dist/react/head/index.js.map +1 -1
  204. package/dist/react/i18n/index.d.ts +47 -11
  205. package/dist/react/i18n/index.d.ts.map +1 -1
  206. package/dist/react/i18n/index.js +33 -1
  207. package/dist/react/i18n/index.js.map +1 -1
  208. package/dist/react/intro/index.d.ts +1 -2
  209. package/dist/react/intro/index.d.ts.map +1 -1
  210. package/dist/react/intro/index.js +2 -2
  211. package/dist/react/intro/index.js.map +1 -1
  212. package/dist/react/router/index.browser.js +66 -20
  213. package/dist/react/router/index.browser.js.map +1 -1
  214. package/dist/react/router/index.d.ts +327 -222
  215. package/dist/react/router/index.d.ts.map +1 -1
  216. package/dist/react/router/index.js +66 -30
  217. package/dist/react/router/index.js.map +1 -1
  218. package/dist/react/testing/index.d.ts +1 -2
  219. package/dist/react/testing/index.d.ts.map +1 -1
  220. package/dist/react/testing/index.js +16 -17
  221. package/dist/react/testing/index.js.map +1 -1
  222. package/dist/react/ui/index.d.ts +20 -25
  223. package/dist/react/ui/index.d.ts.map +1 -1
  224. package/dist/react/ui/index.js.map +1 -1
  225. package/dist/redis/index.bun.js.map +1 -1
  226. package/dist/redis/index.d.ts +17 -19
  227. package/dist/redis/index.d.ts.map +1 -1
  228. package/dist/redis/index.js.map +1 -1
  229. package/dist/retry/index.d.ts +2 -4
  230. package/dist/retry/index.d.ts.map +1 -1
  231. package/dist/retry/index.js.map +1 -1
  232. package/dist/router/index.d.ts.map +1 -1
  233. package/dist/router/index.js.map +1 -1
  234. package/dist/scheduler/index.d.ts +10 -13
  235. package/dist/scheduler/index.d.ts.map +1 -1
  236. package/dist/scheduler/index.js.map +1 -1
  237. package/dist/scheduler/index.workerd.js.map +1 -1
  238. package/dist/security/index.browser.js.map +1 -1
  239. package/dist/security/index.d.ts +45 -48
  240. package/dist/security/index.d.ts.map +1 -1
  241. package/dist/security/index.js.map +1 -1
  242. package/dist/server/auth/index.browser.js.map +1 -1
  243. package/dist/server/auth/index.d.ts +167 -172
  244. package/dist/server/auth/index.d.ts.map +1 -1
  245. package/dist/server/auth/index.js +4 -8
  246. package/dist/server/auth/index.js.map +1 -1
  247. package/dist/server/cookies/index.browser.js.map +1 -1
  248. package/dist/server/cookies/index.d.ts +5 -7
  249. package/dist/server/cookies/index.d.ts.map +1 -1
  250. package/dist/server/cookies/index.js.map +1 -1
  251. package/dist/server/core/index.browser.js.map +1 -1
  252. package/dist/server/core/index.d.ts +88 -73
  253. package/dist/server/core/index.d.ts.map +1 -1
  254. package/dist/server/core/index.js +19 -0
  255. package/dist/server/core/index.js.map +1 -1
  256. package/dist/server/cors/index.d.ts +11 -14
  257. package/dist/server/cors/index.d.ts.map +1 -1
  258. package/dist/server/cors/index.js.map +1 -1
  259. package/dist/server/etag/index.d.ts +6 -9
  260. package/dist/server/etag/index.d.ts.map +1 -1
  261. package/dist/server/etag/index.js.map +1 -1
  262. package/dist/server/health/index.d.ts +18 -21
  263. package/dist/server/health/index.d.ts.map +1 -1
  264. package/dist/server/health/index.js.map +1 -1
  265. package/dist/server/links/index.browser.js +2 -0
  266. package/dist/server/links/index.browser.js.map +1 -1
  267. package/dist/server/links/index.d.ts +63 -67
  268. package/dist/server/links/index.d.ts.map +1 -1
  269. package/dist/server/links/index.js +2 -0
  270. package/dist/server/links/index.js.map +1 -1
  271. package/dist/server/metrics/index.d.ts +5 -7
  272. package/dist/server/metrics/index.d.ts.map +1 -1
  273. package/dist/server/metrics/index.js.map +1 -1
  274. package/dist/server/proxy/index.d.ts +3 -5
  275. package/dist/server/proxy/index.d.ts.map +1 -1
  276. package/dist/server/proxy/index.js.map +1 -1
  277. package/dist/server/rate-limit/index.d.ts +10 -13
  278. package/dist/server/rate-limit/index.d.ts.map +1 -1
  279. package/dist/server/rate-limit/index.js.map +1 -1
  280. package/dist/server/static/index.d.ts +3 -5
  281. package/dist/server/static/index.d.ts.map +1 -1
  282. package/dist/server/static/index.js.map +1 -1
  283. package/dist/server/swagger/index.d.ts +5 -8
  284. package/dist/server/swagger/index.d.ts.map +1 -1
  285. package/dist/server/swagger/index.js.map +1 -1
  286. package/dist/sms/index.d.ts +3 -5
  287. package/dist/sms/index.d.ts.map +1 -1
  288. package/dist/sms/index.js.map +1 -1
  289. package/dist/system/index.browser.js.map +1 -1
  290. package/dist/system/index.d.ts +2 -4
  291. package/dist/system/index.d.ts.map +1 -1
  292. package/dist/system/index.js.map +1 -1
  293. package/dist/system/index.workerd.js.map +1 -1
  294. package/dist/topic/core/index.d.ts +4 -6
  295. package/dist/topic/core/index.d.ts.map +1 -1
  296. package/dist/topic/core/index.js.map +1 -1
  297. package/dist/topic/redis/index.d.ts +5 -8
  298. package/dist/topic/redis/index.d.ts.map +1 -1
  299. package/dist/topic/redis/index.js.map +1 -1
  300. package/package.json +57 -12
  301. package/src/api/audits/__tests__/AuditService.spec.ts +18 -110
  302. package/src/api/audits/controllers/AdminAuditController.ts +14 -0
  303. package/src/api/audits/services/AuditService.ts +21 -88
  304. package/src/api/files/__tests__/FileService.spec.ts +207 -2
  305. package/src/api/files/controllers/FileController.ts +41 -1
  306. package/src/api/files/index.ts +3 -0
  307. package/src/api/files/providers/FileAccessProvider.ts +23 -1
  308. package/src/api/files/schemas/fileCreatorSummarySchema.ts +22 -0
  309. package/src/api/files/schemas/fileResourceSchema.ts +10 -1
  310. package/src/api/files/services/FileService.ts +175 -75
  311. package/src/api/jobs/__tests__/$job.spec.ts +24 -1
  312. package/src/api/jobs/index.ts +4 -3
  313. package/src/api/jobs/primitives/$job.ts +7 -3
  314. package/src/api/jobs/providers/DirectJobDispatcher.ts +17 -36
  315. package/src/api/jobs/providers/JobProvider.ts +53 -24
  316. package/src/api/jobs/schemas/jobConfigAtom.ts +1 -1
  317. package/src/api/jobs/schemas/jobExecutionResourceSchema.ts +4 -1
  318. package/src/api/keys/schemas/adminApiKeyResourceSchema.ts +3 -1
  319. package/src/api/parameters/__tests__/$parameter.spec.ts +19 -2
  320. package/src/api/parameters/audits/ParameterAudits.ts +17 -0
  321. package/src/api/parameters/controllers/AdminParameterController.ts +95 -19
  322. package/src/api/parameters/index.ts +3 -0
  323. package/src/api/parameters/schemas/activateParameterBodySchema.ts +3 -3
  324. package/src/api/parameters/schemas/createParameterVersionBodySchema.ts +3 -2
  325. package/src/api/parameters/schemas/parameterCreatorSummarySchema.ts +25 -0
  326. package/src/api/parameters/schemas/parameterResponseSchema.ts +5 -0
  327. package/src/api/parameters/schemas/rollbackParameterBodySchema.ts +4 -2
  328. package/src/api/parameters/services/ParameterProvider.ts +69 -6
  329. package/src/api/subscriptions/jobs/SubscriptionJobs.ts +1 -1
  330. package/src/api/users/__tests__/AdminSessionController.spec.ts +37 -0
  331. package/src/api/users/audits/SessionAudits.ts +33 -0
  332. package/src/api/users/audits/UserAudits.ts +19 -43
  333. package/src/api/users/controllers/AdminUserController.ts +66 -1
  334. package/src/api/users/entities/sessions.ts +6 -0
  335. package/src/api/users/entities/users.ts +2 -0
  336. package/src/api/users/index.ts +9 -1
  337. package/src/api/users/primitives/$realm.ts +3 -0
  338. package/src/api/users/schemas/sessionResourceSchema.ts +16 -0
  339. package/src/api/users/schemas/updateUserSchema.ts +1 -8
  340. package/src/api/users/schemas/userQuerySchema.ts +7 -0
  341. package/src/api/users/services/CredentialService.ts +52 -32
  342. package/src/api/users/services/IdentityService.ts +2 -1
  343. package/src/api/users/services/RegistrationService.ts +2 -1
  344. package/src/api/users/services/SessionCrudService.ts +19 -2
  345. package/src/api/users/services/SessionService.ts +39 -19
  346. package/src/api/users/services/UserService.ts +106 -8
  347. package/src/api/verifications/entities/verifications.ts +8 -0
  348. package/src/api/verifications/services/VerificationService.ts +14 -0
  349. package/src/background/__tests__/BackgroundTaskProvider.spec.ts +96 -0
  350. package/src/background/index.ts +37 -0
  351. package/src/background/index.workerd.ts +28 -0
  352. package/src/background/providers/BackgroundTaskProvider.ts +70 -0
  353. package/src/background/providers/WorkerdBackgroundTaskProvider.ts +43 -0
  354. package/src/bucket/__tests__/$bucket.spec.ts +18 -0
  355. package/src/bucket/__tests__/LocalFileStorageProvider.spec.ts +5 -0
  356. package/src/bucket/__tests__/MemoryFileStorageProvider.spec.ts +5 -0
  357. package/src/bucket/__tests__/NodeS3BucketProvider.spec.ts +23 -4
  358. package/src/bucket/__tests__/shared.ts +30 -0
  359. package/src/bucket/index.ts +5 -5
  360. package/src/bucket/index.workerd.ts +11 -4
  361. package/src/bucket/primitives/$bucket.ts +27 -0
  362. package/src/bucket/providers/FileStorageProvider.ts +13 -0
  363. package/src/bucket/providers/LocalFileStorageProvider.ts +17 -1
  364. package/src/bucket/providers/MemoryFileStorageProvider.ts +7 -0
  365. package/src/bucket/providers/{CloudflareR2Provider.ts → R2FileStorageProvider.ts} +10 -1
  366. package/src/bucket/providers/{NodeS3BucketProvider.ts → S3FileStorageProvider.ts} +27 -5
  367. package/src/cli/core/__tests__/BuildDockerTask.spec.ts +49 -1
  368. package/src/cli/core/__tests__/init.spec.ts +0 -219
  369. package/src/cli/core/atoms/buildOptions.ts +15 -0
  370. package/src/cli/core/commands/__tests__/BuildCommand.spec.ts +43 -0
  371. package/src/cli/core/commands/build.ts +122 -32
  372. package/src/cli/core/commands/init.ts +0 -12
  373. package/src/cli/core/commands/pack.ts +133 -0
  374. package/src/cli/core/index.ts +3 -0
  375. package/src/cli/core/providers/ViteDevServerProvider.ts +40 -16
  376. package/src/cli/core/services/PackageManagerUtils.ts +0 -16
  377. package/src/cli/core/services/ProjectScaffolder.ts +29 -291
  378. package/src/cli/core/tasks/BuildAssetsTask.ts +3 -0
  379. package/src/cli/core/tasks/BuildClientTask.ts +3 -0
  380. package/src/cli/core/tasks/BuildCloudflareTask.ts +453 -13
  381. package/src/cli/core/tasks/BuildCompressTask.ts +3 -0
  382. package/src/cli/core/tasks/BuildDockerTask.ts +43 -2
  383. package/src/cli/core/tasks/BuildPrerenderTask.ts +3 -0
  384. package/src/cli/core/tasks/BuildPwaTask.ts +3 -0
  385. package/src/cli/core/tasks/BuildServerTask.ts +3 -0
  386. package/src/cli/core/tasks/BuildTask.ts +42 -0
  387. package/src/cli/core/templates/apiIndexTs.ts +1 -22
  388. package/src/cli/core/templates/mainCss.ts +0 -1
  389. package/src/cli/core/templates/webAppRouterTs.ts +0 -99
  390. package/src/cli/core/templates/webIndexTs.ts +1 -22
  391. package/src/cli/platform/__tests__/SecretsCommand.spec.ts +5 -3
  392. package/src/cli/platform/commands/SecretsCommand.ts +8 -6
  393. package/src/cli/platform/commands/platform.ts +265 -122
  394. package/src/cli/platform/index.ts +25 -53
  395. package/src/cli/{platform → platform-lib}/__tests__/CloudflareAdapter.spec.ts +426 -169
  396. package/src/cli/{platform → platform-lib}/__tests__/NamingService.spec.ts +81 -36
  397. package/src/cli/{platform → platform-lib}/__tests__/PlatformInspector.spec.ts +4 -48
  398. package/src/cli/{platform → platform-lib}/__tests__/VercelAdapter.spec.ts +56 -85
  399. package/src/cli/{platform → platform-lib}/adapters/CloudflareAdapter.ts +412 -199
  400. package/src/cli/{platform → platform-lib}/adapters/PlatformAdapter.ts +68 -33
  401. package/src/cli/{platform → platform-lib}/adapters/VercelAdapter.ts +11 -25
  402. package/src/cli/{platform → platform-lib}/atoms/platformOptions.ts +34 -6
  403. package/src/cli/platform-lib/index.ts +67 -0
  404. package/src/cli/platform-lib/services/NamingService.ts +136 -0
  405. package/src/cli/platform-lib/services/PlatformInspector.ts +153 -0
  406. package/src/cli/{platform → platform-lib}/services/PlatformOrchestrator.ts +80 -127
  407. package/src/cli/{platform → platform-lib}/services/WranglerApi.ts +4 -2
  408. package/src/command/__tests__/Runner.spec.ts +20 -0
  409. package/src/command/helpers/EnvUtils.ts +19 -3
  410. package/src/command/helpers/Runner.ts +12 -2
  411. package/src/command/providers/CliProvider.ts +34 -1
  412. package/src/container/core/__tests__/$container.spec.ts +83 -0
  413. package/src/container/core/index.ts +50 -0
  414. package/src/container/core/index.workerd.ts +53 -0
  415. package/src/container/core/interfaces/ContainerOptions.ts +69 -0
  416. package/src/container/core/primitives/$container.ts +100 -0
  417. package/src/container/core/providers/CloudflareContainerProvider.ts +70 -0
  418. package/src/container/core/providers/ContainerProvider.ts +92 -0
  419. package/src/container/core/providers/MockContainerProvider.ts +62 -0
  420. package/src/container/core/providers/NodeContainerProvider.ts +53 -0
  421. package/src/core/Alepha.ts +49 -1
  422. package/src/core/__tests__/$env.spec.ts +42 -0
  423. package/src/core/__tests__/dump.spec.ts +47 -0
  424. package/src/email/cloudflare/__tests__/CloudflareEmailProvider.spec.ts +182 -0
  425. package/src/email/cloudflare/index.ts +35 -0
  426. package/src/email/cloudflare/providers/CloudflareEmailProvider.ts +205 -0
  427. package/src/logger/__tests__/Logger.spec.ts +55 -0
  428. package/src/logger/index.ts +13 -0
  429. package/src/logger/services/Logger.ts +31 -1
  430. package/src/orm/__tests__/orm-showcase-tests.ts +27 -0
  431. package/src/orm/__tests__/orm-showcase.spec.ts +12 -0
  432. package/src/orm/core/interfaces/PgQuery.ts +4 -1
  433. package/src/orm/core/services/Repository.ts +38 -13
  434. package/src/react/auth/hooks/useAuth.ts +10 -5
  435. package/src/react/core/__tests__/useQuery.browser.spec.tsx +25 -0
  436. package/src/react/core/hooks/useAction.ts +14 -3
  437. package/src/react/core/hooks/useQuery.ts +24 -4
  438. package/src/react/form/hooks/useFormQuerySync.ts +0 -0
  439. package/src/react/form/index.ts +1 -0
  440. package/src/react/form/services/FormModel.ts +18 -2
  441. package/src/react/i18n/components/Translate.tsx +47 -0
  442. package/src/react/i18n/index.ts +2 -0
  443. package/src/react/intro/components/GettingStartedAdminSlide.tsx +2 -2
  444. package/src/react/router/__tests__/$page.spec.tsx +3 -2
  445. package/src/react/router/__tests__/page-can.spec.ts +18 -13
  446. package/src/react/router/hooks/useQueryParams.ts +114 -14
  447. package/src/react/router/primitives/$page.ts +85 -4
  448. package/src/react/router/providers/ReactBrowserProvider.ts +12 -3
  449. package/src/react/router/providers/ReactBrowserRouterProvider.ts +3 -7
  450. package/src/react/router/providers/ReactServerProvider.ts +4 -13
  451. package/src/react/ui/services/SchemaControl.ts +3 -4
  452. package/src/server/core/providers/ServerMultipartProvider.ts +19 -0
  453. package/src/server/links/providers/LinkProvider.ts +10 -0
  454. package/src/cli/core/templates/componentsJsonTs.ts +0 -39
  455. package/src/cli/core/templates/saasAdminLayoutTsx.ts +0 -77
  456. package/src/cli/core/templates/saasAdminPagesTsx.ts +0 -26
  457. package/src/cli/core/templates/saasAuthLayoutTsx.ts +0 -22
  458. package/src/cli/core/templates/saasAuthPagesTsx.ts +0 -62
  459. package/src/cli/core/templates/saasRealmProviderTs.ts +0 -52
  460. package/src/cli/platform/hooks/PlatformHook.ts +0 -51
  461. package/src/cli/platform/services/NamingService.ts +0 -55
  462. package/src/cli/platform/services/PlatformInspector.ts +0 -140
  463. package/src/orm/REFACTORING.md +0 -330
  464. /package/dist/orm/core/{chunk-o8xxKEmq.js → chunk-B4FMCO8f.js} +0 -0
  465. /package/dist/react/testing/{chunk-6Ep1yQYe.js → chunk-BpyX8vjI.js} +0 -0
  466. /package/src/cli/{platform → platform-lib}/__tests__/GitHubSecretStore.spec.ts +0 -0
  467. /package/src/cli/{platform → platform-lib}/__tests__/PlatformCacheProvider.spec.ts +0 -0
  468. /package/src/cli/{platform → platform-lib}/__tests__/PlatformOrchestrator.spec.ts +0 -0
  469. /package/src/cli/{platform → platform-lib}/__tests__/SecretFilterService.spec.ts +0 -0
  470. /package/src/cli/{platform → platform-lib}/__tests__/detectResources.spec.ts +0 -0
  471. /package/src/cli/{platform → platform-lib}/providers/GitHubSecretStore.ts +0 -0
  472. /package/src/cli/{platform → platform-lib}/providers/MemorySecretStore.ts +0 -0
  473. /package/src/cli/{platform → platform-lib}/providers/PlatformCacheProvider.ts +0 -0
  474. /package/src/cli/{platform → platform-lib}/providers/SecretStoreProvider.ts +0 -0
  475. /package/src/cli/{platform → platform-lib}/schemas/cloudflare.ts +0 -0
  476. /package/src/cli/{platform → platform-lib}/schemas/platform.ts +0 -0
  477. /package/src/cli/{platform → platform-lib}/schemas/vercel.ts +0 -0
  478. /package/src/cli/{platform → platform-lib}/services/CloudflareApi.ts +0 -0
  479. /package/src/cli/{platform → platform-lib}/services/SecretFilterService.ts +0 -0
  480. /package/src/cli/{platform → platform-lib}/services/VercelApi.ts +0 -0
  481. /package/src/cli/{platform → platform-lib}/services/VercelCli.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index.browser.js","names":[],"sources":["../../../src/server/links/schemas/apiLinksResponseSchema.ts","../../../src/server/links/atoms/apiLinksAtom.ts","../../../src/server/links/atoms/linkOptionsAtom.ts","../../../src/server/links/services/BatchCollector.ts","../../../src/server/links/providers/LinkProvider.ts","../../../src/server/links/primitives/$client.ts","../../../src/server/links/primitives/$remote.ts","../../../src/server/links/index.browser.ts"],"sourcesContent":["import type { Static } from \"alepha\";\nimport { t } from \"alepha\";\n\nexport const apiActionSchema = t.object({\n path: t.text({\n description: \"Pathname used to access the action.\",\n }),\n\n method: t.optional(\n t.text({\n description:\n \"HTTP method. Omitted when GET (the default for ~75% of actions).\",\n }),\n ),\n\n contentType: t.optional(\n t.text({\n description:\n \"Content type for the request body. Only present for non-JSON types (e.g. 'multipart/form-data'). When absent, defaults to application/json.\",\n }),\n ),\n\n kind: t.optional(\n t.text({\n description:\n \"Action kind. Used to distinguish special action types (e.g. 'sse' for Server-Sent Events streams).\",\n }),\n ),\n\n service: t.optional(\n t.text({\n description:\n \"Service name associated with the action, used for service discovery and routing.\",\n }),\n ),\n});\n\nexport const apiRegistryResponseSchema = t.object({\n prefix: t.optional(t.text()),\n\n actions: t.record(t.text(), apiActionSchema),\n\n permissions: t.optional(t.array(t.text())),\n});\n\nexport type ApiRegistryResponse = Static<typeof apiRegistryResponseSchema>;\nexport type ApiAction = Static<typeof apiActionSchema>;\n\n/**\n * @deprecated Use `apiRegistryResponseSchema` and `ApiRegistryResponse` instead.\n */\nexport const apiLinksResponseSchema = apiRegistryResponseSchema;\n\n/**\n * @deprecated Use `ApiRegistryResponse` instead.\n */\nexport type ApiLinksResponse = ApiRegistryResponse;\n\n/**\n * @deprecated Use `ApiAction` instead.\n */\nexport type ApiLink = ApiAction;\n","import { $atom, t } from \"alepha\";\nimport { apiRegistryResponseSchema } from \"../schemas/apiLinksResponseSchema.ts\";\n\nexport const apiLinksAtom = $atom({\n name: \"alepha.server.request.apiLinks\",\n schema: t.optional(apiRegistryResponseSchema),\n});\n","import { $atom, t } from \"alepha\";\n\nexport const linkOptionsAtom = $atom({\n name: \"alepha.server.links.options\",\n description: \"Configuration options for the links module.\",\n schema: t.object({\n batch: t.boolean({\n description: \"Enable batch collection for browser-side calls.\",\n default: true,\n }),\n }),\n default: {\n batch: true,\n },\n});\n","import { $inject } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport { HttpClient, HttpError } from \"alepha/server\";\n\n/**\n * Collects browser-side action calls within a microtask and\n * sends them as a single `POST /api/_batch` request.\n *\n * Key behaviors:\n * - Single call in the window → direct HTTP call (no batch overhead)\n * - Multiple calls → coalesced into one batch request\n * - Same action + same params/query/body → deduplicated, result shared\n * - Exceeding MAX_BATCH_SIZE → split into multiple batch calls\n * - Transport failure → all pending promises reject\n */\nexport class BatchCollector {\n protected static readonly MAX_BATCH_SIZE = 20;\n\n protected readonly log = $logger();\n protected readonly httpClient = $inject(HttpClient);\n\n protected pending: PendingBatchEntry[] = [];\n protected scheduled = false;\n\n /**\n * Add an action call to the batch. Returns the result when the batch resolves.\n */\n public add(entry: BatchEntry): Promise<any> {\n return new Promise((resolve, reject) => {\n this.pending.push({ entry, resolve, reject });\n\n if (!this.scheduled) {\n this.scheduled = true;\n setTimeout(() => {\n this.scheduled = false;\n this.flush().catch((err) => this.log.error(err));\n }, 10);\n }\n });\n }\n\n protected async flush(): Promise<void> {\n const batch = this.pending.splice(0);\n\n if (batch.length === 0) return;\n\n // Entries with a binary body (File/Blob) can't survive JSON-stringify, so\n // they must bypass the batch endpoint and use their direct (multipart)\n // call instead.\n const binaryEntries: PendingBatchEntry[] = [];\n const remaining: PendingBatchEntry[] = [];\n for (const item of batch) {\n if (this.hasBinaryBody(item.entry.body)) {\n binaryEntries.push(item);\n } else {\n remaining.push(item);\n }\n }\n for (const item of binaryEntries) {\n void item.entry\n .directCall()\n .then((r) => item.resolve(r))\n .catch((e) => item.reject(e));\n }\n\n if (remaining.length === 0) return;\n\n // Single request — skip batching, call directly via follow\n if (remaining.length === 1) {\n const item = remaining[0];\n try {\n const result = await item.entry.directCall();\n item.resolve(result);\n } catch (error) {\n item.reject(error);\n }\n return;\n }\n\n // Reassign so the rest of the function works on the filtered set.\n batch.length = 0;\n batch.push(...remaining);\n\n // Deduplicate: same action + same params → share result\n const { unique, indexMap } = this.dedupe(batch);\n\n // Split into chunks of MAX_BATCH_SIZE\n const chunks = this.chunk(unique, BatchCollector.MAX_BATCH_SIZE);\n\n try {\n const allResults = (\n await Promise.all(\n chunks.map((chunk) => {\n const actions = [...new Set(chunk.map((b) => b.entry.action))].join(\n \",\",\n );\n\n return this.httpClient\n .fetch(`/api/_batch?actions=${actions}`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(\n chunk.map((b) => ({\n action: b.entry.action,\n params: b.entry.params,\n query: b.entry.query,\n body: b.entry.body,\n })),\n ),\n })\n .then((res) => res.data as BatchResponse[]);\n }),\n )\n ).flat();\n\n // Distribute results back (including deduped slots)\n for (let i = 0; i < batch.length; i++) {\n const result = allResults[indexMap[i]];\n if (result.status >= 400) {\n batch[i].reject(\n new HttpError({\n message:\n result.error ?? `${result.action} failed (${result.status})`,\n status: result.status,\n }),\n );\n } else {\n batch[i].resolve(result.data);\n }\n }\n } catch (error) {\n // Transport-level failure — reject all pending promises\n for (const item of batch) {\n item.reject(error);\n }\n }\n }\n\n protected dedupe(batch: PendingBatchEntry[]): {\n unique: PendingBatchEntry[];\n indexMap: number[];\n } {\n const seen = new Map<string, number>();\n const unique: PendingBatchEntry[] = [];\n const indexMap: number[] = [];\n\n for (const item of batch) {\n const key = `${item.entry.action}:${JSON.stringify({\n params: item.entry.params,\n query: item.entry.query,\n body: item.entry.body,\n })}`;\n\n const existing = seen.get(key);\n if (existing !== undefined) {\n indexMap.push(existing);\n } else {\n const idx = unique.length;\n seen.set(key, idx);\n unique.push(item);\n indexMap.push(idx);\n }\n }\n\n return { unique, indexMap };\n }\n\n protected hasBinaryBody(body: unknown): boolean {\n if (!body || typeof body !== \"object\") return false;\n for (const v of Object.values(body as Record<string, unknown>)) {\n if (typeof Blob !== \"undefined\" && v instanceof Blob) return true;\n if (typeof File !== \"undefined\" && v instanceof File) return true;\n }\n return false;\n }\n\n protected chunk<T>(arr: T[], size: number): T[][] {\n const chunks: T[][] = [];\n for (let i = 0; i < arr.length; i += size) {\n chunks.push(arr.slice(i, i + size));\n }\n return chunks;\n }\n}\n\n// ---\n\nexport interface BatchEntry {\n action: string;\n params?: Record<string, any>;\n query?: Record<string, any>;\n body?: Record<string, any>;\n directCall: () => Promise<any>;\n}\n\ninterface PendingBatchEntry {\n entry: BatchEntry;\n resolve: (value: any) => void;\n reject: (reason: any) => void;\n}\n\ninterface BatchResponse {\n action: string;\n status: number;\n data?: any;\n error?: string;\n}\n","import { $inject, $state, Alepha, AlephaError, type Async, t } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport type { SecureOptions } from \"alepha/security\";\nimport {\n type ActionPrimitive,\n type ClientRequestEntry,\n type ClientRequestOptions,\n type ClientRequestResponse,\n type FetchResponse,\n HttpClient,\n type RequestConfigSchema,\n ServerReply,\n type ServerRequest,\n type ServerRequestConfigEntry,\n type ServerResponseBody,\n type SseConfigSchema,\n type SseEventData,\n type SsePrimitive,\n type SseRequestEntry,\n type SseStream,\n UnauthorizedError,\n} from \"alepha/server\";\nimport { linkOptionsAtom } from \"../atoms/linkOptionsAtom.ts\";\nimport {\n type ApiRegistryResponse,\n apiRegistryResponseSchema,\n} from \"../schemas/apiLinksResponseSchema.ts\";\nimport { BatchCollector } from \"../services/BatchCollector.ts\";\n\n/**\n * Browser, SSR friendly, service to handle links.\n */\nexport class LinkProvider {\n static path = {\n apiLinks: \"/api/_links\",\n };\n\n protected readonly log = $logger();\n protected readonly alepha = $inject(Alepha);\n protected readonly httpClient = $inject(HttpClient);\n\n // Server-side: all registered links (local + remote), keyed by name\n protected serverLinkMap = new Map<string, HttpClientLink>();\n\n // Browser/SSR: parsed from the registry response\n protected actionMap = new Map<string, HttpClientLink>();\n protected permissions = new Set<string>();\n protected lastLoadedRegistry: ApiRegistryResponse | null = null;\n\n // Browser-only: batch collector for coalescing multiple calls\n protected batchCollector?: BatchCollector;\n\n protected readonly options = $state(linkOptionsAtom);\n\n /**\n * Get applicative links registered on the server.\n * This does not include lazy-loaded remote links.\n */\n public getServerLinks(): HttpClientLink[] {\n if (this.alepha.isBrowser()) {\n this.log.warn(\n \"Getting server links in the browser is not supported. Use `fetchLinks` to get links from the server.\",\n );\n return [];\n }\n\n return [...this.serverLinkMap.values()];\n }\n\n /**\n * Register a new link for the application.\n */\n public registerLink(link: HttpClientLink): void {\n if (this.alepha.isBrowser()) {\n this.log.warn(\n \"Registering links in the browser is not supported. Use `fetchLinks` to get links from the server.\",\n );\n return;\n }\n\n if (!link.handler && !link.host) {\n throw new AlephaError(\n \"Can't create link - 'handler' or 'host' is required\",\n );\n }\n\n // Detect duplicate local actions (programming error)\n const existing = this.serverLinkMap.get(link.name);\n if (existing?.handler && link.handler) {\n throw new AlephaError(\n `Duplicate action name \"${link.name}\". Each action must have a unique name.`,\n );\n }\n\n this.serverLinkMap.set(link.name, link);\n }\n\n /**\n * Load the registry response into internal stores (actionMap, permissions, definitions).\n * Called when storing from atom/fetch/SSR.\n */\n protected loadRegistry(registry: ApiRegistryResponse): void {\n this.lastLoadedRegistry = registry;\n this.permissions.clear();\n this.actionMap.clear();\n\n for (const [name, action] of Object.entries(registry.actions)) {\n this.actionMap.set(name, {\n name,\n path: action.path,\n kind: action.kind,\n method: action.method,\n contentType: action.contentType,\n service: action.service,\n });\n }\n\n if (registry.permissions) {\n for (const p of registry.permissions) {\n this.permissions.add(p);\n }\n }\n }\n\n public get links(): HttpClientLink[] {\n const registry = this.alepha.store.get(\"alepha.server.request.apiLinks\");\n\n if (registry) {\n if (this.alepha.isBrowser()) {\n // Browser side: use the parsed action map\n // Reload when registry changes (e.g. after login provides new authenticated links)\n if (this.actionMap.size === 0 || registry !== this.lastLoadedRegistry) {\n this.loadRegistry(registry);\n }\n return [...this.actionMap.values()];\n }\n\n // SSR side: map registry actions back to full server links\n const links: HttpClientLink[] = [];\n for (const name of Object.keys(registry.actions)) {\n const originalLink = this.serverLinkMap.get(name);\n if (originalLink) {\n links.push(originalLink);\n }\n }\n return links;\n }\n\n return [...this.serverLinkMap.values()];\n }\n\n /**\n * Force browser to refresh links from the server.\n */\n public async fetchLinks(): Promise<HttpClientLink[]> {\n const { data } = await this.httpClient.fetch(\n `${LinkProvider.path.apiLinks}`,\n {\n method: \"GET\",\n schema: {\n response: apiRegistryResponseSchema,\n },\n },\n );\n\n this.alepha.store.set(\"alepha.server.request.apiLinks\", data);\n this.loadRegistry(data);\n\n return [...this.actionMap.values()];\n }\n\n /**\n * Create a virtual client that can be used to call actions.\n *\n * Use js Proxy under the hood.\n */\n public client<T extends object>(\n scope: ClientScope = {},\n ): HttpVirtualClient<T> {\n return new Proxy<HttpVirtualClient<T>>({} as HttpVirtualClient<T>, {\n get: (_, prop) => {\n if (typeof prop !== \"string\") {\n return;\n }\n\n return this.createVirtualAction<RequestConfigSchema>(prop, scope);\n },\n });\n }\n\n /**\n * Check if a link with the given name exists or a permission matches.\n *\n * Action names never contain colons. Permission names always do.\n * - `can(\"getUsers\")` → O(1) map lookup\n * - `can(\"admin:*\")` → wildcard match against permissions set\n * - `can(\"admin:user:read\")` → O(1) set lookup\n */\n public can(name: string): boolean {\n // Action check — O(1) map lookup\n if (this.actionMap.size > 0) {\n if (this.actionMap.has(name)) return true;\n } else {\n // Fallback for server-side where actionMap may not be populated\n if (this.serverLinkMap.has(name)) return true;\n // Also check links getter (for SSR with atom)\n if (this.links.some((link) => link.name === name)) return true;\n }\n\n // Permission check — wildcard matching\n if (name.includes(\":\")) {\n if (name.endsWith(\"*\")) {\n const prefix = name.slice(0, -1);\n for (const p of this.permissions) {\n if (p.startsWith(prefix)) return true;\n }\n return false;\n }\n return this.permissions.has(name);\n }\n\n return false;\n }\n\n /**\n * Resolve a link by its name and call it.\n * - If link is local, it will call the local handler.\n * - If link is remote, it will make a fetch request to the remote server.\n */\n public async follow(\n name: string,\n config: Partial<ServerRequestConfigEntry> = {},\n options: ClientRequestOptions & ClientScope = {},\n ): Promise<any> {\n this.log.trace(\"Following link\", { name, config, options });\n const link = await this.getLinkByName(name, options);\n\n // if a handler is defined, use it (ssr)\n if (link.handler && !options.request) {\n this.log.trace(\"Local link found\", { name });\n return link.handler(\n {\n method: link.method,\n url: new URL(`http://localhost${link.path}`),\n query: config.query ?? {},\n body: config.body ?? {},\n params: config.params ?? {},\n headers: config.headers ?? {},\n metadata: {},\n reply: new ServerReply(),\n } as Partial<ServerRequest> as ServerRequest,\n options,\n );\n }\n\n this.log.trace(\"Remote link found\", {\n name,\n host: link.host,\n service: link.service,\n });\n\n // Browser-only: use batch collector for calls without explicit host\n if (this.options.batch && this.alepha.isBrowser() && !link.host) {\n this.batchCollector ??= this.alepha.inject(BatchCollector);\n return this.batchCollector.add({\n action: name,\n params: config.params as any,\n query: config.query as any,\n body: config.body as any,\n directCall: () =>\n this.followRemote(link, config, options).then((r) => r.data),\n });\n }\n\n return this.followRemote(link, config, options).then(\n (response) => response.data,\n );\n }\n\n protected createVirtualAction<T extends RequestConfigSchema>(\n name: string,\n scope: ClientScope = {},\n ): VirtualAction<T> {\n const $: VirtualAction<T> = async (\n config: any = {},\n options: ClientRequestOptions = {},\n ) => {\n return this.follow(name, config, {\n ...scope,\n ...options,\n });\n };\n\n Object.defineProperty($, \"name\", {\n value: name,\n writable: false,\n });\n\n $.run = async (config: any = {}, options: ClientRequestOptions = {}) => {\n return this.follow(name, config, {\n ...scope,\n ...options,\n });\n };\n\n $.fetch = async (config: any = {}, options: ClientRequestOptions = {}) => {\n const link = await this.getLinkByName(name, scope);\n return this.followRemote(link, config, options);\n };\n\n $.can = () => {\n return this.can(name);\n };\n\n return $;\n }\n\n protected async followRemote(\n link: HttpClientLink,\n config: Partial<ServerRequestConfigEntry> = {},\n options: ClientRequestOptions = {},\n ): Promise<FetchResponse> {\n options.request ??= {};\n options.request.headers = new Headers(options.request.headers);\n\n const als = this.alepha.store.get(\"alepha.http.request\");\n if (als?.headers.authorization) {\n options.request.headers.set(\"authorization\", als.headers.authorization);\n }\n\n const context = this.alepha.context.get(\"context\");\n if (typeof context === \"string\") {\n options.request.headers.set(\"x-request-id\", context);\n }\n\n const action = {\n ...link,\n // schema is not used in the client,\n // we assume that TypeScript will check\n schema: {\n body: t.any(),\n response: t.any(),\n },\n };\n\n // prefix with service when host is not defined (e.g. browser)\n if (!link.host && link.service) {\n action.path = `/${link.service}${action.path}`;\n }\n\n action.path = `${action.prefix ?? \"/api\"}${action.path}`;\n action.prefix = undefined; // prefix is not used in the client\n\n // else, make a request\n return this.httpClient.fetchAction({\n host: link.host,\n config,\n options,\n action: action as any, // schema.body TAny is not accepted\n });\n }\n\n protected async getLinkByName(\n name: string,\n options: ClientScope = {},\n ): Promise<HttpClientLink> {\n if (\n this.alepha.isBrowser() &&\n !this.alepha.store.get(\"alepha.server.request.apiLinks\")\n ) {\n await this.fetchLinks();\n }\n\n const link = this.links.find(\n (a) =>\n a.name === name && (!options.service || options.service === a.service),\n );\n\n if (!link) {\n const error = new UnauthorizedError(`Action ${name} not found.`);\n // mimic http error handling\n await this.alepha.events.emit(\"client:onError\", {\n route: link,\n error,\n });\n throw error;\n }\n\n if (options.hostname) {\n return {\n ...link,\n host: options.hostname,\n };\n }\n\n return link;\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface HttpClientLink {\n name: string;\n path: string;\n method?: string;\n kind?: string;\n contentType?: string;\n service?: string;\n secured?: boolean | SecureOptions;\n prefix?: string;\n group?: string;\n // -- server only --\n host?: string;\n schema?: RequestConfigSchema;\n handler?: (\n request: ServerRequest,\n options: ClientRequestOptions,\n ) => Async<ServerResponseBody>;\n}\n\nexport interface ClientScope {\n service?: string;\n hostname?: string;\n}\n\nexport type HttpVirtualClient<T> = {\n [K in keyof T as T[K] extends ActionPrimitive<RequestConfigSchema>\n ? K\n : never]: T[K] extends ActionPrimitive<infer Schema>\n ? VirtualAction<Schema>\n : never;\n} & {\n [K in keyof T as T[K] extends SsePrimitive<SseConfigSchema>\n ? K\n : never]: T[K] extends SsePrimitive<infer Schema>\n ? VirtualSse<Schema>\n : never;\n};\n\nexport interface VirtualAction<T extends RequestConfigSchema>\n extends Pick<ActionPrimitive<T>, \"name\" | \"run\" | \"fetch\"> {\n (\n config?: ClientRequestEntry<T>,\n opts?: ClientRequestOptions,\n ): Promise<ClientRequestResponse<T>>;\n can: () => boolean;\n}\n\nexport interface VirtualSse<T extends SseConfigSchema> {\n (config?: SseRequestEntry<T>): Promise<SseStream<SseEventData<T>>>;\n name: string;\n can: () => boolean;\n}\n","import { $inject, KIND } from \"alepha\";\nimport {\n type ClientScope,\n type HttpVirtualClient,\n LinkProvider,\n} from \"../providers/LinkProvider.ts\";\n\n/**\n * Create a new client.\n */\nexport const $client = <T extends object>(\n scope?: ClientScope,\n): HttpVirtualClient<T> => {\n return $inject(LinkProvider).client<T>(scope);\n};\n\n$client[KIND] = \"$client\";\n","import { createPrimitive, KIND, Primitive } from \"alepha\";\nimport type { ServiceAccountPrimitive } from \"alepha/security\";\nimport type { ProxyPrimitiveOptions } from \"alepha/server/proxy\";\n\n/**\n * $remote is a primitive that allows you to define remote service access.\n *\n * Use it only when you have 2 or more services that need to communicate with each other.\n *\n * All remote services can be exposed as actions, ... or not.\n *\n * You can add a service account if you want to use a security layer.\n */\nexport const $remote = (options: RemotePrimitiveOptions) => {\n return createPrimitive(RemotePrimitive, options);\n};\n\nexport interface RemotePrimitiveOptions {\n /**\n * The URL of the remote service.\n * You can use a function to generate the URL dynamically.\n * You probably should use $env(env) to get the URL from the environment.\n *\n * @example\n * ```ts\n * import { $remote } from \"alepha/server\";\n * import { $inject, t } from \"alepha\";\n *\n * class App {\n * env = $env(t.object({\n * REMOTE_URL: t.text({default: \"http://localhost:3000\"}),\n * }));\n * remote = $remote({\n * url: this.env.REMOTE_URL,\n * });\n * }\n * ```\n */\n url: string | (() => string);\n\n /**\n * The name of the remote service.\n *\n * @default Member of the class containing the remote service.\n */\n name?: string;\n\n /**\n * If true, all methods of the remote service will be exposed as actions in this context.\n * > Note: Proxy will never use the service account, it just... proxies the request.\n */\n proxy?:\n | boolean\n | Partial<\n ProxyPrimitiveOptions & {\n /**\n * If true, the remote service won't be available internally, only through the proxy.\n */\n noInternal: boolean;\n }\n >;\n\n /**\n * For communication between the server and the remote service with a security layer.\n * This will be used for internal communication and will not be exposed to the client.\n */\n serviceAccount?: ServiceAccountPrimitive;\n}\n\nexport class RemotePrimitive extends Primitive<RemotePrimitiveOptions> {\n public get name(): string {\n return this.options.name ?? this.config.propertyKey;\n }\n}\n\n$remote[KIND] = RemotePrimitive;\n","import { $module } from \"alepha\";\nimport { apiLinksAtom } from \"./atoms/apiLinksAtom.ts\";\nimport { linkOptionsAtom } from \"./atoms/linkOptionsAtom.ts\";\nimport { $client } from \"./primitives/$client.ts\";\nimport { $remote } from \"./primitives/$remote.ts\";\nimport { LinkProvider } from \"./providers/LinkProvider.ts\";\nimport { BatchCollector } from \"./services/BatchCollector.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./atoms/apiLinksAtom.ts\";\nexport * from \"./atoms/linkOptionsAtom.ts\";\nexport * from \"./primitives/$client.ts\";\nexport * from \"./primitives/$remote.ts\";\nexport * from \"./providers/LinkProvider.ts\";\nexport * from \"./schemas/apiLinksResponseSchema.ts\";\nexport * from \"./services/BatchCollector.ts\";\n\n// ---------------------------------------------------------------- -----------------------------------------------------\n\nexport const AlephaServerLinks = $module({\n name: \"alepha.server.links\",\n atoms: [apiLinksAtom, linkOptionsAtom],\n primitives: [$remote, $client],\n services: [LinkProvider, BatchCollector],\n});\n"],"mappings":";;;;AAGA,MAAa,kBAAkB,EAAE,OAAO;CACtC,MAAM,EAAE,KAAK,EACX,aAAa,uCACd,CAAC;CAEF,QAAQ,EAAE,SACR,EAAE,KAAK,EACL,aACE,oEACH,CAAC,CACH;CAED,aAAa,EAAE,SACb,EAAE,KAAK,EACL,aACE,+IACH,CAAC,CACH;CAED,MAAM,EAAE,SACN,EAAE,KAAK,EACL,aACE,sGACH,CAAC,CACH;CAED,SAAS,EAAE,SACT,EAAE,KAAK,EACL,aACE,oFACH,CAAC,CACH;CACF,CAAC;AAEF,MAAa,4BAA4B,EAAE,OAAO;CAChD,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC;CAE5B,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,gBAAgB;CAE5C,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CAC3C,CAAC;;;;AAQF,MAAa,yBAAyB;;;AChDtC,MAAa,eAAe,MAAM;CAChC,MAAM;CACN,QAAQ,EAAE,SAAS,0BAA0B;CAC9C,CAAC;;;ACJF,MAAa,kBAAkB,MAAM;CACnC,MAAM;CACN,aAAa;CACb,QAAQ,EAAE,OAAO,EACf,OAAO,EAAE,QAAQ;EACf,aAAa;EACb,SAAS;EACV,CAAC,EACH,CAAC;CACF,SAAS,EACP,OAAO,MACR;CACF,CAAC;;;;;;;;;;;;;;ACCF,IAAa,iBAAb,MAAa,eAAe;CAC1B,OAA0B,iBAAiB;CAE3C,MAAyB,SAAS;CAClC,aAAgC,QAAQ,WAAW;CAEnD,UAAyC,EAAE;CAC3C,YAAsB;;;;CAKtB,IAAW,OAAiC;EAC1C,OAAO,IAAI,SAAS,SAAS,WAAW;GACtC,KAAK,QAAQ,KAAK;IAAE;IAAO;IAAS;IAAQ,CAAC;GAE7C,IAAI,CAAC,KAAK,WAAW;IACnB,KAAK,YAAY;IACjB,iBAAiB;KACf,KAAK,YAAY;KACjB,KAAK,OAAO,CAAC,OAAO,QAAQ,KAAK,IAAI,MAAM,IAAI,CAAC;OAC/C,GAAG;;IAER;;CAGJ,MAAgB,QAAuB;EACrC,MAAM,QAAQ,KAAK,QAAQ,OAAO,EAAE;EAEpC,IAAI,MAAM,WAAW,GAAG;EAKxB,MAAM,gBAAqC,EAAE;EAC7C,MAAM,YAAiC,EAAE;EACzC,KAAK,MAAM,QAAQ,OACjB,IAAI,KAAK,cAAc,KAAK,MAAM,KAAK,EACrC,cAAc,KAAK,KAAK;OAExB,UAAU,KAAK,KAAK;EAGxB,KAAK,MAAM,QAAQ,eACjB,KAAU,MACP,YAAY,CACZ,MAAM,MAAM,KAAK,QAAQ,EAAE,CAAC,CAC5B,OAAO,MAAM,KAAK,OAAO,EAAE,CAAC;EAGjC,IAAI,UAAU,WAAW,GAAG;EAG5B,IAAI,UAAU,WAAW,GAAG;GAC1B,MAAM,OAAO,UAAU;GACvB,IAAI;IACF,MAAM,SAAS,MAAM,KAAK,MAAM,YAAY;IAC5C,KAAK,QAAQ,OAAO;YACb,OAAO;IACd,KAAK,OAAO,MAAM;;GAEpB;;EAIF,MAAM,SAAS;EACf,MAAM,KAAK,GAAG,UAAU;EAGxB,MAAM,EAAE,QAAQ,aAAa,KAAK,OAAO,MAAM;EAG/C,MAAM,SAAS,KAAK,MAAM,QAAQ,eAAe,eAAe;EAEhE,IAAI;GACF,MAAM,cACJ,MAAM,QAAQ,IACZ,OAAO,KAAK,UAAU;IACpB,MAAM,UAAU,CAAC,GAAG,IAAI,IAAI,MAAM,KAAK,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,KAC7D,IACD;IAED,OAAO,KAAK,WACT,MAAM,uBAAuB,WAAW;KACvC,QAAQ;KACR,SAAS,EAAE,gBAAgB,oBAAoB;KAC/C,MAAM,KAAK,UACT,MAAM,KAAK,OAAO;MAChB,QAAQ,EAAE,MAAM;MAChB,QAAQ,EAAE,MAAM;MAChB,OAAO,EAAE,MAAM;MACf,MAAM,EAAE,MAAM;MACf,EAAE,CACJ;KACF,CAAC,CACD,MAAM,QAAQ,IAAI,KAAwB;KAC7C,CACH,EACD,MAAM;GAGR,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;IACrC,MAAM,SAAS,WAAW,SAAS;IACnC,IAAI,OAAO,UAAU,KACnB,MAAM,GAAG,OACP,IAAI,UAAU;KACZ,SACE,OAAO,SAAS,GAAG,OAAO,OAAO,WAAW,OAAO,OAAO;KAC5D,QAAQ,OAAO;KAChB,CAAC,CACH;SAED,MAAM,GAAG,QAAQ,OAAO,KAAK;;WAG1B,OAAO;GAEd,KAAK,MAAM,QAAQ,OACjB,KAAK,OAAO,MAAM;;;CAKxB,OAAiB,OAGf;EACA,MAAM,uBAAO,IAAI,KAAqB;EACtC,MAAM,SAA8B,EAAE;EACtC,MAAM,WAAqB,EAAE;EAE7B,KAAK,MAAM,QAAQ,OAAO;GACxB,MAAM,MAAM,GAAG,KAAK,MAAM,OAAO,GAAG,KAAK,UAAU;IACjD,QAAQ,KAAK,MAAM;IACnB,OAAO,KAAK,MAAM;IAClB,MAAM,KAAK,MAAM;IAClB,CAAC;GAEF,MAAM,WAAW,KAAK,IAAI,IAAI;GAC9B,IAAI,aAAa,KAAA,GACf,SAAS,KAAK,SAAS;QAClB;IACL,MAAM,MAAM,OAAO;IACnB,KAAK,IAAI,KAAK,IAAI;IAClB,OAAO,KAAK,KAAK;IACjB,SAAS,KAAK,IAAI;;;EAItB,OAAO;GAAE;GAAQ;GAAU;;CAG7B,cAAwB,MAAwB;EAC9C,IAAI,CAAC,QAAQ,OAAO,SAAS,UAAU,OAAO;EAC9C,KAAK,MAAM,KAAK,OAAO,OAAO,KAAgC,EAAE;GAC9D,IAAI,OAAO,SAAS,eAAe,aAAa,MAAM,OAAO;GAC7D,IAAI,OAAO,SAAS,eAAe,aAAa,MAAM,OAAO;;EAE/D,OAAO;;CAGT,MAAmB,KAAU,MAAqB;EAChD,MAAM,SAAgB,EAAE;EACxB,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK,MACnC,OAAO,KAAK,IAAI,MAAM,GAAG,IAAI,KAAK,CAAC;EAErC,OAAO;;;;;;;;ACrJX,IAAa,eAAb,MAAa,aAAa;CACxB,OAAO,OAAO,EACZ,UAAU,eACX;CAED,MAAyB,SAAS;CAClC,SAA4B,QAAQ,OAAO;CAC3C,aAAgC,QAAQ,WAAW;CAGnD,gCAA0B,IAAI,KAA6B;CAG3D,4BAAsB,IAAI,KAA6B;CACvD,8BAAwB,IAAI,KAAa;CACzC,qBAA2D;CAG3D;CAEA,UAA6B,OAAO,gBAAgB;;;;;CAMpD,iBAA0C;EACxC,IAAI,KAAK,OAAO,WAAW,EAAE;GAC3B,KAAK,IAAI,KACP,uGACD;GACD,OAAO,EAAE;;EAGX,OAAO,CAAC,GAAG,KAAK,cAAc,QAAQ,CAAC;;;;;CAMzC,aAAoB,MAA4B;EAC9C,IAAI,KAAK,OAAO,WAAW,EAAE;GAC3B,KAAK,IAAI,KACP,oGACD;GACD;;EAGF,IAAI,CAAC,KAAK,WAAW,CAAC,KAAK,MACzB,MAAM,IAAI,YACR,sDACD;EAKH,IADiB,KAAK,cAAc,IAAI,KAAK,KACjC,EAAE,WAAW,KAAK,SAC5B,MAAM,IAAI,YACR,0BAA0B,KAAK,KAAK,yCACrC;EAGH,KAAK,cAAc,IAAI,KAAK,MAAM,KAAK;;;;;;CAOzC,aAAuB,UAAqC;EAC1D,KAAK,qBAAqB;EAC1B,KAAK,YAAY,OAAO;EACxB,KAAK,UAAU,OAAO;EAEtB,KAAK,MAAM,CAAC,MAAM,WAAW,OAAO,QAAQ,SAAS,QAAQ,EAC3D,KAAK,UAAU,IAAI,MAAM;GACvB;GACA,MAAM,OAAO;GACb,MAAM,OAAO;GACb,QAAQ,OAAO;GACf,aAAa,OAAO;GACpB,SAAS,OAAO;GACjB,CAAC;EAGJ,IAAI,SAAS,aACX,KAAK,MAAM,KAAK,SAAS,aACvB,KAAK,YAAY,IAAI,EAAE;;CAK7B,IAAW,QAA0B;EACnC,MAAM,WAAW,KAAK,OAAO,MAAM,IAAI,iCAAiC;EAExE,IAAI,UAAU;GACZ,IAAI,KAAK,OAAO,WAAW,EAAE;IAG3B,IAAI,KAAK,UAAU,SAAS,KAAK,aAAa,KAAK,oBACjD,KAAK,aAAa,SAAS;IAE7B,OAAO,CAAC,GAAG,KAAK,UAAU,QAAQ,CAAC;;GAIrC,MAAM,QAA0B,EAAE;GAClC,KAAK,MAAM,QAAQ,OAAO,KAAK,SAAS,QAAQ,EAAE;IAChD,MAAM,eAAe,KAAK,cAAc,IAAI,KAAK;IACjD,IAAI,cACF,MAAM,KAAK,aAAa;;GAG5B,OAAO;;EAGT,OAAO,CAAC,GAAG,KAAK,cAAc,QAAQ,CAAC;;;;;CAMzC,MAAa,aAAwC;EACnD,MAAM,EAAE,SAAS,MAAM,KAAK,WAAW,MACrC,GAAG,aAAa,KAAK,YACrB;GACE,QAAQ;GACR,QAAQ,EACN,UAAU,2BACX;GACF,CACF;EAED,KAAK,OAAO,MAAM,IAAI,kCAAkC,KAAK;EAC7D,KAAK,aAAa,KAAK;EAEvB,OAAO,CAAC,GAAG,KAAK,UAAU,QAAQ,CAAC;;;;;;;CAQrC,OACE,QAAqB,EAAE,EACD;EACtB,OAAO,IAAI,MAA4B,EAAE,EAA0B,EACjE,MAAM,GAAG,SAAS;GAChB,IAAI,OAAO,SAAS,UAClB;GAGF,OAAO,KAAK,oBAAyC,MAAM,MAAM;KAEpE,CAAC;;;;;;;;;;CAWJ,IAAW,MAAuB;EAEhC,IAAI,KAAK,UAAU,OAAO;OACpB,KAAK,UAAU,IAAI,KAAK,EAAE,OAAO;SAChC;GAEL,IAAI,KAAK,cAAc,IAAI,KAAK,EAAE,OAAO;GAEzC,IAAI,KAAK,MAAM,MAAM,SAAS,KAAK,SAAS,KAAK,EAAE,OAAO;;EAI5D,IAAI,KAAK,SAAS,IAAI,EAAE;GACtB,IAAI,KAAK,SAAS,IAAI,EAAE;IACtB,MAAM,SAAS,KAAK,MAAM,GAAG,GAAG;IAChC,KAAK,MAAM,KAAK,KAAK,aACnB,IAAI,EAAE,WAAW,OAAO,EAAE,OAAO;IAEnC,OAAO;;GAET,OAAO,KAAK,YAAY,IAAI,KAAK;;EAGnC,OAAO;;;;;;;CAQT,MAAa,OACX,MACA,SAA4C,EAAE,EAC9C,UAA8C,EAAE,EAClC;EACd,KAAK,IAAI,MAAM,kBAAkB;GAAE;GAAM;GAAQ;GAAS,CAAC;EAC3D,MAAM,OAAO,MAAM,KAAK,cAAc,MAAM,QAAQ;EAGpD,IAAI,KAAK,WAAW,CAAC,QAAQ,SAAS;GACpC,KAAK,IAAI,MAAM,oBAAoB,EAAE,MAAM,CAAC;GAC5C,OAAO,KAAK,QACV;IACE,QAAQ,KAAK;IACb,KAAK,IAAI,IAAI,mBAAmB,KAAK,OAAO;IAC5C,OAAO,OAAO,SAAS,EAAE;IACzB,MAAM,OAAO,QAAQ,EAAE;IACvB,QAAQ,OAAO,UAAU,EAAE;IAC3B,SAAS,OAAO,WAAW,EAAE;IAC7B,UAAU,EAAE;IACZ,OAAO,IAAI,aAAa;IACzB,EACD,QACD;;EAGH,KAAK,IAAI,MAAM,qBAAqB;GAClC;GACA,MAAM,KAAK;GACX,SAAS,KAAK;GACf,CAAC;EAGF,IAAI,KAAK,QAAQ,SAAS,KAAK,OAAO,WAAW,IAAI,CAAC,KAAK,MAAM;GAC/D,KAAK,mBAAmB,KAAK,OAAO,OAAO,eAAe;GAC1D,OAAO,KAAK,eAAe,IAAI;IAC7B,QAAQ;IACR,QAAQ,OAAO;IACf,OAAO,OAAO;IACd,MAAM,OAAO;IACb,kBACE,KAAK,aAAa,MAAM,QAAQ,QAAQ,CAAC,MAAM,MAAM,EAAE,KAAK;IAC/D,CAAC;;EAGJ,OAAO,KAAK,aAAa,MAAM,QAAQ,QAAQ,CAAC,MAC7C,aAAa,SAAS,KACxB;;CAGH,oBACE,MACA,QAAqB,EAAE,EACL;EAClB,MAAM,IAAsB,OAC1B,SAAc,EAAE,EAChB,UAAgC,EAAE,KAC/B;GACH,OAAO,KAAK,OAAO,MAAM,QAAQ;IAC/B,GAAG;IACH,GAAG;IACJ,CAAC;;EAGJ,OAAO,eAAe,GAAG,QAAQ;GAC/B,OAAO;GACP,UAAU;GACX,CAAC;EAEF,EAAE,MAAM,OAAO,SAAc,EAAE,EAAE,UAAgC,EAAE,KAAK;GACtE,OAAO,KAAK,OAAO,MAAM,QAAQ;IAC/B,GAAG;IACH,GAAG;IACJ,CAAC;;EAGJ,EAAE,QAAQ,OAAO,SAAc,EAAE,EAAE,UAAgC,EAAE,KAAK;GACxE,MAAM,OAAO,MAAM,KAAK,cAAc,MAAM,MAAM;GAClD,OAAO,KAAK,aAAa,MAAM,QAAQ,QAAQ;;EAGjD,EAAE,YAAY;GACZ,OAAO,KAAK,IAAI,KAAK;;EAGvB,OAAO;;CAGT,MAAgB,aACd,MACA,SAA4C,EAAE,EAC9C,UAAgC,EAAE,EACV;EACxB,QAAQ,YAAY,EAAE;EACtB,QAAQ,QAAQ,UAAU,IAAI,QAAQ,QAAQ,QAAQ,QAAQ;EAE9D,MAAM,MAAM,KAAK,OAAO,MAAM,IAAI,sBAAsB;EACxD,IAAI,KAAK,QAAQ,eACf,QAAQ,QAAQ,QAAQ,IAAI,iBAAiB,IAAI,QAAQ,cAAc;EAGzE,MAAM,UAAU,KAAK,OAAO,QAAQ,IAAI,UAAU;EAClD,IAAI,OAAO,YAAY,UACrB,QAAQ,QAAQ,QAAQ,IAAI,gBAAgB,QAAQ;EAGtD,MAAM,SAAS;GACb,GAAG;GAGH,QAAQ;IACN,MAAM,EAAE,KAAK;IACb,UAAU,EAAE,KAAK;IAClB;GACF;EAGD,IAAI,CAAC,KAAK,QAAQ,KAAK,SACrB,OAAO,OAAO,IAAI,KAAK,UAAU,OAAO;EAG1C,OAAO,OAAO,GAAG,OAAO,UAAU,SAAS,OAAO;EAClD,OAAO,SAAS,KAAA;EAGhB,OAAO,KAAK,WAAW,YAAY;GACjC,MAAM,KAAK;GACX;GACA;GACQ;GACT,CAAC;;CAGJ,MAAgB,cACd,MACA,UAAuB,EAAE,EACA;EACzB,IACE,KAAK,OAAO,WAAW,IACvB,CAAC,KAAK,OAAO,MAAM,IAAI,iCAAiC,EAExD,MAAM,KAAK,YAAY;EAGzB,MAAM,OAAO,KAAK,MAAM,MACrB,MACC,EAAE,SAAS,SAAS,CAAC,QAAQ,WAAW,QAAQ,YAAY,EAAE,SACjE;EAED,IAAI,CAAC,MAAM;GACT,MAAM,QAAQ,IAAI,kBAAkB,UAAU,KAAK,aAAa;GAEhE,MAAM,KAAK,OAAO,OAAO,KAAK,kBAAkB;IAC9C,OAAO;IACP;IACD,CAAC;GACF,MAAM;;EAGR,IAAI,QAAQ,UACV,OAAO;GACL,GAAG;GACH,MAAM,QAAQ;GACf;EAGH,OAAO;;;;;;;;ACjYX,MAAa,WACX,UACyB;CACzB,OAAO,QAAQ,aAAa,CAAC,OAAU,MAAM;;AAG/C,QAAQ,QAAQ;;;;;;;;;;;;ACHhB,MAAa,WAAW,YAAoC;CAC1D,OAAO,gBAAgB,iBAAiB,QAAQ;;AAuDlD,IAAa,kBAAb,cAAqC,UAAkC;CACrE,IAAW,OAAe;EACxB,OAAO,KAAK,QAAQ,QAAQ,KAAK,OAAO;;;AAI5C,QAAQ,QAAQ;;;ACvDhB,MAAa,oBAAoB,QAAQ;CACvC,MAAM;CACN,OAAO,CAAC,cAAc,gBAAgB;CACtC,YAAY,CAAC,SAAS,QAAQ;CAC9B,UAAU,CAAC,cAAc,eAAe;CACzC,CAAC"}
1
+ {"version":3,"file":"index.browser.js","names":[],"sources":["../../../src/server/links/schemas/apiLinksResponseSchema.ts","../../../src/server/links/atoms/apiLinksAtom.ts","../../../src/server/links/atoms/linkOptionsAtom.ts","../../../src/server/links/services/BatchCollector.ts","../../../src/server/links/providers/LinkProvider.ts","../../../src/server/links/primitives/$client.ts","../../../src/server/links/primitives/$remote.ts","../../../src/server/links/index.browser.ts"],"sourcesContent":["import type { Static } from \"alepha\";\nimport { t } from \"alepha\";\n\nexport const apiActionSchema = t.object({\n path: t.text({\n description: \"Pathname used to access the action.\",\n }),\n\n method: t.optional(\n t.text({\n description:\n \"HTTP method. Omitted when GET (the default for ~75% of actions).\",\n }),\n ),\n\n contentType: t.optional(\n t.text({\n description:\n \"Content type for the request body. Only present for non-JSON types (e.g. 'multipart/form-data'). When absent, defaults to application/json.\",\n }),\n ),\n\n kind: t.optional(\n t.text({\n description:\n \"Action kind. Used to distinguish special action types (e.g. 'sse' for Server-Sent Events streams).\",\n }),\n ),\n\n service: t.optional(\n t.text({\n description:\n \"Service name associated with the action, used for service discovery and routing.\",\n }),\n ),\n});\n\nexport const apiRegistryResponseSchema = t.object({\n prefix: t.optional(t.text()),\n\n actions: t.record(t.text(), apiActionSchema),\n\n permissions: t.optional(t.array(t.text())),\n});\n\nexport type ApiRegistryResponse = Static<typeof apiRegistryResponseSchema>;\nexport type ApiAction = Static<typeof apiActionSchema>;\n\n/**\n * @deprecated Use `apiRegistryResponseSchema` and `ApiRegistryResponse` instead.\n */\nexport const apiLinksResponseSchema = apiRegistryResponseSchema;\n\n/**\n * @deprecated Use `ApiRegistryResponse` instead.\n */\nexport type ApiLinksResponse = ApiRegistryResponse;\n\n/**\n * @deprecated Use `ApiAction` instead.\n */\nexport type ApiLink = ApiAction;\n","import { $atom, t } from \"alepha\";\nimport { apiRegistryResponseSchema } from \"../schemas/apiLinksResponseSchema.ts\";\n\nexport const apiLinksAtom = $atom({\n name: \"alepha.server.request.apiLinks\",\n schema: t.optional(apiRegistryResponseSchema),\n});\n","import { $atom, t } from \"alepha\";\n\nexport const linkOptionsAtom = $atom({\n name: \"alepha.server.links.options\",\n description: \"Configuration options for the links module.\",\n schema: t.object({\n batch: t.boolean({\n description: \"Enable batch collection for browser-side calls.\",\n default: true,\n }),\n }),\n default: {\n batch: true,\n },\n});\n","import { $inject } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport { HttpClient, HttpError } from \"alepha/server\";\n\n/**\n * Collects browser-side action calls within a microtask and\n * sends them as a single `POST /api/_batch` request.\n *\n * Key behaviors:\n * - Single call in the window → direct HTTP call (no batch overhead)\n * - Multiple calls → coalesced into one batch request\n * - Same action + same params/query/body → deduplicated, result shared\n * - Exceeding MAX_BATCH_SIZE → split into multiple batch calls\n * - Transport failure → all pending promises reject\n */\nexport class BatchCollector {\n protected static readonly MAX_BATCH_SIZE = 20;\n\n protected readonly log = $logger();\n protected readonly httpClient = $inject(HttpClient);\n\n protected pending: PendingBatchEntry[] = [];\n protected scheduled = false;\n\n /**\n * Add an action call to the batch. Returns the result when the batch resolves.\n */\n public add(entry: BatchEntry): Promise<any> {\n return new Promise((resolve, reject) => {\n this.pending.push({ entry, resolve, reject });\n\n if (!this.scheduled) {\n this.scheduled = true;\n setTimeout(() => {\n this.scheduled = false;\n this.flush().catch((err) => this.log.error(err));\n }, 10);\n }\n });\n }\n\n protected async flush(): Promise<void> {\n const batch = this.pending.splice(0);\n\n if (batch.length === 0) return;\n\n // Entries with a binary body (File/Blob) can't survive JSON-stringify, so\n // they must bypass the batch endpoint and use their direct (multipart)\n // call instead.\n const binaryEntries: PendingBatchEntry[] = [];\n const remaining: PendingBatchEntry[] = [];\n for (const item of batch) {\n if (this.hasBinaryBody(item.entry.body)) {\n binaryEntries.push(item);\n } else {\n remaining.push(item);\n }\n }\n for (const item of binaryEntries) {\n void item.entry\n .directCall()\n .then((r) => item.resolve(r))\n .catch((e) => item.reject(e));\n }\n\n if (remaining.length === 0) return;\n\n // Single request — skip batching, call directly via follow\n if (remaining.length === 1) {\n const item = remaining[0];\n try {\n const result = await item.entry.directCall();\n item.resolve(result);\n } catch (error) {\n item.reject(error);\n }\n return;\n }\n\n // Reassign so the rest of the function works on the filtered set.\n batch.length = 0;\n batch.push(...remaining);\n\n // Deduplicate: same action + same params → share result\n const { unique, indexMap } = this.dedupe(batch);\n\n // Split into chunks of MAX_BATCH_SIZE\n const chunks = this.chunk(unique, BatchCollector.MAX_BATCH_SIZE);\n\n try {\n const allResults = (\n await Promise.all(\n chunks.map((chunk) => {\n const actions = [...new Set(chunk.map((b) => b.entry.action))].join(\n \",\",\n );\n\n return this.httpClient\n .fetch(`/api/_batch?actions=${actions}`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(\n chunk.map((b) => ({\n action: b.entry.action,\n params: b.entry.params,\n query: b.entry.query,\n body: b.entry.body,\n })),\n ),\n })\n .then((res) => res.data as BatchResponse[]);\n }),\n )\n ).flat();\n\n // Distribute results back (including deduped slots)\n for (let i = 0; i < batch.length; i++) {\n const result = allResults[indexMap[i]];\n if (result.status >= 400) {\n batch[i].reject(\n new HttpError({\n message:\n result.error ?? `${result.action} failed (${result.status})`,\n status: result.status,\n }),\n );\n } else {\n batch[i].resolve(result.data);\n }\n }\n } catch (error) {\n // Transport-level failure — reject all pending promises\n for (const item of batch) {\n item.reject(error);\n }\n }\n }\n\n protected dedupe(batch: PendingBatchEntry[]): {\n unique: PendingBatchEntry[];\n indexMap: number[];\n } {\n const seen = new Map<string, number>();\n const unique: PendingBatchEntry[] = [];\n const indexMap: number[] = [];\n\n for (const item of batch) {\n const key = `${item.entry.action}:${JSON.stringify({\n params: item.entry.params,\n query: item.entry.query,\n body: item.entry.body,\n })}`;\n\n const existing = seen.get(key);\n if (existing !== undefined) {\n indexMap.push(existing);\n } else {\n const idx = unique.length;\n seen.set(key, idx);\n unique.push(item);\n indexMap.push(idx);\n }\n }\n\n return { unique, indexMap };\n }\n\n protected hasBinaryBody(body: unknown): boolean {\n if (!body || typeof body !== \"object\") return false;\n for (const v of Object.values(body as Record<string, unknown>)) {\n if (typeof Blob !== \"undefined\" && v instanceof Blob) return true;\n if (typeof File !== \"undefined\" && v instanceof File) return true;\n }\n return false;\n }\n\n protected chunk<T>(arr: T[], size: number): T[][] {\n const chunks: T[][] = [];\n for (let i = 0; i < arr.length; i += size) {\n chunks.push(arr.slice(i, i + size));\n }\n return chunks;\n }\n}\n\n// ---\n\nexport interface BatchEntry {\n action: string;\n params?: Record<string, any>;\n query?: Record<string, any>;\n body?: Record<string, any>;\n directCall: () => Promise<any>;\n}\n\ninterface PendingBatchEntry {\n entry: BatchEntry;\n resolve: (value: any) => void;\n reject: (reason: any) => void;\n}\n\ninterface BatchResponse {\n action: string;\n status: number;\n data?: any;\n error?: string;\n}\n","import { $inject, $state, Alepha, AlephaError, type Async, t } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport type { SecureOptions } from \"alepha/security\";\nimport {\n type ActionPrimitive,\n type ClientRequestEntry,\n type ClientRequestOptions,\n type ClientRequestResponse,\n type FetchResponse,\n HttpClient,\n type RequestConfigSchema,\n ServerReply,\n type ServerRequest,\n type ServerRequestConfigEntry,\n type ServerResponseBody,\n type SseConfigSchema,\n type SseEventData,\n type SsePrimitive,\n type SseRequestEntry,\n type SseStream,\n UnauthorizedError,\n} from \"alepha/server\";\nimport { linkOptionsAtom } from \"../atoms/linkOptionsAtom.ts\";\nimport {\n type ApiRegistryResponse,\n apiRegistryResponseSchema,\n} from \"../schemas/apiLinksResponseSchema.ts\";\nimport { BatchCollector } from \"../services/BatchCollector.ts\";\n\n/**\n * Browser, SSR friendly, service to handle links.\n */\nexport class LinkProvider {\n static path = {\n apiLinks: \"/api/_links\",\n };\n\n protected readonly log = $logger();\n protected readonly alepha = $inject(Alepha);\n protected readonly httpClient = $inject(HttpClient);\n\n // Server-side: all registered links (local + remote), keyed by name\n protected serverLinkMap = new Map<string, HttpClientLink>();\n\n // Browser/SSR: parsed from the registry response\n protected actionMap = new Map<string, HttpClientLink>();\n protected permissions = new Set<string>();\n protected lastLoadedRegistry: ApiRegistryResponse | null = null;\n\n // Browser-only: batch collector for coalescing multiple calls\n protected batchCollector?: BatchCollector;\n\n protected readonly options = $state(linkOptionsAtom);\n\n /**\n * Get applicative links registered on the server.\n * This does not include lazy-loaded remote links.\n */\n public getServerLinks(): HttpClientLink[] {\n if (this.alepha.isBrowser()) {\n this.log.warn(\n \"Getting server links in the browser is not supported. Use `fetchLinks` to get links from the server.\",\n );\n return [];\n }\n\n return [...this.serverLinkMap.values()];\n }\n\n /**\n * Register a new link for the application.\n */\n public registerLink(link: HttpClientLink): void {\n if (this.alepha.isBrowser()) {\n this.log.warn(\n \"Registering links in the browser is not supported. Use `fetchLinks` to get links from the server.\",\n );\n return;\n }\n\n if (!link.handler && !link.host) {\n throw new AlephaError(\n \"Can't create link - 'handler' or 'host' is required\",\n );\n }\n\n // Detect duplicate local actions (programming error)\n const existing = this.serverLinkMap.get(link.name);\n if (existing?.handler && link.handler) {\n throw new AlephaError(\n `Duplicate action name \"${link.name}\". Each action must have a unique name.`,\n );\n }\n\n this.serverLinkMap.set(link.name, link);\n }\n\n /**\n * Load the registry response into internal stores (actionMap, permissions, definitions).\n * Called when storing from atom/fetch/SSR.\n */\n protected loadRegistry(registry: ApiRegistryResponse): void {\n this.lastLoadedRegistry = registry;\n this.permissions.clear();\n this.actionMap.clear();\n\n for (const [name, action] of Object.entries(registry.actions)) {\n this.actionMap.set(name, {\n name,\n path: action.path,\n kind: action.kind,\n method: action.method,\n contentType: action.contentType,\n service: action.service,\n });\n }\n\n if (registry.permissions) {\n for (const p of registry.permissions) {\n this.permissions.add(p);\n }\n }\n }\n\n public get links(): HttpClientLink[] {\n const registry = this.alepha.store.get(\"alepha.server.request.apiLinks\");\n\n if (registry) {\n if (this.alepha.isBrowser()) {\n // Browser side: use the parsed action map\n // Reload when registry changes (e.g. after login provides new authenticated links)\n if (this.actionMap.size === 0 || registry !== this.lastLoadedRegistry) {\n this.loadRegistry(registry);\n }\n return [...this.actionMap.values()];\n }\n\n // SSR side: map registry actions back to full server links\n const links: HttpClientLink[] = [];\n for (const name of Object.keys(registry.actions)) {\n const originalLink = this.serverLinkMap.get(name);\n if (originalLink) {\n links.push(originalLink);\n }\n }\n return links;\n }\n\n return [...this.serverLinkMap.values()];\n }\n\n /**\n * Force browser to refresh links from the server.\n */\n public async fetchLinks(): Promise<HttpClientLink[]> {\n const { data } = await this.httpClient.fetch(\n `${LinkProvider.path.apiLinks}`,\n {\n method: \"GET\",\n schema: {\n response: apiRegistryResponseSchema,\n },\n },\n );\n\n this.alepha.store.set(\"alepha.server.request.apiLinks\", data);\n this.loadRegistry(data);\n\n return [...this.actionMap.values()];\n }\n\n /**\n * Create a virtual client that can be used to call actions.\n *\n * Use js Proxy under the hood.\n */\n public client<T extends object>(\n scope: ClientScope = {},\n ): HttpVirtualClient<T> {\n return new Proxy<HttpVirtualClient<T>>({} as HttpVirtualClient<T>, {\n get: (_, prop) => {\n if (typeof prop !== \"string\") {\n return;\n }\n\n return this.createVirtualAction<RequestConfigSchema>(prop, scope);\n },\n });\n }\n\n /**\n * Check if a link with the given name exists or a permission matches.\n *\n * Action names never contain colons. Permission names always do.\n * - `can(\"getUsers\")` → O(1) map lookup\n * - `can(\"admin:*\")` → wildcard match against permissions set\n * - `can(\"admin:user:read\")` → O(1) set lookup\n */\n public can(name: string): boolean {\n // Ensure the registry parsed from the store (actions + permissions) is\n // loaded. On SSR the `links` getter only calls `loadRegistry` in the\n // browser branch, so `this.permissions` would otherwise stay empty and\n // every permission check would (wrongly) fail — making `has()`-gated UI\n // render differently on the server than on the client (hydration drift).\n const registry = this.alepha.store.get(\"alepha.server.request.apiLinks\");\n if (registry && registry !== this.lastLoadedRegistry) {\n this.loadRegistry(registry);\n }\n\n // Action check — O(1) map lookup\n if (this.actionMap.size > 0) {\n if (this.actionMap.has(name)) return true;\n } else {\n // Fallback for server-side where actionMap may not be populated\n if (this.serverLinkMap.has(name)) return true;\n // Also check links getter (for SSR with atom)\n if (this.links.some((link) => link.name === name)) return true;\n }\n\n // Permission check — wildcard matching\n if (name.includes(\":\")) {\n if (name.endsWith(\"*\")) {\n const prefix = name.slice(0, -1);\n for (const p of this.permissions) {\n if (p.startsWith(prefix)) return true;\n }\n return false;\n }\n return this.permissions.has(name);\n }\n\n return false;\n }\n\n /**\n * Resolve a link by its name and call it.\n * - If link is local, it will call the local handler.\n * - If link is remote, it will make a fetch request to the remote server.\n */\n public async follow(\n name: string,\n config: Partial<ServerRequestConfigEntry> = {},\n options: ClientRequestOptions & ClientScope = {},\n ): Promise<any> {\n this.log.trace(\"Following link\", { name, config, options });\n const link = await this.getLinkByName(name, options);\n\n // if a handler is defined, use it (ssr)\n if (link.handler && !options.request) {\n this.log.trace(\"Local link found\", { name });\n return link.handler(\n {\n method: link.method,\n url: new URL(`http://localhost${link.path}`),\n query: config.query ?? {},\n body: config.body ?? {},\n params: config.params ?? {},\n headers: config.headers ?? {},\n metadata: {},\n reply: new ServerReply(),\n } as Partial<ServerRequest> as ServerRequest,\n options,\n );\n }\n\n this.log.trace(\"Remote link found\", {\n name,\n host: link.host,\n service: link.service,\n });\n\n // Browser-only: use batch collector for calls without explicit host\n if (this.options.batch && this.alepha.isBrowser() && !link.host) {\n this.batchCollector ??= this.alepha.inject(BatchCollector);\n return this.batchCollector.add({\n action: name,\n params: config.params as any,\n query: config.query as any,\n body: config.body as any,\n directCall: () =>\n this.followRemote(link, config, options).then((r) => r.data),\n });\n }\n\n return this.followRemote(link, config, options).then(\n (response) => response.data,\n );\n }\n\n protected createVirtualAction<T extends RequestConfigSchema>(\n name: string,\n scope: ClientScope = {},\n ): VirtualAction<T> {\n const $: VirtualAction<T> = async (\n config: any = {},\n options: ClientRequestOptions = {},\n ) => {\n return this.follow(name, config, {\n ...scope,\n ...options,\n });\n };\n\n Object.defineProperty($, \"name\", {\n value: name,\n writable: false,\n });\n\n $.run = async (config: any = {}, options: ClientRequestOptions = {}) => {\n return this.follow(name, config, {\n ...scope,\n ...options,\n });\n };\n\n $.fetch = async (config: any = {}, options: ClientRequestOptions = {}) => {\n const link = await this.getLinkByName(name, scope);\n return this.followRemote(link, config, options);\n };\n\n $.can = () => {\n return this.can(name);\n };\n\n return $;\n }\n\n protected async followRemote(\n link: HttpClientLink,\n config: Partial<ServerRequestConfigEntry> = {},\n options: ClientRequestOptions = {},\n ): Promise<FetchResponse> {\n options.request ??= {};\n options.request.headers = new Headers(options.request.headers);\n\n const als = this.alepha.store.get(\"alepha.http.request\");\n if (als?.headers.authorization) {\n options.request.headers.set(\"authorization\", als.headers.authorization);\n }\n\n const context = this.alepha.context.get(\"context\");\n if (typeof context === \"string\") {\n options.request.headers.set(\"x-request-id\", context);\n }\n\n const action = {\n ...link,\n // schema is not used in the client,\n // we assume that TypeScript will check\n schema: {\n body: t.any(),\n response: t.any(),\n },\n };\n\n // prefix with service when host is not defined (e.g. browser)\n if (!link.host && link.service) {\n action.path = `/${link.service}${action.path}`;\n }\n\n action.path = `${action.prefix ?? \"/api\"}${action.path}`;\n action.prefix = undefined; // prefix is not used in the client\n\n // else, make a request\n return this.httpClient.fetchAction({\n host: link.host,\n config,\n options,\n action: action as any, // schema.body TAny is not accepted\n });\n }\n\n protected async getLinkByName(\n name: string,\n options: ClientScope = {},\n ): Promise<HttpClientLink> {\n if (\n this.alepha.isBrowser() &&\n !this.alepha.store.get(\"alepha.server.request.apiLinks\")\n ) {\n await this.fetchLinks();\n }\n\n const link = this.links.find(\n (a) =>\n a.name === name && (!options.service || options.service === a.service),\n );\n\n if (!link) {\n const error = new UnauthorizedError(`Action ${name} not found.`);\n // mimic http error handling\n await this.alepha.events.emit(\"client:onError\", {\n route: link,\n error,\n });\n throw error;\n }\n\n if (options.hostname) {\n return {\n ...link,\n host: options.hostname,\n };\n }\n\n return link;\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface HttpClientLink {\n name: string;\n path: string;\n method?: string;\n kind?: string;\n contentType?: string;\n service?: string;\n secured?: boolean | SecureOptions;\n prefix?: string;\n group?: string;\n // -- server only --\n host?: string;\n schema?: RequestConfigSchema;\n handler?: (\n request: ServerRequest,\n options: ClientRequestOptions,\n ) => Async<ServerResponseBody>;\n}\n\nexport interface ClientScope {\n service?: string;\n hostname?: string;\n}\n\nexport type HttpVirtualClient<T> = {\n [K in keyof T as T[K] extends ActionPrimitive<RequestConfigSchema>\n ? K\n : never]: T[K] extends ActionPrimitive<infer Schema>\n ? VirtualAction<Schema>\n : never;\n} & {\n [K in keyof T as T[K] extends SsePrimitive<SseConfigSchema>\n ? K\n : never]: T[K] extends SsePrimitive<infer Schema>\n ? VirtualSse<Schema>\n : never;\n};\n\nexport interface VirtualAction<T extends RequestConfigSchema>\n extends Pick<ActionPrimitive<T>, \"name\" | \"run\" | \"fetch\"> {\n (\n config?: ClientRequestEntry<T>,\n opts?: ClientRequestOptions,\n ): Promise<ClientRequestResponse<T>>;\n can: () => boolean;\n}\n\nexport interface VirtualSse<T extends SseConfigSchema> {\n (config?: SseRequestEntry<T>): Promise<SseStream<SseEventData<T>>>;\n name: string;\n can: () => boolean;\n}\n","import { $inject, KIND } from \"alepha\";\nimport {\n type ClientScope,\n type HttpVirtualClient,\n LinkProvider,\n} from \"../providers/LinkProvider.ts\";\n\n/**\n * Create a new client.\n */\nexport const $client = <T extends object>(\n scope?: ClientScope,\n): HttpVirtualClient<T> => {\n return $inject(LinkProvider).client<T>(scope);\n};\n\n$client[KIND] = \"$client\";\n","import { createPrimitive, KIND, Primitive } from \"alepha\";\nimport type { ServiceAccountPrimitive } from \"alepha/security\";\nimport type { ProxyPrimitiveOptions } from \"alepha/server/proxy\";\n\n/**\n * $remote is a primitive that allows you to define remote service access.\n *\n * Use it only when you have 2 or more services that need to communicate with each other.\n *\n * All remote services can be exposed as actions, ... or not.\n *\n * You can add a service account if you want to use a security layer.\n */\nexport const $remote = (options: RemotePrimitiveOptions) => {\n return createPrimitive(RemotePrimitive, options);\n};\n\nexport interface RemotePrimitiveOptions {\n /**\n * The URL of the remote service.\n * You can use a function to generate the URL dynamically.\n * You probably should use $env(env) to get the URL from the environment.\n *\n * @example\n * ```ts\n * import { $remote } from \"alepha/server\";\n * import { $inject, t } from \"alepha\";\n *\n * class App {\n * env = $env(t.object({\n * REMOTE_URL: t.text({default: \"http://localhost:3000\"}),\n * }));\n * remote = $remote({\n * url: this.env.REMOTE_URL,\n * });\n * }\n * ```\n */\n url: string | (() => string);\n\n /**\n * The name of the remote service.\n *\n * @default Member of the class containing the remote service.\n */\n name?: string;\n\n /**\n * If true, all methods of the remote service will be exposed as actions in this context.\n * > Note: Proxy will never use the service account, it just... proxies the request.\n */\n proxy?:\n | boolean\n | Partial<\n ProxyPrimitiveOptions & {\n /**\n * If true, the remote service won't be available internally, only through the proxy.\n */\n noInternal: boolean;\n }\n >;\n\n /**\n * For communication between the server and the remote service with a security layer.\n * This will be used for internal communication and will not be exposed to the client.\n */\n serviceAccount?: ServiceAccountPrimitive;\n}\n\nexport class RemotePrimitive extends Primitive<RemotePrimitiveOptions> {\n public get name(): string {\n return this.options.name ?? this.config.propertyKey;\n }\n}\n\n$remote[KIND] = RemotePrimitive;\n","import { $module } from \"alepha\";\nimport { apiLinksAtom } from \"./atoms/apiLinksAtom.ts\";\nimport { linkOptionsAtom } from \"./atoms/linkOptionsAtom.ts\";\nimport { $client } from \"./primitives/$client.ts\";\nimport { $remote } from \"./primitives/$remote.ts\";\nimport { LinkProvider } from \"./providers/LinkProvider.ts\";\nimport { BatchCollector } from \"./services/BatchCollector.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./atoms/apiLinksAtom.ts\";\nexport * from \"./atoms/linkOptionsAtom.ts\";\nexport * from \"./primitives/$client.ts\";\nexport * from \"./primitives/$remote.ts\";\nexport * from \"./providers/LinkProvider.ts\";\nexport * from \"./schemas/apiLinksResponseSchema.ts\";\nexport * from \"./services/BatchCollector.ts\";\n\n// ---------------------------------------------------------------- -----------------------------------------------------\n\nexport const AlephaServerLinks = $module({\n name: \"alepha.server.links\",\n atoms: [apiLinksAtom, linkOptionsAtom],\n primitives: [$remote, $client],\n services: [LinkProvider, BatchCollector],\n});\n"],"mappings":"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"}
@@ -1,46 +1,42 @@
1
- import * as _$alepha from "alepha";
2
1
  import { Alepha, Async, KIND, Primitive, Static } from "alepha";
3
- import * as _$alepha_server0 from "alepha/server";
4
2
  import { ActionPrimitive, ClientRequestEntry, ClientRequestOptions, ClientRequestResponse, FetchResponse, HttpClient, RequestConfigSchema, ServerRequest, ServerRequestConfigEntry, ServerResponseBody, ServerTimingProvider, SseConfigSchema, SseEventData, SsePrimitive, SseRequestEntry, SseStream } from "alepha/server";
5
- import * as _$alepha_logger0 from "alepha/logger";
6
3
  import { ProxyPrimitiveOptions, ServerProxyProvider } from "alepha/server/proxy";
7
- import * as _$typebox from "typebox";
8
4
  import { SecureOptions, SecurityProvider, ServiceAccountPrimitive, UserAccountToken } from "alepha/security";
9
5
 
10
6
  //#region ../../src/server/links/schemas/apiLinksResponseSchema.d.ts
11
- declare const apiActionSchema: _$typebox.TObject<{
12
- path: _$typebox.TString;
13
- method: _$typebox.TOptional<_$typebox.TString>;
14
- contentType: _$typebox.TOptional<_$typebox.TString>;
15
- kind: _$typebox.TOptional<_$typebox.TString>;
16
- service: _$typebox.TOptional<_$typebox.TString>;
7
+ declare const apiActionSchema: import("typebox").TObject<{
8
+ path: import("typebox").TString;
9
+ method: import("typebox").TOptional<import("typebox").TString>;
10
+ contentType: import("typebox").TOptional<import("typebox").TString>;
11
+ kind: import("typebox").TOptional<import("typebox").TString>;
12
+ service: import("typebox").TOptional<import("typebox").TString>;
17
13
  }>;
18
- declare const apiRegistryResponseSchema: _$typebox.TObject<{
19
- prefix: _$typebox.TOptional<_$typebox.TString>;
20
- actions: _$typebox.TRecord<"^.*$", _$typebox.TObject<{
21
- path: _$typebox.TString;
22
- method: _$typebox.TOptional<_$typebox.TString>;
23
- contentType: _$typebox.TOptional<_$typebox.TString>;
24
- kind: _$typebox.TOptional<_$typebox.TString>;
25
- service: _$typebox.TOptional<_$typebox.TString>;
14
+ declare const apiRegistryResponseSchema: import("typebox").TObject<{
15
+ prefix: import("typebox").TOptional<import("typebox").TString>;
16
+ actions: import("typebox").TRecord<"^.*$", import("typebox").TObject<{
17
+ path: import("typebox").TString;
18
+ method: import("typebox").TOptional<import("typebox").TString>;
19
+ contentType: import("typebox").TOptional<import("typebox").TString>;
20
+ kind: import("typebox").TOptional<import("typebox").TString>;
21
+ service: import("typebox").TOptional<import("typebox").TString>;
26
22
  }>>;
27
- permissions: _$typebox.TOptional<_$typebox.TArray<_$typebox.TString>>;
23
+ permissions: import("typebox").TOptional<import("typebox").TArray<import("typebox").TString>>;
28
24
  }>;
29
25
  type ApiRegistryResponse = Static<typeof apiRegistryResponseSchema>;
30
26
  type ApiAction = Static<typeof apiActionSchema>;
31
27
  /**
32
28
  * @deprecated Use `apiRegistryResponseSchema` and `ApiRegistryResponse` instead.
33
29
  */
34
- declare const apiLinksResponseSchema: _$typebox.TObject<{
35
- prefix: _$typebox.TOptional<_$typebox.TString>;
36
- actions: _$typebox.TRecord<"^.*$", _$typebox.TObject<{
37
- path: _$typebox.TString;
38
- method: _$typebox.TOptional<_$typebox.TString>;
39
- contentType: _$typebox.TOptional<_$typebox.TString>;
40
- kind: _$typebox.TOptional<_$typebox.TString>;
41
- service: _$typebox.TOptional<_$typebox.TString>;
30
+ declare const apiLinksResponseSchema: import("typebox").TObject<{
31
+ prefix: import("typebox").TOptional<import("typebox").TString>;
32
+ actions: import("typebox").TRecord<"^.*$", import("typebox").TObject<{
33
+ path: import("typebox").TString;
34
+ method: import("typebox").TOptional<import("typebox").TString>;
35
+ contentType: import("typebox").TOptional<import("typebox").TString>;
36
+ kind: import("typebox").TOptional<import("typebox").TString>;
37
+ service: import("typebox").TOptional<import("typebox").TString>;
42
38
  }>>;
43
- permissions: _$typebox.TOptional<_$typebox.TArray<_$typebox.TString>>;
39
+ permissions: import("typebox").TOptional<import("typebox").TArray<import("typebox").TString>>;
44
40
  }>;
45
41
  /**
46
42
  * @deprecated Use `ApiRegistryResponse` instead.
@@ -52,21 +48,21 @@ type ApiLinksResponse = ApiRegistryResponse;
52
48
  type ApiLink = ApiAction;
53
49
  //#endregion
54
50
  //#region ../../src/server/links/atoms/apiLinksAtom.d.ts
55
- declare const apiLinksAtom: _$alepha.Atom<_$typebox.TOptional<_$typebox.TObject<{
56
- prefix: _$typebox.TOptional<_$typebox.TString>;
57
- actions: _$typebox.TRecord<"^.*$", _$typebox.TObject<{
58
- path: _$typebox.TString;
59
- method: _$typebox.TOptional<_$typebox.TString>;
60
- contentType: _$typebox.TOptional<_$typebox.TString>;
61
- kind: _$typebox.TOptional<_$typebox.TString>;
62
- service: _$typebox.TOptional<_$typebox.TString>;
51
+ declare const apiLinksAtom: import("alepha").Atom<import("typebox").TOptional<import("typebox").TObject<{
52
+ prefix: import("typebox").TOptional<import("typebox").TString>;
53
+ actions: import("typebox").TRecord<"^.*$", import("typebox").TObject<{
54
+ path: import("typebox").TString;
55
+ method: import("typebox").TOptional<import("typebox").TString>;
56
+ contentType: import("typebox").TOptional<import("typebox").TString>;
57
+ kind: import("typebox").TOptional<import("typebox").TString>;
58
+ service: import("typebox").TOptional<import("typebox").TString>;
63
59
  }>>;
64
- permissions: _$typebox.TOptional<_$typebox.TArray<_$typebox.TString>>;
60
+ permissions: import("typebox").TOptional<import("typebox").TArray<import("typebox").TString>>;
65
61
  }>>, "alepha.server.request.apiLinks">;
66
62
  //#endregion
67
63
  //#region ../../src/server/links/atoms/linkOptionsAtom.d.ts
68
- declare const linkOptionsAtom: _$alepha.Atom<_$typebox.TObject<{
69
- batch: _$typebox.TBoolean;
64
+ declare const linkOptionsAtom: import("alepha").Atom<import("typebox").TObject<{
65
+ batch: import("typebox").TBoolean;
70
66
  }>, "alepha.server.links.options">;
71
67
  //#endregion
72
68
  //#region ../../src/server/links/services/BatchCollector.d.ts
@@ -83,7 +79,7 @@ declare const linkOptionsAtom: _$alepha.Atom<_$typebox.TObject<{
83
79
  */
84
80
  declare class BatchCollector {
85
81
  protected static readonly MAX_BATCH_SIZE = 20;
86
- protected readonly log: _$alepha_logger0.Logger;
82
+ protected readonly log: import("alepha/logger").Logger;
87
83
  protected readonly httpClient: HttpClient;
88
84
  protected pending: PendingBatchEntry[];
89
85
  protected scheduled: boolean;
@@ -120,7 +116,7 @@ declare class LinkProvider {
120
116
  static path: {
121
117
  apiLinks: string;
122
118
  };
123
- protected readonly log: _$alepha_logger0.Logger;
119
+ protected readonly log: import("alepha/logger").Logger;
124
120
  protected readonly alepha: Alepha;
125
121
  protected readonly httpClient: HttpClient;
126
122
  protected serverLinkMap: Map<string, HttpClientLink>;
@@ -284,12 +280,12 @@ declare class RemotePrimitiveProvider {
284
280
  protected readonly proxyProvider: ServerProxyProvider;
285
281
  protected readonly linkProvider: LinkProvider;
286
282
  protected readonly remotes: Array<ServerRemote>;
287
- protected readonly log: _$alepha_logger0.Logger;
283
+ protected readonly log: import("alepha/logger").Logger;
288
284
  getRemotes(): ServerRemote[];
289
- readonly configure: _$alepha.HookPrimitive<"configure">;
290
- readonly start: _$alepha.HookPrimitive<"start">;
285
+ readonly configure: import("alepha").HookPrimitive<"configure">;
286
+ readonly start: import("alepha").HookPrimitive<"start">;
291
287
  registerRemote(value: RemotePrimitive): Promise<void>;
292
- protected readonly fetchLinks: _$alepha.PipelinePrimitiveFn<(opts: FetchLinksOptions) => Promise<ApiRegistryResponse>>;
288
+ protected readonly fetchLinks: import("alepha").PipelinePrimitiveFn<(opts: FetchLinksOptions) => Promise<ApiRegistryResponse>>;
293
289
  }
294
290
  interface FetchLinksOptions {
295
291
  /**
@@ -354,7 +350,7 @@ declare class ServerLinksProvider {
354
350
  protected readonly linkProvider: LinkProvider;
355
351
  protected readonly remoteProvider: RemotePrimitiveProvider;
356
352
  protected readonly serverTimingProvider: ServerTimingProvider;
357
- protected readonly log: _$alepha_logger0.Logger;
353
+ protected readonly log: import("alepha/logger").Logger;
358
354
  /**
359
355
  * Resolved once on start. Undefined when alepha/security is not loaded.
360
356
  */
@@ -365,45 +361,45 @@ declare class ServerLinksProvider {
365
361
  */
366
362
  protected registryCache: Map<string, RegistryCacheEntry>;
367
363
  get prefix(): string;
368
- readonly onRoute: _$alepha.HookPrimitive<"configure">;
369
- protected readonly onStart: _$alepha.HookPrimitive<"start">;
364
+ readonly onRoute: import("alepha").HookPrimitive<"configure">;
365
+ protected readonly onStart: import("alepha").HookPrimitive<"start">;
370
366
  /**
371
367
  * API registry endpoint — returns all available actions for the user.
372
368
  *
373
369
  * Response is filtered by the user's permissions.
374
370
  * Cached by role set with ETag support.
375
371
  */
376
- readonly links: _$alepha_server0.RoutePrimitive<RequestConfigSchema>;
372
+ readonly links: import("alepha/server").RoutePrimitive<RequestConfigSchema>;
377
373
  /**
378
374
  * On-demand schemas endpoint — returns JSON Schemas for requested actions.
379
375
  *
380
376
  * Schemas are filtered by the user's permissions (same logic as the registry).
381
377
  */
382
- readonly schemas: _$alepha_server0.RoutePrimitive<{
383
- body: _$typebox.TObject<{
384
- actions: _$typebox.TArray<_$typebox.TString>;
378
+ readonly schemas: import("alepha/server").RoutePrimitive<{
379
+ body: import("typebox").TObject<{
380
+ actions: import("typebox").TArray<import("typebox").TString>;
385
381
  }>;
386
- response: _$typebox.TRecord<"^.*$", _$typebox.TObject<{
387
- body: _$typebox.TOptional<_$typebox.TString>;
388
- response: _$typebox.TOptional<_$typebox.TString>;
382
+ response: import("typebox").TRecord<"^.*$", import("typebox").TObject<{
383
+ body: import("typebox").TOptional<import("typebox").TString>;
384
+ response: import("typebox").TOptional<import("typebox").TString>;
389
385
  }>>;
390
386
  }>;
391
387
  /**
392
388
  * Batch endpoint — execute multiple actions in a single HTTP request.
393
389
  * Each sub-request is independent: errors in one don't affect others.
394
390
  */
395
- readonly batch: _$alepha_server0.RoutePrimitive<{
396
- body: _$typebox.TArray<_$typebox.TObject<{
397
- action: _$typebox.TString;
398
- params: _$typebox.TOptional<_$typebox.TRecord<"^.*$", _$typebox.TAny>>;
399
- query: _$typebox.TOptional<_$typebox.TRecord<"^.*$", _$typebox.TAny>>;
400
- body: _$typebox.TOptional<_$typebox.TRecord<"^.*$", _$typebox.TAny>>;
391
+ readonly batch: import("alepha/server").RoutePrimitive<{
392
+ body: import("typebox").TArray<import("typebox").TObject<{
393
+ action: import("typebox").TString;
394
+ params: import("typebox").TOptional<import("typebox").TRecord<"^.*$", import("typebox").TAny>>;
395
+ query: import("typebox").TOptional<import("typebox").TRecord<"^.*$", import("typebox").TAny>>;
396
+ body: import("typebox").TOptional<import("typebox").TRecord<"^.*$", import("typebox").TAny>>;
401
397
  }>>;
402
- response: _$typebox.TArray<_$typebox.TObject<{
403
- action: _$typebox.TString;
404
- status: _$typebox.TInteger;
405
- data: _$typebox.TOptional<_$typebox.TAny>;
406
- error: _$typebox.TOptional<_$typebox.TString>;
398
+ response: import("typebox").TArray<import("typebox").TObject<{
399
+ action: import("typebox").TString;
400
+ status: import("typebox").TInteger;
401
+ data: import("typebox").TOptional<import("typebox").TAny>;
402
+ error: import("typebox").TOptional<import("typebox").TString>;
407
403
  }>>;
408
404
  }>;
409
405
  protected static readonly MAX_BATCH_SIZE = 20;
@@ -456,7 +452,7 @@ declare module "alepha" {
456
452
  *
457
453
  * @module alepha.server.links
458
454
  */
459
- declare const AlephaServerLinks: _$alepha.Service<_$alepha.Module>;
455
+ declare const AlephaServerLinks: import("alepha").Service<import("alepha").Module>;
460
456
  //#endregion
461
457
  export { $client, $remote, AlephaServerLinks, ApiAction, ApiLink, ApiLinksResponse, ApiRegistryResponse, BatchCollector, BatchEntry, ClientScope, FetchLinksOptions, GetApiLinksOptions, HttpClientLink, HttpVirtualClient, LinkProvider, RemotePrimitive, RemotePrimitiveOptions, RemotePrimitiveProvider, ServerLinksProvider, ServerRemote, VirtualAction, VirtualSse, apiActionSchema, apiLinksAtom, apiLinksResponseSchema, apiRegistryResponseSchema, linkOptionsAtom };
462
458
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/server/links/schemas/apiLinksResponseSchema.ts","../../../src/server/links/atoms/apiLinksAtom.ts","../../../src/server/links/atoms/linkOptionsAtom.ts","../../../src/server/links/services/BatchCollector.ts","../../../src/server/links/providers/LinkProvider.ts","../../../src/server/links/primitives/$client.ts","../../../src/server/links/primitives/$remote.ts","../../../src/server/links/providers/RemotePrimitiveProvider.ts","../../../src/server/links/providers/ServerLinksProvider.ts","../../../src/server/links/index.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/server/links/schemas/apiLinksResponseSchema.ts","../../../src/server/links/atoms/apiLinksAtom.ts","../../../src/server/links/atoms/linkOptionsAtom.ts","../../../src/server/links/services/BatchCollector.ts","../../../src/server/links/providers/LinkProvider.ts","../../../src/server/links/primitives/$client.ts","../../../src/server/links/primitives/$remote.ts","../../../src/server/links/providers/RemotePrimitiveProvider.ts","../../../src/server/links/providers/ServerLinksProvider.ts","../../../src/server/links/index.ts"],"mappings":"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"}
@@ -268,6 +268,8 @@ var LinkProvider = class LinkProvider {
268
268
  * - `can("admin:user:read")` → O(1) set lookup
269
269
  */
270
270
  can(name) {
271
+ const registry = this.alepha.store.get("alepha.server.request.apiLinks");
272
+ if (registry && registry !== this.lastLoadedRegistry) this.loadRegistry(registry);
271
273
  if (this.actionMap.size > 0) {
272
274
  if (this.actionMap.has(name)) return true;
273
275
  } else {