alepha 0.13.8 → 0.14.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 (160) hide show
  1. package/dist/api/audits/index.d.ts +418 -338
  2. package/dist/api/audits/index.d.ts.map +1 -0
  3. package/dist/api/files/index.d.ts +81 -1
  4. package/dist/api/files/index.d.ts.map +1 -0
  5. package/dist/api/jobs/index.d.ts +107 -27
  6. package/dist/api/jobs/index.d.ts.map +1 -0
  7. package/dist/api/notifications/index.d.ts +21 -1
  8. package/dist/api/notifications/index.d.ts.map +1 -0
  9. package/dist/api/parameters/index.d.ts +455 -8
  10. package/dist/api/parameters/index.d.ts.map +1 -0
  11. package/dist/api/users/index.d.ts +844 -840
  12. package/dist/api/users/index.d.ts.map +1 -0
  13. package/dist/api/verifications/index.d.ts.map +1 -0
  14. package/dist/batch/index.d.ts.map +1 -0
  15. package/dist/bucket/index.d.ts.map +1 -0
  16. package/dist/cache/core/index.d.ts.map +1 -0
  17. package/dist/cache/redis/index.d.ts.map +1 -0
  18. package/dist/cli/index.d.ts +254 -59
  19. package/dist/cli/index.d.ts.map +1 -0
  20. package/dist/cli/index.js +499 -127
  21. package/dist/cli/index.js.map +1 -1
  22. package/dist/command/index.d.ts +217 -10
  23. package/dist/command/index.d.ts.map +1 -0
  24. package/dist/command/index.js +350 -74
  25. package/dist/command/index.js.map +1 -1
  26. package/dist/core/index.browser.js +1334 -1318
  27. package/dist/core/index.browser.js.map +1 -1
  28. package/dist/core/index.d.ts +76 -72
  29. package/dist/core/index.d.ts.map +1 -0
  30. package/dist/core/index.js +1337 -1321
  31. package/dist/core/index.js.map +1 -1
  32. package/dist/core/index.native.js +1337 -1321
  33. package/dist/core/index.native.js.map +1 -1
  34. package/dist/datetime/index.d.ts.map +1 -0
  35. package/dist/email/index.d.ts.map +1 -0
  36. package/dist/fake/index.d.ts.map +1 -0
  37. package/dist/file/index.d.ts.map +1 -0
  38. package/dist/file/index.js.map +1 -1
  39. package/dist/lock/core/index.d.ts.map +1 -0
  40. package/dist/lock/redis/index.d.ts.map +1 -0
  41. package/dist/logger/index.d.ts +1 -0
  42. package/dist/logger/index.d.ts.map +1 -0
  43. package/dist/mcp/index.d.ts +820 -0
  44. package/dist/mcp/index.d.ts.map +1 -0
  45. package/dist/mcp/index.js +978 -0
  46. package/dist/mcp/index.js.map +1 -0
  47. package/dist/orm/index.d.ts +234 -107
  48. package/dist/orm/index.d.ts.map +1 -0
  49. package/dist/orm/index.js +376 -316
  50. package/dist/orm/index.js.map +1 -1
  51. package/dist/queue/core/index.d.ts +4 -4
  52. package/dist/queue/core/index.d.ts.map +1 -0
  53. package/dist/queue/redis/index.d.ts.map +1 -0
  54. package/dist/queue/redis/index.js +2 -4
  55. package/dist/queue/redis/index.js.map +1 -1
  56. package/dist/redis/index.d.ts +400 -29
  57. package/dist/redis/index.d.ts.map +1 -0
  58. package/dist/redis/index.js +412 -21
  59. package/dist/redis/index.js.map +1 -1
  60. package/dist/retry/index.d.ts.map +1 -0
  61. package/dist/router/index.d.ts.map +1 -0
  62. package/dist/scheduler/index.d.ts +6 -6
  63. package/dist/scheduler/index.d.ts.map +1 -0
  64. package/dist/security/index.d.ts +28 -28
  65. package/dist/security/index.d.ts.map +1 -0
  66. package/dist/server/auth/index.d.ts +155 -155
  67. package/dist/server/auth/index.d.ts.map +1 -0
  68. package/dist/server/cache/index.d.ts.map +1 -0
  69. package/dist/server/compress/index.d.ts.map +1 -0
  70. package/dist/server/cookies/index.d.ts.map +1 -0
  71. package/dist/server/core/index.d.ts +0 -1
  72. package/dist/server/core/index.d.ts.map +1 -0
  73. package/dist/server/core/index.js.map +1 -1
  74. package/dist/server/cors/index.d.ts.map +1 -0
  75. package/dist/server/health/index.d.ts +17 -17
  76. package/dist/server/health/index.d.ts.map +1 -0
  77. package/dist/server/helmet/index.d.ts +4 -1
  78. package/dist/server/helmet/index.d.ts.map +1 -0
  79. package/dist/server/links/index.d.ts +33 -33
  80. package/dist/server/links/index.d.ts.map +1 -0
  81. package/dist/server/metrics/index.d.ts.map +1 -0
  82. package/dist/server/multipart/index.d.ts.map +1 -0
  83. package/dist/server/multipart/index.js.map +1 -1
  84. package/dist/server/proxy/index.d.ts.map +1 -0
  85. package/dist/server/proxy/index.js.map +1 -1
  86. package/dist/server/rate-limit/index.d.ts.map +1 -0
  87. package/dist/server/security/index.d.ts +9 -9
  88. package/dist/server/security/index.d.ts.map +1 -0
  89. package/dist/server/static/index.d.ts.map +1 -0
  90. package/dist/server/swagger/index.d.ts.map +1 -0
  91. package/dist/sms/index.d.ts.map +1 -0
  92. package/dist/thread/index.d.ts.map +1 -0
  93. package/dist/topic/core/index.d.ts.map +1 -0
  94. package/dist/topic/redis/index.d.ts.map +1 -0
  95. package/dist/topic/redis/index.js +3 -3
  96. package/dist/topic/redis/index.js.map +1 -1
  97. package/dist/vite/index.d.ts +10 -2
  98. package/dist/vite/index.d.ts.map +1 -0
  99. package/dist/vite/index.js +45 -20
  100. package/dist/vite/index.js.map +1 -1
  101. package/dist/websocket/index.d.ts.map +1 -0
  102. package/package.json +9 -4
  103. package/src/cli/apps/AlephaCli.ts +10 -3
  104. package/src/cli/apps/AlephaPackageBuilderCli.ts +15 -8
  105. package/src/cli/assets/mainTs.ts +9 -10
  106. package/src/cli/atoms/changelogOptions.ts +45 -0
  107. package/src/cli/commands/ChangelogCommands.ts +259 -0
  108. package/src/cli/commands/DeployCommands.ts +118 -0
  109. package/src/cli/commands/DrizzleCommands.ts +230 -10
  110. package/src/cli/commands/ViteCommands.ts +47 -23
  111. package/src/cli/defineConfig.ts +15 -0
  112. package/src/cli/index.ts +3 -0
  113. package/src/cli/services/AlephaCliUtils.ts +10 -154
  114. package/src/cli/services/GitMessageParser.ts +77 -0
  115. package/src/command/helpers/EnvUtils.ts +37 -0
  116. package/src/command/index.ts +3 -1
  117. package/src/command/primitives/$command.ts +172 -6
  118. package/src/command/providers/CliProvider.ts +499 -95
  119. package/src/core/Alepha.ts +1 -1
  120. package/src/core/providers/SchemaValidator.ts +23 -1
  121. package/src/file/providers/NodeFileSystemProvider.ts +3 -1
  122. package/src/mcp/errors/McpError.ts +72 -0
  123. package/src/mcp/helpers/jsonrpc.ts +163 -0
  124. package/src/mcp/index.ts +132 -0
  125. package/src/mcp/interfaces/McpTypes.ts +248 -0
  126. package/src/mcp/primitives/$prompt.ts +188 -0
  127. package/src/mcp/primitives/$resource.ts +171 -0
  128. package/src/mcp/primitives/$tool.ts +285 -0
  129. package/src/mcp/providers/McpServerProvider.ts +382 -0
  130. package/src/mcp/transports/SseMcpTransport.ts +172 -0
  131. package/src/mcp/transports/StdioMcpTransport.ts +126 -0
  132. package/src/orm/index.ts +20 -4
  133. package/src/orm/interfaces/PgQueryWhere.ts +1 -26
  134. package/src/orm/providers/drivers/BunPostgresProvider.ts +225 -0
  135. package/src/orm/providers/drivers/BunSqliteProvider.ts +180 -0
  136. package/src/orm/providers/drivers/CloudflareD1Provider.ts +164 -0
  137. package/src/orm/providers/drivers/DatabaseProvider.ts +25 -0
  138. package/src/orm/providers/drivers/NodePostgresProvider.ts +0 -25
  139. package/src/orm/providers/drivers/NodeSqliteProvider.ts +3 -1
  140. package/src/orm/services/QueryManager.ts +10 -125
  141. package/src/queue/redis/providers/RedisQueueProvider.ts +2 -7
  142. package/src/redis/index.ts +65 -3
  143. package/src/redis/providers/BunRedisProvider.ts +304 -0
  144. package/src/redis/providers/BunRedisSubscriberProvider.ts +94 -0
  145. package/src/redis/providers/NodeRedisProvider.ts +280 -0
  146. package/src/redis/providers/NodeRedisSubscriberProvider.ts +94 -0
  147. package/src/redis/providers/RedisProvider.ts +134 -140
  148. package/src/redis/providers/RedisSubscriberProvider.ts +58 -49
  149. package/src/server/core/providers/BunHttpServerProvider.ts +0 -3
  150. package/src/server/core/providers/ServerBodyParserProvider.ts +3 -1
  151. package/src/server/core/providers/ServerProvider.ts +7 -4
  152. package/src/server/multipart/providers/ServerMultipartProvider.ts +3 -1
  153. package/src/server/proxy/providers/ServerProxyProvider.ts +1 -1
  154. package/src/topic/redis/providers/RedisTopicProvider.ts +3 -3
  155. package/src/vite/plugins/viteAlephaBuild.ts +8 -2
  156. package/src/vite/plugins/viteAlephaDev.ts +6 -2
  157. package/src/vite/tasks/buildServer.ts +2 -1
  158. package/src/vite/tasks/generateCloudflare.ts +43 -15
  159. package/src/vite/tasks/runAlepha.ts +1 -0
  160. package/src/orm/services/PgJsonQueryManager.ts +0 -511
@@ -0,0 +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,4 +1,4 @@
1
- import * as alepha6 from "alepha";
1
+ import * as alepha1 from "alepha";
2
2
  import { Alepha } from "alepha";
3
3
  import * as alepha_server0 from "alepha/server";
4
4
  import { DateTimeProvider } from "alepha/datetime";
@@ -14,19 +14,19 @@ declare class ServerHealthProvider {
14
14
  protected readonly time: DateTimeProvider;
15
15
  protected readonly alepha: Alepha;
16
16
  readonly health: alepha_server0.RoutePrimitive<{
17
- response: alepha6.TObject<{
18
- message: alepha6.TString;
19
- uptime: alepha6.TNumber;
20
- date: alepha6.TString;
21
- ready: alepha6.TBoolean;
17
+ response: alepha1.TObject<{
18
+ message: alepha1.TString;
19
+ uptime: alepha1.TNumber;
20
+ date: alepha1.TString;
21
+ ready: alepha1.TBoolean;
22
22
  }>;
23
23
  }>;
24
24
  readonly healthz: alepha_server0.RoutePrimitive<{
25
- response: alepha6.TObject<{
26
- message: alepha6.TString;
27
- uptime: alepha6.TNumber;
28
- date: alepha6.TString;
29
- ready: alepha6.TBoolean;
25
+ response: alepha1.TObject<{
26
+ message: alepha1.TString;
27
+ uptime: alepha1.TNumber;
28
+ date: alepha1.TString;
29
+ ready: alepha1.TBoolean;
30
30
  }>;
31
31
  }>;
32
32
  protected healthCheck(): {
@@ -38,11 +38,11 @@ declare class ServerHealthProvider {
38
38
  }
39
39
  //#endregion
40
40
  //#region ../../src/server/health/schemas/healthSchema.d.ts
41
- declare const healthSchema: alepha6.TObject<{
42
- message: alepha6.TString;
43
- uptime: alepha6.TNumber;
44
- date: alepha6.TString;
45
- ready: alepha6.TBoolean;
41
+ declare const healthSchema: alepha1.TObject<{
42
+ message: alepha1.TString;
43
+ uptime: alepha1.TNumber;
44
+ date: alepha1.TString;
45
+ ready: alepha1.TBoolean;
46
46
  }>;
47
47
  //#endregion
48
48
  //#region ../../src/server/health/index.d.ts
@@ -52,7 +52,7 @@ declare const healthSchema: alepha6.TObject<{
52
52
  * @see {@link ServerHealthProvider}
53
53
  * @module alepha.server.health
54
54
  */
55
- declare const AlephaServerHealth: alepha6.Service<alepha6.Module>;
55
+ declare const AlephaServerHealth: alepha1.Service<alepha1.Module>;
56
56
  //#endregion
57
57
  export { AlephaServerHealth, ServerHealthProvider, healthSchema };
58
58
  //# sourceMappingURL=index.d.ts.map
@@ -0,0 +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,5 +1,6 @@
1
1
  import * as alepha1 from "alepha";
2
2
  import { Alepha, Static } from "alepha";
3
+ import * as typebox0 from "typebox";
3
4
 
4
5
  //#region ../../src/server/helmet/providers/ServerHelmetProvider.d.ts
5
6
  /**
@@ -74,7 +75,9 @@ declare class ServerHelmetProvider {
74
75
  xFrameOptions?: "DENY" | "SAMEORIGIN" | undefined;
75
76
  xXssProtection?: boolean | undefined;
76
77
  contentSecurityPolicy?: {
77
- directives: Record<string, any>;
78
+ directives: typebox0.StaticRecord<[], "Decode", {}, {
79
+ directives: alepha1.TRecord<"^.*$", alepha1.TAny>;
80
+ }, "^.*$", alepha1.TAny>;
78
81
  } | undefined;
79
82
  referrerPolicy?: "no-referrer" | "no-referrer-when-downgrade" | "origin" | "origin-when-cross-origin" | "same-origin" | "strict-origin" | "strict-origin-when-cross-origin" | "unsafe-url" | undefined;
80
83
  }>;
@@ -0,0 +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,5 +1,5 @@
1
1
  import { ServerRouteSecure } from "alepha/server/security";
2
- import * as alepha1 from "alepha";
2
+ import * as alepha21 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";
@@ -9,23 +9,23 @@ import { ProxyPrimitiveOptions, ServerProxyProvider } from "alepha/server/proxy"
9
9
  import { ServiceAccountPrimitive, UserAccountToken } from "alepha/security";
10
10
 
11
11
  //#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>;
12
+ declare const apiLinkSchema: alepha21.TObject<{
13
+ name: alepha21.TString;
14
+ group: alepha21.TOptional<alepha21.TString>;
15
+ path: alepha21.TString;
16
+ method: alepha21.TOptional<alepha21.TString>;
17
+ requestBodyType: alepha21.TOptional<alepha21.TString>;
18
+ service: alepha21.TOptional<alepha21.TString>;
19
19
  }>;
20
- declare const apiLinksResponseSchema: alepha1.TObject<{
21
- prefix: alepha1.TOptional<alepha1.TString>;
22
- links: alepha1.TArray<alepha1.TObject<{
23
- name: alepha1.TString;
24
- group: alepha1.TOptional<alepha1.TString>;
25
- path: alepha1.TString;
26
- method: alepha1.TOptional<alepha1.TString>;
27
- requestBodyType: alepha1.TOptional<alepha1.TString>;
28
- service: alepha1.TOptional<alepha1.TString>;
20
+ declare const apiLinksResponseSchema: alepha21.TObject<{
21
+ prefix: alepha21.TOptional<alepha21.TString>;
22
+ links: alepha21.TArray<alepha21.TObject<{
23
+ name: alepha21.TString;
24
+ group: alepha21.TOptional<alepha21.TString>;
25
+ path: alepha21.TString;
26
+ method: alepha21.TOptional<alepha21.TString>;
27
+ requestBodyType: alepha21.TOptional<alepha21.TString>;
28
+ service: alepha21.TOptional<alepha21.TString>;
29
29
  }>>;
30
30
  }>;
31
31
  type ApiLinksResponse = Static<typeof apiLinksResponseSchema>;
@@ -180,8 +180,8 @@ declare class RemotePrimitiveProvider {
180
180
  protected readonly remotes: Array<ServerRemote>;
181
181
  protected readonly log: alepha_logger0.Logger;
182
182
  getRemotes(): ServerRemote[];
183
- readonly configure: alepha1.HookPrimitive<"configure">;
184
- readonly start: alepha1.HookPrimitive<"start">;
183
+ readonly configure: alepha21.HookPrimitive<"configure">;
184
+ readonly start: alepha21.HookPrimitive<"start">;
185
185
  registerRemote(value: RemotePrimitive): Promise<void>;
186
186
  protected readonly fetchLinks: alepha_retry0.RetryPrimitiveFn<(opts: FetchLinksOptions) => Promise<ApiLinksResponse>>;
187
187
  }
@@ -249,22 +249,22 @@ declare class ServerLinksProvider {
249
249
  protected readonly remoteProvider: RemotePrimitiveProvider;
250
250
  protected readonly serverTimingProvider: ServerTimingProvider;
251
251
  get prefix(): string;
252
- readonly onRoute: alepha1.HookPrimitive<"configure">;
252
+ readonly onRoute: alepha21.HookPrimitive<"configure">;
253
253
  /**
254
254
  * First API - Get all API links for the user.
255
255
  *
256
256
  * This is based on the user's permissions.
257
257
  */
258
258
  readonly links: alepha_server0.RoutePrimitive<{
259
- response: alepha1.TObject<{
260
- prefix: alepha1.TOptional<alepha1.TString>;
261
- links: alepha1.TArray<alepha1.TObject<{
262
- name: alepha1.TString;
263
- group: alepha1.TOptional<alepha1.TString>;
264
- path: alepha1.TString;
265
- method: alepha1.TOptional<alepha1.TString>;
266
- requestBodyType: alepha1.TOptional<alepha1.TString>;
267
- service: alepha1.TOptional<alepha1.TString>;
259
+ response: alepha21.TObject<{
260
+ prefix: alepha21.TOptional<alepha21.TString>;
261
+ links: alepha21.TArray<alepha21.TObject<{
262
+ name: alepha21.TString;
263
+ group: alepha21.TOptional<alepha21.TString>;
264
+ path: alepha21.TString;
265
+ method: alepha21.TOptional<alepha21.TString>;
266
+ requestBodyType: alepha21.TOptional<alepha21.TString>;
267
+ service: alepha21.TOptional<alepha21.TString>;
268
268
  }>>;
269
269
  }>;
270
270
  }>;
@@ -275,10 +275,10 @@ declare class ServerLinksProvider {
275
275
  * I mean for 150+ links, you got 50ms of serialization time.
276
276
  */
277
277
  readonly schema: alepha_server0.RoutePrimitive<{
278
- params: alepha1.TObject<{
279
- name: alepha1.TString;
278
+ params: alepha21.TObject<{
279
+ name: alepha21.TString;
280
280
  }>;
281
- response: alepha1.TRecord<string, alepha1.TAny>;
281
+ response: alepha21.TRecord<string, alepha21.TAny>;
282
282
  }>;
283
283
  getSchemaByName(name: string, options?: GetApiLinksOptions): Promise<RequestConfigSchema>;
284
284
  /**
@@ -315,7 +315,7 @@ declare module "alepha" {
315
315
  * @see {@link $client}
316
316
  * @module alepha.server.links
317
317
  */
318
- declare const AlephaServerLinks: alepha1.Service<alepha1.Module>;
318
+ declare const AlephaServerLinks: alepha21.Service<alepha21.Module>;
319
319
  //#endregion
320
320
  export { $client, $remote, AlephaServerLinks, ApiLink, ApiLinksResponse, ClientScope, FetchLinksOptions, GetApiLinksOptions, HttpClientLink, HttpVirtualClient, LinkProvider, RemotePrimitive, RemotePrimitiveOptions, RemotePrimitiveProvider, ServerLinksProvider, ServerRemote, VirtualAction, apiLinkSchema, apiLinksResponseSchema };
321
321
  //# sourceMappingURL=index.d.ts.map
@@ -0,0 +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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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/server/metrics/providers/ServerMetricsProvider.ts","../../../src/server/metrics/index.ts"],"sourcesContent":[],"mappings":";;;;;;cAIa,qBAAA;+BACkB;6BACJ;kCACO;EAHrB,SAAA,OAAA,EAKc,4BALO;EACH,SAAA,OAAA,EAMN,cAAA,CAAA,cANM,CAIwB,cAAA,CAE9B,mBAAA,CANM;EACJ,mBAAA,OAAA,EAKF,OAAA,CAOG,aAZD,CAAA,OAAA,CAAA;EACO,mBAAA,SAAA,EAWN,OAAA,CAgBE,aA3BI,CAAA,kBAAA,CAAA;EAEP,mBAAA,UAAA,EAyBG,OAAA,CASC,aAlCJ,CAAA,mBAAA,CAAA;;AAEF,UAmDR,4BAAA,CAnDQ;EAAA,MAOG,CAAA,EAAA,MAAA;EAAA,iBAgBE,CAAA,EAAA,MAAA,EAAA;EAAA,4BASC,CAAA,EAAA,MAAA;EAAA,MAAA,CAAA,EAAA,MAAA;AAmB/B;;;;;;;;AA1DA;;AAE2B,cCWd,mBDXc,ECWK,OAAA,CAAA,ODXL,CCczB,OAAA,CAH8B,MAAA,CDXL"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/server/multipart/providers/ServerMultipartProvider.ts","../../../src/server/multipart/index.ts"],"sourcesContent":[],"mappings":";;;;;;cAmCa,uBAAA;6BACc;;;IADd,2BAAuB,EAAA,MAAA;IACT,2BAAA,EAAA,MAAA;EAAA,CAAA;EAEH,mBAEG,GAAA,EAJA,cAAA,CAEH,MAEG;EAAA,SAuEC,SAAA,EAzEJ,OAAA,CAEG,aAuEC,CAAA,kBAAA,CAAA;EAWjB,SAAA,UAAA,EAlFgB,OAAA,CAuEC,aAWjB,CAAA,mBAAA,CAAA;EACE,0BAAA,CAAA,KAAA,EADF,WACE,EAAA,OAAA,EAAA,OAAA,CAAA,EACR,OADQ,CAAA;IAEH,IAAA,EAAA,MAAA,CAAA,MAAA,EAAA,OAAA,CAAA;IACS,OAAA,EAAA,GAAA,GAAA,OAAA,CAAA,IAAA,CAAA;EAFd,CAAA,CAAA;EA2HK;;;;AAqDT;;;mCArDS,0BAEL,QAAQ;ACxOb;UD6RU,UAAA,SAAmB;aAChB;;;;;;;;;;;;;;AA5Qb;;AAC2B,cCnBd,qBDqBW,ECrBU,OAAA,CAAA,ODqBV,CClBtB,OAAA,CAHgC,MAAA,CDqBV"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["webRequest: Request | undefined","WebStream","formData: FormData","body: Record<string, any>","tempFiles: HybridFile[]"],"sources":["../../../src/server/multipart/providers/ServerMultipartProvider.ts","../../../src/server/multipart/index.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { createReadStream } from \"node:fs\";\nimport { readFile, unlink, writeFile } from \"node:fs/promises\";\nimport * as os from \"node:os\";\nimport { ReadableStream as WebStream } from \"node:stream/web\";\nimport {\n $env,\n $hook,\n $inject,\n Alepha,\n type FileLike,\n isTypeFile,\n t,\n} from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport { HttpError, isMultipart, type ServerRoute } from \"alepha/server\";\n\nconst envSchema = t.object({\n SERVER_MULTIPART_LIMIT: t.integer({\n default: 10_000_000, // 10MB total\n min: 0,\n description: \"Maximum total size of multipart request body in bytes.\",\n }),\n SERVER_MULTIPART_FILE_LIMIT: t.integer({\n default: 5_000_000, // 5MB per file\n min: 0,\n description: \"Maximum size of a single file in bytes.\",\n }),\n SERVER_MULTIPART_FILE_COUNT: t.integer({\n default: 10,\n min: 1,\n description: \"Maximum number of files allowed in a single request.\",\n }),\n});\n\nexport class ServerMultipartProvider {\n protected readonly alepha = $inject(Alepha);\n protected readonly env = $env(envSchema);\n protected readonly log = $logger();\n\n public readonly onRequest = $hook({\n on: \"server:onRequest\",\n handler: async ({ route, request }) => {\n // already parsed (e.g. by body parser)\n if (request.body) {\n return;\n }\n\n // we do not parse body if no schema\n if (!route.schema?.body) {\n return;\n }\n\n let webRequest: Request | undefined;\n\n if (request.raw.web?.req) {\n webRequest = request.raw.web.req;\n } else if (request.raw.node?.req) {\n webRequest = new Request(request.url, {\n method: request.method,\n headers: request.headers,\n body: WebStream.from(request.raw.node.req) as ReadableStream,\n duplex: \"half\",\n } as RequestInit & { duplex: \"half\" });\n }\n\n if (!webRequest) {\n return;\n }\n\n const contentType = request.headers[\"content-type\"];\n\n // Check content-length before processing to fail fast on oversized requests\n const contentLength = request.headers[\"content-length\"];\n if (contentLength) {\n const size = Number.parseInt(contentLength, 10);\n if (!Number.isNaN(size) && size > this.env.SERVER_MULTIPART_LIMIT) {\n this.log.error(\n `Multipart request size limit exceeded: ${size} > ${this.env.SERVER_MULTIPART_LIMIT}`,\n );\n throw new HttpError({\n status: 413,\n message: `Request body size limit exceeded. Maximum allowed: ${this.env.SERVER_MULTIPART_LIMIT} bytes`,\n });\n }\n }\n\n if (!contentType?.startsWith(\"multipart/form-data\")) {\n if (!isMultipart(route)) {\n return;\n }\n\n // route expects multipart but content-type is not correct! reject with 415\n throw new HttpError({\n status: 415,\n message: `Invalid content-type: ${contentType} - only \"multipart/form-data\" is accepted`,\n });\n }\n\n const { body, cleanup } = await this.handleMultipartBodyFromWeb(\n route,\n webRequest,\n );\n\n request.body = body;\n request.metadata.multipart = { cleanup };\n },\n });\n\n public readonly onResponse = $hook({\n on: \"server:onResponse\",\n handler: async ({ request }) => {\n const cleanup = request.metadata.multipart?.cleanup;\n if (typeof cleanup === \"function\") {\n await cleanup();\n }\n },\n });\n\n public async handleMultipartBodyFromWeb(\n route: ServerRoute,\n request: Request,\n ): Promise<{\n body: Record<string, unknown>;\n cleanup: () => Promise<void>;\n }> {\n let formData: FormData;\n\n try {\n // Parse the FormData from the request\n formData = await request.formData();\n } catch (error) {\n throw new HttpError(\n {\n status: 400,\n message: \"Malformed multipart/form-data\",\n },\n error,\n );\n }\n\n const body: Record<string, any> = {};\n const tempFiles: HybridFile[] = [];\n\n // Helper to clean up temp files on error\n const cleanupOnError = async () => {\n for (const file of tempFiles) {\n try {\n await file.cleanup();\n } catch {\n // Ignore cleanup errors during error handling\n }\n }\n };\n\n try {\n let fileCount = 0;\n let totalSize = 0;\n\n if (route.schema?.body && t.schema.isObject(route.schema.body)) {\n for (const [key, value] of Object.entries(\n route.schema.body.properties,\n )) {\n if (t.schema.isSchema(value)) {\n if (isTypeFile(value)) {\n const file = formData.get(key);\n // Check if file is a Blob (File extends Blob in Web APIs)\n if (file && typeof file === \"object\" && \"arrayBuffer\" in file) {\n const blob = file as Blob;\n\n // Validate file count\n fileCount++;\n if (fileCount > this.env.SERVER_MULTIPART_FILE_COUNT) {\n this.log.error(\n `Too many files in multipart request: ${fileCount} > ${this.env.SERVER_MULTIPART_FILE_COUNT}`,\n );\n throw new HttpError({\n status: 413,\n message: `Too many files. Maximum allowed: ${this.env.SERVER_MULTIPART_FILE_COUNT}`,\n });\n }\n\n // Validate individual file size\n if (blob.size > this.env.SERVER_MULTIPART_FILE_LIMIT) {\n this.log.error(\n `File \"${key}\" exceeds size limit: ${blob.size} > ${this.env.SERVER_MULTIPART_FILE_LIMIT}`,\n );\n throw new HttpError({\n status: 413,\n message: `File \"${key}\" exceeds size limit. Maximum allowed: ${this.env.SERVER_MULTIPART_FILE_LIMIT} bytes`,\n });\n }\n\n // Validate total size\n totalSize += blob.size;\n if (totalSize > this.env.SERVER_MULTIPART_LIMIT) {\n this.log.error(\n `Total multipart size exceeds limit: ${totalSize} > ${this.env.SERVER_MULTIPART_LIMIT}`,\n );\n throw new HttpError({\n status: 413,\n message: `Total request size exceeds limit. Maximum allowed: ${this.env.SERVER_MULTIPART_LIMIT} bytes`,\n });\n }\n\n const hybridFile = await this.createHybridFile(blob, key);\n body[key] = hybridFile;\n tempFiles.push(hybridFile);\n }\n } else {\n const fieldValue = formData.get(key);\n if (fieldValue !== null) {\n // FormData values are either string or File/Blob\n const stringValue =\n typeof fieldValue === \"string\" ? fieldValue : \"\";\n body[key] = this.alepha.codec.decode(value, stringValue);\n }\n }\n }\n }\n }\n\n return {\n body,\n cleanup: async () => {\n for (const file of tempFiles) {\n await file.cleanup();\n }\n },\n };\n } catch (error) {\n // Clean up any temp files that were created before the error\n await cleanupOnError();\n throw error;\n }\n }\n\n /**\n * This is a legacy code, previously we used \"busboy\" to parse multipart in Node.js environment.\n * Now we rely on Web Request's formData() method, which is supported in modern Node.js versions.\n * However, we still need to create temporary files for uploaded files to provide a consistent File-like interface.\n *\n * TODO: In future, we might want to refactor this to avoid using temporary files if not necessary?\n */\n protected async createHybridFile(\n file: Blob,\n fieldName: string,\n ): Promise<HybridFile> {\n const tmpPath = `${os.tmpdir()}/${randomUUID()}`;\n\n // Get file data\n const arrayBuffer = await file.arrayBuffer();\n const buffer = Buffer.from(arrayBuffer);\n\n // Write to temp file\n await writeFile(tmpPath, buffer);\n\n // Get file name - check if it has name property (File type)\n const fileName = (file as any).name || `${fieldName}_${Date.now()}`;\n\n const hybridFile: HybridFile = {\n _state: {\n cleanup: false,\n size: file.size,\n tmpPath,\n },\n name: fileName,\n type: file.type || \"application/octet-stream\",\n lastModified: (file as any).lastModified || Date.now(),\n filepath: tmpPath,\n get size() {\n return this._state.size;\n },\n stream() {\n return createReadStream(tmpPath);\n },\n async arrayBuffer() {\n const content = await readFile(tmpPath);\n return content.buffer.slice(\n content.byteOffset,\n content.byteOffset + content.byteLength,\n ) as ArrayBuffer;\n },\n text: async () => {\n return await readFile(tmpPath, \"utf-8\");\n },\n async cleanup() {\n if (this._state.cleanup) {\n return;\n }\n\n await unlink(tmpPath); // clean up the temp file\n this._state.cleanup = true;\n },\n };\n\n return hybridFile;\n }\n}\n\ninterface HybridFile extends FileLike {\n cleanup(): Promise<void>;\n _state: {\n cleanup: boolean;\n size: number;\n tmpPath: string;\n };\n}\n","import { $module } from \"alepha\";\nimport { AlephaServer } from \"alepha/server\";\nimport { ServerMultipartProvider } from \"./providers/ServerMultipartProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./providers/ServerMultipartProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * This module provides support for handling multipart/form-data requests.\n * It allows to parse body data containing t.file().\n *\n * @see {@link ServerMultipartProvider}\n * @module alepha.server.multipart\n */\nexport const AlephaServerMultipart = $module({\n name: \"alepha.server.multipart\",\n services: [AlephaServer, ServerMultipartProvider],\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["webRequest: Request | undefined","WebStream","formData: FormData","body: Record<string, any>","tempFiles: HybridFile[]"],"sources":["../../../src/server/multipart/providers/ServerMultipartProvider.ts","../../../src/server/multipart/index.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { createReadStream } from \"node:fs\";\nimport { readFile, unlink, writeFile } from \"node:fs/promises\";\nimport * as os from \"node:os\";\nimport { ReadableStream as WebStream } from \"node:stream/web\";\nimport {\n $env,\n $hook,\n $inject,\n Alepha,\n type FileLike,\n isTypeFile,\n t,\n} from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport { HttpError, isMultipart, type ServerRoute } from \"alepha/server\";\n\nconst envSchema = t.object({\n SERVER_MULTIPART_LIMIT: t.integer({\n default: 10_000_000, // 10MB total\n min: 0,\n description: \"Maximum total size of multipart request body in bytes.\",\n }),\n SERVER_MULTIPART_FILE_LIMIT: t.integer({\n default: 5_000_000, // 5MB per file\n min: 0,\n description: \"Maximum size of a single file in bytes.\",\n }),\n SERVER_MULTIPART_FILE_COUNT: t.integer({\n default: 10,\n min: 1,\n description: \"Maximum number of files allowed in a single request.\",\n }),\n});\n\nexport class ServerMultipartProvider {\n protected readonly alepha = $inject(Alepha);\n protected readonly env = $env(envSchema);\n protected readonly log = $logger();\n\n public readonly onRequest = $hook({\n on: \"server:onRequest\",\n handler: async ({ route, request }) => {\n // already parsed (e.g. by body parser)\n if (request.body) {\n return;\n }\n\n // we do not parse body if no schema\n if (!route.schema?.body) {\n return;\n }\n\n let webRequest: Request | undefined;\n\n if (request.raw.web?.req) {\n webRequest = request.raw.web.req;\n } else if (request.raw.node?.req) {\n webRequest = new Request(request.url, {\n method: request.method,\n headers: request.headers,\n body: WebStream.from(\n request.raw.node.req,\n ) as unknown as ReadableStream,\n duplex: \"half\",\n } as RequestInit & { duplex: \"half\" });\n }\n\n if (!webRequest) {\n return;\n }\n\n const contentType = request.headers[\"content-type\"];\n\n // Check content-length before processing to fail fast on oversized requests\n const contentLength = request.headers[\"content-length\"];\n if (contentLength) {\n const size = Number.parseInt(contentLength, 10);\n if (!Number.isNaN(size) && size > this.env.SERVER_MULTIPART_LIMIT) {\n this.log.error(\n `Multipart request size limit exceeded: ${size} > ${this.env.SERVER_MULTIPART_LIMIT}`,\n );\n throw new HttpError({\n status: 413,\n message: `Request body size limit exceeded. Maximum allowed: ${this.env.SERVER_MULTIPART_LIMIT} bytes`,\n });\n }\n }\n\n if (!contentType?.startsWith(\"multipart/form-data\")) {\n if (!isMultipart(route)) {\n return;\n }\n\n // route expects multipart but content-type is not correct! reject with 415\n throw new HttpError({\n status: 415,\n message: `Invalid content-type: ${contentType} - only \"multipart/form-data\" is accepted`,\n });\n }\n\n const { body, cleanup } = await this.handleMultipartBodyFromWeb(\n route,\n webRequest,\n );\n\n request.body = body;\n request.metadata.multipart = { cleanup };\n },\n });\n\n public readonly onResponse = $hook({\n on: \"server:onResponse\",\n handler: async ({ request }) => {\n const cleanup = request.metadata.multipart?.cleanup;\n if (typeof cleanup === \"function\") {\n await cleanup();\n }\n },\n });\n\n public async handleMultipartBodyFromWeb(\n route: ServerRoute,\n request: Request,\n ): Promise<{\n body: Record<string, unknown>;\n cleanup: () => Promise<void>;\n }> {\n let formData: FormData;\n\n try {\n // Parse the FormData from the request\n formData = await request.formData();\n } catch (error) {\n throw new HttpError(\n {\n status: 400,\n message: \"Malformed multipart/form-data\",\n },\n error,\n );\n }\n\n const body: Record<string, any> = {};\n const tempFiles: HybridFile[] = [];\n\n // Helper to clean up temp files on error\n const cleanupOnError = async () => {\n for (const file of tempFiles) {\n try {\n await file.cleanup();\n } catch {\n // Ignore cleanup errors during error handling\n }\n }\n };\n\n try {\n let fileCount = 0;\n let totalSize = 0;\n\n if (route.schema?.body && t.schema.isObject(route.schema.body)) {\n for (const [key, value] of Object.entries(\n route.schema.body.properties,\n )) {\n if (t.schema.isSchema(value)) {\n if (isTypeFile(value)) {\n const file = formData.get(key);\n // Check if file is a Blob (File extends Blob in Web APIs)\n if (file && typeof file === \"object\" && \"arrayBuffer\" in file) {\n const blob = file as Blob;\n\n // Validate file count\n fileCount++;\n if (fileCount > this.env.SERVER_MULTIPART_FILE_COUNT) {\n this.log.error(\n `Too many files in multipart request: ${fileCount} > ${this.env.SERVER_MULTIPART_FILE_COUNT}`,\n );\n throw new HttpError({\n status: 413,\n message: `Too many files. Maximum allowed: ${this.env.SERVER_MULTIPART_FILE_COUNT}`,\n });\n }\n\n // Validate individual file size\n if (blob.size > this.env.SERVER_MULTIPART_FILE_LIMIT) {\n this.log.error(\n `File \"${key}\" exceeds size limit: ${blob.size} > ${this.env.SERVER_MULTIPART_FILE_LIMIT}`,\n );\n throw new HttpError({\n status: 413,\n message: `File \"${key}\" exceeds size limit. Maximum allowed: ${this.env.SERVER_MULTIPART_FILE_LIMIT} bytes`,\n });\n }\n\n // Validate total size\n totalSize += blob.size;\n if (totalSize > this.env.SERVER_MULTIPART_LIMIT) {\n this.log.error(\n `Total multipart size exceeds limit: ${totalSize} > ${this.env.SERVER_MULTIPART_LIMIT}`,\n );\n throw new HttpError({\n status: 413,\n message: `Total request size exceeds limit. Maximum allowed: ${this.env.SERVER_MULTIPART_LIMIT} bytes`,\n });\n }\n\n const hybridFile = await this.createHybridFile(blob, key);\n body[key] = hybridFile;\n tempFiles.push(hybridFile);\n }\n } else {\n const fieldValue = formData.get(key);\n if (fieldValue !== null) {\n // FormData values are either string or File/Blob\n const stringValue =\n typeof fieldValue === \"string\" ? fieldValue : \"\";\n body[key] = this.alepha.codec.decode(value, stringValue);\n }\n }\n }\n }\n }\n\n return {\n body,\n cleanup: async () => {\n for (const file of tempFiles) {\n await file.cleanup();\n }\n },\n };\n } catch (error) {\n // Clean up any temp files that were created before the error\n await cleanupOnError();\n throw error;\n }\n }\n\n /**\n * This is a legacy code, previously we used \"busboy\" to parse multipart in Node.js environment.\n * Now we rely on Web Request's formData() method, which is supported in modern Node.js versions.\n * However, we still need to create temporary files for uploaded files to provide a consistent File-like interface.\n *\n * TODO: In future, we might want to refactor this to avoid using temporary files if not necessary?\n */\n protected async createHybridFile(\n file: Blob,\n fieldName: string,\n ): Promise<HybridFile> {\n const tmpPath = `${os.tmpdir()}/${randomUUID()}`;\n\n // Get file data\n const arrayBuffer = await file.arrayBuffer();\n const buffer = Buffer.from(arrayBuffer);\n\n // Write to temp file\n await writeFile(tmpPath, buffer);\n\n // Get file name - check if it has name property (File type)\n const fileName = (file as any).name || `${fieldName}_${Date.now()}`;\n\n const hybridFile: HybridFile = {\n _state: {\n cleanup: false,\n size: file.size,\n tmpPath,\n },\n name: fileName,\n type: file.type || \"application/octet-stream\",\n lastModified: (file as any).lastModified || Date.now(),\n filepath: tmpPath,\n get size() {\n return this._state.size;\n },\n stream() {\n return createReadStream(tmpPath);\n },\n async arrayBuffer() {\n const content = await readFile(tmpPath);\n return content.buffer.slice(\n content.byteOffset,\n content.byteOffset + content.byteLength,\n ) as ArrayBuffer;\n },\n text: async () => {\n return await readFile(tmpPath, \"utf-8\");\n },\n async cleanup() {\n if (this._state.cleanup) {\n return;\n }\n\n await unlink(tmpPath); // clean up the temp file\n this._state.cleanup = true;\n },\n };\n\n return hybridFile;\n }\n}\n\ninterface HybridFile extends FileLike {\n cleanup(): Promise<void>;\n _state: {\n cleanup: boolean;\n size: number;\n tmpPath: string;\n };\n}\n","import { $module } from \"alepha\";\nimport { AlephaServer } from \"alepha/server\";\nimport { ServerMultipartProvider } from \"./providers/ServerMultipartProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./providers/ServerMultipartProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * This module provides support for handling multipart/form-data requests.\n * It allows to parse body data containing t.file().\n *\n * @see {@link ServerMultipartProvider}\n * @module alepha.server.multipart\n */\nexport const AlephaServerMultipart = $module({\n name: \"alepha.server.multipart\",\n services: [AlephaServer, ServerMultipartProvider],\n});\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/server/proxy/primitives/$proxy.ts","../../../src/server/proxy/providers/ServerProxyProvider.ts","../../../src/server/proxy/index.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;AAsFA;;;;;;AAIA;;;;;;;;;AAmIA;;;;AClNA;;;;;;;;;;;;;ACOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cFoEa;YAAmB,wBAAwB;;;KAI5C,qBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAgEC,6BACK,gBACX;;;;;;;;;;;;;;;;;;;;;;;;4BA0BM,8BACM,aACZ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA+BW;;cAML,cAAA,SAAuB,UAAU;;;cClNjC,mBAAA;0BAAmB,cAAA,CACR;qCACW;EDyEtB,mBAEZ,MAAA,EC1E0B,MD0E1B;EAF+B,mBAAA,SAAA,ECxEL,OAAA,CAEG,aDsEE,CAAA,WAAA,CAAA;EAAwB,WAAA,CAAA,OAAA,EC7D1B,qBD6D0B,CAAA,EAAA,IAAA;8CChC3C,KAAK,iCACb;;;;;;;;;AD+BL;;AAAwD,cEpE3C,iBFoE2C,EEpE1B,OAAA,CAAA,OFoE0B,CEhEtD,OAAA,CAJ4B,MAAA,CFoE0B"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["WebStream"],"sources":["../../../src/server/proxy/primitives/$proxy.ts","../../../src/server/proxy/providers/ServerProxyProvider.ts","../../../src/server/proxy/index.ts"],"sourcesContent":["import { type Async, createPrimitive, KIND, Primitive } from \"alepha\";\nimport type { ServerRequest } from \"alepha/server\";\n\n/**\n * Creates a proxy primitive to forward requests to another server.\n *\n * This primitive enables you to create reverse proxy functionality, allowing your Alepha server\n * to forward requests to other services while maintaining a unified API surface. It's particularly\n * useful for microservice architectures, API gateways, or when you need to aggregate multiple\n * services behind a single endpoint.\n *\n * **Key Features**\n *\n * - **Path-based routing**: Match specific paths or patterns to proxy\n * - **Dynamic targets**: Support both static and dynamic target resolution\n * - **Request/Response hooks**: Modify requests before forwarding and responses after receiving\n * - **URL rewriting**: Transform URLs before forwarding to the target\n * - **Conditional proxying**: Enable/disable proxies based on environment or conditions\n *\n * @example\n * **Basic proxy setup:**\n * ```ts\n * import { $proxy } from \"alepha/server/proxy\";\n *\n * class ApiGateway {\n * // Forward all /api/* requests to external service\n * api = $proxy({\n * path: \"/api/*\",\n * target: \"https://api.example.com\"\n * });\n * }\n * ```\n *\n * @example\n * **Dynamic target with environment-based routing:**\n * ```ts\n * class ApiGateway {\n * // Route to different environments based on configuration\n * api = $proxy({\n * path: \"/api/*\",\n * target: () => process.env.NODE_ENV === \"production\"\n * ? \"https://api.prod.example.com\"\n * : \"https://api.dev.example.com\"\n * });\n * }\n * ```\n *\n * @example\n * **Advanced proxy with request/response modification:**\n * ```ts\n * class SecureProxy {\n * secure = $proxy({\n * path: \"/secure/*\",\n * target: \"https://secure-api.example.com\",\n * beforeRequest: async (request, proxyRequest) => {\n * // Add authentication headers\n * proxyRequest.headers = {\n * ...proxyRequest.headers,\n * 'Authorization': `Bearer ${await getServiceToken()}`,\n * 'X-Forwarded-For': request.headers['x-forwarded-for'] || request.ip\n * };\n * },\n * afterResponse: async (request, proxyResponse) => {\n * // Log response for monitoring\n * console.log(`Proxied ${request.url} -> ${proxyResponse.status}`);\n * },\n * rewrite: (url) => {\n * // Remove /secure prefix when forwarding\n * url.pathname = url.pathname.replace('/secure', '');\n * }\n * });\n * }\n * ```\n *\n * @example\n * **Conditional proxy based on feature flags:**\n * ```ts\n * class FeatureProxy {\n * newApi = $proxy({\n * path: \"/v2/*\",\n * target: \"https://new-api.example.com\",\n * disabled: !process.env.ENABLE_V2_API // Disable if feature flag is off\n * });\n * }\n * ```\n */\nexport const $proxy = (options: ProxyPrimitiveOptions): ProxyPrimitive => {\n return createPrimitive(ProxyPrimitive, options);\n};\n\nexport type ProxyPrimitiveOptions = {\n /**\n * Path pattern to match for proxying requests.\n *\n * Supports wildcards and path parameters:\n * - `/api/*` - Matches all paths starting with `/api/`\n * - `/api/v1/*` - Matches all paths starting with `/api/v1/`\n * - `/users/:id` - Matches `/users/123`, `/users/abc`, etc.\n *\n * @example \"/api/*\"\n * @example \"/secure/admin/*\"\n * @example \"/users/:id/posts\"\n */\n path: string;\n\n /**\n * Target URL to which matching requests should be forwarded.\n *\n * Can be either:\n * - **Static string**: A fixed URL like `\"https://api.example.com\"`\n * - **Dynamic function**: A function that returns the URL, enabling runtime target resolution\n *\n * The target URL will be combined with the remaining path from the original request.\n *\n * @example \"https://api.example.com\"\n * @example () => process.env.API_URL || \"http://localhost:3001\"\n */\n target: string | (() => string);\n\n /**\n * Whether this proxy is disabled.\n *\n * When `true`, requests matching the path will not be proxied and will be handled\n * by other routes or return 404. Useful for feature toggles or conditional proxying.\n *\n * @default false\n * @example !process.env.ENABLE_PROXY\n */\n disabled?: boolean;\n\n /**\n * Hook called before forwarding the request to the target server.\n *\n * Use this to:\n * - Add authentication headers\n * - Modify request headers or body\n * - Add request tracking/logging\n * - Transform the request before forwarding\n *\n * @param request - The original incoming server request\n * @param proxyRequest - The request that will be sent to the target (modifiable)\n *\n * @example\n * ```ts\n * beforeRequest: async (request, proxyRequest) => {\n * proxyRequest.headers = {\n * ...proxyRequest.headers,\n * 'Authorization': `Bearer ${await getToken()}`,\n * 'X-Request-ID': generateRequestId()\n * };\n * }\n * ```\n */\n beforeRequest?: (\n request: ServerRequest,\n proxyRequest: RequestInit,\n ) => Async<void>;\n\n /**\n * Hook called after receiving the response from the target server.\n *\n * Use this to:\n * - Log response details for monitoring\n * - Add custom headers to the response\n * - Transform response data\n * - Handle error responses\n *\n * @param request - The original incoming server request\n * @param proxyResponse - The response received from the target server\n *\n * @example\n * ```ts\n * afterResponse: async (request, proxyResponse) => {\n * console.log(`Proxy ${request.method} ${request.url} -> ${proxyResponse.status}`);\n *\n * if (!proxyResponse.ok) {\n * await logError(`Proxy error: ${proxyResponse.status}`, { request, response: proxyResponse });\n * }\n * }\n * ```\n */\n afterResponse?: (\n request: ServerRequest,\n proxyResponse: Response,\n ) => Async<void>;\n\n /**\n * Function to rewrite the URL before sending to the target server.\n *\n * Use this to:\n * - Remove or add path prefixes\n * - Transform path parameters\n * - Modify query parameters\n * - Change the URL structure entirely\n *\n * The function receives a mutable URL object and should modify it in-place.\n *\n * @param url - The URL object to modify (mutable)\n *\n * @example\n * ```ts\n * // Remove /api prefix when forwarding\n * rewrite: (url) => {\n * url.pathname = url.pathname.replace('/api', '');\n * }\n * ```\n *\n * @example\n * ```ts\n * // Add version prefix\n * rewrite: (url) => {\n * url.pathname = `/v2${url.pathname}`;\n * }\n * ```\n */\n rewrite?: (url: URL) => void;\n\n // TODO: Add retry functionality\n // retry?: RetryOptions;\n};\n\nexport class ProxyPrimitive extends Primitive<ProxyPrimitiveOptions> {}\n\n$proxy[KIND] = ProxyPrimitive;\n","import { ReadableStream as WebStream } from \"node:stream/web\";\nimport { $hook, $inject, Alepha, AlephaError } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport {\n routeMethods,\n type ServerHandler,\n type ServerRequest,\n ServerRouterProvider,\n} from \"alepha/server\";\nimport { $proxy, type ProxyPrimitiveOptions } from \"../primitives/$proxy.ts\";\n\nexport class ServerProxyProvider {\n protected readonly log = $logger();\n protected readonly routerProvider = $inject(ServerRouterProvider);\n protected readonly alepha = $inject(Alepha);\n\n protected readonly configure = $hook({\n on: \"configure\",\n handler: () => {\n for (const proxy of this.alepha.primitives($proxy)) {\n this.createProxy(proxy.options);\n }\n },\n });\n\n public createProxy(options: ProxyPrimitiveOptions): void {\n if (options.disabled) {\n return;\n }\n\n const path = options.path;\n const target =\n typeof options.target === \"function\" ? options.target() : options.target;\n\n if (!path.endsWith(\"/*\")) {\n throw new AlephaError(\"Proxy path should end with '/*'\");\n }\n\n // Extract base path without /*\n const handler = this.createProxyHandler(target, options);\n\n for (const method of routeMethods) {\n this.routerProvider.createRoute({\n method,\n path,\n handler,\n });\n }\n\n this.log.info(\"Proxying\", { path, target });\n }\n\n public createProxyHandler(\n target: string,\n options: Omit<ProxyPrimitiveOptions, \"path\">,\n ): ServerHandler {\n return async (request) => {\n const url = new URL(target + request.url.pathname);\n if (request.url.search) {\n url.search = request.url.search;\n }\n\n options.rewrite?.(url);\n\n const requestInit = {\n url: url.toString(),\n method: request.method,\n headers: {\n ...request.headers,\n \"accept-encoding\": \"identity\", // ignore compression\n },\n body: this.getRawRequestBody(request),\n };\n\n if (requestInit.body) {\n (requestInit as any).duplex = \"half\";\n }\n\n if (options.beforeRequest) {\n await options.beforeRequest(request, requestInit);\n }\n\n this.log.debug(\"Proxying request\", {\n url: url.toString(),\n method: request.method,\n headers: request.headers,\n });\n\n const response = await fetch(requestInit.url, requestInit);\n\n request.reply.status = response.status;\n request.reply.headers = Object.fromEntries(response.headers.entries());\n request.reply.body = response.body;\n\n this.log.debug(\"Received response\", {\n status: request.reply.status,\n headers: request.reply.headers,\n });\n\n if (options.afterResponse) {\n await options.afterResponse(request, response);\n }\n };\n }\n\n private getRawRequestBody(req: ServerRequest): ReadableStream | undefined {\n const { method } = req;\n\n if (method === \"GET\" || method === \"HEAD\" || method === \"OPTIONS\") {\n return;\n }\n\n if (req.raw?.web?.req) {\n return req.raw.web.req.body as ReadableStream;\n }\n\n if (req.raw?.node?.req) {\n const nodeReq = req.raw.node.req;\n return WebStream.from(nodeReq) as ReadableStream;\n }\n }\n}\n","import { $module } from \"alepha\";\nimport { AlephaServer } from \"alepha/server\";\nimport { $proxy } from \"./primitives/$proxy.ts\";\nimport { ServerProxyProvider } from \"./providers/ServerProxyProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./primitives/$proxy.ts\";\nexport * from \"./providers/ServerProxyProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Plugin for Alepha that provides a proxy server functionality.\n *\n * @see {@link $proxy}\n * @module alepha.server.proxy\n */\nexport const AlephaServerProxy = $module({\n name: \"alepha.server.proxy\",\n primitives: [$proxy],\n services: [AlephaServer, ServerProxyProvider],\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsFA,MAAa,UAAU,YAAmD;AACxE,QAAO,gBAAgB,gBAAgB,QAAQ;;AAsIjD,IAAa,iBAAb,cAAoC,UAAiC;AAErE,OAAO,QAAQ;;;;ACpNf,IAAa,sBAAb,MAAiC;CAC/B,AAAmB,MAAM,SAAS;CAClC,AAAmB,iBAAiB,QAAQ,qBAAqB;CACjE,AAAmB,SAAS,QAAQ,OAAO;CAE3C,AAAmB,YAAY,MAAM;EACnC,IAAI;EACJ,eAAe;AACb,QAAK,MAAM,SAAS,KAAK,OAAO,WAAW,OAAO,CAChD,MAAK,YAAY,MAAM,QAAQ;;EAGpC,CAAC;CAEF,AAAO,YAAY,SAAsC;AACvD,MAAI,QAAQ,SACV;EAGF,MAAM,OAAO,QAAQ;EACrB,MAAM,SACJ,OAAO,QAAQ,WAAW,aAAa,QAAQ,QAAQ,GAAG,QAAQ;AAEpE,MAAI,CAAC,KAAK,SAAS,KAAK,CACtB,OAAM,IAAI,YAAY,kCAAkC;EAI1D,MAAM,UAAU,KAAK,mBAAmB,QAAQ,QAAQ;AAExD,OAAK,MAAM,UAAU,aACnB,MAAK,eAAe,YAAY;GAC9B;GACA;GACA;GACD,CAAC;AAGJ,OAAK,IAAI,KAAK,YAAY;GAAE;GAAM;GAAQ,CAAC;;CAG7C,AAAO,mBACL,QACA,SACe;AACf,SAAO,OAAO,YAAY;GACxB,MAAM,MAAM,IAAI,IAAI,SAAS,QAAQ,IAAI,SAAS;AAClD,OAAI,QAAQ,IAAI,OACd,KAAI,SAAS,QAAQ,IAAI;AAG3B,WAAQ,UAAU,IAAI;GAEtB,MAAM,cAAc;IAClB,KAAK,IAAI,UAAU;IACnB,QAAQ,QAAQ;IAChB,SAAS;KACP,GAAG,QAAQ;KACX,mBAAmB;KACpB;IACD,MAAM,KAAK,kBAAkB,QAAQ;IACtC;AAED,OAAI,YAAY,KACd,CAAC,YAAoB,SAAS;AAGhC,OAAI,QAAQ,cACV,OAAM,QAAQ,cAAc,SAAS,YAAY;AAGnD,QAAK,IAAI,MAAM,oBAAoB;IACjC,KAAK,IAAI,UAAU;IACnB,QAAQ,QAAQ;IAChB,SAAS,QAAQ;IAClB,CAAC;GAEF,MAAM,WAAW,MAAM,MAAM,YAAY,KAAK,YAAY;AAE1D,WAAQ,MAAM,SAAS,SAAS;AAChC,WAAQ,MAAM,UAAU,OAAO,YAAY,SAAS,QAAQ,SAAS,CAAC;AACtE,WAAQ,MAAM,OAAO,SAAS;AAE9B,QAAK,IAAI,MAAM,qBAAqB;IAClC,QAAQ,QAAQ,MAAM;IACtB,SAAS,QAAQ,MAAM;IACxB,CAAC;AAEF,OAAI,QAAQ,cACV,OAAM,QAAQ,cAAc,SAAS,SAAS;;;CAKpD,AAAQ,kBAAkB,KAAgD;EACxE,MAAM,EAAE,WAAW;AAEnB,MAAI,WAAW,SAAS,WAAW,UAAU,WAAW,UACtD;AAGF,MAAI,IAAI,KAAK,KAAK,IAChB,QAAO,IAAI,IAAI,IAAI,IAAI;AAGzB,MAAI,IAAI,KAAK,MAAM,KAAK;GACtB,MAAM,UAAU,IAAI,IAAI,KAAK;AAC7B,UAAOA,eAAU,KAAK,QAAQ;;;;;;;;;;;;;ACpGpC,MAAa,oBAAoB,QAAQ;CACvC,MAAM;CACN,YAAY,CAAC,OAAO;CACpB,UAAU,CAAC,cAAc,oBAAoB;CAC9C,CAAC"}
1
+ {"version":3,"file":"index.js","names":["WebStream"],"sources":["../../../src/server/proxy/primitives/$proxy.ts","../../../src/server/proxy/providers/ServerProxyProvider.ts","../../../src/server/proxy/index.ts"],"sourcesContent":["import { type Async, createPrimitive, KIND, Primitive } from \"alepha\";\nimport type { ServerRequest } from \"alepha/server\";\n\n/**\n * Creates a proxy primitive to forward requests to another server.\n *\n * This primitive enables you to create reverse proxy functionality, allowing your Alepha server\n * to forward requests to other services while maintaining a unified API surface. It's particularly\n * useful for microservice architectures, API gateways, or when you need to aggregate multiple\n * services behind a single endpoint.\n *\n * **Key Features**\n *\n * - **Path-based routing**: Match specific paths or patterns to proxy\n * - **Dynamic targets**: Support both static and dynamic target resolution\n * - **Request/Response hooks**: Modify requests before forwarding and responses after receiving\n * - **URL rewriting**: Transform URLs before forwarding to the target\n * - **Conditional proxying**: Enable/disable proxies based on environment or conditions\n *\n * @example\n * **Basic proxy setup:**\n * ```ts\n * import { $proxy } from \"alepha/server/proxy\";\n *\n * class ApiGateway {\n * // Forward all /api/* requests to external service\n * api = $proxy({\n * path: \"/api/*\",\n * target: \"https://api.example.com\"\n * });\n * }\n * ```\n *\n * @example\n * **Dynamic target with environment-based routing:**\n * ```ts\n * class ApiGateway {\n * // Route to different environments based on configuration\n * api = $proxy({\n * path: \"/api/*\",\n * target: () => process.env.NODE_ENV === \"production\"\n * ? \"https://api.prod.example.com\"\n * : \"https://api.dev.example.com\"\n * });\n * }\n * ```\n *\n * @example\n * **Advanced proxy with request/response modification:**\n * ```ts\n * class SecureProxy {\n * secure = $proxy({\n * path: \"/secure/*\",\n * target: \"https://secure-api.example.com\",\n * beforeRequest: async (request, proxyRequest) => {\n * // Add authentication headers\n * proxyRequest.headers = {\n * ...proxyRequest.headers,\n * 'Authorization': `Bearer ${await getServiceToken()}`,\n * 'X-Forwarded-For': request.headers['x-forwarded-for'] || request.ip\n * };\n * },\n * afterResponse: async (request, proxyResponse) => {\n * // Log response for monitoring\n * console.log(`Proxied ${request.url} -> ${proxyResponse.status}`);\n * },\n * rewrite: (url) => {\n * // Remove /secure prefix when forwarding\n * url.pathname = url.pathname.replace('/secure', '');\n * }\n * });\n * }\n * ```\n *\n * @example\n * **Conditional proxy based on feature flags:**\n * ```ts\n * class FeatureProxy {\n * newApi = $proxy({\n * path: \"/v2/*\",\n * target: \"https://new-api.example.com\",\n * disabled: !process.env.ENABLE_V2_API // Disable if feature flag is off\n * });\n * }\n * ```\n */\nexport const $proxy = (options: ProxyPrimitiveOptions): ProxyPrimitive => {\n return createPrimitive(ProxyPrimitive, options);\n};\n\nexport type ProxyPrimitiveOptions = {\n /**\n * Path pattern to match for proxying requests.\n *\n * Supports wildcards and path parameters:\n * - `/api/*` - Matches all paths starting with `/api/`\n * - `/api/v1/*` - Matches all paths starting with `/api/v1/`\n * - `/users/:id` - Matches `/users/123`, `/users/abc`, etc.\n *\n * @example \"/api/*\"\n * @example \"/secure/admin/*\"\n * @example \"/users/:id/posts\"\n */\n path: string;\n\n /**\n * Target URL to which matching requests should be forwarded.\n *\n * Can be either:\n * - **Static string**: A fixed URL like `\"https://api.example.com\"`\n * - **Dynamic function**: A function that returns the URL, enabling runtime target resolution\n *\n * The target URL will be combined with the remaining path from the original request.\n *\n * @example \"https://api.example.com\"\n * @example () => process.env.API_URL || \"http://localhost:3001\"\n */\n target: string | (() => string);\n\n /**\n * Whether this proxy is disabled.\n *\n * When `true`, requests matching the path will not be proxied and will be handled\n * by other routes or return 404. Useful for feature toggles or conditional proxying.\n *\n * @default false\n * @example !process.env.ENABLE_PROXY\n */\n disabled?: boolean;\n\n /**\n * Hook called before forwarding the request to the target server.\n *\n * Use this to:\n * - Add authentication headers\n * - Modify request headers or body\n * - Add request tracking/logging\n * - Transform the request before forwarding\n *\n * @param request - The original incoming server request\n * @param proxyRequest - The request that will be sent to the target (modifiable)\n *\n * @example\n * ```ts\n * beforeRequest: async (request, proxyRequest) => {\n * proxyRequest.headers = {\n * ...proxyRequest.headers,\n * 'Authorization': `Bearer ${await getToken()}`,\n * 'X-Request-ID': generateRequestId()\n * };\n * }\n * ```\n */\n beforeRequest?: (\n request: ServerRequest,\n proxyRequest: RequestInit,\n ) => Async<void>;\n\n /**\n * Hook called after receiving the response from the target server.\n *\n * Use this to:\n * - Log response details for monitoring\n * - Add custom headers to the response\n * - Transform response data\n * - Handle error responses\n *\n * @param request - The original incoming server request\n * @param proxyResponse - The response received from the target server\n *\n * @example\n * ```ts\n * afterResponse: async (request, proxyResponse) => {\n * console.log(`Proxy ${request.method} ${request.url} -> ${proxyResponse.status}`);\n *\n * if (!proxyResponse.ok) {\n * await logError(`Proxy error: ${proxyResponse.status}`, { request, response: proxyResponse });\n * }\n * }\n * ```\n */\n afterResponse?: (\n request: ServerRequest,\n proxyResponse: Response,\n ) => Async<void>;\n\n /**\n * Function to rewrite the URL before sending to the target server.\n *\n * Use this to:\n * - Remove or add path prefixes\n * - Transform path parameters\n * - Modify query parameters\n * - Change the URL structure entirely\n *\n * The function receives a mutable URL object and should modify it in-place.\n *\n * @param url - The URL object to modify (mutable)\n *\n * @example\n * ```ts\n * // Remove /api prefix when forwarding\n * rewrite: (url) => {\n * url.pathname = url.pathname.replace('/api', '');\n * }\n * ```\n *\n * @example\n * ```ts\n * // Add version prefix\n * rewrite: (url) => {\n * url.pathname = `/v2${url.pathname}`;\n * }\n * ```\n */\n rewrite?: (url: URL) => void;\n\n // TODO: Add retry functionality\n // retry?: RetryOptions;\n};\n\nexport class ProxyPrimitive extends Primitive<ProxyPrimitiveOptions> {}\n\n$proxy[KIND] = ProxyPrimitive;\n","import { ReadableStream as WebStream } from \"node:stream/web\";\nimport { $hook, $inject, Alepha, AlephaError } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport {\n routeMethods,\n type ServerHandler,\n type ServerRequest,\n ServerRouterProvider,\n} from \"alepha/server\";\nimport { $proxy, type ProxyPrimitiveOptions } from \"../primitives/$proxy.ts\";\n\nexport class ServerProxyProvider {\n protected readonly log = $logger();\n protected readonly routerProvider = $inject(ServerRouterProvider);\n protected readonly alepha = $inject(Alepha);\n\n protected readonly configure = $hook({\n on: \"configure\",\n handler: () => {\n for (const proxy of this.alepha.primitives($proxy)) {\n this.createProxy(proxy.options);\n }\n },\n });\n\n public createProxy(options: ProxyPrimitiveOptions): void {\n if (options.disabled) {\n return;\n }\n\n const path = options.path;\n const target =\n typeof options.target === \"function\" ? options.target() : options.target;\n\n if (!path.endsWith(\"/*\")) {\n throw new AlephaError(\"Proxy path should end with '/*'\");\n }\n\n // Extract base path without /*\n const handler = this.createProxyHandler(target, options);\n\n for (const method of routeMethods) {\n this.routerProvider.createRoute({\n method,\n path,\n handler,\n });\n }\n\n this.log.info(\"Proxying\", { path, target });\n }\n\n public createProxyHandler(\n target: string,\n options: Omit<ProxyPrimitiveOptions, \"path\">,\n ): ServerHandler {\n return async (request) => {\n const url = new URL(target + request.url.pathname);\n if (request.url.search) {\n url.search = request.url.search;\n }\n\n options.rewrite?.(url);\n\n const requestInit = {\n url: url.toString(),\n method: request.method,\n headers: {\n ...request.headers,\n \"accept-encoding\": \"identity\", // ignore compression\n },\n body: this.getRawRequestBody(request),\n };\n\n if (requestInit.body) {\n (requestInit as any).duplex = \"half\";\n }\n\n if (options.beforeRequest) {\n await options.beforeRequest(request, requestInit);\n }\n\n this.log.debug(\"Proxying request\", {\n url: url.toString(),\n method: request.method,\n headers: request.headers,\n });\n\n const response = await fetch(requestInit.url, requestInit);\n\n request.reply.status = response.status;\n request.reply.headers = Object.fromEntries(response.headers.entries());\n request.reply.body = response.body;\n\n this.log.debug(\"Received response\", {\n status: request.reply.status,\n headers: request.reply.headers,\n });\n\n if (options.afterResponse) {\n await options.afterResponse(request, response);\n }\n };\n }\n\n private getRawRequestBody(req: ServerRequest): ReadableStream | undefined {\n const { method } = req;\n\n if (method === \"GET\" || method === \"HEAD\" || method === \"OPTIONS\") {\n return;\n }\n\n if (req.raw?.web?.req) {\n return req.raw.web.req.body as ReadableStream;\n }\n\n if (req.raw?.node?.req) {\n const nodeReq = req.raw.node.req;\n return WebStream.from(nodeReq) as unknown as ReadableStream;\n }\n }\n}\n","import { $module } from \"alepha\";\nimport { AlephaServer } from \"alepha/server\";\nimport { $proxy } from \"./primitives/$proxy.ts\";\nimport { ServerProxyProvider } from \"./providers/ServerProxyProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./primitives/$proxy.ts\";\nexport * from \"./providers/ServerProxyProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Plugin for Alepha that provides a proxy server functionality.\n *\n * @see {@link $proxy}\n * @module alepha.server.proxy\n */\nexport const AlephaServerProxy = $module({\n name: \"alepha.server.proxy\",\n primitives: [$proxy],\n services: [AlephaServer, ServerProxyProvider],\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsFA,MAAa,UAAU,YAAmD;AACxE,QAAO,gBAAgB,gBAAgB,QAAQ;;AAsIjD,IAAa,iBAAb,cAAoC,UAAiC;AAErE,OAAO,QAAQ;;;;ACpNf,IAAa,sBAAb,MAAiC;CAC/B,AAAmB,MAAM,SAAS;CAClC,AAAmB,iBAAiB,QAAQ,qBAAqB;CACjE,AAAmB,SAAS,QAAQ,OAAO;CAE3C,AAAmB,YAAY,MAAM;EACnC,IAAI;EACJ,eAAe;AACb,QAAK,MAAM,SAAS,KAAK,OAAO,WAAW,OAAO,CAChD,MAAK,YAAY,MAAM,QAAQ;;EAGpC,CAAC;CAEF,AAAO,YAAY,SAAsC;AACvD,MAAI,QAAQ,SACV;EAGF,MAAM,OAAO,QAAQ;EACrB,MAAM,SACJ,OAAO,QAAQ,WAAW,aAAa,QAAQ,QAAQ,GAAG,QAAQ;AAEpE,MAAI,CAAC,KAAK,SAAS,KAAK,CACtB,OAAM,IAAI,YAAY,kCAAkC;EAI1D,MAAM,UAAU,KAAK,mBAAmB,QAAQ,QAAQ;AAExD,OAAK,MAAM,UAAU,aACnB,MAAK,eAAe,YAAY;GAC9B;GACA;GACA;GACD,CAAC;AAGJ,OAAK,IAAI,KAAK,YAAY;GAAE;GAAM;GAAQ,CAAC;;CAG7C,AAAO,mBACL,QACA,SACe;AACf,SAAO,OAAO,YAAY;GACxB,MAAM,MAAM,IAAI,IAAI,SAAS,QAAQ,IAAI,SAAS;AAClD,OAAI,QAAQ,IAAI,OACd,KAAI,SAAS,QAAQ,IAAI;AAG3B,WAAQ,UAAU,IAAI;GAEtB,MAAM,cAAc;IAClB,KAAK,IAAI,UAAU;IACnB,QAAQ,QAAQ;IAChB,SAAS;KACP,GAAG,QAAQ;KACX,mBAAmB;KACpB;IACD,MAAM,KAAK,kBAAkB,QAAQ;IACtC;AAED,OAAI,YAAY,KACd,CAAC,YAAoB,SAAS;AAGhC,OAAI,QAAQ,cACV,OAAM,QAAQ,cAAc,SAAS,YAAY;AAGnD,QAAK,IAAI,MAAM,oBAAoB;IACjC,KAAK,IAAI,UAAU;IACnB,QAAQ,QAAQ;IAChB,SAAS,QAAQ;IAClB,CAAC;GAEF,MAAM,WAAW,MAAM,MAAM,YAAY,KAAK,YAAY;AAE1D,WAAQ,MAAM,SAAS,SAAS;AAChC,WAAQ,MAAM,UAAU,OAAO,YAAY,SAAS,QAAQ,SAAS,CAAC;AACtE,WAAQ,MAAM,OAAO,SAAS;AAE9B,QAAK,IAAI,MAAM,qBAAqB;IAClC,QAAQ,QAAQ,MAAM;IACtB,SAAS,QAAQ,MAAM;IACxB,CAAC;AAEF,OAAI,QAAQ,cACV,OAAM,QAAQ,cAAc,SAAS,SAAS;;;CAKpD,AAAQ,kBAAkB,KAAgD;EACxE,MAAM,EAAE,WAAW;AAEnB,MAAI,WAAW,SAAS,WAAW,UAAU,WAAW,UACtD;AAGF,MAAI,IAAI,KAAK,KAAK,IAChB,QAAO,IAAI,IAAI,IAAI,IAAI;AAGzB,MAAI,IAAI,KAAK,MAAM,KAAK;GACtB,MAAM,UAAU,IAAI,IAAI,KAAK;AAC7B,UAAOA,eAAU,KAAK,QAAQ;;;;;;;;;;;;;ACpGpC,MAAa,oBAAoB,QAAQ;CACvC,MAAM;CACN,YAAY,CAAC,OAAO;CACpB,UAAU,CAAC,cAAc,oBAAoB;CAC9C,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/server/rate-limit/providers/ServerRateLimitProvider.ts","../../../src/server/rate-limit/primitives/$rateLimit.ts","../../../src/server/rate-limit/index.ts"],"sourcesContent":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import * as alepha5 from "alepha";
1
+ import * as alepha1 from "alepha";
2
2
  import { Alepha, KIND, Primitive } from "alepha";
3
3
  import { JwtProvider, Permission, SecurityProvider, UserAccount, UserAccountToken } from "alepha/security";
4
4
  import { FetchOptions, ServerRequest, ServerRouterProvider } from "alepha/server";
@@ -28,15 +28,15 @@ declare class ServerBasicAuthProvider {
28
28
  * Register a basic auth configuration (called by primitives)
29
29
  */
30
30
  registerAuth(config: BasicAuthPrimitiveConfig): void;
31
- readonly onStart: alepha5.HookPrimitive<"start">;
31
+ readonly onStart: alepha1.HookPrimitive<"start">;
32
32
  /**
33
33
  * Hook into server:onRequest to check basic auth
34
34
  */
35
- readonly onRequest: alepha5.HookPrimitive<"server:onRequest">;
35
+ readonly onRequest: alepha1.HookPrimitive<"server:onRequest">;
36
36
  /**
37
37
  * Hook into action:onRequest to check basic auth for actions
38
38
  */
39
- readonly onActionRequest: alepha5.HookPrimitive<"action:onRequest">;
39
+ readonly onActionRequest: alepha1.HookPrimitive<"action:onRequest">;
40
40
  /**
41
41
  * Check basic authentication
42
42
  */
@@ -66,9 +66,9 @@ declare class ServerSecurityProvider {
66
66
  protected readonly securityProvider: SecurityProvider;
67
67
  protected readonly jwtProvider: JwtProvider;
68
68
  protected readonly alepha: Alepha;
69
- protected readonly onConfigure: alepha5.HookPrimitive<"configure">;
70
- protected readonly onActionRequest: alepha5.HookPrimitive<"action:onRequest">;
71
- protected readonly onRequest: alepha5.HookPrimitive<"server:onRequest">;
69
+ protected readonly onConfigure: alepha1.HookPrimitive<"configure">;
70
+ protected readonly onActionRequest: alepha1.HookPrimitive<"action:onRequest">;
71
+ protected readonly onRequest: alepha1.HookPrimitive<"server:onRequest">;
72
72
  protected check(user: UserAccountToken, secure: ServerRouteSecure): void;
73
73
  /**
74
74
  * Get the user account token for a local action call.
@@ -85,7 +85,7 @@ declare class ServerSecurityProvider {
85
85
  user?: UserAccountToken | "system" | "context";
86
86
  }, permission?: Permission): UserAccountToken;
87
87
  protected createTestUser(): UserAccountToken;
88
- protected readonly onClientRequest: alepha5.HookPrimitive<"client:onRequest">;
88
+ protected readonly onClientRequest: alepha1.HookPrimitive<"client:onRequest">;
89
89
  }
90
90
  type ServerRouteSecure = {
91
91
  realm?: string;
@@ -167,7 +167,7 @@ declare module "alepha/server" {
167
167
  * @see {@link ServerSecurityProvider}
168
168
  * @module alepha.server.security
169
169
  */
170
- declare const AlephaServerSecurity: alepha5.Service<alepha5.Module>;
170
+ declare const AlephaServerSecurity: alepha1.Service<alepha1.Module>;
171
171
  //#endregion
172
172
  export { $basicAuth, AbstractBasicAuthPrimitive, AlephaServerSecurity, BasicAuthOptions, BasicAuthPrimitive, BasicAuthPrimitiveConfig, ServerBasicAuthProvider, ServerRouteSecure, ServerSecurityProvider, isBasicAuth };
173
173
  //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/server/security/providers/ServerBasicAuthProvider.ts","../../../src/server/security/providers/ServerSecurityProvider.ts","../../../src/server/security/primitives/$basicAuth.ts","../../../src/server/security/index.ts"],"sourcesContent":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/server/static/primitives/$serve.ts","../../../src/server/static/providers/ServerStaticProvider.ts","../../../src/server/static/index.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;cAMa;aAAmB,wBAA6B;;AAA7D,CAAA;AAAgC,UAIf,qBAAA,CAJe;EAA6B;;;;AAI7D;EA0DiB,IAAA,CAAA,EAAA,MAAA;EAuBJ;;;;AChFb;EAC2B,IAAA,CAAA,EAAA,MAAA;EACQ;;;;;EAIa,QAElB,CAAA,EAAA,OAAA;EAYjB;;;;;EA0KA,iBAAA,CAAA,EAAA,OAAA;EAwBR;;AAmBL;;;;EClOa;;;;;;;;;;;;;;;;;iBF+CI,QAAQ;;UAGR,mBAAA;;;;;;;;;;;;UAaP;;;;;;;;cAUG,cAAA,SAAuB,UAAU;;;cChFjC,oBAAA;6BACc;qCACQ;EDPtB,mBAEZ,gBAAA,ECMoC,gBDNpC;EAF+B,mBAAA,YAAA,ECSC,YDTD;EAA6B,mBAAA,GAAA,ECS5B,cAAA,CACT,MDVqC;kCCW3B;gCAAc,OAAA,CAElB;8BAYjB,wBACR;EDtBY,iBAAA,CAAA,QAAqB,EAAA,MAAA,EAuDb,OAAA,ECmDZ,qBDnDW,CAAA,ECoDnB,ODpDmB,CCoDX,aDpDW,CAAA;EAGP,UAAA,iBAAmB,CAAA,CAAA,EAAA,MAa1B,EAAA;EAUG,UAAA,eAAe,CAAA,QAAkB,EAAA,MAAA,EAAA,OAAV,EC8GvB,qBD9GgC,CAAA,EAAA;;;;EChFhC,WAAA,CAAA,GAAA,EAAA,MAAoB,EAAA,iBAAA,CAAA,EAAA,OAAA,CAAA,EAsN5B,OAtN4B,CAAA,MAAA,EAAA,CAAA;;AAEE,UAuOlB,cAAA,CAvOkB;EACE,OAAA,EAuO1B,qBAvO0B;EACJ,KAAA,EAAA,MAAA,EAAA;;;;;;;;;;ADTpB,cEYA,kBFVZ,EEU8B,OAAA,CAAA,OFV9B,CEcC,OAAA,CAJ6B,MAAA,CFV9B"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/server/swagger/primitives/$swagger.ts","../../../src/server/swagger/providers/ServerSwaggerProvider.ts","../../../src/server/swagger/index.ts"],"sourcesContent":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/sms/providers/SmsProvider.ts","../../src/sms/errors/SmsError.ts","../../src/sms/primitives/$sms.ts","../../src/sms/providers/LocalSmsProvider.ts","../../src/sms/providers/MemorySmsProvider.ts","../../src/sms/index.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;AAKsB,uBAAA,WAAA,CAMU;EAGpB;;;;ACdZ;yBDWgC,iBAAiB;;KAGrC,cAAA;EEFC,EAAA,EAAA,MAC2B,GAAA,MAAA,EAAA;EADV,OAAA,EAAA,MAAA;CAAmB;;;cDZpC,QAAA,SAAiB,KAAA;uCACS;;;;cCW1B;aAAiB,sBAAmB;EFP3B,MAAA,EAAA,mBAMU;AAGhC,CAAA;UEGiB,mBAAA;;aAEJ,kBAAkB;ADnB/B;;;;ACYA;;;;;;AAKA;AAwBA;;;;;;;AAA2C,cAA9B,YAAA,SAAqB,SAAS,CAAC,mBAAD,CAAA,CAAA;+BACd;;;ACpC7B;AAQA;EAA8B,IAAA,CAAA,OACN,EDoCK,cCpCL,CAAA,EDoCsB,OCpCtB,CAAA,IAAA,CAAA;EAGD,UAAA,SAAA,CAAA,CAAA,EDqDE,WCrDF;;;;UAZN,uBAAA;;;;AHDjB;EASY,SAAA,CAAA,EAAA,MAAc;;cGAb,gBAAA,YAA4B;0BAAX,cAAA,CACN;EFfX,mBAAS,SACiB,EADT,MAAK;wBEkBZ;gBAIM,iBAAiB;;IDVjC,EAAA,EAC2B,MAAA;IADV,OAAA,EAAA,MAAA;EAAmB,CAAA,CAAA,EAAA,MAAA;;;;UEThC,SAAA;;;UAGP;AJDV;AASY,cILC,iBAAA,YAA6B,WJKhB,CAAA;0BILK,cAAA,CACP;WACN;gBAEW,iBAAiB;EHbjC;;;cG6BQ;AFjBrB;;;AFEA,eAAY,QAAc,CAAA;;;;MCdb,QAAS,EAAA,MACiB;iBIoBtB;gBACD;;IHVH,CAAA;IAAiB,UAAA,EAAA;MAAmB,EAAA,EAAA,MAAA,GAAA,MAAA,EAAA;;gBGgBjC;;EHXC;AAwBjB;;;;;;;;;;;ACnCiB,cEuCJ,SFvC2B,EEuClB,OAAA,CAAA,OFvCkB,CEiDtC,OAAA,CAVoB,MAAA,CFvCkB"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/thread/primitives/$thread.ts","../../src/thread/providers/ThreadProvider.ts","../../src/thread/index.ts"],"sourcesContent":[],"mappings":";;;;;;;;;AAuHA;;;;;;AAMA;AAuFA;;;;;;;;;;;AAwDC;;;;;;;;;AChQD;;;;;;;;ACL8C;;;;;AAsB9C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cF0Fa;YAAoB,yBAAyB;;;UAMzC,sBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBAwCM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cA+CV,eAAA,SAAwB,UAAU;;8BAEnB,YAAA;;;;;wCA6ByB,UAAU,QAAQ;YAe9C;eAKG;;cA6BtB,UAAA;;;;;;;;;YAgBY;;gCAqEoB,QAAQ;;;;eA8EzB;;;;cC3bR,cAAA;0BAAc,cAAA,CACH;;;;ED0GX,mBAEZ,KAAA,EC5GuB,OAAA,CAOE,aDqGzB,CAAA,OAAA,CAAA;EAFgC,OAAA,OAAA,CAAA,CAAA,EC5CA,OD4CA,CAAA,IAAA,CAAA;;;;;;;EAApB;;;;;;AAMb;AAuFA;AAA+C,cEvLlC,YFuLkC,EEvLtB,OAAA,CAAA,OFuLsB,CEnL7C,OAAA,CAJuB,MAAA,CFuLsB"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/topic/core/errors/TopicTimeoutError.ts","../../../src/topic/core/providers/TopicProvider.ts","../../../src/topic/core/primitives/$topic.ts","../../../src/topic/core/primitives/$subscriber.ts","../../../src/topic/core/providers/MemoryTopicProvider.ts","../../../src/topic/core/index.ts"],"sourcesContent":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/topic/redis/providers/RedisTopicProvider.ts","../../../src/topic/redis/index.ts"],"sourcesContent":[],"mappings":";;;;;;;cAea,kBAAA,SAA2B,aAAA;;;;EAA3B,mBAAA,MAAmB,EAEL,MAFK;EAEL,mBAAA,aAAA,EACO,aADP;EACO,mBAAA,uBAAA,EACU,uBADV;EACU,mBAAA,GAAA,EAAA,cAAA,CAEpB,MAFoB;EAAA,mBAEpB,KAAA,EAAA,OAAA,CAEE,aAFF,CAAA,OAAA,CAAA;EAAA,MAEE,CAAA,KAAA,EAAA,MAAA,CAAA,EAAA,MAAA;EAoB8B;;;EAUnD,OAAA,CAAA,KAAA,EAAA,MAAA,EAAA,OAAA,EAAA,MAAA,CAAA,EAVmD,OAUnD,CAAA,IAAA,CAAA;EAYU;;;EAlDsC,SAAA,CAAA,IAAA,EAAA,MAAA,EAAA,QAAA,EAqCvC,iBArCuC,CAAA,EAsChD,OAtCgD,CAsCxC,aAtCwC,CAAA;;;;ECCxC,WAAA,CAAA,IAAA,EAAA,MAWX,EAAA,QAX2B,CAW3B,EDsCa,iBCjDc,CAAA,EDkDxB,OClDwB,CAAA,IAAA,CAAA;;;;;;;;;;ADDhB,cCCA,gBDDmB,ECCH,OAAA,CAAA,ODDG,CCY9B,OAAA,CAX2B,MAAA,CDDG"}
@@ -28,14 +28,14 @@ var RedisTopicProvider = class extends TopicProvider {
28
28
  * Publish a message to a topic.
29
29
  */
30
30
  async publish(topic, message) {
31
- await this.redisProvider.publisher.publish(this.prefix(topic), message);
31
+ await this.redisProvider.publish(this.prefix(topic), message);
32
32
  }
33
33
  /**
34
34
  * Subscribe to a topic.
35
35
  */
36
36
  async subscribe(name, callback) {
37
37
  const topic = this.prefix(name);
38
- await this.redisSubscriberProvider.subscriber.subscribe(topic, callback);
38
+ await this.redisSubscriberProvider.subscribe(topic, callback);
39
39
  return () => this.unsubscribe(name, callback);
40
40
  }
41
41
  /**
@@ -43,7 +43,7 @@ var RedisTopicProvider = class extends TopicProvider {
43
43
  */
44
44
  async unsubscribe(name, callback) {
45
45
  const topic = this.prefix(name);
46
- await this.redisSubscriberProvider.subscriber.unsubscribe(topic, callback);
46
+ await this.redisSubscriberProvider.unsubscribe(topic, callback);
47
47
  }
48
48
  };
49
49
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/topic/redis/providers/RedisTopicProvider.ts","../../../src/topic/redis/index.ts"],"sourcesContent":["import { $env, $hook, $inject, Alepha, t } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport { RedisProvider, RedisSubscriberProvider } from \"alepha/redis\";\nimport {\n type SubscribeCallback,\n TopicProvider,\n type UnSubscribeFn,\n} from \"alepha/topic\";\n\nconst envSchema = t.object({\n REDIS_TOPIC_PREFIX: t.text({\n default: \"topic\",\n }),\n});\n\nexport class RedisTopicProvider extends TopicProvider {\n protected readonly env = $env(envSchema);\n protected readonly alepha = $inject(Alepha);\n protected readonly redisProvider = $inject(RedisProvider);\n protected readonly redisSubscriberProvider = $inject(RedisSubscriberProvider);\n\n protected readonly log = $logger();\n\n protected readonly start = $hook({\n on: \"start\",\n handler: async () => {\n const subscribers = this.subscribers();\n if (subscribers.length) {\n await Promise.all(subscribers.map((fn) => fn()));\n for (const subscriber of subscribers) {\n this.log.debug(`Subscribed to topic '${subscriber.name}'`);\n }\n }\n },\n });\n\n public prefix(queue: string): string {\n return `${this.env.REDIS_TOPIC_PREFIX}:${queue}`;\n }\n\n /**\n * Publish a message to a topic.\n */\n public async publish(topic: string, message: string): Promise<void> {\n await this.redisProvider.publisher.publish(this.prefix(topic), message);\n }\n\n /**\n * Subscribe to a topic.\n */\n public async subscribe(\n name: string,\n callback: SubscribeCallback,\n ): Promise<UnSubscribeFn> {\n const topic = this.prefix(name);\n await this.redisSubscriberProvider.subscriber.subscribe(topic, callback);\n\n return () => this.unsubscribe(name, callback);\n }\n\n /**\n * Unsubscribe from a topic.\n */\n public async unsubscribe(\n name: string,\n callback?: SubscribeCallback,\n ): Promise<void> {\n const topic = this.prefix(name);\n\n await this.redisSubscriberProvider.subscriber.unsubscribe(topic, callback);\n }\n}\n","import { $module, type Alepha } from \"alepha\";\nimport { AlephaTopic, TopicProvider } from \"alepha/topic\";\nimport { RedisTopicProvider } from \"./providers/RedisTopicProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./providers/RedisTopicProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Plugin for Alepha Topic that provides Redis pub/sub capabilities.\n *\n * @see {@link RedisTopicProvider}\n * @module alepha.topic.redis\n */\nexport const AlephaTopicRedis = $module({\n name: \"alepha.topic.redis\",\n services: [RedisTopicProvider],\n register: (alepha: Alepha): Alepha =>\n alepha\n .with({\n optional: true,\n provide: TopicProvider,\n use: RedisTopicProvider,\n })\n .with(AlephaTopic),\n});\n"],"mappings":";;;;;;AASA,MAAM,YAAY,EAAE,OAAO,EACzB,oBAAoB,EAAE,KAAK,EACzB,SAAS,SACV,CAAC,EACH,CAAC;AAEF,IAAa,qBAAb,cAAwC,cAAc;CACpD,AAAmB,MAAM,KAAK,UAAU;CACxC,AAAmB,SAAS,QAAQ,OAAO;CAC3C,AAAmB,gBAAgB,QAAQ,cAAc;CACzD,AAAmB,0BAA0B,QAAQ,wBAAwB;CAE7E,AAAmB,MAAM,SAAS;CAElC,AAAmB,QAAQ,MAAM;EAC/B,IAAI;EACJ,SAAS,YAAY;GACnB,MAAM,cAAc,KAAK,aAAa;AACtC,OAAI,YAAY,QAAQ;AACtB,UAAM,QAAQ,IAAI,YAAY,KAAK,OAAO,IAAI,CAAC,CAAC;AAChD,SAAK,MAAM,cAAc,YACvB,MAAK,IAAI,MAAM,wBAAwB,WAAW,KAAK,GAAG;;;EAIjE,CAAC;CAEF,AAAO,OAAO,OAAuB;AACnC,SAAO,GAAG,KAAK,IAAI,mBAAmB,GAAG;;;;;CAM3C,MAAa,QAAQ,OAAe,SAAgC;AAClE,QAAM,KAAK,cAAc,UAAU,QAAQ,KAAK,OAAO,MAAM,EAAE,QAAQ;;;;;CAMzE,MAAa,UACX,MACA,UACwB;EACxB,MAAM,QAAQ,KAAK,OAAO,KAAK;AAC/B,QAAM,KAAK,wBAAwB,WAAW,UAAU,OAAO,SAAS;AAExE,eAAa,KAAK,YAAY,MAAM,SAAS;;;;;CAM/C,MAAa,YACX,MACA,UACe;EACf,MAAM,QAAQ,KAAK,OAAO,KAAK;AAE/B,QAAM,KAAK,wBAAwB,WAAW,YAAY,OAAO,SAAS;;;;;;;;;;;;ACrD9E,MAAa,mBAAmB,QAAQ;CACtC,MAAM;CACN,UAAU,CAAC,mBAAmB;CAC9B,WAAW,WACT,OACG,KAAK;EACJ,UAAU;EACV,SAAS;EACT,KAAK;EACN,CAAC,CACD,KAAK,YAAY;CACvB,CAAC"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/topic/redis/providers/RedisTopicProvider.ts","../../../src/topic/redis/index.ts"],"sourcesContent":["import { $env, $hook, $inject, Alepha, t } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport { RedisProvider, RedisSubscriberProvider } from \"alepha/redis\";\nimport {\n type SubscribeCallback,\n TopicProvider,\n type UnSubscribeFn,\n} from \"alepha/topic\";\n\nconst envSchema = t.object({\n REDIS_TOPIC_PREFIX: t.text({\n default: \"topic\",\n }),\n});\n\nexport class RedisTopicProvider extends TopicProvider {\n protected readonly env = $env(envSchema);\n protected readonly alepha = $inject(Alepha);\n protected readonly redisProvider = $inject(RedisProvider);\n protected readonly redisSubscriberProvider = $inject(RedisSubscriberProvider);\n\n protected readonly log = $logger();\n\n protected readonly start = $hook({\n on: \"start\",\n handler: async () => {\n const subscribers = this.subscribers();\n if (subscribers.length) {\n await Promise.all(subscribers.map((fn) => fn()));\n for (const subscriber of subscribers) {\n this.log.debug(`Subscribed to topic '${subscriber.name}'`);\n }\n }\n },\n });\n\n public prefix(queue: string): string {\n return `${this.env.REDIS_TOPIC_PREFIX}:${queue}`;\n }\n\n /**\n * Publish a message to a topic.\n */\n public async publish(topic: string, message: string): Promise<void> {\n await this.redisProvider.publish(this.prefix(topic), message);\n }\n\n /**\n * Subscribe to a topic.\n */\n public async subscribe(\n name: string,\n callback: SubscribeCallback,\n ): Promise<UnSubscribeFn> {\n const topic = this.prefix(name);\n await this.redisSubscriberProvider.subscribe(topic, callback);\n\n return () => this.unsubscribe(name, callback);\n }\n\n /**\n * Unsubscribe from a topic.\n */\n public async unsubscribe(\n name: string,\n callback?: SubscribeCallback,\n ): Promise<void> {\n const topic = this.prefix(name);\n\n await this.redisSubscriberProvider.unsubscribe(topic, callback);\n }\n}\n","import { $module, type Alepha } from \"alepha\";\nimport { AlephaTopic, TopicProvider } from \"alepha/topic\";\nimport { RedisTopicProvider } from \"./providers/RedisTopicProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./providers/RedisTopicProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Plugin for Alepha Topic that provides Redis pub/sub capabilities.\n *\n * @see {@link RedisTopicProvider}\n * @module alepha.topic.redis\n */\nexport const AlephaTopicRedis = $module({\n name: \"alepha.topic.redis\",\n services: [RedisTopicProvider],\n register: (alepha: Alepha): Alepha =>\n alepha\n .with({\n optional: true,\n provide: TopicProvider,\n use: RedisTopicProvider,\n })\n .with(AlephaTopic),\n});\n"],"mappings":";;;;;;AASA,MAAM,YAAY,EAAE,OAAO,EACzB,oBAAoB,EAAE,KAAK,EACzB,SAAS,SACV,CAAC,EACH,CAAC;AAEF,IAAa,qBAAb,cAAwC,cAAc;CACpD,AAAmB,MAAM,KAAK,UAAU;CACxC,AAAmB,SAAS,QAAQ,OAAO;CAC3C,AAAmB,gBAAgB,QAAQ,cAAc;CACzD,AAAmB,0BAA0B,QAAQ,wBAAwB;CAE7E,AAAmB,MAAM,SAAS;CAElC,AAAmB,QAAQ,MAAM;EAC/B,IAAI;EACJ,SAAS,YAAY;GACnB,MAAM,cAAc,KAAK,aAAa;AACtC,OAAI,YAAY,QAAQ;AACtB,UAAM,QAAQ,IAAI,YAAY,KAAK,OAAO,IAAI,CAAC,CAAC;AAChD,SAAK,MAAM,cAAc,YACvB,MAAK,IAAI,MAAM,wBAAwB,WAAW,KAAK,GAAG;;;EAIjE,CAAC;CAEF,AAAO,OAAO,OAAuB;AACnC,SAAO,GAAG,KAAK,IAAI,mBAAmB,GAAG;;;;;CAM3C,MAAa,QAAQ,OAAe,SAAgC;AAClE,QAAM,KAAK,cAAc,QAAQ,KAAK,OAAO,MAAM,EAAE,QAAQ;;;;;CAM/D,MAAa,UACX,MACA,UACwB;EACxB,MAAM,QAAQ,KAAK,OAAO,KAAK;AAC/B,QAAM,KAAK,wBAAwB,UAAU,OAAO,SAAS;AAE7D,eAAa,KAAK,YAAY,MAAM,SAAS;;;;;CAM/C,MAAa,YACX,MACA,UACe;EACf,MAAM,QAAQ,KAAK,OAAO,KAAK;AAE/B,QAAM,KAAK,wBAAwB,YAAY,OAAO,SAAS;;;;;;;;;;;;ACrDnE,MAAa,mBAAmB,QAAQ;CACtC,MAAM;CACN,UAAU,CAAC,mBAAmB;CAC9B,WAAW,WACT,OACG,KAAK;EACJ,UAAU;EACV,SAAS;EACT,KAAK;EACN,CAAC,CACD,KAAK,YAAY;CACvB,CAAC"}
@@ -212,6 +212,13 @@ interface GenerateCloudflareOptions {
212
212
  * @default "dist"
213
213
  */
214
214
  distDir?: string;
215
+ /**
216
+ * Additional Wrangler configuration options to merge into wrangler.jsonc.
217
+ */
218
+ config?: WranglerConfig;
219
+ }
220
+ interface WranglerConfig {
221
+ [key: string]: any;
215
222
  }
216
223
  /**
217
224
  * Generate Cloudflare Workers deployment configuration.
@@ -463,7 +470,7 @@ interface ViteAlephaBuildOptions {
463
470
  *
464
471
  * @default false
465
472
  */
466
- cloudflare?: boolean;
473
+ cloudflare?: boolean | WranglerConfig;
467
474
  /**
468
475
  * If true, the build will be optimized for Docker deployment.
469
476
  * Additionally, it will generate a Dockerfile in the dist directory.
@@ -547,7 +554,8 @@ declare global {
547
554
  *
548
555
  * @module alepha.vite
549
556
  */
557
+ //# sourceMappingURL=index.d.ts.map
550
558
 
551
559
  //#endregion
552
- export { AlephaBuildMode, AlephaRunner, AlephaRunnerOptions, AlephaRunnerState, BufferedLogger, BuildClientOptions, BuildServerOptions, BuildServerResult, CopyAssetsOptions, GenerateCloudflareOptions, GenerateDockerOptions, GenerateExternalsOptions, GenerateSitemapOptions, GenerateVercelOptions, PrerenderPagesOptions, PrerenderPagesResult, VercelConfig, ViteAlephaBuildOptions, ViteAlephaDevOptions, ViteAlephaOptions, ViteCompressOptions, boot, buildClient, buildServer, compressFile, copyAssets, createAlephaRunner, createBufferedLogger, generateCloudflare, generateDocker, generateExternals, generateSitemap, generateVercel, isViteInternalPath, prerenderPages, viteAlepha, viteAlephaBuild, viteAlephaDev, viteCompress };
560
+ export { AlephaBuildMode, AlephaRunner, AlephaRunnerOptions, AlephaRunnerState, BufferedLogger, BuildClientOptions, BuildServerOptions, BuildServerResult, CopyAssetsOptions, GenerateCloudflareOptions, GenerateDockerOptions, GenerateExternalsOptions, GenerateSitemapOptions, GenerateVercelOptions, PrerenderPagesOptions, PrerenderPagesResult, VercelConfig, ViteAlephaBuildOptions, ViteAlephaDevOptions, ViteAlephaOptions, ViteCompressOptions, WranglerConfig, boot, buildClient, buildServer, compressFile, copyAssets, createAlephaRunner, createBufferedLogger, generateCloudflare, generateDocker, generateExternals, generateSitemap, generateVercel, isViteInternalPath, prerenderPages, viteAlepha, viteAlephaBuild, viteAlephaDev, viteCompress };
553
561
  //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/vite/helpers/boot.ts","../../src/vite/helpers/createBufferedLogger.ts","../../src/vite/plugins/viteCompress.ts","../../src/vite/tasks/buildClient.ts","../../src/vite/tasks/buildServer.ts","../../src/vite/tasks/copyAssets.ts","../../src/vite/tasks/generateCloudflare.ts","../../src/vite/tasks/generateDocker.ts","../../src/vite/tasks/generateExternals.ts","../../src/vite/tasks/generateSitemap.ts","../../src/vite/tasks/generateVercel.ts","../../src/vite/tasks/prerenderPages.ts","../../src/vite/tasks/runAlepha.ts","../../src/vite/plugins/viteAlephaBuild.ts","../../src/vite/plugins/viteAlephaDev.ts","../../src/vite/plugins/viteAlepha.ts","../../src/vite/index.ts"],"sourcesContent":[],"mappings":"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"}