alepha 0.14.3 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (317) hide show
  1. package/README.md +2 -5
  2. package/dist/api/audits/index.d.ts +620 -811
  3. package/dist/api/audits/index.d.ts.map +1 -1
  4. package/dist/api/files/index.d.ts +185 -377
  5. package/dist/api/files/index.d.ts.map +1 -1
  6. package/dist/api/files/index.js +0 -1
  7. package/dist/api/files/index.js.map +1 -1
  8. package/dist/api/jobs/index.d.ts +245 -435
  9. package/dist/api/jobs/index.d.ts.map +1 -1
  10. package/dist/api/notifications/index.d.ts +238 -429
  11. package/dist/api/notifications/index.d.ts.map +1 -1
  12. package/dist/api/parameters/index.d.ts +236 -427
  13. package/dist/api/parameters/index.d.ts.map +1 -1
  14. package/dist/api/users/index.browser.js +1 -2
  15. package/dist/api/users/index.browser.js.map +1 -1
  16. package/dist/api/users/index.d.ts +1010 -1196
  17. package/dist/api/users/index.d.ts.map +1 -1
  18. package/dist/api/users/index.js +178 -151
  19. package/dist/api/users/index.js.map +1 -1
  20. package/dist/api/verifications/index.d.ts +17 -17
  21. package/dist/api/verifications/index.d.ts.map +1 -1
  22. package/dist/batch/index.d.ts +122 -122
  23. package/dist/batch/index.d.ts.map +1 -1
  24. package/dist/batch/index.js +1 -2
  25. package/dist/batch/index.js.map +1 -1
  26. package/dist/bucket/index.d.ts +163 -163
  27. package/dist/bucket/index.d.ts.map +1 -1
  28. package/dist/cache/core/index.d.ts +46 -46
  29. package/dist/cache/core/index.d.ts.map +1 -1
  30. package/dist/cache/redis/index.d.ts.map +1 -1
  31. package/dist/cli/index.d.ts +384 -285
  32. package/dist/cli/index.d.ts.map +1 -1
  33. package/dist/cli/index.js +1113 -623
  34. package/dist/cli/index.js.map +1 -1
  35. package/dist/command/index.d.ts +299 -300
  36. package/dist/command/index.d.ts.map +1 -1
  37. package/dist/command/index.js +13 -9
  38. package/dist/command/index.js.map +1 -1
  39. package/dist/core/index.browser.js +445 -103
  40. package/dist/core/index.browser.js.map +1 -1
  41. package/dist/core/index.d.ts +733 -625
  42. package/dist/core/index.d.ts.map +1 -1
  43. package/dist/core/index.js +446 -103
  44. package/dist/core/index.js.map +1 -1
  45. package/dist/core/index.native.js +445 -103
  46. package/dist/core/index.native.js.map +1 -1
  47. package/dist/datetime/index.d.ts +44 -44
  48. package/dist/datetime/index.d.ts.map +1 -1
  49. package/dist/datetime/index.js +4 -4
  50. package/dist/datetime/index.js.map +1 -1
  51. package/dist/email/index.d.ts +97 -50
  52. package/dist/email/index.d.ts.map +1 -1
  53. package/dist/email/index.js +129 -33
  54. package/dist/email/index.js.map +1 -1
  55. package/dist/fake/index.d.ts +7981 -14
  56. package/dist/fake/index.d.ts.map +1 -1
  57. package/dist/file/index.d.ts +523 -390
  58. package/dist/file/index.d.ts.map +1 -1
  59. package/dist/file/index.js +253 -1
  60. package/dist/file/index.js.map +1 -1
  61. package/dist/lock/core/index.d.ts +208 -208
  62. package/dist/lock/core/index.d.ts.map +1 -1
  63. package/dist/lock/redis/index.d.ts.map +1 -1
  64. package/dist/logger/index.d.ts +25 -26
  65. package/dist/logger/index.d.ts.map +1 -1
  66. package/dist/logger/index.js +12 -2
  67. package/dist/logger/index.js.map +1 -1
  68. package/dist/mcp/index.d.ts +197 -197
  69. package/dist/mcp/index.d.ts.map +1 -1
  70. package/dist/mcp/index.js +1 -1
  71. package/dist/mcp/index.js.map +1 -1
  72. package/dist/orm/chunk-DtkW-qnP.js +38 -0
  73. package/dist/orm/index.browser.js.map +1 -1
  74. package/dist/orm/index.bun.js +2814 -0
  75. package/dist/orm/index.bun.js.map +1 -0
  76. package/dist/orm/index.d.ts +1228 -1216
  77. package/dist/orm/index.d.ts.map +1 -1
  78. package/dist/orm/index.js +2041 -1967
  79. package/dist/orm/index.js.map +1 -1
  80. package/dist/queue/core/index.d.ts +248 -248
  81. package/dist/queue/core/index.d.ts.map +1 -1
  82. package/dist/queue/redis/index.d.ts.map +1 -1
  83. package/dist/redis/index.bun.js +285 -0
  84. package/dist/redis/index.bun.js.map +1 -0
  85. package/dist/redis/index.d.ts +118 -136
  86. package/dist/redis/index.d.ts.map +1 -1
  87. package/dist/redis/index.js +18 -38
  88. package/dist/redis/index.js.map +1 -1
  89. package/dist/retry/index.d.ts +69 -69
  90. package/dist/retry/index.d.ts.map +1 -1
  91. package/dist/router/index.d.ts +6 -6
  92. package/dist/router/index.d.ts.map +1 -1
  93. package/dist/scheduler/index.d.ts +25 -25
  94. package/dist/scheduler/index.d.ts.map +1 -1
  95. package/dist/security/index.browser.js +5 -1
  96. package/dist/security/index.browser.js.map +1 -1
  97. package/dist/security/index.d.ts +417 -254
  98. package/dist/security/index.d.ts.map +1 -1
  99. package/dist/security/index.js +386 -86
  100. package/dist/security/index.js.map +1 -1
  101. package/dist/server/auth/index.d.ts +110 -110
  102. package/dist/server/auth/index.d.ts.map +1 -1
  103. package/dist/server/auth/index.js +20 -20
  104. package/dist/server/auth/index.js.map +1 -1
  105. package/dist/server/cache/index.d.ts +62 -47
  106. package/dist/server/cache/index.d.ts.map +1 -1
  107. package/dist/server/cache/index.js +56 -3
  108. package/dist/server/cache/index.js.map +1 -1
  109. package/dist/server/compress/index.d.ts +6 -0
  110. package/dist/server/compress/index.d.ts.map +1 -1
  111. package/dist/server/compress/index.js +36 -1
  112. package/dist/server/compress/index.js.map +1 -1
  113. package/dist/server/cookies/index.d.ts +6 -6
  114. package/dist/server/cookies/index.d.ts.map +1 -1
  115. package/dist/server/cookies/index.js +3 -3
  116. package/dist/server/cookies/index.js.map +1 -1
  117. package/dist/server/core/index.browser.js +2 -2
  118. package/dist/server/core/index.browser.js.map +1 -1
  119. package/dist/server/core/index.d.ts +242 -150
  120. package/dist/server/core/index.d.ts.map +1 -1
  121. package/dist/server/core/index.js +294 -125
  122. package/dist/server/core/index.js.map +1 -1
  123. package/dist/server/cors/index.d.ts +11 -12
  124. package/dist/server/cors/index.d.ts.map +1 -1
  125. package/dist/server/health/index.d.ts +0 -1
  126. package/dist/server/health/index.d.ts.map +1 -1
  127. package/dist/server/helmet/index.d.ts +2 -2
  128. package/dist/server/helmet/index.d.ts.map +1 -1
  129. package/dist/server/links/index.browser.js.map +1 -1
  130. package/dist/server/links/index.d.ts +123 -124
  131. package/dist/server/links/index.d.ts.map +1 -1
  132. package/dist/server/links/index.js +1 -2
  133. package/dist/server/links/index.js.map +1 -1
  134. package/dist/server/metrics/index.d.ts.map +1 -1
  135. package/dist/server/multipart/index.d.ts +6 -6
  136. package/dist/server/multipart/index.d.ts.map +1 -1
  137. package/dist/server/proxy/index.d.ts +102 -103
  138. package/dist/server/proxy/index.d.ts.map +1 -1
  139. package/dist/server/rate-limit/index.d.ts +16 -16
  140. package/dist/server/rate-limit/index.d.ts.map +1 -1
  141. package/dist/server/static/index.d.ts +44 -44
  142. package/dist/server/static/index.d.ts.map +1 -1
  143. package/dist/server/static/index.js +4 -0
  144. package/dist/server/static/index.js.map +1 -1
  145. package/dist/server/swagger/index.d.ts +48 -49
  146. package/dist/server/swagger/index.d.ts.map +1 -1
  147. package/dist/server/swagger/index.js +3 -5
  148. package/dist/server/swagger/index.js.map +1 -1
  149. package/dist/sms/index.d.ts +13 -11
  150. package/dist/sms/index.d.ts.map +1 -1
  151. package/dist/sms/index.js +7 -7
  152. package/dist/sms/index.js.map +1 -1
  153. package/dist/thread/index.d.ts +71 -72
  154. package/dist/thread/index.d.ts.map +1 -1
  155. package/dist/topic/core/index.d.ts +318 -318
  156. package/dist/topic/core/index.d.ts.map +1 -1
  157. package/dist/topic/redis/index.d.ts +6 -6
  158. package/dist/topic/redis/index.d.ts.map +1 -1
  159. package/dist/vite/index.d.ts +5805 -249
  160. package/dist/vite/index.d.ts.map +1 -1
  161. package/dist/vite/index.js +599 -513
  162. package/dist/vite/index.js.map +1 -1
  163. package/dist/websocket/index.browser.js +6 -6
  164. package/dist/websocket/index.browser.js.map +1 -1
  165. package/dist/websocket/index.d.ts +247 -247
  166. package/dist/websocket/index.d.ts.map +1 -1
  167. package/dist/websocket/index.js +6 -6
  168. package/dist/websocket/index.js.map +1 -1
  169. package/package.json +9 -14
  170. package/src/api/files/controllers/AdminFileStatsController.ts +0 -1
  171. package/src/api/users/atoms/realmAuthSettingsAtom.ts +5 -0
  172. package/src/api/users/controllers/{UserRealmController.ts → RealmController.ts} +11 -11
  173. package/src/api/users/entities/users.ts +1 -1
  174. package/src/api/users/index.ts +8 -8
  175. package/src/api/users/primitives/{$userRealm.ts → $realm.ts} +17 -19
  176. package/src/api/users/providers/{UserRealmProvider.ts → RealmProvider.ts} +26 -30
  177. package/src/api/users/schemas/{userRealmConfigSchema.ts → realmConfigSchema.ts} +2 -2
  178. package/src/api/users/services/CredentialService.ts +7 -7
  179. package/src/api/users/services/IdentityService.ts +4 -4
  180. package/src/api/users/services/RegistrationService.spec.ts +25 -27
  181. package/src/api/users/services/RegistrationService.ts +38 -27
  182. package/src/api/users/services/SessionCrudService.ts +3 -3
  183. package/src/api/users/services/SessionService.spec.ts +3 -3
  184. package/src/api/users/services/SessionService.ts +28 -9
  185. package/src/api/users/services/UserService.ts +7 -7
  186. package/src/batch/providers/BatchProvider.ts +1 -2
  187. package/src/cli/apps/AlephaCli.ts +0 -2
  188. package/src/cli/apps/AlephaPackageBuilderCli.ts +38 -19
  189. package/src/cli/assets/apiHelloControllerTs.ts +18 -0
  190. package/src/cli/assets/apiIndexTs.ts +16 -0
  191. package/src/cli/assets/claudeMd.ts +303 -0
  192. package/src/cli/assets/mainBrowserTs.ts +2 -2
  193. package/src/cli/assets/mainServerTs.ts +24 -0
  194. package/src/cli/assets/webAppRouterTs.ts +15 -0
  195. package/src/cli/assets/webHelloComponentTsx.ts +16 -0
  196. package/src/cli/assets/webIndexTs.ts +16 -0
  197. package/src/cli/atoms/buildOptions.ts +88 -0
  198. package/src/cli/commands/build.ts +70 -87
  199. package/src/cli/commands/db.ts +21 -22
  200. package/src/cli/commands/deploy.ts +17 -5
  201. package/src/cli/commands/dev.ts +22 -14
  202. package/src/cli/commands/format.ts +8 -2
  203. package/src/cli/commands/gen/env.ts +53 -0
  204. package/src/cli/commands/gen/openapi.ts +1 -1
  205. package/src/cli/commands/gen/resource.ts +15 -0
  206. package/src/cli/commands/gen.ts +7 -1
  207. package/src/cli/commands/init.ts +74 -30
  208. package/src/cli/commands/lint.ts +8 -2
  209. package/src/cli/commands/test.ts +8 -3
  210. package/src/cli/commands/typecheck.ts +5 -1
  211. package/src/cli/commands/verify.ts +5 -3
  212. package/src/cli/defineConfig.ts +49 -7
  213. package/src/cli/index.ts +0 -1
  214. package/src/cli/services/AlephaCliUtils.ts +39 -589
  215. package/src/cli/services/PackageManagerUtils.ts +301 -0
  216. package/src/cli/services/ProjectScaffolder.ts +306 -0
  217. package/src/command/helpers/Runner.spec.ts +2 -2
  218. package/src/command/helpers/Runner.ts +16 -4
  219. package/src/command/primitives/$command.ts +0 -6
  220. package/src/command/providers/CliProvider.ts +1 -3
  221. package/src/core/Alepha.ts +42 -0
  222. package/src/core/__tests__/Alepha-graph.spec.ts +4 -0
  223. package/src/core/index.shared.ts +1 -0
  224. package/src/core/index.ts +2 -0
  225. package/src/core/primitives/$hook.ts +6 -2
  226. package/src/core/primitives/$module.spec.ts +4 -0
  227. package/src/core/providers/AlsProvider.ts +1 -1
  228. package/src/core/providers/CodecManager.spec.ts +12 -6
  229. package/src/core/providers/CodecManager.ts +26 -6
  230. package/src/core/providers/EventManager.ts +169 -13
  231. package/src/core/providers/KeylessJsonSchemaCodec.spec.ts +621 -0
  232. package/src/core/providers/KeylessJsonSchemaCodec.ts +407 -0
  233. package/src/core/providers/StateManager.spec.ts +27 -16
  234. package/src/email/providers/LocalEmailProvider.spec.ts +111 -87
  235. package/src/email/providers/LocalEmailProvider.ts +52 -15
  236. package/src/email/providers/NodemailerEmailProvider.ts +167 -56
  237. package/src/file/errors/FileError.ts +7 -0
  238. package/src/file/index.ts +9 -1
  239. package/src/file/providers/MemoryFileSystemProvider.ts +393 -0
  240. package/src/logger/index.ts +15 -3
  241. package/src/mcp/transports/StdioMcpTransport.ts +1 -1
  242. package/src/orm/index.browser.ts +1 -19
  243. package/src/orm/index.bun.ts +77 -0
  244. package/src/orm/index.shared-server.ts +22 -0
  245. package/src/orm/index.shared.ts +15 -0
  246. package/src/orm/index.ts +13 -39
  247. package/src/orm/providers/drivers/BunPostgresProvider.ts +3 -5
  248. package/src/orm/providers/drivers/BunSqliteProvider.ts +1 -1
  249. package/src/orm/providers/drivers/CloudflareD1Provider.ts +4 -0
  250. package/src/orm/providers/drivers/DatabaseProvider.ts +4 -0
  251. package/src/orm/providers/drivers/PglitePostgresProvider.ts +4 -0
  252. package/src/orm/services/Repository.ts +8 -0
  253. package/src/queue/core/providers/WorkerProvider.spec.ts +48 -32
  254. package/src/redis/index.bun.ts +35 -0
  255. package/src/redis/providers/BunRedisProvider.ts +12 -43
  256. package/src/redis/providers/BunRedisSubscriberProvider.ts +2 -3
  257. package/src/redis/providers/NodeRedisProvider.ts +16 -34
  258. package/src/{server/security → security}/__tests__/BasicAuth.spec.ts +11 -11
  259. package/src/{server/security → security}/__tests__/ServerSecurityProvider-realm.spec.ts +21 -16
  260. package/src/{server/security/providers → security/__tests__}/ServerSecurityProvider.spec.ts +5 -5
  261. package/src/security/index.browser.ts +5 -0
  262. package/src/security/index.ts +90 -7
  263. package/src/security/primitives/{$realm.spec.ts → $issuer.spec.ts} +11 -11
  264. package/src/security/primitives/{$realm.ts → $issuer.ts} +20 -17
  265. package/src/security/primitives/$role.ts +5 -5
  266. package/src/security/primitives/$serviceAccount.spec.ts +5 -5
  267. package/src/security/primitives/$serviceAccount.ts +3 -3
  268. package/src/{server/security → security}/providers/ServerSecurityProvider.ts +5 -7
  269. package/src/server/auth/primitives/$auth.ts +10 -10
  270. package/src/server/auth/primitives/$authCredentials.ts +3 -3
  271. package/src/server/auth/primitives/$authGithub.ts +3 -3
  272. package/src/server/auth/primitives/$authGoogle.ts +3 -3
  273. package/src/server/auth/providers/ServerAuthProvider.ts +13 -13
  274. package/src/server/cache/providers/ServerCacheProvider.spec.ts +183 -0
  275. package/src/server/cache/providers/ServerCacheProvider.ts +95 -10
  276. package/src/server/compress/providers/ServerCompressProvider.ts +61 -2
  277. package/src/server/cookies/providers/ServerCookiesProvider.ts +3 -3
  278. package/src/server/core/helpers/ServerReply.ts +2 -2
  279. package/src/server/core/providers/NodeHttpServerProvider.ts +25 -6
  280. package/src/server/core/providers/ServerBodyParserProvider.ts +19 -23
  281. package/src/server/core/providers/ServerLoggerProvider.ts +23 -19
  282. package/src/server/core/providers/ServerProvider.ts +155 -22
  283. package/src/server/core/providers/ServerRouterProvider.ts +259 -115
  284. package/src/server/core/providers/ServerTimingProvider.ts +2 -2
  285. package/src/server/links/index.ts +1 -1
  286. package/src/server/links/providers/LinkProvider.ts +1 -1
  287. package/src/server/static/providers/ServerStaticProvider.ts +10 -0
  288. package/src/server/swagger/index.ts +1 -1
  289. package/src/server/swagger/providers/ServerSwaggerProvider.ts +5 -8
  290. package/src/sms/providers/LocalSmsProvider.spec.ts +153 -111
  291. package/src/sms/providers/LocalSmsProvider.ts +8 -7
  292. package/src/vite/helpers/boot.ts +28 -17
  293. package/src/vite/helpers/importViteReact.ts +13 -0
  294. package/src/vite/index.ts +1 -21
  295. package/src/vite/plugins/viteAlephaDev.ts +16 -1
  296. package/src/vite/plugins/viteAlephaSsrPreload.ts +222 -0
  297. package/src/vite/tasks/buildClient.ts +11 -0
  298. package/src/vite/tasks/buildServer.ts +59 -4
  299. package/src/vite/tasks/devServer.ts +71 -0
  300. package/src/vite/tasks/generateCloudflare.ts +7 -0
  301. package/src/vite/tasks/index.ts +2 -1
  302. package/dist/server/security/index.browser.js +0 -13
  303. package/dist/server/security/index.browser.js.map +0 -1
  304. package/dist/server/security/index.d.ts +0 -173
  305. package/dist/server/security/index.d.ts.map +0 -1
  306. package/dist/server/security/index.js +0 -311
  307. package/dist/server/security/index.js.map +0 -1
  308. package/src/cli/assets/appRouterTs.ts +0 -9
  309. package/src/cli/assets/mainTs.ts +0 -13
  310. package/src/cli/assets/viteConfigTs.ts +0 -14
  311. package/src/cli/commands/run.ts +0 -24
  312. package/src/server/security/index.browser.ts +0 -10
  313. package/src/server/security/index.ts +0 -94
  314. package/src/vite/plugins/viteAlepha.ts +0 -37
  315. package/src/vite/plugins/viteAlephaBuild.ts +0 -281
  316. /package/src/{server/security → security}/primitives/$basicAuth.ts +0 -0
  317. /package/src/{server/security → security}/providers/ServerBasicAuthProvider.ts +0 -0
package/src/orm/index.ts CHANGED
@@ -1,8 +1,6 @@
1
1
  import { $module, type Alepha, t } from "alepha";
2
2
  import { AlephaDateTime } from "alepha/datetime";
3
- import * as drizzle from "drizzle-orm";
4
3
  import { $entity } from "./primitives/$entity.ts";
5
- import { $repository } from "./primitives/$repository.ts";
6
4
  import { $sequence } from "./primitives/$sequence.ts";
7
5
  import { DrizzleKitProvider } from "./providers/DrizzleKitProvider.ts";
8
6
  import { BunPostgresProvider } from "./providers/drivers/BunPostgresProvider.ts";
@@ -90,50 +88,21 @@ declare module "alepha" {
90
88
 
91
89
  // ---------------------------------------------------------------------------------------------------------------------
92
90
 
93
- export { drizzle };
94
- export {
95
- type Page,
96
- type PageQuery,
97
- pageQuerySchema,
98
- pageSchema,
99
- } from "alepha";
100
- export { sql } from "drizzle-orm";
101
- export * from "drizzle-orm/pg-core";
102
- export * from "./constants/PG_SYMBOLS.ts";
103
- export * from "./errors/DbConflictError.ts";
104
- export * from "./errors/DbEntityNotFoundError.ts";
105
- export * from "./errors/DbError.ts";
106
- export * from "./errors/DbMigrationError.ts";
107
- export * from "./errors/DbVersionMismatchError.ts";
108
- export * from "./helpers/parseQueryString.ts";
109
- export * from "./helpers/pgAttr.ts";
110
- export * from "./interfaces/FilterOperators.ts";
111
- export * from "./interfaces/PgQuery.ts";
112
- export * from "./interfaces/PgQueryWhere.ts";
113
- export * from "./primitives/$entity.ts";
114
- export * from "./primitives/$repository.ts";
115
- export * from "./primitives/$sequence.ts";
116
- export * from "./primitives/$transaction.ts";
117
- export * from "./providers/DatabaseTypeProvider.ts";
118
- export * from "./providers/DrizzleKitProvider.ts";
91
+ export * from "./index.shared-server.ts";
119
92
  export * from "./providers/drivers/BunPostgresProvider.ts";
120
93
  export * from "./providers/drivers/BunSqliteProvider.ts";
121
- export * from "./providers/drivers/CloudflareD1Provider.ts";
122
- export * from "./providers/drivers/DatabaseProvider.ts";
123
94
  export * from "./providers/drivers/NodePostgresProvider.ts";
124
95
  export * from "./providers/drivers/NodeSqliteProvider.ts";
125
- export * from "./providers/RepositoryProvider.ts";
126
- export * from "./schemas/insertSchema.ts";
127
- export * from "./schemas/legacyIdSchema.ts";
128
- export * from "./schemas/updateSchema.ts";
129
- export * from "./services/Repository.ts";
130
- export * from "./types/schema.ts";
131
96
 
132
97
  // ---------------------------------------------------------------------------------------------------------------------
133
98
 
134
99
  /**
135
100
  * Postgres client based on Drizzle ORM, Alepha type-safe friendly.
136
101
  *
102
+ * Automatically selects the appropriate provider based on runtime:
103
+ * - Bun: Uses `BunPostgresProvider` or `BunSqliteProvider`
104
+ * - Node.js: Uses `NodePostgresProvider` or `NodeSqliteProvider`
105
+ *
137
106
  * ```ts
138
107
  * import { t } from "alepha";
139
108
  * import { $entity, $repository, db } from "alepha/postgres";
@@ -172,6 +141,10 @@ export * from "./types/schema.ts";
172
141
  * @see {@link $sequence}
173
142
  * @see {@link $repository}
174
143
  * @see {@link $transaction}
144
+ * @see {@link NodePostgresProvider} - Node.js Postgres implementation
145
+ * @see {@link NodeSqliteProvider} - Node.js SQLite implementation
146
+ * @see {@link BunPostgresProvider} - Bun Postgres implementation
147
+ * @see {@link BunSqliteProvider} - Bun SQLite implementation
175
148
  * @module alepha.postgres
176
149
  */
177
150
  export const AlephaPostgres = $module({
@@ -181,10 +154,10 @@ export const AlephaPostgres = $module({
181
154
  AlephaDateTime,
182
155
  DatabaseProvider,
183
156
  NodePostgresProvider,
184
- PglitePostgresProvider,
185
157
  NodeSqliteProvider,
186
158
  BunPostgresProvider,
187
159
  BunSqliteProvider,
160
+ PglitePostgresProvider,
188
161
  CloudflareD1Provider,
189
162
  SqliteModelBuilder,
190
163
  PostgresModelBuilder,
@@ -210,6 +183,7 @@ export const AlephaPostgres = $module({
210
183
  const isSqlite = url?.startsWith("sqlite:");
211
184
  const isMemory = url?.includes(":memory:");
212
185
  const isFile = !!url && !isPostgres && !isMemory;
186
+ const isBun = alepha.isBun();
213
187
 
214
188
  if (url?.startsWith("cloudflare-d1:")) {
215
189
  alepha.with({
@@ -233,7 +207,7 @@ export const AlephaPostgres = $module({
233
207
  alepha.with({
234
208
  optional: true,
235
209
  provide: DatabaseProvider,
236
- use: alepha.isBun() ? BunPostgresProvider : NodePostgresProvider,
210
+ use: isBun ? BunPostgresProvider : NodePostgresProvider,
237
211
  });
238
212
  return;
239
213
  }
@@ -241,7 +215,7 @@ export const AlephaPostgres = $module({
241
215
  alepha.with({
242
216
  optional: true,
243
217
  provide: DatabaseProvider,
244
- use: alepha.isBun() ? BunSqliteProvider : NodeSqliteProvider,
218
+ use: isBun ? BunSqliteProvider : NodeSqliteProvider,
245
219
  });
246
220
  },
247
221
  });
@@ -1,7 +1,6 @@
1
1
  import { $env, $hook, $inject, AlephaError, type Static, t } from "alepha";
2
2
  import { $lock } from "alepha/lock";
3
3
  import { $logger } from "alepha/logger";
4
- import type { SQL as BunSQL } from "bun";
5
4
  import { sql } from "drizzle-orm";
6
5
  import type { BunSQLDatabase } from "drizzle-orm/bun-sql";
7
6
  import type { PgDatabase } from "drizzle-orm/pg-core";
@@ -55,13 +54,13 @@ export class BunPostgresProvider extends DatabaseProvider {
55
54
  protected readonly kit = $inject(DrizzleKitProvider);
56
55
  protected readonly builder = $inject(PostgresModelBuilder);
57
56
 
58
- protected client?: BunSQL;
57
+ protected client?: Bun.SQL;
59
58
  protected bunDb?: BunSQLDatabase;
60
59
 
61
60
  public readonly dialect = "postgresql";
62
61
 
63
62
  public get name() {
64
- return "bun-postgres";
63
+ return "postgres";
65
64
  }
66
65
 
67
66
  /**
@@ -184,10 +183,9 @@ export class BunPostgresProvider extends DatabaseProvider {
184
183
  }
185
184
 
186
185
  const { drizzle } = await import("drizzle-orm/bun-sql");
187
- const { SQL } = await import("bun");
188
186
 
189
187
  // Create Bun SQL client
190
- this.client = new SQL(this.url);
188
+ this.client = new Bun.SQL(this.url);
191
189
 
192
190
  // Test connection
193
191
  await this.client.unsafe("SELECT 1");
@@ -84,7 +84,7 @@ export class BunSqliteProvider extends DatabaseProvider {
84
84
  protected bunDb?: BunSQLiteDatabase;
85
85
 
86
86
  public get name() {
87
- return "bun-sqlite";
87
+ return "sqlite";
88
88
  }
89
89
 
90
90
  public override readonly dialect = "sqlite";
@@ -73,6 +73,10 @@ export class CloudflareD1Provider extends DatabaseProvider {
73
73
  protected drizzleDb?: DrizzleD1Database;
74
74
 
75
75
  public get name() {
76
+ return "sqlite";
77
+ }
78
+
79
+ public get driver() {
76
80
  return "d1";
77
81
  }
78
82
 
@@ -41,6 +41,10 @@ export abstract class DatabaseProvider {
41
41
  return "default";
42
42
  }
43
43
 
44
+ public get driver(): string {
45
+ return this.dialect;
46
+ }
47
+
44
48
  public get schema() {
45
49
  return "public";
46
50
  }
@@ -43,6 +43,10 @@ export class PglitePostgresProvider extends DatabaseProvider {
43
43
  protected pglite?: PgliteDatabase;
44
44
 
45
45
  public get name() {
46
+ return "postgres";
47
+ }
48
+
49
+ public get driver() {
46
50
  return "pglite";
47
51
  }
48
52
 
@@ -11,6 +11,7 @@ import {
11
11
  t,
12
12
  } from "alepha";
13
13
  import { type DateTime, DateTimeProvider } from "alepha/datetime";
14
+ import { $logger } from "alepha/logger";
14
15
  import { asc, desc, isSQLWrapper, type SQL } from "drizzle-orm";
15
16
  import type {
16
17
  LockConfig,
@@ -62,6 +63,7 @@ export abstract class Repository<T extends TObject> {
62
63
  public readonly entity: EntityPrimitive<T>;
63
64
  public readonly provider: DatabaseProvider;
64
65
 
66
+ protected readonly log = $logger();
65
67
  protected readonly relationManager = $inject(PgRelationManager);
66
68
  protected readonly queryManager = $inject(QueryManager);
67
69
  protected readonly dateTimeProvider = $inject(DateTimeProvider);
@@ -200,6 +202,12 @@ export abstract class Repository<T extends TObject> {
200
202
  ) => Promise<T>,
201
203
  config?: PgTransactionConfig,
202
204
  ): Promise<T> {
205
+ if (this.provider.driver === "pglite") {
206
+ this.log.warn("Transactions are not supported with pglite driver");
207
+ return await transaction(null as any);
208
+ }
209
+
210
+ this.log.debug(`Starting transaction on table ${this.tableName}`);
203
211
  return await this.db.transaction(transaction, config);
204
212
  }
205
213
 
@@ -1,4 +1,5 @@
1
1
  import { Alepha, t } from "alepha";
2
+ import { $logger } from "alepha/logger";
2
3
  import { describe, expect, test, vi } from "vitest";
3
4
  import {
4
5
  $consumer,
@@ -13,6 +14,16 @@ const payloadSchema = t.object({
13
14
  count: t.integer(),
14
15
  });
15
16
 
17
+ class TestWorkerProvider extends WorkerProvider {
18
+ public readonly log = $logger();
19
+ public workersRunning = 0;
20
+ public workerIntervals: Record<number, number> = {};
21
+ public abortController = new AbortController();
22
+ public waitForNextMessage(n: number): Promise<void> {
23
+ return super.waitForNextMessage(n);
24
+ }
25
+ }
26
+
16
27
  describe("WorkerProvider", () => {
17
28
  const createTestApp = async (
18
29
  options: {
@@ -29,6 +40,11 @@ describe("WorkerProvider", () => {
29
40
  },
30
41
  });
31
42
 
43
+ app.with({
44
+ provide: WorkerProvider,
45
+ use: TestWorkerProvider,
46
+ });
47
+
32
48
  app.with({
33
49
  provide: QueueProvider,
34
50
  use: MemoryQueueProvider,
@@ -52,16 +68,16 @@ describe("WorkerProvider", () => {
52
68
  const app = await createTestApp();
53
69
  app.with(TestService);
54
70
 
55
- const workerProvider = app.inject(WorkerProvider);
56
- const logSpy = vi.spyOn(workerProvider["log"], "debug");
71
+ const workerProvider = app.inject(TestWorkerProvider);
72
+ const logSpy = vi.spyOn(workerProvider.log, "debug");
57
73
 
58
74
  await app.start();
59
75
 
60
76
  expect(logSpy).toHaveBeenCalledWith("Starting worker n-0");
61
- expect(workerProvider["workersRunning"]).toBe(1);
77
+ expect(workerProvider.workersRunning).toBe(1);
62
78
 
63
79
  await app.stop();
64
- expect(workerProvider["workersRunning"]).toBe(0);
80
+ expect(workerProvider.workersRunning).toBe(0);
65
81
  });
66
82
 
67
83
  test("should start multiple workers with concurrency", async () => {
@@ -76,32 +92,32 @@ describe("WorkerProvider", () => {
76
92
  const app = await createTestApp({ workerConcurrency: 3 });
77
93
  app.with(TestService);
78
94
 
79
- const workerProvider = app.inject(WorkerProvider);
80
- const logSpy = vi.spyOn(workerProvider["log"], "debug");
95
+ const workerProvider = app.inject(TestWorkerProvider);
96
+ const logSpy = vi.spyOn(workerProvider.log, "debug");
81
97
 
82
98
  await app.start();
83
99
 
84
100
  expect(logSpy).toHaveBeenCalledWith("Starting worker n-0");
85
101
  expect(logSpy).toHaveBeenCalledWith("Starting worker n-1");
86
102
  expect(logSpy).toHaveBeenCalledWith("Starting worker n-2");
87
- expect(workerProvider["workersRunning"]).toBe(3);
103
+ expect(workerProvider.workersRunning).toBe(3);
88
104
 
89
105
  await app.stop();
90
- expect(workerProvider["workersRunning"]).toBe(0);
106
+ expect(workerProvider.workersRunning).toBe(0);
91
107
  });
92
108
 
93
109
  test("should not start workers when no consumers", async () => {
94
110
  const app = await createTestApp();
95
111
 
96
- const workerProvider = app.inject(WorkerProvider);
97
- const logSpy = vi.spyOn(workerProvider["log"], "debug");
112
+ const workerProvider = app.inject(TestWorkerProvider);
113
+ const logSpy = vi.spyOn(workerProvider.log, "debug");
98
114
 
99
115
  await app.start();
100
116
 
101
117
  expect(logSpy).not.toHaveBeenCalledWith(
102
118
  expect.stringMatching(/Starting worker/),
103
119
  );
104
- expect(workerProvider["workersRunning"]).toBe(0);
120
+ expect(workerProvider.workersRunning).toBe(0);
105
121
 
106
122
  await app.stop();
107
123
  });
@@ -120,20 +136,20 @@ describe("WorkerProvider", () => {
120
136
  const app = await createTestApp({ workerConcurrency: 2 });
121
137
  app.with(TestService);
122
138
 
123
- const workerProvider = app.inject(WorkerProvider);
124
- const debugSpy = vi.spyOn(workerProvider["log"], "debug");
139
+ const workerProvider = app.inject(TestWorkerProvider);
140
+ const debugSpy = vi.spyOn(workerProvider.log, "debug");
125
141
 
126
142
  await app.start();
127
- expect(workerProvider["workersRunning"]).toBe(2);
143
+ expect(workerProvider.workersRunning).toBe(2);
128
144
 
129
145
  // Simulate worker crash by manually decrementing counter
130
- workerProvider["workersRunning"] = 1;
146
+ workerProvider.workersRunning = 1;
131
147
 
132
148
  // Call wakeUp - should detect missing worker and restart it
133
149
  workerProvider.wakeUp();
134
150
 
135
151
  expect(debugSpy).toHaveBeenCalledWith("Waking up workers...");
136
- expect(workerProvider["workersRunning"]).toBe(2);
152
+ expect(workerProvider.workersRunning).toBe(2);
137
153
 
138
154
  await app.stop();
139
155
  });
@@ -150,16 +166,16 @@ describe("WorkerProvider", () => {
150
166
  const app = await createTestApp();
151
167
  app.with(TestService);
152
168
 
153
- const workerProvider = app.inject(WorkerProvider);
169
+ const workerProvider = app.inject(TestWorkerProvider);
154
170
 
155
171
  await app.start();
156
172
 
157
- const oldController = workerProvider["abortController"];
173
+ const oldController = workerProvider.abortController;
158
174
  expect(oldController.signal.aborted).toBe(false);
159
175
 
160
176
  workerProvider.wakeUp();
161
177
 
162
- const newController = workerProvider["abortController"];
178
+ const newController = workerProvider.abortController;
163
179
  expect(oldController.signal.aborted).toBe(true);
164
180
  expect(newController.signal.aborted).toBe(false);
165
181
  expect(newController).not.toBe(oldController);
@@ -217,8 +233,8 @@ describe("WorkerProvider", () => {
217
233
  const app = await createTestApp();
218
234
  app.with(TestService);
219
235
 
220
- const workerProvider = app.inject(WorkerProvider);
221
- const errorSpy = vi.spyOn(workerProvider["log"], "error");
236
+ const workerProvider = app.inject(TestWorkerProvider);
237
+ const errorSpy = vi.spyOn(workerProvider.log, "error");
222
238
 
223
239
  await app.start();
224
240
 
@@ -230,7 +246,7 @@ describe("WorkerProvider", () => {
230
246
  .toBeTruthy();
231
247
 
232
248
  // Worker should still be running after processing error
233
- expect(workerProvider["workersRunning"]).toBe(1);
249
+ expect(workerProvider.workersRunning).toBe(1);
234
250
 
235
251
  await app.stop();
236
252
  });
@@ -282,9 +298,9 @@ describe("WorkerProvider", () => {
282
298
  const app = await createTestApp();
283
299
  app.with(TestService);
284
300
 
285
- const workerProvider = app.inject(WorkerProvider);
301
+ const workerProvider = app.inject(TestWorkerProvider);
286
302
  const queueProvider = app.inject(QueueProvider);
287
- const errorSpy = vi.spyOn(workerProvider["log"], "error");
303
+ const errorSpy = vi.spyOn(workerProvider.log, "error");
288
304
 
289
305
  await app.start();
290
306
 
@@ -301,7 +317,7 @@ describe("WorkerProvider", () => {
301
317
  );
302
318
 
303
319
  // Worker should still be running
304
- expect(workerProvider["workersRunning"]).toBe(1);
320
+ expect(workerProvider.workersRunning).toBe(1);
305
321
 
306
322
  await app.stop();
307
323
  });
@@ -318,9 +334,9 @@ describe("WorkerProvider", () => {
318
334
  const app = await createTestApp();
319
335
  app.with(TestService);
320
336
 
321
- const workerProvider = app.inject(WorkerProvider);
337
+ const workerProvider = app.inject(TestWorkerProvider);
322
338
  const queueProvider = app.inject(QueueProvider);
323
- const errorSpy = vi.spyOn(workerProvider["log"], "error");
339
+ const errorSpy = vi.spyOn(workerProvider.log, "error");
324
340
 
325
341
  await app.start();
326
342
 
@@ -342,7 +358,7 @@ describe("WorkerProvider", () => {
342
358
  );
343
359
 
344
360
  // Worker should still be running
345
- expect(workerProvider["workersRunning"]).toBe(1);
361
+ expect(workerProvider.workersRunning).toBe(1);
346
362
 
347
363
  await app.stop();
348
364
  });
@@ -359,16 +375,16 @@ describe("WorkerProvider", () => {
359
375
  const app = await createTestApp({ workerInterval: 5000 });
360
376
  app.with(TestService);
361
377
 
362
- const workerProvider = app.inject(WorkerProvider);
363
- const warnSpy = vi.spyOn(workerProvider["log"], "warn");
378
+ const workerProvider = app.inject(TestWorkerProvider);
379
+ const warnSpy = vi.spyOn(workerProvider.log, "warn");
364
380
 
365
381
  await app.start();
366
382
 
367
383
  // Abort the controller to simulate abort during wait
368
- workerProvider["abortController"].abort();
384
+ workerProvider.abortController.abort();
369
385
 
370
386
  // This should detect the abort and return early
371
- await workerProvider["waitForNextMessage"](0);
387
+ await workerProvider.waitForNextMessage(0);
372
388
 
373
389
  expect(warnSpy).toHaveBeenCalledWith("Worker n-0 aborted.");
374
390
 
@@ -0,0 +1,35 @@
1
+ import { $module, type Alepha } from "alepha";
2
+ import { BunRedisProvider } from "./providers/BunRedisProvider.ts";
3
+ import { BunRedisSubscriberProvider } from "./providers/BunRedisSubscriberProvider.ts";
4
+ import { RedisProvider } from "./providers/RedisProvider.ts";
5
+ import { RedisSubscriberProvider } from "./providers/RedisSubscriberProvider.ts";
6
+
7
+ // ---------------------------------------------------------------------------------------------------------------------
8
+
9
+ export * from "./providers/BunRedisProvider.ts";
10
+ export * from "./providers/BunRedisSubscriberProvider.ts";
11
+ export * from "./providers/RedisProvider.ts";
12
+ export * from "./providers/RedisSubscriberProvider.ts";
13
+
14
+ // ---------------------------------------------------------------------------------------------------------------------
15
+
16
+ export const AlephaRedis = $module({
17
+ name: "alepha.redis",
18
+ services: [
19
+ BunRedisProvider,
20
+ BunRedisSubscriberProvider,
21
+ RedisProvider,
22
+ RedisSubscriberProvider,
23
+ ],
24
+ register: (alepha: Alepha) => {
25
+ alepha
26
+ .with({
27
+ provide: RedisProvider,
28
+ use: BunRedisProvider,
29
+ })
30
+ .with({
31
+ provide: RedisSubscriberProvider,
32
+ use: BunRedisSubscriberProvider,
33
+ });
34
+ },
35
+ });
@@ -8,18 +8,13 @@ import {
8
8
  t,
9
9
  } from "alepha";
10
10
  import { $logger } from "alepha/logger";
11
- import type { RedisClient as BunRedisClient } from "bun";
12
11
  import { RedisProvider, type RedisSetOptions } from "./RedisProvider.ts";
13
12
 
14
13
  const envSchema = t.object({
15
- REDIS_URL: t.optional(t.text()),
16
- REDIS_PORT: t.integer({
17
- default: "6379",
14
+ REDIS_URL: t.text({
15
+ default: "redis://localhost:6379",
16
+ description: "Redis connection URL",
18
17
  }),
19
- REDIS_HOST: t.text({
20
- default: "localhost",
21
- }),
22
- REDIS_PASSWORD: t.optional(t.text()),
23
18
  });
24
19
 
25
20
  declare module "alepha" {
@@ -34,10 +29,8 @@ declare module "alepha" {
34
29
  *
35
30
  * @example
36
31
  * ```ts
37
- * // Set REDIS_URL environment variable
38
- * // REDIS_URL=redis://localhost:6379
39
- *
40
- * // Or configure via REDIS_HOST, REDIS_PORT, REDIS_PASSWORD
32
+ * // Set REDIS_URL environment variable (default: redis://localhost:6379)
33
+ * // REDIS_URL=redis://:password@myredis.example.com:6379
41
34
  *
42
35
  * // Or configure programmatically
43
36
  * alepha.with({
@@ -50,9 +43,9 @@ export class BunRedisProvider extends RedisProvider {
50
43
  protected readonly log = $logger();
51
44
  protected readonly alepha = $inject(Alepha);
52
45
  protected readonly env = $env(envSchema);
53
- protected client?: BunRedisClient;
46
+ protected client?: Bun.RedisClient;
54
47
 
55
- public get publisher(): BunRedisClient {
48
+ public get publisher(): Bun.RedisClient {
56
49
  if (!this.client?.connected) {
57
50
  throw new AlephaError("Redis client is not ready");
58
51
  }
@@ -79,7 +72,7 @@ export class BunRedisProvider extends RedisProvider {
79
72
  */
80
73
  public override async connect(): Promise<void> {
81
74
  // Check if we're running in Bun
82
- if (typeof Bun === "undefined") {
75
+ if (!this.alepha.isBun()) {
83
76
  throw new AlephaError(
84
77
  "BunRedisProvider requires the Bun runtime. Use NodeRedisProvider for Node.js.",
85
78
  );
@@ -87,9 +80,7 @@ export class BunRedisProvider extends RedisProvider {
87
80
 
88
81
  this.log.debug("Connecting...");
89
82
 
90
- const { RedisClient } = await import("bun");
91
-
92
- this.client = new RedisClient(this.getUrl(), {
83
+ this.client = new Bun.RedisClient(this.getUrl(), {
93
84
  autoReconnect: true,
94
85
  enableAutoPipelining: true,
95
86
  });
@@ -124,14 +115,12 @@ export class BunRedisProvider extends RedisProvider {
124
115
  /**
125
116
  * Create a duplicate connection for pub/sub or other isolated operations.
126
117
  */
127
- public async duplicate(): Promise<BunRedisClient> {
118
+ public async duplicate(): Promise<Bun.RedisClient> {
128
119
  if (typeof Bun === "undefined") {
129
120
  throw new AlephaError("BunRedisProvider requires the Bun runtime.");
130
121
  }
131
122
 
132
- const { RedisClient } = await import("bun");
133
-
134
- const client = new RedisClient(this.getUrl(), {
123
+ const client = new Bun.RedisClient(this.getUrl(), {
135
124
  autoReconnect: true,
136
125
  enableAutoPipelining: true,
137
126
  });
@@ -279,26 +268,6 @@ export class BunRedisProvider extends RedisProvider {
279
268
  * Get the Redis connection URL.
280
269
  */
281
270
  protected getUrl(): string {
282
- // Prefer REDIS_URL if set
283
- if (this.env.REDIS_URL) {
284
- return this.env.REDIS_URL;
285
- }
286
-
287
- // Build URL from components
288
- const url = new URL("redis://127.0.0.1:6379");
289
-
290
- if (this.env.REDIS_PASSWORD) {
291
- url.password = this.env.REDIS_PASSWORD;
292
- }
293
-
294
- if (this.env.REDIS_HOST) {
295
- url.hostname = this.env.REDIS_HOST;
296
- }
297
-
298
- if (this.env.REDIS_PORT) {
299
- url.port = String(this.env.REDIS_PORT);
300
- }
301
-
302
- return url.toString();
271
+ return this.env.REDIS_URL;
303
272
  }
304
273
  }
@@ -1,6 +1,5 @@
1
1
  import { $hook, $inject, Alepha, AlephaError } from "alepha";
2
2
  import { $logger } from "alepha/logger";
3
- import type { RedisClient as BunRedisClient } from "bun";
4
3
  import { BunRedisProvider } from "./BunRedisProvider.ts";
5
4
  import {
6
5
  RedisSubscriberProvider,
@@ -25,9 +24,9 @@ export class BunRedisSubscriberProvider extends RedisSubscriberProvider {
25
24
  protected readonly log = $logger();
26
25
  protected readonly alepha = $inject(Alepha);
27
26
  protected readonly redisProvider = $inject(BunRedisProvider);
28
- protected client?: BunRedisClient;
27
+ protected client?: Bun.RedisClient;
29
28
 
30
- public get subscriber(): BunRedisClient {
29
+ public get subscriber(): Bun.RedisClient {
31
30
  if (!this.client?.connected) {
32
31
  throw new AlephaError("Redis subscriber client is not ready");
33
32
  }