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
@@ -160,82 +160,373 @@ var PagePrimitive = class extends Primitive {
160
160
  };
161
161
  $page[KIND] = PagePrimitive;
162
162
 
163
+ //#endregion
164
+ //#region ../../src/react/router/hooks/useRouterState.ts
165
+ const useRouterState = () => {
166
+ const [state] = useStore("alepha.react.router.state");
167
+ if (!state) throw new AlephaError("Missing react router state");
168
+ return state;
169
+ };
170
+
163
171
  //#endregion
164
172
  //#region ../../src/react/router/components/ErrorViewer.tsx
165
173
  const mono = "ui-monospace, \"JetBrains Mono\", SFMono-Regular, Menlo, Monaco, Consolas, monospace";
166
- const ErrorViewer = ({ error, alepha }) => {
167
- if (alepha.isProduction()) return /* @__PURE__ */ jsx("div", {
168
- style: s.root,
169
- children: "Something went wrong."
170
- });
174
+ const ErrorViewer = (props) => {
175
+ if (props.alepha.isProduction()) return /* @__PURE__ */ jsx(ProdErrorPage, { error: props.error });
176
+ return /* @__PURE__ */ jsx(DevErrorPage, { ...props });
177
+ };
178
+ const DevErrorPage = (props) => {
179
+ const [copied, setCopied] = useState(false);
180
+ const pathname = useRouterState().url.pathname;
181
+ const handleCopy = () => {
182
+ const text = buildErrorText(props.error);
183
+ if (typeof navigator !== "undefined" && navigator.clipboard) {
184
+ navigator.clipboard.writeText(text);
185
+ setCopied(true);
186
+ setTimeout(() => setCopied(false), 2e3);
187
+ }
188
+ };
189
+ const status = getHttpStatus(props.error);
171
190
  return /* @__PURE__ */ jsx("div", {
172
- style: s.root,
173
- children: /* @__PURE__ */ jsx(ErrorBlock, { error })
191
+ style: dev.overlay,
192
+ children: /* @__PURE__ */ jsxs("div", {
193
+ style: dev.card,
194
+ children: [
195
+ /* @__PURE__ */ jsxs("div", {
196
+ style: dev.header,
197
+ children: [/* @__PURE__ */ jsxs("div", {
198
+ style: dev.headerLeft,
199
+ children: [/* @__PURE__ */ jsx("div", {
200
+ style: dev.icon,
201
+ children: "!"
202
+ }), /* @__PURE__ */ jsx("div", {
203
+ style: dev.title,
204
+ children: props.error.name || "Error"
205
+ })]
206
+ }), /* @__PURE__ */ jsxs("div", {
207
+ style: dev.headerRight,
208
+ children: [props.onRetry && /* @__PURE__ */ jsx("button", {
209
+ type: "button",
210
+ style: dev.retryBtn,
211
+ onClick: props.onRetry,
212
+ children: "Retry"
213
+ }), /* @__PURE__ */ jsx("button", {
214
+ type: "button",
215
+ style: dev.copyBtn,
216
+ onClick: handleCopy,
217
+ children: copied ? "Copied" : "Copy"
218
+ })]
219
+ })]
220
+ }),
221
+ /* @__PURE__ */ jsx(ErrorBlock, { error: props.error }),
222
+ /* @__PURE__ */ jsxs("div", {
223
+ style: dev.meta,
224
+ children: [
225
+ pathname && /* @__PURE__ */ jsx("span", {
226
+ style: dev.metaItem,
227
+ children: pathname
228
+ }),
229
+ /* @__PURE__ */ jsx("span", {
230
+ style: dev.metaItem,
231
+ children: (/* @__PURE__ */ new Date()).toLocaleTimeString()
232
+ }),
233
+ status && /* @__PURE__ */ jsx("span", {
234
+ style: dev.statusBadge,
235
+ children: status
236
+ })
237
+ ]
238
+ })
239
+ ]
240
+ })
174
241
  });
175
242
  };
176
- function ErrorBlock({ error, depth = 0 }) {
243
+ const ErrorBlock = (props) => {
244
+ const { error, depth = 0 } = props;
177
245
  return /* @__PURE__ */ jsxs(Fragment, { children: [
178
246
  depth > 0 && /* @__PURE__ */ jsx("div", {
179
- style: s.caused,
247
+ style: dev.causedBy,
180
248
  children: "Caused by:"
181
249
  }),
182
- /* @__PURE__ */ jsxs("div", {
183
- style: s.name,
250
+ /* @__PURE__ */ jsxs("pre", {
251
+ style: dev.messageBlock,
184
252
  children: [
185
253
  error.name,
186
254
  ": ",
187
255
  error.message
188
256
  ]
189
257
  }),
190
- error.stack && /* @__PURE__ */ jsx("pre", {
191
- style: s.stack,
258
+ error.stack && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("div", {
259
+ style: dev.stackLabel,
260
+ children: "STACK TRACE"
261
+ }), /* @__PURE__ */ jsx("pre", {
262
+ style: dev.stackBlock,
192
263
  children: cleanStack(error.stack)
193
- }),
264
+ })] }),
194
265
  error.cause instanceof Error && /* @__PURE__ */ jsx(ErrorBlock, {
195
266
  error: error.cause,
196
267
  depth: depth + 1
197
268
  })
198
269
  ] });
199
- }
270
+ };
271
+ const ProdErrorPage = (props) => {
272
+ const requestId = props.error.requestId;
273
+ const handleReload = () => {
274
+ if (typeof window !== "undefined") window.location.reload();
275
+ };
276
+ return /* @__PURE__ */ jsx("div", {
277
+ style: prod.page,
278
+ children: /* @__PURE__ */ jsxs("div", {
279
+ style: prod.card,
280
+ children: [
281
+ /* @__PURE__ */ jsx("div", {
282
+ style: prod.heading,
283
+ children: "Something went wrong"
284
+ }),
285
+ /* @__PURE__ */ jsx("div", {
286
+ style: prod.subtitle,
287
+ children: "We're having trouble processing your request."
288
+ }),
289
+ requestId && /* @__PURE__ */ jsxs("div", {
290
+ style: prod.refText,
291
+ children: ["Reference: ", requestId]
292
+ }),
293
+ /* @__PURE__ */ jsxs("div", {
294
+ style: prod.actions,
295
+ children: [/* @__PURE__ */ jsx("button", {
296
+ type: "button",
297
+ style: prod.reloadBtn,
298
+ onClick: handleReload,
299
+ children: "Reload page"
300
+ }), /* @__PURE__ */ jsx("a", {
301
+ href: "/",
302
+ style: prod.homeLink,
303
+ children: "Go home"
304
+ })]
305
+ })
306
+ ]
307
+ })
308
+ });
309
+ };
200
310
  function cleanStack(stack) {
201
311
  return stack.split("\n").slice(1).map((l) => l.trim()).join("\n");
202
312
  }
203
- const s = {
204
- root: {
313
+ function buildErrorText(error) {
314
+ const parts = [];
315
+ const append = (err, depth) => {
316
+ if (depth > 0) parts.push(`\nCaused by:`);
317
+ parts.push(`${err.name}: ${err.message}`);
318
+ if (err.stack) parts.push(cleanStack(err.stack));
319
+ if (err.cause instanceof Error) append(err.cause, depth + 1);
320
+ };
321
+ append(error, 0);
322
+ return parts.join("\n");
323
+ }
324
+ function getHttpStatus(error) {
325
+ if ("status" in error && typeof error.status === "number") return error.status;
326
+ }
327
+ const dev = {
328
+ overlay: {
329
+ position: "fixed",
330
+ inset: 0,
331
+ zIndex: 2147483647,
332
+ display: "flex",
333
+ alignItems: "center",
334
+ justifyContent: "center",
205
335
  padding: "24px",
336
+ backgroundColor: "rgba(0, 0, 0, 0.75)",
337
+ backdropFilter: "blur(4px)",
206
338
  fontFamily: mono,
207
339
  fontSize: "13px",
208
- color: "#333",
209
- backgroundColor: "#fff"
340
+ color: "#e5e7eb",
341
+ boxSizing: "border-box",
342
+ overflow: "auto"
210
343
  },
211
- name: {
212
- color: "#dc2626",
213
- fontSize: "14px",
214
- fontWeight: 600,
215
- marginBottom: "8px",
216
- wordBreak: "break-word"
344
+ card: {
345
+ width: "100%",
346
+ maxWidth: "900px",
347
+ maxHeight: "90vh",
348
+ overflow: "auto",
349
+ padding: "24px",
350
+ backgroundColor: "#111",
351
+ borderLeft: "4px solid #ef4444",
352
+ borderRadius: "8px",
353
+ boxShadow: "0 25px 50px rgba(0, 0, 0, 0.5)"
354
+ },
355
+ header: {
356
+ display: "flex",
357
+ alignItems: "center",
358
+ justifyContent: "space-between",
359
+ marginBottom: "20px",
360
+ flexWrap: "wrap",
361
+ gap: "12px"
217
362
  },
218
- stack: {
363
+ headerLeft: {
364
+ display: "flex",
365
+ alignItems: "center",
366
+ gap: "12px",
367
+ minWidth: 0
368
+ },
369
+ headerRight: {
370
+ display: "flex",
371
+ gap: "8px",
372
+ flexShrink: 0
373
+ },
374
+ icon: {
375
+ width: "28px",
376
+ height: "28px",
377
+ borderRadius: "50%",
378
+ backgroundColor: "#ef4444",
379
+ color: "#fff",
380
+ display: "flex",
381
+ alignItems: "center",
382
+ justifyContent: "center",
383
+ fontWeight: 700,
384
+ fontSize: "16px",
385
+ flexShrink: 0
386
+ },
387
+ title: {
388
+ color: "#f87171",
389
+ fontSize: "18px",
390
+ fontWeight: 700
391
+ },
392
+ retryBtn: {
393
+ padding: "6px 16px",
394
+ backgroundColor: "#2563eb",
395
+ color: "#fff",
396
+ border: "none",
397
+ borderRadius: "6px",
398
+ cursor: "pointer",
399
+ fontFamily: mono,
400
+ fontSize: "12px",
401
+ fontWeight: 600
402
+ },
403
+ copyBtn: {
404
+ padding: "6px 16px",
405
+ backgroundColor: "transparent",
406
+ color: "#9ca3af",
407
+ border: "1px solid #374151",
408
+ borderRadius: "6px",
409
+ cursor: "pointer",
410
+ fontFamily: mono,
411
+ fontSize: "12px",
412
+ fontWeight: 600
413
+ },
414
+ messageBlock: {
415
+ margin: "0 0 12px",
416
+ padding: "12px",
417
+ backgroundColor: "#1f2937",
418
+ borderRadius: "6px",
419
+ color: "#f9fafb",
420
+ fontSize: "13px",
421
+ lineHeight: 1.6,
422
+ whiteSpace: "pre-wrap",
423
+ wordBreak: "break-word",
424
+ overflow: "auto"
425
+ },
426
+ stackLabel: {
427
+ fontSize: "10px",
428
+ color: "#6b7280",
429
+ textTransform: "uppercase",
430
+ letterSpacing: "1.5px",
431
+ marginBottom: "6px",
432
+ fontWeight: 600
433
+ },
434
+ stackBlock: {
219
435
  margin: "0 0 20px",
220
436
  padding: "12px",
221
- backgroundColor: "#f5f5f5",
222
- borderRadius: "4px",
223
- border: "1px solid #e0e0e0",
437
+ backgroundColor: "#0f172a",
438
+ borderRadius: "6px",
439
+ color: "#94a3b8",
224
440
  fontSize: "12px",
225
441
  lineHeight: 1.6,
226
- color: "#666",
227
- overflow: "auto",
228
442
  whiteSpace: "pre-wrap",
229
- wordBreak: "break-all"
443
+ wordBreak: "break-all",
444
+ overflow: "auto"
230
445
  },
231
- caused: {
232
- fontSize: "11px",
233
- color: "#999",
446
+ causedBy: {
447
+ fontSize: "10px",
448
+ color: "#6b7280",
234
449
  textTransform: "uppercase",
235
- letterSpacing: "1px",
236
- marginBottom: "6px",
237
- paddingTop: "4px",
238
- borderTop: "1px solid #e0e0e0"
450
+ letterSpacing: "1.5px",
451
+ marginBottom: "8px",
452
+ paddingTop: "12px",
453
+ borderTop: "1px solid #374151",
454
+ fontWeight: 600
455
+ },
456
+ meta: {
457
+ display: "flex",
458
+ gap: "16px",
459
+ alignItems: "center",
460
+ paddingTop: "12px",
461
+ borderTop: "1px solid #1f2937",
462
+ flexWrap: "wrap"
463
+ },
464
+ metaItem: {
465
+ fontSize: "11px",
466
+ color: "#6b7280"
467
+ },
468
+ statusBadge: {
469
+ fontSize: "11px",
470
+ color: "#fbbf24",
471
+ backgroundColor: "#422006",
472
+ padding: "2px 8px",
473
+ borderRadius: "4px",
474
+ fontWeight: 600
475
+ }
476
+ };
477
+ const prod = {
478
+ page: {
479
+ minHeight: "100vh",
480
+ display: "flex",
481
+ alignItems: "center",
482
+ justifyContent: "center",
483
+ backgroundColor: "#0f172a",
484
+ fontFamily: "-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif",
485
+ padding: "24px"
486
+ },
487
+ card: {
488
+ textAlign: "center",
489
+ maxWidth: "440px"
490
+ },
491
+ heading: {
492
+ fontSize: "28px",
493
+ fontWeight: 700,
494
+ color: "#f1f5f9",
495
+ marginBottom: "12px"
496
+ },
497
+ subtitle: {
498
+ fontSize: "16px",
499
+ color: "#94a3b8",
500
+ marginBottom: "24px",
501
+ lineHeight: 1.5
502
+ },
503
+ refText: {
504
+ fontSize: "13px",
505
+ color: "#64748b",
506
+ marginBottom: "24px",
507
+ fontFamily: mono
508
+ },
509
+ actions: {
510
+ display: "flex",
511
+ gap: "12px",
512
+ justifyContent: "center",
513
+ alignItems: "center"
514
+ },
515
+ reloadBtn: {
516
+ padding: "10px 24px",
517
+ backgroundColor: "#2563eb",
518
+ color: "#fff",
519
+ border: "none",
520
+ borderRadius: "8px",
521
+ cursor: "pointer",
522
+ fontSize: "14px",
523
+ fontWeight: 600
524
+ },
525
+ homeLink: {
526
+ padding: "10px 24px",
527
+ color: "#94a3b8",
528
+ textDecoration: "none",
529
+ fontSize: "14px"
239
530
  }
240
531
  };
241
532
 
@@ -271,14 +562,6 @@ var Redirection = class extends AlephaError {
271
562
  }
272
563
  };
273
564
 
274
- //#endregion
275
- //#region ../../src/react/router/hooks/useRouterState.ts
276
- const useRouterState = () => {
277
- const [state] = useStore("alepha.react.router.state");
278
- if (!state) throw new AlephaError("Missing react router state");
279
- return state;
280
- };
281
-
282
565
  //#endregion
283
566
  //#region ../../src/react/router/components/NestedView.tsx
284
567
  /**
@@ -308,6 +591,7 @@ const NestedView = (props) => {
308
591
  const onError = routerLayer?.onError;
309
592
  const state = useRouterState();
310
593
  const alepha = useAlepha();
594
+ const [boundaryKey, setBoundaryKey] = useState(0);
311
595
  const [view, setView] = useState(state.layers[index]?.element);
312
596
  const [animation, setAnimation] = useState("");
313
597
  const animationExitDuration = useRef(0);
@@ -368,7 +652,7 @@ const NestedView = (props) => {
368
652
  if (props.errorBoundary) return /* @__PURE__ */ jsx(ErrorBoundary, {
369
653
  fallback: props.errorBoundary,
370
654
  children: element
371
- });
655
+ }, boundaryKey);
372
656
  const fallback = (error) => {
373
657
  const result = onError?.(error, state) ?? /* @__PURE__ */ jsx(ErrorViewer, {
374
658
  error,
@@ -380,7 +664,7 @@ const NestedView = (props) => {
380
664
  return /* @__PURE__ */ jsx(ErrorBoundary, {
381
665
  fallback,
382
666
  children: element
383
- });
667
+ }, boundaryKey);
384
668
  };
385
669
  var NestedView_default = memo(NestedView);
386
670
  function parseAnimation(animationLike, state, type = "enter") {
@@ -450,17 +734,49 @@ const NotFound = (props) => /* @__PURE__ */ jsxs("div", {
450
734
  const reactPageOptions = $atom({
451
735
  name: "alepha.react.page.options",
452
736
  description: "Configuration options for the React page provider.",
453
- schema: t.object({ strictMode: t.boolean({ default: true }) }),
454
- default: { strictMode: true }
737
+ schema: t.object({
738
+ strictMode: t.boolean({ default: true }),
739
+ staticFilePattern: t.string()
740
+ }),
741
+ default: {
742
+ strictMode: true,
743
+ staticFilePattern: "\\.[a-zA-Z0-9]{1,10}$"
744
+ }
455
745
  });
456
746
  /**
457
747
  * Handle page routes for React applications. (Browser and Server)
458
748
  */
459
749
  var ReactPageProvider = class {
750
+ dateTimeProvider = $inject(DateTimeProvider);
460
751
  log = $logger();
461
752
  options = $use(reactPageOptions);
462
753
  alepha = $inject(Alepha);
463
754
  pages = [];
755
+ nextIdCursor = 0;
756
+ configure = $hook({
757
+ on: "configure",
758
+ handler: () => {
759
+ let hasNotFoundHandler = false;
760
+ const pages = this.alepha.primitives($page);
761
+ const hasParent = (it) => {
762
+ if (it.options.parent) return true;
763
+ for (const page of pages) if ((page.options.children ? Array.isArray(page.options.children) ? page.options.children : page.options.children() : []).includes(it)) return true;
764
+ };
765
+ for (const page of pages) {
766
+ if (page.options.path === "/*") hasNotFoundHandler = true;
767
+ if (hasParent(page)) continue;
768
+ this.add(this.map(pages, page));
769
+ }
770
+ if (!hasNotFoundHandler && pages.length > 0) this.add({
771
+ path: "/*",
772
+ name: "notFound",
773
+ component: NotFound,
774
+ onServerResponse: ({ reply }) => {
775
+ reply.status = 404;
776
+ }
777
+ });
778
+ }
779
+ });
464
780
  getPages() {
465
781
  return this.pages;
466
782
  }
@@ -548,13 +864,13 @@ var ReactPageProvider = class {
548
864
  this.convertStringObjectToObject(route.schema?.query, state.query);
549
865
  config.query = route.schema?.query ? this.alepha.codec.decode(route.schema.query, state.query) : {};
550
866
  } catch (e) {
551
- it.error = e;
867
+ it.error = e instanceof Error ? e : new Error(String(e));
552
868
  break;
553
869
  }
554
870
  try {
555
871
  config.params = route.schema?.params ? this.alepha.codec.decode(route.schema.params, state.params) : {};
556
872
  } catch (e) {
557
- it.error = e;
873
+ it.error = e instanceof Error ? e : new Error(String(e));
558
874
  break;
559
875
  }
560
876
  it.config = { ...config };
@@ -578,6 +894,7 @@ var ReactPageProvider = class {
578
894
  }
579
895
  forceRefresh = true;
580
896
  }
897
+ if (route.redirect) return { redirect: route.redirect };
581
898
  if (!route.loader) continue;
582
899
  try {
583
900
  const args = Object.create(state);
@@ -591,7 +908,7 @@ var ReactPageProvider = class {
591
908
  } catch (e) {
592
909
  if (e instanceof Redirection) return { redirect: e.redirect };
593
910
  this.log.error("Page loader has failed", e);
594
- it.error = e;
911
+ it.error = e instanceof Error ? e : new Error(String(e));
595
912
  break;
596
913
  }
597
914
  }
@@ -618,7 +935,7 @@ var ReactPageProvider = class {
618
935
  ...it.route.props ? it.route.props() : {},
619
936
  ...props,
620
937
  ...context
621
- });
938
+ }, state.url);
622
939
  state.layers.push({
623
940
  name: it.route.name,
624
941
  props,
@@ -631,7 +948,7 @@ var ReactPageProvider = class {
631
948
  cache: it.cache
632
949
  });
633
950
  } catch (e) {
634
- it.error = e;
951
+ it.error = e instanceof Error ? e : new Error(String(e));
635
952
  }
636
953
  if (it.error) try {
637
954
  let element = await state.onError(it.error, state);
@@ -647,7 +964,8 @@ var ReactPageProvider = class {
647
964
  element: this.renderView(i + 1, path, element, it.route),
648
965
  index: i + 1,
649
966
  path,
650
- route: it.route
967
+ route: it.route,
968
+ cache: it.cache
651
969
  });
652
970
  break;
653
971
  } catch (e) {
@@ -665,11 +983,45 @@ var ReactPageProvider = class {
665
983
  parent = parent.parent;
666
984
  }
667
985
  }
668
- async createElement(page, props) {
986
+ async createElement(page, props, targetUrl) {
669
987
  if (page.lazy && page.component) this.log.warn(`Page ${page.name} has both lazy and component options, lazy will be used`);
670
- if (page.lazy) return createElement((await page.lazy()).default, props);
988
+ if (page.lazy) try {
989
+ return createElement((await page.lazy()).default, props);
990
+ } catch (error) {
991
+ if (this.alepha.isBrowser() && this.isChunkLoadError(error)) {
992
+ if (this.reloadAfterChunkError(targetUrl)) return;
993
+ }
994
+ throw error;
995
+ }
671
996
  if (page.component) return createElement(page.component, props);
672
997
  }
998
+ /**
999
+ * Detect chunk load errors caused by stale dynamic imports after a deployment.
1000
+ * When new assets are deployed with different hashes, old chunk URLs return 404.
1001
+ */
1002
+ isChunkLoadError(error) {
1003
+ if (!(error instanceof Error)) return false;
1004
+ const msg = error.message;
1005
+ 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);
1006
+ }
1007
+ /**
1008
+ * Navigate to the target URL to fetch updated assets after a chunk load failure.
1009
+ * Uses sessionStorage to prevent infinite reload loops.
1010
+ * Returns true if navigation was initiated.
1011
+ */
1012
+ reloadAfterChunkError(url) {
1013
+ const key = "alepha:chunk-reload";
1014
+ const lastReload = sessionStorage.getItem(key);
1015
+ const now = this.dateTimeProvider.nowMillis();
1016
+ if (lastReload && now - Number(lastReload) < 1e4) {
1017
+ this.log.error("Chunk load failed after recent reload, not retrying to avoid loop");
1018
+ return false;
1019
+ }
1020
+ this.log.warn("Chunk load failed after deployment, reloading page");
1021
+ sessionStorage.setItem(key, String(now));
1022
+ window.location.assign(url ? url.pathname + url.search : window.location.href);
1023
+ return true;
1024
+ }
673
1025
  renderError(error) {
674
1026
  return createElement(ErrorViewer, {
675
1027
  error,
@@ -704,30 +1056,6 @@ var ReactPageProvider = class {
704
1056
  onError: this.getErrorHandler(page) ?? ((error) => this.renderError(error))
705
1057
  } }, element);
706
1058
  }
707
- configure = $hook({
708
- on: "configure",
709
- handler: () => {
710
- let hasNotFoundHandler = false;
711
- const pages = this.alepha.primitives($page);
712
- const hasParent = (it) => {
713
- if (it.options.parent) return true;
714
- for (const page of pages) if ((page.options.children ? Array.isArray(page.options.children) ? page.options.children : page.options.children() : []).includes(it)) return true;
715
- };
716
- for (const page of pages) {
717
- if (page.options.path === "/*") hasNotFoundHandler = true;
718
- if (hasParent(page)) continue;
719
- this.add(this.map(pages, page));
720
- }
721
- if (!hasNotFoundHandler && pages.length > 0) this.add({
722
- path: "/*",
723
- name: "notFound",
724
- component: NotFound,
725
- onServerResponse: ({ reply }) => {
726
- reply.status = 404;
727
- }
728
- });
729
- }
730
- });
731
1059
  map(pages, target) {
732
1060
  const children = target.options.children ? Array.isArray(target.options.children) ? target.options.children : target.options.children() : [];
733
1061
  const getChildrenFromParent = (it) => {
@@ -765,10 +1093,9 @@ var ReactPageProvider = class {
765
1093
  if (path.endsWith("/") && path !== "/") path = path.slice(0, -1);
766
1094
  return path;
767
1095
  }
768
- _next = 0;
769
1096
  nextId() {
770
- this._next += 1;
771
- return `P${this._next}`;
1097
+ this.nextIdCursor += 1;
1098
+ return `P${this.nextIdCursor}`;
772
1099
  }
773
1100
  };
774
1101
  const isPageRoute = (it) => {
@@ -1255,7 +1582,7 @@ var ReactServerTemplateProvider = class {
1255
1582
  const { encoder, SLOTS: slots } = this;
1256
1583
  let headClosed = false;
1257
1584
  let bodyStarted = false;
1258
- let routerState;
1585
+ let routerState = options.state;
1259
1586
  return new ReadableStream({ start: async (controller) => {
1260
1587
  try {
1261
1588
  controller.enqueue(slots.DOCTYPE);
@@ -1338,6 +1665,11 @@ var ReactServerTemplateProvider = class {
1338
1665
  }
1339
1666
  controller.enqueue(encoder.encode(this.renderErrorToString(error instanceof Error ? error : new Error(String(error)), routerState)));
1340
1667
  controller.enqueue(slots.ROOT_CLOSE);
1668
+ if (routerState) {
1669
+ controller.enqueue(slots.HYDRATION_PREFIX);
1670
+ controller.enqueue(encoder.encode(this.safeJsonSerialize(this.buildHydrationData(routerState))));
1671
+ controller.enqueue(slots.HYDRATION_SUFFIX);
1672
+ }
1341
1673
  controller.enqueue(slots.BODY_HTML_CLOSE);
1342
1674
  }
1343
1675
  /**
@@ -1405,6 +1737,7 @@ var ReactServerProvider = class {
1405
1737
  */
1406
1738
  hasServerLinksProvider = false;
1407
1739
  options = $use(reactServerOptions);
1740
+ pageOptions = $use(reactPageOptions);
1408
1741
  /**
1409
1742
  * Configure the React server provider.
1410
1743
  */
@@ -1436,7 +1769,7 @@ var ReactServerProvider = class {
1436
1769
  registerPages() {
1437
1770
  this.setupEarlyHeadContent();
1438
1771
  this.hasServerLinksProvider = this.alepha.has(ServerLinksProvider);
1439
- for (const page of this.pageApi.getPages()) if (page.component || page.lazy) {
1772
+ for (const page of this.pageApi.getPages()) if (page.component || page.lazy || page.redirect) {
1440
1773
  this.log.debug(`+ ${page.match} -> ${page.name}`);
1441
1774
  const cacheMiddleware = (page.use ?? []).filter((m) => m[OPTIONS]?.name === "$cache");
1442
1775
  const serverMiddleware = (page.use ?? []).filter((m) => m[OPTIONS]?.name !== "$cache");
@@ -1509,6 +1842,15 @@ var ReactServerProvider = class {
1509
1842
  });
1510
1843
  }
1511
1844
  /**
1845
+ * Resolve the static file pattern from page options.
1846
+ * Returns a compiled RegExp, or `false` if disabled (empty string).
1847
+ */
1848
+ resolveStaticFilePattern() {
1849
+ const pattern = this.pageOptions.staticFilePattern;
1850
+ if (!pattern) return false;
1851
+ return new RegExp(pattern);
1852
+ }
1853
+ /**
1512
1854
  * Create the request handler for a page route.
1513
1855
  *
1514
1856
  * When cacheMiddleware is provided, uses a non-streaming path that renders
@@ -1516,8 +1858,14 @@ var ReactServerProvider = class {
1516
1858
  */
1517
1859
  createHandler(route, cacheMiddleware = []) {
1518
1860
  const hasCache = cacheMiddleware.length > 0;
1861
+ const staticFilePattern = route.match === "/*" ? this.resolveStaticFilePattern() : false;
1519
1862
  return async (serverRequest) => {
1520
1863
  const { url, reply, query, params } = serverRequest;
1864
+ if (staticFilePattern && staticFilePattern.test(url.pathname)) {
1865
+ reply.status = 404;
1866
+ reply.headers["content-type"] = "text/plain";
1867
+ return "Not Found";
1868
+ }
1521
1869
  this.log.trace("Rendering page", { name: route.name });
1522
1870
  const state = {
1523
1871
  url,
@@ -1578,13 +1926,16 @@ var ReactServerProvider = class {
1578
1926
  };
1579
1927
  }, {
1580
1928
  hydration: true,
1929
+ state,
1581
1930
  onError: (error) => {
1582
1931
  if (error instanceof Redirection) this.log.debug("Streaming resulted in redirection", { redirect: error.redirect });
1583
1932
  }
1584
1933
  });
1585
1934
  this.log.trace("Page streaming started (early head optimization)");
1586
1935
  route.onServerResponse?.(serverRequest);
1587
- reply.body = htmlStream;
1936
+ reply.body = htmlStream.pipeThrough(new TransformStream({ flush: () => {
1937
+ this.log.info("Page streaming completed", { name: route.name });
1938
+ } }));
1588
1939
  };
1589
1940
  }
1590
1941
  /**
@@ -1689,6 +2040,11 @@ const envSchema = t.object({ REACT_SSR_ENABLED: t.optional(t.boolean({ descripti
1689
2040
  /**
1690
2041
  * React server provider configuration atom
1691
2042
  */
2043
+ /**
2044
+ * Default pattern matching file-like URLs (e.g. /hello.txt, /wp-login.php).
2045
+ * Matches paths whose last segment contains a dot followed by 1-10 alphanumeric characters.
2046
+ */
2047
+ const DEFAULT_STATIC_FILE_PATTERN = "\\.[a-zA-Z0-9]{1,10}$";
1692
2048
  const reactServerOptions = $atom({
1693
2049
  name: "alepha.react.server.options",
1694
2050
  schema: t.object({
@@ -1751,7 +2107,7 @@ var ReactBrowserRouterProvider = class extends RouterProvider {
1751
2107
  configure = $hook({
1752
2108
  on: "configure",
1753
2109
  handler: async () => {
1754
- for (const page of this.pageApi.getPages()) if (page.component || page.lazy) this.push({
2110
+ for (const page of this.pageApi.getPages()) if (page.component || page.lazy || page.redirect) this.push({
1755
2111
  path: page.match,
1756
2112
  page
1757
2113
  });
@@ -1796,9 +2152,14 @@ var ReactBrowserRouterProvider = class extends RouterProvider {
1796
2152
  await this.alepha.events.emit("react:transition:success", { state });
1797
2153
  } catch (e) {
1798
2154
  this.log.error("Transition has failed", e);
2155
+ let element;
2156
+ try {
2157
+ const result = state.onError(e, state);
2158
+ if (result != null && !(result instanceof Redirection)) element = result;
2159
+ } catch {}
1799
2160
  state.layers = [{
1800
2161
  name: "error",
1801
- element: this.pageApi.renderError(e),
2162
+ element: element ?? this.pageApi.renderError(e),
1802
2163
  index: 0,
1803
2164
  path: "/"
1804
2165
  }];
@@ -2276,5 +2637,5 @@ const AlephaReactRouter = $module({
2276
2637
  });
2277
2638
 
2278
2639
  //#endregion
2279
- export { $page, AlephaReactRouter, ErrorViewer, Link, NestedView_default as NestedView, NotFound, PAGE_PRELOAD_KEY, PagePrimitive, ReactBrowserProvider, ReactPageProvider, ReactPageService, ReactPreloadProvider, ReactRouter, ReactServerProvider, ReactServerTemplateProvider, Redirection, RouterLayerContext, SSRManifestProvider, isPageRoute, reactBrowserOptions, reactPageOptions, reactServerOptions, useActive, useQueryParams, useRouter, useRouterState };
2640
+ export { $page, AlephaReactRouter, DEFAULT_STATIC_FILE_PATTERN, ErrorViewer, Link, NestedView_default as NestedView, NotFound, PAGE_PRELOAD_KEY, PagePrimitive, ReactBrowserProvider, ReactPageProvider, ReactPageService, ReactPreloadProvider, ReactRouter, ReactServerProvider, ReactServerTemplateProvider, Redirection, RouterLayerContext, SSRManifestProvider, isPageRoute, reactBrowserOptions, reactPageOptions, reactServerOptions, useActive, useQueryParams, useRouter, useRouterState };
2280
2641
  //# sourceMappingURL=index.js.map