alepha 0.15.0 → 0.15.1

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 (222) hide show
  1. package/README.md +43 -98
  2. package/dist/api/audits/index.d.ts +240 -240
  3. package/dist/api/audits/index.d.ts.map +1 -1
  4. package/dist/api/audits/index.js +2 -2
  5. package/dist/api/audits/index.js.map +1 -1
  6. package/dist/api/files/index.d.ts +185 -185
  7. package/dist/api/files/index.d.ts.map +1 -1
  8. package/dist/api/files/index.js +2 -2
  9. package/dist/api/files/index.js.map +1 -1
  10. package/dist/api/jobs/index.d.ts +245 -245
  11. package/dist/api/jobs/index.d.ts.map +1 -1
  12. package/dist/api/notifications/index.browser.js +4 -4
  13. package/dist/api/notifications/index.browser.js.map +1 -1
  14. package/dist/api/notifications/index.d.ts +74 -74
  15. package/dist/api/notifications/index.d.ts.map +1 -1
  16. package/dist/api/notifications/index.js +4 -4
  17. package/dist/api/notifications/index.js.map +1 -1
  18. package/dist/api/parameters/index.d.ts +221 -221
  19. package/dist/api/parameters/index.d.ts.map +1 -1
  20. package/dist/api/users/index.d.ts +1632 -1631
  21. package/dist/api/users/index.d.ts.map +1 -1
  22. package/dist/api/users/index.js +26 -34
  23. package/dist/api/users/index.js.map +1 -1
  24. package/dist/api/verifications/index.d.ts +132 -132
  25. package/dist/api/verifications/index.d.ts.map +1 -1
  26. package/dist/batch/index.d.ts +122 -122
  27. package/dist/batch/index.d.ts.map +1 -1
  28. package/dist/bucket/index.d.ts +163 -163
  29. package/dist/bucket/index.d.ts.map +1 -1
  30. package/dist/cache/core/index.d.ts +46 -46
  31. package/dist/cache/core/index.d.ts.map +1 -1
  32. package/dist/cache/redis/index.d.ts.map +1 -1
  33. package/dist/cache/redis/index.js +2 -2
  34. package/dist/cache/redis/index.js.map +1 -1
  35. package/dist/cli/index.d.ts +5933 -201
  36. package/dist/cli/index.d.ts.map +1 -1
  37. package/dist/cli/index.js +609 -169
  38. package/dist/cli/index.js.map +1 -1
  39. package/dist/command/index.d.ts +296 -296
  40. package/dist/command/index.d.ts.map +1 -1
  41. package/dist/command/index.js +19 -19
  42. package/dist/command/index.js.map +1 -1
  43. package/dist/core/index.browser.js +268 -79
  44. package/dist/core/index.browser.js.map +1 -1
  45. package/dist/core/index.d.ts +768 -694
  46. package/dist/core/index.d.ts.map +1 -1
  47. package/dist/core/index.js +268 -79
  48. package/dist/core/index.js.map +1 -1
  49. package/dist/core/index.native.js +268 -79
  50. package/dist/core/index.native.js.map +1 -1
  51. package/dist/datetime/index.d.ts +44 -44
  52. package/dist/datetime/index.d.ts.map +1 -1
  53. package/dist/email/index.d.ts +25 -25
  54. package/dist/email/index.d.ts.map +1 -1
  55. package/dist/fake/index.d.ts +5409 -5409
  56. package/dist/fake/index.d.ts.map +1 -1
  57. package/dist/fake/index.js +22 -22
  58. package/dist/fake/index.js.map +1 -1
  59. package/dist/file/index.d.ts +435 -435
  60. package/dist/file/index.d.ts.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 +24 -24
  65. package/dist/logger/index.d.ts.map +1 -1
  66. package/dist/logger/index.js +1 -5
  67. package/dist/logger/index.js.map +1 -1
  68. package/dist/mcp/index.d.ts +216 -198
  69. package/dist/mcp/index.d.ts.map +1 -1
  70. package/dist/mcp/index.js +28 -4
  71. package/dist/mcp/index.js.map +1 -1
  72. package/dist/orm/index.browser.js +9 -9
  73. package/dist/orm/index.browser.js.map +1 -1
  74. package/dist/orm/index.bun.js +83 -76
  75. package/dist/orm/index.bun.js.map +1 -1
  76. package/dist/orm/index.d.ts +961 -960
  77. package/dist/orm/index.d.ts.map +1 -1
  78. package/dist/orm/index.js +88 -81
  79. package/dist/orm/index.js.map +1 -1
  80. package/dist/queue/core/index.d.ts +244 -244
  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.d.ts +105 -105
  84. package/dist/redis/index.d.ts.map +1 -1
  85. package/dist/retry/index.d.ts +69 -69
  86. package/dist/retry/index.d.ts.map +1 -1
  87. package/dist/router/index.d.ts +6 -6
  88. package/dist/router/index.d.ts.map +1 -1
  89. package/dist/scheduler/index.d.ts +108 -26
  90. package/dist/scheduler/index.d.ts.map +1 -1
  91. package/dist/scheduler/index.js +393 -1
  92. package/dist/scheduler/index.js.map +1 -1
  93. package/dist/security/index.d.ts +532 -209
  94. package/dist/security/index.d.ts.map +1 -1
  95. package/dist/security/index.js +1422 -11
  96. package/dist/security/index.js.map +1 -1
  97. package/dist/server/auth/index.d.ts +1296 -271
  98. package/dist/server/auth/index.d.ts.map +1 -1
  99. package/dist/server/auth/index.js +1249 -18
  100. package/dist/server/auth/index.js.map +1 -1
  101. package/dist/server/cache/index.d.ts +56 -56
  102. package/dist/server/cache/index.d.ts.map +1 -1
  103. package/dist/server/compress/index.d.ts +3 -3
  104. package/dist/server/compress/index.d.ts.map +1 -1
  105. package/dist/server/cookies/index.d.ts +6 -6
  106. package/dist/server/cookies/index.d.ts.map +1 -1
  107. package/dist/server/core/index.d.ts +196 -186
  108. package/dist/server/core/index.d.ts.map +1 -1
  109. package/dist/server/core/index.js +43 -27
  110. package/dist/server/core/index.js.map +1 -1
  111. package/dist/server/cors/index.d.ts +11 -11
  112. package/dist/server/cors/index.d.ts.map +1 -1
  113. package/dist/server/health/index.d.ts.map +1 -1
  114. package/dist/server/helmet/index.d.ts +2 -2
  115. package/dist/server/helmet/index.d.ts.map +1 -1
  116. package/dist/server/links/index.browser.js +9 -1
  117. package/dist/server/links/index.browser.js.map +1 -1
  118. package/dist/server/links/index.d.ts +83 -83
  119. package/dist/server/links/index.d.ts.map +1 -1
  120. package/dist/server/links/index.js +13 -5
  121. package/dist/server/links/index.js.map +1 -1
  122. package/dist/server/metrics/index.d.ts +514 -1
  123. package/dist/server/metrics/index.d.ts.map +1 -1
  124. package/dist/server/metrics/index.js +4462 -4
  125. package/dist/server/metrics/index.js.map +1 -1
  126. package/dist/server/multipart/index.d.ts +6 -6
  127. package/dist/server/multipart/index.d.ts.map +1 -1
  128. package/dist/server/proxy/index.d.ts +102 -102
  129. package/dist/server/proxy/index.d.ts.map +1 -1
  130. package/dist/server/rate-limit/index.d.ts +16 -16
  131. package/dist/server/rate-limit/index.d.ts.map +1 -1
  132. package/dist/server/static/index.d.ts +44 -44
  133. package/dist/server/static/index.d.ts.map +1 -1
  134. package/dist/server/swagger/index.d.ts +47 -47
  135. package/dist/server/swagger/index.d.ts.map +1 -1
  136. package/dist/sms/index.d.ts +11 -11
  137. package/dist/sms/index.d.ts.map +1 -1
  138. package/dist/sms/index.js +3 -3
  139. package/dist/sms/index.js.map +1 -1
  140. package/dist/thread/index.d.ts +71 -71
  141. package/dist/thread/index.d.ts.map +1 -1
  142. package/dist/thread/index.js +2 -2
  143. package/dist/thread/index.js.map +1 -1
  144. package/dist/topic/core/index.d.ts +318 -318
  145. package/dist/topic/core/index.d.ts.map +1 -1
  146. package/dist/topic/redis/index.d.ts +6 -6
  147. package/dist/topic/redis/index.d.ts.map +1 -1
  148. package/dist/vite/index.d.ts +2324 -1719
  149. package/dist/vite/index.d.ts.map +1 -1
  150. package/dist/vite/index.js +123 -475
  151. package/dist/vite/index.js.map +1 -1
  152. package/dist/websocket/index.browser.js +3 -3
  153. package/dist/websocket/index.browser.js.map +1 -1
  154. package/dist/websocket/index.d.ts +275 -275
  155. package/dist/websocket/index.d.ts.map +1 -1
  156. package/dist/websocket/index.js +3 -3
  157. package/dist/websocket/index.js.map +1 -1
  158. package/package.json +9 -9
  159. package/src/api/users/services/SessionService.ts +0 -10
  160. package/src/cli/apps/AlephaCli.ts +2 -2
  161. package/src/cli/apps/AlephaPackageBuilderCli.ts +9 -1
  162. package/src/cli/assets/apiHelloControllerTs.ts +2 -1
  163. package/src/cli/assets/biomeJson.ts +2 -1
  164. package/src/cli/assets/claudeMd.ts +9 -4
  165. package/src/cli/assets/dummySpecTs.ts +2 -1
  166. package/src/cli/assets/editorconfig.ts +2 -1
  167. package/src/cli/assets/mainBrowserTs.ts +2 -1
  168. package/src/cli/assets/mainCss.ts +24 -0
  169. package/src/cli/assets/tsconfigJson.ts +2 -1
  170. package/src/cli/assets/webAppRouterTs.ts +2 -1
  171. package/src/cli/assets/webHelloComponentTsx.ts +6 -2
  172. package/src/cli/atoms/appEntryOptions.ts +13 -0
  173. package/src/cli/atoms/buildOptions.ts +1 -1
  174. package/src/cli/atoms/changelogOptions.ts +1 -1
  175. package/src/cli/commands/build.ts +63 -47
  176. package/src/cli/commands/dev.ts +16 -33
  177. package/src/cli/commands/gen/env.ts +1 -1
  178. package/src/cli/commands/init.ts +17 -8
  179. package/src/cli/commands/lint.ts +1 -1
  180. package/src/cli/defineConfig.ts +9 -0
  181. package/src/cli/index.ts +2 -1
  182. package/src/cli/providers/AppEntryProvider.ts +131 -0
  183. package/src/cli/providers/ViteBuildProvider.ts +82 -0
  184. package/src/cli/providers/ViteDevServerProvider.ts +350 -0
  185. package/src/cli/providers/ViteTemplateProvider.ts +27 -0
  186. package/src/cli/services/AlephaCliUtils.ts +33 -2
  187. package/src/cli/services/PackageManagerUtils.ts +13 -6
  188. package/src/cli/services/ProjectScaffolder.ts +72 -49
  189. package/src/core/Alepha.ts +2 -8
  190. package/src/core/primitives/$module.ts +12 -0
  191. package/src/core/providers/KeylessJsonSchemaCodec.spec.ts +257 -0
  192. package/src/core/providers/KeylessJsonSchemaCodec.ts +396 -14
  193. package/src/core/providers/SchemaValidator.spec.ts +236 -0
  194. package/src/logger/providers/PrettyFormatterProvider.ts +0 -9
  195. package/src/mcp/errors/McpError.ts +30 -0
  196. package/src/mcp/index.ts +3 -0
  197. package/src/mcp/transports/SseMcpTransport.ts +16 -6
  198. package/src/orm/providers/DrizzleKitProvider.ts +3 -5
  199. package/src/orm/services/Repository.ts +11 -0
  200. package/src/server/core/index.ts +1 -1
  201. package/src/server/core/providers/BunHttpServerProvider.ts +1 -1
  202. package/src/server/core/providers/NodeHttpServerProvider.spec.ts +125 -0
  203. package/src/server/core/providers/NodeHttpServerProvider.ts +71 -22
  204. package/src/server/core/providers/ServerLoggerProvider.ts +2 -2
  205. package/src/server/core/providers/ServerProvider.ts +9 -12
  206. package/src/server/links/atoms/apiLinksAtom.ts +7 -0
  207. package/src/server/links/index.browser.ts +2 -0
  208. package/src/server/links/index.ts +2 -0
  209. package/src/vite/index.ts +3 -2
  210. package/src/vite/tasks/buildClient.ts +0 -1
  211. package/src/vite/tasks/buildServer.ts +68 -21
  212. package/src/vite/tasks/copyAssets.ts +5 -4
  213. package/src/vite/tasks/generateSitemap.ts +64 -23
  214. package/src/vite/tasks/index.ts +0 -2
  215. package/src/vite/tasks/prerenderPages.ts +49 -24
  216. package/src/cli/assets/indexHtml.ts +0 -15
  217. package/src/cli/commands/format.ts +0 -23
  218. package/src/vite/helpers/boot.ts +0 -117
  219. package/src/vite/plugins/viteAlephaDev.ts +0 -177
  220. package/src/vite/tasks/devServer.ts +0 -71
  221. package/src/vite/tasks/runAlepha.ts +0 -270
  222. /package/dist/orm/{chunk-DtkW-qnP.js → chunk-DH6iiROE.js} +0 -0
@@ -68,23 +68,23 @@ declare class ServerCorsProvider {
68
68
  headers: string[];
69
69
  }>;
70
70
  /**
71
- * Registered CORS configurations with their path patterns
72
- */
71
+ * Registered CORS configurations with their path patterns
72
+ */
73
73
  readonly registeredConfigs: CorsPrimitiveConfig[];
74
74
  /**
75
- * Register a CORS configuration (called by primitives)
76
- */
75
+ * Register a CORS configuration (called by primitives)
76
+ */
77
77
  registerCors(config: CorsPrimitiveConfig): void;
78
78
  protected readonly onStart: alepha1.HookPrimitive<"start">;
79
79
  protected readonly configure: alepha1.HookPrimitive<"configure">;
80
80
  protected readonly onRequest: alepha1.HookPrimitive<"server:onRequest">;
81
81
  /**
82
- * Build complete CORS options by merging with global defaults
83
- */
82
+ * Build complete CORS options by merging with global defaults
83
+ */
84
84
  protected buildCorsOptions(config: CorsPrimitiveConfig): CorsOptions;
85
85
  /**
86
- * Apply CORS headers to the response
87
- */
86
+ * Apply CORS headers to the response
87
+ */
88
88
  protected applyCorsHeaders(request: {
89
89
  headers: {
90
90
  origin?: string;
@@ -101,9 +101,9 @@ type ServerCorsProviderOptions = CorsOptions;
101
101
  declare module "alepha/server" {
102
102
  interface ServerRoute {
103
103
  /**
104
- * Route-specific CORS configuration.
105
- * If set, overrides the global CORS options for this route.
106
- */
104
+ * Route-specific CORS configuration.
105
+ * If set, overrides the global CORS options for this route.
106
+ */
107
107
  cors?: CorsOptions;
108
108
  }
109
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"],"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"}
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;;;;;;;;;;;;;cAAa,KAAA;EAAA,UAAkB,mBAAA,GAAsB,qBAAA;EAAA;;UAMpC,mBAAA,SAA4B,OAAA,CAAQ,WAAA;;EAEnD,IAAA;EAF2C;EAI3C,KAAA;AAAA;AAAA,UAKe,qBAAA;EAAA,SACN,IAAA;EAAA,SACA,OAAA,EAAS,mBAAA;AAAA;AAAA,cAGP,aAAA,SACH,SAAA,CAAU,mBAAA,aACP,qBAAA;EAAA,mBAEQ,kBAAA,EAAkB,kBAAA;EAAA,IAE1B,IAAA,CAAA;EAAA,UAID,MAAA,CAAA;AAAA;;;;;;cCxCC,WAAA,EAAW,OAAA,CAAA,IAAA,SAAA,OAAA;4BAoCtB,OAAA,CAAA,OAAA;;;;;;KAEU,WAAA,GAAc,MAAA,QAAc,WAAA,CAAY,MAAA;AAAA;EAAA,UAGxC,KAAA;IAAA,CACP,WAAA,CAAY,GAAA,GAAM,WAAA;EAAA;AAAA;AAAA,cAMV,kBAAA;EAAA,mBACQ,GAAA,EADU,cAAA,CACP,MAAA;EAAA,mBACH,oBAAA,EAAoB,oBAAA;EAAA,mBACpB,aAAA,EAAa,QAAA;;;;;;;ED/BhC;;;EAAA,SCoCgB,iBAAA,EAAmB,mBAAA;ED/BC;;;ECoC7B,YAAA,CAAa,MAAA,EAAQ,mBAAA;EAAA,mBAIT,OAAA,EAJ4B,OAAA,CAIrB,aAAA;EAAA,mBAuBP,SAAA,EAvBO,OAAA,CAuBE,aAAA;EAAA,mBAwBT,SAAA,EAxBS,OAAA,CAwBA,aAAA;EDrFS;AAGvC;;EAHuC,UCiG3B,gBAAA,CAAiB,MAAA,EAAQ,mBAAA,GAAsB,WAAA;ED7FvC;;;EAAA,UC0GR,gBAAA,CACR,OAAA;IACE,OAAA;MAAW,MAAA;IAAA;IACX,KAAA;MAAS,SAAA,GAAY,IAAA,UAAc,KAAA;IAAA;EAAA,GAErC,OAAA,EAAS,WAAA;EAqBJ,eAAA,CACL,MAAA,sBACA,OAAA,EAAS,WAAA;AAAA;AAAA,KAWD,yBAAA,GAA4B,WAAA;;;;YC3K5B,WAAA;;AFKZ;;;IEAI,IAAA,GAAO,WAAA;EAAA;AAAA;;;;;;;;;;;AFMX;;;;;;;;;;AASA;;;;;;cEiBa,gBAAA,EAAgB,OAAA,CAAA,OAAA,CAI3B,OAAA,CAJ2B,MAAA"}
@@ -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"],"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"}
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,mBACQ,IAAA,EAAM,gBAAA;EAAA,mBACN,MAAA,EAAM,MAAA;EAAA,SAET,MAAA,iBAAM,cAAA;;eAFG,OAAA,CAAA,OAAA;;;;;;WAWT,OAAA,iBAAO,cAAA;;eATD,OAAA,CAAA,OAAA;;;;;;YAkBZ,WAAA,CAAA;;;;;;;;;cC9BC,YAAA,UAAY,OAAA;WAKvB,OAAA,CAAA,OAAA;;;;;;;;;;;ADGF;;cEOa,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"],"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
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/server/helmet/providers/ServerHelmetProvider.ts","../../../src/server/helmet/index.ts"],"mappings":";;;;;;;;cAOa,aAAA,EAAa,OAAA,CAAA,IAAA,SAAA,OAAA;8BAsCxB,OAAA,CAAA,QAAA;;;;;;;;;;;;;;KAEU,aAAA,GAAgB,MAAA,QAAc,aAAA,CAAc,MAAA;AAAA;EAAA,UAG5C,KAAA;IAAA,CACP,aAAA,CAAc,GAAA,GAAM,aAAA;EAAA;AAAA;AAAA,KAMpB,YAAA;AAAA,UAEY,aAAA;EACf,aAAA,GAAgB,YAAA;EAChB,YAAA,GAAe,YAAA;EACf,WAAA,GAAc,YAAA;EACd,SAAA,GAAY,YAAA;EACZ,aAAA,GAAgB,YAAA;EAChB,UAAA,GAAa,YAAA;EACb,YAAA,GAAe,YAAA;EACf,WAAA,GAAc,YAAA;EACd,WAAA,GAAc,YAAA;EACd,OAAA,GAAU,YAAA;EACV,YAAA;EACA,WAAA,GAAc,YAAA;EACd,aAAA,GAAgB,YAAA;EAChB,iBAAA,GAAoB,YAAA;EACpB,cAAA,GAAiB,YAAA;EACjB,UAAA,GAAa,YAAA;EAAA,CACZ,GAAA,WAAc,YAAA;AAAA;AAAA,UAGA,UAAA;EACf,UAAA,EAAY,aAAA;AAAA;AAAA,UAGG,WAAA;EACf,MAAA;EACA,iBAAA;EACA,OAAA;AAAA;;;;;cAOW,oBAAA;EAAA,mBACQ,MAAA,EAAM,MAAA;;;;qBAKN,OAAA,EAAO,QAAA;;;;;;;;;;;;4CALD,OAAA,CAAA,IAAA;MAAA;;;;YAOf,oBAAA,CAAA,GAAwB,aAAA;EAAA,UAgBxB,YAAA,CAAA,GAAgB,MAAA;EAAA,mBAiEP,UAAA,EAjEa,OAAA,CAiEH,aAAA;AAAA;;;;;;;AA/K/B;;;cCUa,kBAAA,EAAkB,OAAA,CAAA,OAAA,CAG7B,OAAA,CAH6B,MAAA"}
@@ -1,4 +1,4 @@
1
- import { $inject, $module, Alepha, AlephaError, KIND, Primitive, createPrimitive, jsonSchemaToTypeBox, t } from "alepha";
1
+ import { $atom, $inject, $module, Alepha, AlephaError, KIND, Primitive, createPrimitive, jsonSchemaToTypeBox, t } from "alepha";
2
2
  import { $logger } from "alepha/logger";
3
3
  import { HttpClient, ServerReply, UnauthorizedError } from "alepha/server";
4
4
 
@@ -20,6 +20,13 @@ const apiLinksResponseSchema = t.object({
20
20
  links: t.array(apiLinkSchema)
21
21
  });
22
22
 
23
+ //#endregion
24
+ //#region ../../src/server/links/atoms/apiLinksAtom.ts
25
+ const apiLinksAtom = $atom({
26
+ name: "alepha.server.request.apiLinks",
27
+ schema: t.optional(apiLinksResponseSchema)
28
+ });
29
+
23
30
  //#endregion
24
31
  //#region ../../src/server/links/providers/LinkProvider.ts
25
32
  /**
@@ -247,6 +254,7 @@ $remote[KIND] = RemotePrimitive;
247
254
  //#region ../../src/server/links/index.browser.ts
248
255
  const AlephaServerLinks = $module({
249
256
  name: "alepha.server.links",
257
+ atoms: [apiLinksAtom],
250
258
  primitives: [$remote, $client],
251
259
  services: [LinkProvider]
252
260
  });
@@ -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 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":";;;;;AAGA,MAAa,gBAAgB,EAAE,OAAO;CACpC,MAAM,EAAE,KAAK,EACX,aAAa,kDACd,CAAC;CAEF,OAAO,EAAE,SACP,EAAE,KAAK,EACL,aACE,iEACH,CAAC,CACH;CAED,MAAM,EAAE,KAAK,EACX,aAAa,yCACd,CAAC;CAEF,QAAQ,EAAE,SACR,EAAE,KAAK,EACL,aACE,+FACH,CAAC,CACH;CAED,iBAAiB,EAAE,SACjB,EAAE,KAAK,EACL,aACE,+GACH,CAAC,CACH;CAED,SAAS,EAAE,SACT,EAAE,KAAK,EACL,aACE,0EACH,CAAC,CACH;CAED,WAAW,EAAE,SACX,EAAE,OAAO;EACP,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC;EAC5B,UAAU,EAAE,SAAS,EAAE,QAAQ,CAAC;EACjC,CAAC,CACH;CACF,CAAC;AAEF,MAAa,yBAAyB,EAAE,OAAO;CAC7C,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC;CAC5B,OAAO,EAAE,MAAM,cAAc;CAC9B,CAAC;;;;;;;AClBF,IAAa,eAAb,MAAa,aAAa;CACxB,OAAO,OAAO,EACZ,UAAU,eACX;CAED,AAAmB,MAAM,SAAS;CAClC,AAAmB,SAAS,QAAQ,OAAO;CAC3C,AAAmB,aAAa,QAAQ,WAAW;CAInD,AAAU,cAAqC,EAAE;;;;;CAMjD,AAAO,iBAAmC;AACxC,MAAI,KAAK,OAAO,WAAW,EAAE;AAC3B,QAAK,IAAI,KACP,uGACD;AACD,UAAO,EAAE;;AAGX,SAAO,KAAK;;;;;CAMd,AAAO,aAAa,MAA4B;AAC9C,MAAI,KAAK,OAAO,WAAW,EAAE;AAC3B,QAAK,IAAI,KACP,oGACD;AACD;;AAGF,MAAI,CAAC,KAAK,WAAW,CAAC,KAAK,KACzB,OAAM,IAAI,YACR,sDACD;AAGH,MAAI,KAAK,YAAY,MAAM,MAAM,EAAE,SAAS,KAAK,KAAK,CAEpD,MAAK,cAAc,KAAK,YAAY,QAAQ,MAAM,EAAE,SAAS,KAAK,KAAK;AAGzE,MAAI,CAAC,KAAK,WAAW;AACnB,QAAK,YAAY,EAAE;AACnB,OAAI,KAAK,QAAQ,KACf,MAAK,UAAU,OAAO,KAAK,UAAU,KAAK,OAAO,KAAK;AACxD,OAAI,KAAK,QAAQ,SACf,MAAK,UAAU,WAAW,KAAK,UAAU,KAAK,OAAO,SAAS;;AAGlE,OAAK,YAAY,KAAK,KAAK;;CAG7B,IAAW,QAA0B;EAEnC,MAAM,WAAW,KAAK,OAAO,MAAM,IACjC,iCACD,EAAE;AAEH,MAAI,UAAU;AACZ,OAAI,KAAK,OAAO,WAAW,CACzB,QAAO;GAGT,MAAM,QAAQ,EAAE;AAChB,QAAK,MAAM,QAAQ,UAAU;IAC3B,MAAM,eAAe,KAAK,YAAY,MAAM,MAAM,EAAE,SAAS,KAAK,KAAK;AACvE,QAAI,aACF,OAAM,KAAK,aAAa;;AAG5B,UAAO;;AAGT,SAAO,KAAK,eAAe,EAAE;;;;;CAM/B,MAAa,aAAwC;EACnD,MAAM,EAAE,SAAS,MAAM,KAAK,WAAW,MACrC,GAAG,aAAa,KAAK,YACrB;GACE,QAAQ;GACR,QAAQ,EACN,UAAU,wBACX;GACF,CACF;AAED,OAAK,OAAO,MAAM,IAAI,kCAAkC,KAAK;AAE7D,SAAO,KAAK;;;;;;;CAQd,AAAO,OACL,QAAqB,EAAE,EACD;AACtB,SAAO,IAAI,MAA4B,EAAE,EAA0B,EACjE,MAAM,GAAG,SAAS;AAChB,OAAI,OAAO,SAAS,SAClB;AAGF,UAAO,KAAK,oBAAyC,MAAM,MAAM;KAEpE,CAAC;;;;;;CAOJ,AAAO,IAAI,MAAuB;AAChC,SAAO,KAAK,MAAM,MAAM,SAAS,KAAK,SAAS,KAAK;;;;;;;CAQtD,MAAa,OACX,MACA,SAA4C,EAAE,EAC9C,UAA8C,EAAE,EAClC;AACd,OAAK,IAAI,MAAM,kBAAkB;GAAE;GAAM;GAAQ;GAAS,CAAC;EAC3D,MAAM,OAAO,MAAM,KAAK,cAAc,MAAM,QAAQ;AAGpD,MAAI,KAAK,WAAW,CAAC,QAAQ,SAAS;AACpC,QAAK,IAAI,MAAM,oBAAoB,EAAE,MAAM,CAAC;AAC5C,UAAO,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;;AAGH,OAAK,IAAI,MAAM,qBAAqB;GAClC;GACA,MAAM,KAAK;GACX,SAAS,KAAK;GACf,CAAC;AAEF,SAAO,KAAK,aAAa,MAAM,QAAQ,QAAQ,CAAC,MAC7C,aAAa,SAAS,KACxB;;CAGH,AAAU,oBACR,MACA,QAAqB,EAAE,EACL;EAClB,MAAM,IAAsB,OAC1B,SAAc,EAAE,EAChB,UAAgC,EAAE,KAC/B;AACH,UAAO,KAAK,OAAO,MAAM,QAAQ;IAC/B,GAAG;IACH,GAAG;IACJ,CAAC;;AAGJ,SAAO,eAAe,GAAG,QAAQ;GAC/B,OAAO;GACP,UAAU;GACX,CAAC;AAEF,IAAE,MAAM,OAAO,SAAc,EAAE,EAAE,UAAgC,EAAE,KAAK;AACtE,UAAO,KAAK,OAAO,MAAM,QAAQ;IAC/B,GAAG;IACH,GAAG;IACJ,CAAC;;AAGJ,IAAE,QAAQ,OAAO,SAAc,EAAE,EAAE,UAAgC,EAAE,KAAK;GACxE,MAAM,OAAO,MAAM,KAAK,cAAc,MAAM,MAAM;AAClD,UAAO,KAAK,aAAa,MAAM,QAAQ,QAAQ;;AAGjD,IAAE,YAAY;AACZ,UAAO,KAAK,IAAI,KAAK;;AAGvB,IAAE,eAAe;GACf,MAAM,OAAO,KAAK,MAAM,MAAM,MAAM,EAAE,SAAS,KAAK;AACpD,OAAI,CAAC,KACH,OAAM,IAAI,YAAY,QAAQ,KAAK,aAAa;AAGlD,OAAI,KAAK,aAAa,CAAC,KAAK,QAAQ;AAClC,SAAK,SAAS,EAAE;AAChB,SAAK,OAAO,OAAO,KAAK,WAAW,OAC9B,oBACC,KAAK,MAAM,KAAK,UAAU,KAAK,CAChC,GACD;AACJ,SAAK,OAAO,WAAW,KAAK,WAAW,WAClC,oBACC,KAAK,MAAM,KAAK,UAAU,SAAS,CACpC,GACD;;AAGN,UAAO,KAAK;;AAMd,SAAO;;CAGT,MAAgB,aACd,MACA,SAA4C,EAAE,EAC9C,UAAgC,EAAE,EACV;AACxB,UAAQ,YAAY,EAAE;AACtB,UAAQ,QAAQ,UAAU,IAAI,QAAQ,QAAQ,QAAQ,QAAQ;EAE9D,MAAM,MAAM,KAAK,OAAO,QAAQ,IAAmB,UAAU;AAC7D,MAAI,KAAK,QAAQ,cACf,SAAQ,QAAQ,QAAQ,IAAI,iBAAiB,IAAI,QAAQ,cAAc;EAGzE,MAAM,UAAU,KAAK,OAAO,QAAQ,IAAI,UAAU;AAClD,MAAI,OAAO,YAAY,SACrB,SAAQ,QAAQ,QAAQ,IAAI,gBAAgB,QAAQ;EAGtD,MAAM,SAAS;GACb,GAAG;GAGH,QAAQ;IACN,MAAM,EAAE,KAAK;IACb,UAAU,EAAE,KAAK;IAClB;GACF;AAGD,MAAI,CAAC,KAAK,QAAQ,KAAK,QACrB,QAAO,OAAO,IAAI,KAAK,UAAU,OAAO;AAG1C,SAAO,OAAO,GAAG,OAAO,UAAU,SAAS,OAAO;AAClD,SAAO,SAAS;AAGhB,SAAO,KAAK,WAAW,YAAY;GACjC,MAAM,KAAK;GACX;GACA;GACQ;GACT,CAAC;;CAGJ,MAAgB,cACd,MACA,UAAuB,EAAE,EACA;AACzB,MACE,KAAK,OAAO,WAAW,IACvB,CAAC,KAAK,OAAO,MAAM,IAAI,iCAAiC,CAExD,OAAM,KAAK,YAAY;EAGzB,MAAM,OAAO,KAAK,MAAM,MACrB,MACC,EAAE,SAAS,SACV,CAAC,QAAQ,SAAS,EAAE,UAAU,QAAQ,WACtC,CAAC,QAAQ,WAAW,QAAQ,YAAY,EAAE,SAC9C;AAED,MAAI,CAAC,MAAM;GACT,MAAM,QAAQ,IAAI,kBAAkB,UAAU,KAAK,aAAa;AAEhE,SAAM,KAAK,OAAO,OAAO,KAAK,kBAAkB;IAC9C,OAAO;IACP;IACD,CAAC;AACF,SAAM;;AAGR,MAAI,QAAQ,SACV,QAAO;GACL,GAAG;GACH,MAAM,QAAQ;GACf;AAGH,SAAO;;;;;;;;;ACpVX,MAAa,WACX,UACyB;AACzB,QAAO,QAAQ,aAAa,CAAC,OAAU,MAAM;;AAG/C,QAAQ,QAAQ;;;;;;;;;;;;;ACHhB,MAAa,WAAW,YAAoC;AAC1D,QAAO,gBAAgB,iBAAiB,QAAQ;;AAuDlD,IAAa,kBAAb,cAAqC,UAAkC;CACrE,IAAW,OAAe;AACxB,SAAO,KAAK,QAAQ,QAAQ,KAAK,OAAO;;;AAI5C,QAAQ,QAAQ;;;;AC7DhB,MAAa,oBAAoB,QAAQ;CACvC,MAAM;CACN,YAAY,CAAC,SAAS,QAAQ;CAC9B,UAAU,CAAC,aAAa;CACzB,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/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 { $atom, t } from \"alepha\";\nimport { apiLinksResponseSchema } from \"../schemas/apiLinksResponseSchema.ts\";\n\nexport const apiLinksAtom = $atom({\n name: \"alepha.server.request.apiLinks\",\n schema: t.optional(apiLinksResponseSchema),\n});\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 { apiLinksAtom } from \"./atoms/apiLinksAtom.ts\";\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 atoms: [apiLinksAtom],\n primitives: [$remote, $client],\n services: [LinkProvider],\n});\n"],"mappings":"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"}
@@ -51,35 +51,35 @@ declare class LinkProvider {
51
51
  protected readonly httpClient: HttpClient;
52
52
  protected serverLinks: Array<HttpClientLink>;
53
53
  /**
54
- * Get applicative links registered on the server.
55
- * This does not include lazy-loaded remote links.
56
- */
54
+ * Get applicative links registered on the server.
55
+ * This does not include lazy-loaded remote links.
56
+ */
57
57
  getServerLinks(): HttpClientLink[];
58
58
  /**
59
- * Register a new link for the application.
60
- */
59
+ * Register a new link for the application.
60
+ */
61
61
  registerLink(link: HttpClientLink): void;
62
62
  get links(): HttpClientLink[];
63
63
  /**
64
- * Force browser to refresh links from the server.
65
- */
64
+ * Force browser to refresh links from the server.
65
+ */
66
66
  fetchLinks(): Promise<HttpClientLink[]>;
67
67
  /**
68
- * Create a virtual client that can be used to call actions.
69
- *
70
- * Use js Proxy under the hood.
71
- */
68
+ * Create a virtual client that can be used to call actions.
69
+ *
70
+ * Use js Proxy under the hood.
71
+ */
72
72
  client<T extends object>(scope?: ClientScope): HttpVirtualClient<T>;
73
73
  /**
74
- * Check if a link with the given name exists.
75
- * @param name
76
- */
74
+ * Check if a link with the given name exists.
75
+ * @param name
76
+ */
77
77
  can(name: string): boolean;
78
78
  /**
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
- */
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
+ */
83
83
  follow(name: string, config?: Partial<ServerRequestConfigEntry>, options?: ClientRequestOptions & ClientScope): Promise<any>;
84
84
  protected createVirtualAction<T extends RequestConfigSchema>(name: string, scope?: ClientScope): VirtualAction<T>;
85
85
  protected followRemote(link: HttpClientLink, config?: Partial<ServerRequestConfigEntry>, options?: ClientRequestOptions): Promise<FetchResponse>;
@@ -133,46 +133,46 @@ declare const $remote: {
133
133
  };
134
134
  interface RemotePrimitiveOptions {
135
135
  /**
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
- */
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
+ */
155
155
  url: string | (() => string);
156
156
  /**
157
- * The name of the remote service.
158
- *
159
- * @default Member of the class containing the remote service.
160
- */
157
+ * The name of the remote service.
158
+ *
159
+ * @default Member of the class containing the remote service.
160
+ */
161
161
  name?: string;
162
162
  /**
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
- */
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
+ */
166
166
  proxy?: boolean | Partial<ProxyPrimitiveOptions & {
167
167
  /**
168
- * If true, the remote service won't be available internally, only through the proxy.
169
- */
168
+ * If true, the remote service won't be available internally, only through the proxy.
169
+ */
170
170
  noInternal: boolean;
171
171
  }>;
172
172
  /**
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
- */
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
+ */
176
176
  serviceAccount?: ServiceAccountPrimitive;
177
177
  }
178
178
  declare class RemotePrimitive extends Primitive<RemotePrimitiveOptions> {
@@ -197,55 +197,55 @@ declare class RemotePrimitiveProvider {
197
197
  }
198
198
  interface FetchLinksOptions {
199
199
  /**
200
- * Name of the remote service.
201
- */
200
+ * Name of the remote service.
201
+ */
202
202
  service: string;
203
203
  /**
204
- * URL to fetch links from.
205
- */
204
+ * URL to fetch links from.
205
+ */
206
206
  url: string;
207
207
  /**
208
- * Authorization header containing access token.
209
- */
208
+ * Authorization header containing access token.
209
+ */
210
210
  authorization?: string;
211
211
  }
212
212
  interface ServerRemote {
213
213
  /**
214
- * URL of the remote service.
215
- */
214
+ * URL of the remote service.
215
+ */
216
216
  url: string;
217
217
  /**
218
- * Name of the remote service.
219
- */
218
+ * Name of the remote service.
219
+ */
220
220
  name: string;
221
221
  /**
222
- * Expose links as endpoint. It's not only internal.
223
- */
222
+ * Expose links as endpoint. It's not only internal.
223
+ */
224
224
  proxy: boolean;
225
225
  /**
226
- * It's only used inside the application.
227
- */
226
+ * It's only used inside the application.
227
+ */
228
228
  internal: boolean;
229
229
  /**
230
- * Links fetcher.
231
- */
230
+ * Links fetcher.
231
+ */
232
232
  links: (args: {
233
233
  authorization?: string;
234
234
  }) => Promise<ApiLinksResponse>;
235
235
  /**
236
- * Fetches schema for the remote service.
237
- */
236
+ * Fetches schema for the remote service.
237
+ */
238
238
  schema: (args: {
239
239
  name: string;
240
240
  authorization?: string;
241
241
  }) => Promise<any>;
242
242
  /**
243
- * Force a default access token provider when not provided.
244
- */
243
+ * Force a default access token provider when not provided.
244
+ */
245
245
  serviceAccount?: ServiceAccountPrimitive;
246
246
  /**
247
- * Prefix for the remote service links.
248
- */
247
+ * Prefix for the remote service links.
248
+ */
249
249
  prefix: string;
250
250
  }
251
251
  //#endregion
@@ -261,10 +261,10 @@ declare class ServerLinksProvider {
261
261
  get prefix(): string;
262
262
  readonly onRoute: alepha23.HookPrimitive<"configure">;
263
263
  /**
264
- * First API - Get all API links for the user.
265
- *
266
- * This is based on the user's permissions.
267
- */
264
+ * First API - Get all API links for the user.
265
+ *
266
+ * This is based on the user's permissions.
267
+ */
268
268
  readonly links: alepha_server0.RoutePrimitive<{
269
269
  response: alepha23.TObject<{
270
270
  prefix: alepha23.TOptional<alepha23.TString>;
@@ -283,9 +283,9 @@ declare class ServerLinksProvider {
283
283
  }>;
284
284
  }>;
285
285
  /**
286
- * Retrieves API links for the user based on their permissions.
287
- * Will check on local links and remote links.
288
- */
286
+ * Retrieves API links for the user based on their permissions.
287
+ * Will check on local links and remote links.
288
+ */
289
289
  getUserApiLinks(options: GetApiLinksOptions): Promise<ApiLinksResponse>;
290
290
  }
291
291
  interface GetApiLinksOptions {
@@ -297,11 +297,11 @@ interface GetApiLinksOptions {
297
297
  declare module "alepha" {
298
298
  interface State {
299
299
  /**
300
- * API links attached to the server request state.
301
- *
302
- * @see {@link ApiLinksResponse}
303
- * @internal
304
- */
300
+ * API links attached to the server request state.
301
+ *
302
+ * @see {@link ApiLinksResponse}
303
+ * @internal
304
+ */
305
305
  "alepha.server.request.apiLinks"?: ApiLinksResponse;
306
306
  }
307
307
  }
@@ -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"],"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,5 +1,5 @@
1
1
  import { SecurityProvider } from "alepha/security";
2
- import { $env, $hook, $inject, $module, Alepha, AlephaError, KIND, Primitive, createPrimitive, jsonSchemaToTypeBox, t } from "alepha";
2
+ import { $atom, $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";
@@ -23,6 +23,13 @@ const apiLinksResponseSchema = t.object({
23
23
  links: t.array(apiLinkSchema)
24
24
  });
25
25
 
26
+ //#endregion
27
+ //#region ../../src/server/links/atoms/apiLinksAtom.ts
28
+ const apiLinksAtom = $atom({
29
+ name: "alepha.server.request.apiLinks",
30
+ schema: t.optional(apiLinksResponseSchema)
31
+ });
32
+
26
33
  //#endregion
27
34
  //#region ../../src/server/links/providers/LinkProvider.ts
28
35
  /**
@@ -309,8 +316,8 @@ var RemotePrimitiveProvider = class {
309
316
  proxy: !!options.proxy,
310
317
  internal: !proxy.noInternal,
311
318
  schema: async (opts) => {
312
- const { authorization, name: name$1 } = opts;
313
- return await fetch(`${url}${linkPath}/${name$1}/schema`, { headers: new Headers(authorization ? { authorization } : {}) }).then((it) => it.json());
319
+ const { authorization, name } = opts;
320
+ return await fetch(`${url}${linkPath}/${name}/schema`, { headers: new Headers(authorization ? { authorization } : {}) }).then((it) => it.json());
314
321
  },
315
322
  links: async (opts) => {
316
323
  const { authorization } = opts;
@@ -327,8 +334,8 @@ var RemotePrimitiveProvider = class {
327
334
  if (options.proxy) this.proxyProvider.createProxy({
328
335
  path: `${this.env.SERVER_API_PREFIX}/${name}/*`,
329
336
  target: url,
330
- rewrite: (url$1) => {
331
- url$1.pathname = url$1.pathname.replace(`${this.env.SERVER_API_PREFIX}/${name}`, remote.prefix);
337
+ rewrite: (url) => {
338
+ url.pathname = url.pathname.replace(`${this.env.SERVER_API_PREFIX}/${name}`, remote.prefix);
332
339
  },
333
340
  ...proxy
334
341
  });
@@ -473,6 +480,7 @@ var ServerLinksProvider = class {
473
480
  */
474
481
  const AlephaServerLinks = $module({
475
482
  name: "alepha.server.links",
483
+ atoms: [apiLinksAtom],
476
484
  primitives: [$remote, $client],
477
485
  services: [
478
486
  AlephaServer,