alepha 0.15.0 → 0.15.2

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 (551) hide show
  1. package/README.md +43 -98
  2. package/dist/api/audits/index.d.ts +630 -653
  3. package/dist/api/audits/index.d.ts.map +1 -1
  4. package/dist/api/audits/index.js +12 -35
  5. package/dist/api/audits/index.js.map +1 -1
  6. package/dist/api/files/index.d.ts +365 -358
  7. package/dist/api/files/index.d.ts.map +1 -1
  8. package/dist/api/files/index.js +12 -5
  9. package/dist/api/files/index.js.map +1 -1
  10. package/dist/api/jobs/index.d.ts +255 -248
  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.browser.js +4 -4
  19. package/dist/api/notifications/index.browser.js.map +1 -1
  20. package/dist/api/notifications/index.d.ts +84 -78
  21. package/dist/api/notifications/index.d.ts.map +1 -1
  22. package/dist/api/notifications/index.js +14 -8
  23. package/dist/api/notifications/index.js.map +1 -1
  24. package/dist/api/parameters/index.d.ts +528 -535
  25. package/dist/api/parameters/index.d.ts.map +1 -1
  26. package/dist/api/parameters/index.js +30 -37
  27. package/dist/api/parameters/index.js.map +1 -1
  28. package/dist/api/users/index.d.ts +1221 -910
  29. package/dist/api/users/index.d.ts.map +1 -1
  30. package/dist/api/users/index.js +2556 -248
  31. package/dist/api/users/index.js.map +1 -1
  32. package/dist/api/verifications/index.d.ts +142 -136
  33. package/dist/api/verifications/index.d.ts.map +1 -1
  34. package/dist/api/verifications/index.js +12 -4
  35. package/dist/api/verifications/index.js.map +1 -1
  36. package/dist/batch/index.d.ts +142 -162
  37. package/dist/batch/index.d.ts.map +1 -1
  38. package/dist/batch/index.js +31 -44
  39. package/dist/batch/index.js.map +1 -1
  40. package/dist/bucket/index.d.ts +595 -171
  41. package/dist/bucket/index.d.ts.map +1 -1
  42. package/dist/bucket/index.js +1856 -12
  43. package/dist/bucket/index.js.map +1 -1
  44. package/dist/cache/core/index.d.ts +225 -53
  45. package/dist/cache/core/index.d.ts.map +1 -1
  46. package/dist/cache/core/index.js +213 -7
  47. package/dist/cache/core/index.js.map +1 -1
  48. package/dist/cache/redis/index.d.ts +1 -0
  49. package/dist/cache/redis/index.d.ts.map +1 -1
  50. package/dist/cache/redis/index.js +6 -2
  51. package/dist/cache/redis/index.js.map +1 -1
  52. package/dist/cli/index.d.ts +834 -226
  53. package/dist/cli/index.d.ts.map +1 -1
  54. package/dist/cli/index.js +2872 -417
  55. package/dist/cli/index.js.map +1 -1
  56. package/dist/command/index.d.ts +458 -310
  57. package/dist/command/index.d.ts.map +1 -1
  58. package/dist/command/index.js +2011 -76
  59. package/dist/command/index.js.map +1 -1
  60. package/dist/core/index.browser.js +309 -97
  61. package/dist/core/index.browser.js.map +1 -1
  62. package/dist/core/index.d.ts +796 -701
  63. package/dist/core/index.d.ts.map +1 -1
  64. package/dist/core/index.js +329 -97
  65. package/dist/core/index.js.map +1 -1
  66. package/dist/core/index.native.js +309 -97
  67. package/dist/core/index.native.js.map +1 -1
  68. package/dist/datetime/index.d.ts +59 -44
  69. package/dist/datetime/index.d.ts.map +1 -1
  70. package/dist/datetime/index.js +15 -0
  71. package/dist/datetime/index.js.map +1 -1
  72. package/dist/email/index.d.ts +314 -19
  73. package/dist/email/index.d.ts.map +1 -1
  74. package/dist/email/index.js +1852 -7
  75. package/dist/email/index.js.map +1 -1
  76. package/dist/fake/index.d.ts +5500 -5418
  77. package/dist/fake/index.d.ts.map +1 -1
  78. package/dist/fake/index.js +113 -42
  79. package/dist/fake/index.js.map +1 -1
  80. package/dist/lock/core/index.d.ts +219 -212
  81. package/dist/lock/core/index.d.ts.map +1 -1
  82. package/dist/lock/core/index.js +11 -4
  83. package/dist/lock/core/index.js.map +1 -1
  84. package/dist/lock/redis/index.d.ts.map +1 -1
  85. package/dist/logger/index.d.ts +41 -90
  86. package/dist/logger/index.d.ts.map +1 -1
  87. package/dist/logger/index.js +15 -68
  88. package/dist/logger/index.js.map +1 -1
  89. package/dist/mcp/index.d.ts +228 -230
  90. package/dist/mcp/index.d.ts.map +1 -1
  91. package/dist/mcp/index.js +32 -31
  92. package/dist/mcp/index.js.map +1 -1
  93. package/dist/orm/index.browser.js +12 -12
  94. package/dist/orm/index.browser.js.map +1 -1
  95. package/dist/orm/index.bun.js +90 -80
  96. package/dist/orm/index.bun.js.map +1 -1
  97. package/dist/orm/index.d.ts +1434 -1459
  98. package/dist/orm/index.d.ts.map +1 -1
  99. package/dist/orm/index.js +112 -130
  100. package/dist/orm/index.js.map +1 -1
  101. package/dist/queue/core/index.d.ts +262 -254
  102. package/dist/queue/core/index.d.ts.map +1 -1
  103. package/dist/queue/core/index.js +14 -6
  104. package/dist/queue/core/index.js.map +1 -1
  105. package/dist/queue/redis/index.d.ts.map +1 -1
  106. package/dist/react/auth/index.browser.js +108 -0
  107. package/dist/react/auth/index.browser.js.map +1 -0
  108. package/dist/react/auth/index.d.ts +100 -0
  109. package/dist/react/auth/index.d.ts.map +1 -0
  110. package/dist/react/auth/index.js +145 -0
  111. package/dist/react/auth/index.js.map +1 -0
  112. package/dist/react/core/index.d.ts +469 -0
  113. package/dist/react/core/index.d.ts.map +1 -0
  114. package/dist/react/core/index.js +464 -0
  115. package/dist/react/core/index.js.map +1 -0
  116. package/dist/react/form/index.d.ts +232 -0
  117. package/dist/react/form/index.d.ts.map +1 -0
  118. package/dist/react/form/index.js +432 -0
  119. package/dist/react/form/index.js.map +1 -0
  120. package/dist/react/head/index.browser.js +423 -0
  121. package/dist/react/head/index.browser.js.map +1 -0
  122. package/dist/react/head/index.d.ts +288 -0
  123. package/dist/react/head/index.d.ts.map +1 -0
  124. package/dist/react/head/index.js +465 -0
  125. package/dist/react/head/index.js.map +1 -0
  126. package/dist/react/i18n/index.d.ts +175 -0
  127. package/dist/react/i18n/index.d.ts.map +1 -0
  128. package/dist/react/i18n/index.js +224 -0
  129. package/dist/react/i18n/index.js.map +1 -0
  130. package/dist/react/router/index.browser.js +1980 -0
  131. package/dist/react/router/index.browser.js.map +1 -0
  132. package/dist/react/router/index.d.ts +2068 -0
  133. package/dist/react/router/index.d.ts.map +1 -0
  134. package/dist/react/router/index.js +4932 -0
  135. package/dist/react/router/index.js.map +1 -0
  136. package/dist/react/websocket/index.d.ts +117 -0
  137. package/dist/react/websocket/index.d.ts.map +1 -0
  138. package/dist/react/websocket/index.js +107 -0
  139. package/dist/react/websocket/index.js.map +1 -0
  140. package/dist/redis/index.bun.js +4 -0
  141. package/dist/redis/index.bun.js.map +1 -1
  142. package/dist/redis/index.d.ts +127 -130
  143. package/dist/redis/index.d.ts.map +1 -1
  144. package/dist/redis/index.js +16 -25
  145. package/dist/redis/index.js.map +1 -1
  146. package/dist/retry/index.d.ts +80 -71
  147. package/dist/retry/index.d.ts.map +1 -1
  148. package/dist/retry/index.js +11 -2
  149. package/dist/retry/index.js.map +1 -1
  150. package/dist/router/index.d.ts +6 -6
  151. package/dist/router/index.d.ts.map +1 -1
  152. package/dist/scheduler/index.d.ts +119 -28
  153. package/dist/scheduler/index.d.ts.map +1 -1
  154. package/dist/scheduler/index.js +404 -3
  155. package/dist/scheduler/index.js.map +1 -1
  156. package/dist/security/index.d.ts +642 -228
  157. package/dist/security/index.d.ts.map +1 -1
  158. package/dist/security/index.js +1579 -37
  159. package/dist/security/index.js.map +1 -1
  160. package/dist/server/auth/index.d.ts +1141 -111
  161. package/dist/server/auth/index.d.ts.map +1 -1
  162. package/dist/server/auth/index.js +1261 -25
  163. package/dist/server/auth/index.js.map +1 -1
  164. package/dist/server/cache/index.d.ts +63 -78
  165. package/dist/server/cache/index.d.ts.map +1 -1
  166. package/dist/server/cache/index.js +7 -22
  167. package/dist/server/cache/index.js.map +1 -1
  168. package/dist/server/compress/index.d.ts +13 -5
  169. package/dist/server/compress/index.d.ts.map +1 -1
  170. package/dist/server/compress/index.js +10 -2
  171. package/dist/server/compress/index.js.map +1 -1
  172. package/dist/server/cookies/index.d.ts +46 -22
  173. package/dist/server/cookies/index.d.ts.map +1 -1
  174. package/dist/server/cookies/index.js +7 -5
  175. package/dist/server/cookies/index.js.map +1 -1
  176. package/dist/server/core/index.d.ts +307 -196
  177. package/dist/server/core/index.d.ts.map +1 -1
  178. package/dist/server/core/index.js +271 -38
  179. package/dist/server/core/index.js.map +1 -1
  180. package/dist/server/cors/index.d.ts +24 -34
  181. package/dist/server/cors/index.d.ts.map +1 -1
  182. package/dist/server/cors/index.js +7 -21
  183. package/dist/server/cors/index.js.map +1 -1
  184. package/dist/server/health/index.d.ts +25 -19
  185. package/dist/server/health/index.d.ts.map +1 -1
  186. package/dist/server/health/index.js +8 -2
  187. package/dist/server/health/index.js.map +1 -1
  188. package/dist/server/helmet/index.d.ts +13 -5
  189. package/dist/server/helmet/index.d.ts.map +1 -1
  190. package/dist/server/helmet/index.js +11 -3
  191. package/dist/server/helmet/index.js.map +1 -1
  192. package/dist/server/links/index.browser.js +9 -1
  193. package/dist/server/links/index.browser.js.map +1 -1
  194. package/dist/server/links/index.d.ts +133 -128
  195. package/dist/server/links/index.d.ts.map +1 -1
  196. package/dist/server/links/index.js +24 -11
  197. package/dist/server/links/index.js.map +1 -1
  198. package/dist/server/metrics/index.d.ts +524 -4
  199. package/dist/server/metrics/index.d.ts.map +1 -1
  200. package/dist/server/metrics/index.js +4472 -7
  201. package/dist/server/metrics/index.js.map +1 -1
  202. package/dist/server/multipart/index.d.ts +15 -9
  203. package/dist/server/multipart/index.d.ts.map +1 -1
  204. package/dist/server/multipart/index.js +9 -3
  205. package/dist/server/multipart/index.js.map +1 -1
  206. package/dist/server/proxy/index.d.ts +110 -104
  207. package/dist/server/proxy/index.d.ts.map +1 -1
  208. package/dist/server/proxy/index.js +8 -2
  209. package/dist/server/proxy/index.js.map +1 -1
  210. package/dist/server/rate-limit/index.d.ts +46 -51
  211. package/dist/server/rate-limit/index.d.ts.map +1 -1
  212. package/dist/server/rate-limit/index.js +18 -55
  213. package/dist/server/rate-limit/index.js.map +1 -1
  214. package/dist/server/static/index.d.ts +181 -48
  215. package/dist/server/static/index.d.ts.map +1 -1
  216. package/dist/server/static/index.js +1848 -5
  217. package/dist/server/static/index.js.map +1 -1
  218. package/dist/server/swagger/index.d.ts +348 -53
  219. package/dist/server/swagger/index.d.ts.map +1 -1
  220. package/dist/server/swagger/index.js +1849 -6
  221. package/dist/server/swagger/index.js.map +1 -1
  222. package/dist/sms/index.d.ts +312 -18
  223. package/dist/sms/index.d.ts.map +1 -1
  224. package/dist/sms/index.js +1854 -10
  225. package/dist/sms/index.js.map +1 -1
  226. package/dist/system/index.browser.js +496 -0
  227. package/dist/system/index.browser.js.map +1 -0
  228. package/dist/system/index.d.ts +1158 -0
  229. package/dist/system/index.d.ts.map +1 -0
  230. package/dist/{file → system}/index.js +412 -20
  231. package/dist/system/index.js.map +1 -0
  232. package/dist/thread/index.d.ts +82 -73
  233. package/dist/thread/index.d.ts.map +1 -1
  234. package/dist/thread/index.js +13 -4
  235. package/dist/thread/index.js.map +1 -1
  236. package/dist/topic/core/index.d.ts +330 -323
  237. package/dist/topic/core/index.d.ts.map +1 -1
  238. package/dist/topic/core/index.js +12 -5
  239. package/dist/topic/core/index.js.map +1 -1
  240. package/dist/topic/redis/index.d.ts +6 -6
  241. package/dist/topic/redis/index.d.ts.map +1 -1
  242. package/dist/vite/index.d.ts +163 -5825
  243. package/dist/vite/index.d.ts.map +1 -1
  244. package/dist/vite/index.js +130 -477
  245. package/dist/vite/index.js.map +1 -1
  246. package/dist/websocket/index.browser.js +3 -3
  247. package/dist/websocket/index.browser.js.map +1 -1
  248. package/dist/websocket/index.d.ts +287 -283
  249. package/dist/websocket/index.d.ts.map +1 -1
  250. package/dist/websocket/index.js +15 -11
  251. package/dist/websocket/index.js.map +1 -1
  252. package/package.json +86 -17
  253. package/src/api/audits/index.ts +10 -33
  254. package/src/api/files/__tests__/$bucket.spec.ts +1 -1
  255. package/src/api/files/controllers/AdminFileStatsController.spec.ts +1 -1
  256. package/src/api/files/controllers/FileController.spec.ts +1 -1
  257. package/src/api/files/index.ts +10 -3
  258. package/src/api/files/jobs/FileJobs.spec.ts +1 -1
  259. package/src/api/files/services/FileService.spec.ts +1 -1
  260. package/src/api/jobs/index.ts +10 -3
  261. package/src/api/keys/controllers/AdminApiKeyController.ts +75 -0
  262. package/src/api/keys/controllers/ApiKeyController.ts +103 -0
  263. package/src/api/keys/entities/apiKeyEntity.ts +41 -0
  264. package/src/api/keys/index.ts +49 -0
  265. package/src/api/keys/schemas/adminApiKeyQuerySchema.ts +7 -0
  266. package/src/api/keys/schemas/adminApiKeyResourceSchema.ts +17 -0
  267. package/src/api/keys/schemas/createApiKeyBodySchema.ts +7 -0
  268. package/src/api/keys/schemas/createApiKeyResponseSchema.ts +11 -0
  269. package/src/api/keys/schemas/listApiKeyResponseSchema.ts +15 -0
  270. package/src/api/keys/schemas/revokeApiKeyParamsSchema.ts +5 -0
  271. package/src/api/keys/schemas/revokeApiKeyResponseSchema.ts +5 -0
  272. package/src/api/keys/services/ApiKeyService.spec.ts +553 -0
  273. package/src/api/keys/services/ApiKeyService.ts +306 -0
  274. package/src/api/logs/TODO.md +52 -0
  275. package/src/api/notifications/index.ts +10 -4
  276. package/src/api/parameters/index.ts +9 -30
  277. package/src/api/parameters/primitives/$config.ts +12 -4
  278. package/src/api/parameters/services/ConfigStore.ts +9 -3
  279. package/src/api/users/__tests__/ApiKeys-integration.spec.ts +1035 -0
  280. package/src/api/users/__tests__/ApiKeys.spec.ts +401 -0
  281. package/src/api/users/index.ts +14 -3
  282. package/src/api/users/primitives/$realm.ts +33 -5
  283. package/src/api/users/providers/RealmProvider.ts +1 -12
  284. package/src/api/users/services/SessionService.ts +1 -11
  285. package/src/api/verifications/controllers/VerificationController.ts +2 -0
  286. package/src/api/verifications/index.ts +10 -4
  287. package/src/batch/index.ts +9 -36
  288. package/src/batch/primitives/$batch.ts +0 -8
  289. package/src/batch/providers/BatchProvider.ts +29 -2
  290. package/src/bucket/__tests__/shared.ts +1 -1
  291. package/src/bucket/index.ts +13 -6
  292. package/src/bucket/primitives/$bucket.ts +1 -1
  293. package/src/bucket/providers/LocalFileStorageProvider.ts +1 -1
  294. package/src/bucket/providers/MemoryFileStorageProvider.ts +1 -1
  295. package/src/cache/core/__tests__/shared.ts +30 -0
  296. package/src/cache/core/index.ts +11 -6
  297. package/src/cache/core/primitives/$cache.spec.ts +5 -0
  298. package/src/cache/core/providers/CacheProvider.ts +17 -0
  299. package/src/cache/core/providers/MemoryCacheProvider.ts +300 -1
  300. package/src/cache/redis/__tests__/cache-redis.spec.ts +5 -0
  301. package/src/cache/redis/providers/RedisCacheProvider.ts +9 -0
  302. package/src/cli/apps/AlephaCli.ts +3 -16
  303. package/src/cli/apps/AlephaPackageBuilderCli.ts +10 -2
  304. package/src/cli/atoms/appEntryOptions.ts +13 -0
  305. package/src/cli/atoms/buildOptions.ts +1 -1
  306. package/src/cli/atoms/changelogOptions.ts +1 -1
  307. package/src/cli/commands/build.ts +64 -52
  308. package/src/cli/commands/db.ts +17 -11
  309. package/src/cli/commands/deploy.ts +1 -1
  310. package/src/cli/commands/dev.ts +13 -49
  311. package/src/cli/commands/gen/env.ts +6 -3
  312. package/src/cli/commands/gen/openapi.ts +5 -2
  313. package/src/cli/commands/init.spec.ts +544 -0
  314. package/src/cli/commands/init.ts +101 -58
  315. package/src/cli/commands/lint.ts +8 -2
  316. package/src/cli/commands/typecheck.ts +11 -0
  317. package/src/cli/defineConfig.ts +9 -0
  318. package/src/cli/index.ts +2 -1
  319. package/src/cli/providers/AppEntryProvider.ts +131 -0
  320. package/src/cli/providers/ViteBuildProvider.ts +40 -0
  321. package/src/cli/providers/ViteDevServerProvider.ts +378 -0
  322. package/src/cli/services/AlephaCliUtils.ts +39 -93
  323. package/src/cli/services/PackageManagerUtils.ts +140 -17
  324. package/src/cli/services/ProjectScaffolder.ts +169 -101
  325. package/src/cli/services/ViteUtils.ts +82 -0
  326. package/src/cli/{assets/claudeMd.ts → templates/agentMd.ts} +41 -28
  327. package/src/cli/{assets → templates}/apiHelloControllerTs.ts +2 -1
  328. package/src/cli/{assets → templates}/biomeJson.ts +2 -1
  329. package/src/cli/{assets → templates}/dummySpecTs.ts +2 -1
  330. package/src/cli/{assets → templates}/editorconfig.ts +2 -1
  331. package/src/cli/templates/gitignore.ts +39 -0
  332. package/src/cli/{assets → templates}/mainBrowserTs.ts +2 -1
  333. package/src/cli/templates/mainCss.ts +33 -0
  334. package/src/cli/templates/mainServerTs.ts +33 -0
  335. package/src/cli/{assets → templates}/tsconfigJson.ts +2 -1
  336. package/src/cli/templates/webAppRouterTs.ts +50 -0
  337. package/src/cli/templates/webHelloComponentTsx.ts +20 -0
  338. package/src/command/helpers/Runner.spec.ts +4 -0
  339. package/src/command/helpers/Runner.ts +3 -21
  340. package/src/command/index.ts +12 -4
  341. package/src/command/providers/CliProvider.spec.ts +1067 -0
  342. package/src/command/providers/CliProvider.ts +203 -40
  343. package/src/core/Alepha.ts +3 -9
  344. package/src/core/__tests__/Alepha-start.spec.ts +4 -4
  345. package/src/core/helpers/jsonSchemaToTypeBox.spec.ts +771 -0
  346. package/src/core/helpers/jsonSchemaToTypeBox.ts +62 -10
  347. package/src/core/index.shared.ts +1 -0
  348. package/src/core/index.ts +20 -0
  349. package/src/core/primitives/$module.ts +12 -0
  350. package/src/core/providers/EventManager.spec.ts +0 -71
  351. package/src/core/providers/EventManager.ts +3 -15
  352. package/src/core/providers/Json.ts +2 -14
  353. package/src/core/providers/KeylessJsonSchemaCodec.spec.ts +257 -0
  354. package/src/core/providers/KeylessJsonSchemaCodec.ts +396 -14
  355. package/src/core/providers/SchemaValidator.spec.ts +236 -0
  356. package/src/datetime/index.ts +15 -0
  357. package/src/email/index.ts +10 -5
  358. package/src/email/providers/LocalEmailProvider.spec.ts +1 -1
  359. package/src/email/providers/LocalEmailProvider.ts +1 -1
  360. package/src/fake/__tests__/keyName.example.ts +1 -1
  361. package/src/fake/__tests__/keyName.spec.ts +5 -5
  362. package/src/fake/index.ts +9 -6
  363. package/src/fake/providers/FakeProvider.spec.ts +258 -40
  364. package/src/fake/providers/FakeProvider.ts +133 -19
  365. package/src/lock/core/index.ts +11 -4
  366. package/src/logger/index.ts +17 -66
  367. package/src/logger/providers/PrettyFormatterProvider.ts +0 -9
  368. package/src/mcp/errors/McpError.ts +30 -0
  369. package/src/mcp/index.ts +13 -27
  370. package/src/mcp/transports/SseMcpTransport.ts +6 -7
  371. package/src/orm/__tests__/PostgresProvider.spec.ts +2 -2
  372. package/src/orm/index.browser.ts +2 -2
  373. package/src/orm/index.bun.ts +4 -2
  374. package/src/orm/index.ts +21 -47
  375. package/src/orm/providers/DrizzleKitProvider.ts +3 -5
  376. package/src/orm/providers/drivers/BunSqliteProvider.ts +1 -0
  377. package/src/orm/services/Repository.ts +18 -3
  378. package/src/queue/core/index.ts +14 -6
  379. package/src/react/auth/__tests__/$auth.spec.ts +202 -0
  380. package/src/react/auth/hooks/useAuth.ts +32 -0
  381. package/src/react/auth/index.browser.ts +13 -0
  382. package/src/react/auth/index.shared.ts +2 -0
  383. package/src/react/auth/index.ts +48 -0
  384. package/src/react/auth/providers/ReactAuthProvider.ts +16 -0
  385. package/src/react/auth/services/ReactAuth.ts +135 -0
  386. package/src/react/core/__tests__/Router.spec.tsx +169 -0
  387. package/src/react/core/components/ClientOnly.tsx +49 -0
  388. package/src/react/core/components/ErrorBoundary.tsx +73 -0
  389. package/src/react/core/contexts/AlephaContext.ts +7 -0
  390. package/src/react/core/contexts/AlephaProvider.tsx +42 -0
  391. package/src/react/core/hooks/useAction.browser.spec.tsx +569 -0
  392. package/src/react/core/hooks/useAction.ts +480 -0
  393. package/src/react/core/hooks/useAlepha.ts +26 -0
  394. package/src/react/core/hooks/useClient.ts +17 -0
  395. package/src/react/core/hooks/useEvents.ts +51 -0
  396. package/src/react/core/hooks/useInject.ts +12 -0
  397. package/src/react/core/hooks/useStore.ts +52 -0
  398. package/src/react/core/index.ts +90 -0
  399. package/src/react/form/components/FormState.tsx +17 -0
  400. package/src/react/form/errors/FormValidationError.ts +18 -0
  401. package/src/react/form/hooks/useForm.browser.spec.tsx +366 -0
  402. package/src/react/form/hooks/useForm.ts +47 -0
  403. package/src/react/form/hooks/useFormState.ts +130 -0
  404. package/src/react/form/index.ts +44 -0
  405. package/src/react/form/services/FormModel.ts +614 -0
  406. package/src/react/head/helpers/SeoExpander.spec.ts +203 -0
  407. package/src/react/head/helpers/SeoExpander.ts +142 -0
  408. package/src/react/head/hooks/useHead.spec.tsx +288 -0
  409. package/src/react/head/hooks/useHead.ts +62 -0
  410. package/src/react/head/index.browser.ts +26 -0
  411. package/src/react/head/index.ts +44 -0
  412. package/src/react/head/interfaces/Head.ts +105 -0
  413. package/src/react/head/primitives/$head.ts +25 -0
  414. package/src/react/head/providers/BrowserHeadProvider.browser.spec.ts +196 -0
  415. package/src/react/head/providers/BrowserHeadProvider.ts +212 -0
  416. package/src/react/head/providers/HeadProvider.ts +168 -0
  417. package/src/react/head/providers/ServerHeadProvider.ts +31 -0
  418. package/src/react/i18n/__tests__/integration.spec.tsx +239 -0
  419. package/src/react/i18n/components/Localize.spec.tsx +357 -0
  420. package/src/react/i18n/components/Localize.tsx +35 -0
  421. package/src/react/i18n/hooks/useI18n.browser.spec.tsx +438 -0
  422. package/src/react/i18n/hooks/useI18n.ts +18 -0
  423. package/src/react/i18n/index.ts +41 -0
  424. package/src/react/i18n/primitives/$dictionary.ts +69 -0
  425. package/src/react/i18n/providers/I18nProvider.spec.ts +389 -0
  426. package/src/react/i18n/providers/I18nProvider.ts +278 -0
  427. package/src/react/router/__tests__/page-head-browser.browser.spec.ts +95 -0
  428. package/src/react/router/__tests__/page-head.spec.ts +48 -0
  429. package/src/react/router/__tests__/seo-head.spec.ts +125 -0
  430. package/src/react/router/atoms/ssrManifestAtom.ts +58 -0
  431. package/src/react/router/components/ErrorViewer.tsx +872 -0
  432. package/src/react/router/components/Link.tsx +23 -0
  433. package/src/react/router/components/NestedView.tsx +223 -0
  434. package/src/react/router/components/NotFound.tsx +30 -0
  435. package/src/react/router/constants/PAGE_PRELOAD_KEY.ts +6 -0
  436. package/src/react/router/contexts/RouterLayerContext.ts +12 -0
  437. package/src/react/router/errors/Redirection.ts +28 -0
  438. package/src/react/router/hooks/useActive.ts +52 -0
  439. package/src/react/router/hooks/useQueryParams.ts +63 -0
  440. package/src/react/router/hooks/useRouter.ts +20 -0
  441. package/src/react/router/hooks/useRouterState.ts +11 -0
  442. package/src/react/router/index.browser.ts +45 -0
  443. package/src/react/router/index.shared.ts +19 -0
  444. package/src/react/router/index.ts +142 -0
  445. package/src/react/router/primitives/$page.browser.spec.tsx +851 -0
  446. package/src/react/router/primitives/$page.spec.tsx +708 -0
  447. package/src/react/router/primitives/$page.ts +497 -0
  448. package/src/react/router/providers/ReactBrowserProvider.ts +309 -0
  449. package/src/react/router/providers/ReactBrowserRendererProvider.ts +25 -0
  450. package/src/react/router/providers/ReactBrowserRouterProvider.ts +168 -0
  451. package/src/react/router/providers/ReactPageProvider.ts +726 -0
  452. package/src/react/router/providers/ReactServerProvider.spec.tsx +316 -0
  453. package/src/react/router/providers/ReactServerProvider.ts +558 -0
  454. package/src/react/router/providers/ReactServerTemplateProvider.ts +979 -0
  455. package/src/react/router/providers/SSRManifestProvider.ts +334 -0
  456. package/src/react/router/services/ReactPageServerService.ts +48 -0
  457. package/src/react/router/services/ReactPageService.ts +27 -0
  458. package/src/react/router/services/ReactRouter.ts +262 -0
  459. package/src/react/websocket/hooks/useRoom.tsx +242 -0
  460. package/src/react/websocket/index.ts +7 -0
  461. package/src/redis/__tests__/redis.spec.ts +13 -0
  462. package/src/redis/index.ts +9 -25
  463. package/src/redis/providers/BunRedisProvider.ts +9 -0
  464. package/src/redis/providers/NodeRedisProvider.ts +8 -0
  465. package/src/redis/providers/RedisProvider.ts +16 -0
  466. package/src/retry/index.ts +11 -2
  467. package/src/router/index.ts +15 -0
  468. package/src/scheduler/index.ts +11 -2
  469. package/src/security/__tests__/BasicAuth.spec.ts +2 -0
  470. package/src/security/__tests__/ServerSecurityProvider.spec.ts +13 -5
  471. package/src/security/index.ts +15 -10
  472. package/src/security/interfaces/IssuerResolver.ts +27 -0
  473. package/src/security/primitives/$issuer.ts +55 -0
  474. package/src/security/providers/SecurityProvider.ts +179 -0
  475. package/src/security/providers/ServerBasicAuthProvider.ts +6 -2
  476. package/src/security/providers/ServerSecurityProvider.ts +36 -22
  477. package/src/server/auth/index.ts +12 -7
  478. package/src/server/cache/index.ts +7 -22
  479. package/src/server/compress/index.ts +10 -2
  480. package/src/server/cookies/index.ts +7 -5
  481. package/src/server/cookies/primitives/$cookie.ts +33 -11
  482. package/src/server/core/index.ts +17 -7
  483. package/src/server/core/interfaces/ServerRequest.ts +83 -1
  484. package/src/server/core/primitives/$action.spec.ts +1 -1
  485. package/src/server/core/primitives/$action.ts +8 -3
  486. package/src/server/core/providers/BunHttpServerProvider.ts +1 -1
  487. package/src/server/core/providers/NodeHttpServerProvider.spec.ts +125 -0
  488. package/src/server/core/providers/NodeHttpServerProvider.ts +77 -22
  489. package/src/server/core/providers/ServerLoggerProvider.ts +2 -2
  490. package/src/server/core/providers/ServerProvider.ts +9 -12
  491. package/src/server/core/services/ServerRequestParser.spec.ts +520 -0
  492. package/src/server/core/services/ServerRequestParser.ts +306 -13
  493. package/src/server/cors/index.ts +7 -21
  494. package/src/server/cors/primitives/$cors.ts +6 -2
  495. package/src/server/health/index.ts +8 -2
  496. package/src/server/helmet/index.ts +11 -3
  497. package/src/server/links/atoms/apiLinksAtom.ts +7 -0
  498. package/src/server/links/index.browser.ts +2 -0
  499. package/src/server/links/index.ts +13 -6
  500. package/src/server/metrics/index.ts +10 -3
  501. package/src/server/multipart/index.ts +9 -3
  502. package/src/server/proxy/index.ts +8 -2
  503. package/src/server/rate-limit/index.ts +21 -25
  504. package/src/server/rate-limit/primitives/$rateLimit.ts +6 -2
  505. package/src/server/rate-limit/providers/ServerRateLimitProvider.spec.ts +38 -14
  506. package/src/server/rate-limit/providers/ServerRateLimitProvider.ts +22 -56
  507. package/src/server/static/index.ts +8 -2
  508. package/src/server/static/providers/ServerStaticProvider.ts +1 -1
  509. package/src/server/swagger/index.ts +9 -4
  510. package/src/server/swagger/providers/ServerSwaggerProvider.ts +1 -1
  511. package/src/sms/index.ts +9 -5
  512. package/src/sms/providers/LocalSmsProvider.spec.ts +1 -1
  513. package/src/sms/providers/LocalSmsProvider.ts +1 -1
  514. package/src/system/index.browser.ts +11 -0
  515. package/src/system/index.ts +62 -0
  516. package/src/{file → system}/providers/FileSystemProvider.ts +16 -0
  517. package/src/{file → system}/providers/MemoryFileSystemProvider.ts +116 -3
  518. package/src/system/providers/MemoryShellProvider.ts +164 -0
  519. package/src/{file → system}/providers/NodeFileSystemProvider.spec.ts +2 -2
  520. package/src/{file → system}/providers/NodeFileSystemProvider.ts +36 -0
  521. package/src/system/providers/NodeShellProvider.ts +184 -0
  522. package/src/system/providers/ShellProvider.ts +74 -0
  523. package/src/{file → system}/services/FileDetector.spec.ts +2 -2
  524. package/src/thread/index.ts +11 -2
  525. package/src/topic/core/index.ts +12 -5
  526. package/src/vite/index.ts +3 -2
  527. package/src/vite/tasks/buildClient.ts +2 -8
  528. package/src/vite/tasks/buildServer.ts +84 -21
  529. package/src/vite/tasks/copyAssets.ts +5 -4
  530. package/src/vite/tasks/generateSitemap.ts +64 -23
  531. package/src/vite/tasks/index.ts +0 -2
  532. package/src/vite/tasks/prerenderPages.ts +49 -24
  533. package/src/websocket/index.ts +12 -8
  534. package/dist/file/index.d.ts +0 -839
  535. package/dist/file/index.d.ts.map +0 -1
  536. package/dist/file/index.js.map +0 -1
  537. package/src/cli/assets/indexHtml.ts +0 -15
  538. package/src/cli/assets/mainServerTs.ts +0 -24
  539. package/src/cli/assets/webAppRouterTs.ts +0 -15
  540. package/src/cli/assets/webHelloComponentTsx.ts +0 -16
  541. package/src/cli/commands/format.ts +0 -23
  542. package/src/file/index.ts +0 -43
  543. package/src/vite/helpers/boot.ts +0 -117
  544. package/src/vite/plugins/viteAlephaDev.ts +0 -177
  545. package/src/vite/tasks/devServer.ts +0 -71
  546. package/src/vite/tasks/runAlepha.ts +0 -270
  547. /package/dist/orm/{chunk-DtkW-qnP.js → chunk-DH6iiROE.js} +0 -0
  548. /package/src/cli/{assets → templates}/apiIndexTs.ts +0 -0
  549. /package/src/cli/{assets → templates}/webIndexTs.ts +0 -0
  550. /package/src/{file → system}/errors/FileError.ts +0 -0
  551. /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",
@@ -107,15 +107,6 @@ export class PrettyFormatterProvider extends LogFormatterProvider {
107
107
  return "";
108
108
  }
109
109
 
110
- if (this.alepha.isViteDev()) {
111
- // Node.js - try to fix stack trace with Vite SSR helper
112
- // Actually, it works only because we have a global helper in viteAlephaDev.ts
113
- const gl = globalThis as Record<string, unknown>;
114
- if (typeof gl === "object" && typeof gl.ssrFixStacktrace === "function") {
115
- gl.ssrFixStacktrace(error);
116
- }
117
- }
118
-
119
110
  let str = error.stack ?? error.message;
120
111
 
121
112
  const anyError = error as any;
@@ -2,6 +2,16 @@ import { JsonRpcErrorCodes } from "../helpers/jsonrpc.ts";
2
2
 
3
3
  // ---------------------------------------------------------------------------------------------------------------------
4
4
 
5
+ /**
6
+ * MCP-specific error codes (application-specific codes in the -32000 to -32099 range).
7
+ */
8
+ export const McpErrorCodes = {
9
+ UNAUTHORIZED: -32001,
10
+ FORBIDDEN: -32003,
11
+ } as const;
12
+
13
+ // ---------------------------------------------------------------------------------------------------------------------
14
+
5
15
  export class McpError extends Error {
6
16
  name = "McpError";
7
17
  code: number;
@@ -70,3 +80,23 @@ export class McpInvalidParamsError extends McpError {
70
80
  super(message, JsonRpcErrorCodes.INVALID_PARAMS);
71
81
  }
72
82
  }
83
+
84
+ // ---------------------------------------------------------------------------------------------------------------------
85
+
86
+ export class McpUnauthorizedError extends McpError {
87
+ name = "McpUnauthorizedError";
88
+
89
+ constructor(message = "Unauthorized") {
90
+ super(message, McpErrorCodes.UNAUTHORIZED);
91
+ }
92
+ }
93
+
94
+ // ---------------------------------------------------------------------------------------------------------------------
95
+
96
+ export class McpForbiddenError extends McpError {
97
+ name = "McpForbiddenError";
98
+
99
+ constructor(message = "Forbidden") {
100
+ super(message, McpErrorCodes.FORBIDDEN);
101
+ }
102
+ }
package/src/mcp/index.ts CHANGED
@@ -10,11 +10,14 @@ import { StdioMcpTransport } from "./transports/StdioMcpTransport.ts";
10
10
 
11
11
  export {
12
12
  McpError,
13
+ McpErrorCodes,
14
+ McpForbiddenError,
13
15
  McpInvalidParamsError,
14
16
  McpMethodNotFoundError,
15
17
  McpPromptNotFoundError,
16
18
  McpResourceNotFoundError,
17
19
  McpToolNotFoundError,
20
+ McpUnauthorizedError,
18
21
  } from "./errors/McpError.ts";
19
22
  export {
20
23
  createErrorResponse,
@@ -90,35 +93,18 @@ export { StdioMcpTransport } from "./transports/StdioMcpTransport.ts";
90
93
  // ---------------------------------------------------------------------------------------------------------------------
91
94
 
92
95
  /**
93
- * Core MCP module with primitives and server provider.
96
+ * | type | quality | stability |
97
+ * |------|---------|-----------|
98
+ * | backend | standard | stable |
94
99
  *
95
- * This module registers the $tool, $resource, and $prompt primitives
96
- * and the McpServerProvider. You need to add a transport module
97
- * (AlephaMcpStdio or AlephaMcpSse) for actual communication.
100
+ * Model Context Protocol for AI tool integration.
98
101
  *
99
- * @example
100
- * ```ts
101
- * import { Alepha, run } from "alepha";
102
- * import { AlephaMcp, AlephaMcpStdio, $tool, t } from "alepha/mcp";
103
- *
104
- * class MyMcpServer {
105
- * add = $tool({
106
- * description: "Add two numbers",
107
- * schema: {
108
- * params: t.object({ a: t.number(), b: t.number() }),
109
- * result: t.number(),
110
- * },
111
- * handler: async ({ params }) => params.a + params.b,
112
- * });
113
- * }
114
- *
115
- * run(
116
- * Alepha.create()
117
- * .with(AlephaMcp)
118
- * .with(AlephaMcpStdio)
119
- * .with(MyMcpServer)
120
- * );
121
- * ```
102
+ * **Features:**
103
+ * - MCP resource definitions
104
+ * - MCP tool definitions
105
+ * - MCP prompt definitions
106
+ * - JSON-RPC protocol
107
+ * - SSE and Stdio transports
122
108
  *
123
109
  * @module alepha.mcp
124
110
  */
@@ -112,7 +112,6 @@ 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
117
  },
@@ -131,12 +130,12 @@ export class SseMcpTransport {
131
130
  const rpcRequest = parseMessage(body);
132
131
 
133
132
  // Build context from request headers
134
- const context: McpContext = {
135
- headers: request.headers as Record<
136
- string,
137
- string | string[] | undefined
138
- >,
139
- };
133
+ const headers = { ...request.headers } as Record<
134
+ string,
135
+ string | string[] | undefined
136
+ >;
137
+
138
+ const context: McpContext = { headers };
140
139
 
141
140
  const response = await this.mcpServer.handleMessage(
142
141
  rpcRequest,
@@ -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,
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,
@@ -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),
@@ -162,6 +162,7 @@ export class BunSqliteProvider extends DatabaseProvider {
162
162
 
163
163
  protected readonly onStop = $hook({
164
164
  on: "stop",
165
+ priority: "last",
165
166
  handler: async () => {
166
167
  if (this.sqlite) {
167
168
  this.log.debug("Closing Bun SQLite connection...");