alepha 0.18.2 → 0.18.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 (397) hide show
  1. package/assets/devtools-ui/200.html +2 -2
  2. package/assets/devtools-ui/200.html.br +0 -0
  3. package/assets/devtools-ui/404.html +2 -2
  4. package/assets/devtools-ui/404.html.br +0 -0
  5. package/assets/devtools-ui/{asset.BfSBZ5Dd.css → asset.hG_f8HuK.css} +1 -1
  6. package/assets/devtools-ui/asset.hG_f8HuK.css.br +0 -0
  7. package/assets/devtools-ui/chunk.B3au4Lhg.js +1 -0
  8. package/assets/devtools-ui/chunk.B3au4Lhg.js.br +0 -0
  9. package/assets/devtools-ui/chunk.BLOrlnMB.js +1 -0
  10. package/assets/devtools-ui/chunk.BLOrlnMB.js.br +0 -0
  11. package/assets/devtools-ui/chunk.BLR01ljW.js +1 -0
  12. package/assets/devtools-ui/chunk.BLR01ljW.js.br +0 -0
  13. package/assets/devtools-ui/chunk.BTXaIUlA.js +1 -0
  14. package/assets/devtools-ui/chunk.BTXaIUlA.js.br +0 -0
  15. package/assets/devtools-ui/{chunk.lJL-lgnW.js → chunk.BhJaxmm8.js} +1 -1
  16. package/assets/devtools-ui/chunk.BhJaxmm8.js.br +0 -0
  17. package/assets/devtools-ui/chunk.BtoNxFuL.js +1 -0
  18. package/assets/devtools-ui/chunk.BtoNxFuL.js.br +0 -0
  19. package/assets/devtools-ui/chunk.C8YUV2Wd.js +1 -0
  20. package/assets/devtools-ui/chunk.C8YUV2Wd.js.br +0 -0
  21. package/assets/devtools-ui/{chunk.M6wyKO_3.js → chunk.CBbIgDzE.js} +2 -2
  22. package/assets/devtools-ui/chunk.CBbIgDzE.js.br +0 -0
  23. package/assets/devtools-ui/chunk.CFqIniwA.js +1 -0
  24. package/assets/devtools-ui/chunk.CFqIniwA.js.br +0 -0
  25. package/assets/devtools-ui/chunk.CLFF7f7-.js +1 -0
  26. package/assets/devtools-ui/chunk.CLFF7f7-.js.br +0 -0
  27. package/assets/devtools-ui/chunk.CRsBbA10.js +1 -0
  28. package/assets/devtools-ui/chunk.CRsBbA10.js.br +0 -0
  29. package/assets/devtools-ui/{chunk.DbEH1oOB.js → chunk.CZPo6v95.js} +1 -1
  30. package/assets/devtools-ui/chunk.CZPo6v95.js.br +0 -0
  31. package/assets/devtools-ui/chunk.D0fWgNos.js +1 -0
  32. package/assets/devtools-ui/chunk.D0fWgNos.js.br +1 -0
  33. package/assets/devtools-ui/chunk.D7-0ziQ6.js +1 -0
  34. package/assets/devtools-ui/chunk.D7-0ziQ6.js.br +0 -0
  35. package/assets/devtools-ui/chunk.DAewe0vm.js +1 -0
  36. package/assets/devtools-ui/chunk.DAewe0vm.js.br +0 -0
  37. package/assets/devtools-ui/chunk.DJRQEYqK.js +1 -0
  38. package/assets/devtools-ui/chunk.DJRQEYqK.js.br +0 -0
  39. package/assets/devtools-ui/{chunk.CZl6J9DF.js → chunk.DMAxv14p.js} +1 -1
  40. package/assets/devtools-ui/chunk.DMAxv14p.js.br +0 -0
  41. package/assets/devtools-ui/{chunk.BT2IiBkZ.js → chunk.DMImnNjU.js} +1 -1
  42. package/assets/devtools-ui/chunk.DMImnNjU.js.br +0 -0
  43. package/assets/devtools-ui/chunk.DeeQsidk.js +9 -0
  44. package/assets/devtools-ui/chunk.DeeQsidk.js.br +0 -0
  45. package/assets/devtools-ui/chunk.DqEwn9Vj.js +7 -0
  46. package/assets/devtools-ui/chunk.DqEwn9Vj.js.br +0 -0
  47. package/assets/devtools-ui/chunk.Dt8OsQey.js +1 -0
  48. package/assets/devtools-ui/chunk.Dt8OsQey.js.br +0 -0
  49. package/assets/devtools-ui/{chunk.B9pX3zit.js → chunk.Dtp8oa_f.js} +1 -1
  50. package/assets/devtools-ui/chunk.Dtp8oa_f.js.br +0 -0
  51. package/assets/devtools-ui/chunk.Dx3JzAYM.js +1 -0
  52. package/assets/devtools-ui/chunk.Dx3JzAYM.js.br +0 -0
  53. package/assets/devtools-ui/chunk.GCOj1-5E.js +1 -0
  54. package/assets/devtools-ui/chunk.GCOj1-5E.js.br +0 -0
  55. package/assets/devtools-ui/chunk.IC1LD8BH.js +1 -0
  56. package/assets/devtools-ui/chunk.IC1LD8BH.js.br +0 -0
  57. package/assets/devtools-ui/chunk.IwuB_TqW.js +1 -0
  58. package/assets/devtools-ui/chunk.IwuB_TqW.js.br +0 -0
  59. package/assets/devtools-ui/chunk.Qqapj2zq.js +1 -0
  60. package/assets/devtools-ui/chunk.Qqapj2zq.js.br +0 -0
  61. package/assets/devtools-ui/{chunk.C79YouPp.js → chunk.TKKKndOy.js} +1 -1
  62. package/assets/devtools-ui/chunk.TKKKndOy.js.br +0 -0
  63. package/assets/devtools-ui/chunk.YHTVhFQT.js +1 -0
  64. package/assets/devtools-ui/chunk.YHTVhFQT.js.br +0 -0
  65. package/assets/devtools-ui/chunk.fnod6uEi.js +1 -0
  66. package/assets/devtools-ui/chunk.fnod6uEi.js.br +0 -0
  67. package/assets/devtools-ui/chunk.mOCRmXjo.js +1 -0
  68. package/assets/devtools-ui/chunk.mOCRmXjo.js.br +0 -0
  69. package/assets/devtools-ui/chunk.qZTNEAK0.js +1 -0
  70. package/assets/devtools-ui/chunk.qZTNEAK0.js.br +0 -0
  71. package/assets/devtools-ui/chunk.rc9m0y4-.js +1 -0
  72. package/assets/devtools-ui/chunk.rc9m0y4-.js.br +0 -0
  73. package/assets/devtools-ui/entry.Cxc5QLCU.js +80 -0
  74. package/assets/devtools-ui/entry.Cxc5QLCU.js.br +0 -0
  75. package/assets/devtools-ui/index.html +2 -2
  76. package/assets/devtools-ui/index.html.br +0 -0
  77. package/assets/swagger-ui/swagger-ui-bundle.js +1 -1
  78. package/assets/swagger-ui/swagger-ui.css +1 -1
  79. package/dist/api/audits/index.d.ts +61 -5
  80. package/dist/api/audits/index.d.ts.map +1 -1
  81. package/dist/api/files/index.d.ts +61 -5
  82. package/dist/api/files/index.d.ts.map +1 -1
  83. package/dist/api/jobs/index.d.ts +61 -5
  84. package/dist/api/jobs/index.d.ts.map +1 -1
  85. package/dist/api/jobs/index.js +4 -2
  86. package/dist/api/jobs/index.js.map +1 -1
  87. package/dist/api/keys/index.d.ts +5 -5
  88. package/dist/api/notifications/index.browser.js +44 -1
  89. package/dist/api/notifications/index.browser.js.map +1 -1
  90. package/dist/api/notifications/index.d.ts +187 -2
  91. package/dist/api/notifications/index.d.ts.map +1 -1
  92. package/dist/api/notifications/index.js +143 -8
  93. package/dist/api/notifications/index.js.map +1 -1
  94. package/dist/api/parameters/index.d.ts +61 -5
  95. package/dist/api/parameters/index.d.ts.map +1 -1
  96. package/dist/api/users/index.d.ts +330 -93
  97. package/dist/api/users/index.d.ts.map +1 -1
  98. package/dist/api/users/index.js +27 -36
  99. package/dist/api/users/index.js.map +1 -1
  100. package/dist/cli/config/index.d.ts +46 -0
  101. package/dist/cli/config/index.d.ts.map +1 -0
  102. package/dist/cli/config/index.js +20 -0
  103. package/dist/cli/config/index.js.map +1 -0
  104. package/dist/cli/core/index.d.ts +69 -66
  105. package/dist/cli/core/index.d.ts.map +1 -1
  106. package/dist/cli/core/index.js +329 -196
  107. package/dist/cli/core/index.js.map +1 -1
  108. package/dist/cli/platform/index.d.ts +302 -63
  109. package/dist/cli/platform/index.d.ts.map +1 -1
  110. package/dist/cli/platform/index.js +455 -25
  111. package/dist/cli/platform/index.js.map +1 -1
  112. package/dist/core/index.browser.js +125 -87
  113. package/dist/core/index.browser.js.map +1 -1
  114. package/dist/core/index.d.ts +62 -53
  115. package/dist/core/index.d.ts.map +1 -1
  116. package/dist/core/index.js +125 -87
  117. package/dist/core/index.js.map +1 -1
  118. package/dist/core/index.native.js +125 -87
  119. package/dist/core/index.native.js.map +1 -1
  120. package/dist/core/index.workerd.js +125 -87
  121. package/dist/core/index.workerd.js.map +1 -1
  122. package/dist/crypto/index.d.ts +18 -1
  123. package/dist/crypto/index.d.ts.map +1 -1
  124. package/dist/crypto/index.js +29 -3
  125. package/dist/crypto/index.js.map +1 -1
  126. package/dist/devtools/index.js +3 -12
  127. package/dist/devtools/index.js.map +1 -1
  128. package/dist/logger/index.d.ts +10 -1
  129. package/dist/logger/index.d.ts.map +1 -1
  130. package/dist/logger/index.js +19 -9
  131. package/dist/logger/index.js.map +1 -1
  132. package/dist/orm/core/index.browser.js +57 -1
  133. package/dist/orm/core/index.browser.js.map +1 -1
  134. package/dist/orm/core/index.bun.js +378 -19
  135. package/dist/orm/core/index.bun.js.map +1 -1
  136. package/dist/orm/core/index.d.ts +328 -9
  137. package/dist/orm/core/index.d.ts.map +1 -1
  138. package/dist/orm/core/index.js +384 -21
  139. package/dist/orm/core/index.js.map +1 -1
  140. package/dist/orm/postgres/index.bun.js +49 -17
  141. package/dist/orm/postgres/index.bun.js.map +1 -1
  142. package/dist/orm/postgres/index.d.ts +47 -21
  143. package/dist/orm/postgres/index.d.ts.map +1 -1
  144. package/dist/orm/postgres/index.js +52 -17
  145. package/dist/orm/postgres/index.js.map +1 -1
  146. package/dist/react/core/index.d.ts +1 -1
  147. package/dist/react/core/index.d.ts.map +1 -1
  148. package/dist/react/core/index.js +6 -1
  149. package/dist/react/core/index.js.map +1 -1
  150. package/dist/react/form/index.d.ts +28 -18
  151. package/dist/react/form/index.d.ts.map +1 -1
  152. package/dist/react/form/index.js +92 -56
  153. package/dist/react/form/index.js.map +1 -1
  154. package/dist/react/router/index.browser.js +448 -116
  155. package/dist/react/router/index.browser.js.map +1 -1
  156. package/dist/react/router/index.d.ts +102 -40
  157. package/dist/react/router/index.d.ts.map +1 -1
  158. package/dist/react/router/index.js +453 -92
  159. package/dist/react/router/index.js.map +1 -1
  160. package/dist/security/index.d.ts +3 -11
  161. package/dist/security/index.d.ts.map +1 -1
  162. package/dist/security/index.js +6 -11
  163. package/dist/security/index.js.map +1 -1
  164. package/dist/server/auth/index.d.ts +22 -24
  165. package/dist/server/auth/index.d.ts.map +1 -1
  166. package/dist/server/auth/index.js +102 -82
  167. package/dist/server/auth/index.js.map +1 -1
  168. package/dist/server/cookies/index.d.ts +7 -4
  169. package/dist/server/cookies/index.d.ts.map +1 -1
  170. package/dist/server/cookies/index.js +13 -12
  171. package/dist/server/cookies/index.js.map +1 -1
  172. package/dist/server/core/index.d.ts +288 -4
  173. package/dist/server/core/index.d.ts.map +1 -1
  174. package/dist/server/core/index.js +375 -2
  175. package/dist/server/core/index.js.map +1 -1
  176. package/dist/server/links/index.browser.js +10 -71
  177. package/dist/server/links/index.browser.js.map +1 -1
  178. package/dist/server/links/index.d.ts +32 -49
  179. package/dist/server/links/index.d.ts.map +1 -1
  180. package/dist/server/links/index.js +73 -100
  181. package/dist/server/links/index.js.map +1 -1
  182. package/dist/system/index.browser.js +221 -2
  183. package/dist/system/index.browser.js.map +1 -1
  184. package/dist/system/index.d.ts +63 -1
  185. package/dist/system/index.d.ts.map +1 -1
  186. package/dist/system/index.js +221 -1
  187. package/dist/system/index.js.map +1 -1
  188. package/dist/system/index.workerd.js +224 -4
  189. package/dist/system/index.workerd.js.map +1 -1
  190. package/package.json +10 -5
  191. package/src/api/jobs/providers/JobProvider.ts +6 -3
  192. package/src/api/notifications/controllers/AdminNotificationController.ts +83 -0
  193. package/src/api/notifications/index.browser.ts +3 -0
  194. package/src/api/notifications/index.ts +14 -2
  195. package/src/api/notifications/jobs/NotificationJobs.ts +11 -2
  196. package/src/api/notifications/schemas/notificationDetailResourceSchema.ts +20 -0
  197. package/src/api/notifications/schemas/notificationQuerySchema.ts +19 -0
  198. package/src/api/notifications/schemas/notificationResourceSchema.ts +18 -0
  199. package/src/api/notifications/services/NotificationSenderService.ts +15 -2
  200. package/src/api/users/atoms/realmAuthSettingsAtom.ts +28 -32
  201. package/src/api/users/buckets/UserBuckets.ts +1 -1
  202. package/src/api/users/jobs/UserJobs.ts +1 -1
  203. package/src/api/users/primitives/$realm.ts +8 -49
  204. package/src/api/users/providers/RealmProvider.ts +2 -3
  205. package/src/api/users/services/RegistrationService.spec.ts +7 -7
  206. package/src/api/users/services/RegistrationService.ts +3 -3
  207. package/src/api/users/services/SessionService.spec.ts +4 -4
  208. package/src/api/users/services/SessionService.ts +3 -3
  209. package/src/cli/{core → config}/defineConfig.ts +14 -20
  210. package/src/cli/config/index.ts +1 -0
  211. package/src/cli/core/commands/db.ts +65 -1
  212. package/src/cli/core/commands/dev.ts +1 -0
  213. package/src/cli/core/commands/init.ts +2 -192
  214. package/src/cli/core/index.ts +34 -11
  215. package/src/cli/core/providers/ViteDevServerProvider.ts +52 -13
  216. package/src/cli/core/services/PackageManagerUtils.ts +43 -21
  217. package/src/cli/core/services/ProjectScaffolder.ts +214 -2
  218. package/src/cli/core/services/ViteUtils.ts +57 -0
  219. package/src/cli/core/tasks/BuildClientTask.ts +7 -2
  220. package/src/cli/core/tasks/BuildCloudflareTask.ts +4 -12
  221. package/src/cli/core/tasks/BuildServerTask.ts +2 -0
  222. package/src/cli/core/tasks/BuildVercelTask.ts +165 -168
  223. package/src/cli/core/templates/alephaConfigTs.ts +1 -1
  224. package/src/cli/core/templates/apiAppSecurityTs.ts +5 -8
  225. package/src/cli/core/templates/tsconfigJson.ts +6 -1
  226. package/src/cli/platform/adapters/CloudflareAdapter.spec.ts +1 -1
  227. package/src/cli/platform/adapters/CloudflareAdapter.ts +30 -29
  228. package/src/cli/platform/atoms/platformOptions.ts +21 -0
  229. package/src/cli/platform/commands/SecretsCommand.spec.ts +298 -0
  230. package/src/cli/platform/commands/SecretsCommand.ts +283 -0
  231. package/src/cli/platform/commands/platform.ts +12 -0
  232. package/src/cli/platform/index.ts +14 -28
  233. package/src/cli/platform/providers/GitHubSecretStore.spec.ts +153 -0
  234. package/src/cli/platform/providers/GitHubSecretStore.ts +112 -0
  235. package/src/cli/platform/providers/MemorySecretStore.ts +114 -0
  236. package/src/cli/platform/providers/SecretStoreProvider.ts +39 -0
  237. package/src/cli/platform/schemas/cloudflare.ts +2 -0
  238. package/src/cli/platform/services/CloudflareApi.ts +5 -2
  239. package/src/cli/platform/services/DockerComposeGenerator.spec.ts +115 -0
  240. package/src/cli/platform/services/DockerComposeGenerator.ts +46 -1
  241. package/src/cli/platform/services/SecretFilterService.spec.ts +111 -0
  242. package/src/cli/platform/services/SecretFilterService.ts +54 -0
  243. package/src/core/Alepha.ts +94 -25
  244. package/src/core/__tests__/Alepha-parseEnv.spec.ts +20 -0
  245. package/src/core/primitives/$memoize.ts +38 -26
  246. package/src/core/providers/AlsProvider.ts +2 -0
  247. package/src/core/providers/EventManager.ts +4 -0
  248. package/src/core/providers/KeylessJsonSchemaCodec.spec.ts +1 -4
  249. package/src/core/providers/KeylessJsonSchemaCodec.ts +19 -125
  250. package/src/core/providers/SchemaValidator.spec.ts +36 -0
  251. package/src/core/providers/SchemaValidator.ts +9 -0
  252. package/src/crypto/index.ts +6 -1
  253. package/src/crypto/providers/SecretProvider.ts +36 -0
  254. package/src/devtools/providers/DevToolsProvider.ts +3 -12
  255. package/src/logger/index.ts +33 -6
  256. package/src/logger/providers/PrettyFormatterProvider.ts +5 -3
  257. package/src/orm/__tests__/orm-next-tests.ts +492 -0
  258. package/src/orm/__tests__/orm-next.spec.ts +140 -0
  259. package/src/orm/core/constants/PG_SYMBOLS.ts +17 -0
  260. package/src/orm/core/index.bun.ts +3 -6
  261. package/src/orm/core/index.shared-server.ts +2 -0
  262. package/src/orm/core/index.shared.ts +2 -0
  263. package/src/orm/core/index.ts +5 -7
  264. package/src/orm/core/interfaces/AggregateQuery.ts +103 -0
  265. package/src/orm/core/interfaces/PgQueryWhere.ts +7 -0
  266. package/src/orm/core/primitives/$entity.ts +8 -0
  267. package/src/orm/core/primitives/$repository.ts +6 -3
  268. package/src/orm/core/primitives/$view.ts +88 -0
  269. package/src/orm/core/providers/DbCacheProvider.ts +66 -0
  270. package/src/orm/core/providers/DrizzleKitProvider.ts +42 -0
  271. package/src/orm/core/providers/drivers/BunSqliteProvider.ts +2 -3
  272. package/src/orm/core/providers/drivers/CloudflareD1Provider.ts +12 -0
  273. package/src/orm/core/providers/drivers/DatabaseProvider.ts +39 -0
  274. package/src/orm/core/providers/drivers/NodeSqliteProvider.ts +2 -3
  275. package/src/orm/core/schemas/databaseEnvSchema.ts +31 -0
  276. package/src/orm/core/schemas/insertSchema.ts +13 -3
  277. package/src/orm/core/schemas/updateSchema.ts +14 -3
  278. package/src/orm/core/services/ModelBuilder.ts +26 -14
  279. package/src/orm/core/services/QueryManager.ts +13 -0
  280. package/src/orm/core/services/Repository.ts +307 -5
  281. package/src/orm/core/services/SqliteModelBuilder.ts +38 -0
  282. package/src/orm/postgres/index.bun.ts +4 -7
  283. package/src/orm/postgres/index.ts +4 -7
  284. package/src/orm/postgres/providers/BunPostgresProvider.ts +12 -2
  285. package/src/orm/postgres/providers/NodePostgresProvider.ts +7 -0
  286. package/src/orm/postgres/providers/PglitePostgresProvider.ts +10 -17
  287. package/src/orm/postgres/providers/PostgresProvider.ts +7 -36
  288. package/src/orm/postgres/schemas/postgresEnvSchema.ts +32 -0
  289. package/src/orm/postgres/services/PostgresModelBuilder.ts +40 -0
  290. package/src/react/core/components/ErrorBoundary.tsx +5 -2
  291. package/src/react/form/hooks/useFieldValue.ts +34 -0
  292. package/src/react/form/hooks/useForm.browser.spec.tsx +94 -9
  293. package/src/react/form/hooks/useForm.ts +14 -2
  294. package/src/react/form/hooks/useFormState.ts +10 -10
  295. package/src/react/form/hooks/useFormValues.ts +29 -0
  296. package/src/react/form/index.ts +3 -1
  297. package/src/react/form/services/FormModel.ts +53 -122
  298. package/src/react/router/components/ErrorViewer.tsx +333 -34
  299. package/src/react/router/components/NestedView.tsx +10 -3
  300. package/src/react/router/primitives/$page.browser.spec.tsx +34 -0
  301. package/src/react/router/primitives/$page.spec.tsx +20 -0
  302. package/src/react/router/primitives/$page.ts +24 -0
  303. package/src/react/router/providers/ReactBrowserRouterProvider.ts +14 -2
  304. package/src/react/router/providers/ReactPageProvider.ts +156 -73
  305. package/src/react/router/providers/ReactServerProvider.ts +40 -2
  306. package/src/react/router/providers/ReactServerTemplateProvider.ts +13 -1
  307. package/src/security/providers/SecurityProvider.ts +5 -27
  308. package/src/server/auth/primitives/$auth.ts +52 -19
  309. package/src/server/auth/providers/ServerAuthProvider.ts +145 -139
  310. package/src/server/cookies/providers/ServerCookiesProvider.ts +12 -24
  311. package/src/server/core/index.ts +3 -1
  312. package/src/server/core/primitives/$sse.spec.ts +315 -0
  313. package/src/server/core/primitives/$sse.ts +715 -0
  314. package/src/server/links/index.browser.ts +1 -3
  315. package/src/server/links/index.ts +0 -3
  316. package/src/server/links/providers/LinkProvider.spec.ts +12 -21
  317. package/src/server/links/providers/LinkProvider.ts +20 -52
  318. package/src/server/links/providers/ServerLinksProvider.spec.ts +106 -0
  319. package/src/server/links/providers/ServerLinksProvider.ts +113 -73
  320. package/src/server/links/schemas/apiLinksResponseSchema.ts +4 -21
  321. package/src/server/links/services/BatchCollector.ts +5 -3
  322. package/src/system/index.browser.ts +1 -0
  323. package/src/system/index.ts +3 -0
  324. package/src/system/index.workerd.ts +39 -1
  325. package/src/system/providers/WorkerdFileSystemProvider.ts +365 -0
  326. package/assets/devtools-ui/asset.BfSBZ5Dd.css.br +0 -0
  327. package/assets/devtools-ui/chunk.2NYaoqWt.js +0 -1
  328. package/assets/devtools-ui/chunk.2NYaoqWt.js.br +0 -0
  329. package/assets/devtools-ui/chunk.B052Z_xQ.js +0 -1
  330. package/assets/devtools-ui/chunk.B052Z_xQ.js.br +0 -0
  331. package/assets/devtools-ui/chunk.B4kVY90C.js +0 -1
  332. package/assets/devtools-ui/chunk.B4kVY90C.js.br +0 -0
  333. package/assets/devtools-ui/chunk.B7QJXctB.js +0 -1
  334. package/assets/devtools-ui/chunk.B7QJXctB.js.br +0 -0
  335. package/assets/devtools-ui/chunk.B9pX3zit.js.br +0 -0
  336. package/assets/devtools-ui/chunk.BKF9JxIo.js +0 -1
  337. package/assets/devtools-ui/chunk.BKF9JxIo.js.br +0 -0
  338. package/assets/devtools-ui/chunk.BOHgdTP-.js +0 -1
  339. package/assets/devtools-ui/chunk.BOHgdTP-.js.br +0 -0
  340. package/assets/devtools-ui/chunk.BOVFxkYC.js +0 -1
  341. package/assets/devtools-ui/chunk.BOVFxkYC.js.br +0 -0
  342. package/assets/devtools-ui/chunk.BR842zj5.js +0 -1
  343. package/assets/devtools-ui/chunk.BR842zj5.js.br +0 -0
  344. package/assets/devtools-ui/chunk.BT2IiBkZ.js.br +0 -0
  345. package/assets/devtools-ui/chunk.C79YouPp.js.br +0 -0
  346. package/assets/devtools-ui/chunk.C8mlBrjW.js +0 -9
  347. package/assets/devtools-ui/chunk.C8mlBrjW.js.br +0 -0
  348. package/assets/devtools-ui/chunk.CK0ow3AZ.js +0 -1
  349. package/assets/devtools-ui/chunk.CK0ow3AZ.js.br +0 -0
  350. package/assets/devtools-ui/chunk.CZl6J9DF.js.br +0 -0
  351. package/assets/devtools-ui/chunk.CdNr0YzS.js +0 -1
  352. package/assets/devtools-ui/chunk.CdNr0YzS.js.br +0 -0
  353. package/assets/devtools-ui/chunk.Ce6_6iIF.js +0 -1
  354. package/assets/devtools-ui/chunk.Ce6_6iIF.js.br +0 -0
  355. package/assets/devtools-ui/chunk.CpyDMr6O.js +0 -1
  356. package/assets/devtools-ui/chunk.CpyDMr6O.js.br +0 -0
  357. package/assets/devtools-ui/chunk.CyPmvPnY.js +0 -1
  358. package/assets/devtools-ui/chunk.CyPmvPnY.js.br +0 -0
  359. package/assets/devtools-ui/chunk.DTI_geWu.js +0 -1
  360. package/assets/devtools-ui/chunk.DTI_geWu.js.br +0 -0
  361. package/assets/devtools-ui/chunk.DbEH1oOB.js.br +0 -0
  362. package/assets/devtools-ui/chunk.Ddeqj5gv.js +0 -1
  363. package/assets/devtools-ui/chunk.Ddeqj5gv.js.br +0 -0
  364. package/assets/devtools-ui/chunk.DpRnB4vJ.js +0 -1
  365. package/assets/devtools-ui/chunk.DpRnB4vJ.js.br +0 -0
  366. package/assets/devtools-ui/chunk.DxPGTlsg.js +0 -1
  367. package/assets/devtools-ui/chunk.DxPGTlsg.js.br +0 -0
  368. package/assets/devtools-ui/chunk.G7_MMBJS.js +0 -1
  369. package/assets/devtools-ui/chunk.G7_MMBJS.js.br +0 -0
  370. package/assets/devtools-ui/chunk.M6wyKO_3.js.br +0 -0
  371. package/assets/devtools-ui/chunk.OUxNGmQ6.js +0 -1
  372. package/assets/devtools-ui/chunk.OUxNGmQ6.js.br +0 -0
  373. package/assets/devtools-ui/chunk.T1kle-fF.js +0 -1
  374. package/assets/devtools-ui/chunk.T1kle-fF.js.br +0 -0
  375. package/assets/devtools-ui/chunk.WjpsbQAv.js +0 -1
  376. package/assets/devtools-ui/chunk.WjpsbQAv.js.br +0 -0
  377. package/assets/devtools-ui/chunk.c6YgVx86.js +0 -1
  378. package/assets/devtools-ui/chunk.c6YgVx86.js.br +0 -0
  379. package/assets/devtools-ui/chunk.dwU3E_MU.js +0 -1
  380. package/assets/devtools-ui/chunk.dwU3E_MU.js.br +0 -0
  381. package/assets/devtools-ui/chunk.lJL-lgnW.js.br +0 -0
  382. package/assets/devtools-ui/chunk.lPWRmvA-.js +0 -7
  383. package/assets/devtools-ui/chunk.lPWRmvA-.js.br +0 -0
  384. package/assets/devtools-ui/chunk.p3HJvugM.js +0 -1
  385. package/assets/devtools-ui/chunk.p3HJvugM.js.br +0 -0
  386. package/assets/devtools-ui/chunk.r_Xoa_CI.js +0 -1
  387. package/assets/devtools-ui/chunk.r_Xoa_CI.js.br +0 -0
  388. package/assets/devtools-ui/chunk.sRNuTYXb.js +0 -1
  389. package/assets/devtools-ui/chunk.sRNuTYXb.js.br +0 -0
  390. package/assets/devtools-ui/chunk.tUjcyX5C.js +0 -1
  391. package/assets/devtools-ui/chunk.tUjcyX5C.js.br +0 -0
  392. package/assets/devtools-ui/chunk.thjBxvCA.js +0 -1
  393. package/assets/devtools-ui/chunk.thjBxvCA.js.br +0 -0
  394. package/assets/devtools-ui/entry.GYhBVRpC.js +0 -78
  395. package/assets/devtools-ui/entry.GYhBVRpC.js.br +0 -0
  396. package/src/server/links/services/DefinitionsPool.spec.ts +0 -86
  397. package/src/server/links/services/DefinitionsPool.ts +0 -43
@@ -192,124 +192,407 @@ const NotFound = (props) => /* @__PURE__ */ jsxs("div", {
192
192
  })]
193
193
  });
194
194
 
195
+ //#endregion
196
+ //#region ../../src/react/router/errors/Redirection.ts
197
+ /**
198
+ * Used for Redirection during the page loading.
199
+ *
200
+ * Depends on the context, it can be thrown or just returned.
201
+ *
202
+ * @example
203
+ * ```ts
204
+ * import { Redirection } from "alepha/react";
205
+ *
206
+ * const MyPage = $page({
207
+ * loader: async () => {
208
+ * if (needRedirect) {
209
+ * throw new Redirection("/new-path");
210
+ * }
211
+ * },
212
+ * });
213
+ * ```
214
+ */
215
+ var Redirection = class extends AlephaError {
216
+ redirect;
217
+ constructor(redirect) {
218
+ super("Redirection");
219
+ this.redirect = redirect;
220
+ }
221
+ };
222
+
223
+ //#endregion
224
+ //#region ../../src/react/router/hooks/useRouterState.ts
225
+ const useRouterState = () => {
226
+ const [state] = useStore("alepha.react.router.state");
227
+ if (!state) throw new AlephaError("Missing react router state");
228
+ return state;
229
+ };
230
+
195
231
  //#endregion
196
232
  //#region ../../src/react/router/components/ErrorViewer.tsx
197
233
  const mono = "ui-monospace, \"JetBrains Mono\", SFMono-Regular, Menlo, Monaco, Consolas, monospace";
198
- const ErrorViewer = ({ error, alepha }) => {
199
- if (alepha.isProduction()) return /* @__PURE__ */ jsx("div", {
200
- style: s.root,
201
- children: "Something went wrong."
202
- });
234
+ const ErrorViewer = (props) => {
235
+ if (props.alepha.isProduction()) return /* @__PURE__ */ jsx(ProdErrorPage, { error: props.error });
236
+ return /* @__PURE__ */ jsx(DevErrorPage, { ...props });
237
+ };
238
+ const DevErrorPage = (props) => {
239
+ const [copied, setCopied] = useState(false);
240
+ const pathname = useRouterState().url.pathname;
241
+ const handleCopy = () => {
242
+ const text = buildErrorText(props.error);
243
+ if (typeof navigator !== "undefined" && navigator.clipboard) {
244
+ navigator.clipboard.writeText(text);
245
+ setCopied(true);
246
+ setTimeout(() => setCopied(false), 2e3);
247
+ }
248
+ };
249
+ const status = getHttpStatus(props.error);
203
250
  return /* @__PURE__ */ jsx("div", {
204
- style: s.root,
205
- children: /* @__PURE__ */ jsx(ErrorBlock, { error })
251
+ style: dev.overlay,
252
+ children: /* @__PURE__ */ jsxs("div", {
253
+ style: dev.card,
254
+ children: [
255
+ /* @__PURE__ */ jsxs("div", {
256
+ style: dev.header,
257
+ children: [/* @__PURE__ */ jsxs("div", {
258
+ style: dev.headerLeft,
259
+ children: [/* @__PURE__ */ jsx("div", {
260
+ style: dev.icon,
261
+ children: "!"
262
+ }), /* @__PURE__ */ jsx("div", {
263
+ style: dev.title,
264
+ children: props.error.name || "Error"
265
+ })]
266
+ }), /* @__PURE__ */ jsxs("div", {
267
+ style: dev.headerRight,
268
+ children: [props.onRetry && /* @__PURE__ */ jsx("button", {
269
+ type: "button",
270
+ style: dev.retryBtn,
271
+ onClick: props.onRetry,
272
+ children: "Retry"
273
+ }), /* @__PURE__ */ jsx("button", {
274
+ type: "button",
275
+ style: dev.copyBtn,
276
+ onClick: handleCopy,
277
+ children: copied ? "Copied" : "Copy"
278
+ })]
279
+ })]
280
+ }),
281
+ /* @__PURE__ */ jsx(ErrorBlock, { error: props.error }),
282
+ /* @__PURE__ */ jsxs("div", {
283
+ style: dev.meta,
284
+ children: [
285
+ pathname && /* @__PURE__ */ jsx("span", {
286
+ style: dev.metaItem,
287
+ children: pathname
288
+ }),
289
+ /* @__PURE__ */ jsx("span", {
290
+ style: dev.metaItem,
291
+ children: (/* @__PURE__ */ new Date()).toLocaleTimeString()
292
+ }),
293
+ status && /* @__PURE__ */ jsx("span", {
294
+ style: dev.statusBadge,
295
+ children: status
296
+ })
297
+ ]
298
+ })
299
+ ]
300
+ })
206
301
  });
207
302
  };
208
- function ErrorBlock({ error, depth = 0 }) {
303
+ const ErrorBlock = (props) => {
304
+ const { error, depth = 0 } = props;
209
305
  return /* @__PURE__ */ jsxs(Fragment, { children: [
210
306
  depth > 0 && /* @__PURE__ */ jsx("div", {
211
- style: s.caused,
307
+ style: dev.causedBy,
212
308
  children: "Caused by:"
213
309
  }),
214
- /* @__PURE__ */ jsxs("div", {
215
- style: s.name,
310
+ /* @__PURE__ */ jsxs("pre", {
311
+ style: dev.messageBlock,
216
312
  children: [
217
313
  error.name,
218
314
  ": ",
219
315
  error.message
220
316
  ]
221
317
  }),
222
- error.stack && /* @__PURE__ */ jsx("pre", {
223
- style: s.stack,
318
+ error.stack && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("div", {
319
+ style: dev.stackLabel,
320
+ children: "STACK TRACE"
321
+ }), /* @__PURE__ */ jsx("pre", {
322
+ style: dev.stackBlock,
224
323
  children: cleanStack(error.stack)
225
- }),
324
+ })] }),
226
325
  error.cause instanceof Error && /* @__PURE__ */ jsx(ErrorBlock, {
227
326
  error: error.cause,
228
327
  depth: depth + 1
229
328
  })
230
329
  ] });
231
- }
330
+ };
331
+ const ProdErrorPage = (props) => {
332
+ const requestId = props.error.requestId;
333
+ const handleReload = () => {
334
+ if (typeof window !== "undefined") window.location.reload();
335
+ };
336
+ return /* @__PURE__ */ jsx("div", {
337
+ style: prod.page,
338
+ children: /* @__PURE__ */ jsxs("div", {
339
+ style: prod.card,
340
+ children: [
341
+ /* @__PURE__ */ jsx("div", {
342
+ style: prod.heading,
343
+ children: "Something went wrong"
344
+ }),
345
+ /* @__PURE__ */ jsx("div", {
346
+ style: prod.subtitle,
347
+ children: "We're having trouble processing your request."
348
+ }),
349
+ requestId && /* @__PURE__ */ jsxs("div", {
350
+ style: prod.refText,
351
+ children: ["Reference: ", requestId]
352
+ }),
353
+ /* @__PURE__ */ jsxs("div", {
354
+ style: prod.actions,
355
+ children: [/* @__PURE__ */ jsx("button", {
356
+ type: "button",
357
+ style: prod.reloadBtn,
358
+ onClick: handleReload,
359
+ children: "Reload page"
360
+ }), /* @__PURE__ */ jsx("a", {
361
+ href: "/",
362
+ style: prod.homeLink,
363
+ children: "Go home"
364
+ })]
365
+ })
366
+ ]
367
+ })
368
+ });
369
+ };
232
370
  function cleanStack(stack) {
233
371
  return stack.split("\n").slice(1).map((l) => l.trim()).join("\n");
234
372
  }
235
- const s = {
236
- root: {
373
+ function buildErrorText(error) {
374
+ const parts = [];
375
+ const append = (err, depth) => {
376
+ if (depth > 0) parts.push(`\nCaused by:`);
377
+ parts.push(`${err.name}: ${err.message}`);
378
+ if (err.stack) parts.push(cleanStack(err.stack));
379
+ if (err.cause instanceof Error) append(err.cause, depth + 1);
380
+ };
381
+ append(error, 0);
382
+ return parts.join("\n");
383
+ }
384
+ function getHttpStatus(error) {
385
+ if ("status" in error && typeof error.status === "number") return error.status;
386
+ }
387
+ const dev = {
388
+ overlay: {
389
+ position: "fixed",
390
+ inset: 0,
391
+ zIndex: 2147483647,
392
+ display: "flex",
393
+ alignItems: "center",
394
+ justifyContent: "center",
237
395
  padding: "24px",
396
+ backgroundColor: "rgba(0, 0, 0, 0.75)",
397
+ backdropFilter: "blur(4px)",
238
398
  fontFamily: mono,
239
399
  fontSize: "13px",
240
- color: "#333",
241
- backgroundColor: "#fff"
400
+ color: "#e5e7eb",
401
+ boxSizing: "border-box",
402
+ overflow: "auto"
242
403
  },
243
- name: {
244
- color: "#dc2626",
245
- fontSize: "14px",
246
- fontWeight: 600,
247
- marginBottom: "8px",
248
- wordBreak: "break-word"
404
+ card: {
405
+ width: "100%",
406
+ maxWidth: "900px",
407
+ maxHeight: "90vh",
408
+ overflow: "auto",
409
+ padding: "24px",
410
+ backgroundColor: "#111",
411
+ borderLeft: "4px solid #ef4444",
412
+ borderRadius: "8px",
413
+ boxShadow: "0 25px 50px rgba(0, 0, 0, 0.5)"
414
+ },
415
+ header: {
416
+ display: "flex",
417
+ alignItems: "center",
418
+ justifyContent: "space-between",
419
+ marginBottom: "20px",
420
+ flexWrap: "wrap",
421
+ gap: "12px"
422
+ },
423
+ headerLeft: {
424
+ display: "flex",
425
+ alignItems: "center",
426
+ gap: "12px",
427
+ minWidth: 0
428
+ },
429
+ headerRight: {
430
+ display: "flex",
431
+ gap: "8px",
432
+ flexShrink: 0
433
+ },
434
+ icon: {
435
+ width: "28px",
436
+ height: "28px",
437
+ borderRadius: "50%",
438
+ backgroundColor: "#ef4444",
439
+ color: "#fff",
440
+ display: "flex",
441
+ alignItems: "center",
442
+ justifyContent: "center",
443
+ fontWeight: 700,
444
+ fontSize: "16px",
445
+ flexShrink: 0
446
+ },
447
+ title: {
448
+ color: "#f87171",
449
+ fontSize: "18px",
450
+ fontWeight: 700
451
+ },
452
+ retryBtn: {
453
+ padding: "6px 16px",
454
+ backgroundColor: "#2563eb",
455
+ color: "#fff",
456
+ border: "none",
457
+ borderRadius: "6px",
458
+ cursor: "pointer",
459
+ fontFamily: mono,
460
+ fontSize: "12px",
461
+ fontWeight: 600
462
+ },
463
+ copyBtn: {
464
+ padding: "6px 16px",
465
+ backgroundColor: "transparent",
466
+ color: "#9ca3af",
467
+ border: "1px solid #374151",
468
+ borderRadius: "6px",
469
+ cursor: "pointer",
470
+ fontFamily: mono,
471
+ fontSize: "12px",
472
+ fontWeight: 600
249
473
  },
250
- stack: {
474
+ messageBlock: {
475
+ margin: "0 0 12px",
476
+ padding: "12px",
477
+ backgroundColor: "#1f2937",
478
+ borderRadius: "6px",
479
+ color: "#f9fafb",
480
+ fontSize: "13px",
481
+ lineHeight: 1.6,
482
+ whiteSpace: "pre-wrap",
483
+ wordBreak: "break-word",
484
+ overflow: "auto"
485
+ },
486
+ stackLabel: {
487
+ fontSize: "10px",
488
+ color: "#6b7280",
489
+ textTransform: "uppercase",
490
+ letterSpacing: "1.5px",
491
+ marginBottom: "6px",
492
+ fontWeight: 600
493
+ },
494
+ stackBlock: {
251
495
  margin: "0 0 20px",
252
496
  padding: "12px",
253
- backgroundColor: "#f5f5f5",
254
- borderRadius: "4px",
255
- border: "1px solid #e0e0e0",
497
+ backgroundColor: "#0f172a",
498
+ borderRadius: "6px",
499
+ color: "#94a3b8",
256
500
  fontSize: "12px",
257
501
  lineHeight: 1.6,
258
- color: "#666",
259
- overflow: "auto",
260
502
  whiteSpace: "pre-wrap",
261
- wordBreak: "break-all"
503
+ wordBreak: "break-all",
504
+ overflow: "auto"
262
505
  },
263
- caused: {
264
- fontSize: "11px",
265
- color: "#999",
506
+ causedBy: {
507
+ fontSize: "10px",
508
+ color: "#6b7280",
266
509
  textTransform: "uppercase",
267
- letterSpacing: "1px",
268
- marginBottom: "6px",
269
- paddingTop: "4px",
270
- borderTop: "1px solid #e0e0e0"
510
+ letterSpacing: "1.5px",
511
+ marginBottom: "8px",
512
+ paddingTop: "12px",
513
+ borderTop: "1px solid #374151",
514
+ fontWeight: 600
515
+ },
516
+ meta: {
517
+ display: "flex",
518
+ gap: "16px",
519
+ alignItems: "center",
520
+ paddingTop: "12px",
521
+ borderTop: "1px solid #1f2937",
522
+ flexWrap: "wrap"
523
+ },
524
+ metaItem: {
525
+ fontSize: "11px",
526
+ color: "#6b7280"
527
+ },
528
+ statusBadge: {
529
+ fontSize: "11px",
530
+ color: "#fbbf24",
531
+ backgroundColor: "#422006",
532
+ padding: "2px 8px",
533
+ borderRadius: "4px",
534
+ fontWeight: 600
271
535
  }
272
536
  };
273
-
274
- //#endregion
275
- //#region ../../src/react/router/contexts/RouterLayerContext.ts
276
- const RouterLayerContext = createContext(void 0);
277
-
278
- //#endregion
279
- //#region ../../src/react/router/errors/Redirection.ts
280
- /**
281
- * Used for Redirection during the page loading.
282
- *
283
- * Depends on the context, it can be thrown or just returned.
284
- *
285
- * @example
286
- * ```ts
287
- * import { Redirection } from "alepha/react";
288
- *
289
- * const MyPage = $page({
290
- * loader: async () => {
291
- * if (needRedirect) {
292
- * throw new Redirection("/new-path");
293
- * }
294
- * },
295
- * });
296
- * ```
297
- */
298
- var Redirection = class extends AlephaError {
299
- redirect;
300
- constructor(redirect) {
301
- super("Redirection");
302
- this.redirect = redirect;
537
+ const prod = {
538
+ page: {
539
+ minHeight: "100vh",
540
+ display: "flex",
541
+ alignItems: "center",
542
+ justifyContent: "center",
543
+ backgroundColor: "#0f172a",
544
+ fontFamily: "-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif",
545
+ padding: "24px"
546
+ },
547
+ card: {
548
+ textAlign: "center",
549
+ maxWidth: "440px"
550
+ },
551
+ heading: {
552
+ fontSize: "28px",
553
+ fontWeight: 700,
554
+ color: "#f1f5f9",
555
+ marginBottom: "12px"
556
+ },
557
+ subtitle: {
558
+ fontSize: "16px",
559
+ color: "#94a3b8",
560
+ marginBottom: "24px",
561
+ lineHeight: 1.5
562
+ },
563
+ refText: {
564
+ fontSize: "13px",
565
+ color: "#64748b",
566
+ marginBottom: "24px",
567
+ fontFamily: mono
568
+ },
569
+ actions: {
570
+ display: "flex",
571
+ gap: "12px",
572
+ justifyContent: "center",
573
+ alignItems: "center"
574
+ },
575
+ reloadBtn: {
576
+ padding: "10px 24px",
577
+ backgroundColor: "#2563eb",
578
+ color: "#fff",
579
+ border: "none",
580
+ borderRadius: "8px",
581
+ cursor: "pointer",
582
+ fontSize: "14px",
583
+ fontWeight: 600
584
+ },
585
+ homeLink: {
586
+ padding: "10px 24px",
587
+ color: "#94a3b8",
588
+ textDecoration: "none",
589
+ fontSize: "14px"
303
590
  }
304
591
  };
305
592
 
306
593
  //#endregion
307
- //#region ../../src/react/router/hooks/useRouterState.ts
308
- const useRouterState = () => {
309
- const [state] = useStore("alepha.react.router.state");
310
- if (!state) throw new AlephaError("Missing react router state");
311
- return state;
312
- };
594
+ //#region ../../src/react/router/contexts/RouterLayerContext.ts
595
+ const RouterLayerContext = createContext(void 0);
313
596
 
314
597
  //#endregion
315
598
  //#region ../../src/react/router/components/NestedView.tsx
@@ -340,6 +623,7 @@ const NestedView = (props) => {
340
623
  const onError = routerLayer?.onError;
341
624
  const state = useRouterState();
342
625
  const alepha = useAlepha();
626
+ const [boundaryKey, setBoundaryKey] = useState(0);
343
627
  const [view, setView] = useState(state.layers[index]?.element);
344
628
  const [animation, setAnimation] = useState("");
345
629
  const animationExitDuration = useRef(0);
@@ -400,7 +684,7 @@ const NestedView = (props) => {
400
684
  if (props.errorBoundary) return /* @__PURE__ */ jsx(ErrorBoundary, {
401
685
  fallback: props.errorBoundary,
402
686
  children: element
403
- });
687
+ }, boundaryKey);
404
688
  const fallback = (error) => {
405
689
  const result = onError?.(error, state) ?? /* @__PURE__ */ jsx(ErrorViewer, {
406
690
  error,
@@ -412,7 +696,7 @@ const NestedView = (props) => {
412
696
  return /* @__PURE__ */ jsx(ErrorBoundary, {
413
697
  fallback,
414
698
  children: element
415
- });
699
+ }, boundaryKey);
416
700
  };
417
701
  var NestedView_default = memo(NestedView);
418
702
  function parseAnimation(animationLike, state, type = "enter") {
@@ -446,17 +730,49 @@ function parseAnimation(animationLike, state, type = "enter") {
446
730
  const reactPageOptions = $atom({
447
731
  name: "alepha.react.page.options",
448
732
  description: "Configuration options for the React page provider.",
449
- schema: t.object({ strictMode: t.boolean({ default: true }) }),
450
- default: { strictMode: true }
733
+ schema: t.object({
734
+ strictMode: t.boolean({ default: true }),
735
+ staticFilePattern: t.string()
736
+ }),
737
+ default: {
738
+ strictMode: true,
739
+ staticFilePattern: "\\.[a-zA-Z0-9]{1,10}$"
740
+ }
451
741
  });
452
742
  /**
453
743
  * Handle page routes for React applications. (Browser and Server)
454
744
  */
455
745
  var ReactPageProvider = class {
746
+ dateTimeProvider = $inject(DateTimeProvider);
456
747
  log = $logger();
457
748
  options = $use(reactPageOptions);
458
749
  alepha = $inject(Alepha);
459
750
  pages = [];
751
+ nextIdCursor = 0;
752
+ configure = $hook({
753
+ on: "configure",
754
+ handler: () => {
755
+ let hasNotFoundHandler = false;
756
+ const pages = this.alepha.primitives($page);
757
+ const hasParent = (it) => {
758
+ if (it.options.parent) return true;
759
+ for (const page of pages) if ((page.options.children ? Array.isArray(page.options.children) ? page.options.children : page.options.children() : []).includes(it)) return true;
760
+ };
761
+ for (const page of pages) {
762
+ if (page.options.path === "/*") hasNotFoundHandler = true;
763
+ if (hasParent(page)) continue;
764
+ this.add(this.map(pages, page));
765
+ }
766
+ if (!hasNotFoundHandler && pages.length > 0) this.add({
767
+ path: "/*",
768
+ name: "notFound",
769
+ component: NotFound,
770
+ onServerResponse: ({ reply }) => {
771
+ reply.status = 404;
772
+ }
773
+ });
774
+ }
775
+ });
460
776
  getPages() {
461
777
  return this.pages;
462
778
  }
@@ -544,13 +860,13 @@ var ReactPageProvider = class {
544
860
  this.convertStringObjectToObject(route.schema?.query, state.query);
545
861
  config.query = route.schema?.query ? this.alepha.codec.decode(route.schema.query, state.query) : {};
546
862
  } catch (e) {
547
- it.error = e;
863
+ it.error = e instanceof Error ? e : new Error(String(e));
548
864
  break;
549
865
  }
550
866
  try {
551
867
  config.params = route.schema?.params ? this.alepha.codec.decode(route.schema.params, state.params) : {};
552
868
  } catch (e) {
553
- it.error = e;
869
+ it.error = e instanceof Error ? e : new Error(String(e));
554
870
  break;
555
871
  }
556
872
  it.config = { ...config };
@@ -574,6 +890,7 @@ var ReactPageProvider = class {
574
890
  }
575
891
  forceRefresh = true;
576
892
  }
893
+ if (route.redirect) return { redirect: route.redirect };
577
894
  if (!route.loader) continue;
578
895
  try {
579
896
  const args = Object.create(state);
@@ -587,7 +904,7 @@ var ReactPageProvider = class {
587
904
  } catch (e) {
588
905
  if (e instanceof Redirection) return { redirect: e.redirect };
589
906
  this.log.error("Page loader has failed", e);
590
- it.error = e;
907
+ it.error = e instanceof Error ? e : new Error(String(e));
591
908
  break;
592
909
  }
593
910
  }
@@ -614,7 +931,7 @@ var ReactPageProvider = class {
614
931
  ...it.route.props ? it.route.props() : {},
615
932
  ...props,
616
933
  ...context
617
- });
934
+ }, state.url);
618
935
  state.layers.push({
619
936
  name: it.route.name,
620
937
  props,
@@ -627,7 +944,7 @@ var ReactPageProvider = class {
627
944
  cache: it.cache
628
945
  });
629
946
  } catch (e) {
630
- it.error = e;
947
+ it.error = e instanceof Error ? e : new Error(String(e));
631
948
  }
632
949
  if (it.error) try {
633
950
  let element = await state.onError(it.error, state);
@@ -643,7 +960,8 @@ var ReactPageProvider = class {
643
960
  element: this.renderView(i + 1, path, element, it.route),
644
961
  index: i + 1,
645
962
  path,
646
- route: it.route
963
+ route: it.route,
964
+ cache: it.cache
647
965
  });
648
966
  break;
649
967
  } catch (e) {
@@ -661,11 +979,45 @@ var ReactPageProvider = class {
661
979
  parent = parent.parent;
662
980
  }
663
981
  }
664
- async createElement(page, props) {
982
+ async createElement(page, props, targetUrl) {
665
983
  if (page.lazy && page.component) this.log.warn(`Page ${page.name} has both lazy and component options, lazy will be used`);
666
- if (page.lazy) return createElement((await page.lazy()).default, props);
984
+ if (page.lazy) try {
985
+ return createElement((await page.lazy()).default, props);
986
+ } catch (error) {
987
+ if (this.alepha.isBrowser() && this.isChunkLoadError(error)) {
988
+ if (this.reloadAfterChunkError(targetUrl)) return;
989
+ }
990
+ throw error;
991
+ }
667
992
  if (page.component) return createElement(page.component, props);
668
993
  }
994
+ /**
995
+ * Detect chunk load errors caused by stale dynamic imports after a deployment.
996
+ * When new assets are deployed with different hashes, old chunk URLs return 404.
997
+ */
998
+ isChunkLoadError(error) {
999
+ if (!(error instanceof Error)) return false;
1000
+ const msg = error.message;
1001
+ return /Failed to fetch dynamically imported module/.test(msg) || /error loading dynamically imported module/i.test(msg) || /Unable to preload CSS/.test(msg) || /Importing a module script failed/.test(msg);
1002
+ }
1003
+ /**
1004
+ * Navigate to the target URL to fetch updated assets after a chunk load failure.
1005
+ * Uses sessionStorage to prevent infinite reload loops.
1006
+ * Returns true if navigation was initiated.
1007
+ */
1008
+ reloadAfterChunkError(url) {
1009
+ const key = "alepha:chunk-reload";
1010
+ const lastReload = sessionStorage.getItem(key);
1011
+ const now = this.dateTimeProvider.nowMillis();
1012
+ if (lastReload && now - Number(lastReload) < 1e4) {
1013
+ this.log.error("Chunk load failed after recent reload, not retrying to avoid loop");
1014
+ return false;
1015
+ }
1016
+ this.log.warn("Chunk load failed after deployment, reloading page");
1017
+ sessionStorage.setItem(key, String(now));
1018
+ window.location.assign(url ? url.pathname + url.search : window.location.href);
1019
+ return true;
1020
+ }
669
1021
  renderError(error) {
670
1022
  return createElement(ErrorViewer, {
671
1023
  error,
@@ -700,30 +1052,6 @@ var ReactPageProvider = class {
700
1052
  onError: this.getErrorHandler(page) ?? ((error) => this.renderError(error))
701
1053
  } }, element);
702
1054
  }
703
- configure = $hook({
704
- on: "configure",
705
- handler: () => {
706
- let hasNotFoundHandler = false;
707
- const pages = this.alepha.primitives($page);
708
- const hasParent = (it) => {
709
- if (it.options.parent) return true;
710
- for (const page of pages) if ((page.options.children ? Array.isArray(page.options.children) ? page.options.children : page.options.children() : []).includes(it)) return true;
711
- };
712
- for (const page of pages) {
713
- if (page.options.path === "/*") hasNotFoundHandler = true;
714
- if (hasParent(page)) continue;
715
- this.add(this.map(pages, page));
716
- }
717
- if (!hasNotFoundHandler && pages.length > 0) this.add({
718
- path: "/*",
719
- name: "notFound",
720
- component: NotFound,
721
- onServerResponse: ({ reply }) => {
722
- reply.status = 404;
723
- }
724
- });
725
- }
726
- });
727
1055
  map(pages, target) {
728
1056
  const children = target.options.children ? Array.isArray(target.options.children) ? target.options.children : target.options.children() : [];
729
1057
  const getChildrenFromParent = (it) => {
@@ -761,10 +1089,9 @@ var ReactPageProvider = class {
761
1089
  if (path.endsWith("/") && path !== "/") path = path.slice(0, -1);
762
1090
  return path;
763
1091
  }
764
- _next = 0;
765
1092
  nextId() {
766
- this._next += 1;
767
- return `P${this._next}`;
1093
+ this.nextIdCursor += 1;
1094
+ return `P${this.nextIdCursor}`;
768
1095
  }
769
1096
  };
770
1097
  const isPageRoute = (it) => {
@@ -787,7 +1114,7 @@ var ReactBrowserRouterProvider = class extends RouterProvider {
787
1114
  configure = $hook({
788
1115
  on: "configure",
789
1116
  handler: async () => {
790
- for (const page of this.pageApi.getPages()) if (page.component || page.lazy) this.push({
1117
+ for (const page of this.pageApi.getPages()) if (page.component || page.lazy || page.redirect) this.push({
791
1118
  path: page.match,
792
1119
  page
793
1120
  });
@@ -832,9 +1159,14 @@ var ReactBrowserRouterProvider = class extends RouterProvider {
832
1159
  await this.alepha.events.emit("react:transition:success", { state });
833
1160
  } catch (e) {
834
1161
  this.log.error("Transition has failed", e);
1162
+ let element;
1163
+ try {
1164
+ const result = state.onError(e, state);
1165
+ if (result != null && !(result instanceof Redirection)) element = result;
1166
+ } catch {}
835
1167
  state.layers = [{
836
1168
  name: "error",
837
- element: this.pageApi.renderError(e),
1169
+ element: element ?? this.pageApi.renderError(e),
838
1170
  index: 0,
839
1171
  path: "/"
840
1172
  }];