alepha 0.14.4 → 0.15.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (322) hide show
  1. package/README.md +44 -102
  2. package/dist/api/audits/index.d.ts +331 -443
  3. package/dist/api/audits/index.d.ts.map +1 -1
  4. package/dist/api/audits/index.js +2 -2
  5. package/dist/api/audits/index.js.map +1 -1
  6. package/dist/api/files/index.d.ts +0 -113
  7. package/dist/api/files/index.d.ts.map +1 -1
  8. package/dist/api/files/index.js +2 -3
  9. package/dist/api/files/index.js.map +1 -1
  10. package/dist/api/jobs/index.d.ts +151 -262
  11. package/dist/api/jobs/index.d.ts.map +1 -1
  12. package/dist/api/notifications/index.browser.js +4 -4
  13. package/dist/api/notifications/index.browser.js.map +1 -1
  14. package/dist/api/notifications/index.d.ts +164 -276
  15. package/dist/api/notifications/index.d.ts.map +1 -1
  16. package/dist/api/notifications/index.js +4 -4
  17. package/dist/api/notifications/index.js.map +1 -1
  18. package/dist/api/parameters/index.d.ts +265 -377
  19. package/dist/api/parameters/index.d.ts.map +1 -1
  20. package/dist/api/users/index.browser.js +1 -2
  21. package/dist/api/users/index.browser.js.map +1 -1
  22. package/dist/api/users/index.d.ts +195 -301
  23. package/dist/api/users/index.d.ts.map +1 -1
  24. package/dist/api/users/index.js +203 -184
  25. package/dist/api/users/index.js.map +1 -1
  26. package/dist/api/verifications/index.d.ts.map +1 -1
  27. package/dist/batch/index.d.ts.map +1 -1
  28. package/dist/batch/index.js +1 -2
  29. package/dist/batch/index.js.map +1 -1
  30. package/dist/bucket/index.d.ts.map +1 -1
  31. package/dist/cache/core/index.d.ts.map +1 -1
  32. package/dist/cache/redis/index.d.ts.map +1 -1
  33. package/dist/cache/redis/index.js +2 -2
  34. package/dist/cache/redis/index.js.map +1 -1
  35. package/dist/cli/index.d.ts +5900 -165
  36. package/dist/cli/index.d.ts.map +1 -1
  37. package/dist/cli/index.js +1481 -639
  38. package/dist/cli/index.js.map +1 -1
  39. package/dist/command/index.d.ts +8 -4
  40. package/dist/command/index.d.ts.map +1 -1
  41. package/dist/command/index.js +29 -25
  42. package/dist/command/index.js.map +1 -1
  43. package/dist/core/index.browser.js +563 -54
  44. package/dist/core/index.browser.js.map +1 -1
  45. package/dist/core/index.d.ts +175 -8
  46. package/dist/core/index.d.ts.map +1 -1
  47. package/dist/core/index.js +564 -54
  48. package/dist/core/index.js.map +1 -1
  49. package/dist/core/index.native.js +563 -54
  50. package/dist/core/index.native.js.map +1 -1
  51. package/dist/datetime/index.d.ts.map +1 -1
  52. package/dist/datetime/index.js +4 -4
  53. package/dist/datetime/index.js.map +1 -1
  54. package/dist/email/index.d.ts +89 -42
  55. package/dist/email/index.d.ts.map +1 -1
  56. package/dist/email/index.js +129 -33
  57. package/dist/email/index.js.map +1 -1
  58. package/dist/fake/index.d.ts +7969 -2
  59. package/dist/fake/index.d.ts.map +1 -1
  60. package/dist/fake/index.js +22 -22
  61. package/dist/fake/index.js.map +1 -1
  62. package/dist/file/index.d.ts +134 -1
  63. package/dist/file/index.d.ts.map +1 -1
  64. package/dist/file/index.js +253 -1
  65. package/dist/file/index.js.map +1 -1
  66. package/dist/lock/core/index.d.ts.map +1 -1
  67. package/dist/lock/redis/index.d.ts.map +1 -1
  68. package/dist/logger/index.d.ts +1 -2
  69. package/dist/logger/index.d.ts.map +1 -1
  70. package/dist/logger/index.js +1 -5
  71. package/dist/logger/index.js.map +1 -1
  72. package/dist/mcp/index.d.ts +19 -1
  73. package/dist/mcp/index.d.ts.map +1 -1
  74. package/dist/mcp/index.js +28 -4
  75. package/dist/mcp/index.js.map +1 -1
  76. package/dist/orm/chunk-DH6iiROE.js +38 -0
  77. package/dist/orm/index.browser.js +9 -9
  78. package/dist/orm/index.browser.js.map +1 -1
  79. package/dist/orm/index.bun.js +2821 -0
  80. package/dist/orm/index.bun.js.map +1 -0
  81. package/dist/orm/index.d.ts +318 -169
  82. package/dist/orm/index.d.ts.map +1 -1
  83. package/dist/orm/index.js +2086 -1776
  84. package/dist/orm/index.js.map +1 -1
  85. package/dist/queue/core/index.d.ts +4 -4
  86. package/dist/queue/core/index.d.ts.map +1 -1
  87. package/dist/queue/redis/index.d.ts.map +1 -1
  88. package/dist/redis/index.bun.js +285 -0
  89. package/dist/redis/index.bun.js.map +1 -0
  90. package/dist/redis/index.d.ts +13 -31
  91. package/dist/redis/index.d.ts.map +1 -1
  92. package/dist/redis/index.js +18 -38
  93. package/dist/redis/index.js.map +1 -1
  94. package/dist/retry/index.d.ts.map +1 -1
  95. package/dist/router/index.d.ts.map +1 -1
  96. package/dist/scheduler/index.d.ts +83 -1
  97. package/dist/scheduler/index.d.ts.map +1 -1
  98. package/dist/scheduler/index.js +393 -1
  99. package/dist/scheduler/index.js.map +1 -1
  100. package/dist/security/index.browser.js +5 -1
  101. package/dist/security/index.browser.js.map +1 -1
  102. package/dist/security/index.d.ts +598 -112
  103. package/dist/security/index.d.ts.map +1 -1
  104. package/dist/security/index.js +1808 -97
  105. package/dist/security/index.js.map +1 -1
  106. package/dist/server/auth/index.d.ts +1200 -175
  107. package/dist/server/auth/index.d.ts.map +1 -1
  108. package/dist/server/auth/index.js +1268 -37
  109. package/dist/server/auth/index.js.map +1 -1
  110. package/dist/server/cache/index.d.ts +6 -3
  111. package/dist/server/cache/index.d.ts.map +1 -1
  112. package/dist/server/cache/index.js +1 -1
  113. package/dist/server/cache/index.js.map +1 -1
  114. package/dist/server/compress/index.d.ts.map +1 -1
  115. package/dist/server/cookies/index.d.ts.map +1 -1
  116. package/dist/server/cookies/index.js +3 -3
  117. package/dist/server/cookies/index.js.map +1 -1
  118. package/dist/server/core/index.d.ts +115 -13
  119. package/dist/server/core/index.d.ts.map +1 -1
  120. package/dist/server/core/index.js +321 -139
  121. package/dist/server/core/index.js.map +1 -1
  122. package/dist/server/cors/index.d.ts +0 -1
  123. package/dist/server/cors/index.d.ts.map +1 -1
  124. package/dist/server/health/index.d.ts +0 -1
  125. package/dist/server/health/index.d.ts.map +1 -1
  126. package/dist/server/helmet/index.d.ts.map +1 -1
  127. package/dist/server/links/index.browser.js +9 -1
  128. package/dist/server/links/index.browser.js.map +1 -1
  129. package/dist/server/links/index.d.ts +1 -2
  130. package/dist/server/links/index.d.ts.map +1 -1
  131. package/dist/server/links/index.js +14 -7
  132. package/dist/server/links/index.js.map +1 -1
  133. package/dist/server/metrics/index.d.ts +514 -1
  134. package/dist/server/metrics/index.d.ts.map +1 -1
  135. package/dist/server/metrics/index.js +4462 -4
  136. package/dist/server/metrics/index.js.map +1 -1
  137. package/dist/server/multipart/index.d.ts.map +1 -1
  138. package/dist/server/proxy/index.d.ts +0 -1
  139. package/dist/server/proxy/index.d.ts.map +1 -1
  140. package/dist/server/rate-limit/index.d.ts.map +1 -1
  141. package/dist/server/static/index.d.ts.map +1 -1
  142. package/dist/server/swagger/index.d.ts +1 -2
  143. package/dist/server/swagger/index.d.ts.map +1 -1
  144. package/dist/server/swagger/index.js +1 -2
  145. package/dist/server/swagger/index.js.map +1 -1
  146. package/dist/sms/index.d.ts +3 -1
  147. package/dist/sms/index.d.ts.map +1 -1
  148. package/dist/sms/index.js +10 -10
  149. package/dist/sms/index.js.map +1 -1
  150. package/dist/thread/index.d.ts +0 -1
  151. package/dist/thread/index.d.ts.map +1 -1
  152. package/dist/thread/index.js +2 -2
  153. package/dist/thread/index.js.map +1 -1
  154. package/dist/topic/core/index.d.ts.map +1 -1
  155. package/dist/topic/redis/index.d.ts.map +1 -1
  156. package/dist/vite/index.d.ts +6315 -149
  157. package/dist/vite/index.d.ts.map +1 -1
  158. package/dist/vite/index.js +140 -469
  159. package/dist/vite/index.js.map +1 -1
  160. package/dist/websocket/index.browser.js +9 -9
  161. package/dist/websocket/index.browser.js.map +1 -1
  162. package/dist/websocket/index.d.ts +28 -28
  163. package/dist/websocket/index.d.ts.map +1 -1
  164. package/dist/websocket/index.js +9 -9
  165. package/dist/websocket/index.js.map +1 -1
  166. package/package.json +13 -18
  167. package/src/api/files/controllers/AdminFileStatsController.ts +0 -1
  168. package/src/api/users/atoms/realmAuthSettingsAtom.ts +5 -0
  169. package/src/api/users/controllers/{UserRealmController.ts → RealmController.ts} +11 -11
  170. package/src/api/users/entities/users.ts +1 -1
  171. package/src/api/users/index.ts +8 -8
  172. package/src/api/users/primitives/{$userRealm.ts → $realm.ts} +17 -19
  173. package/src/api/users/providers/{UserRealmProvider.ts → RealmProvider.ts} +26 -30
  174. package/src/api/users/schemas/{userRealmConfigSchema.ts → realmConfigSchema.ts} +2 -2
  175. package/src/api/users/services/CredentialService.ts +7 -7
  176. package/src/api/users/services/IdentityService.ts +4 -4
  177. package/src/api/users/services/RegistrationService.spec.ts +25 -27
  178. package/src/api/users/services/RegistrationService.ts +38 -27
  179. package/src/api/users/services/SessionCrudService.ts +3 -3
  180. package/src/api/users/services/SessionService.spec.ts +3 -3
  181. package/src/api/users/services/SessionService.ts +27 -18
  182. package/src/api/users/services/UserService.ts +7 -7
  183. package/src/batch/providers/BatchProvider.ts +1 -2
  184. package/src/cli/apps/AlephaCli.ts +2 -2
  185. package/src/cli/apps/AlephaPackageBuilderCli.ts +47 -20
  186. package/src/cli/assets/apiHelloControllerTs.ts +19 -0
  187. package/src/cli/assets/apiIndexTs.ts +16 -0
  188. package/src/cli/assets/biomeJson.ts +2 -1
  189. package/src/cli/assets/claudeMd.ts +308 -0
  190. package/src/cli/assets/dummySpecTs.ts +2 -1
  191. package/src/cli/assets/editorconfig.ts +2 -1
  192. package/src/cli/assets/mainBrowserTs.ts +4 -3
  193. package/src/cli/assets/mainCss.ts +24 -0
  194. package/src/cli/assets/mainServerTs.ts +24 -0
  195. package/src/cli/assets/tsconfigJson.ts +2 -1
  196. package/src/cli/assets/webAppRouterTs.ts +16 -0
  197. package/src/cli/assets/webHelloComponentTsx.ts +20 -0
  198. package/src/cli/assets/webIndexTs.ts +16 -0
  199. package/src/cli/atoms/appEntryOptions.ts +13 -0
  200. package/src/cli/atoms/buildOptions.ts +1 -1
  201. package/src/cli/atoms/changelogOptions.ts +1 -1
  202. package/src/cli/commands/build.ts +97 -61
  203. package/src/cli/commands/db.ts +21 -18
  204. package/src/cli/commands/deploy.ts +17 -5
  205. package/src/cli/commands/dev.ts +26 -47
  206. package/src/cli/commands/gen/env.ts +1 -1
  207. package/src/cli/commands/init.ts +79 -25
  208. package/src/cli/commands/lint.ts +9 -3
  209. package/src/cli/commands/test.ts +8 -2
  210. package/src/cli/commands/typecheck.ts +5 -1
  211. package/src/cli/commands/verify.ts +4 -2
  212. package/src/cli/defineConfig.ts +9 -0
  213. package/src/cli/index.ts +2 -1
  214. package/src/cli/providers/AppEntryProvider.ts +131 -0
  215. package/src/cli/providers/ViteBuildProvider.ts +82 -0
  216. package/src/cli/providers/ViteDevServerProvider.ts +350 -0
  217. package/src/cli/providers/ViteTemplateProvider.ts +27 -0
  218. package/src/cli/services/AlephaCliUtils.ts +72 -602
  219. package/src/cli/services/PackageManagerUtils.ts +308 -0
  220. package/src/cli/services/ProjectScaffolder.ts +329 -0
  221. package/src/command/helpers/Runner.ts +15 -3
  222. package/src/core/Alepha.ts +2 -8
  223. package/src/core/__tests__/Alepha-graph.spec.ts +4 -0
  224. package/src/core/index.shared.ts +1 -0
  225. package/src/core/index.ts +2 -0
  226. package/src/core/primitives/$hook.ts +6 -2
  227. package/src/core/primitives/$module.spec.ts +4 -0
  228. package/src/core/primitives/$module.ts +12 -0
  229. package/src/core/providers/AlsProvider.ts +1 -1
  230. package/src/core/providers/CodecManager.spec.ts +12 -6
  231. package/src/core/providers/CodecManager.ts +26 -6
  232. package/src/core/providers/EventManager.ts +169 -13
  233. package/src/core/providers/KeylessJsonSchemaCodec.spec.ts +878 -0
  234. package/src/core/providers/KeylessJsonSchemaCodec.ts +789 -0
  235. package/src/core/providers/SchemaValidator.spec.ts +236 -0
  236. package/src/core/providers/StateManager.spec.ts +27 -16
  237. package/src/email/providers/LocalEmailProvider.spec.ts +111 -87
  238. package/src/email/providers/LocalEmailProvider.ts +52 -15
  239. package/src/email/providers/NodemailerEmailProvider.ts +167 -56
  240. package/src/file/errors/FileError.ts +7 -0
  241. package/src/file/index.ts +9 -1
  242. package/src/file/providers/MemoryFileSystemProvider.ts +393 -0
  243. package/src/logger/providers/PrettyFormatterProvider.ts +0 -9
  244. package/src/mcp/errors/McpError.ts +30 -0
  245. package/src/mcp/index.ts +3 -0
  246. package/src/mcp/transports/SseMcpTransport.ts +16 -6
  247. package/src/orm/index.browser.ts +1 -19
  248. package/src/orm/index.bun.ts +77 -0
  249. package/src/orm/index.shared-server.ts +22 -0
  250. package/src/orm/index.shared.ts +15 -0
  251. package/src/orm/index.ts +19 -39
  252. package/src/orm/providers/DrizzleKitProvider.ts +3 -5
  253. package/src/orm/providers/drivers/BunPostgresProvider.ts +3 -5
  254. package/src/orm/providers/drivers/BunSqliteProvider.ts +1 -1
  255. package/src/orm/providers/drivers/CloudflareD1Provider.ts +4 -0
  256. package/src/orm/providers/drivers/DatabaseProvider.ts +4 -0
  257. package/src/orm/providers/drivers/PglitePostgresProvider.ts +4 -0
  258. package/src/orm/services/Repository.ts +19 -0
  259. package/src/redis/index.bun.ts +35 -0
  260. package/src/redis/providers/BunRedisProvider.ts +12 -43
  261. package/src/redis/providers/BunRedisSubscriberProvider.ts +2 -3
  262. package/src/redis/providers/NodeRedisProvider.ts +16 -34
  263. package/src/{server/security → security}/__tests__/BasicAuth.spec.ts +11 -11
  264. package/src/{server/security → security}/__tests__/ServerSecurityProvider-realm.spec.ts +21 -16
  265. package/src/{server/security/providers → security/__tests__}/ServerSecurityProvider.spec.ts +5 -5
  266. package/src/security/index.browser.ts +5 -0
  267. package/src/security/index.ts +90 -7
  268. package/src/security/primitives/{$realm.spec.ts → $issuer.spec.ts} +11 -11
  269. package/src/security/primitives/{$realm.ts → $issuer.ts} +20 -17
  270. package/src/security/primitives/$role.ts +5 -5
  271. package/src/security/primitives/$serviceAccount.spec.ts +5 -5
  272. package/src/security/primitives/$serviceAccount.ts +3 -3
  273. package/src/{server/security → security}/providers/ServerSecurityProvider.ts +5 -7
  274. package/src/server/auth/primitives/$auth.ts +10 -10
  275. package/src/server/auth/primitives/$authCredentials.ts +3 -3
  276. package/src/server/auth/primitives/$authGithub.ts +3 -3
  277. package/src/server/auth/primitives/$authGoogle.ts +3 -3
  278. package/src/server/auth/providers/ServerAuthProvider.ts +13 -13
  279. package/src/server/cache/providers/ServerCacheProvider.ts +1 -1
  280. package/src/server/cookies/providers/ServerCookiesProvider.ts +3 -3
  281. package/src/server/core/index.ts +1 -1
  282. package/src/server/core/providers/BunHttpServerProvider.ts +1 -1
  283. package/src/server/core/providers/NodeHttpServerProvider.spec.ts +125 -0
  284. package/src/server/core/providers/NodeHttpServerProvider.ts +92 -24
  285. package/src/server/core/providers/ServerBodyParserProvider.ts +19 -23
  286. package/src/server/core/providers/ServerLoggerProvider.ts +23 -19
  287. package/src/server/core/providers/ServerProvider.ts +144 -24
  288. package/src/server/core/providers/ServerRouterProvider.ts +259 -115
  289. package/src/server/core/providers/ServerTimingProvider.ts +2 -2
  290. package/src/server/links/atoms/apiLinksAtom.ts +7 -0
  291. package/src/server/links/index.browser.ts +2 -0
  292. package/src/server/links/index.ts +3 -1
  293. package/src/server/links/providers/LinkProvider.ts +1 -1
  294. package/src/server/swagger/index.ts +1 -1
  295. package/src/sms/providers/LocalSmsProvider.spec.ts +153 -111
  296. package/src/sms/providers/LocalSmsProvider.ts +8 -7
  297. package/src/vite/index.ts +3 -2
  298. package/src/vite/tasks/buildClient.ts +0 -1
  299. package/src/vite/tasks/buildServer.ts +80 -22
  300. package/src/vite/tasks/copyAssets.ts +5 -4
  301. package/src/vite/tasks/generateCloudflare.ts +7 -0
  302. package/src/vite/tasks/generateSitemap.ts +64 -23
  303. package/src/vite/tasks/index.ts +0 -2
  304. package/src/vite/tasks/prerenderPages.ts +49 -24
  305. package/dist/server/security/index.browser.js +0 -13
  306. package/dist/server/security/index.browser.js.map +0 -1
  307. package/dist/server/security/index.d.ts +0 -173
  308. package/dist/server/security/index.d.ts.map +0 -1
  309. package/dist/server/security/index.js +0 -311
  310. package/dist/server/security/index.js.map +0 -1
  311. package/src/cli/assets/appRouterTs.ts +0 -9
  312. package/src/cli/assets/indexHtml.ts +0 -15
  313. package/src/cli/assets/mainTs.ts +0 -13
  314. package/src/cli/commands/format.ts +0 -17
  315. package/src/server/security/index.browser.ts +0 -10
  316. package/src/server/security/index.ts +0 -94
  317. package/src/vite/helpers/boot.ts +0 -106
  318. package/src/vite/plugins/viteAlephaDev.ts +0 -177
  319. package/src/vite/tasks/devServer.ts +0 -69
  320. package/src/vite/tasks/runAlepha.ts +0 -270
  321. /package/src/{server/security → security}/primitives/$basicAuth.ts +0 -0
  322. /package/src/{server/security → security}/providers/ServerBasicAuthProvider.ts +0 -0
package/src/orm/index.ts CHANGED
@@ -1,10 +1,10 @@
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";
6
+ import { BunPostgresProvider } from "./providers/drivers/BunPostgresProvider.ts";
7
+ import { BunSqliteProvider } from "./providers/drivers/BunSqliteProvider.ts";
8
8
  import { CloudflareD1Provider } from "./providers/drivers/CloudflareD1Provider.ts";
9
9
  import { DatabaseProvider } from "./providers/drivers/DatabaseProvider.ts";
10
10
  import { NodePostgresProvider } from "./providers/drivers/NodePostgresProvider.ts";
@@ -88,48 +88,21 @@ declare module "alepha" {
88
88
 
89
89
  // ---------------------------------------------------------------------------------------------------------------------
90
90
 
91
- export { drizzle };
92
- export {
93
- type Page,
94
- type PageQuery,
95
- pageQuerySchema,
96
- pageSchema,
97
- } from "alepha";
98
- export { sql } from "drizzle-orm";
99
- export * from "drizzle-orm/pg-core";
100
- export * from "./constants/PG_SYMBOLS.ts";
101
- export * from "./errors/DbConflictError.ts";
102
- export * from "./errors/DbEntityNotFoundError.ts";
103
- export * from "./errors/DbError.ts";
104
- export * from "./errors/DbMigrationError.ts";
105
- export * from "./errors/DbVersionMismatchError.ts";
106
- export * from "./helpers/parseQueryString.ts";
107
- export * from "./helpers/pgAttr.ts";
108
- export * from "./interfaces/FilterOperators.ts";
109
- export * from "./interfaces/PgQuery.ts";
110
- export * from "./interfaces/PgQueryWhere.ts";
111
- export * from "./primitives/$entity.ts";
112
- export * from "./primitives/$repository.ts";
113
- export * from "./primitives/$sequence.ts";
114
- export * from "./primitives/$transaction.ts";
115
- export * from "./providers/DatabaseTypeProvider.ts";
116
- export * from "./providers/DrizzleKitProvider.ts";
117
- export * from "./providers/drivers/CloudflareD1Provider.ts";
118
- export * from "./providers/drivers/DatabaseProvider.ts";
91
+ export * from "./index.shared-server.ts";
92
+ export * from "./providers/drivers/BunPostgresProvider.ts";
93
+ export * from "./providers/drivers/BunSqliteProvider.ts";
119
94
  export * from "./providers/drivers/NodePostgresProvider.ts";
120
95
  export * from "./providers/drivers/NodeSqliteProvider.ts";
121
- export * from "./providers/RepositoryProvider.ts";
122
- export * from "./schemas/insertSchema.ts";
123
- export * from "./schemas/legacyIdSchema.ts";
124
- export * from "./schemas/updateSchema.ts";
125
- export * from "./services/Repository.ts";
126
- export * from "./types/schema.ts";
127
96
 
128
97
  // ---------------------------------------------------------------------------------------------------------------------
129
98
 
130
99
  /**
131
100
  * Postgres client based on Drizzle ORM, Alepha type-safe friendly.
132
101
  *
102
+ * Automatically selects the appropriate provider based on runtime:
103
+ * - Bun: Uses `BunPostgresProvider` or `BunSqliteProvider`
104
+ * - Node.js: Uses `NodePostgresProvider` or `NodeSqliteProvider`
105
+ *
133
106
  * ```ts
134
107
  * import { t } from "alepha";
135
108
  * import { $entity, $repository, db } from "alepha/postgres";
@@ -168,6 +141,10 @@ export * from "./types/schema.ts";
168
141
  * @see {@link $sequence}
169
142
  * @see {@link $repository}
170
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
171
148
  * @module alepha.postgres
172
149
  */
173
150
  export const AlephaPostgres = $module({
@@ -177,8 +154,10 @@ export const AlephaPostgres = $module({
177
154
  AlephaDateTime,
178
155
  DatabaseProvider,
179
156
  NodePostgresProvider,
180
- PglitePostgresProvider,
181
157
  NodeSqliteProvider,
158
+ BunPostgresProvider,
159
+ BunSqliteProvider,
160
+ PglitePostgresProvider,
182
161
  CloudflareD1Provider,
183
162
  SqliteModelBuilder,
184
163
  PostgresModelBuilder,
@@ -204,6 +183,7 @@ export const AlephaPostgres = $module({
204
183
  const isSqlite = url?.startsWith("sqlite:");
205
184
  const isMemory = url?.includes(":memory:");
206
185
  const isFile = !!url && !isPostgres && !isMemory;
186
+ const isBun = alepha.isBun();
207
187
 
208
188
  if (url?.startsWith("cloudflare-d1:")) {
209
189
  alepha.with({
@@ -227,7 +207,7 @@ export const AlephaPostgres = $module({
227
207
  alepha.with({
228
208
  optional: true,
229
209
  provide: DatabaseProvider,
230
- use: NodePostgresProvider,
210
+ use: isBun ? BunPostgresProvider : NodePostgresProvider,
231
211
  });
232
212
  return;
233
213
  }
@@ -235,7 +215,7 @@ export const AlephaPostgres = $module({
235
215
  alepha.with({
236
216
  optional: true,
237
217
  provide: DatabaseProvider,
238
- use: NodeSqliteProvider,
218
+ use: isBun ? BunSqliteProvider : NodeSqliteProvider,
239
219
  });
240
220
  },
241
221
  });
@@ -47,9 +47,7 @@ export class DrizzleKitProvider {
47
47
  await this.saveDevMigrations(provider, snapshot, entry);
48
48
  }
49
49
 
50
- this.log.info(
51
- `Db '${provider.name}' synchronization OK [${Date.now() - now}ms]`,
52
- );
50
+ this.log.info(`Sync with '${provider.name}' OK [${Date.now() - now}ms]`);
53
51
  }
54
52
 
55
53
  /**
@@ -81,8 +79,8 @@ export class DrizzleKitProvider {
81
79
  };
82
80
  }
83
81
 
84
- const prev = prevSnapshot ?? (await kit.generateDrizzleJson({}));
85
- const curr = await kit.generateDrizzleJson(models);
82
+ const prev = prevSnapshot ?? kit.generateDrizzleJson({});
83
+ const curr = kit.generateDrizzleJson(models);
86
84
  return {
87
85
  models,
88
86
  statements: await kit.generateMigration(prev, curr),
@@ -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,11 +63,23 @@ 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);
68
70
  protected readonly alepha = $inject(Alepha);
69
71
 
72
+ static of<T extends TObject>(
73
+ entity: EntityPrimitive<T>,
74
+ provider = DatabaseProvider,
75
+ ): new () => Repository<T> {
76
+ return class InlineRepository extends Repository<T> {
77
+ constructor() {
78
+ super(entity, provider);
79
+ }
80
+ };
81
+ }
82
+
70
83
  constructor(entity: EntityPrimitive<T>, provider = DatabaseProvider) {
71
84
  this.entity = entity;
72
85
  this.provider = this.alepha.inject(provider);
@@ -200,6 +213,12 @@ export abstract class Repository<T extends TObject> {
200
213
  ) => Promise<T>,
201
214
  config?: PgTransactionConfig,
202
215
  ): Promise<T> {
216
+ if (this.provider.driver === "pglite") {
217
+ this.log.warn("Transactions are not supported with pglite driver");
218
+ return await transaction(null as any);
219
+ }
220
+
221
+ this.log.debug(`Starting transaction on table ${this.tableName}`);
203
222
  return await this.db.transaction(transaction, config);
204
223
  }
205
224
 
@@ -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
  }
@@ -4,19 +4,23 @@ import {
4
4
  type RedisClientType,
5
5
  type SetOptions,
6
6
  } from "@redis/client";
7
- import { $env, $hook, $inject, Alepha, type Static, t } from "alepha";
7
+ import {
8
+ $env,
9
+ $hook,
10
+ $inject,
11
+ Alepha,
12
+ AlephaError,
13
+ type Static,
14
+ t,
15
+ } from "alepha";
8
16
  import { $logger } from "alepha/logger";
9
17
  import { RedisProvider, type RedisSetOptions } from "./RedisProvider.ts";
10
18
 
11
19
  const envSchema = t.object({
12
- REDIS_URL: t.optional(t.text()),
13
- REDIS_PORT: t.integer({
14
- default: "6379",
15
- }),
16
- REDIS_HOST: t.text({
17
- default: "localhost",
20
+ REDIS_URL: t.text({
21
+ default: "redis://localhost:6379",
22
+ description: "Redis connection URL",
18
23
  }),
19
- REDIS_PASSWORD: t.optional(t.text()),
20
24
  });
21
25
 
22
26
  declare module "alepha" {
@@ -39,10 +43,8 @@ export type NodeRedisClientOptions = Parameters<typeof createClient>[0];
39
43
  *
40
44
  * @example
41
45
  * ```ts
42
- * // Set REDIS_URL environment variable
43
- * // REDIS_URL=redis://localhost:6379
44
- *
45
- * // Or configure via REDIS_HOST, REDIS_PORT, REDIS_PASSWORD
46
+ * // Set REDIS_URL environment variable (default: redis://localhost:6379)
47
+ * // REDIS_URL=redis://:password@myredis.example.com:6379
46
48
  *
47
49
  * // Or configure programmatically
48
50
  * alepha.with({
@@ -59,7 +61,7 @@ export class NodeRedisProvider extends RedisProvider {
59
61
 
60
62
  public get publisher(): NodeRedisClient {
61
63
  if (!this.client.isReady) {
62
- throw new Error("Redis client is not ready");
64
+ throw new AlephaError("Redis client is not ready");
63
65
  }
64
66
 
65
67
  return this.client;
@@ -235,27 +237,7 @@ export class NodeRedisProvider extends RedisProvider {
235
237
  * Get the Redis connection URL.
236
238
  */
237
239
  protected getUrl(): string {
238
- // Prefer REDIS_URL if set
239
- if (this.env.REDIS_URL) {
240
- return this.env.REDIS_URL;
241
- }
242
-
243
- // Build URL from components
244
- const url = new URL("redis://127.0.0.1:6379");
245
-
246
- if (this.env.REDIS_PASSWORD) {
247
- url.password = this.env.REDIS_PASSWORD;
248
- }
249
-
250
- if (this.env.REDIS_HOST) {
251
- url.hostname = this.env.REDIS_HOST;
252
- }
253
-
254
- if (this.env.REDIS_PORT) {
255
- url.port = String(this.env.REDIS_PORT);
256
- }
257
-
258
- return url.toString();
240
+ return this.env.REDIS_URL;
259
241
  }
260
242
 
261
243
  /**
@@ -3,7 +3,7 @@ import { $action, AlephaServer } from "alepha/server";
3
3
  import { afterEach, beforeEach, describe, expect, it } from "vitest";
4
4
  import {
5
5
  $basicAuth,
6
- AlephaServerSecurity,
6
+ AlephaSecurity,
7
7
  ServerBasicAuthProvider,
8
8
  } from "../index.ts";
9
9
 
@@ -58,7 +58,7 @@ describe("Basic Authentication", () => {
58
58
  beforeEach(async () => {
59
59
  alepha = Alepha.create()
60
60
  .with(AlephaServer)
61
- .with(AlephaServerSecurity)
61
+ .with(AlephaSecurity)
62
62
  .with(TestApp);
63
63
 
64
64
  await alepha.start();
@@ -269,7 +269,7 @@ describe("Basic Authentication", () => {
269
269
 
270
270
  const edgeAlepha = Alepha.create()
271
271
  .with(AlephaServer)
272
- .with(AlephaServerSecurity)
272
+ .with(AlephaSecurity)
273
273
  .with(EdgeCaseApp);
274
274
 
275
275
  await edgeAlepha.start();
@@ -301,7 +301,7 @@ describe("Basic Authentication", () => {
301
301
 
302
302
  const emptyAlepha = Alepha.create()
303
303
  .with(AlephaServer)
304
- .with(AlephaServerSecurity)
304
+ .with(AlephaSecurity)
305
305
  .with(EmptyPasswordApp);
306
306
 
307
307
  await emptyAlepha.start();
@@ -333,7 +333,7 @@ describe("Basic Authentication", () => {
333
333
 
334
334
  const specialAlepha = Alepha.create()
335
335
  .with(AlephaServer)
336
- .with(AlephaServerSecurity)
336
+ .with(AlephaSecurity)
337
337
  .with(SpecialCharsApp);
338
338
 
339
339
  await specialAlepha.start();
@@ -365,7 +365,7 @@ describe("Basic Authentication", () => {
365
365
 
366
366
  const unicodeAlepha = Alepha.create()
367
367
  .with(AlephaServer)
368
- .with(AlephaServerSecurity)
368
+ .with(AlephaSecurity)
369
369
  .with(UnicodeApp);
370
370
 
371
371
  await unicodeAlepha.start();
@@ -397,7 +397,7 @@ describe("Basic Authentication", () => {
397
397
 
398
398
  const unicodeAlepha = Alepha.create()
399
399
  .with(AlephaServer)
400
- .with(AlephaServerSecurity)
400
+ .with(AlephaSecurity)
401
401
  .with(UnicodeApp);
402
402
 
403
403
  await unicodeAlepha.start();
@@ -434,7 +434,7 @@ describe("Basic Authentication", () => {
434
434
 
435
435
  const longAlepha = Alepha.create()
436
436
  .with(AlephaServer)
437
- .with(AlephaServerSecurity)
437
+ .with(AlephaSecurity)
438
438
  .with(LongCredsApp);
439
439
 
440
440
  await longAlepha.start();
@@ -466,7 +466,7 @@ describe("Basic Authentication", () => {
466
466
 
467
467
  const emptyUserAlepha = Alepha.create()
468
468
  .with(AlephaServer)
469
- .with(AlephaServerSecurity)
469
+ .with(AlephaSecurity)
470
470
  .with(EmptyUsernameApp);
471
471
 
472
472
  await emptyUserAlepha.start();
@@ -549,7 +549,7 @@ describe("Basic Authentication", () => {
549
549
 
550
550
  const wsAlepha = Alepha.create()
551
551
  .with(AlephaServer)
552
- .with(AlephaServerSecurity)
552
+ .with(AlephaSecurity)
553
553
  .with(WhitespaceApp);
554
554
 
555
555
  await wsAlepha.start();
@@ -582,7 +582,7 @@ describe("Basic Authentication", () => {
582
582
 
583
583
  const wsAlepha = Alepha.create()
584
584
  .with(AlephaServer)
585
- .with(AlephaServerSecurity)
585
+ .with(AlephaSecurity)
586
586
  .with(WhitespaceApp);
587
587
 
588
588
  await wsAlepha.start();