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
@@ -0,0 +1,23 @@
1
+ import { type AnchorHTMLAttributes, createElement } from "react";
2
+ import { useRouter } from "../hooks/useRouter.ts";
3
+
4
+ export interface LinkProps extends AnchorHTMLAttributes<HTMLAnchorElement> {
5
+ href: string;
6
+ }
7
+
8
+ /**
9
+ * Link component for client-side navigation.
10
+ *
11
+ * It's a simple wrapper around an anchor (`<a>`) element using the `useRouter` hook.
12
+ */
13
+ const Link = (props: LinkProps) => {
14
+ const router = useRouter();
15
+
16
+ return createElement(
17
+ "a",
18
+ { ...props, ...router.anchor(props.href) },
19
+ props.children,
20
+ );
21
+ };
22
+
23
+ export default Link;
@@ -0,0 +1,223 @@
1
+ import { ErrorBoundary, useAlepha, useEvents } from "alepha/react";
2
+ import { memo, type ReactNode, use, useRef, useState } from "react";
3
+ import { RouterLayerContext } from "../contexts/RouterLayerContext.ts";
4
+ import { Redirection } from "../errors/Redirection.ts";
5
+ import { useRouterState } from "../hooks/useRouterState.ts";
6
+ import type { PageAnimation } from "../primitives/$page.ts";
7
+ import type { ReactRouterState } from "../providers/ReactPageProvider.ts";
8
+ import ErrorViewer from "./ErrorViewer.tsx";
9
+
10
+ export interface NestedViewProps {
11
+ children?: ReactNode;
12
+ errorBoundary?: false | ((error: Error) => ReactNode);
13
+ }
14
+
15
+ /**
16
+ * A component that renders the current view of the nested router layer.
17
+ *
18
+ * To be simple, it renders the `element` of the current child page of a parent page.
19
+ *
20
+ * @example
21
+ * ```tsx
22
+ * import { NestedView } from "alepha/react";
23
+ *
24
+ * class App {
25
+ * parent = $page({
26
+ * component: () => <NestedView />,
27
+ * });
28
+ *
29
+ * child = $page({
30
+ * parent: this.root,
31
+ * component: () => <div>Child Page</div>,
32
+ * });
33
+ * }
34
+ * ```
35
+ */
36
+ const NestedView = (props: NestedViewProps) => {
37
+ const routerLayer = use(RouterLayerContext);
38
+ const index = routerLayer?.index ?? 0;
39
+ const onError = routerLayer?.onError;
40
+ const state = useRouterState();
41
+ const alepha = useAlepha();
42
+
43
+ const [view, setView] = useState<ReactNode | undefined>(
44
+ state.layers[index]?.element,
45
+ );
46
+
47
+ const [animation, setAnimation] = useState("");
48
+ const animationExitDuration = useRef<number>(0);
49
+ const animationExitNow = useRef<number>(0);
50
+
51
+ useEvents(
52
+ {
53
+ "react:transition:begin": async ({ previous, state }) => {
54
+ // --------- Animations Begin ---------
55
+ const layer = previous.layers[index];
56
+ if (!layer) {
57
+ return;
58
+ }
59
+
60
+ if (`${state.url.pathname}/`.startsWith(`${layer.path}/`)) {
61
+ return;
62
+ }
63
+
64
+ const animationExit = parseAnimation(
65
+ layer.route?.animation,
66
+ state,
67
+ "exit",
68
+ );
69
+
70
+ if (animationExit) {
71
+ const duration = animationExit.duration || 200;
72
+ animationExitNow.current = Date.now();
73
+ animationExitDuration.current = duration;
74
+ setAnimation(animationExit.animation);
75
+ } else {
76
+ animationExitNow.current = 0;
77
+ animationExitDuration.current = 0;
78
+ setAnimation("");
79
+ }
80
+ // --------- Animations End ---------
81
+ },
82
+ "react:transition:end": async ({ state }) => {
83
+ const layer = state.layers[index];
84
+
85
+ // --------- Animations Begin ---------
86
+ if (animationExitNow.current) {
87
+ const duration = animationExitDuration.current;
88
+ const diff = Date.now() - animationExitNow.current;
89
+ if (diff < duration) {
90
+ await new Promise((resolve) =>
91
+ setTimeout(resolve, duration - diff),
92
+ );
93
+ }
94
+ }
95
+ // --------- Animations End ---------
96
+
97
+ if (!layer?.cache) {
98
+ setView(layer?.element);
99
+
100
+ // --------- Animations Begin ---------
101
+ const animationEnter = parseAnimation(
102
+ layer?.route?.animation,
103
+ state,
104
+ "enter",
105
+ );
106
+
107
+ if (animationEnter) {
108
+ setAnimation(animationEnter.animation);
109
+ } else {
110
+ setAnimation("");
111
+ }
112
+ // --------- Animations End ---------
113
+ }
114
+ },
115
+ },
116
+ [],
117
+ );
118
+
119
+ let element = view ?? props.children ?? null;
120
+
121
+ // --------- Animations Begin ---------
122
+ if (animation) {
123
+ element = (
124
+ <div
125
+ style={{
126
+ display: "flex",
127
+ flex: 1,
128
+ height: "100%",
129
+ width: "100%",
130
+ position: "relative",
131
+ overflow: "hidden",
132
+ }}
133
+ >
134
+ <div
135
+ style={{ height: "100%", width: "100%", display: "flex", animation }}
136
+ >
137
+ {element}
138
+ </div>
139
+ </div>
140
+ );
141
+ }
142
+ // --------- Animations End ---------
143
+
144
+ if (props.errorBoundary === false) {
145
+ return <>{element}</>;
146
+ }
147
+
148
+ if (props.errorBoundary) {
149
+ return (
150
+ <ErrorBoundary fallback={props.errorBoundary}>{element}</ErrorBoundary>
151
+ );
152
+ }
153
+
154
+ const fallback = (error: Error) => {
155
+ const result = onError?.(error, state) ?? (
156
+ <ErrorViewer error={error} alepha={alepha} />
157
+ );
158
+ if (result instanceof Redirection) {
159
+ return "Redirection inside ErrorBoundary is not allowed.";
160
+ }
161
+ return result as ReactNode;
162
+ };
163
+
164
+ return <ErrorBoundary fallback={fallback}>{element}</ErrorBoundary>;
165
+ };
166
+
167
+ export default memo(NestedView);
168
+
169
+ function parseAnimation(
170
+ animationLike: PageAnimation | undefined,
171
+ state: ReactRouterState,
172
+ type: "enter" | "exit" = "enter",
173
+ ):
174
+ | {
175
+ duration: number;
176
+ animation: string;
177
+ }
178
+ | undefined {
179
+ if (!animationLike) {
180
+ return undefined;
181
+ }
182
+
183
+ const DEFAULT_DURATION = 300;
184
+
185
+ const animation =
186
+ typeof animationLike === "function" ? animationLike(state) : animationLike;
187
+
188
+ if (typeof animation === "string") {
189
+ if (type === "exit") {
190
+ return;
191
+ }
192
+ return {
193
+ duration: DEFAULT_DURATION,
194
+ animation: `${DEFAULT_DURATION}ms ${animation}`,
195
+ };
196
+ }
197
+
198
+ if (typeof animation === "object") {
199
+ const anim = animation[type];
200
+ const duration =
201
+ typeof anim === "object"
202
+ ? (anim.duration ?? DEFAULT_DURATION)
203
+ : DEFAULT_DURATION;
204
+ const name = typeof anim === "object" ? anim.name : anim;
205
+
206
+ if (type === "exit") {
207
+ const timing = typeof anim === "object" ? (anim.timing ?? "") : "";
208
+ return {
209
+ duration,
210
+ animation: `${duration}ms ${timing} ${name}`,
211
+ };
212
+ }
213
+
214
+ const timing = typeof anim === "object" ? (anim.timing ?? "") : "";
215
+
216
+ return {
217
+ duration,
218
+ animation: `${duration}ms ${timing} ${name}`,
219
+ };
220
+ }
221
+
222
+ return undefined;
223
+ }
@@ -0,0 +1,30 @@
1
+ import type { CSSProperties } from "react";
2
+
3
+ /**
4
+ * Default 404 Not Found page component.
5
+ */
6
+ const NotFound = (props: { style?: CSSProperties }) => (
7
+ <div
8
+ style={{
9
+ width: "100%",
10
+ minHeight: "90vh",
11
+ boxSizing: "border-box",
12
+ display: "flex",
13
+ flexDirection: "column",
14
+ justifyContent: "center",
15
+ alignItems: "center",
16
+ textAlign: "center",
17
+ fontFamily:
18
+ 'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif',
19
+ padding: "2rem",
20
+ ...props.style,
21
+ }}
22
+ >
23
+ <div style={{ fontSize: "6rem", fontWeight: 200, lineHeight: 1 }}>404</div>
24
+ <div style={{ fontSize: "0.875rem", marginTop: "1rem", opacity: 0.6 }}>
25
+ Page not found
26
+ </div>
27
+ </div>
28
+ );
29
+
30
+ export default NotFound;
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Symbol key for SSR module preloading path.
3
+ * Using Symbol.for() allows the Vite plugin to inject this at build time.
4
+ * @internal
5
+ */
6
+ export const PAGE_PRELOAD_KEY = Symbol.for("alepha.page.preload");
@@ -0,0 +1,12 @@
1
+ import { createContext } from "react";
2
+ import type { ErrorHandler } from "../primitives/$page.ts";
3
+
4
+ export interface RouterLayerContextValue {
5
+ index: number;
6
+ path: string;
7
+ onError: ErrorHandler;
8
+ }
9
+
10
+ export const RouterLayerContext = createContext<
11
+ RouterLayerContextValue | undefined
12
+ >(undefined);
@@ -0,0 +1,28 @@
1
+ import { AlephaError } from "alepha";
2
+
3
+ /**
4
+ * Used for Redirection during the page loading.
5
+ *
6
+ * Depends on the context, it can be thrown or just returned.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * import { Redirection } from "alepha/react";
11
+ *
12
+ * const MyPage = $page({
13
+ * loader: async () => {
14
+ * if (needRedirect) {
15
+ * throw new Redirection("/new-path");
16
+ * }
17
+ * },
18
+ * });
19
+ * ```
20
+ */
21
+ export class Redirection extends AlephaError {
22
+ public readonly redirect: string;
23
+
24
+ constructor(redirect: string) {
25
+ super("Redirection");
26
+ this.redirect = redirect;
27
+ }
28
+ }
@@ -0,0 +1,52 @@
1
+ import { useState } from "react";
2
+ import type { AnchorProps } from "../providers/ReactPageProvider.ts";
3
+ import { useRouter } from "./useRouter.ts";
4
+ import { useRouterState } from "./useRouterState.ts";
5
+
6
+ export interface UseActiveOptions {
7
+ href: string;
8
+ startWith?: boolean;
9
+ }
10
+
11
+ /**
12
+ * Hook to determine if a given route is active and to provide anchor props for navigation.
13
+ * This hook refreshes on router state changes.
14
+ */
15
+ export const useActive = (args: string | UseActiveOptions): UseActiveHook => {
16
+ useRouterState();
17
+
18
+ const router = useRouter();
19
+ const [isPending, setPending] = useState(false);
20
+
21
+ const options: UseActiveOptions =
22
+ typeof args === "string" ? { href: args } : { ...args, href: args.href };
23
+ const href = options.href;
24
+ const isActive = router.isActive(href, options);
25
+
26
+ return {
27
+ isPending,
28
+ isActive,
29
+ anchorProps: {
30
+ href: router.base(href),
31
+ onClick: async (ev?: any) => {
32
+ ev?.stopPropagation();
33
+ ev?.preventDefault();
34
+ if (isActive) return;
35
+ if (isPending) return;
36
+
37
+ setPending(true);
38
+ try {
39
+ await router.push(href);
40
+ } finally {
41
+ setPending(false);
42
+ }
43
+ },
44
+ },
45
+ };
46
+ };
47
+
48
+ export interface UseActiveHook {
49
+ isActive: boolean;
50
+ anchorProps: AnchorProps;
51
+ isPending: boolean;
52
+ }
@@ -0,0 +1,63 @@
1
+ import type { Alepha, Static, TObject } from "alepha";
2
+ import { useAlepha } from "alepha/react";
3
+ import { useEffect, useState } from "react";
4
+ import { useRouter } from "./useRouter.ts";
5
+
6
+ /**
7
+ * Hook to manage query parameters in the URL using a defined schema.
8
+ */
9
+ export const useQueryParams = <T extends TObject>(
10
+ schema: T,
11
+ options: UseQueryParamsHookOptions = {},
12
+ ): [Partial<Static<T>>, (data: Static<T>) => void] => {
13
+ const alepha = useAlepha();
14
+
15
+ const key = options.key ?? "q";
16
+ const router = useRouter();
17
+ const querystring = router.query[key];
18
+
19
+ const [queryParams = {}, setQueryParams] = useState<Static<T> | undefined>(
20
+ decode(alepha, schema, router.query[key]),
21
+ );
22
+
23
+ useEffect(() => {
24
+ setQueryParams(decode(alepha, schema, querystring));
25
+ }, [querystring]);
26
+
27
+ return [
28
+ queryParams,
29
+ (queryParams: Static<T>) => {
30
+ setQueryParams(queryParams);
31
+ router.setQueryParams((data) => {
32
+ return { ...data, [key]: encode(alepha, schema, queryParams) };
33
+ });
34
+ },
35
+ ];
36
+ };
37
+
38
+ // ---------------------------------------------------------------------------------------------------------------------
39
+
40
+ export interface UseQueryParamsHookOptions {
41
+ format?: "base64" | "querystring";
42
+ key?: string;
43
+ push?: boolean;
44
+ }
45
+
46
+ const encode = (alepha: Alepha, schema: TObject, data: any) => {
47
+ return btoa(JSON.stringify(alepha.codec.decode(schema, data)));
48
+ };
49
+
50
+ const decode = <T extends TObject>(
51
+ alepha: Alepha,
52
+ schema: T,
53
+ data: any,
54
+ ): Static<T> | undefined => {
55
+ try {
56
+ return alepha.codec.decode(
57
+ schema,
58
+ JSON.parse(atob(decodeURIComponent(data))),
59
+ );
60
+ } catch {
61
+ return;
62
+ }
63
+ };
@@ -0,0 +1,20 @@
1
+ import { useInject } from "alepha/react";
2
+ import { ReactRouter } from "../services/ReactRouter.ts";
3
+
4
+ /**
5
+ * Use this hook to access the React Router instance.
6
+ *
7
+ * You can add a type parameter to specify the type of your application.
8
+ * This will allow you to use the router in a typesafe way.
9
+ *
10
+ * @example
11
+ * class App {
12
+ * home = $page();
13
+ * }
14
+ *
15
+ * const router = useRouter<App>();
16
+ * router.push("home"); // typesafe
17
+ */
18
+ export const useRouter = <T extends object = any>(): ReactRouter<T> => {
19
+ return useInject(ReactRouter<T>);
20
+ };
@@ -0,0 +1,11 @@
1
+ import { AlephaError } from "alepha";
2
+ import { useStore } from "alepha/react";
3
+ import type { ReactRouterState } from "../providers/ReactPageProvider.ts";
4
+
5
+ export const useRouterState = (): ReactRouterState => {
6
+ const [state] = useStore("alepha.react.router.state");
7
+ if (!state) {
8
+ throw new AlephaError("Missing react router state");
9
+ }
10
+ return state;
11
+ };
@@ -0,0 +1,45 @@
1
+ import { $module } from "alepha";
2
+ import { AlephaDateTime } from "alepha/datetime";
3
+ import { AlephaReact } from "alepha/react";
4
+ import { AlephaServer } from "alepha/server";
5
+ import { AlephaServerLinks } from "alepha/server/links";
6
+ import { $page } from "./primitives/$page.ts";
7
+ import { ReactBrowserProvider } from "./providers/ReactBrowserProvider.ts";
8
+ import { ReactBrowserRendererProvider } from "./providers/ReactBrowserRendererProvider.ts";
9
+ import { ReactBrowserRouterProvider } from "./providers/ReactBrowserRouterProvider.ts";
10
+ import { ReactPageProvider } from "./providers/ReactPageProvider.ts";
11
+ import { ReactPageService } from "./services/ReactPageService.ts";
12
+ import { ReactRouter } from "./services/ReactRouter.ts";
13
+
14
+ // ---------------------------------------------------------------------------------------------------------------------
15
+
16
+ export * from "./index.shared.ts";
17
+ export * from "./providers/ReactBrowserProvider.ts";
18
+ export * from "./providers/ReactBrowserRendererProvider.ts";
19
+ export * from "./providers/ReactBrowserRouterProvider.ts";
20
+
21
+ // ---------------------------------------------------------------------------------------------------------------------
22
+
23
+ export const AlephaReactRouter = $module({
24
+ name: "alepha.react.router",
25
+ primitives: [$page],
26
+ services: [
27
+ ReactPageProvider,
28
+ ReactBrowserRouterProvider,
29
+ ReactBrowserProvider,
30
+ ReactRouter,
31
+ ReactBrowserRendererProvider,
32
+ ReactPageService,
33
+ ],
34
+ register: (alepha) =>
35
+ alepha
36
+ .with(AlephaReact)
37
+ .with(AlephaDateTime)
38
+ .with(AlephaServer)
39
+ .with(AlephaServerLinks)
40
+ .with(ReactPageProvider)
41
+ .with(ReactBrowserProvider)
42
+ .with(ReactBrowserRouterProvider)
43
+ .with(ReactBrowserRendererProvider)
44
+ .with(ReactRouter),
45
+ });
@@ -0,0 +1,19 @@
1
+ export type * from "./components/ErrorViewer.tsx";
2
+ export { default as ErrorViewer } from "./components/ErrorViewer.tsx";
3
+ export type * from "./components/Link.tsx";
4
+ export { default as Link, type LinkProps } from "./components/Link.tsx";
5
+ export type * from "./components/NestedView.tsx";
6
+ export { default as NestedView } from "./components/NestedView.tsx";
7
+ export type * from "./components/NotFound.tsx";
8
+ export { default as NotFound } from "./components/NotFound.tsx";
9
+ export * from "./constants/PAGE_PRELOAD_KEY.ts";
10
+ export * from "./contexts/RouterLayerContext.ts";
11
+ export * from "./errors/Redirection.ts";
12
+ export * from "./hooks/useActive.ts";
13
+ export * from "./hooks/useQueryParams.ts";
14
+ export * from "./hooks/useRouter.ts";
15
+ export * from "./hooks/useRouterState.ts";
16
+ export * from "./primitives/$page.ts";
17
+ export * from "./providers/ReactPageProvider.ts";
18
+ export * from "./services/ReactPageService.ts";
19
+ export * from "./services/ReactRouter.ts";
@@ -0,0 +1,146 @@
1
+ import { $module } from "alepha";
2
+ import { AlephaDateTime } from "alepha/datetime";
3
+ import { AlephaReact } from "alepha/react";
4
+ import { AlephaServer, type ServerRequest } from "alepha/server";
5
+ import { AlephaServerCache } from "alepha/server/cache";
6
+ import { AlephaServerLinks } from "alepha/server/links";
7
+ import type { ReactNode } from "react";
8
+ import { $page, type PageAnimation } from "./primitives/$page.ts";
9
+ import type { ReactHydrationState } from "./providers/ReactBrowserProvider.ts";
10
+ import {
11
+ ReactPageProvider,
12
+ type ReactRouterState,
13
+ } from "./providers/ReactPageProvider.ts";
14
+ import { ReactPreloadProvider } from "./providers/ReactPreloadProvider.ts";
15
+ import { ReactServerProvider } from "./providers/ReactServerProvider.ts";
16
+ import { ReactServerTemplateProvider } from "./providers/ReactServerTemplateProvider.ts";
17
+ import { SSRManifestProvider } from "./providers/SSRManifestProvider.ts";
18
+ import { ReactPageServerService } from "./services/ReactPageServerService.ts";
19
+ import { ReactPageService } from "./services/ReactPageService.ts";
20
+ import { ReactRouter } from "./services/ReactRouter.ts";
21
+
22
+ // ---------------------------------------------------------------------------------------------------------------------
23
+
24
+ export * from "./index.shared.ts";
25
+ export * from "./providers/ReactBrowserProvider.ts";
26
+ export * from "./providers/ReactPageProvider.ts";
27
+ export * from "./providers/ReactPreloadProvider.ts";
28
+ export * from "./providers/ReactServerProvider.ts";
29
+ export * from "./providers/ReactServerTemplateProvider.ts";
30
+ export * from "./providers/SSRManifestProvider.ts";
31
+
32
+ // ---------------------------------------------------------------------------------------------------------------------
33
+
34
+ declare module "alepha" {
35
+ interface State {
36
+ "alepha.react.router.state"?: ReactRouterState;
37
+ }
38
+
39
+ interface Hooks {
40
+ /**
41
+ * Fires when the React application is starting to be rendered on the server.
42
+ */
43
+ "react:server:render:begin": {
44
+ request?: ServerRequest;
45
+ state: ReactRouterState;
46
+ };
47
+ /**
48
+ * Fires when the React application has been rendered on the server.
49
+ */
50
+ "react:server:render:end": {
51
+ request?: ServerRequest;
52
+ state: ReactRouterState;
53
+ html: string;
54
+ };
55
+ // -----------------------------------------------------------------------------------------------------------------
56
+ /**
57
+ * Fires when the React application is being rendered on the browser.
58
+ *
59
+ * Note: this one is not really necessary, it's a hack because we need to isolate renderer from server code in order
60
+ * to avoid including react-dom/client in server bundles.
61
+ */
62
+ "react:browser:render": {
63
+ root: HTMLElement;
64
+ element: ReactNode;
65
+ state: ReactRouterState;
66
+ hydration?: ReactHydrationState;
67
+ };
68
+ // -----------------------------------------------------------------------------------------------------------------
69
+ // SPECIFIC: Route transitions
70
+ /**
71
+ * Fires when a route transition is starting.
72
+ */
73
+ "react:transition:begin": {
74
+ previous: ReactRouterState;
75
+ state: ReactRouterState;
76
+ animation?: PageAnimation;
77
+ };
78
+ /**
79
+ * Fires when a route transition has succeeded.
80
+ */
81
+ "react:transition:success": {
82
+ state: ReactRouterState;
83
+ };
84
+ /**
85
+ * Fires when a route transition has failed.
86
+ */
87
+ "react:transition:error": {
88
+ state: ReactRouterState;
89
+ error: Error;
90
+ };
91
+ /**
92
+ * Fires when a route transition has completed, regardless of success or failure.
93
+ */
94
+ "react:transition:end": {
95
+ state: ReactRouterState;
96
+ };
97
+ }
98
+ }
99
+
100
+ // ---------------------------------------------------------------------------------------------------------------------
101
+
102
+ /**
103
+ * Provides declarative routing with the `$page` primitive for building type-safe React routes.
104
+ *
105
+ * This module enables:
106
+ * - URL pattern matching with parameters (e.g., `/users/:id`)
107
+ * - Nested routing with parent-child relationships
108
+ * - Type-safe URL parameter and query string validation
109
+ * - Server-side data fetching with the `loader` function
110
+ * - Lazy loading and code splitting
111
+ * - Page animations and error handling
112
+ *
113
+ * @see {@link $page}
114
+ * @module alepha.react.router
115
+ */
116
+ export const AlephaReactRouter = $module({
117
+ name: "alepha.react.router",
118
+ primitives: [$page],
119
+ services: [
120
+ ReactPageProvider,
121
+ ReactPageService,
122
+ ReactPreloadProvider,
123
+ ReactRouter,
124
+ ReactServerProvider,
125
+ ReactServerTemplateProvider,
126
+ SSRManifestProvider,
127
+ ReactPageServerService,
128
+ ],
129
+ register: (alepha) =>
130
+ alepha
131
+ .with(AlephaReact)
132
+ .with(AlephaDateTime)
133
+ .with(AlephaServer)
134
+ .with(AlephaServerCache)
135
+ .with(AlephaServerLinks)
136
+ .with({
137
+ provide: ReactPageService,
138
+ use: ReactPageServerService,
139
+ })
140
+ .with(SSRManifestProvider)
141
+ .with(ReactServerTemplateProvider)
142
+ .with(ReactPreloadProvider)
143
+ .with(ReactServerProvider)
144
+ .with(ReactPageProvider)
145
+ .with(ReactRouter),
146
+ });