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 @@
1
+ {"version":3,"file":"index.browser.js","names":["ErrorViewer","NestedView","ErrorViewer","NotFoundPage","NotFoundPage"],"sources":["../../../src/react/router/constants/PAGE_PRELOAD_KEY.ts","../../../src/react/router/services/ReactPageService.ts","../../../src/react/router/primitives/$page.ts","../../../src/react/router/components/NotFound.tsx","../../../src/react/router/components/ErrorViewer.tsx","../../../src/react/router/contexts/RouterLayerContext.ts","../../../src/react/router/errors/Redirection.ts","../../../src/react/router/hooks/useRouterState.ts","../../../src/react/router/components/NestedView.tsx","../../../src/react/router/providers/ReactPageProvider.ts","../../../src/react/router/providers/ReactBrowserRouterProvider.ts","../../../src/react/router/providers/ReactBrowserProvider.ts","../../../src/react/router/providers/ReactBrowserRendererProvider.ts","../../../src/react/router/services/ReactRouter.ts","../../../src/react/router/hooks/useRouter.ts","../../../src/react/router/components/Link.tsx","../../../src/react/router/hooks/useActive.ts","../../../src/react/router/hooks/useQueryParams.ts","../../../src/react/router/index.browser.ts"],"sourcesContent":["/**\n * Symbol key for SSR module preloading path.\n * Using Symbol.for() allows the Vite plugin to inject this at build time.\n * @internal\n */\nexport const PAGE_PRELOAD_KEY = Symbol.for(\"alepha.page.preload\");\n","import { AlephaError } from \"alepha\";\nimport type {\n PagePrimitiveRenderOptions,\n PagePrimitiveRenderResult,\n} from \"../../router/primitives/$page.ts\";\n\n/**\n * $page methods interface.\n */\nexport abstract class ReactPageService {\n public fetch(\n pathname: string,\n options: PagePrimitiveRenderOptions = {},\n ): Promise<{\n html: string;\n response: Response;\n }> {\n throw new AlephaError(\"Fetch is not available for this environment.\");\n }\n\n public render(\n name: string,\n options: PagePrimitiveRenderOptions = {},\n ): Promise<PagePrimitiveRenderResult> {\n throw new AlephaError(\"Render is not available for this environment.\");\n }\n}\n","import {\n $inject,\n type Async,\n createPrimitive,\n KIND,\n Primitive,\n type Static,\n type TSchema,\n} from \"alepha\";\nimport type { ClientOnlyProps } from \"alepha/react\";\nimport type { Head } from \"alepha/react/head\";\nimport type { ServerRequest } from \"alepha/server\";\nimport type { ServerRouteCache } from \"alepha/server/cache\";\nimport type { FC, ReactNode } from \"react\";\nimport { PAGE_PRELOAD_KEY } from \"../constants/PAGE_PRELOAD_KEY.ts\";\nimport type { Redirection } from \"../errors/Redirection.ts\";\nimport type { ReactRouterState } from \"../providers/ReactPageProvider.ts\";\nimport { ReactPageService } from \"../services/ReactPageService.ts\";\n\n/**\n * Main primitive for defining a React route in the application.\n *\n * The $page primitive is the core building block for creating type-safe, SSR-enabled React routes.\n * It provides a declarative way to define pages with powerful features:\n *\n * **Routing & Navigation**\n * - URL pattern matching with parameters (e.g., `/users/:id`)\n * - Nested routing with parent-child relationships\n * - Type-safe URL parameter and query string validation\n *\n * **Data Loading**\n * - Server-side data fetching with the `loader` function\n * - Automatic serialization and hydration for SSR\n * - Access to request context, URL params, and parent data\n *\n * **Component Loading**\n * - Direct component rendering or lazy loading for code splitting\n * - Client-only rendering when browser APIs are needed\n * - Automatic fallback handling during hydration\n *\n * **Performance Optimization**\n * - Static generation for pre-rendered pages at build time\n * - Server-side caching with configurable TTL and providers\n * - Code splitting through lazy component loading\n *\n * **Error Handling**\n * - Custom error handlers with support for redirects\n * - Hierarchical error handling (child → parent)\n * - HTTP status code handling (404, 401, etc.)\n *\n * **Page Animations**\n * - CSS-based enter/exit animations\n * - Dynamic animations based on page state\n * - Custom timing and easing functions\n *\n * **Lifecycle Management**\n * - Server response hooks for headers and status codes\n * - Page leave handlers for cleanup (browser only)\n * - Permission-based access control\n *\n * @example Simple page with data fetching\n * ```typescript\n * const userProfile = $page({\n * path: \"/users/:id\",\n * schema: {\n * params: t.object({ id: t.integer() }),\n * query: t.object({ tab: t.optional(t.text()) })\n * },\n * loader: async ({ params }) => {\n * const user = await userApi.getUser(params.id);\n * return { user };\n * },\n * lazy: () => import(\"./UserProfile.tsx\")\n * });\n * ```\n *\n * @example Nested routing with error handling\n * ```typescript\n * const projectSection = $page({\n * path: \"/projects/:id\",\n * children: () => [projectBoard, projectSettings],\n * loader: async ({ params }) => {\n * const project = await projectApi.get(params.id);\n * return { project };\n * },\n * errorHandler: (error) => {\n * if (HttpError.is(error, 404)) {\n * return <ProjectNotFound />;\n * }\n * }\n * });\n * ```\n *\n * @example Static generation with caching\n * ```typescript\n * const blogPost = $page({\n * path: \"/blog/:slug\",\n * static: {\n * entries: posts.map(p => ({ params: { slug: p.slug } }))\n * },\n * loader: async ({ params }) => {\n * const post = await loadPost(params.slug);\n * return { post };\n * }\n * });\n * ```\n */\nexport const $page = <\n TConfig extends PageConfigSchema = PageConfigSchema,\n TProps extends object = TPropsDefault,\n TPropsParent extends object = TPropsParentDefault,\n>(\n options: PagePrimitiveOptions<TConfig, TProps, TPropsParent>,\n): PagePrimitive<TConfig, TProps, TPropsParent> => {\n return createPrimitive(PagePrimitive<TConfig, TProps, TPropsParent>, options);\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface PagePrimitiveOptions<\n TConfig extends PageConfigSchema = PageConfigSchema,\n TProps extends object = TPropsDefault,\n TPropsParent extends object = TPropsParentDefault,\n> {\n /**\n * Identifier name for the page. Must be unique.\n *\n * @default Primitive key\n */\n name?: string;\n\n /**\n * Add a pathname to the page.\n *\n * Pathname can contain parameters, like `/post/:slug`.\n *\n * @default \"\"\n */\n path?: string;\n\n /**\n * Add an input schema to define:\n * - `params`: parameters from the pathname.\n * - `query`: query parameters from the URL.\n */\n schema?: TConfig;\n\n /**\n * Load data before rendering the page.\n *\n * This function receives\n * - the request context (params, query, etc.)\n * - the parent props (if page has a parent)\n *\n * > In SSR, the returned data will be serialized and sent to the client, then reused during the client-side hydration.\n *\n * Loader can be stopped by throwing an error, which will be handled by the `errorHandler` function.\n * It's common to throw a `NotFoundError` to display a 404 page.\n *\n * RedirectError can be thrown to redirect the user to another page.\n */\n loader?: (context: PageLoader<TConfig, TPropsParent>) => Async<TProps>;\n\n /**\n * Default props to pass to the component when rendering the page.\n *\n * Resolved props from the `resolve` function will override these default props.\n */\n props?: () => Partial<TProps>;\n\n /**\n * The component to render when the page is loaded.\n *\n * If `lazy` is defined, this will be ignored.\n * Prefer using `lazy` to improve the initial loading time.\n */\n component?: FC<TProps & TPropsParent>;\n\n /**\n * Lazy load the component when the page is loaded.\n *\n * It's recommended to use this for components to improve the initial loading time\n * and enable code-splitting.\n */\n lazy?: () => Promise<{ default: FC<TProps & TPropsParent> }>;\n\n /**\n * Attach child pages to create nested routes.\n * This will make the page a parent route.\n */\n children?: Array<PagePrimitive> | (() => Array<PagePrimitive>);\n\n /**\n * Define a parent page for nested routing.\n */\n parent?: PagePrimitive<PageConfigSchema, TPropsParent, any>;\n\n /**\n * Function to determine if the page can be accessed.\n *\n * If it returns false, the page will not be accessible and a 403 Forbidden error will be returned.\n * This function can be used to implement permission-based access control.\n */\n can?: () => boolean;\n\n /**\n * Catch any error from the `loader` function or during `rendering`.\n *\n * Expected to return one of the following:\n * - a ReactNode to render an error page\n * - a Redirection to redirect the user\n * - undefined to let the error propagate\n *\n * If not defined, the error will be thrown and handled by the server or client error handler.\n * If a leaf $page does not define an error handler, the error can be caught by parent pages.\n *\n * @example Catch a 404 from API and render a custom not found component:\n * ```ts\n * loader: async ({ params, query }) => {\n * api.fetch(\"/api/resource\", { params, query });\n * },\n * errorHandler: (error, context) => {\n * if (HttpError.is(error, 404)) {\n * return <ResourceNotFound />;\n * }\n * }\n * ```\n *\n * @example Catch an 401 error and redirect the user to the login page:\n * ```ts\n * loader: async ({ params, query }) => {\n * // but the user is not authenticated\n * api.fetch(\"/api/resource\", { params, query });\n * },\n * errorHandler: (error, context) => {\n * if (HttpError.is(error, 401)) {\n * // throwing a Redirection is also valid!\n * return new Redirection(\"/login\");\n * }\n * }\n * ```\n */\n errorHandler?: ErrorHandler;\n\n /**\n * If true, the page will be considered as a static page, immutable and cacheable.\n * Replace boolean by an object to define static entries. (e.g. list of params/query)\n *\n * Browser-side: it only works with `alepha/vite`, which can pre-render the page at build time.\n *\n * Server-side: It will act as timeless cached page. You can use `cache` to configure the cache behavior.\n */\n static?:\n | boolean\n | {\n entries?: Array<Partial<PageRequestConfig<TConfig>>>;\n };\n\n cache?: ServerRouteCache;\n\n /**\n * If true, force the page to be rendered only on the client-side (browser).\n * It uses the `<ClientOnly/>` component to render the page.\n */\n client?: boolean | ClientOnlyProps;\n\n /**\n * Called before the server response is sent to the client. (server only)\n */\n onServerResponse?: (request: ServerRequest) => unknown;\n\n /**\n * Called when user enters the page. (browser only)\n *\n * Useful for browser-only side effects like analytics, scroll management,\n * or focus handling that don't need to return data to the component.\n *\n * @example\n * ```ts\n * onEnter: () => {\n * analytics.trackPageView(\"/dashboard\");\n * window.scrollTo(0, 0);\n * }\n * ```\n */\n onEnter?: () => void;\n\n /**\n * Called when user leaves the page. (browser only)\n */\n onLeave?: () => void;\n\n /**\n * @experimental\n *\n * Add a css animation when the page is loaded or unloaded.\n * It uses CSS animations, so you need to define the keyframes in your CSS.\n *\n * @example Simple animation name\n * ```ts\n * animation: \"fadeIn\"\n * ```\n *\n * CSS example:\n * ```css\n * @keyframes fadeIn {\n * from { opacity: 0; }\n * to { opacity: 1; }\n * }\n * ```\n *\n * @example Detailed animation\n * ```ts\n * animation: {\n * enter: { name: \"fadeIn\", duration: 300 },\n * exit: { name: \"fadeOut\", duration: 200, timing: \"ease-in-out\" },\n * }\n * ```\n *\n * @example Only exit animation\n * ```ts\n * animation: {\n * exit: \"fadeOut\"\n * }\n * ```\n *\n * @example With custom timing function\n * ```ts\n * animation: {\n * enter: { name: \"fadeIn\", duration: 300, timing: \"cubic-bezier(0.4, 0, 0.2, 1)\" },\n * exit: { name: \"fadeOut\", duration: 200, timing: \"ease-in-out\" },\n * }\n * ```\n */\n animation?: PageAnimation;\n\n /**\n * Head configuration for the page (title, meta tags, etc.).\n *\n * Can be a static object or a function that receives resolved props.\n *\n * @example Static head\n * ```ts\n * head: {\n * title: \"My Page\",\n * description: \"Page description\",\n * }\n * ```\n *\n * @example Dynamic head based on props\n * ```ts\n * head: (props) => ({\n * title: props.user.name,\n * description: `Profile of ${props.user.name}`,\n * })\n * ```\n */\n head?: Head | ((props: TProps, previous?: Head) => Head);\n\n /**\n * Source path for SSR module preloading.\n *\n * This is automatically injected by the viteAlephaPreload plugin.\n * It maps to the source file path used in Vite's SSR manifest.\n *\n * @internal\n */\n [PAGE_PRELOAD_KEY]?: string;\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class PagePrimitive<\n TConfig extends PageConfigSchema = PageConfigSchema,\n TProps extends object = TPropsDefault,\n TPropsParent extends object = TPropsParentDefault,\n> extends Primitive<PagePrimitiveOptions<TConfig, TProps, TPropsParent>> {\n protected readonly reactPageService = $inject(ReactPageService);\n\n protected onInit() {\n if (this.options.static) {\n this.options.cache ??= {\n store: {\n provider: \"memory\",\n ttl: [1, \"week\"],\n },\n };\n }\n }\n\n public get name(): string {\n return this.options.name ?? this.config.propertyKey;\n }\n\n /**\n * For testing or build purposes.\n *\n * This will render the page (HTML layout included or not) and return the HTML + context.\n * Only valid for server-side rendering, it will throw an error if called on the client-side.\n */\n public async render(\n options?: PagePrimitiveRenderOptions,\n ): Promise<PagePrimitiveRenderResult> {\n return this.reactPageService.render(this.name, options);\n }\n\n public async fetch(options?: PagePrimitiveRenderOptions): Promise<{\n html: string;\n response: Response;\n }> {\n return this.reactPageService.fetch(this.options.path || \"\", options);\n }\n}\n\n$page[KIND] = PagePrimitive;\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport type ErrorHandler = (\n error: Error,\n state: ReactRouterState,\n) => ReactNode | Redirection | undefined;\n\nexport interface PageConfigSchema {\n query?: TSchema;\n params?: TSchema;\n}\n\nexport type TPropsDefault = any;\n\nexport type TPropsParentDefault = {};\n\nexport interface PagePrimitiveRenderOptions {\n params?: Record<string, string>;\n query?: Record<string, string>;\n\n /**\n * If true, the HTML layout will be included in the response.\n * If false, only the page content will be returned.\n *\n * @default true\n */\n html?: boolean;\n hydration?: boolean;\n}\n\nexport interface PagePrimitiveRenderResult {\n html: string;\n state: ReactRouterState;\n redirect?: string;\n}\n\nexport interface PageRequestConfig<\n TConfig extends PageConfigSchema = PageConfigSchema,\n> {\n params: TConfig[\"params\"] extends TSchema\n ? Static<TConfig[\"params\"]>\n : Record<string, string>;\n\n query: TConfig[\"query\"] extends TSchema\n ? Static<TConfig[\"query\"]>\n : Record<string, string>;\n}\n\nexport type PageLoader<\n TConfig extends PageConfigSchema = PageConfigSchema,\n TPropsParent extends object = TPropsParentDefault,\n> = PageRequestConfig<TConfig> &\n TPropsParent &\n Omit<ReactRouterState, \"layers\" | \"onError\">;\n\nexport type PageAnimation =\n | PageAnimationObject\n | ((state: ReactRouterState) => PageAnimationObject | undefined);\n\ntype PageAnimationObject =\n | CssAnimationName\n | {\n enter?: CssAnimation | CssAnimationName;\n exit?: CssAnimation | CssAnimationName;\n };\n\ntype CssAnimationName = string;\n\ntype CssAnimation = {\n name: string;\n duration?: number;\n timing?: string;\n};\n","import type { CSSProperties } from \"react\";\n\n/**\n * Default 404 Not Found page component.\n */\nconst NotFound = (props: { style?: CSSProperties }) => (\n <div\n style={{\n width: \"100%\",\n minHeight: \"90vh\",\n boxSizing: \"border-box\",\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n alignItems: \"center\",\n textAlign: \"center\",\n fontFamily:\n 'system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif',\n padding: \"2rem\",\n ...props.style,\n }}\n >\n <div style={{ fontSize: \"6rem\", fontWeight: 200, lineHeight: 1 }}>404</div>\n <div style={{ fontSize: \"0.875rem\", marginTop: \"1rem\", opacity: 0.6 }}>\n Page not found\n </div>\n </div>\n);\n\nexport default NotFound;\n","import type { Alepha } from \"alepha\";\nimport { type CSSProperties, useEffect, useRef, useState } from \"react\";\n\ninterface ErrorViewerProps {\n error: Error;\n alepha: Alepha;\n}\n\ninterface StackFrame {\n fn: string;\n file: string;\n line: string;\n col: string;\n raw: string;\n isNodeModules: boolean;\n}\n\nconst isBrowser = typeof window !== \"undefined\";\n\n/**\n * Error viewer component - Terminal/brutalist aesthetic\n */\nconst ErrorViewer = ({ error, alepha }: ErrorViewerProps) => {\n const [expanded, setExpanded] = useState(false);\n const [showNodeModules, setShowNodeModules] = useState(false);\n const [visible, setVisible] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const isProduction = alepha.isProduction();\n\n // Animate in on mount\n useEffect(() => {\n const timer = setTimeout(() => setVisible(true), 10);\n return () => clearTimeout(timer);\n }, []);\n\n // Keyboard shortcuts\n useEffect(() => {\n if (!isBrowser) return;\n const handler = (e: KeyboardEvent) => {\n if (e.key === \"c\" && !e.metaKey && !e.ctrlKey) {\n copyToClipboard(error.stack || error.message);\n }\n };\n window.addEventListener(\"keydown\", handler);\n return () => window.removeEventListener(\"keydown\", handler);\n }, [error]);\n\n if (isProduction) {\n return <ErrorViewerProduction />;\n }\n\n const frames = parseStackTrace(error.stack);\n const appFrames = frames.filter((f) => !f.isNodeModules);\n const nodeModulesFrames = frames.filter((f) => f.isNodeModules);\n const visibleAppFrames = expanded ? appFrames : appFrames.slice(0, 5);\n const hiddenAppCount = appFrames.length - 5;\n const timestamp = new Date().toLocaleTimeString(\"en-US\", {\n hour12: false,\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n });\n\n return (\n <div\n ref={containerRef}\n style={{\n ...styles.overlay,\n opacity: visible ? 1 : 0,\n }}\n role=\"alertdialog\"\n aria-modal=\"true\"\n aria-labelledby=\"error-viewer-title\"\n >\n {/* Scan lines effect */}\n <div style={styles.scanlines} aria-hidden=\"true\" />\n\n <div\n style={{\n ...styles.container,\n transform: visible ? \"translateY(0)\" : \"translateY(-20px)\",\n opacity: visible ? 1 : 0,\n }}\n >\n {/* Terminal header bar */}\n <div style={styles.terminalBar}>\n <div style={styles.terminalDots}>\n <span style={{ ...styles.dot, backgroundColor: \"#ff5f57\" }} />\n <span style={{ ...styles.dot, backgroundColor: \"#febc2e\" }} />\n <span style={{ ...styles.dot, backgroundColor: \"#28c840\" }} />\n </div>\n <div style={styles.terminalTitle}>\n <span style={styles.terminalTitleText}>error — {timestamp}</span>\n </div>\n <div style={styles.terminalActions}>\n <kbd style={styles.kbd}>C</kbd>\n <span style={styles.kbdLabel}>copy</span>\n </div>\n </div>\n\n {/* Error header */}\n <Header error={error} />\n\n {/* Stack trace */}\n <div style={styles.stackSection}>\n <div style={styles.stackHeader}>\n <span style={styles.stackHeaderText}>STACK TRACE</span>\n <span style={styles.stackCount}>\n {appFrames.length} frames\n {nodeModulesFrames.length > 0 &&\n ` · ${nodeModulesFrames.length} in node_modules`}\n </span>\n </div>\n\n <div style={styles.frameList}>\n {visibleAppFrames.map((frame, i) => (\n <StackFrameRow\n key={`${frame.raw}-${i}`}\n frame={frame}\n index={i}\n />\n ))}\n\n {hiddenAppCount > 0 && !expanded && (\n <ExpandButton\n onClick={() => setExpanded(true)}\n label={`Show ${hiddenAppCount} more frames`}\n />\n )}\n\n {expanded && hiddenAppCount > 0 && (\n <ExpandButton\n onClick={() => setExpanded(false)}\n label=\"Collapse\"\n />\n )}\n\n {nodeModulesFrames.length > 0 && (\n <>\n <button\n type=\"button\"\n onClick={() => setShowNodeModules(!showNodeModules)}\n style={styles.nodeModulesToggle}\n >\n <span style={styles.nodeModulesIcon}>\n {showNodeModules ? \"▼\" : \"▶\"}\n </span>\n <span style={styles.nodeModulesLabel}>node_modules</span>\n <span style={styles.nodeModulesCount}>\n {nodeModulesFrames.length}\n </span>\n </button>\n\n {showNodeModules && (\n <div style={styles.nodeModulesFrames}>\n {nodeModulesFrames.map((frame, i) => (\n <StackFrameRow\n key={`nm-${frame.raw}-${i}`}\n frame={frame}\n index={appFrames.length + i}\n dimmed\n />\n ))}\n </div>\n )}\n </>\n )}\n </div>\n </div>\n\n {/* Footer */}\n <div style={styles.footer}>\n <span style={styles.footerText}>\n Press <kbd style={styles.kbdInline}>C</kbd> to copy stack trace\n </span>\n </div>\n </div>\n </div>\n );\n};\n\nexport default ErrorViewer;\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nfunction parseStackTrace(stack?: string): StackFrame[] {\n if (!stack) return [];\n\n const lines = stack.split(\"\\n\").slice(1);\n const frames: StackFrame[] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed.startsWith(\"at \")) continue;\n\n const frame = parseStackLine(trimmed);\n if (frame) frames.push(frame);\n }\n\n return frames;\n}\n\nfunction parseStackLine(line: string): StackFrame | null {\n const isNodeModules = line.includes(\"node_modules\") || line.includes(\"node:\");\n\n const withFn = line.match(/^at\\s+(.+?)\\s+\\((.+):(\\d+):(\\d+)\\)$/);\n if (withFn) {\n return {\n fn: withFn[1],\n file: withFn[2],\n line: withFn[3],\n col: withFn[4],\n raw: line,\n isNodeModules,\n };\n }\n\n const withoutFn = line.match(/^at\\s+(.+):(\\d+):(\\d+)$/);\n if (withoutFn) {\n return {\n fn: \"<anonymous>\",\n file: withoutFn[1],\n line: withoutFn[2],\n col: withoutFn[3],\n raw: line,\n isNodeModules,\n };\n }\n\n return {\n fn: \"\",\n file: line.replace(/^at\\s+/, \"\"),\n line: \"\",\n col: \"\",\n raw: line,\n isNodeModules,\n };\n}\n\nfunction copyToClipboard(text: string): Promise<boolean> {\n if (!isBrowser || !navigator.clipboard) {\n return Promise.resolve(false);\n }\n return navigator.clipboard\n .writeText(text)\n .then(() => true)\n .catch(() => false);\n}\n\n/**\n * Header with error badge and message\n */\nfunction Header({ error }: { error: Error }) {\n const [copied, setCopied] = useState(false);\n const [hovered, setHovered] = useState(false);\n\n useEffect(() => {\n if (!copied) return;\n const timer = setTimeout(() => setCopied(false), 2000);\n return () => clearTimeout(timer);\n }, [copied]);\n\n const handleCopy = async () => {\n const success = await copyToClipboard(error.stack || error.message);\n if (success) setCopied(true);\n };\n\n return (\n <div style={styles.header}>\n <div style={styles.headerRow}>\n {/* Glowing error indicator */}\n <div style={styles.errorIndicator}>\n <div style={styles.errorGlow} />\n <div style={styles.errorBadge}>{error.name}</div>\n </div>\n\n <button\n type=\"button\"\n onClick={handleCopy}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n style={{\n ...styles.copyBtn,\n ...(hovered ? styles.copyBtnHover : {}),\n }}\n >\n {copied ? \"✓ Copied\" : \"Copy\"}\n </button>\n </div>\n\n <h1 id=\"error-viewer-title\" style={styles.message}>\n {error.message}\n </h1>\n </div>\n );\n}\n\n/**\n * Single stack frame row\n */\nfunction StackFrameRow({\n frame,\n index,\n dimmed = false,\n}: {\n frame: StackFrame;\n index: number;\n dimmed?: boolean;\n}) {\n const [hovered, setHovered] = useState(false);\n const isFirst = index === 0 && !dimmed;\n const fileName = frame.file.split(\"/\").pop() || frame.file;\n const dirPath = frame.file.substring(0, frame.file.length - fileName.length);\n\n // Build vscode:// link for clickable paths\n const vsCodeLink =\n frame.file && frame.line\n ? `vscode://file${frame.file}:${frame.line}:${frame.col || 1}`\n : null;\n\n const content = (\n <>\n <div\n style={{\n ...styles.frameIndex,\n color: isFirst ? \"#ff6b6b\" : dimmed ? \"#555\" : \"#666\",\n }}\n >\n {String(index + 1).padStart(2, \"0\")}\n </div>\n <div style={styles.frameContent}>\n {frame.fn && (\n <div\n style={{\n ...styles.fnName,\n color: dimmed ? \"#888\" : \"#f0f0f0\",\n }}\n >\n {formatFunctionName(frame.fn)}\n </div>\n )}\n <div style={styles.filePath}>\n <span style={{ ...styles.dirPath, opacity: dimmed ? 0.6 : 0.8 }}>\n {dirPath}\n </span>\n <span\n style={{\n ...styles.fileName,\n color: dimmed ? \"#5a9aba\" : \"#7cc4eb\",\n }}\n >\n {fileName}\n </span>\n {frame.line && (\n <span\n style={{\n ...styles.lineCol,\n color: dimmed ? \"#9a8a40\" : \"#e5b83a\",\n }}\n >\n :{frame.line}\n {frame.col && `:${frame.col}`}\n </span>\n )}\n </div>\n </div>\n </>\n );\n\n const rowStyles: CSSProperties = {\n ...styles.frame,\n ...(isFirst ? styles.frameFirst : {}),\n backgroundColor: hovered ? \"rgba(255,255,255,0.03)\" : \"transparent\",\n };\n\n if (vsCodeLink && isBrowser) {\n return (\n <a\n href={vsCodeLink}\n style={{ ...rowStyles, textDecoration: \"none\" }}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n >\n {content}\n </a>\n );\n }\n\n return <div style={rowStyles}>{content}</div>;\n}\n\n/**\n * Format function name with syntax highlighting\n */\nfunction formatFunctionName(fn: string): React.ReactNode {\n // Highlight async/Object/Class prefixes\n const asyncMatch = fn.match(/^(async\\s+)?(.+)$/);\n if (asyncMatch?.[1]) {\n return (\n <>\n <span style={{ color: \"#c678dd\" }}>async </span>\n <span>{asyncMatch[2]}</span>\n </>\n );\n }\n\n // Highlight method calls like Object.method\n const methodMatch = fn.match(/^(.+)\\.([^.]+)$/);\n if (methodMatch) {\n return (\n <>\n <span style={{ color: \"#e5c07b\" }}>{methodMatch[1]}</span>\n <span style={{ color: \"#666\" }}>.</span>\n <span>{methodMatch[2]}</span>\n </>\n );\n }\n\n return fn;\n}\n\n/**\n * Expand/collapse button\n */\nfunction ExpandButton({\n onClick,\n label,\n}: {\n onClick: () => void;\n label: string;\n}) {\n const [hovered, setHovered] = useState(false);\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n style={{\n ...styles.expandBtn,\n backgroundColor: hovered ? \"rgba(255,255,255,0.05)\" : \"transparent\",\n color: hovered ? \"#aaa\" : \"#777\",\n }}\n >\n {label}\n </button>\n );\n}\n\n/**\n * Production error view - minimal, user-friendly\n */\nfunction ErrorViewerProduction() {\n const [hovered, setHovered] = useState(false);\n\n const handleReload = () => {\n if (isBrowser) window.location.reload();\n };\n\n return (\n <div style={styles.overlay} role=\"alertdialog\" aria-modal=\"true\">\n <div style={styles.prodContainer}>\n <div style={styles.prodIcon}>\n <svg\n width=\"32\"\n height=\"32\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n </div>\n <h1 style={styles.prodTitle}>Something went wrong</h1>\n <p style={styles.prodMessage}>\n We encountered an unexpected error. Please try again.\n </p>\n <button\n type=\"button\"\n onClick={handleReload}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n style={{\n ...styles.prodButton,\n backgroundColor: hovered ? \"#333\" : \"#222\",\n borderColor: hovered ? \"#555\" : \"#444\",\n }}\n >\n Reload page\n </button>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n// Styles\n// ---------------------------------------------------------------------------------------------------------------------\n\nconst MONO_FONT =\n 'ui-monospace, \"JetBrains Mono\", \"Fira Code\", SFMono-Regular, Menlo, Monaco, Consolas, monospace';\n\nconst styles: Record<string, CSSProperties> = {\n overlay: {\n position: \"fixed\",\n inset: 0,\n backgroundColor: \"rgba(0, 0, 0, 0.92)\",\n display: \"flex\",\n alignItems: \"flex-start\",\n justifyContent: \"center\",\n padding: \"40px 20px\",\n overflow: \"auto\",\n fontFamily: MONO_FONT,\n fontSize: \"13px\",\n zIndex: 99999,\n transition: \"opacity 0.2s ease-out\",\n },\n\n scanlines: {\n position: \"fixed\",\n inset: 0,\n background:\n \"repeating-linear-gradient(0deg, transparent, transparent 2px, rgba(0,0,0,0.1) 2px, rgba(0,0,0,0.1) 4px)\",\n pointerEvents: \"none\",\n zIndex: 100000,\n },\n\n container: {\n width: \"100%\",\n maxWidth: \"900px\",\n backgroundColor: \"#0d0d0d\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n boxShadow: \"0 0 0 1px #333, 0 25px 80px -12px rgba(0, 0, 0, 0.8)\",\n transition: \"transform 0.3s ease-out, opacity 0.3s ease-out\",\n },\n\n // Terminal bar\n terminalBar: {\n display: \"flex\",\n alignItems: \"center\",\n padding: \"12px 16px\",\n backgroundColor: \"#1a1a1a\",\n borderBottom: \"1px solid #333\",\n },\n\n terminalDots: {\n display: \"flex\",\n gap: \"8px\",\n },\n\n dot: {\n width: \"12px\",\n height: \"12px\",\n borderRadius: \"50%\",\n },\n\n terminalTitle: {\n flex: 1,\n textAlign: \"center\",\n },\n\n terminalTitleText: {\n color: \"#777\",\n fontSize: \"12px\",\n letterSpacing: \"0.5px\",\n },\n\n terminalActions: {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n },\n\n kbd: {\n display: \"inline-block\",\n padding: \"2px 6px\",\n backgroundColor: \"#2a2a2a\",\n borderRadius: \"4px\",\n fontSize: \"11px\",\n color: \"#aaa\",\n border: \"1px solid #444\",\n },\n\n kbdInline: {\n display: \"inline-block\",\n padding: \"1px 5px\",\n backgroundColor: \"#222\",\n borderRadius: \"3px\",\n fontSize: \"11px\",\n color: \"#888\",\n border: \"1px solid #444\",\n marginLeft: \"4px\",\n marginRight: \"4px\",\n },\n\n kbdLabel: {\n color: \"#777\",\n fontSize: \"11px\",\n },\n\n // Header\n header: {\n padding: \"24px\",\n borderBottom: \"1px solid #333\",\n },\n\n headerRow: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n marginBottom: \"16px\",\n },\n\n errorIndicator: {\n position: \"relative\",\n display: \"inline-flex\",\n },\n\n errorGlow: {\n position: \"absolute\",\n inset: \"-4px\",\n background:\n \"radial-gradient(ellipse at center, rgba(255,80,80,0.3) 0%, transparent 70%)\",\n borderRadius: \"12px\",\n filter: \"blur(8px)\",\n },\n\n errorBadge: {\n position: \"relative\",\n display: \"inline-block\",\n padding: \"6px 14px\",\n backgroundColor: \"#3d1a1a\",\n color: \"#ff7b7b\",\n fontSize: \"12px\",\n fontWeight: 600,\n borderRadius: \"6px\",\n border: \"1px solid #5a2828\",\n letterSpacing: \"0.5px\",\n },\n\n copyBtn: {\n padding: \"8px 14px\",\n backgroundColor: \"transparent\",\n color: \"#888\",\n fontSize: \"12px\",\n fontWeight: 500,\n borderWidth: \"1px\",\n borderStyle: \"solid\",\n borderColor: \"#444\",\n borderRadius: \"6px\",\n cursor: \"pointer\",\n transition: \"all 0.15s\",\n fontFamily: MONO_FONT,\n },\n\n copyBtnHover: {\n backgroundColor: \"#252525\",\n color: \"#bbb\",\n borderColor: \"#555\",\n },\n\n message: {\n margin: 0,\n fontSize: \"18px\",\n fontWeight: 400,\n color: \"#e8e8e8\",\n lineHeight: 1.6,\n wordBreak: \"break-word\",\n fontFamily: MONO_FONT,\n },\n\n // Stack section\n stackSection: {\n borderTop: \"1px solid #2a2a2a\",\n },\n\n stackHeader: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"14px 24px\",\n borderBottom: \"1px solid #2a2a2a\",\n },\n\n stackHeaderText: {\n fontSize: \"10px\",\n fontWeight: 600,\n color: \"#666\",\n letterSpacing: \"1.5px\",\n },\n\n stackCount: {\n fontSize: \"11px\",\n color: \"#555\",\n },\n\n frameList: {\n display: \"flex\",\n flexDirection: \"column\",\n },\n\n frame: {\n display: \"flex\",\n alignItems: \"flex-start\",\n padding: \"12px 24px\",\n borderBottom: \"1px solid #222\",\n transition: \"background-color 0.1s\",\n cursor: \"pointer\",\n },\n\n frameFirst: {\n backgroundColor: \"rgba(255, 80, 80, 0.08)\",\n borderLeft: \"2px solid #ff6b6b\",\n },\n\n frameIndex: {\n width: \"28px\",\n flexShrink: 0,\n fontSize: \"11px\",\n fontWeight: 500,\n fontFamily: MONO_FONT,\n },\n\n frameContent: {\n flex: 1,\n minWidth: 0,\n },\n\n fnName: {\n fontSize: \"13px\",\n fontWeight: 500,\n marginBottom: \"4px\",\n fontFamily: MONO_FONT,\n },\n\n filePath: {\n fontSize: \"12px\",\n color: \"#888\",\n fontFamily: MONO_FONT,\n wordBreak: \"break-all\",\n },\n\n dirPath: {\n color: \"#666\",\n },\n\n fileName: {\n color: \"#7cc4eb\",\n },\n\n lineCol: {\n color: \"#e5b83a\",\n },\n\n expandBtn: {\n width: \"100%\",\n padding: \"14px 24px\",\n backgroundColor: \"transparent\",\n color: \"#777\",\n fontSize: \"12px\",\n fontWeight: 500,\n border: \"none\",\n borderTop: \"1px solid #2a2a2a\",\n cursor: \"pointer\",\n textAlign: \"left\",\n transition: \"all 0.15s\",\n fontFamily: MONO_FONT,\n },\n\n nodeModulesToggle: {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"10px\",\n width: \"100%\",\n padding: \"12px 24px\",\n backgroundColor: \"#0a0a0a\",\n color: \"#666\",\n fontSize: \"11px\",\n fontWeight: 500,\n border: \"none\",\n borderTop: \"1px solid #2a2a2a\",\n cursor: \"pointer\",\n textAlign: \"left\",\n fontFamily: MONO_FONT,\n },\n\n nodeModulesIcon: {\n fontSize: \"8px\",\n color: \"#555\",\n },\n\n nodeModulesLabel: {\n flex: 1,\n letterSpacing: \"0.5px\",\n },\n\n nodeModulesCount: {\n color: \"#555\",\n },\n\n nodeModulesFrames: {\n backgroundColor: \"#080808\",\n },\n\n footer: {\n padding: \"14px 24px\",\n borderTop: \"1px solid #2a2a2a\",\n backgroundColor: \"#0a0a0a\",\n },\n\n footerText: {\n fontSize: \"11px\",\n color: \"#555\",\n },\n\n // Production styles\n prodContainer: {\n textAlign: \"center\",\n padding: \"60px 40px\",\n backgroundColor: \"#0d0d0d\",\n borderRadius: \"8px\",\n maxWidth: \"400px\",\n border: \"1px solid #333\",\n },\n\n prodIcon: {\n width: \"64px\",\n height: \"64px\",\n margin: \"0 auto 24px\",\n color: \"#666\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n\n prodTitle: {\n margin: \"0 0 12px\",\n fontSize: \"18px\",\n fontWeight: 500,\n color: \"#f0f0f0\",\n fontFamily: MONO_FONT,\n },\n\n prodMessage: {\n margin: \"0 0 28px\",\n fontSize: \"13px\",\n color: \"#888\",\n lineHeight: 1.6,\n fontFamily: MONO_FONT,\n },\n\n prodButton: {\n padding: \"12px 24px\",\n backgroundColor: \"#222\",\n color: \"#bbb\",\n fontSize: \"13px\",\n fontWeight: 500,\n borderWidth: \"1px\",\n borderStyle: \"solid\",\n borderColor: \"#444\",\n borderRadius: \"6px\",\n cursor: \"pointer\",\n transition: \"all 0.15s\",\n fontFamily: MONO_FONT,\n },\n};\n","import { createContext } from \"react\";\nimport type { ErrorHandler } from \"../primitives/$page.ts\";\n\nexport interface RouterLayerContextValue {\n index: number;\n path: string;\n onError: ErrorHandler;\n}\n\nexport const RouterLayerContext = createContext<\n RouterLayerContextValue | undefined\n>(undefined);\n","import { AlephaError } from \"alepha\";\n\n/**\n * Used for Redirection during the page loading.\n *\n * Depends on the context, it can be thrown or just returned.\n *\n * @example\n * ```ts\n * import { Redirection } from \"alepha/react\";\n *\n * const MyPage = $page({\n * loader: async () => {\n * if (needRedirect) {\n * throw new Redirection(\"/new-path\");\n * }\n * },\n * });\n * ```\n */\nexport class Redirection extends AlephaError {\n public readonly redirect: string;\n\n constructor(redirect: string) {\n super(\"Redirection\");\n this.redirect = redirect;\n }\n}\n","import { AlephaError } from \"alepha\";\nimport { useStore } from \"alepha/react\";\nimport type { ReactRouterState } from \"../providers/ReactPageProvider.ts\";\n\nexport const useRouterState = (): ReactRouterState => {\n const [state] = useStore(\"alepha.react.router.state\");\n if (!state) {\n throw new AlephaError(\"Missing react router state\");\n }\n return state;\n};\n","import { ErrorBoundary, useAlepha, useEvents } from \"alepha/react\";\nimport { memo, type ReactNode, use, useRef, useState } from \"react\";\nimport { RouterLayerContext } from \"../contexts/RouterLayerContext.ts\";\nimport { Redirection } from \"../errors/Redirection.ts\";\nimport { useRouterState } from \"../hooks/useRouterState.ts\";\nimport type { PageAnimation } from \"../primitives/$page.ts\";\nimport type { ReactRouterState } from \"../providers/ReactPageProvider.ts\";\nimport ErrorViewer from \"./ErrorViewer.tsx\";\n\nexport interface NestedViewProps {\n children?: ReactNode;\n errorBoundary?: false | ((error: Error) => ReactNode);\n}\n\n/**\n * A component that renders the current view of the nested router layer.\n *\n * To be simple, it renders the `element` of the current child page of a parent page.\n *\n * @example\n * ```tsx\n * import { NestedView } from \"alepha/react\";\n *\n * class App {\n * parent = $page({\n * component: () => <NestedView />,\n * });\n *\n * child = $page({\n * parent: this.root,\n * component: () => <div>Child Page</div>,\n * });\n * }\n * ```\n */\nconst NestedView = (props: NestedViewProps) => {\n const routerLayer = use(RouterLayerContext);\n const index = routerLayer?.index ?? 0;\n const onError = routerLayer?.onError;\n const state = useRouterState();\n const alepha = useAlepha();\n\n const [view, setView] = useState<ReactNode | undefined>(\n state.layers[index]?.element,\n );\n\n const [animation, setAnimation] = useState(\"\");\n const animationExitDuration = useRef<number>(0);\n const animationExitNow = useRef<number>(0);\n\n useEvents(\n {\n \"react:transition:begin\": async ({ previous, state }) => {\n // --------- Animations Begin ---------\n const layer = previous.layers[index];\n if (!layer) {\n return;\n }\n\n if (`${state.url.pathname}/`.startsWith(`${layer.path}/`)) {\n return;\n }\n\n const animationExit = parseAnimation(\n layer.route?.animation,\n state,\n \"exit\",\n );\n\n if (animationExit) {\n const duration = animationExit.duration || 200;\n animationExitNow.current = Date.now();\n animationExitDuration.current = duration;\n setAnimation(animationExit.animation);\n } else {\n animationExitNow.current = 0;\n animationExitDuration.current = 0;\n setAnimation(\"\");\n }\n // --------- Animations End ---------\n },\n \"react:transition:end\": async ({ state }) => {\n const layer = state.layers[index];\n\n // --------- Animations Begin ---------\n if (animationExitNow.current) {\n const duration = animationExitDuration.current;\n const diff = Date.now() - animationExitNow.current;\n if (diff < duration) {\n await new Promise((resolve) =>\n setTimeout(resolve, duration - diff),\n );\n }\n }\n // --------- Animations End ---------\n\n if (!layer?.cache) {\n setView(layer?.element);\n\n // --------- Animations Begin ---------\n const animationEnter = parseAnimation(\n layer?.route?.animation,\n state,\n \"enter\",\n );\n\n if (animationEnter) {\n setAnimation(animationEnter.animation);\n } else {\n setAnimation(\"\");\n }\n // --------- Animations End ---------\n }\n },\n },\n [],\n );\n\n let element = view ?? props.children ?? null;\n\n // --------- Animations Begin ---------\n if (animation) {\n element = (\n <div\n style={{\n display: \"flex\",\n flex: 1,\n height: \"100%\",\n width: \"100%\",\n position: \"relative\",\n overflow: \"hidden\",\n }}\n >\n <div\n style={{ height: \"100%\", width: \"100%\", display: \"flex\", animation }}\n >\n {element}\n </div>\n </div>\n );\n }\n // --------- Animations End ---------\n\n if (props.errorBoundary === false) {\n return <>{element}</>;\n }\n\n if (props.errorBoundary) {\n return (\n <ErrorBoundary fallback={props.errorBoundary}>{element}</ErrorBoundary>\n );\n }\n\n const fallback = (error: Error) => {\n const result = onError?.(error, state) ?? (\n <ErrorViewer error={error} alepha={alepha} />\n );\n if (result instanceof Redirection) {\n return \"Redirection inside ErrorBoundary is not allowed.\";\n }\n return result as ReactNode;\n };\n\n return <ErrorBoundary fallback={fallback}>{element}</ErrorBoundary>;\n};\n\nexport default memo(NestedView);\n\nfunction parseAnimation(\n animationLike: PageAnimation | undefined,\n state: ReactRouterState,\n type: \"enter\" | \"exit\" = \"enter\",\n):\n | {\n duration: number;\n animation: string;\n }\n | undefined {\n if (!animationLike) {\n return undefined;\n }\n\n const DEFAULT_DURATION = 300;\n\n const animation =\n typeof animationLike === \"function\" ? animationLike(state) : animationLike;\n\n if (typeof animation === \"string\") {\n if (type === \"exit\") {\n return;\n }\n return {\n duration: DEFAULT_DURATION,\n animation: `${DEFAULT_DURATION}ms ${animation}`,\n };\n }\n\n if (typeof animation === \"object\") {\n const anim = animation[type];\n const duration =\n typeof anim === \"object\"\n ? (anim.duration ?? DEFAULT_DURATION)\n : DEFAULT_DURATION;\n const name = typeof anim === \"object\" ? anim.name : anim;\n\n if (type === \"exit\") {\n const timing = typeof anim === \"object\" ? (anim.timing ?? \"\") : \"\";\n return {\n duration,\n animation: `${duration}ms ${timing} ${name}`,\n };\n }\n\n const timing = typeof anim === \"object\" ? (anim.timing ?? \"\") : \"\";\n\n return {\n duration,\n animation: `${duration}ms ${timing} ${name}`,\n };\n }\n\n return undefined;\n}\n","import {\n $env,\n $hook,\n $inject,\n Alepha,\n AlephaError,\n type Static,\n type TSchema,\n t,\n} from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport { AlephaContext, ClientOnly } from \"alepha/react\";\nimport type { Head } from \"alepha/react/head\";\nimport { createElement, type ReactNode, StrictMode } from \"react\";\nimport ErrorViewer from \"../components/ErrorViewer.tsx\";\nimport NestedView from \"../components/NestedView.tsx\";\nimport NotFoundPage from \"../components/NotFound.tsx\";\nimport { RouterLayerContext } from \"../contexts/RouterLayerContext.ts\";\nimport { Redirection } from \"../errors/Redirection.ts\";\nimport {\n $page,\n type ErrorHandler,\n type PagePrimitive,\n type PagePrimitiveOptions,\n} from \"../primitives/$page.ts\";\n\nconst envSchema = t.object({\n REACT_STRICT_MODE: t.boolean({ default: true }),\n});\n\ndeclare module \"alepha\" {\n export interface Env extends Partial<Static<typeof envSchema>> {}\n}\n\n/**\n * Handle page routes for React applications. (Browser and Server)\n */\nexport class ReactPageProvider {\n protected readonly log = $logger();\n protected readonly env = $env(envSchema);\n protected readonly alepha = $inject(Alepha);\n protected readonly pages: PageRoute[] = [];\n\n public getPages(): PageRoute[] {\n return this.pages;\n }\n\n public getConcretePages(): ConcretePageRoute[] {\n const pages: ConcretePageRoute[] = [];\n for (const page of this.pages) {\n if (page.children && page.children.length > 0) {\n continue;\n }\n\n // check if the page has dynamic params\n const fullPath = this.pathname(page.name);\n if (fullPath.includes(\":\") || fullPath.includes(\"*\")) {\n if (typeof page.static === \"object\") {\n const entries = page.static.entries;\n if (entries && entries.length > 0) {\n for (const entry of entries) {\n const params = entry.params as Record<string, string>;\n const path = this.compile(page.path ?? \"\", params);\n if (!path.includes(\":\") && !path.includes(\"*\")) {\n pages.push({\n ...page,\n name: params[Object.keys(params)[0]],\n staticName: page.name,\n path,\n ...entry,\n });\n }\n }\n }\n }\n\n continue;\n }\n\n pages.push(page);\n }\n return pages;\n }\n\n public page(name: string): PageRoute {\n for (const page of this.pages) {\n if (page.name === name) {\n return page;\n }\n }\n\n throw new AlephaError(`Page '${name}' not found`);\n }\n\n public pathname(\n name: string,\n options: {\n params?: Record<string, string>;\n query?: Record<string, string>;\n } = {},\n ) {\n const page = this.page(name);\n if (!page) {\n throw new AlephaError(`Page ${name} not found`);\n }\n\n let url = page.path ?? \"\";\n let parent = page.parent;\n while (parent) {\n url = `${parent.path ?? \"\"}/${url}`;\n parent = parent.parent;\n }\n\n url = this.compile(url, options.params ?? {});\n\n if (options.query) {\n const query = new URLSearchParams(options.query);\n if (query.toString()) {\n url += `?${query.toString()}`;\n }\n }\n\n return url.replace(/\\/\\/+/g, \"/\") || \"/\";\n }\n\n public url(\n name: string,\n options: { params?: Record<string, string>; host?: string } = {},\n ): URL {\n return new URL(\n this.pathname(name, options),\n // use provided base or default to http://localhost\n options.host ?? `http://localhost`,\n );\n }\n\n public root(state: ReactRouterState): ReactNode {\n const root = createElement(\n AlephaContext.Provider,\n { value: this.alepha },\n createElement(NestedView, {}, state.layers[0]?.element),\n );\n\n if (this.env.REACT_STRICT_MODE) {\n return createElement(StrictMode, {}, root);\n }\n\n return root;\n }\n\n protected convertStringObjectToObject = (\n schema?: TSchema,\n value?: any,\n ): any => {\n if (t.schema.isObject(schema) && typeof value === \"object\") {\n for (const key in schema.properties) {\n if (\n t.schema.isObject(schema.properties[key]) &&\n typeof value[key] === \"string\"\n ) {\n try {\n value[key] = this.alepha.codec.decode(\n schema.properties[key],\n decodeURIComponent(value[key]),\n );\n } catch (e) {\n // ignore\n }\n }\n }\n }\n return value;\n };\n\n /**\n * Create a new RouterState based on a given route and request.\n * This method resolves the layers for the route, applying any query and params schemas defined in the route.\n * It also handles errors and redirects.\n */\n public async createLayers(\n route: PageRoute,\n state: ReactRouterState,\n previous: PreviousLayerData[] = [],\n ): Promise<CreateLayersResult> {\n let context: Record<string, any> = {}; // all props\n const stack: Array<RouterStackItem> = [{ route }]; // stack of routes\n\n let parent = route.parent;\n while (parent) {\n stack.unshift({ route: parent });\n parent = parent.parent;\n }\n\n let forceRefresh = false;\n\n for (let i = 0; i < stack.length; i++) {\n const it = stack[i];\n const route = it.route;\n const config: Record<string, any> = {};\n\n try {\n this.convertStringObjectToObject(route.schema?.query, state.query);\n config.query = route.schema?.query\n ? this.alepha.codec.decode(route.schema.query, state.query)\n : {};\n } catch (e) {\n it.error = e as Error;\n break;\n }\n\n try {\n config.params = route.schema?.params\n ? this.alepha.codec.decode(route.schema.params, state.params)\n : {};\n } catch (e) {\n it.error = e as Error;\n break;\n }\n\n // save config\n it.config = {\n ...config,\n };\n\n // check if previous layer is the same, reuse if possible\n if (previous?.[i] && !forceRefresh && previous[i].name === route.name) {\n const url = (str?: string) => (str ? str.replace(/\\/\\/+/g, \"/\") : \"/\");\n\n const prev = JSON.stringify({\n part: url(previous[i].part),\n params: previous[i].config?.params ?? {},\n });\n\n const curr = JSON.stringify({\n part: url(route.path),\n params: config.params ?? {},\n });\n\n if (prev === curr) {\n // part is the same, reuse previous layer\n it.props = previous[i].props;\n it.error = previous[i].error;\n it.cache = true;\n context = {\n ...context,\n ...it.props,\n };\n continue;\n }\n\n // part is different, force refresh of next layers\n forceRefresh = true;\n }\n\n // no loader, render a basic view by default\n if (!route.loader) {\n continue;\n }\n\n try {\n const args = Object.create(state);\n Object.assign(args, config, context);\n const props = (await route.loader?.(args)) ?? {};\n\n // save props\n it.props = {\n ...props,\n };\n\n // add props to context\n context = {\n ...context,\n ...props,\n };\n } catch (e) {\n // check if we need to redirect\n if (e instanceof Redirection) {\n return {\n redirect: e.redirect,\n };\n }\n\n this.log.error(\"Page loader has failed\", e);\n\n it.error = e as Error;\n break;\n }\n }\n\n let acc = \"\";\n for (let i = 0; i < stack.length; i++) {\n const it = stack[i];\n const props = it.props ?? {};\n\n const params = { ...it.config?.params };\n for (const key of Object.keys(params)) {\n params[key] = String(params[key]);\n }\n\n acc += \"/\";\n acc += it.route.path ? this.compile(it.route.path, params) : \"\";\n const path = acc.replace(/\\/+/, \"/\");\n const localErrorHandler = this.getErrorHandler(it.route);\n if (localErrorHandler) {\n const onErrorParent = state.onError;\n state.onError = (error, context) => {\n const result = localErrorHandler(error, context);\n // if nothing happen, call the parent\n if (result === undefined) {\n return onErrorParent(error, context);\n }\n return result;\n };\n }\n\n // normal use case\n if (!it.error) {\n try {\n const element = await this.createElement(it.route, {\n // default props attached to page\n ...(it.route.props ? it.route.props() : {}),\n // resolved props\n ...props,\n // context props (from previous layers)\n ...context,\n });\n\n state.layers.push({\n name: it.route.name,\n props,\n part: it.route.path,\n config: it.config,\n element: this.renderView(i + 1, path, element, it.route),\n index: i + 1,\n path,\n route: it.route,\n cache: it.cache,\n });\n } catch (e) {\n it.error = e as Error;\n }\n }\n\n // handler has thrown an error, render an error view\n if (it.error) {\n try {\n let element: ReactNode | Redirection | undefined =\n await state.onError(it.error, state);\n\n if (element === undefined) {\n throw it.error;\n }\n\n if (element instanceof Redirection) {\n return {\n redirect: element.redirect,\n };\n }\n\n if (element === null) {\n element = this.renderError(it.error);\n }\n\n state.layers.push({\n props,\n error: it.error,\n name: it.route.name,\n part: it.route.path,\n config: it.config,\n element: this.renderView(i + 1, path, element, it.route),\n index: i + 1,\n path,\n route: it.route,\n });\n break;\n } catch (e) {\n if (e instanceof Redirection) {\n return {\n redirect: e.redirect,\n };\n }\n throw e;\n }\n }\n }\n\n return { state };\n }\n\n protected getErrorHandler(route: PageRoute): ErrorHandler | undefined {\n if (route.errorHandler) return route.errorHandler;\n let parent = route.parent;\n while (parent) {\n if (parent.errorHandler) return parent.errorHandler;\n parent = parent.parent;\n }\n }\n\n protected async createElement(\n page: PageRoute,\n props: Record<string, any>,\n ): Promise<ReactNode> {\n if (page.lazy && page.component) {\n this.log.warn(\n `Page ${page.name} has both lazy and component options, lazy will be used`,\n );\n }\n\n if (page.lazy) {\n const component = await page.lazy(); // load component\n return createElement(component.default, props);\n }\n\n if (page.component) {\n return createElement(page.component, props);\n }\n\n return undefined;\n }\n\n public renderError(error: Error): ReactNode {\n return createElement(ErrorViewer, { error, alepha: this.alepha });\n }\n\n public renderEmptyView(): ReactNode {\n return createElement(NestedView, {});\n }\n\n public href(\n page: { options: { name?: string } },\n params: Record<string, any> = {},\n ): string {\n const found = this.pages.find((it) => it.name === page.options.name);\n if (!found) {\n throw new AlephaError(`Page ${page.options.name} not found`);\n }\n\n let url = found.path ?? \"\";\n let parent = found.parent;\n while (parent) {\n url = `${parent.path ?? \"\"}/${url}`;\n parent = parent.parent;\n }\n\n url = this.compile(url, params);\n\n return url.replace(/\\/\\/+/g, \"/\") || \"/\";\n }\n\n public compile(path: string, params: Record<string, string> = {}) {\n for (const [key, value] of Object.entries(params)) {\n path = path.replace(`:${key}`, value);\n }\n return path;\n }\n\n protected renderView(\n index: number,\n path: string,\n view: ReactNode | undefined,\n page: PageRoute,\n ): ReactNode {\n view ??= this.renderEmptyView();\n\n const element = page.client\n ? createElement(\n ClientOnly,\n typeof page.client === \"object\" ? page.client : {},\n view,\n )\n : view;\n\n return createElement(\n RouterLayerContext.Provider,\n {\n value: {\n index,\n path,\n onError:\n this.getErrorHandler(page) ?? ((error) => this.renderError(error)),\n },\n },\n element,\n );\n }\n\n protected readonly configure = $hook({\n on: \"configure\",\n handler: () => {\n let hasNotFoundHandler = false;\n const pages = this.alepha.primitives($page);\n\n const hasParent = (it: PagePrimitive) => {\n if (it.options.parent) {\n return true;\n }\n\n for (const page of pages) {\n const children = page.options.children\n ? Array.isArray(page.options.children)\n ? page.options.children\n : page.options.children()\n : [];\n if (children.includes(it)) {\n return true;\n }\n }\n };\n\n for (const page of pages) {\n if (page.options.path === \"/*\") {\n hasNotFoundHandler = true;\n }\n\n // skip children, we only want root pages\n if (hasParent(page)) {\n continue;\n }\n\n this.add(this.map(pages, page));\n }\n\n if (!hasNotFoundHandler && pages.length > 0) {\n // add a default 404 page if not already defined\n this.add({\n path: \"/*\",\n name: \"notFound\",\n cache: true,\n component: NotFoundPage,\n onServerResponse: ({ reply }) => {\n reply.status = 404;\n },\n });\n }\n },\n });\n\n protected map(\n pages: Array<PagePrimitive>,\n target: PagePrimitive,\n ): PageRouteEntry {\n const children = target.options.children\n ? Array.isArray(target.options.children)\n ? target.options.children\n : target.options.children()\n : [];\n\n const getChildrenFromParent = (it: PagePrimitive): PagePrimitive[] => {\n const children = [];\n for (const page of pages) {\n if (page.options.parent === it) {\n children.push(page);\n }\n }\n return children;\n };\n\n children.push(...getChildrenFromParent(target));\n\n return {\n ...target.options,\n name: target.name,\n parent: undefined,\n children: children.map((it) => this.map(pages, it)),\n } as PageRoute;\n }\n\n public add(entry: PageRouteEntry) {\n if (this.alepha.isReady()) {\n throw new AlephaError(\"Router is already initialized\");\n }\n\n entry.name ??= this.nextId();\n const page = entry as PageRoute;\n\n page.match = this.createMatch(page);\n this.pages.push(page);\n\n if (page.children) {\n for (const child of page.children) {\n (child as PageRoute).parent = page;\n this.add(child);\n }\n }\n }\n\n protected createMatch(page: PageRoute): string {\n let url = page.path ?? \"/\";\n let target = page.parent;\n while (target) {\n url = `${target.path ?? \"\"}/${url}`;\n target = target.parent;\n }\n\n let path = url.replace(/\\/\\/+/g, \"/\");\n\n if (path.endsWith(\"/\") && path !== \"/\") {\n // remove trailing slash\n path = path.slice(0, -1);\n }\n\n return path;\n }\n\n protected _next = 0;\n\n protected nextId(): string {\n this._next += 1;\n return `P${this._next}`;\n }\n}\n\nexport const isPageRoute = (it: any): it is PageRoute => {\n return (\n it &&\n typeof it === \"object\" &&\n typeof it.path === \"string\" &&\n typeof it.page === \"object\"\n );\n};\n\nexport interface PageRouteEntry\n extends Omit<PagePrimitiveOptions, \"children\" | \"parent\"> {\n children?: PageRouteEntry[];\n}\n\nexport interface ConcretePageRoute extends PageRoute {\n /**\n * When exported, static routes can be split into multiple pages with different params.\n * We replace 'name' by the new name for each static entry, and old 'name' becomes 'staticName'.\n */\n staticName?: string;\n\n params?: Record<string, string>;\n}\n\nexport interface PageRoute extends PageRouteEntry {\n type: \"page\";\n name: string;\n parent?: PageRoute;\n match: string;\n}\n\nexport interface Layer {\n config?: {\n query?: Record<string, any>;\n params?: Record<string, any>;\n // stack of resolved props\n context?: Record<string, any>;\n };\n\n name: string;\n props?: Record<string, any>;\n error?: Error;\n part?: string;\n element: ReactNode;\n index: number;\n path: string;\n route?: PageRoute;\n cache?: boolean;\n}\n\nexport type PreviousLayerData = Omit<Layer, \"element\" | \"index\" | \"path\">;\n\nexport interface AnchorProps {\n href: string;\n onClick: (ev?: any) => any;\n}\n\nexport interface ReactRouterState {\n /**\n * Stack of layers for the current page.\n */\n layers: Array<Layer>;\n\n /**\n * URL of the current page.\n */\n url: URL;\n\n /**\n * Error handler for the current page.\n */\n onError: ErrorHandler;\n\n /**\n * Params extracted from the URL for the current page.\n */\n params: Record<string, any>;\n\n /**\n * Query parameters extracted from the URL for the current page.\n */\n query: Record<string, string>;\n\n /**\n * Optional meta information associated with the current page.\n */\n meta: Record<string, any>;\n\n /**\n * Head configuration for the current page (title, meta tags, etc.).\n * Populated by HeadProvider during SSR.\n */\n head: Head;\n\n //\n name?: string;\n}\n\nexport interface RouterStackItem {\n route: PageRoute;\n config?: Record<string, any>;\n props?: Record<string, any>;\n error?: Error;\n cache?: boolean;\n}\n\nexport interface TransitionOptions {\n previous?: PreviousLayerData[];\n}\n\nexport interface CreateLayersResult {\n redirect?: string;\n state?: ReactRouterState;\n}\n","import { $hook, $inject, Alepha } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport { BrowserHeadProvider } from \"alepha/react/head\";\nimport { type Route, RouterProvider } from \"alepha/router\";\nimport { createElement, type ReactNode } from \"react\";\nimport NotFoundPage from \"../components/NotFound.tsx\";\nimport {\n isPageRoute,\n type PageRoute,\n type PageRouteEntry,\n type PreviousLayerData,\n ReactPageProvider,\n type ReactRouterState,\n} from \"./ReactPageProvider.ts\";\n\nexport interface BrowserRoute extends Route {\n page: PageRoute;\n}\n\n/**\n * Implementation of AlephaRouter for React in browser environment.\n */\nexport class ReactBrowserRouterProvider extends RouterProvider<BrowserRoute> {\n protected readonly log = $logger();\n protected readonly alepha = $inject(Alepha);\n protected readonly pageApi = $inject(ReactPageProvider);\n protected readonly browserHeadProvider = $inject(BrowserHeadProvider);\n\n public add(entry: PageRouteEntry) {\n this.pageApi.add(entry);\n }\n\n protected readonly configure = $hook({\n on: \"configure\",\n handler: async () => {\n for (const page of this.pageApi.getPages()) {\n // mount only if a view is provided\n if (page.component || page.lazy) {\n this.push({\n path: page.match,\n page,\n });\n }\n }\n },\n });\n\n public async transition(\n url: URL,\n previous: PreviousLayerData[] = [],\n meta = {},\n ): Promise<string | void> {\n const { pathname, search } = url;\n\n const entry: Partial<ReactRouterState> = {\n url,\n query: {},\n params: {},\n layers: [],\n onError: () => null,\n meta,\n };\n\n const state = entry as ReactRouterState;\n\n // Emit both action and transition events\n await this.alepha.events.emit(\"react:action:begin\", {\n type: \"transition\",\n });\n await this.alepha.events.emit(\"react:transition:begin\", {\n previous: this.alepha.store.get(\"alepha.react.router.state\")!,\n state,\n });\n\n try {\n const { route, params } = this.match(pathname);\n\n const query: Record<string, string> = {};\n if (search) {\n for (const [key, value] of new URLSearchParams(search).entries()) {\n query[key] = String(value);\n }\n }\n\n state.name = route?.page.name;\n state.query = query;\n state.params = params ?? {};\n\n if (isPageRoute(route)) {\n const { redirect } = await this.pageApi.createLayers(\n route.page,\n state,\n previous,\n );\n if (redirect) {\n return redirect;\n }\n }\n\n if (state.layers.length === 0) {\n state.layers.push({\n name: \"not-found\",\n element: createElement(NotFoundPage),\n index: 0,\n path: \"/\",\n });\n }\n\n await this.alepha.events.emit(\"react:action:success\", {\n type: \"transition\",\n });\n await this.alepha.events.emit(\"react:transition:success\", { state });\n } catch (e) {\n this.log.error(\"Transition has failed\", e);\n state.layers = [\n {\n name: \"error\",\n element: this.pageApi.renderError(e as Error),\n index: 0,\n path: \"/\",\n },\n ];\n\n await this.alepha.events.emit(\"react:action:error\", {\n type: \"transition\",\n error: e as Error,\n });\n await this.alepha.events.emit(\"react:transition:error\", {\n error: e as Error,\n state,\n });\n }\n\n // [feature]: local hook for leaving a page\n if (previous) {\n for (let i = 0; i < previous.length; i++) {\n const layer = previous[i];\n if (state.layers[i]?.name !== layer.name) {\n this.pageApi.page(layer.name)?.onLeave?.();\n }\n }\n }\n\n // [feature]: local hook for entering a page\n for (let i = 0; i < state.layers.length; i++) {\n const layer = state.layers[i];\n if (previous?.[i]?.name !== layer.name) {\n this.pageApi.page(layer.name)?.onEnter?.();\n }\n }\n\n this.alepha.store.set(\"alepha.react.router.state\", state);\n\n await this.alepha.events.emit(\"react:action:end\", {\n type: \"transition\",\n });\n await this.alepha.events.emit(\"react:transition:end\", {\n state,\n });\n\n // Fill and render head from route configurations\n this.browserHeadProvider.fillAndRenderHead(state);\n }\n\n public root(state: ReactRouterState): ReactNode {\n return this.pageApi.root(state);\n }\n}\n","import {\n $atom,\n $hook,\n $inject,\n $use,\n Alepha,\n type State,\n type Static,\n t,\n} from \"alepha\";\nimport { DateTimeProvider } from \"alepha/datetime\";\nimport { $logger } from \"alepha/logger\";\nimport { BrowserHeadProvider } from \"alepha/react/head\";\nimport { LinkProvider } from \"alepha/server/links\";\nimport type { RouterPushOptions } from \"../services/ReactRouter.ts\";\nimport { ReactBrowserRouterProvider } from \"./ReactBrowserRouterProvider.ts\";\nimport type {\n PreviousLayerData,\n ReactRouterState,\n} from \"./ReactPageProvider.ts\";\n\nexport type { RouterPushOptions } from \"../services/ReactRouter.ts\";\n\n/**\n * React browser renderer configuration atom\n */\nexport const reactBrowserOptions = $atom({\n name: \"alepha.react.browser.options\",\n schema: t.object({\n scrollRestoration: t.enum([\"top\", \"manual\"]), // TODO: must be per page?\n }),\n default: {\n scrollRestoration: \"top\" as const,\n },\n});\n\nexport type ReactBrowserRendererOptions = Static<\n typeof reactBrowserOptions.schema\n>;\n\ndeclare module \"alepha\" {\n interface State {\n [reactBrowserOptions.key]: ReactBrowserRendererOptions;\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class ReactBrowserProvider {\n protected readonly log = $logger();\n protected readonly client = $inject(LinkProvider);\n protected readonly alepha = $inject(Alepha);\n protected readonly router = $inject(ReactBrowserRouterProvider);\n protected readonly dateTimeProvider = $inject(DateTimeProvider);\n protected readonly browserHeadProvider = $inject(BrowserHeadProvider);\n\n protected readonly options = $use(reactBrowserOptions);\n\n public get rootId() {\n return \"root\";\n }\n\n protected getRootElement() {\n const root = this.document.getElementById(this.rootId);\n if (root) {\n return root;\n }\n\n const div = this.document.createElement(\"div\");\n div.id = this.rootId;\n\n this.document.body.prepend(div);\n\n return div;\n }\n\n public transitioning?: {\n to: string;\n from?: string;\n };\n\n public get state(): ReactRouterState {\n return this.alepha.store.get(\"alepha.react.router.state\")!;\n }\n\n /**\n * Accessor for Document DOM API.\n */\n public get document() {\n return window.document;\n }\n\n /**\n * Accessor for History DOM API.\n */\n public get history() {\n return window.history;\n }\n\n /**\n * Accessor for Location DOM API.\n */\n public get location() {\n return window.location;\n }\n\n public get base() {\n const base = import.meta.env?.BASE_URL;\n if (!base || base === \"/\") {\n return \"\";\n }\n\n return base;\n }\n\n public get url(): string {\n const url = this.location.pathname + this.location.search;\n if (this.base) {\n return url.replace(this.base, \"\");\n }\n return url;\n }\n\n public pushState(path: string, replace?: boolean) {\n const url = this.base + path;\n\n if (replace) {\n this.history.replaceState({}, \"\", url);\n } else {\n this.history.pushState({}, \"\", url);\n }\n }\n\n public async invalidate(props?: Record<string, any>) {\n const previous: PreviousLayerData[] = [];\n\n this.log.trace(\"Invalidating layers\");\n\n if (props) {\n const [key] = Object.keys(props);\n const value = props[key];\n\n for (const layer of this.state.layers) {\n if (layer.props?.[key]) {\n previous.push({\n ...layer,\n props: {\n ...layer.props,\n [key]: value,\n },\n });\n break;\n }\n previous.push(layer);\n }\n }\n\n await this.render({ previous });\n }\n\n public async push(\n url: string,\n options: RouterPushOptions = {},\n ): Promise<void> {\n this.log.trace(`Going to ${url}`, {\n url,\n options,\n });\n\n await this.render({\n url,\n previous: options.force ? [] : this.state.layers,\n meta: options.meta,\n });\n\n // when redirecting in browser\n if (this.state.url.pathname + this.state.url.search !== url) {\n this.pushState(this.state.url.pathname + this.state.url.search);\n return;\n }\n\n this.pushState(url, options.replace);\n }\n\n protected async render(options: RouterRenderOptions = {}): Promise<void> {\n const previous = options.previous ?? this.state.layers;\n const url = options.url ?? this.url;\n const start = this.dateTimeProvider.now();\n\n this.transitioning = {\n to: url,\n from: this.state?.url.pathname,\n };\n\n this.log.debug(\"Transitioning...\", {\n to: url,\n });\n\n const redirect = await this.router.transition(\n new URL(`http://localhost${url}`),\n previous,\n options.meta,\n );\n\n if (redirect) {\n this.log.info(\"Redirecting to\", {\n redirect,\n });\n\n // if redirect is an absolute URL, use window.location.href (full page reload)\n if (redirect.startsWith(\"http\")) {\n window.location.href = redirect;\n } else {\n // if redirect is a relative URL, use render() (single page app)\n return await this.render({ url: redirect });\n }\n }\n\n const ms = this.dateTimeProvider.now().diff(start);\n this.log.info(`Transition OK [${ms}ms]`, this.transitioning);\n\n this.transitioning = undefined;\n }\n\n /**\n * Get embedded layers from the server.\n */\n protected getHydrationState(): ReactHydrationState | undefined {\n try {\n if (\"__ssr\" in window && typeof window.__ssr === \"object\") {\n return window.__ssr as ReactHydrationState;\n }\n } catch (error) {\n console.error(error);\n }\n }\n\n // -------------------------------------------------------------------------------------------------------------------\n\n protected readonly onTransitionEnd = $hook({\n on: \"react:transition:end\",\n handler: () => {\n if (\n this.options.scrollRestoration === \"top\" &&\n typeof window !== \"undefined\" &&\n !this.alepha.isTest()\n ) {\n this.log.trace(\"Restoring scroll position to top\");\n window.scrollTo(0, 0);\n }\n },\n });\n\n public readonly ready = $hook({\n on: \"ready\",\n handler: async () => {\n const hydration = this.getHydrationState();\n const previous = hydration?.layers ?? [];\n\n if (hydration) {\n // low budget, but works for now\n for (const [key, value] of Object.entries(hydration)) {\n if (key !== \"layers\") {\n this.alepha.set(key as keyof State, value);\n }\n }\n }\n\n await this.render({ previous });\n\n const element = this.router.root(this.state);\n\n await this.alepha.events.emit(\"react:browser:render\", {\n element,\n root: this.getRootElement(),\n hydration,\n state: this.state,\n });\n\n // Fill and render head from route configurations\n this.browserHeadProvider.fillAndRenderHead(this.state);\n\n window.addEventListener(\"popstate\", () => {\n // when you update silently queryParams or hash, skip rendering\n // if you want to force a rendering, use #go()\n if (this.base + this.state.url.pathname === this.location.pathname) {\n return;\n }\n\n this.log.debug(\"Popstate event triggered - rendering new state\", {\n url: this.location.pathname + this.location.search,\n });\n\n this.render();\n });\n },\n });\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport type ReactHydrationState = {\n layers?: Array<PreviousLayerData>;\n} & {\n [key: string]: any;\n};\n\nexport interface RouterRenderOptions {\n url?: string;\n previous?: PreviousLayerData[];\n meta?: Record<string, any>;\n}\n","import { $hook } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport { createRoot, hydrateRoot, type Root } from \"react-dom/client\";\n\n/**\n * Browser specific React renderer (react-dom/client interface)\n */\nexport class ReactBrowserRendererProvider {\n protected readonly log = $logger();\n protected root?: Root;\n\n protected readonly onBrowserRender = $hook({\n on: \"react:browser:render\",\n handler: async ({ hydration, root, element }) => {\n if (hydration?.layers) {\n this.root = hydrateRoot(root, element);\n this.log.info(\"Hydrated root element\");\n } else {\n this.root ??= createRoot(root);\n this.root.render(element);\n this.log.info(\"Created root element\");\n }\n },\n });\n}\n","import { $inject, Alepha } from \"alepha\";\nimport type { PagePrimitive } from \"../primitives/$page.ts\";\nimport { ReactBrowserProvider } from \"../providers/ReactBrowserProvider.ts\";\nimport {\n type AnchorProps,\n ReactPageProvider,\n type ReactRouterState,\n} from \"../providers/ReactPageProvider.ts\";\n\nexport interface RouterPushOptions {\n replace?: boolean;\n params?: Record<string, string>;\n query?: Record<string, string>;\n meta?: Record<string, any>;\n /**\n * Recreate the whole page, ignoring the current state.\n */\n force?: boolean;\n}\n\n/**\n * Friendly browser router API.\n *\n * Can be safely used server-side, but most methods will be no-op.\n */\nexport class ReactRouter<T extends object> {\n protected readonly alepha = $inject(Alepha);\n protected readonly pageApi = $inject(ReactPageProvider);\n\n public get state(): ReactRouterState {\n return this.alepha.store.get(\"alepha.react.router.state\")!;\n }\n\n public get pages() {\n return this.pageApi.getPages();\n }\n\n public get concretePages() {\n return this.pageApi.getConcretePages();\n }\n\n public get browser(): ReactBrowserProvider | undefined {\n if (this.alepha.isBrowser()) {\n return this.alepha.inject(ReactBrowserProvider);\n }\n // server-side\n return undefined;\n }\n\n public isActive(\n href: string,\n options: {\n startWith?: boolean;\n } = {},\n ): boolean {\n const current = this.state.url.pathname;\n let isActive =\n current === href || current === `${href}/` || `${current}/` === href;\n\n if (options.startWith && !isActive) {\n isActive = current.startsWith(href);\n }\n\n return isActive;\n }\n\n public node(\n name: keyof VirtualRouter<T> | string,\n config: {\n params?: Record<string, any>;\n query?: Record<string, any>;\n } = {},\n ): any {\n // TODO: improve typing (or just remove this method)\n const page = this.pageApi.page(name as string);\n if (!page.lazy && !page.component) {\n return {\n ...page,\n label: page.label ?? page.name,\n children: undefined,\n };\n }\n\n return {\n ...page,\n label: page.label ?? page.name,\n href: this.path(name, config),\n children: undefined,\n };\n }\n\n public path(\n name: keyof VirtualRouter<T> | string,\n config: {\n params?: Record<string, any>;\n query?: Record<string, any>;\n } = {},\n ): string {\n return this.pageApi.pathname(name as string, {\n params: {\n ...this.state?.params,\n ...config.params,\n },\n query: config.query,\n });\n }\n\n /**\n * Reload the current page.\n * This is equivalent to calling `go()` with the current pathname and search.\n */\n public async reload() {\n if (!this.browser) {\n return;\n }\n\n await this.push(this.location.pathname + this.location.search, {\n replace: true,\n force: true,\n });\n }\n\n public getURL(): URL {\n if (!this.browser) {\n return this.state.url;\n }\n\n return new URL(this.location.href);\n }\n\n public get location(): Location {\n if (!this.browser) {\n throw new Error(\"Browser is required\");\n }\n\n return this.browser.location;\n }\n\n public get current(): ReactRouterState {\n return this.state;\n }\n\n public get pathname(): string {\n return this.state.url.pathname;\n }\n\n public get query(): Record<string, string> {\n const query: Record<string, string> = {};\n\n for (const [key, value] of new URLSearchParams(\n this.state.url.search,\n ).entries()) {\n query[key] = String(value);\n }\n\n return query;\n }\n\n public async back() {\n this.browser?.history.back();\n }\n\n public async forward() {\n this.browser?.history.forward();\n }\n\n public async invalidate(props?: Record<string, any>) {\n await this.browser?.invalidate(props);\n }\n\n public async push(path: string, options?: RouterPushOptions): Promise<void>;\n public async push(\n path: keyof VirtualRouter<T>,\n options?: RouterPushOptions,\n ): Promise<void>;\n public async push(\n path: string | keyof VirtualRouter<T>,\n options?: RouterPushOptions,\n ): Promise<void> {\n for (const page of this.pages) {\n if (page.name === path) {\n await this.browser?.push(\n this.path(path as keyof VirtualRouter<T>, options),\n options,\n );\n return;\n }\n }\n\n await this.browser?.push(path as string, options);\n }\n\n public anchor(path: string, options?: RouterPushOptions): AnchorProps;\n public anchor(\n path: keyof VirtualRouter<T>,\n options?: RouterPushOptions,\n ): AnchorProps;\n public anchor(\n path: string | keyof VirtualRouter<T>,\n options: RouterPushOptions = {},\n ): AnchorProps {\n let href = path as string;\n\n for (const page of this.pages) {\n if (page.name === path) {\n href = this.path(path as keyof VirtualRouter<T>, options);\n break;\n }\n }\n\n return {\n href: this.base(href),\n onClick: (ev: any) => {\n ev.stopPropagation();\n ev.preventDefault();\n\n this.push(href, options).catch(console.error);\n },\n };\n }\n\n public base(path: string): string {\n const base = import.meta.env?.BASE_URL;\n if (!base || base === \"/\") {\n return path;\n }\n\n return base + path;\n }\n\n /**\n * Set query params.\n *\n * @param record\n * @param options\n */\n public setQueryParams(\n record:\n | Record<string, any>\n | ((queryParams: Record<string, any>) => Record<string, any>),\n options: {\n /**\n * If true, this will add a new entry to the history stack.\n */\n push?: boolean;\n } = {},\n ) {\n const func = typeof record === \"function\" ? record : () => record;\n const search = new URLSearchParams(func(this.query)).toString();\n const state = search ? `${this.pathname}?${search}` : this.pathname;\n\n if (options.push) {\n window.history.pushState({}, \"\", state);\n } else {\n window.history.replaceState({}, \"\", state);\n }\n }\n}\n\nexport type VirtualRouter<T> = {\n [K in keyof T as T[K] extends PagePrimitive ? K : never]: T[K];\n};\n","import { useInject } from \"alepha/react\";\nimport { ReactRouter } from \"../services/ReactRouter.ts\";\n\n/**\n * Use this hook to access the React Router instance.\n *\n * You can add a type parameter to specify the type of your application.\n * This will allow you to use the router in a typesafe way.\n *\n * @example\n * class App {\n * home = $page();\n * }\n *\n * const router = useRouter<App>();\n * router.push(\"home\"); // typesafe\n */\nexport const useRouter = <T extends object = any>(): ReactRouter<T> => {\n return useInject(ReactRouter<T>);\n};\n","import { type AnchorHTMLAttributes, createElement } from \"react\";\nimport { useRouter } from \"../hooks/useRouter.ts\";\n\nexport interface LinkProps extends AnchorHTMLAttributes<HTMLAnchorElement> {\n href: string;\n}\n\n/**\n * Link component for client-side navigation.\n *\n * It's a simple wrapper around an anchor (`<a>`) element using the `useRouter` hook.\n */\nconst Link = (props: LinkProps) => {\n const router = useRouter();\n\n return createElement(\n \"a\",\n { ...props, ...router.anchor(props.href) },\n props.children,\n );\n};\n\nexport default Link;\n","import { useState } from \"react\";\nimport type { AnchorProps } from \"../providers/ReactPageProvider.ts\";\nimport { useRouter } from \"./useRouter.ts\";\nimport { useRouterState } from \"./useRouterState.ts\";\n\nexport interface UseActiveOptions {\n href: string;\n startWith?: boolean;\n}\n\n/**\n * Hook to determine if a given route is active and to provide anchor props for navigation.\n * This hook refreshes on router state changes.\n */\nexport const useActive = (args: string | UseActiveOptions): UseActiveHook => {\n useRouterState();\n\n const router = useRouter();\n const [isPending, setPending] = useState(false);\n\n const options: UseActiveOptions =\n typeof args === \"string\" ? { href: args } : { ...args, href: args.href };\n const href = options.href;\n const isActive = router.isActive(href, options);\n\n return {\n isPending,\n isActive,\n anchorProps: {\n href: router.base(href),\n onClick: async (ev?: any) => {\n ev?.stopPropagation();\n ev?.preventDefault();\n if (isActive) return;\n if (isPending) return;\n\n setPending(true);\n try {\n await router.push(href);\n } finally {\n setPending(false);\n }\n },\n },\n };\n};\n\nexport interface UseActiveHook {\n isActive: boolean;\n anchorProps: AnchorProps;\n isPending: boolean;\n}\n","import type { Alepha, Static, TObject } from \"alepha\";\nimport { useAlepha } from \"alepha/react\";\nimport { useEffect, useState } from \"react\";\nimport { useRouter } from \"./useRouter.ts\";\n\n/**\n * Hook to manage query parameters in the URL using a defined schema.\n */\nexport const useQueryParams = <T extends TObject>(\n schema: T,\n options: UseQueryParamsHookOptions = {},\n): [Partial<Static<T>>, (data: Static<T>) => void] => {\n const alepha = useAlepha();\n\n const key = options.key ?? \"q\";\n const router = useRouter();\n const querystring = router.query[key];\n\n const [queryParams = {}, setQueryParams] = useState<Static<T> | undefined>(\n decode(alepha, schema, router.query[key]),\n );\n\n useEffect(() => {\n setQueryParams(decode(alepha, schema, querystring));\n }, [querystring]);\n\n return [\n queryParams,\n (queryParams: Static<T>) => {\n setQueryParams(queryParams);\n router.setQueryParams((data) => {\n return { ...data, [key]: encode(alepha, schema, queryParams) };\n });\n },\n ];\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface UseQueryParamsHookOptions {\n format?: \"base64\" | \"querystring\";\n key?: string;\n push?: boolean;\n}\n\nconst encode = (alepha: Alepha, schema: TObject, data: any) => {\n return btoa(JSON.stringify(alepha.codec.decode(schema, data)));\n};\n\nconst decode = <T extends TObject>(\n alepha: Alepha,\n schema: T,\n data: any,\n): Static<T> | undefined => {\n try {\n return alepha.codec.decode(\n schema,\n JSON.parse(atob(decodeURIComponent(data))),\n );\n } catch {\n return;\n }\n};\n","import { $module } from \"alepha\";\nimport { AlephaDateTime } from \"alepha/datetime\";\nimport { AlephaReact } from \"alepha/react\";\nimport { AlephaServer } from \"alepha/server\";\nimport { AlephaServerLinks } from \"alepha/server/links\";\nimport { $page } from \"./primitives/$page.ts\";\nimport { ReactBrowserProvider } from \"./providers/ReactBrowserProvider.ts\";\nimport { ReactBrowserRendererProvider } from \"./providers/ReactBrowserRendererProvider.ts\";\nimport { ReactBrowserRouterProvider } from \"./providers/ReactBrowserRouterProvider.ts\";\nimport { ReactPageProvider } from \"./providers/ReactPageProvider.ts\";\nimport { ReactPageService } from \"./services/ReactPageService.ts\";\nimport { ReactRouter } from \"./services/ReactRouter.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./index.shared.ts\";\nexport * from \"./providers/ReactBrowserProvider.ts\";\nexport * from \"./providers/ReactBrowserRendererProvider.ts\";\nexport * from \"./providers/ReactBrowserRouterProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport const AlephaReactRouter = $module({\n name: \"alepha.react.router\",\n primitives: [$page],\n services: [\n ReactPageProvider,\n ReactBrowserRouterProvider,\n ReactBrowserProvider,\n ReactRouter,\n ReactBrowserRendererProvider,\n ReactPageService,\n ],\n register: (alepha) =>\n alepha\n .with(AlephaReact)\n .with(AlephaDateTime)\n .with(AlephaServer)\n .with(AlephaServerLinks)\n .with(ReactPageProvider)\n .with(ReactBrowserProvider)\n .with(ReactBrowserRouterProvider)\n .with(ReactBrowserRendererProvider)\n .with(ReactRouter),\n});\n"],"mappings":"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"}