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
@@ -1,14 +1,32 @@
1
- import { $inject, Alepha } from "alepha";
1
+ import { $env, $inject, Alepha, t } from "alepha";
2
2
  import { ServerReply } from "../helpers/ServerReply.ts";
3
3
  import type {
4
+ RequestGeo,
5
+ RequestReferer,
4
6
  ServerRequest,
5
7
  ServerRequestData,
6
8
  } from "../interfaces/ServerRequest.ts";
7
9
  import { UserAgentParser } from "./UserAgentParser.ts";
8
10
 
11
+ const envSchema = t.object({
12
+ /**
13
+ * Trust proxy headers (X-Forwarded-For, X-Real-IP) for client IP resolution.
14
+ *
15
+ * Default: true (modern deployments are typically behind a reverse proxy)
16
+ *
17
+ * Set to false only if your server accepts direct connections without a proxy
18
+ * and you want to use the raw connection IP.
19
+ */
20
+ TRUST_PROXY: t.boolean({
21
+ default: true,
22
+ description: "Trust proxy headers for client IP",
23
+ }),
24
+ });
25
+
9
26
  export class ServerRequestParser {
10
27
  protected readonly alepha = $inject(Alepha);
11
28
  protected readonly userAgentParser = $inject(UserAgentParser);
29
+ protected readonly env = $env(envSchema);
12
30
 
13
31
  public createServerRequest(rawRequest: ServerRequestData): ServerRequest {
14
32
  const self = this;
@@ -30,6 +48,24 @@ export class ServerRequestParser {
30
48
  get userAgent() {
31
49
  return self.getRequestUserAgent(rawRequest);
32
50
  },
51
+ get geo() {
52
+ return self.getRequestGeo(rawRequest);
53
+ },
54
+ get isBot() {
55
+ return self.getIsBot(rawRequest);
56
+ },
57
+ get isMobile() {
58
+ return self.getIsMobile(rawRequest);
59
+ },
60
+ get protocol() {
61
+ return self.getProtocol(rawRequest);
62
+ },
63
+ get language() {
64
+ return self.getLanguage(rawRequest);
65
+ },
66
+ get referer() {
67
+ return self.getReferer(rawRequest);
68
+ },
33
69
  } as ServerRequest;
34
70
  }
35
71
 
@@ -42,22 +78,279 @@ export class ServerRequestParser {
42
78
  }
43
79
 
44
80
  public getRequestIp(request: ServerRequestData): string | undefined {
45
- // check for the 'x-forwarded-for' header first, which is commonly used
46
- // in proxy setups to forward the original client's IP address.
81
+ // Only trust proxy headers when explicitly configured
82
+ if (this.env.TRUST_PROXY) {
83
+ const headers = request.headers;
84
+
85
+ // X-Forwarded-For: standard proxy header (Cloudflare, Vercel, Nginx, etc.)
86
+ const forwardedFor = headers["x-forwarded-for"];
87
+ if (forwardedFor) {
88
+ return Array.isArray(forwardedFor)
89
+ ? forwardedFor[0]
90
+ : forwardedFor.split(",")[0].trim();
91
+ }
92
+
93
+ // X-Real-IP: alternative proxy header
94
+ const xRealIP = headers["x-real-ip"];
95
+ if (xRealIP) {
96
+ return Array.isArray(xRealIP) ? xRealIP[0] : xRealIP;
97
+ }
98
+ }
47
99
 
48
- // https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-For
100
+ // Default: use raw connection IP
101
+ return this.getConnectionIp(request);
102
+ }
49
103
 
50
- const forwardedFor = request.headers["x-forwarded-for"];
51
- if (forwardedFor) {
52
- // The 'x-forwarded-for' header can contain multiple IPs, so we take the first one.
53
- return Array.isArray(forwardedFor)
54
- ? forwardedFor[0]
55
- : forwardedFor.split(",")[0].trim();
104
+ protected getConnectionIp(request: ServerRequestData): string | undefined {
105
+ // Get IP from raw connection (Node.js socket)
106
+ const nodeReq = request.raw.node?.req;
107
+ if (nodeReq) {
108
+ return nodeReq.socket?.remoteAddress;
56
109
  }
110
+ return undefined;
111
+ }
112
+
113
+ // ─────────────────────────────────────────────────────────────────────────────
114
+ // Geolocation
115
+ // ─────────────────────────────────────────────────────────────────────────────
116
+
117
+ public getRequestGeo(request: ServerRequestData): RequestGeo {
118
+ const headers = request.headers;
119
+
120
+ return {
121
+ // Country: Cloudflare, Vercel, AWS CloudFront
122
+ country:
123
+ headers["cf-ipcountry"] ||
124
+ headers["x-vercel-ip-country"] ||
125
+ headers["cloudfront-viewer-country"],
126
+
127
+ // City: Cloudflare, Vercel
128
+ city: headers["cf-ipcity"] || headers["x-vercel-ip-city"],
129
+
130
+ // Region: Cloudflare, Vercel
131
+ region:
132
+ headers["cf-region"] ||
133
+ headers["cf-region-code"] ||
134
+ headers["x-vercel-ip-country-region"],
135
+
136
+ // Coordinates: Cloudflare, Vercel
137
+ latitude: headers["cf-iplatitude"] || headers["x-vercel-ip-latitude"],
138
+ longitude: headers["cf-iplongitude"] || headers["x-vercel-ip-longitude"],
139
+ };
140
+ }
141
+
142
+ // ─────────────────────────────────────────────────────────────────────────────
143
+ // Bot detection
144
+ // ─────────────────────────────────────────────────────────────────────────────
145
+
146
+ protected static readonly BOT_PATTERNS = [
147
+ /bot/i,
148
+ /crawl/i,
149
+ /spider/i,
150
+ /slurp/i,
151
+ /googlebot/i,
152
+ /bingbot/i,
153
+ /yandex/i,
154
+ /baiduspider/i,
155
+ /facebookexternalhit/i,
156
+ /twitterbot/i,
157
+ /linkedinbot/i,
158
+ /whatsapp/i,
159
+ /telegrambot/i,
160
+ /discordbot/i,
161
+ /slackbot/i,
162
+ /applebot/i,
163
+ /duckduckbot/i,
164
+ /semrush/i,
165
+ /ahrefsbot/i,
166
+ /mj12bot/i,
167
+ /dotbot/i,
168
+ /petalbot/i,
169
+ /bytespider/i,
170
+ /gptbot/i,
171
+ /claudebot/i,
172
+ /anthropic/i,
173
+ /curl/i,
174
+ /wget/i,
175
+ /python-requests/i,
176
+ /axios/i,
177
+ /node-fetch/i,
178
+ /go-http-client/i,
179
+ /java\//i,
180
+ /libwww/i,
181
+ /httpunit/i,
182
+ /nutch/i,
183
+ /phpcrawl/i,
184
+ /biglotron/i,
185
+ /teoma/i,
186
+ /convera/i,
187
+ /gigablast/i,
188
+ /ia_archiver/i,
189
+ /webmon/i,
190
+ /httrack/i,
191
+ /grub\.org/i,
192
+ /netresearchserver/i,
193
+ /speedy/i,
194
+ /fluffy/i,
195
+ /findlink/i,
196
+ /panscient/i,
197
+ /ips-agent/i,
198
+ /yanga/i,
199
+ /cyberpatrol/i,
200
+ /postrank/i,
201
+ /page2rss/i,
202
+ /linkdex/i,
203
+ /ezooms/i,
204
+ /heritrix/i,
205
+ /findthatfile/i,
206
+ /europarchive\.org/i,
207
+ /mappydata/i,
208
+ /eright/i,
209
+ /apercite/i,
210
+ /aboundex/i,
211
+ /domaincrawler/i,
212
+ /wbsearchbot/i,
213
+ /summify/i,
214
+ /ccbot/i,
215
+ /edisterbot/i,
216
+ /seznambot/i,
217
+ /ec2linkfinder/i,
218
+ /gslfbot/i,
219
+ /aihitbot/i,
220
+ /intelium_bot/i,
221
+ /yeti/i,
222
+ /retrevopageanalyzer/i,
223
+ /lb-spider/i,
224
+ /sogou/i,
225
+ /lssbot/i,
226
+ /careerbot/i,
227
+ /wotbox/i,
228
+ /wocbot/i,
229
+ /ichiro/i,
230
+ /duckduckgo/i,
231
+ /lssrocketcrawler/i,
232
+ /drupact/i,
233
+ /webcompanycrawler/i,
234
+ /acoonbot/i,
235
+ /openindexspider/i,
236
+ /screaming frog/i,
237
+ /pingdom/i,
238
+ /uptimerobot/i,
239
+ /headlesschrome/i,
240
+ /phantomjs/i,
241
+ /prerender/i,
242
+ /lighthouse/i,
243
+ /pagespeed/i,
244
+ ];
245
+
246
+ public getIsBot(request: ServerRequestData): boolean {
247
+ const ua = request.headers["user-agent"];
248
+ if (!ua) return false;
249
+
250
+ return ServerRequestParser.BOT_PATTERNS.some((pattern) => pattern.test(ua));
251
+ }
252
+
253
+ // ─────────────────────────────────────────────────────────────────────────────
254
+ // Mobile detection
255
+ // ─────────────────────────────────────────────────────────────────────────────
256
+
257
+ protected static readonly MOBILE_PATTERNS = [
258
+ /android/i,
259
+ /webos/i,
260
+ /iphone/i,
261
+ /ipad/i,
262
+ /ipod/i,
263
+ /blackberry/i,
264
+ /iemobile/i,
265
+ /opera mini/i,
266
+ /mobile/i,
267
+ /tablet/i,
268
+ /kindle/i,
269
+ /silk/i,
270
+ /fennec/i,
271
+ /windows phone/i,
272
+ /windows ce/i,
273
+ /symbian/i,
274
+ /palm/i,
275
+ /webmate/i,
276
+ ];
277
+
278
+ public getIsMobile(request: ServerRequestData): boolean {
279
+ const ua = request.headers["user-agent"];
280
+ if (!ua) return false;
281
+
282
+ return ServerRequestParser.MOBILE_PATTERNS.some((pattern) =>
283
+ pattern.test(ua),
284
+ );
285
+ }
286
+
287
+ // ─────────────────────────────────────────────────────────────────────────────
288
+ // Protocol detection
289
+ // ─────────────────────────────────────────────────────────────────────────────
290
+
291
+ public getProtocol(request: ServerRequestData): "http" | "https" {
292
+ // Check proxy headers first
293
+ const forwardedProto = request.headers["x-forwarded-proto"];
294
+ if (forwardedProto) {
295
+ return forwardedProto.toLowerCase() === "https" ? "https" : "http";
296
+ }
297
+
298
+ // Cloudflare-specific header
299
+ const cfVisitorHeader = request.headers["cf-visitor"];
300
+ if (cfVisitorHeader) {
301
+ try {
302
+ const parsed = JSON.parse(cfVisitorHeader);
303
+ if (parsed.scheme === "https") return "https";
304
+ } catch {
305
+ // Ignore parse errors
306
+ }
307
+ }
308
+
309
+ // Check URL scheme
310
+ if (request.url.protocol === "https:") {
311
+ return "https";
312
+ }
313
+
314
+ return "http";
315
+ }
316
+
317
+ // ─────────────────────────────────────────────────────────────────────────────
318
+ // Language detection
319
+ // ─────────────────────────────────────────────────────────────────────────────
320
+
321
+ public getLanguage(request: ServerRequestData): string | undefined {
322
+ const acceptLanguage = request.headers["accept-language"];
323
+ if (!acceptLanguage) return undefined;
324
+
325
+ // Parse Accept-Language header
326
+ // Format: "en-US,en;q=0.9,fr;q=0.8"
327
+ const firstLang = acceptLanguage.split(",")[0];
328
+ if (!firstLang) return undefined;
329
+
330
+ // Remove quality value if present (e.g., "en;q=0.9" -> "en")
331
+ const lang = firstLang.split(";")[0].trim();
332
+
333
+ return lang || undefined;
334
+ }
335
+
336
+ // ─────────────────────────────────────────────────────────────────────────────
337
+ // Referer parsing
338
+ // ─────────────────────────────────────────────────────────────────────────────
339
+
340
+ public getReferer(request: ServerRequestData): RequestReferer | undefined {
341
+ const referer = request.headers.referer || request.headers.referrer;
342
+ if (!referer) return undefined;
57
343
 
58
- const xRealIP = request.headers["x-real-ip"];
59
- if (xRealIP) {
60
- return Array.isArray(xRealIP) ? xRealIP[0] : xRealIP;
344
+ try {
345
+ const url = new URL(referer);
346
+ return {
347
+ url: referer,
348
+ hostname: url.hostname,
349
+ pathname: url.pathname,
350
+ };
351
+ } catch {
352
+ // Invalid URL
353
+ return undefined;
61
354
  }
62
355
  }
63
356
  }
@@ -25,30 +25,16 @@ declare module "alepha/server" {
25
25
  // ---------------------------------------------------------------------------------------------------------------------
26
26
 
27
27
  /**
28
- * Plugin for configuring CORS on the Alepha server.
28
+ * | type | quality | stability |
29
+ * |------|---------|-----------|
30
+ * | backend | standard | stable |
29
31
  *
30
- * @example
31
- * ```ts
32
- * import { Alepha, $route } from "alepha";
33
- * import { AlephaServerCors, $cors } from "alepha/server-cors";
32
+ * Cross-Origin Resource Sharing configuration.
34
33
  *
35
- * class ApiService {
36
- * // Global CORS is applied via corsOptions atom
34
+ * **Features:**
35
+ * - CORS policy definition
37
36
  *
38
- * // Path-specific CORS for API routes
39
- * apiCors = $cors({
40
- * paths: ["/api/*"],
41
- * origin: "https://app.example.com",
42
- * credentials: true,
43
- * });
44
- *
45
- * route = $route({
46
- * path: "/api/data",
47
- * method: "POST",
48
- * handler: () => ({ data: "hello" }),
49
- * });
50
- * }
51
- * ```
37
+ * @module alepha.server.cors
52
38
  */
53
39
  export const AlephaServerCors = $module({
54
40
  name: "alepha.server.cors",
@@ -25,9 +25,13 @@ export const $cors = (options: CorsPrimitiveConfig): AbstractCorsPrimitive => {
25
25
  // ---------------------------------------------------------------------------------------------------------------------
26
26
 
27
27
  export interface CorsPrimitiveConfig extends Partial<CorsOptions> {
28
- /** Name identifier for this CORS config (default: property key) */
28
+ /**
29
+ * Name identifier for this CORS config (default: property key).
30
+ */
29
31
  name?: string;
30
- /** Path patterns to match (supports wildcards like /api/*) */
32
+ /**
33
+ * Path patterns to match (supports wildcards like /api/*).
34
+ */
31
35
  paths?: string[];
32
36
  }
33
37
 
@@ -10,9 +10,15 @@ export * from "./schemas/healthSchema.ts";
10
10
  // ---------------------------------------------------------------------------------------------------------------------
11
11
 
12
12
  /**
13
- * Plugin for Alepha Server that provides health-check endpoints.
13
+ * | type | quality | stability |
14
+ * |------|---------|-----------|
15
+ * | devops | standard | stable |
16
+ *
17
+ * Application health monitoring endpoints.
18
+ *
19
+ * **Features:**
20
+ * - `GET /health` endpoint
14
21
  *
15
- * @see {@link ServerHealthProvider}
16
22
  * @module alepha.server.health
17
23
  */
18
24
  export const AlephaServerHealth = $module({
@@ -9,10 +9,18 @@ export * from "./providers/ServerHelmetProvider.ts";
9
9
  // ---------------------------------------------------------------------------------------------------------------------
10
10
 
11
11
  /**
12
- * Automatically adds important HTTP security headers to every response
13
- * to help protect your application from common web vulnerabilities.
12
+ * | type | quality | stability |
13
+ * |------|---------|-----------|
14
+ * | backend | standard | stable |
15
+ *
16
+ * HTTP security headers.
17
+ *
18
+ * **Features:**
19
+ * - X-Frame-Options
20
+ * - X-Content-Type-Options
21
+ * - Content-Security-Policy
22
+ * - Other security headers
14
23
  *
15
- * @see {@link ServerHelmetProvider}
16
24
  * @module alepha.server.helmet
17
25
  */
18
26
  export const AlephaServerHelmet = $module({
@@ -35,14 +35,19 @@ declare module "alepha" {
35
35
  // ---------------------------------------------------------------------------------------------------------------------
36
36
 
37
37
  /**
38
- * Provides server-side link management and remote capabilities for client-server interactions.
38
+ * | type | quality | stability |
39
+ * |------|---------|-----------|
40
+ * | backend | standard | stable |
39
41
  *
40
- * The server-links module enables declarative link definitions using `$remote` and `$client` primitives,
41
- * facilitating seamless API endpoint management and client-server communication. It integrates with server
42
- * security features to ensure safe and controlled access to resources.
42
+ * Type-safe API client with request deduplication.
43
+ *
44
+ * **Features:**
45
+ * - Virtual HTTP client for type-safe API calls
46
+ * - Remote action definitions
47
+ * - Type inference from action schemas
48
+ * - Request deduplication
49
+ * - Automatic error handling
43
50
  *
44
- * @see {@link $remote}
45
- * @see {@link $client}
46
51
  * @module alepha.server.links
47
52
  */
48
53
  export const AlephaServerLinks = $module({
@@ -9,10 +9,17 @@ export * from "./providers/ServerMetricsProvider.ts";
9
9
  // ---------------------------------------------------------------------------------------------------------------------
10
10
 
11
11
  /**
12
- * This module provides prometheus metrics for the Alepha server.
13
- * Metrics are exposed at the `/metrics` endpoint.
12
+ * | type | quality | stability |
13
+ * |------|---------|-----------|
14
+ * | devops | standard | stable |
15
+ *
16
+ * Prometheus-style metrics collection.
17
+ *
18
+ * **Features:**
19
+ * - Prometheus-style metrics
20
+ * - Custom metric registration
21
+ * - Metric exposition endpoint
14
22
  *
15
- * @see {@link ServerMetricsProvider}
16
23
  * @module alepha.server.metrics
17
24
  */
18
25
  export const AlephaServerMetrics = $module({
@@ -9,10 +9,16 @@ export * from "./providers/ServerMultipartProvider.ts";
9
9
  // ---------------------------------------------------------------------------------------------------------------------
10
10
 
11
11
  /**
12
- * This module provides support for handling multipart/form-data requests.
13
- * It allows to parse body data containing t.file().
12
+ * | type | quality | stability |
13
+ * |------|---------|-----------|
14
+ * | backend | standard | stable |
15
+ *
16
+ * Multipart form data handling for file uploads.
17
+ *
18
+ * **Features:**
19
+ * - File upload parsing
20
+ * - Form field extraction
14
21
  *
15
- * @see {@link ServerMultipartProvider}
16
22
  * @module alepha.server.multipart
17
23
  */
18
24
  export const AlephaServerMultipart = $module({
@@ -11,9 +11,15 @@ export * from "./providers/ServerProxyProvider.ts";
11
11
  // ---------------------------------------------------------------------------------------------------------------------
12
12
 
13
13
  /**
14
- * Plugin for Alepha that provides a proxy server functionality.
14
+ * | type | quality | stability |
15
+ * |------|---------|-----------|
16
+ * | backend | standard | stable |
17
+ *
18
+ * Reverse proxy routing.
19
+ *
20
+ * **Features:**
21
+ * - Proxy configuration and routing
15
22
  *
16
- * @see {@link $proxy}
17
23
  * @module alepha.server.proxy
18
24
  */
19
25
  export const AlephaServerProxy = $module({
@@ -31,42 +31,38 @@ declare module "alepha/server" {
31
31
  // ---------------------------------------------------------------------------------------------------------------------
32
32
 
33
33
  export interface RateLimitOptions {
34
- /** Maximum number of requests per window (default: 100) */
34
+ /**
35
+ * Maximum number of requests per window (default: 100).
36
+ */
35
37
  max?: number;
36
- /** Window duration in milliseconds (default: 15 minutes) */
38
+ /**
39
+ * Window duration in milliseconds (default: 15 minutes).
40
+ */
37
41
  windowMs?: number;
38
- /** Custom key generator function */
42
+ /**
43
+ * Custom key generator function.
44
+ */
39
45
  keyGenerator?: (req: any) => string;
40
- /** Skip rate limiting for failed requests */
46
+ /**
47
+ * Skip rate limiting for failed requests.
48
+ */
41
49
  skipFailedRequests?: boolean;
42
- /** Skip rate limiting for successful requests */
50
+ /**
51
+ * Skip rate limiting for successful requests.
52
+ */
43
53
  skipSuccessfulRequests?: boolean;
44
54
  }
45
55
 
46
56
  /**
47
- * Provides rate limiting capabilities for server routes and actions with configurable limits and windows.
57
+ * | type | quality | stability |
58
+ * |------|---------|-----------|
59
+ * | backend | standard | stable |
48
60
  *
49
- * The server-rate-limit module enables per-route and per-action rate limiting using either:
50
- * - The `$rateLimit` primitive with `paths` option for path-based rate limiting
51
- * - The `rateLimit` option in action primitives for action-specific limiting
61
+ * Request rate limiting on actions.
52
62
  *
53
- * It offers sliding window rate limiting, custom key generation, and seamless integration with server routes.
63
+ * **Features:**
64
+ * - Rate limit configuration per action
54
65
  *
55
- * @example
56
- * ```ts
57
- * import { $rateLimit, AlephaServerRateLimit } from "alepha/server/rate-limit";
58
- *
59
- * class ApiService {
60
- * // Path-specific rate limiting
61
- * apiRateLimit = $rateLimit({
62
- * paths: ["/api/*"],
63
- * max: 100,
64
- * windowMs: 15 * 60 * 1000, // 15 minutes
65
- * });
66
- * }
67
- * ```
68
- *
69
- * @see {@link $rateLimit}
70
66
  * @module alepha.server.rate-limit
71
67
  */
72
68
  export const AlephaServerRateLimit = $module({
@@ -41,9 +41,13 @@ export const $rateLimit = (
41
41
  // ---------------------------------------------------------------------------------------------------------------------
42
42
 
43
43
  export interface RateLimitPrimitiveOptions extends RateLimitOptions {
44
- /** Name identifier for this rate limit (default: property key) */
44
+ /**
45
+ * Name identifier for this rate limit (default: property key).
46
+ */
45
47
  name?: string;
46
- /** Path patterns to match (supports wildcards like /api/*) */
48
+ /**
49
+ * Path patterns to match (supports wildcards like /api/*).
50
+ */
47
51
  paths?: string[];
48
52
  }
49
53