alepha 0.15.1 → 0.15.3

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 (523) hide show
  1. package/README.md +68 -80
  2. package/dist/api/audits/index.d.ts +10 -33
  3. package/dist/api/audits/index.d.ts.map +1 -1
  4. package/dist/api/audits/index.js +10 -33
  5. package/dist/api/audits/index.js.map +1 -1
  6. package/dist/api/files/index.d.ts +10 -3
  7. package/dist/api/files/index.d.ts.map +1 -1
  8. package/dist/api/files/index.js +10 -3
  9. package/dist/api/files/index.js.map +1 -1
  10. package/dist/api/jobs/index.d.ts +162 -155
  11. package/dist/api/jobs/index.d.ts.map +1 -1
  12. package/dist/api/jobs/index.js +10 -3
  13. package/dist/api/jobs/index.js.map +1 -1
  14. package/dist/api/keys/index.d.ts +413 -0
  15. package/dist/api/keys/index.d.ts.map +1 -0
  16. package/dist/api/keys/index.js +476 -0
  17. package/dist/api/keys/index.js.map +1 -0
  18. package/dist/api/notifications/index.d.ts +10 -4
  19. package/dist/api/notifications/index.d.ts.map +1 -1
  20. package/dist/api/notifications/index.js +10 -4
  21. package/dist/api/notifications/index.js.map +1 -1
  22. package/dist/api/parameters/index.d.ts +43 -50
  23. package/dist/api/parameters/index.d.ts.map +1 -1
  24. package/dist/api/parameters/index.js +30 -37
  25. package/dist/api/parameters/index.js.map +1 -1
  26. package/dist/api/users/index.d.ts +1081 -760
  27. package/dist/api/users/index.d.ts.map +1 -1
  28. package/dist/api/users/index.js +2539 -218
  29. package/dist/api/users/index.js.map +1 -1
  30. package/dist/api/verifications/index.d.ts +138 -132
  31. package/dist/api/verifications/index.d.ts.map +1 -1
  32. package/dist/api/verifications/index.js +12 -4
  33. package/dist/api/verifications/index.js.map +1 -1
  34. package/dist/batch/index.d.ts +20 -40
  35. package/dist/batch/index.d.ts.map +1 -1
  36. package/dist/batch/index.js +31 -44
  37. package/dist/batch/index.js.map +1 -1
  38. package/dist/bucket/index.d.ts +440 -8
  39. package/dist/bucket/index.d.ts.map +1 -1
  40. package/dist/bucket/index.js +1861 -12
  41. package/dist/bucket/index.js.map +1 -1
  42. package/dist/cache/core/index.d.ts +179 -7
  43. package/dist/cache/core/index.d.ts.map +1 -1
  44. package/dist/cache/core/index.js +213 -7
  45. package/dist/cache/core/index.js.map +1 -1
  46. package/dist/cache/redis/index.d.ts +1 -0
  47. package/dist/cache/redis/index.d.ts.map +1 -1
  48. package/dist/cache/redis/index.js +4 -0
  49. package/dist/cache/redis/index.js.map +1 -1
  50. package/dist/cli/index.d.ts +638 -5645
  51. package/dist/cli/index.d.ts.map +1 -1
  52. package/dist/cli/index.js +2550 -368
  53. package/dist/cli/index.js.map +1 -1
  54. package/dist/command/index.d.ts +203 -45
  55. package/dist/command/index.d.ts.map +1 -1
  56. package/dist/command/index.js +2060 -71
  57. package/dist/command/index.js.map +1 -1
  58. package/dist/core/index.browser.js +70 -40
  59. package/dist/core/index.browser.js.map +1 -1
  60. package/dist/core/index.d.ts +34 -13
  61. package/dist/core/index.d.ts.map +1 -1
  62. package/dist/core/index.js +90 -40
  63. package/dist/core/index.js.map +1 -1
  64. package/dist/core/index.native.js +70 -40
  65. package/dist/core/index.native.js.map +1 -1
  66. package/dist/datetime/index.d.ts +15 -0
  67. package/dist/datetime/index.d.ts.map +1 -1
  68. package/dist/datetime/index.js +15 -0
  69. package/dist/datetime/index.js.map +1 -1
  70. package/dist/email/index.d.ts +323 -20
  71. package/dist/email/index.d.ts.map +1 -1
  72. package/dist/email/index.js +1857 -7
  73. package/dist/email/index.js.map +1 -1
  74. package/dist/fake/index.d.ts +90 -8
  75. package/dist/fake/index.d.ts.map +1 -1
  76. package/dist/fake/index.js +91 -20
  77. package/dist/fake/index.js.map +1 -1
  78. package/dist/lock/core/index.d.ts +11 -4
  79. package/dist/lock/core/index.d.ts.map +1 -1
  80. package/dist/lock/core/index.js +11 -4
  81. package/dist/lock/core/index.js.map +1 -1
  82. package/dist/logger/index.d.ts +17 -66
  83. package/dist/logger/index.d.ts.map +1 -1
  84. package/dist/logger/index.js +14 -63
  85. package/dist/logger/index.js.map +1 -1
  86. package/dist/mcp/index.d.ts +10 -30
  87. package/dist/mcp/index.d.ts.map +1 -1
  88. package/dist/mcp/index.js +12 -35
  89. package/dist/mcp/index.js.map +1 -1
  90. package/dist/orm/index.browser.js +3 -3
  91. package/dist/orm/index.browser.js.map +1 -1
  92. package/dist/orm/index.bun.js +39 -20
  93. package/dist/orm/index.bun.js.map +1 -1
  94. package/dist/orm/index.d.ts +517 -540
  95. package/dist/orm/index.d.ts.map +1 -1
  96. package/dist/orm/index.js +58 -71
  97. package/dist/orm/index.js.map +1 -1
  98. package/dist/queue/core/index.d.ts +18 -10
  99. package/dist/queue/core/index.d.ts.map +1 -1
  100. package/dist/queue/core/index.js +14 -6
  101. package/dist/queue/core/index.js.map +1 -1
  102. package/dist/react/auth/index.browser.js +108 -0
  103. package/dist/react/auth/index.browser.js.map +1 -0
  104. package/dist/react/auth/index.d.ts +100 -0
  105. package/dist/react/auth/index.d.ts.map +1 -0
  106. package/dist/react/auth/index.js +145 -0
  107. package/dist/react/auth/index.js.map +1 -0
  108. package/dist/react/core/index.d.ts +469 -0
  109. package/dist/react/core/index.d.ts.map +1 -0
  110. package/dist/react/core/index.js +464 -0
  111. package/dist/react/core/index.js.map +1 -0
  112. package/dist/react/form/index.d.ts +232 -0
  113. package/dist/react/form/index.d.ts.map +1 -0
  114. package/dist/react/form/index.js +432 -0
  115. package/dist/react/form/index.js.map +1 -0
  116. package/dist/react/head/index.browser.js +423 -0
  117. package/dist/react/head/index.browser.js.map +1 -0
  118. package/dist/react/head/index.d.ts +288 -0
  119. package/dist/react/head/index.d.ts.map +1 -0
  120. package/dist/react/head/index.js +465 -0
  121. package/dist/react/head/index.js.map +1 -0
  122. package/dist/react/i18n/index.d.ts +175 -0
  123. package/dist/react/i18n/index.d.ts.map +1 -0
  124. package/dist/react/i18n/index.js +224 -0
  125. package/dist/react/i18n/index.js.map +1 -0
  126. package/dist/react/router/index.browser.js +1974 -0
  127. package/dist/react/router/index.browser.js.map +1 -0
  128. package/dist/react/router/index.d.ts +1956 -0
  129. package/dist/react/router/index.d.ts.map +1 -0
  130. package/dist/react/router/index.js +4722 -0
  131. package/dist/react/router/index.js.map +1 -0
  132. package/dist/react/websocket/index.d.ts +117 -0
  133. package/dist/react/websocket/index.d.ts.map +1 -0
  134. package/dist/react/websocket/index.js +107 -0
  135. package/dist/react/websocket/index.js.map +1 -0
  136. package/dist/redis/index.bun.js +4 -0
  137. package/dist/redis/index.bun.js.map +1 -1
  138. package/dist/redis/index.d.ts +41 -44
  139. package/dist/redis/index.d.ts.map +1 -1
  140. package/dist/redis/index.js +16 -25
  141. package/dist/redis/index.js.map +1 -1
  142. package/dist/retry/index.d.ts +11 -2
  143. package/dist/retry/index.d.ts.map +1 -1
  144. package/dist/retry/index.js +11 -2
  145. package/dist/retry/index.js.map +1 -1
  146. package/dist/scheduler/index.d.ts +11 -2
  147. package/dist/scheduler/index.d.ts.map +1 -1
  148. package/dist/scheduler/index.js +11 -2
  149. package/dist/scheduler/index.js.map +1 -1
  150. package/dist/security/index.d.ts +140 -49
  151. package/dist/security/index.d.ts.map +1 -1
  152. package/dist/security/index.js +164 -32
  153. package/dist/security/index.js.map +1 -1
  154. package/dist/server/auth/index.d.ts +12 -7
  155. package/dist/server/auth/index.d.ts.map +1 -1
  156. package/dist/server/auth/index.js +12 -7
  157. package/dist/server/auth/index.js.map +1 -1
  158. package/dist/server/cache/index.d.ts +7 -22
  159. package/dist/server/cache/index.d.ts.map +1 -1
  160. package/dist/server/cache/index.js +7 -22
  161. package/dist/server/cache/index.js.map +1 -1
  162. package/dist/server/compress/index.d.ts +10 -2
  163. package/dist/server/compress/index.d.ts.map +1 -1
  164. package/dist/server/compress/index.js +10 -2
  165. package/dist/server/compress/index.js.map +1 -1
  166. package/dist/server/cookies/index.d.ts +40 -16
  167. package/dist/server/cookies/index.d.ts.map +1 -1
  168. package/dist/server/cookies/index.js +7 -5
  169. package/dist/server/cookies/index.js.map +1 -1
  170. package/dist/server/core/index.d.ts +124 -23
  171. package/dist/server/core/index.d.ts.map +1 -1
  172. package/dist/server/core/index.js +231 -14
  173. package/dist/server/core/index.js.map +1 -1
  174. package/dist/server/cors/index.d.ts +13 -23
  175. package/dist/server/cors/index.d.ts.map +1 -1
  176. package/dist/server/cors/index.js +7 -21
  177. package/dist/server/cors/index.js.map +1 -1
  178. package/dist/server/health/index.d.ts +8 -2
  179. package/dist/server/health/index.d.ts.map +1 -1
  180. package/dist/server/health/index.js +8 -2
  181. package/dist/server/health/index.js.map +1 -1
  182. package/dist/server/helmet/index.d.ts +11 -3
  183. package/dist/server/helmet/index.d.ts.map +1 -1
  184. package/dist/server/helmet/index.js +11 -3
  185. package/dist/server/helmet/index.js.map +1 -1
  186. package/dist/server/links/index.d.ts +11 -6
  187. package/dist/server/links/index.d.ts.map +1 -1
  188. package/dist/server/links/index.js +11 -6
  189. package/dist/server/links/index.js.map +1 -1
  190. package/dist/server/metrics/index.d.ts +10 -3
  191. package/dist/server/metrics/index.d.ts.map +1 -1
  192. package/dist/server/metrics/index.js +10 -3
  193. package/dist/server/metrics/index.js.map +1 -1
  194. package/dist/server/multipart/index.d.ts +9 -3
  195. package/dist/server/multipart/index.d.ts.map +1 -1
  196. package/dist/server/multipart/index.js +9 -3
  197. package/dist/server/multipart/index.js.map +1 -1
  198. package/dist/server/proxy/index.d.ts +8 -2
  199. package/dist/server/proxy/index.d.ts.map +1 -1
  200. package/dist/server/proxy/index.js +8 -2
  201. package/dist/server/proxy/index.js.map +1 -1
  202. package/dist/server/rate-limit/index.d.ts +30 -35
  203. package/dist/server/rate-limit/index.d.ts.map +1 -1
  204. package/dist/server/rate-limit/index.js +18 -55
  205. package/dist/server/rate-limit/index.js.map +1 -1
  206. package/dist/server/static/index.d.ts +137 -4
  207. package/dist/server/static/index.d.ts.map +1 -1
  208. package/dist/server/static/index.js +1853 -5
  209. package/dist/server/static/index.js.map +1 -1
  210. package/dist/server/swagger/index.d.ts +309 -6
  211. package/dist/server/swagger/index.d.ts.map +1 -1
  212. package/dist/server/swagger/index.js +1854 -6
  213. package/dist/server/swagger/index.js.map +1 -1
  214. package/dist/sms/index.d.ts +309 -7
  215. package/dist/sms/index.d.ts.map +1 -1
  216. package/dist/sms/index.js +1856 -7
  217. package/dist/sms/index.js.map +1 -1
  218. package/dist/system/index.browser.js +1218 -0
  219. package/dist/system/index.browser.js.map +1 -0
  220. package/dist/{file → system}/index.d.ts +343 -16
  221. package/dist/system/index.d.ts.map +1 -0
  222. package/dist/{file → system}/index.js +419 -22
  223. package/dist/system/index.js.map +1 -0
  224. package/dist/thread/index.d.ts +11 -2
  225. package/dist/thread/index.d.ts.map +1 -1
  226. package/dist/thread/index.js +11 -2
  227. package/dist/thread/index.js.map +1 -1
  228. package/dist/topic/core/index.d.ts +12 -5
  229. package/dist/topic/core/index.d.ts.map +1 -1
  230. package/dist/topic/core/index.js +12 -5
  231. package/dist/topic/core/index.js.map +1 -1
  232. package/dist/vite/index.d.ts +5 -6272
  233. package/dist/vite/index.d.ts.map +1 -1
  234. package/dist/vite/index.js +23 -10
  235. package/dist/vite/index.js.map +1 -1
  236. package/dist/websocket/index.d.ts +12 -8
  237. package/dist/websocket/index.d.ts.map +1 -1
  238. package/dist/websocket/index.js +12 -8
  239. package/dist/websocket/index.js.map +1 -1
  240. package/package.json +82 -11
  241. package/src/api/audits/index.ts +10 -33
  242. package/src/api/files/__tests__/$bucket.spec.ts +1 -1
  243. package/src/api/files/controllers/AdminFileStatsController.spec.ts +1 -1
  244. package/src/api/files/controllers/FileController.spec.ts +1 -1
  245. package/src/api/files/index.ts +10 -3
  246. package/src/api/files/jobs/FileJobs.spec.ts +1 -1
  247. package/src/api/files/services/FileService.spec.ts +1 -1
  248. package/src/api/jobs/index.ts +10 -3
  249. package/src/api/keys/controllers/AdminApiKeyController.ts +75 -0
  250. package/src/api/keys/controllers/ApiKeyController.ts +103 -0
  251. package/src/api/keys/entities/apiKeyEntity.ts +41 -0
  252. package/src/api/keys/index.ts +49 -0
  253. package/src/api/keys/schemas/adminApiKeyQuerySchema.ts +7 -0
  254. package/src/api/keys/schemas/adminApiKeyResourceSchema.ts +17 -0
  255. package/src/api/keys/schemas/createApiKeyBodySchema.ts +7 -0
  256. package/src/api/keys/schemas/createApiKeyResponseSchema.ts +11 -0
  257. package/src/api/keys/schemas/listApiKeyResponseSchema.ts +15 -0
  258. package/src/api/keys/schemas/revokeApiKeyParamsSchema.ts +5 -0
  259. package/src/api/keys/schemas/revokeApiKeyResponseSchema.ts +5 -0
  260. package/src/api/keys/services/ApiKeyService.spec.ts +553 -0
  261. package/src/api/keys/services/ApiKeyService.ts +306 -0
  262. package/src/api/logs/TODO.md +55 -0
  263. package/src/api/notifications/index.ts +10 -4
  264. package/src/api/parameters/index.ts +9 -30
  265. package/src/api/parameters/primitives/$config.ts +12 -4
  266. package/src/api/parameters/services/ConfigStore.ts +9 -3
  267. package/src/api/users/__tests__/ApiKeys-integration.spec.ts +1035 -0
  268. package/src/api/users/__tests__/ApiKeys.spec.ts +401 -0
  269. package/src/api/users/index.ts +14 -3
  270. package/src/api/users/primitives/$realm.ts +33 -5
  271. package/src/api/users/providers/RealmProvider.ts +1 -12
  272. package/src/api/users/services/SessionService.ts +1 -1
  273. package/src/api/verifications/controllers/VerificationController.ts +2 -0
  274. package/src/api/verifications/index.ts +10 -4
  275. package/src/batch/index.ts +9 -36
  276. package/src/batch/primitives/$batch.ts +0 -8
  277. package/src/batch/providers/BatchProvider.ts +29 -2
  278. package/src/bucket/__tests__/shared.ts +1 -1
  279. package/src/bucket/index.ts +13 -6
  280. package/src/bucket/primitives/$bucket.ts +1 -1
  281. package/src/bucket/providers/LocalFileStorageProvider.ts +1 -1
  282. package/src/bucket/providers/MemoryFileStorageProvider.ts +1 -1
  283. package/src/cache/core/__tests__/shared.ts +30 -0
  284. package/src/cache/core/index.ts +11 -6
  285. package/src/cache/core/primitives/$cache.spec.ts +5 -0
  286. package/src/cache/core/providers/CacheProvider.ts +17 -0
  287. package/src/cache/core/providers/MemoryCacheProvider.ts +300 -1
  288. package/src/cache/redis/__tests__/cache-redis.spec.ts +5 -0
  289. package/src/cache/redis/providers/RedisCacheProvider.ts +9 -0
  290. package/src/cli/apps/AlephaCli.ts +1 -14
  291. package/src/cli/apps/AlephaPackageBuilderCli.ts +10 -1
  292. package/src/cli/atoms/buildOptions.ts +99 -9
  293. package/src/cli/commands/build.ts +150 -37
  294. package/src/cli/commands/db.ts +22 -18
  295. package/src/cli/commands/deploy.ts +1 -1
  296. package/src/cli/commands/dev.ts +1 -20
  297. package/src/cli/commands/gen/env.ts +5 -2
  298. package/src/cli/commands/gen/openapi.ts +5 -2
  299. package/src/cli/commands/init.spec.ts +588 -0
  300. package/src/cli/commands/init.ts +115 -58
  301. package/src/cli/commands/lint.ts +7 -1
  302. package/src/cli/commands/typecheck.ts +11 -0
  303. package/src/cli/providers/AppEntryProvider.ts +1 -1
  304. package/src/cli/providers/ViteBuildProvider.ts +8 -50
  305. package/src/cli/providers/ViteDevServerProvider.ts +35 -16
  306. package/src/cli/services/AlephaCliUtils.ts +52 -121
  307. package/src/cli/services/PackageManagerUtils.ts +129 -11
  308. package/src/cli/services/ProjectScaffolder.spec.ts +97 -0
  309. package/src/cli/services/ProjectScaffolder.ts +148 -81
  310. package/src/cli/services/ViteUtils.ts +82 -0
  311. package/src/cli/{assets/claudeMd.ts → templates/agentMd.ts} +37 -24
  312. package/src/cli/templates/apiAppSecurityTs.ts +11 -0
  313. package/src/cli/templates/apiIndexTs.ts +30 -0
  314. package/src/cli/templates/gitignore.ts +39 -0
  315. package/src/cli/{assets → templates}/mainCss.ts +11 -2
  316. package/src/cli/templates/mainServerTs.ts +33 -0
  317. package/src/cli/templates/webAppRouterTs.ts +74 -0
  318. package/src/cli/templates/webHelloComponentTsx.ts +30 -0
  319. package/src/command/helpers/Runner.spec.ts +139 -0
  320. package/src/command/helpers/Runner.ts +7 -22
  321. package/src/command/index.ts +12 -4
  322. package/src/command/providers/CliProvider.spec.ts +1392 -0
  323. package/src/command/providers/CliProvider.ts +320 -47
  324. package/src/core/Alepha.ts +34 -27
  325. package/src/core/__tests__/Alepha-start.spec.ts +4 -4
  326. package/src/core/helpers/jsonSchemaToTypeBox.spec.ts +771 -0
  327. package/src/core/helpers/jsonSchemaToTypeBox.ts +62 -10
  328. package/src/core/index.shared.ts +1 -0
  329. package/src/core/index.ts +20 -0
  330. package/src/core/providers/EventManager.spec.ts +0 -71
  331. package/src/core/providers/EventManager.ts +3 -15
  332. package/src/core/providers/Json.ts +2 -14
  333. package/src/datetime/index.ts +15 -0
  334. package/src/email/index.ts +10 -5
  335. package/src/email/providers/LocalEmailProvider.spec.ts +1 -1
  336. package/src/email/providers/LocalEmailProvider.ts +1 -1
  337. package/src/fake/__tests__/keyName.example.ts +1 -1
  338. package/src/fake/__tests__/keyName.spec.ts +5 -5
  339. package/src/fake/index.ts +9 -6
  340. package/src/fake/providers/FakeProvider.spec.ts +258 -40
  341. package/src/fake/providers/FakeProvider.ts +133 -19
  342. package/src/lock/core/index.ts +11 -4
  343. package/src/logger/index.ts +17 -66
  344. package/src/mcp/index.ts +10 -27
  345. package/src/mcp/transports/SseMcpTransport.ts +0 -11
  346. package/src/orm/__tests__/PostgresProvider.spec.ts +2 -2
  347. package/src/orm/index.browser.ts +2 -2
  348. package/src/orm/index.bun.ts +5 -3
  349. package/src/orm/index.ts +23 -53
  350. package/src/orm/providers/drivers/BunSqliteProvider.ts +5 -1
  351. package/src/orm/providers/drivers/CloudflareD1Provider.ts +57 -30
  352. package/src/orm/providers/drivers/DatabaseProvider.ts +9 -1
  353. package/src/orm/providers/drivers/NodeSqliteProvider.ts +4 -1
  354. package/src/orm/services/Repository.ts +7 -3
  355. package/src/queue/core/index.ts +14 -6
  356. package/src/react/auth/__tests__/$auth.spec.ts +202 -0
  357. package/src/react/auth/hooks/useAuth.ts +32 -0
  358. package/src/react/auth/index.browser.ts +13 -0
  359. package/src/react/auth/index.shared.ts +2 -0
  360. package/src/react/auth/index.ts +48 -0
  361. package/src/react/auth/providers/ReactAuthProvider.ts +16 -0
  362. package/src/react/auth/services/ReactAuth.ts +135 -0
  363. package/src/react/core/__tests__/Router.spec.tsx +169 -0
  364. package/src/react/core/components/ClientOnly.tsx +49 -0
  365. package/src/react/core/components/ErrorBoundary.tsx +73 -0
  366. package/src/react/core/contexts/AlephaContext.ts +7 -0
  367. package/src/react/core/contexts/AlephaProvider.tsx +42 -0
  368. package/src/react/core/hooks/useAction.browser.spec.tsx +569 -0
  369. package/src/react/core/hooks/useAction.ts +480 -0
  370. package/src/react/core/hooks/useAlepha.ts +26 -0
  371. package/src/react/core/hooks/useClient.ts +17 -0
  372. package/src/react/core/hooks/useEvents.ts +51 -0
  373. package/src/react/core/hooks/useInject.ts +12 -0
  374. package/src/react/core/hooks/useStore.ts +52 -0
  375. package/src/react/core/index.ts +90 -0
  376. package/src/react/form/components/FormState.tsx +17 -0
  377. package/src/react/form/errors/FormValidationError.ts +18 -0
  378. package/src/react/form/hooks/useForm.browser.spec.tsx +366 -0
  379. package/src/react/form/hooks/useForm.ts +47 -0
  380. package/src/react/form/hooks/useFormState.ts +130 -0
  381. package/src/react/form/index.ts +44 -0
  382. package/src/react/form/services/FormModel.ts +614 -0
  383. package/src/react/head/helpers/SeoExpander.spec.ts +203 -0
  384. package/src/react/head/helpers/SeoExpander.ts +142 -0
  385. package/src/react/head/hooks/useHead.spec.tsx +288 -0
  386. package/src/react/head/hooks/useHead.ts +62 -0
  387. package/src/react/head/index.browser.ts +26 -0
  388. package/src/react/head/index.ts +44 -0
  389. package/src/react/head/interfaces/Head.ts +105 -0
  390. package/src/react/head/primitives/$head.ts +25 -0
  391. package/src/react/head/providers/BrowserHeadProvider.browser.spec.ts +196 -0
  392. package/src/react/head/providers/BrowserHeadProvider.ts +212 -0
  393. package/src/react/head/providers/HeadProvider.ts +168 -0
  394. package/src/react/head/providers/ServerHeadProvider.ts +31 -0
  395. package/src/react/i18n/__tests__/integration.spec.tsx +239 -0
  396. package/src/react/i18n/components/Localize.spec.tsx +357 -0
  397. package/src/react/i18n/components/Localize.tsx +35 -0
  398. package/src/react/i18n/hooks/useI18n.browser.spec.tsx +438 -0
  399. package/src/react/i18n/hooks/useI18n.ts +18 -0
  400. package/src/react/i18n/index.ts +41 -0
  401. package/src/react/i18n/primitives/$dictionary.ts +69 -0
  402. package/src/react/i18n/providers/I18nProvider.spec.ts +389 -0
  403. package/src/react/i18n/providers/I18nProvider.ts +278 -0
  404. package/src/react/router/__tests__/page-head-browser.browser.spec.ts +95 -0
  405. package/src/react/router/__tests__/page-head.spec.ts +48 -0
  406. package/src/react/router/__tests__/seo-head.spec.ts +125 -0
  407. package/src/react/router/atoms/ssrManifestAtom.ts +58 -0
  408. package/src/react/router/components/ErrorViewer.tsx +872 -0
  409. package/src/react/router/components/Link.tsx +23 -0
  410. package/src/react/router/components/NestedView.tsx +223 -0
  411. package/src/react/router/components/NotFound.tsx +30 -0
  412. package/src/react/router/constants/PAGE_PRELOAD_KEY.ts +6 -0
  413. package/src/react/router/contexts/RouterLayerContext.ts +12 -0
  414. package/src/react/router/errors/Redirection.ts +28 -0
  415. package/src/react/router/hooks/useActive.ts +52 -0
  416. package/src/react/router/hooks/useQueryParams.ts +63 -0
  417. package/src/react/router/hooks/useRouter.ts +20 -0
  418. package/src/react/router/hooks/useRouterState.ts +11 -0
  419. package/src/react/router/index.browser.ts +45 -0
  420. package/src/react/router/index.shared.ts +19 -0
  421. package/src/react/router/index.ts +146 -0
  422. package/src/react/router/primitives/$page.browser.spec.tsx +851 -0
  423. package/src/react/router/primitives/$page.spec.tsx +676 -0
  424. package/src/react/router/primitives/$page.ts +489 -0
  425. package/src/react/router/providers/ReactBrowserProvider.ts +312 -0
  426. package/src/react/router/providers/ReactBrowserRendererProvider.ts +25 -0
  427. package/src/react/router/providers/ReactBrowserRouterProvider.ts +168 -0
  428. package/src/react/router/providers/ReactPageProvider.ts +726 -0
  429. package/src/react/router/providers/ReactPreloadProvider.spec.ts +142 -0
  430. package/src/react/router/providers/ReactPreloadProvider.ts +85 -0
  431. package/src/react/router/providers/ReactServerProvider.spec.tsx +316 -0
  432. package/src/react/router/providers/ReactServerProvider.ts +487 -0
  433. package/src/react/router/providers/ReactServerTemplateProvider.spec.ts +210 -0
  434. package/src/react/router/providers/ReactServerTemplateProvider.ts +542 -0
  435. package/src/react/router/providers/SSRManifestProvider.ts +334 -0
  436. package/src/react/router/services/ReactPageServerService.ts +48 -0
  437. package/src/react/router/services/ReactPageService.ts +27 -0
  438. package/src/react/router/services/ReactRouter.ts +262 -0
  439. package/src/react/websocket/hooks/useRoom.tsx +242 -0
  440. package/src/react/websocket/index.ts +7 -0
  441. package/src/redis/__tests__/redis.spec.ts +13 -0
  442. package/src/redis/index.ts +9 -25
  443. package/src/redis/providers/BunRedisProvider.ts +9 -0
  444. package/src/redis/providers/NodeRedisProvider.ts +8 -0
  445. package/src/redis/providers/RedisProvider.ts +16 -0
  446. package/src/retry/index.ts +11 -2
  447. package/src/router/index.ts +15 -0
  448. package/src/scheduler/index.ts +11 -2
  449. package/src/security/__tests__/BasicAuth.spec.ts +2 -0
  450. package/src/security/__tests__/ServerSecurityProvider.spec.ts +90 -5
  451. package/src/security/index.ts +15 -10
  452. package/src/security/interfaces/IssuerResolver.ts +27 -0
  453. package/src/security/primitives/$issuer.ts +55 -0
  454. package/src/security/providers/SecurityProvider.ts +179 -0
  455. package/src/security/providers/ServerBasicAuthProvider.ts +6 -2
  456. package/src/security/providers/ServerSecurityProvider.ts +63 -41
  457. package/src/server/auth/index.ts +12 -7
  458. package/src/server/cache/index.ts +7 -22
  459. package/src/server/compress/index.ts +10 -2
  460. package/src/server/cookies/index.ts +7 -5
  461. package/src/server/cookies/primitives/$cookie.ts +33 -11
  462. package/src/server/core/index.ts +16 -6
  463. package/src/server/core/interfaces/ServerRequest.ts +83 -1
  464. package/src/server/core/primitives/$action.spec.ts +1 -1
  465. package/src/server/core/primitives/$action.ts +8 -3
  466. package/src/server/core/providers/NodeHttpServerProvider.spec.ts +9 -3
  467. package/src/server/core/providers/NodeHttpServerProvider.ts +9 -3
  468. package/src/server/core/services/ServerRequestParser.spec.ts +520 -0
  469. package/src/server/core/services/ServerRequestParser.ts +306 -13
  470. package/src/server/cors/index.ts +7 -21
  471. package/src/server/cors/primitives/$cors.ts +6 -2
  472. package/src/server/health/index.ts +8 -2
  473. package/src/server/helmet/index.ts +11 -3
  474. package/src/server/links/index.ts +11 -6
  475. package/src/server/metrics/index.ts +10 -3
  476. package/src/server/multipart/index.ts +9 -3
  477. package/src/server/proxy/index.ts +8 -2
  478. package/src/server/rate-limit/index.ts +21 -25
  479. package/src/server/rate-limit/primitives/$rateLimit.ts +6 -2
  480. package/src/server/rate-limit/providers/ServerRateLimitProvider.spec.ts +38 -14
  481. package/src/server/rate-limit/providers/ServerRateLimitProvider.ts +22 -56
  482. package/src/server/static/index.ts +8 -2
  483. package/src/server/static/providers/ServerStaticProvider.ts +1 -1
  484. package/src/server/swagger/index.ts +9 -4
  485. package/src/server/swagger/providers/ServerSwaggerProvider.ts +1 -1
  486. package/src/sms/index.ts +9 -5
  487. package/src/sms/providers/LocalSmsProvider.spec.ts +1 -1
  488. package/src/sms/providers/LocalSmsProvider.ts +1 -1
  489. package/src/system/index.browser.ts +36 -0
  490. package/src/system/index.ts +62 -0
  491. package/src/system/index.workerd.ts +1 -0
  492. package/src/{file → system}/providers/FileSystemProvider.ts +24 -0
  493. package/src/{file → system}/providers/MemoryFileSystemProvider.ts +116 -3
  494. package/src/system/providers/MemoryShellProvider.ts +164 -0
  495. package/src/{file → system}/providers/NodeFileSystemProvider.spec.ts +2 -2
  496. package/src/{file → system}/providers/NodeFileSystemProvider.ts +47 -2
  497. package/src/system/providers/NodeShellProvider.ts +184 -0
  498. package/src/system/providers/ShellProvider.ts +74 -0
  499. package/src/{file → system}/services/FileDetector.spec.ts +2 -2
  500. package/src/thread/index.ts +11 -2
  501. package/src/topic/core/index.ts +12 -5
  502. package/src/vite/tasks/buildClient.ts +2 -7
  503. package/src/vite/tasks/buildServer.ts +19 -13
  504. package/src/vite/tasks/generateCloudflare.ts +10 -7
  505. package/src/vite/tasks/generateDocker.ts +4 -0
  506. package/src/websocket/index.ts +12 -8
  507. package/dist/file/index.d.ts.map +0 -1
  508. package/dist/file/index.js.map +0 -1
  509. package/src/cli/assets/apiIndexTs.ts +0 -16
  510. package/src/cli/assets/mainServerTs.ts +0 -24
  511. package/src/cli/assets/webAppRouterTs.ts +0 -16
  512. package/src/cli/assets/webHelloComponentTsx.ts +0 -20
  513. package/src/cli/providers/ViteTemplateProvider.ts +0 -27
  514. package/src/file/index.ts +0 -43
  515. /package/src/cli/{assets → templates}/apiHelloControllerTs.ts +0 -0
  516. /package/src/cli/{assets → templates}/biomeJson.ts +0 -0
  517. /package/src/cli/{assets → templates}/dummySpecTs.ts +0 -0
  518. /package/src/cli/{assets → templates}/editorconfig.ts +0 -0
  519. /package/src/cli/{assets → templates}/mainBrowserTs.ts +0 -0
  520. /package/src/cli/{assets → templates}/tsconfigJson.ts +0 -0
  521. /package/src/cli/{assets → templates}/webIndexTs.ts +0 -0
  522. /package/src/{file → system}/errors/FileError.ts +0 -0
  523. /package/src/{file → system}/services/FileDetector.ts +0 -0
@@ -24,6 +24,37 @@ export interface FakeOptions {
24
24
  * Seed for deterministic fake data generation.
25
25
  */
26
26
  seed?: number;
27
+
28
+ /**
29
+ * Probability (0-1) that an optional field will be undefined.
30
+ * @default 0.3
31
+ */
32
+ optionalProbability?: number;
33
+
34
+ /**
35
+ * Probability (0-1) that a nullable field will be null.
36
+ * @default 0.2
37
+ */
38
+ nullableProbability?: number;
39
+
40
+ /**
41
+ * Default number of items to generate for arrays when maxItems is not specified.
42
+ * @default 5
43
+ */
44
+ defaultArrayLength?: number;
45
+
46
+ /**
47
+ * Maximum number of items to generate for arrays.
48
+ * Set to Infinity to respect schema's maxItems without cap.
49
+ * @default 20
50
+ */
51
+ maxArrayLength?: number;
52
+
53
+ /**
54
+ * Default number of entries to generate for record types.
55
+ * @default { min: 2, max: 5 }
56
+ */
57
+ defaultRecordEntries?: { min: number; max: number };
27
58
  }
28
59
 
29
60
  /**
@@ -38,27 +69,98 @@ export interface FakeOptions {
38
69
  * email: t.email(),
39
70
  * });
40
71
  * const fakeUser = fake.generate(userSchema);
72
+ *
73
+ * // Configure options
74
+ * fake.configure({ seed: 99999, optionalProbability: 0.5 });
41
75
  * ```
42
76
  */
43
77
  export class FakeProvider {
44
- protected readonly faker: typeof faker;
45
- protected readonly guard: TypeGuard;
46
-
47
- constructor(options?: FakeOptions) {
48
- // Set seed for deterministic generation FIRST
49
- if (options?.seed !== undefined) {
50
- faker.seed(options.seed);
51
- }
52
-
53
- // Note: faker.js v9 doesn't have setLocale anymore, locales are set differently
54
- // For now, we'll just use the default locale
55
- this.faker = faker;
78
+ protected readonly faker = faker;
79
+ protected readonly guard = new TypeGuard();
80
+ protected options: Required<FakeOptions> = {
81
+ locale: "en",
82
+ seed: 12345,
83
+ optionalProbability: 0.3,
84
+ nullableProbability: 0.2,
85
+ defaultArrayLength: 5,
86
+ maxArrayLength: 20,
87
+ defaultRecordEntries: { min: 2, max: 5 },
88
+ };
89
+
90
+ constructor() {
91
+ this.faker.seed(this.options.seed);
92
+ }
56
93
 
57
- this.guard = new TypeGuard();
94
+ /**
95
+ * Configure generation options.
96
+ * If a seed is provided, the faker instance is reseeded.
97
+ */
98
+ public configure(options: Partial<FakeOptions>): this {
99
+ const oldSeed = this.options.seed;
100
+
101
+ this.options = {
102
+ ...this.options,
103
+ ...options,
104
+ // Merge defaultRecordEntries if provided
105
+ defaultRecordEntries: options.defaultRecordEntries
106
+ ? {
107
+ ...this.options.defaultRecordEntries,
108
+ ...options.defaultRecordEntries,
109
+ }
110
+ : this.options.defaultRecordEntries,
111
+ };
112
+
113
+ // Reseed faker if seed is provided (allows resetting to same seed)
114
+ if (options.seed !== undefined) {
115
+ this.faker.seed(options.seed);
116
+ }
117
+
118
+ return this;
58
119
  }
59
120
 
60
121
  /**
61
122
  * Generate fake data matching the given TypeBox schema.
123
+ *
124
+ * For object schemas, property names are used to generate contextually
125
+ * appropriate values. The following field name patterns are recognized
126
+ * (case-insensitive, underscores and hyphens are ignored):
127
+ *
128
+ * **String fields:**
129
+ * - `email` → email address
130
+ * - `firstName`, `first` → first name
131
+ * - `lastName`, `last` → last name
132
+ * - `fullName`, `name` → full name
133
+ * - `username` → username
134
+ * - `phone`, `mobile` → phone number
135
+ * - `address` → street address
136
+ * - `city` → city name
137
+ * - `country` → country name
138
+ * - `state`, `province` → state/province
139
+ * - `zip`, `postal` → postal code
140
+ * - `company`, `organization` → company name
141
+ * - `job`, `title`, `position` → job title
142
+ * - `url`, `website` → URL
143
+ * - `avatar`, `image`, `photo` → avatar URL
144
+ * - `color`, `colour` → color name
145
+ * - `bio`, `about`, `description` → bio text
146
+ *
147
+ * **Number/Integer fields:**
148
+ * - `age` → 18-99
149
+ * - `year` → past year
150
+ * - `month` → 1-12
151
+ * - `day` → 1-31
152
+ * - `price`, `amount`, `cost` → monetary value
153
+ *
154
+ * @example
155
+ * ```ts
156
+ * const fake = new FakeProvider();
157
+ * const schema = t.object({
158
+ * user_name: t.string(), // generates username
159
+ * firstName: t.string(), // generates first name
160
+ * "e-mail": t.string(), // generates email
161
+ * });
162
+ * const result = fake.generate(schema);
163
+ * ```
62
164
  */
63
165
  public generate<T extends TSchema>(schema: T): StaticDecode<T> {
64
166
  return this.generateValue(schema) as StaticDecode<T>;
@@ -78,7 +180,11 @@ export class FakeProvider {
78
180
  // Handle optional
79
181
  if (this.guard.isOptional(schema)) {
80
182
  // 30% chance of being undefined
81
- if (this.faker.datatype.boolean({ probability: 0.3 })) {
183
+ if (
184
+ this.faker.datatype.boolean({
185
+ probability: this.options.optionalProbability,
186
+ })
187
+ ) {
82
188
  return undefined;
83
189
  }
84
190
  // Generate the inner schema
@@ -92,7 +198,11 @@ export class FakeProvider {
92
198
  const hasNull = union.anyOf.some((s) => this.guard.isNull(s));
93
199
  if (hasNull) {
94
200
  // 20% chance of being null
95
- if (this.faker.datatype.boolean({ probability: 0.2 })) {
201
+ if (
202
+ this.faker.datatype.boolean({
203
+ probability: this.options.nullableProbability,
204
+ })
205
+ ) {
96
206
  return null;
97
207
  }
98
208
  // Pick a non-null option
@@ -354,7 +464,10 @@ export class FakeProvider {
354
464
  protected generateArray(schema: TArray): unknown[] {
355
465
  const schemaAny = schema as any;
356
466
  const minItems = schemaAny.minItems ?? 0;
357
- const maxItems = Math.min(schemaAny.maxItems ?? 5, 5); // Cap at 5 by default
467
+ const maxItems = Math.min(
468
+ schemaAny.maxItems ?? this.options.defaultArrayLength,
469
+ this.options.maxArrayLength,
470
+ );
358
471
  const length = this.faker.number.int({ min: minItems, max: maxItems });
359
472
 
360
473
  return Array.from({ length }, () => this.generateValue(schema.items));
@@ -383,8 +496,9 @@ export class FakeProvider {
383
496
  return this.generateValue(schema);
384
497
  }
385
498
 
386
- // Normalize key name to lowercase for matching
387
- const normalizedKey = keyName.toLowerCase();
499
+ // Normalize key name: lowercase and remove underscores/hyphens
500
+ // This allows matching "user_name", "user-name", "userName" etc.
501
+ const normalizedKey = keyName.toLowerCase().replace(/[_-]/g, "");
388
502
 
389
503
  // Check if this is a string type that could benefit from context
390
504
  if (this.guard.isString(schema)) {
@@ -509,7 +623,7 @@ export class FakeProvider {
509
623
  : record.additionalProperties;
510
624
 
511
625
  // Generate 2-5 random key-value pairs
512
- const count = this.faker.number.int({ min: 2, max: 5 });
626
+ const count = this.faker.number.int(this.options.defaultRecordEntries);
513
627
  const result: Record<string, unknown> = {};
514
628
 
515
629
  for (let i = 0; i < count; i++) {
@@ -15,12 +15,19 @@ export * from "./providers/MemoryLockProvider.ts";
15
15
  // ---------------------------------------------------------------------------------------------------------------------
16
16
 
17
17
  /**
18
- * Lock a resource for a certain period of time.
18
+ * | type | quality | stability |
19
+ * |------|---------|-----------|
20
+ * | backend | rare | stable |
19
21
  *
20
- * This module provides a memory implementation of the lock provider.
21
- * You probably want to use an implementation like RedisLockProvider for distributed systems.
22
+ * Resource locking for distributed systems.
23
+ *
24
+ * **Features:**
25
+ * - Distributed locks with timeout
26
+ * - Time-based lock expiration
27
+ * - Automatic release on scope exit
28
+ * - Distributed coordination via Redis
29
+ * - Providers: Memory (dev), Redis (production)
22
30
  *
23
- * @see {@link $lock}
24
31
  * @module alepha.lock
25
32
  */
26
33
  export const AlephaLock = $module({
@@ -27,72 +27,23 @@ export * from "./services/Logger.ts";
27
27
  // ---------------------------------------------------------------------------------------------------------------------
28
28
 
29
29
  /**
30
- * Minimalist logger module for Alepha.
31
- *
32
- * It offers a global logger interface (info, warn, ...) via the `$logger` primitive.
33
- *
34
- * ```ts
35
- * import { $logger } from "alepha/logger";
36
- *
37
- * class App {
38
- * log = $logger();
39
- * }
40
- * ```
41
- *
42
- * ### Formatting and Destinations
43
- *
44
- * `AlephaLogger` is **extensible**, destinations and formatters can be added or replaced.
45
- *
46
- * Default log destinations are:
47
- * - ConsoleDestinationProvider: logs to the console.
48
- * - MemoryDestinationProvider: stores logs in memory for later retrieval.
49
- *
50
- * Default log formatters are:
51
- * - JsonFormatterProvider: formats logs as JSON.
52
- * - SimpleFormatterProvider: formats logs as simple text (with colors when possible).
53
- * - RawFormatterProvider: formats logs as raw text without any formatting.
54
- *
55
- * ### Event Emission
56
- *
57
- * The logger emits 'log' events that can be listened to by external code, allowing for custom log processing and destinations.
58
- *
59
- * ```ts
60
- * class CustomDestination {
61
- * onLog = $hook({
62
- * on: "log",
63
- * handler: (ev) => {
64
- * // ev.message (formatted message)
65
- * // ev.entry (level, raw message, ...)
66
- * }
67
- * });
68
- * }
69
- * ```
70
- *
71
- * ### Log Level
72
- *
73
- * You can configure the log level and format via environment variables:
74
- *
75
- * - `LOG_LEVEL`: Sets the default log level for the application.
76
- * - `LOG_FORMAT`: Sets the default log format for the application.
77
- *
78
- * ```bash
79
- * LOG_LEVEL=debug LOG_FORMAT=json node src/index.ts
80
- * ```
81
- *
82
- * Log level is also available in the state as `logLevel`, which can be used to dynamically change the log level at runtime.
83
- * ```ts
84
- * alepha.state.set("alepha.logger.level", "debug");
85
- * ```
86
- *
87
- * Log level is $module aware, meaning you can set different log levels for different modules.
88
- *
89
- * **Module-specific configuration:**
90
- * - `LOG_LEVEL=my.module.name:debug,info` - debug for `my.module.name` (and submodules), info for others
91
- * - `LOG_LEVEL=alepha:trace,my.app:error,info` - trace for alepha modules, error for my.app modules, info for others
92
- *
93
- * **Wildcard patterns (NEW):**
94
- * - `LOG_LEVEL=alepha.*:debug,info` - debug for all alepha submodules
95
- * - `LOG_LEVEL=*.test:silent,*.core:trace,info` - silent for test modules, trace for core modules
30
+ * | type | quality | stability |
31
+ * |------|---------|-----------|
32
+ * | tooling | rare | stable |
33
+ *
34
+ * Configurable logging with multiple outputs.
35
+ *
36
+ * **Features:**
37
+ * - Global logger access
38
+ * - JSON format
39
+ * - Pretty colored output
40
+ * - Raw text format
41
+ * - Console destination
42
+ * - Memory destination (for devtools)
43
+ * - Custom handlers
44
+ * - Configuration via `LOG_LEVEL` and `LOG_FORMAT`
45
+ *
46
+ * @module alepha.logger
96
47
  */
97
48
  export const AlephaLogger = $module({
98
49
  name: "alepha.logger",
package/src/mcp/index.ts CHANGED
@@ -93,35 +93,18 @@ export { StdioMcpTransport } from "./transports/StdioMcpTransport.ts";
93
93
  // ---------------------------------------------------------------------------------------------------------------------
94
94
 
95
95
  /**
96
- * Core MCP module with primitives and server provider.
96
+ * | type | quality | stability |
97
+ * |------|---------|-----------|
98
+ * | backend | standard | stable |
97
99
  *
98
- * This module registers the $tool, $resource, and $prompt primitives
99
- * and the McpServerProvider. You need to add a transport module
100
- * (AlephaMcpStdio or AlephaMcpSse) for actual communication.
100
+ * Model Context Protocol for AI tool integration.
101
101
  *
102
- * @example
103
- * ```ts
104
- * import { Alepha, run } from "alepha";
105
- * import { AlephaMcp, AlephaMcpStdio, $tool, t } from "alepha/mcp";
106
- *
107
- * class MyMcpServer {
108
- * add = $tool({
109
- * description: "Add two numbers",
110
- * schema: {
111
- * params: t.object({ a: t.number(), b: t.number() }),
112
- * result: t.number(),
113
- * },
114
- * handler: async ({ params }) => params.a + params.b,
115
- * });
116
- * }
117
- *
118
- * run(
119
- * Alepha.create()
120
- * .with(AlephaMcp)
121
- * .with(AlephaMcpStdio)
122
- * .with(MyMcpServer)
123
- * );
124
- * ```
102
+ * **Features:**
103
+ * - MCP resource definitions
104
+ * - MCP tool definitions
105
+ * - MCP prompt definitions
106
+ * - JSON-RPC protocol
107
+ * - SSE and Stdio transports
125
108
  *
126
109
  * @module alepha.mcp
127
110
  */
@@ -112,14 +112,8 @@ export class SseMcpTransport {
112
112
  message = $route({
113
113
  method: "POST",
114
114
  path: this.env.MCP_SSE_PATH,
115
- secure: false,
116
115
  schema: {
117
116
  body: t.json(),
118
- query: t.object({
119
- token: t.optional(
120
- t.text({ description: "API token for authentication" }),
121
- ),
122
- }),
123
117
  },
124
118
  handler: async (request) => {
125
119
  try {
@@ -141,11 +135,6 @@ export class SseMcpTransport {
141
135
  string | string[] | undefined
142
136
  >;
143
137
 
144
- // Support token as query parameter (for clients that can't set headers)
145
- if (request.query.token && !headers.authorization) {
146
- headers.authorization = `Bearer ${request.query.token}`;
147
- }
148
-
149
138
  const context: McpContext = { headers };
150
139
 
151
140
  const response = await this.mcpServer.handleMessage(
@@ -1,6 +1,6 @@
1
1
  import { Alepha } from "alepha";
2
2
  import { describe, expect, it } from "vitest";
3
- import { $repository, AlephaPostgres } from "../index.ts";
3
+ import { $repository, AlephaOrm } from "../index.ts";
4
4
  import { userEntity } from "./fixtures/userEntitySchema.ts";
5
5
 
6
6
  describe("PostgresProvider", () => {
@@ -9,7 +9,7 @@ describe("PostgresProvider", () => {
9
9
  users = $repository(userEntity);
10
10
  }
11
11
 
12
- const alepha = Alepha.create().with(AlephaPostgres);
12
+ const alepha = Alepha.create().with(AlephaOrm);
13
13
 
14
14
  const userService = alepha.inject(UserService);
15
15
 
@@ -3,8 +3,8 @@ import { AlephaDateTime } from "alepha/datetime";
3
3
 
4
4
  export * from "./index.shared.ts";
5
5
 
6
- export const AlephaPostgres = $module({
7
- name: "alepha.postgres",
6
+ export const AlephaOrm = $module({
7
+ name: "alepha.orm",
8
8
  primitives: [],
9
9
  services: [AlephaDateTime],
10
10
  });
@@ -15,12 +15,14 @@ import { QueryManager } from "./services/QueryManager.ts";
15
15
  import { Repository } from "./services/Repository.ts";
16
16
  import { SqliteModelBuilder } from "./services/SqliteModelBuilder.ts";
17
17
 
18
+ export const SqliteProvider = BunSqliteProvider;
19
+
18
20
  export * from "./index.shared-server.ts";
19
21
  export * from "./providers/drivers/BunPostgresProvider.ts";
20
22
  export * from "./providers/drivers/BunSqliteProvider.ts";
21
23
 
22
- export const AlephaPostgres = $module({
23
- name: "alepha.postgres",
24
+ export const AlephaOrm = $module({
25
+ name: "alepha.orm",
24
26
  primitives: [$sequence, $entity],
25
27
  services: [
26
28
  AlephaDateTime,
@@ -50,7 +52,7 @@ export const AlephaPostgres = $module({
50
52
  const url = env.DATABASE_URL;
51
53
  const isPostgres = url?.startsWith("postgres:");
52
54
 
53
- if (url?.startsWith("cloudflare-d1:")) {
55
+ if (url?.startsWith("d1:")) {
54
56
  alepha.with({
55
57
  optional: true,
56
58
  provide: DatabaseProvider,
package/src/orm/index.ts CHANGED
@@ -94,61 +94,35 @@ export * from "./providers/drivers/BunSqliteProvider.ts";
94
94
  export * from "./providers/drivers/NodePostgresProvider.ts";
95
95
  export * from "./providers/drivers/NodeSqliteProvider.ts";
96
96
 
97
+ export const SqliteProvider = NodeSqliteProvider;
98
+
97
99
  // ---------------------------------------------------------------------------------------------------------------------
98
100
 
99
101
  /**
100
- * Postgres client based on Drizzle ORM, Alepha type-safe friendly.
101
- *
102
- * Automatically selects the appropriate provider based on runtime:
103
- * - Bun: Uses `BunPostgresProvider` or `BunSqliteProvider`
104
- * - Node.js: Uses `NodePostgresProvider` or `NodeSqliteProvider`
105
- *
106
- * ```ts
107
- * import { t } from "alepha";
108
- * import { $entity, $repository, db } from "alepha/postgres";
109
- *
110
- * const users = $entity({
111
- * name: "users",
112
- * schema: t.object({
113
- * id: db.primaryKey(),
114
- * name: t.text(),
115
- * email: t.text(),
116
- * }),
117
- * });
118
- *
119
- * class App {
120
- * users = $repository(users);
121
- *
122
- * getUserByName(name: string) {
123
- * return this.users.findOne({ name: { eq: name } });
124
- * }
125
- * }
126
- * ```
127
- *
128
- * This is not a full ORM, but rather a set of tools to work with Postgres databases in a type-safe way.
102
+ * | type | quality | stability |
103
+ * |------|---------|-----------|
104
+ * | backend | epic | stable |
129
105
  *
130
- * It provides:
131
- * - A type-safe way to define entities and repositories. (via `$entity` and `$repository`)
132
- * - Custom query builders and filters.
133
- * - Built-in special columns like `createdAt`, `updatedAt`, `deletedAt`, `version`.
134
- * - Automatic JSONB support.
135
- * - Automatic synchronization of entities with the database schema (for testing and development).
136
- * - Fallback to raw SQL via Drizzle ORM `sql` function.
106
+ * Full-featured database abstraction built on Drizzle ORM with complete type safety.
137
107
  *
138
- * Migrations are supported via Drizzle ORM, you need to use the `drizzle-kit` CLI tool to generate and run migrations.
108
+ * **Features:**
109
+ * - Define database entities with TypeBox schemas
110
+ * - Automatic timestamps, soft deletes, and versioning columns
111
+ * - Type-safe CRUD operations with filtering, pagination, sorting, and relationships
112
+ * - Database transaction support with automatic rollback
113
+ * - Auto-incrementing sequences for IDs
114
+ * - PostgreSQL support (Node.js, Bun, Cloudflare Workers via pglite)
115
+ * - SQLite support (Node.js, Bun, Cloudflare D1)
116
+ * - Automatic schema sync for development/testing
117
+ * - Drizzle Kit migrations for production
118
+ * - Type-safe filters: `eq`, `ne`, `gt`, `gte`, `lt`, `lte`, `in`, `nin`, `like`, `between`
119
+ * - JSONB column support
120
+ * - Relationship joins
139
121
  *
140
- * @see {@link $entity}
141
- * @see {@link $sequence}
142
- * @see {@link $repository}
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
148
122
  * @module alepha.postgres
149
123
  */
150
- export const AlephaPostgres = $module({
151
- name: "alepha.postgres",
124
+ export const AlephaOrm = $module({
125
+ name: "alepha.orm",
152
126
  primitives: [$sequence, $entity],
153
127
  services: [
154
128
  AlephaDateTime,
@@ -178,14 +152,10 @@ export const AlephaPostgres = $module({
178
152
  alepha.with(RepositoryProvider);
179
153
 
180
154
  const url = env.DATABASE_URL;
181
- const hasPGlite = !!PglitePostgresProvider.importPglite();
182
155
  const isPostgres = url?.startsWith("postgres:");
183
- const isSqlite = url?.startsWith("sqlite:");
184
- const isMemory = url?.includes(":memory:");
185
- const isFile = !!url && !isPostgres && !isMemory;
186
156
  const isBun = alepha.isBun();
187
157
 
188
- if (url?.startsWith("cloudflare-d1:")) {
158
+ if (url?.startsWith("d1:")) {
189
159
  alepha.with({
190
160
  optional: true,
191
161
  provide: DatabaseProvider,
@@ -194,7 +164,7 @@ export const AlephaPostgres = $module({
194
164
  return;
195
165
  }
196
166
 
197
- if (hasPGlite && (isMemory || isFile || !url) && !isSqlite) {
167
+ if (url?.startsWith("pglite:")) {
198
168
  alepha.with({
199
169
  optional: true,
200
170
  provide: DatabaseProvider,
@@ -154,7 +154,10 @@ export class BunSqliteProvider extends DatabaseProvider {
154
154
  },
155
155
  });
156
156
 
157
- await this.migrate();
157
+ // Never migrate in serverless mode - migrations should be applied during deployment
158
+ if (!this.alepha.isServerless()) {
159
+ await this.migrate();
160
+ }
158
161
 
159
162
  this.log.info(`Using Bun SQLite database at ${filepath}`);
160
163
  },
@@ -162,6 +165,7 @@ export class BunSqliteProvider extends DatabaseProvider {
162
165
 
163
166
  protected readonly onStop = $hook({
164
167
  on: "stop",
168
+ priority: "last",
165
169
  handler: async () => {
166
170
  if (this.sqlite) {
167
171
  this.log.debug("Closing Bun SQLite connection...");