alepha 0.14.3 → 0.15.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 (317) hide show
  1. package/README.md +2 -5
  2. package/dist/api/audits/index.d.ts +620 -811
  3. package/dist/api/audits/index.d.ts.map +1 -1
  4. package/dist/api/files/index.d.ts +185 -377
  5. package/dist/api/files/index.d.ts.map +1 -1
  6. package/dist/api/files/index.js +0 -1
  7. package/dist/api/files/index.js.map +1 -1
  8. package/dist/api/jobs/index.d.ts +245 -435
  9. package/dist/api/jobs/index.d.ts.map +1 -1
  10. package/dist/api/notifications/index.d.ts +238 -429
  11. package/dist/api/notifications/index.d.ts.map +1 -1
  12. package/dist/api/parameters/index.d.ts +236 -427
  13. package/dist/api/parameters/index.d.ts.map +1 -1
  14. package/dist/api/users/index.browser.js +1 -2
  15. package/dist/api/users/index.browser.js.map +1 -1
  16. package/dist/api/users/index.d.ts +1010 -1196
  17. package/dist/api/users/index.d.ts.map +1 -1
  18. package/dist/api/users/index.js +178 -151
  19. package/dist/api/users/index.js.map +1 -1
  20. package/dist/api/verifications/index.d.ts +17 -17
  21. package/dist/api/verifications/index.d.ts.map +1 -1
  22. package/dist/batch/index.d.ts +122 -122
  23. package/dist/batch/index.d.ts.map +1 -1
  24. package/dist/batch/index.js +1 -2
  25. package/dist/batch/index.js.map +1 -1
  26. package/dist/bucket/index.d.ts +163 -163
  27. package/dist/bucket/index.d.ts.map +1 -1
  28. package/dist/cache/core/index.d.ts +46 -46
  29. package/dist/cache/core/index.d.ts.map +1 -1
  30. package/dist/cache/redis/index.d.ts.map +1 -1
  31. package/dist/cli/index.d.ts +384 -285
  32. package/dist/cli/index.d.ts.map +1 -1
  33. package/dist/cli/index.js +1113 -623
  34. package/dist/cli/index.js.map +1 -1
  35. package/dist/command/index.d.ts +299 -300
  36. package/dist/command/index.d.ts.map +1 -1
  37. package/dist/command/index.js +13 -9
  38. package/dist/command/index.js.map +1 -1
  39. package/dist/core/index.browser.js +445 -103
  40. package/dist/core/index.browser.js.map +1 -1
  41. package/dist/core/index.d.ts +733 -625
  42. package/dist/core/index.d.ts.map +1 -1
  43. package/dist/core/index.js +446 -103
  44. package/dist/core/index.js.map +1 -1
  45. package/dist/core/index.native.js +445 -103
  46. package/dist/core/index.native.js.map +1 -1
  47. package/dist/datetime/index.d.ts +44 -44
  48. package/dist/datetime/index.d.ts.map +1 -1
  49. package/dist/datetime/index.js +4 -4
  50. package/dist/datetime/index.js.map +1 -1
  51. package/dist/email/index.d.ts +97 -50
  52. package/dist/email/index.d.ts.map +1 -1
  53. package/dist/email/index.js +129 -33
  54. package/dist/email/index.js.map +1 -1
  55. package/dist/fake/index.d.ts +7981 -14
  56. package/dist/fake/index.d.ts.map +1 -1
  57. package/dist/file/index.d.ts +523 -390
  58. package/dist/file/index.d.ts.map +1 -1
  59. package/dist/file/index.js +253 -1
  60. package/dist/file/index.js.map +1 -1
  61. package/dist/lock/core/index.d.ts +208 -208
  62. package/dist/lock/core/index.d.ts.map +1 -1
  63. package/dist/lock/redis/index.d.ts.map +1 -1
  64. package/dist/logger/index.d.ts +25 -26
  65. package/dist/logger/index.d.ts.map +1 -1
  66. package/dist/logger/index.js +12 -2
  67. package/dist/logger/index.js.map +1 -1
  68. package/dist/mcp/index.d.ts +197 -197
  69. package/dist/mcp/index.d.ts.map +1 -1
  70. package/dist/mcp/index.js +1 -1
  71. package/dist/mcp/index.js.map +1 -1
  72. package/dist/orm/chunk-DtkW-qnP.js +38 -0
  73. package/dist/orm/index.browser.js.map +1 -1
  74. package/dist/orm/index.bun.js +2814 -0
  75. package/dist/orm/index.bun.js.map +1 -0
  76. package/dist/orm/index.d.ts +1228 -1216
  77. package/dist/orm/index.d.ts.map +1 -1
  78. package/dist/orm/index.js +2041 -1967
  79. package/dist/orm/index.js.map +1 -1
  80. package/dist/queue/core/index.d.ts +248 -248
  81. package/dist/queue/core/index.d.ts.map +1 -1
  82. package/dist/queue/redis/index.d.ts.map +1 -1
  83. package/dist/redis/index.bun.js +285 -0
  84. package/dist/redis/index.bun.js.map +1 -0
  85. package/dist/redis/index.d.ts +118 -136
  86. package/dist/redis/index.d.ts.map +1 -1
  87. package/dist/redis/index.js +18 -38
  88. package/dist/redis/index.js.map +1 -1
  89. package/dist/retry/index.d.ts +69 -69
  90. package/dist/retry/index.d.ts.map +1 -1
  91. package/dist/router/index.d.ts +6 -6
  92. package/dist/router/index.d.ts.map +1 -1
  93. package/dist/scheduler/index.d.ts +25 -25
  94. package/dist/scheduler/index.d.ts.map +1 -1
  95. package/dist/security/index.browser.js +5 -1
  96. package/dist/security/index.browser.js.map +1 -1
  97. package/dist/security/index.d.ts +417 -254
  98. package/dist/security/index.d.ts.map +1 -1
  99. package/dist/security/index.js +386 -86
  100. package/dist/security/index.js.map +1 -1
  101. package/dist/server/auth/index.d.ts +110 -110
  102. package/dist/server/auth/index.d.ts.map +1 -1
  103. package/dist/server/auth/index.js +20 -20
  104. package/dist/server/auth/index.js.map +1 -1
  105. package/dist/server/cache/index.d.ts +62 -47
  106. package/dist/server/cache/index.d.ts.map +1 -1
  107. package/dist/server/cache/index.js +56 -3
  108. package/dist/server/cache/index.js.map +1 -1
  109. package/dist/server/compress/index.d.ts +6 -0
  110. package/dist/server/compress/index.d.ts.map +1 -1
  111. package/dist/server/compress/index.js +36 -1
  112. package/dist/server/compress/index.js.map +1 -1
  113. package/dist/server/cookies/index.d.ts +6 -6
  114. package/dist/server/cookies/index.d.ts.map +1 -1
  115. package/dist/server/cookies/index.js +3 -3
  116. package/dist/server/cookies/index.js.map +1 -1
  117. package/dist/server/core/index.browser.js +2 -2
  118. package/dist/server/core/index.browser.js.map +1 -1
  119. package/dist/server/core/index.d.ts +242 -150
  120. package/dist/server/core/index.d.ts.map +1 -1
  121. package/dist/server/core/index.js +294 -125
  122. package/dist/server/core/index.js.map +1 -1
  123. package/dist/server/cors/index.d.ts +11 -12
  124. package/dist/server/cors/index.d.ts.map +1 -1
  125. package/dist/server/health/index.d.ts +0 -1
  126. package/dist/server/health/index.d.ts.map +1 -1
  127. package/dist/server/helmet/index.d.ts +2 -2
  128. package/dist/server/helmet/index.d.ts.map +1 -1
  129. package/dist/server/links/index.browser.js.map +1 -1
  130. package/dist/server/links/index.d.ts +123 -124
  131. package/dist/server/links/index.d.ts.map +1 -1
  132. package/dist/server/links/index.js +1 -2
  133. package/dist/server/links/index.js.map +1 -1
  134. package/dist/server/metrics/index.d.ts.map +1 -1
  135. package/dist/server/multipart/index.d.ts +6 -6
  136. package/dist/server/multipart/index.d.ts.map +1 -1
  137. package/dist/server/proxy/index.d.ts +102 -103
  138. package/dist/server/proxy/index.d.ts.map +1 -1
  139. package/dist/server/rate-limit/index.d.ts +16 -16
  140. package/dist/server/rate-limit/index.d.ts.map +1 -1
  141. package/dist/server/static/index.d.ts +44 -44
  142. package/dist/server/static/index.d.ts.map +1 -1
  143. package/dist/server/static/index.js +4 -0
  144. package/dist/server/static/index.js.map +1 -1
  145. package/dist/server/swagger/index.d.ts +48 -49
  146. package/dist/server/swagger/index.d.ts.map +1 -1
  147. package/dist/server/swagger/index.js +3 -5
  148. package/dist/server/swagger/index.js.map +1 -1
  149. package/dist/sms/index.d.ts +13 -11
  150. package/dist/sms/index.d.ts.map +1 -1
  151. package/dist/sms/index.js +7 -7
  152. package/dist/sms/index.js.map +1 -1
  153. package/dist/thread/index.d.ts +71 -72
  154. package/dist/thread/index.d.ts.map +1 -1
  155. package/dist/topic/core/index.d.ts +318 -318
  156. package/dist/topic/core/index.d.ts.map +1 -1
  157. package/dist/topic/redis/index.d.ts +6 -6
  158. package/dist/topic/redis/index.d.ts.map +1 -1
  159. package/dist/vite/index.d.ts +5805 -249
  160. package/dist/vite/index.d.ts.map +1 -1
  161. package/dist/vite/index.js +599 -513
  162. package/dist/vite/index.js.map +1 -1
  163. package/dist/websocket/index.browser.js +6 -6
  164. package/dist/websocket/index.browser.js.map +1 -1
  165. package/dist/websocket/index.d.ts +247 -247
  166. package/dist/websocket/index.d.ts.map +1 -1
  167. package/dist/websocket/index.js +6 -6
  168. package/dist/websocket/index.js.map +1 -1
  169. package/package.json +9 -14
  170. package/src/api/files/controllers/AdminFileStatsController.ts +0 -1
  171. package/src/api/users/atoms/realmAuthSettingsAtom.ts +5 -0
  172. package/src/api/users/controllers/{UserRealmController.ts → RealmController.ts} +11 -11
  173. package/src/api/users/entities/users.ts +1 -1
  174. package/src/api/users/index.ts +8 -8
  175. package/src/api/users/primitives/{$userRealm.ts → $realm.ts} +17 -19
  176. package/src/api/users/providers/{UserRealmProvider.ts → RealmProvider.ts} +26 -30
  177. package/src/api/users/schemas/{userRealmConfigSchema.ts → realmConfigSchema.ts} +2 -2
  178. package/src/api/users/services/CredentialService.ts +7 -7
  179. package/src/api/users/services/IdentityService.ts +4 -4
  180. package/src/api/users/services/RegistrationService.spec.ts +25 -27
  181. package/src/api/users/services/RegistrationService.ts +38 -27
  182. package/src/api/users/services/SessionCrudService.ts +3 -3
  183. package/src/api/users/services/SessionService.spec.ts +3 -3
  184. package/src/api/users/services/SessionService.ts +28 -9
  185. package/src/api/users/services/UserService.ts +7 -7
  186. package/src/batch/providers/BatchProvider.ts +1 -2
  187. package/src/cli/apps/AlephaCli.ts +0 -2
  188. package/src/cli/apps/AlephaPackageBuilderCli.ts +38 -19
  189. package/src/cli/assets/apiHelloControllerTs.ts +18 -0
  190. package/src/cli/assets/apiIndexTs.ts +16 -0
  191. package/src/cli/assets/claudeMd.ts +303 -0
  192. package/src/cli/assets/mainBrowserTs.ts +2 -2
  193. package/src/cli/assets/mainServerTs.ts +24 -0
  194. package/src/cli/assets/webAppRouterTs.ts +15 -0
  195. package/src/cli/assets/webHelloComponentTsx.ts +16 -0
  196. package/src/cli/assets/webIndexTs.ts +16 -0
  197. package/src/cli/atoms/buildOptions.ts +88 -0
  198. package/src/cli/commands/build.ts +70 -87
  199. package/src/cli/commands/db.ts +21 -22
  200. package/src/cli/commands/deploy.ts +17 -5
  201. package/src/cli/commands/dev.ts +22 -14
  202. package/src/cli/commands/format.ts +8 -2
  203. package/src/cli/commands/gen/env.ts +53 -0
  204. package/src/cli/commands/gen/openapi.ts +1 -1
  205. package/src/cli/commands/gen/resource.ts +15 -0
  206. package/src/cli/commands/gen.ts +7 -1
  207. package/src/cli/commands/init.ts +74 -30
  208. package/src/cli/commands/lint.ts +8 -2
  209. package/src/cli/commands/test.ts +8 -3
  210. package/src/cli/commands/typecheck.ts +5 -1
  211. package/src/cli/commands/verify.ts +5 -3
  212. package/src/cli/defineConfig.ts +49 -7
  213. package/src/cli/index.ts +0 -1
  214. package/src/cli/services/AlephaCliUtils.ts +39 -589
  215. package/src/cli/services/PackageManagerUtils.ts +301 -0
  216. package/src/cli/services/ProjectScaffolder.ts +306 -0
  217. package/src/command/helpers/Runner.spec.ts +2 -2
  218. package/src/command/helpers/Runner.ts +16 -4
  219. package/src/command/primitives/$command.ts +0 -6
  220. package/src/command/providers/CliProvider.ts +1 -3
  221. package/src/core/Alepha.ts +42 -0
  222. package/src/core/__tests__/Alepha-graph.spec.ts +4 -0
  223. package/src/core/index.shared.ts +1 -0
  224. package/src/core/index.ts +2 -0
  225. package/src/core/primitives/$hook.ts +6 -2
  226. package/src/core/primitives/$module.spec.ts +4 -0
  227. package/src/core/providers/AlsProvider.ts +1 -1
  228. package/src/core/providers/CodecManager.spec.ts +12 -6
  229. package/src/core/providers/CodecManager.ts +26 -6
  230. package/src/core/providers/EventManager.ts +169 -13
  231. package/src/core/providers/KeylessJsonSchemaCodec.spec.ts +621 -0
  232. package/src/core/providers/KeylessJsonSchemaCodec.ts +407 -0
  233. package/src/core/providers/StateManager.spec.ts +27 -16
  234. package/src/email/providers/LocalEmailProvider.spec.ts +111 -87
  235. package/src/email/providers/LocalEmailProvider.ts +52 -15
  236. package/src/email/providers/NodemailerEmailProvider.ts +167 -56
  237. package/src/file/errors/FileError.ts +7 -0
  238. package/src/file/index.ts +9 -1
  239. package/src/file/providers/MemoryFileSystemProvider.ts +393 -0
  240. package/src/logger/index.ts +15 -3
  241. package/src/mcp/transports/StdioMcpTransport.ts +1 -1
  242. package/src/orm/index.browser.ts +1 -19
  243. package/src/orm/index.bun.ts +77 -0
  244. package/src/orm/index.shared-server.ts +22 -0
  245. package/src/orm/index.shared.ts +15 -0
  246. package/src/orm/index.ts +13 -39
  247. package/src/orm/providers/drivers/BunPostgresProvider.ts +3 -5
  248. package/src/orm/providers/drivers/BunSqliteProvider.ts +1 -1
  249. package/src/orm/providers/drivers/CloudflareD1Provider.ts +4 -0
  250. package/src/orm/providers/drivers/DatabaseProvider.ts +4 -0
  251. package/src/orm/providers/drivers/PglitePostgresProvider.ts +4 -0
  252. package/src/orm/services/Repository.ts +8 -0
  253. package/src/queue/core/providers/WorkerProvider.spec.ts +48 -32
  254. package/src/redis/index.bun.ts +35 -0
  255. package/src/redis/providers/BunRedisProvider.ts +12 -43
  256. package/src/redis/providers/BunRedisSubscriberProvider.ts +2 -3
  257. package/src/redis/providers/NodeRedisProvider.ts +16 -34
  258. package/src/{server/security → security}/__tests__/BasicAuth.spec.ts +11 -11
  259. package/src/{server/security → security}/__tests__/ServerSecurityProvider-realm.spec.ts +21 -16
  260. package/src/{server/security/providers → security/__tests__}/ServerSecurityProvider.spec.ts +5 -5
  261. package/src/security/index.browser.ts +5 -0
  262. package/src/security/index.ts +90 -7
  263. package/src/security/primitives/{$realm.spec.ts → $issuer.spec.ts} +11 -11
  264. package/src/security/primitives/{$realm.ts → $issuer.ts} +20 -17
  265. package/src/security/primitives/$role.ts +5 -5
  266. package/src/security/primitives/$serviceAccount.spec.ts +5 -5
  267. package/src/security/primitives/$serviceAccount.ts +3 -3
  268. package/src/{server/security → security}/providers/ServerSecurityProvider.ts +5 -7
  269. package/src/server/auth/primitives/$auth.ts +10 -10
  270. package/src/server/auth/primitives/$authCredentials.ts +3 -3
  271. package/src/server/auth/primitives/$authGithub.ts +3 -3
  272. package/src/server/auth/primitives/$authGoogle.ts +3 -3
  273. package/src/server/auth/providers/ServerAuthProvider.ts +13 -13
  274. package/src/server/cache/providers/ServerCacheProvider.spec.ts +183 -0
  275. package/src/server/cache/providers/ServerCacheProvider.ts +95 -10
  276. package/src/server/compress/providers/ServerCompressProvider.ts +61 -2
  277. package/src/server/cookies/providers/ServerCookiesProvider.ts +3 -3
  278. package/src/server/core/helpers/ServerReply.ts +2 -2
  279. package/src/server/core/providers/NodeHttpServerProvider.ts +25 -6
  280. package/src/server/core/providers/ServerBodyParserProvider.ts +19 -23
  281. package/src/server/core/providers/ServerLoggerProvider.ts +23 -19
  282. package/src/server/core/providers/ServerProvider.ts +155 -22
  283. package/src/server/core/providers/ServerRouterProvider.ts +259 -115
  284. package/src/server/core/providers/ServerTimingProvider.ts +2 -2
  285. package/src/server/links/index.ts +1 -1
  286. package/src/server/links/providers/LinkProvider.ts +1 -1
  287. package/src/server/static/providers/ServerStaticProvider.ts +10 -0
  288. package/src/server/swagger/index.ts +1 -1
  289. package/src/server/swagger/providers/ServerSwaggerProvider.ts +5 -8
  290. package/src/sms/providers/LocalSmsProvider.spec.ts +153 -111
  291. package/src/sms/providers/LocalSmsProvider.ts +8 -7
  292. package/src/vite/helpers/boot.ts +28 -17
  293. package/src/vite/helpers/importViteReact.ts +13 -0
  294. package/src/vite/index.ts +1 -21
  295. package/src/vite/plugins/viteAlephaDev.ts +16 -1
  296. package/src/vite/plugins/viteAlephaSsrPreload.ts +222 -0
  297. package/src/vite/tasks/buildClient.ts +11 -0
  298. package/src/vite/tasks/buildServer.ts +59 -4
  299. package/src/vite/tasks/devServer.ts +71 -0
  300. package/src/vite/tasks/generateCloudflare.ts +7 -0
  301. package/src/vite/tasks/index.ts +2 -1
  302. package/dist/server/security/index.browser.js +0 -13
  303. package/dist/server/security/index.browser.js.map +0 -1
  304. package/dist/server/security/index.d.ts +0 -173
  305. package/dist/server/security/index.d.ts.map +0 -1
  306. package/dist/server/security/index.js +0 -311
  307. package/dist/server/security/index.js.map +0 -1
  308. package/src/cli/assets/appRouterTs.ts +0 -9
  309. package/src/cli/assets/mainTs.ts +0 -13
  310. package/src/cli/assets/viteConfigTs.ts +0 -14
  311. package/src/cli/commands/run.ts +0 -24
  312. package/src/server/security/index.browser.ts +0 -10
  313. package/src/server/security/index.ts +0 -94
  314. package/src/vite/plugins/viteAlepha.ts +0 -37
  315. package/src/vite/plugins/viteAlephaBuild.ts +0 -281
  316. /package/src/{server/security → security}/primitives/$basicAuth.ts +0 -0
  317. /package/src/{server/security → security}/providers/ServerBasicAuthProvider.ts +0 -0
@@ -4,7 +4,6 @@ import * as alepha_logger0 from "alepha/logger";
4
4
  import { ServerRouterProvider } from "alepha/server";
5
5
 
6
6
  //#region ../../src/server/cors/primitives/$cors.d.ts
7
-
8
7
  /**
9
8
  * Declares CORS configuration for specific server routes.
10
9
  * This primitive provides path-based CORS configuration.
@@ -69,23 +68,23 @@ declare class ServerCorsProvider {
69
68
  headers: string[];
70
69
  }>;
71
70
  /**
72
- * Registered CORS configurations with their path patterns
73
- */
71
+ * Registered CORS configurations with their path patterns
72
+ */
74
73
  readonly registeredConfigs: CorsPrimitiveConfig[];
75
74
  /**
76
- * Register a CORS configuration (called by primitives)
77
- */
75
+ * Register a CORS configuration (called by primitives)
76
+ */
78
77
  registerCors(config: CorsPrimitiveConfig): void;
79
78
  protected readonly onStart: alepha1.HookPrimitive<"start">;
80
79
  protected readonly configure: alepha1.HookPrimitive<"configure">;
81
80
  protected readonly onRequest: alepha1.HookPrimitive<"server:onRequest">;
82
81
  /**
83
- * Build complete CORS options by merging with global defaults
84
- */
82
+ * Build complete CORS options by merging with global defaults
83
+ */
85
84
  protected buildCorsOptions(config: CorsPrimitiveConfig): CorsOptions;
86
85
  /**
87
- * Apply CORS headers to the response
88
- */
86
+ * Apply CORS headers to the response
87
+ */
89
88
  protected applyCorsHeaders(request: {
90
89
  headers: {
91
90
  origin?: string;
@@ -102,9 +101,9 @@ type ServerCorsProviderOptions = CorsOptions;
102
101
  declare module "alepha/server" {
103
102
  interface ServerRoute {
104
103
  /**
105
- * Route-specific CORS configuration.
106
- * If set, overrides the global CORS options for this route.
107
- */
104
+ * Route-specific CORS configuration.
105
+ * If set, overrides the global CORS options for this route.
106
+ */
108
107
  cors?: CorsOptions;
109
108
  }
110
109
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/server/cors/primitives/$cors.ts","../../../src/server/cors/providers/ServerCorsProvider.ts","../../../src/server/cors/index.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;AAoBA;;;;;;AAMA;AASA;AAKA;;;;;AAEkC,cAtBrB,KAsBqB,EAAA;YAtBH,sBAAsB;;;ACVxC,UDgBI,mBAAA,SAA4B,OCoB3C,CDpBmD,WCoBnD,CAAA,CAAA;EAAA;;;;;UDXe,qBAAA;;oBAEG;;cAGP,aAAA,SACH,UAAU,gCACP;qBChCW,kBAAA,EDkCe,kBClCf;EAAA,IAAA,IAAA,CAAA,CAAA,EAAA,MAAA;EAAA,UAAA,MAAA,CAAA,CAAA,EAAA,IAAA;AAsCxB;;;;;;AD5Ba,cCVA,WDYZ,ECZuB,OAAA,CAAA,IDYvB,SCZuB,ODYvB,CAAA;EAF8B,MAAA,mBAAA,CC0B7B,OAAA,CAAA,OAAA,CD1B6B;EAAsB,OAAA,gBAAA,iBAAA;;;;AAMrD,CAAA,CAAA,EAAiB,4BAAoB,CAAA;AASpB,KCaL,WAAA,GAAc,MDbY,CAAA,OCaE,WAAA,CAAY,MDXhC,CAAmB;AAGvC,eAAa,QACX,CAAA;EAAkB,UAAA,KAAA,CAAA;IAGmB,CCQlC,WAAA,CAAY,GAAA,CDRsB,ECQhB,WDRgB;EAH7B;;AACwB,cCgBrB,kBAAA,CDhBqB;0BCgBH,cAAA,CACP;2CACiB;oCACP;IAnDrB,MAAA,CAAA,EAAA,MAoCX,GAAA,SAAA;IAAA,WAAA,CAAA,EAAA,OAAA,GAAA,SAAA;;;;;;;;8BAoBmC;;;;EAxDb,YAAA,CAAA,MAAA,EA6DM,mBA7DN,CAAA,EAAA,IAAA;EAsCZ,mBAAW,OAAiB,EAuBS,OAAA,CAIrB,aA3BI,CAAA,OAAA,CAAA;EAA4B,mBAAA,SAAA,EA2BhC,OAAA,CAuBE,aAlD8B,CAAA,WAAA,CAAA;EAAA,mBAAA,SAAA,EAkD9B,OAAA,CAwBA,aA1E8B,CAAA,kBAAA,CAAA;;;;EAU/C,UAAA,gBAAkB,CAAA,MAAA,EA4EM,mBA5EN,CAAA,EA4E4B,WA5E5B;EAAA;;;EAQM,UAAA,gBAAA,CAAA,OAAA,EAAA;IAKP,OAAA,EAAA;MAIF,MAAA,CAAA,EAAA,MAAA;IAAA,CAuBE;IAAA,KAwBA,EAAA;MAYO,SAAA,EAAA,CAAA,IAAA,EAAA,MAAA,EAAA,KAAA,EAAA,MAAA,EAAA,GAAA,IAAA;IAAsB,CAAA;EAkB9C,CAAA,EAAA,OAAA,EAAA,WAAA,CAAA,EAAA,IAAA;EAuBA,eAAA,CAAA,MAAA,EAAA,MAAA,GAAA,SAAA,EAAA,OAAA,EAAA,WAAA,CAAA,QAAA,CAAA,CAAA,EAAA,OAAA;;AAWD,KAAA,yBAAA,GAA4B,WAAA;;;;;;ADtKxC;;;WEAW;;;AFMX;AASA;AAKA;;;;;;;;;AC9BA;;;;;;;;;;;;;;AAsCA;AAA4D,cCI/C,gBDJ+C,ECI/B,OAAA,CAAA,ODJ+B,CCQ1D,OAAA,CAJ2B,MAAA,CDJ+B"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/server/cors/primitives/$cors.ts","../../../src/server/cors/providers/ServerCorsProvider.ts","../../../src/server/cors/index.ts"],"mappings":";;;;;;;AAoBA;;;;;;AAMA;AASA;AAKA;;;;;;;cApBa,KAAA;EAAA,CAAA,OAAA,EAAkB,mBAAA,GAAsB,qBAAA;EAAA;;UAMpC,mBAAA,SAA4B,OAAA,CAAQ,WAAA;EAAA;EAAA,IAAA;EAAA;EAAA,KAAA;AAAA;AAAA,UASpC,qBAAA;EAAA,SAAA,IAAA;EAAA,SAAA,OAAA,EAEG,mBAAA;AAAA;AAAA,cAGP,aAAA,SACH,SAAA,CAAU,mBAAA,aACP,qBAAA;EAAA,mBAAA,kBAAA,EAE0B,kBAAA;EAAA,IAAA,KAAA;EAAA,UAAA,OAAA;AAAA;;;;AClCvC;;cAAa,WAAA,EAAW,OAAA,CAAA,IAAA,SAAA,OAAA;EAAA,MAAA,oBAoCtB,OAAA,CAAA,OAAA;EAAA,OAAA;;;;;KAEU,WAAA,GAAc,MAAA,QAAc,WAAA,CAAY,MAAA;AAAA;EAAA,UAAA,KAAA;IAAA,CAI/C,WAAA,CAAY,GAAA,GAAM,WAAA;EAAA;AAAA;AAAA,cAMV,kBAAA;EAAA,mBAAA,GAAA,EAAkB,cAAA,CACP,MAAA;EAAA,mBAAA,oBAAA,EACiB,oBAAA;EAAA,mBAAA,aAAA,EACP,QAAA;IAAA,MAAA;IAAA,WAAA;IAAA,MAAA;IAAA,OAAA;IAAA,OAAA;EAAA;EAAA;;;EAAA,SAAA,iBAAA,EAKG,mBAAA;EAAA;;;EAAA,aAAA,MAAA,EAKP,mBAAA;EAAA,mBAAA,OAAA,EAAmB,OAAA,CAIrB,aAAA;EAAA,mBAAA,SAAA,EAAA,OAAA,CAuBE,aAAA;EAAA,mBAAA,SAAA,EAAA,OAAA,CAwBA,aAAA;EAAA;;;EAAA,UAAA,iBAAA,MAAA,EAYO,mBAAA,GAAsB,WAAA;EAAA;;;EAAA,UAAA,iBAAA,OAAA;IAAA,OAAA;MAAA,MAAA;IAAA;IAAA,KAAA;MAAA,SAAA,GAAA,IAAA,UAAA,KAAA;IAAA;EAAA,GAAA,OAAA,EAkB9C,WAAA;EAAA,gBAAA,MAAA,sBAAA,OAAA,EAuBA,WAAA;AAAA;AAAA,KAWD,yBAAA,GAA4B,WAAA;;;;;;AChLU;;;WAUvC,WAAA;EAAA;AAAA;AAAA;;;AAgCX;;;;;;;;;;;;;;;;;;;;;;;AAhCW,cAgCE,gBAAA,EAAgB,OAAA,CAAA,OAAA,CAI3B,OAAA,CAJ2B,MAAA"}
@@ -4,7 +4,6 @@ import * as alepha_server0 from "alepha/server";
4
4
  import { DateTimeProvider } from "alepha/datetime";
5
5
 
6
6
  //#region ../../src/server/health/providers/ServerHealthProvider.d.ts
7
-
8
7
  /**
9
8
  * Register `/health` & `/healthz` endpoint.
10
9
  *
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/server/health/providers/ServerHealthProvider.ts","../../../src/server/health/schemas/healthSchema.ts","../../../src/server/health/index.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;AAUA;AAC2B,cADd,oBAAA,CACc;EACA,mBAAA,IAAA,EADA,gBACA;EAAA,mBAAA,MAAA,EAAA,MAAA;kCAEH;;eAFG,OAAA,CAAA;;UAEH,iBAAA;MAAA,KAAA,kBAAA;;;mCASC;;aAAA,EATD,OAAA,CAAA,OASC;MAAA,MAAA,iBAAA;;;;ECrBZ,CAAA,CAAA;EAKX,UAAA,WAAA,CAAA,CAAA,EAAA;;;;SALuB,EAAA,OAAA;EAAA,CAAA;;;;cAAZ,sBAAY;WAKvB,OAAA,CAAA;;;;;;;;;;;ADGF;;AAE2B,cEKd,kBFLc,EEKI,OAAA,CAAA,OFLJ,CEQzB,OAAA,CAH6B,MAAA,CFLJ"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/server/health/providers/ServerHealthProvider.ts","../../../src/server/health/schemas/healthSchema.ts","../../../src/server/health/index.ts"],"mappings":";;;;;;;AAUA;;;;cAAa,oBAAA;EAAA,mBAAA,IAAA,EACc,gBAAA;EAAA,mBAAA,MAAA,EACA,MAAA;EAAA,SAAA,MAAA,iBAEH,cAAA;IAAA,QAAA;eAFG,OAAA,CAAA,OAAA;MAAA,MAAA;;;;;mCAWF,cAAA;IAAA,QAAA;eATD,OAAA,CAAA,OAAA;MAAA,MAAA;;;;;;;;;;;;;;cCZX,YAAA,UAAY,OAAA;EAAA,OAAA,EAKvB,OAAA,CAAA,OAAA;EAAA,MAAA;;;;;;;ACUF;;;;;cAAa,kBAAA,EAAkB,OAAA,CAAA,OAAA,CAG7B,OAAA,CAH6B,MAAA"}
@@ -62,8 +62,8 @@ interface HstsOptions {
62
62
  declare class ServerHelmetProvider {
63
63
  protected readonly alepha: Alepha;
64
64
  /**
65
- * The configuration options loaded from the atom.
66
- */
65
+ * The configuration options loaded from the atom.
66
+ */
67
67
  protected readonly options: Readonly<{
68
68
  isSecure?: boolean | undefined;
69
69
  strictTransportSecurity?: {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/server/helmet/providers/ServerHelmetProvider.ts","../../../src/server/helmet/index.ts"],"sourcesContent":[],"mappings":";;;;;;;;cAOa,eAAa,OAAA,CAAA,aAAA;EAAb,QAAA,mBAsCX,CAAA,OAAA,CAAA,QAAA,CAAA;EAAA,uBAAA,mBAAA,gBAAA,CAAA;;;;;;;;;;;;;KAEU,aAAA,GAAgB,cAAc,aAAA,CAAc;;;KAInD,aAAA,CAAc,GAAA,GAAM;;;KAMpB,YAAA;UAEY,aAAA;kBACC;cArDQ,CAAA,EAsDT,YAtDS;EAAA,WAAA,CAAA,EAuDV,YAvDU;EAAA,SAAA,CAAA,EAwDZ,YAxDY;EAwCd,aAAA,CAAA,EAiBM,YAjBwB;EAAsB,UAAA,CAAA,EAkBjD,YAlBiD;EAAA,YAAA,CAAA,EAmB/C,YAnB+C;aAIvC,CAAA,EAgBT,YAhBX;EAAiB,WAAA,CAAA,EAiBN,YAjBM;EAAA,OAAA,CAAA,EAkBV,YAlBU,GAAA,OAAA;EAMjB,YAAA,CAAA,EAAY,MAAA;EAEA,WAAA,CAAA,EAYD,YAZc;EACZ,aAAA,CAAA,EAYA,YAZA;EACD,iBAAA,CAAA,EAYK,YAZL;EACD,cAAA,CAAA,EAYG,YAZH;EACF,UAAA,CAAA,EAYC,YAZD;EACI,CAAA,GAAA,EAAA,MAAA,CAAA,EAYD,YAZC,GAAA,SAAA,GAAA,OAAA;;AAED,UAaA,UAAA,CAbA;EACD,UAAA,EAaF,aAbE;;AAEJ,UAcK,WAAA,CAdL;EAEI,MAAA,CAAA,EAAA,MAAA;EACE,iBAAA,CAAA,EAAA,OAAA;EACI,OAAA,CAAA,EAAA,OAAA;;;;;AAMtB;AAIiB,cAUJ,oBAAA,CAVe;EAUf,mBAAA,MAAoB,EACN,MADM;EACN;;;8BAKC;;IAAA,uBAAA,CAAA,EAAA;MAEQ,MAAA,CAAA,EAAA,MAAA,GAAA,SAAA;MAgBR,iBAAA,CAAA,EAAA,OAAA,GAAA,SAAA;MAiEG,OAAA,CAAA,EAAA,OAAA,GAAA,SAAA;IAAA,CAAA,GAAA,SAAA;;;;ICrKlB,qBAGX,CAAA,EAAA;;4CD0EyB,OAAA,CAAA,IAAA;;;;;oCAOS;4BAgBR;iCAAM,OAAA,CAiEH;;;;;;;;AA/K/B;;;cCUa,oBAAkB,OAAA,CAAA,QAG7B,OAAA,CAH6B,MAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/server/helmet/providers/ServerHelmetProvider.ts","../../../src/server/helmet/index.ts"],"mappings":";;;;;;AAOA;;cAAa,aAAA,EAAa,OAAA,CAAA,IAAA,SAAA,OAAA;EAAA,QAAA,oBAsCxB,OAAA,CAAA,QAAA;EAAA,uBAAA;;;;;;;;;;;;;KAEU,aAAA,GAAgB,MAAA,QAAc,aAAA,CAAc,MAAA;AAAA;EAAA,UAAA,KAAA;IAAA,CAInD,aAAA,CAAc,GAAA,GAAM,aAAA;EAAA;AAAA;AAAA,KAMpB,YAAA;AAAA,UAEY,aAAA;EAAA,gBACC,YAAA;EAAA,eACD,YAAA;EAAA,cACD,YAAA;EAAA,YACF,YAAA;EAAA,gBACI,YAAA;EAAA,aACH,YAAA;EAAA,eACE,YAAA;EAAA,cACD,YAAA;EAAA,cACA,YAAA;EAAA,OAAA,GACJ,YAAA;EAAA;EAAA,cAEI,YAAA;EAAA,gBACE,YAAA;EAAA,oBACI,YAAA;EAAA,iBACH,YAAA;EAAA,aACJ,YAAA;EAAA,CAAA,GAAA,WACE,YAAA;AAAA;AAAA,UAGA,UAAA;EAAA,UAAA,EACH,aAAA;AAAA;AAAA,UAGG,WAAA;EAAA,MAAA;EAAA,iBAAA;EAAA,OAAA;AAAA;AAAA;AAUjB;;;AAViB,cAUJ,oBAAA;EAAA,mBAAA,MAAA,EACc,MAAA;EAAA;;;EAAA,mBAAA,OAAA,EAKC,QAAA;IAAA,QAAA;IAAA,uBAAA;MAAA,MAAA;MAAA,iBAAA;MAAA,OAAA;IAAA;IAAA,mBAAA;IAAA,aAAA;IAAA,cAAA;IAAA,qBAAA;MAAA,UAAA;4CALD,OAAA,CAAA,IAAA;MAAA;;;;oCAOS,aAAA;EAAA,UAAA,aAAA,GAgBR,MAAA;EAAA,mBAAA,UAAA,EAAM,OAAA,CAiEH,aAAA;AAAA;;;;ACrK/B;;;;;;cAAa,kBAAA,EAAkB,OAAA,CAAA,OAAA,CAG7B,OAAA,CAH6B,MAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.browser.js","names":[],"sources":["../../../src/server/links/schemas/apiLinksResponseSchema.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 apiLinkSchema = t.object({\n name: t.text({\n description: \"Name of the API link, used for identification.\",\n }),\n\n group: t.optional(\n t.text({\n description:\n \"Group to which the API link belongs, used for categorization.\",\n }),\n ),\n\n path: t.text({\n description: \"Pathname used to access the API link.\",\n }),\n\n method: t.optional(\n t.text({\n description:\n \"HTTP method used for the API link, e.g., GET, POST, etc. If not specified, defaults to GET.\",\n }),\n ),\n\n requestBodyType: t.optional(\n t.text({\n description:\n \"Type of the request body for the API link. Default is application/json for POST/PUT/PATCH, null for others.\",\n }),\n ),\n\n service: t.optional(\n t.text({\n description:\n \"Service name associated with the API link, used for service discovery.\",\n }),\n ),\n\n rawSchema: t.optional(\n t.object({\n body: t.optional(t.string()),\n response: t.optional(t.string()),\n }),\n ),\n});\n\nexport const apiLinksResponseSchema = t.object({\n prefix: t.optional(t.text()),\n links: t.array(apiLinkSchema),\n});\n\nexport type ApiLinksResponse = Static<typeof apiLinksResponseSchema>;\nexport type ApiLink = Static<typeof apiLinkSchema>;\n","import {\n $inject,\n Alepha,\n AlephaError,\n type Async,\n jsonSchemaToTypeBox,\n t,\n} from \"alepha\";\nimport { $logger } from \"alepha/logger\";\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 TRequestBody,\n UnauthorizedError,\n} from \"alepha/server\";\nimport type { ServerRouteSecure } from \"alepha/server/security\";\nimport {\n type ApiLink,\n apiLinksResponseSchema,\n} from \"../schemas/apiLinksResponseSchema.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 // all server links (local + remote)\n // THIS IS NOT USER LINKS! (which are filtered by permissions)\n protected serverLinks: Array<HttpClientLink> = [];\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.serverLinks;\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 if (this.serverLinks.some((l) => l.name === link.name)) {\n // remove existing link with the same name\n this.serverLinks = this.serverLinks.filter((l) => l.name !== link.name);\n }\n\n if (!link.rawSchema) {\n link.rawSchema = {};\n if (link.schema?.body)\n link.rawSchema.body = JSON.stringify(link.schema.body);\n if (link.schema?.response)\n link.rawSchema.response = JSON.stringify(link.schema.response);\n }\n\n this.serverLinks.push(link);\n }\n\n public get links(): HttpClientLink[] {\n // TODO: not performant at all, use a map instead for ServerLinks\n const apiLinks = this.alepha.store.get(\n \"alepha.server.request.apiLinks\",\n )?.links;\n\n if (apiLinks) {\n if (this.alepha.isBrowser()) {\n return apiLinks;\n }\n\n const links = [];\n for (const link of apiLinks) {\n const originalLink = this.serverLinks.find((l) => l.name === link.name);\n if (originalLink) {\n links.push(originalLink);\n }\n }\n return links;\n }\n\n return this.serverLinks ?? [];\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: apiLinksResponseSchema,\n },\n },\n );\n\n this.alepha.store.set(\"alepha.server.request.apiLinks\", data);\n\n return data.links;\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.\n * @param name\n */\n public can(name: string): boolean {\n return this.links.some((link) => link.name === name);\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 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 $.schema = () => {\n const link = this.links.find((l) => l.name === name);\n if (!link) {\n throw new AlephaError(`Link ${name} not found.`);\n }\n\n if (link.rawSchema && !link.schema) {\n link.schema = {};\n link.schema.body = link.rawSchema?.body\n ? (jsonSchemaToTypeBox(\n JSON.parse(link.rawSchema.body),\n ) as TRequestBody)\n : undefined;\n link.schema.response = link.rawSchema?.response\n ? (jsonSchemaToTypeBox(\n JSON.parse(link.rawSchema.response),\n ) as TRequestBody)\n : undefined;\n }\n\n return link.schema as {\n body: any;\n response: any;\n };\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.context.get<ServerRequest>(\"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 &&\n (!options.group || a.group === options.group) &&\n (!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 extends ApiLink {\n secured?: boolean | ServerRouteSecure;\n prefix?: string;\n // -- server only --\n // only for remote actions\n host?: string;\n service?: string;\n // used only for local actions, not for remote actions\n schema?: RequestConfigSchema;\n handler?: (\n request: ServerRequest,\n options: ClientRequestOptions,\n ) => Async<ServerResponseBody>;\n}\n\nexport interface ClientScope {\n group?: string;\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\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 schema: () => {\n body: T[\"body\"];\n response: T[\"response\"];\n };\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 { $client } from \"./primitives/$client.ts\";\nimport { $remote } from \"./primitives/$remote.ts\";\nimport { LinkProvider } from \"./providers/LinkProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./primitives/$client.ts\";\nexport * from \"./primitives/$remote.ts\";\nexport * from \"./providers/LinkProvider.ts\";\nexport * from \"./schemas/apiLinksResponseSchema.ts\";\n\n// ---------------------------------------------------------------- -----------------------------------------------------\n\nexport const AlephaServerLinks = $module({\n name: \"alepha.server.links\",\n primitives: [$remote, $client],\n services: [LinkProvider],\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.browser.js","names":[],"sources":["../../../src/server/links/schemas/apiLinksResponseSchema.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 apiLinkSchema = t.object({\n name: t.text({\n description: \"Name of the API link, used for identification.\",\n }),\n\n group: t.optional(\n t.text({\n description:\n \"Group to which the API link belongs, used for categorization.\",\n }),\n ),\n\n path: t.text({\n description: \"Pathname used to access the API link.\",\n }),\n\n method: t.optional(\n t.text({\n description:\n \"HTTP method used for the API link, e.g., GET, POST, etc. If not specified, defaults to GET.\",\n }),\n ),\n\n requestBodyType: t.optional(\n t.text({\n description:\n \"Type of the request body for the API link. Default is application/json for POST/PUT/PATCH, null for others.\",\n }),\n ),\n\n service: t.optional(\n t.text({\n description:\n \"Service name associated with the API link, used for service discovery.\",\n }),\n ),\n\n rawSchema: t.optional(\n t.object({\n body: t.optional(t.string()),\n response: t.optional(t.string()),\n }),\n ),\n});\n\nexport const apiLinksResponseSchema = t.object({\n prefix: t.optional(t.text()),\n links: t.array(apiLinkSchema),\n});\n\nexport type ApiLinksResponse = Static<typeof apiLinksResponseSchema>;\nexport type ApiLink = Static<typeof apiLinkSchema>;\n","import {\n $inject,\n Alepha,\n AlephaError,\n type Async,\n jsonSchemaToTypeBox,\n t,\n} from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport type { ServerRouteSecure } 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 TRequestBody,\n UnauthorizedError,\n} from \"alepha/server\";\nimport {\n type ApiLink,\n apiLinksResponseSchema,\n} from \"../schemas/apiLinksResponseSchema.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 // all server links (local + remote)\n // THIS IS NOT USER LINKS! (which are filtered by permissions)\n protected serverLinks: Array<HttpClientLink> = [];\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.serverLinks;\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 if (this.serverLinks.some((l) => l.name === link.name)) {\n // remove existing link with the same name\n this.serverLinks = this.serverLinks.filter((l) => l.name !== link.name);\n }\n\n if (!link.rawSchema) {\n link.rawSchema = {};\n if (link.schema?.body)\n link.rawSchema.body = JSON.stringify(link.schema.body);\n if (link.schema?.response)\n link.rawSchema.response = JSON.stringify(link.schema.response);\n }\n\n this.serverLinks.push(link);\n }\n\n public get links(): HttpClientLink[] {\n // TODO: not performant at all, use a map instead for ServerLinks\n const apiLinks = this.alepha.store.get(\n \"alepha.server.request.apiLinks\",\n )?.links;\n\n if (apiLinks) {\n if (this.alepha.isBrowser()) {\n return apiLinks;\n }\n\n const links = [];\n for (const link of apiLinks) {\n const originalLink = this.serverLinks.find((l) => l.name === link.name);\n if (originalLink) {\n links.push(originalLink);\n }\n }\n return links;\n }\n\n return this.serverLinks ?? [];\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: apiLinksResponseSchema,\n },\n },\n );\n\n this.alepha.store.set(\"alepha.server.request.apiLinks\", data);\n\n return data.links;\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.\n * @param name\n */\n public can(name: string): boolean {\n return this.links.some((link) => link.name === name);\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 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 $.schema = () => {\n const link = this.links.find((l) => l.name === name);\n if (!link) {\n throw new AlephaError(`Link ${name} not found.`);\n }\n\n if (link.rawSchema && !link.schema) {\n link.schema = {};\n link.schema.body = link.rawSchema?.body\n ? (jsonSchemaToTypeBox(\n JSON.parse(link.rawSchema.body),\n ) as TRequestBody)\n : undefined;\n link.schema.response = link.rawSchema?.response\n ? (jsonSchemaToTypeBox(\n JSON.parse(link.rawSchema.response),\n ) as TRequestBody)\n : undefined;\n }\n\n return link.schema as {\n body: any;\n response: any;\n };\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.context.get<ServerRequest>(\"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 &&\n (!options.group || a.group === options.group) &&\n (!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 extends ApiLink {\n secured?: boolean | ServerRouteSecure;\n prefix?: string;\n // -- server only --\n // only for remote actions\n host?: string;\n service?: string;\n // used only for local actions, not for remote actions\n schema?: RequestConfigSchema;\n handler?: (\n request: ServerRequest,\n options: ClientRequestOptions,\n ) => Async<ServerResponseBody>;\n}\n\nexport interface ClientScope {\n group?: string;\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\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 schema: () => {\n body: T[\"body\"];\n response: T[\"response\"];\n };\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 { $client } from \"./primitives/$client.ts\";\nimport { $remote } from \"./primitives/$remote.ts\";\nimport { LinkProvider } from \"./providers/LinkProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./primitives/$client.ts\";\nexport * from \"./primitives/$remote.ts\";\nexport * from \"./providers/LinkProvider.ts\";\nexport * from \"./schemas/apiLinksResponseSchema.ts\";\n\n// ---------------------------------------------------------------- -----------------------------------------------------\n\nexport const AlephaServerLinks = $module({\n name: \"alepha.server.links\",\n primitives: [$remote, $client],\n services: [LinkProvider],\n});\n"],"mappings":"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"}
@@ -1,38 +1,37 @@
1
- import { ServerRouteSecure } from "alepha/server/security";
2
- import * as alepha1 from "alepha";
1
+ import { ServerRouteSecure, ServiceAccountPrimitive, UserAccountToken } from "alepha/security";
2
+ import * as alepha23 from "alepha";
3
3
  import { Alepha, Async, KIND, Primitive, Static } from "alepha";
4
4
  import * as alepha_server0 from "alepha/server";
5
5
  import { ActionPrimitive, ClientRequestEntry, ClientRequestOptions, ClientRequestResponse, FetchResponse, HttpClient, RequestConfigSchema, ServerRequest, ServerRequestConfigEntry, ServerResponseBody, ServerTimingProvider } from "alepha/server";
6
6
  import * as alepha_logger0 from "alepha/logger";
7
7
  import * as alepha_retry0 from "alepha/retry";
8
8
  import { ProxyPrimitiveOptions, ServerProxyProvider } from "alepha/server/proxy";
9
- import { ServiceAccountPrimitive, UserAccountToken } from "alepha/security";
10
9
 
11
10
  //#region ../../src/server/links/schemas/apiLinksResponseSchema.d.ts
12
- declare const apiLinkSchema: alepha1.TObject<{
13
- name: alepha1.TString;
14
- group: alepha1.TOptional<alepha1.TString>;
15
- path: alepha1.TString;
16
- method: alepha1.TOptional<alepha1.TString>;
17
- requestBodyType: alepha1.TOptional<alepha1.TString>;
18
- service: alepha1.TOptional<alepha1.TString>;
19
- rawSchema: alepha1.TOptional<alepha1.TObject<{
20
- body: alepha1.TOptional<alepha1.TString>;
21
- response: alepha1.TOptional<alepha1.TString>;
11
+ declare const apiLinkSchema: alepha23.TObject<{
12
+ name: alepha23.TString;
13
+ group: alepha23.TOptional<alepha23.TString>;
14
+ path: alepha23.TString;
15
+ method: alepha23.TOptional<alepha23.TString>;
16
+ requestBodyType: alepha23.TOptional<alepha23.TString>;
17
+ service: alepha23.TOptional<alepha23.TString>;
18
+ rawSchema: alepha23.TOptional<alepha23.TObject<{
19
+ body: alepha23.TOptional<alepha23.TString>;
20
+ response: alepha23.TOptional<alepha23.TString>;
22
21
  }>>;
23
22
  }>;
24
- declare const apiLinksResponseSchema: alepha1.TObject<{
25
- prefix: alepha1.TOptional<alepha1.TString>;
26
- links: alepha1.TArray<alepha1.TObject<{
27
- name: alepha1.TString;
28
- group: alepha1.TOptional<alepha1.TString>;
29
- path: alepha1.TString;
30
- method: alepha1.TOptional<alepha1.TString>;
31
- requestBodyType: alepha1.TOptional<alepha1.TString>;
32
- service: alepha1.TOptional<alepha1.TString>;
33
- rawSchema: alepha1.TOptional<alepha1.TObject<{
34
- body: alepha1.TOptional<alepha1.TString>;
35
- response: alepha1.TOptional<alepha1.TString>;
23
+ declare const apiLinksResponseSchema: alepha23.TObject<{
24
+ prefix: alepha23.TOptional<alepha23.TString>;
25
+ links: alepha23.TArray<alepha23.TObject<{
26
+ name: alepha23.TString;
27
+ group: alepha23.TOptional<alepha23.TString>;
28
+ path: alepha23.TString;
29
+ method: alepha23.TOptional<alepha23.TString>;
30
+ requestBodyType: alepha23.TOptional<alepha23.TString>;
31
+ service: alepha23.TOptional<alepha23.TString>;
32
+ rawSchema: alepha23.TOptional<alepha23.TObject<{
33
+ body: alepha23.TOptional<alepha23.TString>;
34
+ response: alepha23.TOptional<alepha23.TString>;
36
35
  }>>;
37
36
  }>>;
38
37
  }>;
@@ -52,35 +51,35 @@ declare class LinkProvider {
52
51
  protected readonly httpClient: HttpClient;
53
52
  protected serverLinks: Array<HttpClientLink>;
54
53
  /**
55
- * Get applicative links registered on the server.
56
- * This does not include lazy-loaded remote links.
57
- */
54
+ * Get applicative links registered on the server.
55
+ * This does not include lazy-loaded remote links.
56
+ */
58
57
  getServerLinks(): HttpClientLink[];
59
58
  /**
60
- * Register a new link for the application.
61
- */
59
+ * Register a new link for the application.
60
+ */
62
61
  registerLink(link: HttpClientLink): void;
63
62
  get links(): HttpClientLink[];
64
63
  /**
65
- * Force browser to refresh links from the server.
66
- */
64
+ * Force browser to refresh links from the server.
65
+ */
67
66
  fetchLinks(): Promise<HttpClientLink[]>;
68
67
  /**
69
- * Create a virtual client that can be used to call actions.
70
- *
71
- * Use js Proxy under the hood.
72
- */
68
+ * Create a virtual client that can be used to call actions.
69
+ *
70
+ * Use js Proxy under the hood.
71
+ */
73
72
  client<T extends object>(scope?: ClientScope): HttpVirtualClient<T>;
74
73
  /**
75
- * Check if a link with the given name exists.
76
- * @param name
77
- */
74
+ * Check if a link with the given name exists.
75
+ * @param name
76
+ */
78
77
  can(name: string): boolean;
79
78
  /**
80
- * Resolve a link by its name and call it.
81
- * - If link is local, it will call the local handler.
82
- * - If link is remote, it will make a fetch request to the remote server.
83
- */
79
+ * Resolve a link by its name and call it.
80
+ * - If link is local, it will call the local handler.
81
+ * - If link is remote, it will make a fetch request to the remote server.
82
+ */
84
83
  follow(name: string, config?: Partial<ServerRequestConfigEntry>, options?: ClientRequestOptions & ClientScope): Promise<any>;
85
84
  protected createVirtualAction<T extends RequestConfigSchema>(name: string, scope?: ClientScope): VirtualAction<T>;
86
85
  protected followRemote(link: HttpClientLink, config?: Partial<ServerRequestConfigEntry>, options?: ClientRequestOptions): Promise<FetchResponse>;
@@ -134,46 +133,46 @@ declare const $remote: {
134
133
  };
135
134
  interface RemotePrimitiveOptions {
136
135
  /**
137
- * The URL of the remote service.
138
- * You can use a function to generate the URL dynamically.
139
- * You probably should use $env(env) to get the URL from the environment.
140
- *
141
- * @example
142
- * ```ts
143
- * import { $remote } from "alepha/server";
144
- * import { $inject, t } from "alepha";
145
- *
146
- * class App {
147
- * env = $env(t.object({
148
- * REMOTE_URL: t.text({default: "http://localhost:3000"}),
149
- * }));
150
- * remote = $remote({
151
- * url: this.env.REMOTE_URL,
152
- * });
153
- * }
154
- * ```
155
- */
136
+ * The URL of the remote service.
137
+ * You can use a function to generate the URL dynamically.
138
+ * You probably should use $env(env) to get the URL from the environment.
139
+ *
140
+ * @example
141
+ * ```ts
142
+ * import { $remote } from "alepha/server";
143
+ * import { $inject, t } from "alepha";
144
+ *
145
+ * class App {
146
+ * env = $env(t.object({
147
+ * REMOTE_URL: t.text({default: "http://localhost:3000"}),
148
+ * }));
149
+ * remote = $remote({
150
+ * url: this.env.REMOTE_URL,
151
+ * });
152
+ * }
153
+ * ```
154
+ */
156
155
  url: string | (() => string);
157
156
  /**
158
- * The name of the remote service.
159
- *
160
- * @default Member of the class containing the remote service.
161
- */
157
+ * The name of the remote service.
158
+ *
159
+ * @default Member of the class containing the remote service.
160
+ */
162
161
  name?: string;
163
162
  /**
164
- * If true, all methods of the remote service will be exposed as actions in this context.
165
- * > Note: Proxy will never use the service account, it just... proxies the request.
166
- */
163
+ * If true, all methods of the remote service will be exposed as actions in this context.
164
+ * > Note: Proxy will never use the service account, it just... proxies the request.
165
+ */
167
166
  proxy?: boolean | Partial<ProxyPrimitiveOptions & {
168
167
  /**
169
- * If true, the remote service won't be available internally, only through the proxy.
170
- */
168
+ * If true, the remote service won't be available internally, only through the proxy.
169
+ */
171
170
  noInternal: boolean;
172
171
  }>;
173
172
  /**
174
- * For communication between the server and the remote service with a security layer.
175
- * This will be used for internal communication and will not be exposed to the client.
176
- */
173
+ * For communication between the server and the remote service with a security layer.
174
+ * This will be used for internal communication and will not be exposed to the client.
175
+ */
177
176
  serviceAccount?: ServiceAccountPrimitive;
178
177
  }
179
178
  declare class RemotePrimitive extends Primitive<RemotePrimitiveOptions> {
@@ -191,62 +190,62 @@ declare class RemotePrimitiveProvider {
191
190
  protected readonly remotes: Array<ServerRemote>;
192
191
  protected readonly log: alepha_logger0.Logger;
193
192
  getRemotes(): ServerRemote[];
194
- readonly configure: alepha1.HookPrimitive<"configure">;
195
- readonly start: alepha1.HookPrimitive<"start">;
193
+ readonly configure: alepha23.HookPrimitive<"configure">;
194
+ readonly start: alepha23.HookPrimitive<"start">;
196
195
  registerRemote(value: RemotePrimitive): Promise<void>;
197
196
  protected readonly fetchLinks: alepha_retry0.RetryPrimitiveFn<(opts: FetchLinksOptions) => Promise<ApiLinksResponse>>;
198
197
  }
199
198
  interface FetchLinksOptions {
200
199
  /**
201
- * Name of the remote service.
202
- */
200
+ * Name of the remote service.
201
+ */
203
202
  service: string;
204
203
  /**
205
- * URL to fetch links from.
206
- */
204
+ * URL to fetch links from.
205
+ */
207
206
  url: string;
208
207
  /**
209
- * Authorization header containing access token.
210
- */
208
+ * Authorization header containing access token.
209
+ */
211
210
  authorization?: string;
212
211
  }
213
212
  interface ServerRemote {
214
213
  /**
215
- * URL of the remote service.
216
- */
214
+ * URL of the remote service.
215
+ */
217
216
  url: string;
218
217
  /**
219
- * Name of the remote service.
220
- */
218
+ * Name of the remote service.
219
+ */
221
220
  name: string;
222
221
  /**
223
- * Expose links as endpoint. It's not only internal.
224
- */
222
+ * Expose links as endpoint. It's not only internal.
223
+ */
225
224
  proxy: boolean;
226
225
  /**
227
- * It's only used inside the application.
228
- */
226
+ * It's only used inside the application.
227
+ */
229
228
  internal: boolean;
230
229
  /**
231
- * Links fetcher.
232
- */
230
+ * Links fetcher.
231
+ */
233
232
  links: (args: {
234
233
  authorization?: string;
235
234
  }) => Promise<ApiLinksResponse>;
236
235
  /**
237
- * Fetches schema for the remote service.
238
- */
236
+ * Fetches schema for the remote service.
237
+ */
239
238
  schema: (args: {
240
239
  name: string;
241
240
  authorization?: string;
242
241
  }) => Promise<any>;
243
242
  /**
244
- * Force a default access token provider when not provided.
245
- */
243
+ * Force a default access token provider when not provided.
244
+ */
246
245
  serviceAccount?: ServiceAccountPrimitive;
247
246
  /**
248
- * Prefix for the remote service links.
249
- */
247
+ * Prefix for the remote service links.
248
+ */
250
249
  prefix: string;
251
250
  }
252
251
  //#endregion
@@ -260,33 +259,33 @@ declare class ServerLinksProvider {
260
259
  protected readonly remoteProvider: RemotePrimitiveProvider;
261
260
  protected readonly serverTimingProvider: ServerTimingProvider;
262
261
  get prefix(): string;
263
- readonly onRoute: alepha1.HookPrimitive<"configure">;
262
+ readonly onRoute: alepha23.HookPrimitive<"configure">;
264
263
  /**
265
- * First API - Get all API links for the user.
266
- *
267
- * This is based on the user's permissions.
268
- */
264
+ * First API - Get all API links for the user.
265
+ *
266
+ * This is based on the user's permissions.
267
+ */
269
268
  readonly links: alepha_server0.RoutePrimitive<{
270
- response: alepha1.TObject<{
271
- prefix: alepha1.TOptional<alepha1.TString>;
272
- links: alepha1.TArray<alepha1.TObject<{
273
- name: alepha1.TString;
274
- group: alepha1.TOptional<alepha1.TString>;
275
- path: alepha1.TString;
276
- method: alepha1.TOptional<alepha1.TString>;
277
- requestBodyType: alepha1.TOptional<alepha1.TString>;
278
- service: alepha1.TOptional<alepha1.TString>;
279
- rawSchema: alepha1.TOptional<alepha1.TObject<{
280
- body: alepha1.TOptional<alepha1.TString>;
281
- response: alepha1.TOptional<alepha1.TString>;
269
+ response: alepha23.TObject<{
270
+ prefix: alepha23.TOptional<alepha23.TString>;
271
+ links: alepha23.TArray<alepha23.TObject<{
272
+ name: alepha23.TString;
273
+ group: alepha23.TOptional<alepha23.TString>;
274
+ path: alepha23.TString;
275
+ method: alepha23.TOptional<alepha23.TString>;
276
+ requestBodyType: alepha23.TOptional<alepha23.TString>;
277
+ service: alepha23.TOptional<alepha23.TString>;
278
+ rawSchema: alepha23.TOptional<alepha23.TObject<{
279
+ body: alepha23.TOptional<alepha23.TString>;
280
+ response: alepha23.TOptional<alepha23.TString>;
282
281
  }>>;
283
282
  }>>;
284
283
  }>;
285
284
  }>;
286
285
  /**
287
- * Retrieves API links for the user based on their permissions.
288
- * Will check on local links and remote links.
289
- */
286
+ * Retrieves API links for the user based on their permissions.
287
+ * Will check on local links and remote links.
288
+ */
290
289
  getUserApiLinks(options: GetApiLinksOptions): Promise<ApiLinksResponse>;
291
290
  }
292
291
  interface GetApiLinksOptions {
@@ -298,11 +297,11 @@ interface GetApiLinksOptions {
298
297
  declare module "alepha" {
299
298
  interface State {
300
299
  /**
301
- * API links attached to the server request state.
302
- *
303
- * @see {@link ApiLinksResponse}
304
- * @internal
305
- */
300
+ * API links attached to the server request state.
301
+ *
302
+ * @see {@link ApiLinksResponse}
303
+ * @internal
304
+ */
306
305
  "alepha.server.request.apiLinks"?: ApiLinksResponse;
307
306
  }
308
307
  }
@@ -317,7 +316,7 @@ declare module "alepha" {
317
316
  * @see {@link $client}
318
317
  * @module alepha.server.links
319
318
  */
320
- declare const AlephaServerLinks: alepha1.Service<alepha1.Module>;
319
+ declare const AlephaServerLinks: alepha23.Service<alepha23.Module>;
321
320
  //#endregion
322
321
  export { $client, $remote, AlephaServerLinks, ApiLink, ApiLinksResponse, ClientScope, FetchLinksOptions, GetApiLinksOptions, HttpClientLink, HttpVirtualClient, LinkProvider, RemotePrimitive, RemotePrimitiveOptions, RemotePrimitiveProvider, ServerLinksProvider, ServerRemote, VirtualAction, apiLinkSchema, apiLinksResponseSchema };
323
322
  //# 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/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"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/server/links/schemas/apiLinksResponseSchema.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,10 +1,9 @@
1
- import "alepha/server/security";
1
+ import { SecurityProvider } from "alepha/security";
2
2
  import { $env, $hook, $inject, $module, Alepha, AlephaError, KIND, Primitive, createPrimitive, jsonSchemaToTypeBox, t } from "alepha";
3
3
  import { $action, $route, AlephaServer, HttpClient, ServerReply, ServerTimingProvider, UnauthorizedError } from "alepha/server";
4
4
  import { $logger } from "alepha/logger";
5
5
  import { $retry } from "alepha/retry";
6
6
  import { ServerProxyProvider } from "alepha/server/proxy";
7
- import { SecurityProvider } from "alepha/security";
8
7
 
9
8
  //#region ../../src/server/links/schemas/apiLinksResponseSchema.ts
10
9
  const apiLinkSchema = t.object({