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
@@ -1,5 +1,7 @@
1
1
  import * as alepha from "alepha";
2
+ import { Alepha } from "alepha";
2
3
  import { ScryptOptions } from "node:crypto";
4
+ import * as alepha_logger0 from "alepha/logger";
3
5
 
4
6
  //#region ../../src/crypto/providers/CryptoProvider.d.ts
5
7
  declare class CryptoProvider {
@@ -25,6 +27,21 @@ declare class CryptoProvider {
25
27
  protected deriveAesKey(key: string): Buffer;
26
28
  }
27
29
  //#endregion
30
+ //#region ../../src/crypto/providers/SecretProvider.d.ts
31
+ declare const DEFAULT_SECRET_KEY_VALUE = "change-me-in-production";
32
+ declare const alephaSecretEnvSchema: alepha.TObject<{
33
+ APP_SECRET: alepha.TString;
34
+ }>;
35
+ declare class SecretProvider {
36
+ protected readonly log: alepha_logger0.Logger;
37
+ protected readonly alepha: Alepha;
38
+ protected readonly env: {
39
+ APP_SECRET: string;
40
+ };
41
+ get secretKey(): string;
42
+ protected readonly configure: alepha.HookPrimitive<"configure">;
43
+ }
44
+ //#endregion
28
45
  //#region ../../src/crypto/index.d.ts
29
46
  /**
30
47
  * Cryptographic utilities: hashing, HMAC, AES-256-GCM encryption, password hashing, and secure random generation.
@@ -33,5 +50,5 @@ declare class CryptoProvider {
33
50
  */
34
51
  declare const AlephaCrypto: alepha.Service<alepha.Module>;
35
52
  //#endregion
36
- export { AlephaCrypto, CryptoProvider };
53
+ export { AlephaCrypto, CryptoProvider, DEFAULT_SECRET_KEY_VALUE, SecretProvider, alephaSecretEnvSchema };
37
54
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/crypto/providers/CryptoProvider.ts","../../src/crypto/index.ts"],"mappings":";;;;cAaa,cAAA;EAAA,0BACe,cAAA,EAAgB,aAAA;EAAA,0BAKhB,iBAAA;EAAA,0BACA,WAAA;EAAA,0BACA,aAAA;EAAA,0BACA,aAAA;EAAA,0BACA,cAAA;EAAA,0BACA,cAAA;EAEb,YAAA,CAAa,QAAA,WAAmB,OAAA;EAWhC,cAAA,CACX,QAAA,UACA,MAAA,WACC,OAAA;EAuCI,IAAA,CAAK,IAAA,UAAc,SAAA;EAInB,IAAA,CAAK,IAAA,UAAc,MAAA,UAAgB,SAAA;EAInC,UAAA,CACL,IAAA,UACA,SAAA,UACA,MAAA,UACA,SAAA;EAMK,OAAA,CAAQ,SAAA,UAAmB,GAAA;EAc3B,OAAA,CAAQ,UAAA,UAAoB,GAAA;EAoB5B,MAAA,CAAO,CAAA,UAAW,CAAA;EAOlB,UAAA,CAAA;EAIA,UAAA,CAAW,MAAA;EAIX,UAAA,CAAW,MAAA;EAAA,UAMR,WAAA,CACR,QAAA,UACA,IAAA,UACA,MAAA,UACA,OAAA,EAAS,aAAA,GACR,OAAA,CAAQ,MAAA;EAAA,UASD,YAAA,CAAa,GAAA,WAAc,MAAA;AAAA;;;;;;AAzJvC;;cCHa,YAAA,EAAY,MAAA,CAAA,OAAA,CAGvB,MAAA,CAHuB,MAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/crypto/providers/CryptoProvider.ts","../../src/crypto/providers/SecretProvider.ts","../../src/crypto/index.ts"],"mappings":";;;;;;cAaa,cAAA;EAAA,0BACe,cAAA,EAAgB,aAAA;EAAA,0BAKhB,iBAAA;EAAA,0BACA,WAAA;EAAA,0BACA,aAAA;EAAA,0BACA,aAAA;EAAA,0BACA,cAAA;EAAA,0BACA,cAAA;EAEb,YAAA,CAAa,QAAA,WAAmB,OAAA;EAWhC,cAAA,CACX,QAAA,UACA,MAAA,WACC,OAAA;EAuCI,IAAA,CAAK,IAAA,UAAc,SAAA;EAInB,IAAA,CAAK,IAAA,UAAc,MAAA,UAAgB,SAAA;EAInC,UAAA,CACL,IAAA,UACA,SAAA,UACA,MAAA,UACA,SAAA;EAMK,OAAA,CAAQ,SAAA,UAAmB,GAAA;EAc3B,OAAA,CAAQ,UAAA,UAAoB,GAAA;EAoB5B,MAAA,CAAO,CAAA,UAAW,CAAA;EAOlB,UAAA,CAAA;EAIA,UAAA,CAAW,MAAA;EAIX,UAAA,CAAW,MAAA;EAAA,UAMR,WAAA,CACR,QAAA,UACA,IAAA,UACA,MAAA,UACA,OAAA,EAAS,aAAA,GACR,OAAA,CAAQ,MAAA;EAAA,UASD,YAAA,CAAa,GAAA,WAAc,MAAA;AAAA;;;cCnK1B,wBAAA;AAAA,cAEA,qBAAA,EAMX,MAAA,CANgC,OAAA;cAMhC,MAAA,CAAA,OAAA;AAAA;AAAA,cAEW,cAAA;EAAA,mBACQ,GAAA,EADM,cAAA,CACH,MAAA;EAAA,mBACH,MAAA,EAAM,MAAA;EAAA,mBACN,GAAA;;;MAER,SAAA,CAAA;EAAA,mBAIQ,SAAA,EAPM,MAAA,CAOG,aAAA;AAAA;;;;;;;ADT9B;cEDa,YAAA,EAAY,MAAA,CAAA,OAAA,CAMvB,MAAA,CANuB,MAAA"}
@@ -1,5 +1,6 @@
1
- import { $module } from "alepha";
1
+ import { $env, $hook, $inject, $module, Alepha, t } from "alepha";
2
2
  import { createCipheriv, createDecipheriv, createHash, createHmac, randomBytes, randomInt, randomUUID, scrypt, timingSafeEqual } from "node:crypto";
3
+ import { $logger } from "alepha/logger";
3
4
 
4
5
  //#region ../../src/crypto/providers/CryptoProvider.ts
5
6
  var CryptoProvider = class CryptoProvider {
@@ -88,6 +89,28 @@ var CryptoProvider = class CryptoProvider {
88
89
  }
89
90
  };
90
91
 
92
+ //#endregion
93
+ //#region ../../src/crypto/providers/SecretProvider.ts
94
+ const DEFAULT_SECRET_KEY_VALUE = "change-me-in-production";
95
+ const alephaSecretEnvSchema = t.object({ APP_SECRET: t.text({
96
+ default: DEFAULT_SECRET_KEY_VALUE,
97
+ description: "The secret key used for signing JWTs, encrypting cookies, and other security features."
98
+ }) });
99
+ var SecretProvider = class {
100
+ log = $logger();
101
+ alepha = $inject(Alepha);
102
+ env = $env(alephaSecretEnvSchema);
103
+ get secretKey() {
104
+ return this.env.APP_SECRET;
105
+ }
106
+ configure = $hook({
107
+ on: "configure",
108
+ handler: async () => {
109
+ if (this.secretKey === DEFAULT_SECRET_KEY_VALUE && this.alepha.isProduction()) this.log.warn("Using default secret key. Please set a secure APP_SECRET environment variable.");
110
+ }
111
+ });
112
+ };
113
+
91
114
  //#endregion
92
115
  //#region ../../src/crypto/index.ts
93
116
  /**
@@ -97,9 +120,12 @@ var CryptoProvider = class CryptoProvider {
97
120
  */
98
121
  const AlephaCrypto = $module({
99
122
  name: "alepha.crypto",
100
- services: [CryptoProvider]
123
+ services: [CryptoProvider, SecretProvider],
124
+ register: (alepha) => {
125
+ alepha.with(CryptoProvider);
126
+ }
101
127
  });
102
128
 
103
129
  //#endregion
104
- export { AlephaCrypto, CryptoProvider };
130
+ export { AlephaCrypto, CryptoProvider, DEFAULT_SECRET_KEY_VALUE, SecretProvider, alephaSecretEnvSchema };
105
131
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/crypto/providers/CryptoProvider.ts","../../src/crypto/index.ts"],"sourcesContent":["import type { ScryptOptions } from \"node:crypto\";\nimport {\n createCipheriv,\n createDecipheriv,\n createHash,\n createHmac,\n randomBytes,\n randomInt,\n randomUUID,\n scrypt,\n timingSafeEqual,\n} from \"node:crypto\";\n\nexport class CryptoProvider {\n protected static readonly SCRYPT_OPTIONS: ScryptOptions = {\n N: 16384,\n r: 8,\n p: 1,\n };\n protected static readonly SCRYPT_KEY_LENGTH = 64;\n protected static readonly SALT_LENGTH = 16;\n protected static readonly AES_ALGORITHM = \"aes-256-gcm\";\n protected static readonly AES_IV_LENGTH = 12;\n protected static readonly AES_TAG_LENGTH = 16;\n protected static readonly AES_KEY_LENGTH = 32;\n\n public async hashPassword(password: string): Promise<string> {\n const salt = randomBytes(CryptoProvider.SALT_LENGTH).toString(\"hex\");\n const derivedKey = (await this.scryptAsync(\n password,\n salt,\n CryptoProvider.SCRYPT_KEY_LENGTH,\n CryptoProvider.SCRYPT_OPTIONS,\n )) as Buffer;\n return `${salt}:${derivedKey.toString(\"hex\")}`;\n }\n\n public async verifyPassword(\n password: string,\n stored: string,\n ): Promise<boolean> {\n if (!stored || typeof stored !== \"string\") {\n return false;\n }\n\n const parts = stored.split(\":\");\n if (parts.length !== 2) {\n return false;\n }\n\n const [salt, originalHex] = parts;\n\n if (!salt || !originalHex) {\n return false;\n }\n\n if (originalHex.length % 2 !== 0 || !/^[0-9a-f]+$/i.test(originalHex)) {\n return false;\n }\n\n try {\n const derivedKey = (await this.scryptAsync(\n password,\n salt,\n CryptoProvider.SCRYPT_KEY_LENGTH,\n CryptoProvider.SCRYPT_OPTIONS,\n )) as Buffer;\n const originalKey = Buffer.from(originalHex, \"hex\");\n\n if (derivedKey.length !== originalKey.length) {\n return false;\n }\n\n return timingSafeEqual(derivedKey, originalKey);\n } catch {\n return false;\n }\n }\n\n public hash(data: string, algorithm = \"sha256\"): string {\n return createHash(algorithm).update(data).digest(\"hex\");\n }\n\n public hmac(data: string, secret: string, algorithm = \"sha256\"): string {\n return createHmac(algorithm, secret).update(data).digest(\"hex\");\n }\n\n public verifyHmac(\n data: string,\n signature: string,\n secret: string,\n algorithm = \"sha256\",\n ): boolean {\n const expected = this.hmac(data, secret, algorithm);\n return this.equals(expected, signature);\n }\n\n public encrypt(plaintext: string, key: string): string {\n const keyBuffer = this.deriveAesKey(key);\n const iv = randomBytes(CryptoProvider.AES_IV_LENGTH);\n const cipher = createCipheriv(CryptoProvider.AES_ALGORITHM, keyBuffer, iv, {\n authTagLength: CryptoProvider.AES_TAG_LENGTH,\n });\n const encrypted = Buffer.concat([\n cipher.update(plaintext, \"utf8\"),\n cipher.final(),\n ]);\n const tag = cipher.getAuthTag();\n return `${iv.toString(\"hex\")}:${tag.toString(\"hex\")}:${encrypted.toString(\"hex\")}`;\n }\n\n public decrypt(ciphertext: string, key: string): string {\n const parts = ciphertext.split(\":\");\n if (parts.length !== 3) {\n throw new Error(\"Invalid ciphertext format\");\n }\n\n const [ivHex, tagHex, encryptedHex] = parts;\n const keyBuffer = this.deriveAesKey(key);\n const decipher = createDecipheriv(\n CryptoProvider.AES_ALGORITHM,\n keyBuffer,\n Buffer.from(ivHex!, \"hex\"),\n { authTagLength: CryptoProvider.AES_TAG_LENGTH },\n );\n decipher.setAuthTag(Buffer.from(tagHex!, \"hex\"));\n return (\n decipher.update(encryptedHex!, \"hex\", \"utf8\") + decipher.final(\"utf8\")\n );\n }\n\n public equals(a: string, b: string): boolean {\n if (a.length !== b.length) {\n return false;\n }\n return timingSafeEqual(Buffer.from(a), Buffer.from(b));\n }\n\n public randomUUID(): string {\n return randomUUID();\n }\n\n public randomText(length: number): string {\n return randomBytes(length).toString(\"base64url\").slice(0, length);\n }\n\n public randomCode(length: number): string {\n const max = 10 ** length;\n const code = randomInt(max);\n return String(code).padStart(length, \"0\");\n }\n\n protected scryptAsync(\n password: string,\n salt: string,\n keylen: number,\n options: ScryptOptions,\n ): Promise<Buffer> {\n return new Promise((resolve, reject) => {\n scrypt(password, salt, keylen, options, (err, derivedKey) => {\n if (err) reject(err);\n else resolve(derivedKey);\n });\n });\n }\n\n protected deriveAesKey(key: string): Buffer {\n return createHash(\"sha256\")\n .update(key)\n .digest()\n .subarray(0, CryptoProvider.AES_KEY_LENGTH);\n }\n}\n","import { $module } from \"alepha\";\nimport { CryptoProvider } from \"./providers/CryptoProvider.ts\";\n\nexport * from \"./providers/CryptoProvider.ts\";\n\n/**\n * Cryptographic utilities: hashing, HMAC, AES-256-GCM encryption, password hashing, and secure random generation.\n *\n * @module alepha.crypto\n */\nexport const AlephaCrypto = $module({\n name: \"alepha.crypto\",\n services: [CryptoProvider],\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/crypto/providers/CryptoProvider.ts","../../src/crypto/providers/SecretProvider.ts","../../src/crypto/index.ts"],"sourcesContent":["import type { ScryptOptions } from \"node:crypto\";\nimport {\n createCipheriv,\n createDecipheriv,\n createHash,\n createHmac,\n randomBytes,\n randomInt,\n randomUUID,\n scrypt,\n timingSafeEqual,\n} from \"node:crypto\";\n\nexport class CryptoProvider {\n protected static readonly SCRYPT_OPTIONS: ScryptOptions = {\n N: 16384,\n r: 8,\n p: 1,\n };\n protected static readonly SCRYPT_KEY_LENGTH = 64;\n protected static readonly SALT_LENGTH = 16;\n protected static readonly AES_ALGORITHM = \"aes-256-gcm\";\n protected static readonly AES_IV_LENGTH = 12;\n protected static readonly AES_TAG_LENGTH = 16;\n protected static readonly AES_KEY_LENGTH = 32;\n\n public async hashPassword(password: string): Promise<string> {\n const salt = randomBytes(CryptoProvider.SALT_LENGTH).toString(\"hex\");\n const derivedKey = (await this.scryptAsync(\n password,\n salt,\n CryptoProvider.SCRYPT_KEY_LENGTH,\n CryptoProvider.SCRYPT_OPTIONS,\n )) as Buffer;\n return `${salt}:${derivedKey.toString(\"hex\")}`;\n }\n\n public async verifyPassword(\n password: string,\n stored: string,\n ): Promise<boolean> {\n if (!stored || typeof stored !== \"string\") {\n return false;\n }\n\n const parts = stored.split(\":\");\n if (parts.length !== 2) {\n return false;\n }\n\n const [salt, originalHex] = parts;\n\n if (!salt || !originalHex) {\n return false;\n }\n\n if (originalHex.length % 2 !== 0 || !/^[0-9a-f]+$/i.test(originalHex)) {\n return false;\n }\n\n try {\n const derivedKey = (await this.scryptAsync(\n password,\n salt,\n CryptoProvider.SCRYPT_KEY_LENGTH,\n CryptoProvider.SCRYPT_OPTIONS,\n )) as Buffer;\n const originalKey = Buffer.from(originalHex, \"hex\");\n\n if (derivedKey.length !== originalKey.length) {\n return false;\n }\n\n return timingSafeEqual(derivedKey, originalKey);\n } catch {\n return false;\n }\n }\n\n public hash(data: string, algorithm = \"sha256\"): string {\n return createHash(algorithm).update(data).digest(\"hex\");\n }\n\n public hmac(data: string, secret: string, algorithm = \"sha256\"): string {\n return createHmac(algorithm, secret).update(data).digest(\"hex\");\n }\n\n public verifyHmac(\n data: string,\n signature: string,\n secret: string,\n algorithm = \"sha256\",\n ): boolean {\n const expected = this.hmac(data, secret, algorithm);\n return this.equals(expected, signature);\n }\n\n public encrypt(plaintext: string, key: string): string {\n const keyBuffer = this.deriveAesKey(key);\n const iv = randomBytes(CryptoProvider.AES_IV_LENGTH);\n const cipher = createCipheriv(CryptoProvider.AES_ALGORITHM, keyBuffer, iv, {\n authTagLength: CryptoProvider.AES_TAG_LENGTH,\n });\n const encrypted = Buffer.concat([\n cipher.update(plaintext, \"utf8\"),\n cipher.final(),\n ]);\n const tag = cipher.getAuthTag();\n return `${iv.toString(\"hex\")}:${tag.toString(\"hex\")}:${encrypted.toString(\"hex\")}`;\n }\n\n public decrypt(ciphertext: string, key: string): string {\n const parts = ciphertext.split(\":\");\n if (parts.length !== 3) {\n throw new Error(\"Invalid ciphertext format\");\n }\n\n const [ivHex, tagHex, encryptedHex] = parts;\n const keyBuffer = this.deriveAesKey(key);\n const decipher = createDecipheriv(\n CryptoProvider.AES_ALGORITHM,\n keyBuffer,\n Buffer.from(ivHex!, \"hex\"),\n { authTagLength: CryptoProvider.AES_TAG_LENGTH },\n );\n decipher.setAuthTag(Buffer.from(tagHex!, \"hex\"));\n return (\n decipher.update(encryptedHex!, \"hex\", \"utf8\") + decipher.final(\"utf8\")\n );\n }\n\n public equals(a: string, b: string): boolean {\n if (a.length !== b.length) {\n return false;\n }\n return timingSafeEqual(Buffer.from(a), Buffer.from(b));\n }\n\n public randomUUID(): string {\n return randomUUID();\n }\n\n public randomText(length: number): string {\n return randomBytes(length).toString(\"base64url\").slice(0, length);\n }\n\n public randomCode(length: number): string {\n const max = 10 ** length;\n const code = randomInt(max);\n return String(code).padStart(length, \"0\");\n }\n\n protected scryptAsync(\n password: string,\n salt: string,\n keylen: number,\n options: ScryptOptions,\n ): Promise<Buffer> {\n return new Promise((resolve, reject) => {\n scrypt(password, salt, keylen, options, (err, derivedKey) => {\n if (err) reject(err);\n else resolve(derivedKey);\n });\n });\n }\n\n protected deriveAesKey(key: string): Buffer {\n return createHash(\"sha256\")\n .update(key)\n .digest()\n .subarray(0, CryptoProvider.AES_KEY_LENGTH);\n }\n}\n","import { $env, $hook, $inject, Alepha, t } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\n\nexport const DEFAULT_SECRET_KEY_VALUE = \"change-me-in-production\";\n\nexport const alephaSecretEnvSchema = t.object({\n APP_SECRET: t.text({\n default: DEFAULT_SECRET_KEY_VALUE,\n description:\n \"The secret key used for signing JWTs, encrypting cookies, and other security features.\",\n }),\n});\n\nexport class SecretProvider {\n protected readonly log = $logger();\n protected readonly alepha = $inject(Alepha);\n protected readonly env = $env(alephaSecretEnvSchema);\n\n public get secretKey(): string {\n return this.env.APP_SECRET;\n }\n\n protected readonly configure = $hook({\n on: \"configure\",\n handler: async () => {\n if (\n this.secretKey === DEFAULT_SECRET_KEY_VALUE &&\n this.alepha.isProduction()\n ) {\n this.log.warn(\n \"Using default secret key. Please set a secure APP_SECRET environment variable.\",\n );\n }\n },\n });\n}\n","import { $module } from \"alepha\";\nimport { CryptoProvider } from \"./providers/CryptoProvider.ts\";\nimport { SecretProvider } from \"./providers/SecretProvider.ts\";\n\nexport * from \"./providers/CryptoProvider.ts\";\nexport * from \"./providers/SecretProvider.ts\";\n\n/**\n * Cryptographic utilities: hashing, HMAC, AES-256-GCM encryption, password hashing, and secure random generation.\n *\n * @module alepha.crypto\n */\nexport const AlephaCrypto = $module({\n name: \"alepha.crypto\",\n services: [CryptoProvider, SecretProvider],\n register: (alepha) => {\n alepha.with(CryptoProvider);\n },\n});\n"],"mappings":"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"}
@@ -566,8 +566,8 @@ var DevToolsProvider = class {
566
566
  */
567
567
  onLog = $hook({
568
568
  on: "log",
569
- handler: ({ message, entry }) => {
570
- if (message) this.memoryDestination.write(message, entry);
569
+ handler: ({ entry }) => {
570
+ this.memoryDestination.write("", entry);
571
571
  }
572
572
  });
573
573
  uiRoute = $serve({
@@ -625,15 +625,6 @@ var DevToolsProvider = class {
625
625
  })
626
626
  },
627
627
  handler: ({ query }) => {
628
- let memoryProvider;
629
- try {
630
- memoryProvider = this.alepha.inject(MemoryDestinationProvider);
631
- } catch {
632
- return {
633
- logs: [],
634
- total: 0
635
- };
636
- }
637
628
  const levelOrder = [
638
629
  "TRACE",
639
630
  "DEBUG",
@@ -641,7 +632,7 @@ var DevToolsProvider = class {
641
632
  "WARN",
642
633
  "ERROR"
643
634
  ];
644
- let entries = memoryProvider.logs;
635
+ let entries = this.memoryDestination.logs;
645
636
  if (query.level) {
646
637
  const minIndex = levelOrder.indexOf(query.level.toUpperCase());
647
638
  if (minIndex >= 0) entries = entries.filter((e) => levelOrder.indexOf(e.level) >= minIndex);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/devtools/providers/DevToolsMetadataProvider.ts","../../src/devtools/assets.ts","../../src/devtools/schemas/DevActionMetadata.ts","../../src/devtools/schemas/DevAtomMetadata.ts","../../src/devtools/schemas/DevBucketMetadata.ts","../../src/devtools/schemas/DevCacheMetadata.ts","../../src/devtools/schemas/DevEntityMetadata.ts","../../src/devtools/schemas/DevEnvMetadata.ts","../../src/devtools/schemas/DevModuleMetadata.ts","../../src/devtools/schemas/DevPageMetadata.ts","../../src/devtools/schemas/DevProviderMetadata.ts","../../src/devtools/schemas/DevQueueMetadata.ts","../../src/devtools/schemas/DevRealmMetadata.ts","../../src/devtools/schemas/DevRouteMetadata.ts","../../src/devtools/schemas/DevSchedulerMetadata.ts","../../src/devtools/schemas/DevTopicMetadata.ts","../../src/devtools/schemas/DevMetadata.ts","../../src/devtools/providers/DevToolsProvider.ts","../../src/devtools/index.ts"],"sourcesContent":["import { $inject, Alepha, type TObject, type TSchema, t } from \"alepha\";\nimport { $bucket } from \"alepha/bucket\";\nimport { $cache } from \"alepha/cache\";\nimport { $logger } from \"alepha/logger\";\nimport {\n PG_CREATED_AT,\n PG_DEFAULT,\n PG_DELETED_AT,\n PG_IDENTITY,\n PG_PRIMARY_KEY,\n PG_REF,\n PG_SERIAL,\n PG_UPDATED_AT,\n PG_VERSION,\n RepositoryProvider,\n} from \"alepha/orm\";\nimport { $queue } from \"alepha/queue\";\nimport { $page } from \"alepha/react/router\";\nimport { $scheduler } from \"alepha/scheduler\";\nimport { $issuer } from \"alepha/security\";\nimport { $action, ServerProvider } from \"alepha/server\";\nimport { $topic } from \"alepha/topic\";\nimport type { DevActionMetadata } from \"../schemas/DevActionMetadata.ts\";\nimport type { DevAtomMetadata } from \"../schemas/DevAtomMetadata.ts\";\nimport type { DevBucketMetadata } from \"../schemas/DevBucketMetadata.ts\";\nimport type { DevCacheMetadata } from \"../schemas/DevCacheMetadata.ts\";\nimport type {\n DevEntityColumn,\n DevEntityConstraint,\n DevEntityForeignKey,\n DevEntityIndex,\n DevEntityMetadata,\n} from \"../schemas/DevEntityMetadata.ts\";\nimport type { DevEnvMetadata } from \"../schemas/DevEnvMetadata.ts\";\nimport type { DevMetadata, DevSystem } from \"../schemas/DevMetadata.ts\";\nimport type { DevModuleMetadata } from \"../schemas/DevModuleMetadata.ts\";\nimport type { DevPageMetadata } from \"../schemas/DevPageMetadata.ts\";\nimport type { DevProviderMetadata } from \"../schemas/DevProviderMetadata.ts\";\nimport type { DevQueueMetadata } from \"../schemas/DevQueueMetadata.ts\";\nimport type { DevRealmMetadata } from \"../schemas/DevRealmMetadata.ts\";\nimport type { DevRouteMetadata } from \"../schemas/DevRouteMetadata.ts\";\nimport type { DevSchedulerMetadata } from \"../schemas/DevSchedulerMetadata.ts\";\nimport type { DevTopicMetadata } from \"../schemas/DevTopicMetadata.ts\";\n\nexport class DevToolsMetadataProvider {\n protected readonly alepha = $inject(Alepha);\n protected readonly log = $logger();\n protected readonly serverProvider = $inject(ServerProvider);\n protected readonly startedAt = Date.now();\n\n public getActions(): DevActionMetadata[] {\n const actionPrimitives = this.alepha.primitives($action);\n\n return actionPrimitives.map((action) => {\n const schema = action.schema;\n const options = action.options as any; // Allow accessing augmented properties\n\n return {\n name: action.name,\n group: action.group,\n method: action.method,\n path: action.path,\n prefix: action.prefix,\n fullPath: action.route.path,\n description: action.options.description,\n summary: options.summary,\n disabled: action.options.disabled,\n secure:\n action.middlewares.some((m) => m?.name === \"$secure\") || undefined,\n hide: options.hide,\n body: schema?.body,\n params: schema?.params,\n query: schema?.query,\n response: schema?.response,\n bodyContentType: action.getBodyContentType(),\n middlewares: action.middlewares.filter(Boolean).length\n ? action.middlewares.filter(Boolean)\n : undefined,\n };\n });\n }\n\n public getQueues(): DevQueueMetadata[] {\n const queuePrimitives = this.alepha.primitives($queue);\n\n return queuePrimitives.map((queue) => ({\n name: queue.name,\n description: queue.options.description,\n schema: queue.options.schema,\n provider: this.getProviderName(queue.options.provider),\n }));\n }\n\n public getSchedulers(): DevSchedulerMetadata[] {\n const schedulerPrimitives = this.alepha.primitives($scheduler);\n\n return schedulerPrimitives.map((scheduler) => ({\n name: scheduler.name,\n description: scheduler.options.description,\n cron: scheduler.options.cron,\n interval: scheduler.options.interval,\n lock: scheduler.options.lock,\n }));\n }\n\n public getTopics(): DevTopicMetadata[] {\n const topicPrimitives = this.alepha.primitives($topic);\n\n // Deduplicate by name, count subscribers\n const topicMap = new Map<string, DevTopicMetadata>();\n for (const topic of topicPrimitives) {\n const existing = topicMap.get(topic.name);\n if (existing) {\n existing.subscribers++;\n } else {\n topicMap.set(topic.name, {\n name: topic.name,\n description: topic.options.description,\n schema: topic.options.schema,\n provider: this.getProviderName(topic.options.provider),\n subscribers: 1,\n });\n }\n }\n return Array.from(topicMap.values());\n }\n\n public getBuckets(): DevBucketMetadata[] {\n const bucketPrimitives = this.alepha.primitives($bucket);\n\n return bucketPrimitives.map((bucket) => ({\n name: bucket.name,\n description: bucket.options.description,\n mimeTypes: bucket.options.mimeTypes,\n maxSize: bucket.options.maxSize,\n provider: this.getProviderName(bucket.options.provider),\n }));\n }\n\n public getRealms(): DevRealmMetadata[] {\n const realmPrimitives = this.alepha.primitives($issuer);\n\n return realmPrimitives.map((realm) => ({\n name: realm.name,\n description: realm.options.description,\n roles: realm.options.roles,\n type: \"secret\" in realm.options ? \"internal\" : \"external\",\n settings: {\n accessTokenExpiration: realm.options.settings?.accessToken?.expiration,\n refreshTokenExpiration:\n realm.options.settings?.refreshToken?.expiration,\n hasOnCreateSession: !!realm.options.settings?.onCreateSession,\n hasOnRefreshSession: !!realm.options.settings?.onRefreshSession,\n hasOnDeleteSession: !!realm.options.settings?.onDeleteSession,\n },\n }));\n }\n\n public getCaches(): DevCacheMetadata[] {\n const cachePrimitives = this.alepha.primitives($cache);\n\n return cachePrimitives.map((cache) => ({\n name: cache.container,\n ttl: cache.options.ttl,\n disabled: cache.options.disabled,\n provider: this.getProviderName(cache.options.provider),\n }));\n }\n\n public getPages(): DevPageMetadata[] {\n const pagePrimitives = this.alepha.primitives($page);\n\n return pagePrimitives.map((page: any) => {\n // Resolve children (can be an array or a function returning an array)\n const children =\n typeof page.options.children === \"function\"\n ? page.options.children()\n : page.options.children;\n const childrenNames = Array.isArray(children)\n ? children.map((c: any) => c.name).filter(Boolean)\n : undefined;\n\n return {\n name: page.name,\n label: page.options.label,\n description: page.options.description,\n path: page.options.path,\n parentName: page.options.parent?.name,\n params: page.options.schema?.params,\n query: page.options.schema?.query,\n hasComponent: !!page.options.component,\n hasLazy: !!page.options.lazy,\n hasResolve: !!page.options.resolve,\n childrenNames: childrenNames?.length ? childrenNames : undefined,\n hasChildren: !!page.options.children,\n hasParent: !!page.options.parent,\n hasErrorHandler: !!page.options.errorHandler,\n static:\n typeof page.options.static === \"boolean\"\n ? page.options.static\n : !!page.options.static,\n cache: page.options.cache,\n client: page.options.client,\n animation: page.options.animation,\n };\n });\n }\n\n public getProviders(): DevProviderMetadata[] {\n const graph = this.alepha.graph();\n\n return Object.entries(graph).map(([name, info]) => ({\n name,\n module: info.module ?? name,\n dependencies: info.from,\n aliases: info.as,\n }));\n }\n\n public getModules(): DevModuleMetadata[] {\n const graph = this.alepha.graph();\n const moduleMap = new Map<string, Set<string>>();\n\n // Group providers by module\n for (const [providerName, info] of Object.entries(graph)) {\n if (info.module) {\n if (!moduleMap.has(info.module)) {\n moduleMap.set(info.module, new Set());\n }\n moduleMap.get(info.module)!.add(providerName);\n }\n }\n\n return Array.from(moduleMap.entries()).map(([name, providers]) => ({\n name,\n providers: Array.from(providers),\n }));\n }\n\n public getEntities(): DevEntityMetadata[] {\n try {\n const repositoryProvider = this.alepha.inject(RepositoryProvider);\n const repositories = repositoryProvider.getRepositories();\n\n return repositories.map((repo) => {\n const entity = repo.entity;\n const schema = entity.schema as TObject;\n const options = entity.options;\n\n // Extract columns from schema\n const columns: DevEntityColumn[] = Object.entries(\n schema.properties,\n ).map(([name, field]) => {\n const fieldSchema = field as TSchema & Record<symbol, any>;\n const refData = fieldSchema[PG_REF];\n\n return {\n name,\n type: this.getColumnType(fieldSchema),\n nullable: this.isNullable(fieldSchema),\n primaryKey: PG_PRIMARY_KEY in fieldSchema,\n identity: PG_IDENTITY in fieldSchema || PG_SERIAL in fieldSchema,\n createdAt: PG_CREATED_AT in fieldSchema,\n updatedAt: PG_UPDATED_AT in fieldSchema,\n deletedAt: PG_DELETED_AT in fieldSchema,\n version: PG_VERSION in fieldSchema,\n hasDefault: PG_DEFAULT in fieldSchema,\n ref: refData\n ? {\n entity: refData.ref?.()?.entity?.name ?? \"unknown\",\n column: refData.ref?.()?.name ?? \"unknown\",\n onUpdate: refData.actions?.onUpdate,\n onDelete: refData.actions?.onDelete,\n }\n : undefined,\n };\n });\n\n // Extract indexes\n const indexes: DevEntityIndex[] = (options.indexes ?? []).map(\n (idx: any) => {\n if (typeof idx === \"string\") {\n return { columns: [idx], unique: false };\n }\n return {\n name: idx.name,\n columns: idx.column ? [idx.column] : (idx.columns ?? []),\n unique: idx.unique ?? false,\n };\n },\n );\n\n // Extract foreign keys\n const foreignKeys: DevEntityForeignKey[] = (\n options.foreignKeys ?? []\n ).map((fk: any) => ({\n name: fk.name,\n columns: fk.columns.map(String),\n foreignEntity: fk.foreignColumns?.[0]?.()?.entity?.name ?? \"unknown\",\n foreignColumns: fk.foreignColumns?.map(\n (fc: any) => fc?.()?.name ?? \"unknown\",\n ),\n }));\n\n // Extract constraints\n const constraints: DevEntityConstraint[] = (\n options.constraints ?? []\n ).map((c: any) => ({\n name: c.name,\n columns: c.columns.map(String),\n unique: !!c.unique,\n hasCheck: !!c.check,\n }));\n\n return {\n name: entity.name,\n provider: repo.provider.constructor.name,\n columns,\n indexes,\n foreignKeys,\n constraints,\n schema: entity.schema,\n insertSchema: entity.insertSchema,\n updateSchema: entity.updateSchema,\n };\n });\n } catch {\n // RepositoryProvider not available (ORM not used)\n return [];\n }\n }\n\n protected getColumnType(field: TSchema): string {\n // Handle optional/nullable wrappers (unions with null)\n if (t.schema.isUnion(field) && (field as any).anyOf) {\n const types = (field as any).anyOf as TSchema[];\n const nonNull = types.find((type) => !t.schema.isNull(type));\n if (nonNull) {\n return this.getColumnType(nonNull);\n }\n }\n\n const f = field as any;\n\n // Check for enum (t.enum wraps in Unsafe with type=string and enum array)\n if (\n t.schema.isUnsafe(field) &&\n f.type === \"string\" &&\n Array.isArray(f.enum)\n ) {\n return \"enum\";\n }\n\n // Use TypeBox's type guards\n if (t.schema.isString(field)) {\n if (f.enum) return \"enum\";\n if (f.format === \"uuid\") return \"uuid\";\n if (f.format === \"date-time\") return \"datetime\";\n if (f.format === \"date\") return \"date\";\n if (f.format === \"bigint\") return \"bigint\";\n return \"text\";\n }\n if (t.schema.isInteger(field)) return \"integer\";\n if (t.schema.isNumber(field)) return \"number\";\n if (t.schema.isBoolean(field)) return \"boolean\";\n if (t.schema.isArray(field)) return \"array\";\n if (t.schema.isObject(field)) return \"json\";\n if (t.schema.isLiteral(field)) return \"literal\";\n\n return \"unknown\";\n }\n\n protected isNullable(field: TSchema): boolean {\n if (t.schema.isUnion(field) && (field as any).anyOf) {\n const types = (field as any).anyOf as TSchema[];\n return types.some((type) => t.schema.isNull(type));\n }\n return false;\n }\n\n public getRoutes(): DevRouteMetadata[] {\n // Routes are the base primitive - actions and pages are routes\n // Showing them separately would be redundant with actions\n return [];\n }\n\n public getEnvs(): DevEnvMetadata[] {\n const envSchemas = this.alepha.getEnvSchemas();\n\n return envSchemas.map((item, index) => ({\n propertyKey: `env_${index}`,\n schema: item.schema,\n values: item.values,\n serviceName: undefined,\n }));\n }\n\n public getAtoms(): DevAtomMetadata[] {\n const atomsWithValues = this.alepha.store.getAtoms(false);\n\n return atomsWithValues.map(({ atom, value }) => ({\n name: atom.key,\n description: atom.options.description,\n schema: atom.schema,\n defaultValue: atom.options.default,\n currentValue: value,\n }));\n }\n\n public getSystem(): DevSystem {\n const isBun = typeof globalThis.Bun !== \"undefined\";\n const port = Number(this.alepha.env.SERVER_PORT) || 3000;\n return {\n alephaVersion: String(this.alepha.env.npm_package_version ?? \"unknown\"),\n nodeVersion: isBun\n ? (globalThis.Bun?.version ?? \"unknown\")\n : process.version,\n runtime: isBun ? \"bun\" : \"node\",\n mode: this.alepha.isProduction() ? \"production\" : \"development\",\n port,\n uptime: (Date.now() - this.startedAt) / 1000,\n memoryUsage: process.memoryUsage?.()?.rss ?? 0,\n };\n }\n\n public getMetadata(): DevMetadata {\n return {\n system: this.getSystem(),\n actions: this.getActions(),\n queues: this.getQueues(),\n schedulers: this.getSchedulers(),\n topics: this.getTopics(),\n buckets: this.getBuckets(),\n realms: this.getRealms(),\n caches: this.getCaches(),\n pages: this.getPages(),\n providers: this.getProviders(),\n modules: this.getModules(),\n entities: this.getEntities(),\n routes: this.getRoutes(),\n envs: this.getEnvs(),\n atoms: this.getAtoms(),\n };\n }\n\n // -------------------------------------------------------------------------------------------------------------------\n\n protected getProviderName(provider?: \"memory\" | any): string {\n if (!provider) {\n return \"default\";\n }\n if (provider === \"memory\") {\n return \"memory\";\n }\n return provider.name || \"custom\";\n }\n}\n","import { join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nexport const devtoolsAssets = {\n ui: join(fileURLToPath(import.meta.url), \"../../../assets/devtools-ui\"),\n};\n","import { type Static, t } from \"alepha\";\n\nexport const devActionMetadataSchema = t.object({\n name: t.text(),\n group: t.text(),\n method: t.text(),\n path: t.text(),\n prefix: t.text(),\n fullPath: t.text(),\n description: t.optional(t.text()),\n summary: t.optional(t.text()),\n disabled: t.optional(t.boolean()),\n secure: t.optional(t.boolean()),\n hide: t.optional(t.boolean()),\n body: t.optional(t.any()),\n params: t.optional(t.any()),\n query: t.optional(t.any()),\n response: t.optional(t.any()),\n bodyContentType: t.optional(t.text()),\n middlewares: t.optional(\n t.array(\n t.object({\n name: t.text(),\n options: t.optional(t.any()),\n }),\n ),\n ),\n});\n\nexport type DevActionMetadata = Static<typeof devActionMetadataSchema>;\n","import { type Static, t } from \"alepha\";\n\nexport const devAtomMetadataSchema = t.object({\n /**\n * The unique name/key of the atom\n */\n name: t.text(),\n /**\n * Optional description of the atom\n */\n description: t.optional(t.text()),\n /**\n * The schema for the atom value (TypeBox/JSON Schema)\n */\n schema: t.any(),\n /**\n * The default value defined for the atom\n */\n defaultValue: t.optional(t.any()),\n /**\n * The current value of the atom\n */\n currentValue: t.optional(t.any()),\n});\n\nexport type DevAtomMetadata = Static<typeof devAtomMetadataSchema>;\n","import { type Static, t } from \"alepha\";\n\nexport const devBucketMetadataSchema = t.object({\n name: t.text(),\n description: t.optional(t.text()),\n mimeTypes: t.optional(t.array(t.text())),\n maxSize: t.optional(t.number()),\n provider: t.text(),\n});\n\nexport type DevBucketMetadata = Static<typeof devBucketMetadataSchema>;\n","import { type Static, t } from \"alepha\";\n\nexport const devCacheMetadataSchema = t.object({\n name: t.text(),\n ttl: t.optional(t.any()),\n disabled: t.optional(t.boolean()),\n provider: t.text(),\n});\n\nexport type DevCacheMetadata = Static<typeof devCacheMetadataSchema>;\n","import { type Static, t } from \"alepha\";\n\nexport const devEntityColumnSchema = t.object({\n name: t.text(),\n type: t.text(),\n nullable: t.boolean(),\n primaryKey: t.boolean(),\n identity: t.boolean(),\n createdAt: t.boolean(),\n updatedAt: t.boolean(),\n deletedAt: t.boolean(),\n version: t.boolean(),\n hasDefault: t.boolean(),\n ref: t.optional(\n t.object({\n entity: t.text(),\n column: t.text(),\n onUpdate: t.optional(t.text()),\n onDelete: t.optional(t.text()),\n }),\n ),\n});\n\nexport const devEntityIndexSchema = t.object({\n name: t.optional(t.text()),\n columns: t.array(t.text()),\n unique: t.boolean(),\n});\n\nexport const devEntityForeignKeySchema = t.object({\n name: t.optional(t.text()),\n columns: t.array(t.text()),\n foreignEntity: t.text(),\n foreignColumns: t.array(t.text()),\n});\n\nexport const devEntityConstraintSchema = t.object({\n name: t.optional(t.text()),\n columns: t.array(t.text()),\n unique: t.boolean(),\n hasCheck: t.boolean(),\n});\n\nexport const devEntityMetadataSchema = t.object({\n name: t.text(),\n provider: t.text(),\n columns: t.array(devEntityColumnSchema),\n indexes: t.array(devEntityIndexSchema),\n foreignKeys: t.array(devEntityForeignKeySchema),\n constraints: t.array(devEntityConstraintSchema),\n schema: t.optional(t.any()),\n insertSchema: t.optional(t.any()),\n updateSchema: t.optional(t.any()),\n});\n\nexport type DevEntityColumn = Static<typeof devEntityColumnSchema>;\nexport type DevEntityIndex = Static<typeof devEntityIndexSchema>;\nexport type DevEntityForeignKey = Static<typeof devEntityForeignKeySchema>;\nexport type DevEntityConstraint = Static<typeof devEntityConstraintSchema>;\nexport type DevEntityMetadata = Static<typeof devEntityMetadataSchema>;\n","import { type Static, t } from \"alepha\";\n\nexport const devEnvMetadataSchema = t.object({\n /**\n * The property name in the service where $env is defined\n */\n propertyKey: t.text(),\n /**\n * The schema for the environment variables (TypeBox/JSON Schema)\n */\n schema: t.any(),\n /**\n * The parsed values from the environment\n */\n values: t.record(t.text(), t.any()),\n /**\n * The service class name where this $env is defined\n */\n serviceName: t.optional(t.text()),\n});\n\nexport type DevEnvMetadata = Static<typeof devEnvMetadataSchema>;\n","import { type Static, t } from \"alepha\";\n\nexport const devModuleMetadataSchema = t.object({\n name: t.text(),\n providers: t.array(t.text()),\n});\n\nexport type DevModuleMetadata = Static<typeof devModuleMetadataSchema>;\n","import { type Static, t } from \"alepha\";\n\nexport const devPageMetadataSchema = t.object({\n name: t.text(),\n label: t.optional(t.text()),\n description: t.optional(t.text()),\n path: t.optional(t.text()),\n parentName: t.optional(t.text()),\n params: t.optional(t.any()),\n query: t.optional(t.any()),\n hasComponent: t.boolean(),\n hasLazy: t.boolean(),\n hasResolve: t.boolean(),\n childrenNames: t.optional(t.array(t.text())),\n hasChildren: t.boolean(),\n hasParent: t.boolean(),\n hasErrorHandler: t.boolean(),\n static: t.optional(t.boolean()),\n cache: t.optional(t.any()),\n client: t.optional(t.any()),\n animation: t.optional(t.any()),\n});\n\nexport type DevPageMetadata = Static<typeof devPageMetadataSchema>;\n","import { type Static, t } from \"alepha\";\n\nexport const devProviderMetadataSchema = t.object({\n name: t.text(),\n module: t.optional(t.text()),\n dependencies: t.array(t.text()),\n aliases: t.optional(t.array(t.text())),\n});\n\nexport type DevProviderMetadata = Static<typeof devProviderMetadataSchema>;\n","import { type Static, t } from \"alepha\";\n\nexport const devQueueMetadataSchema = t.object({\n name: t.text(),\n description: t.optional(t.text()),\n schema: t.optional(t.any()),\n provider: t.text(),\n});\n\nexport type DevQueueMetadata = Static<typeof devQueueMetadataSchema>;\n","import { type Static, t } from \"alepha\";\n\nexport const devRealmMetadataSchema = t.object({\n name: t.text(),\n description: t.optional(t.text()),\n roles: t.optional(t.array(t.any())),\n type: t.enum([\"internal\", \"external\"]),\n settings: t.optional(\n t.object({\n accessTokenExpiration: t.optional(t.any()),\n refreshTokenExpiration: t.optional(t.any()),\n hasOnCreateSession: t.boolean(),\n hasOnRefreshSession: t.boolean(),\n hasOnDeleteSession: t.boolean(),\n }),\n ),\n});\n\nexport type DevRealmMetadata = Static<typeof devRealmMetadataSchema>;\n","import { type Static, t } from \"alepha\";\n\nexport const devRouteMetadataSchema = t.object({\n method: t.text(),\n path: t.text(),\n});\n\nexport type DevRouteMetadata = Static<typeof devRouteMetadataSchema>;\n","import { type Static, t } from \"alepha\";\n\nexport const devSchedulerMetadataSchema = t.object({\n name: t.text(),\n description: t.optional(t.text()),\n cron: t.optional(t.text()),\n interval: t.optional(t.any()),\n lock: t.optional(t.boolean()),\n});\n\nexport type DevSchedulerMetadata = Static<typeof devSchedulerMetadataSchema>;\n","import { type Static, t } from \"alepha\";\n\nexport const devTopicMetadataSchema = t.object({\n name: t.text(),\n description: t.optional(t.text()),\n schema: t.optional(t.any()),\n provider: t.text(),\n subscribers: t.integer(),\n});\n\nexport type DevTopicMetadata = Static<typeof devTopicMetadataSchema>;\n","import { type Static, t } from \"alepha\";\nimport { devActionMetadataSchema } from \"./DevActionMetadata.ts\";\nimport { devAtomMetadataSchema } from \"./DevAtomMetadata.ts\";\nimport { devBucketMetadataSchema } from \"./DevBucketMetadata.ts\";\nimport { devCacheMetadataSchema } from \"./DevCacheMetadata.ts\";\nimport { devEntityMetadataSchema } from \"./DevEntityMetadata.ts\";\nimport { devEnvMetadataSchema } from \"./DevEnvMetadata.ts\";\nimport { devModuleMetadataSchema } from \"./DevModuleMetadata.ts\";\nimport { devPageMetadataSchema } from \"./DevPageMetadata.ts\";\nimport { devProviderMetadataSchema } from \"./DevProviderMetadata.ts\";\nimport { devQueueMetadataSchema } from \"./DevQueueMetadata.ts\";\nimport { devRealmMetadataSchema } from \"./DevRealmMetadata.ts\";\nimport { devRouteMetadataSchema } from \"./DevRouteMetadata.ts\";\nimport { devSchedulerMetadataSchema } from \"./DevSchedulerMetadata.ts\";\nimport { devTopicMetadataSchema } from \"./DevTopicMetadata.ts\";\n\nexport const devSystemSchema = t.object({\n alephaVersion: t.text(),\n nodeVersion: t.text(),\n runtime: t.enum([\"node\", \"bun\"]),\n mode: t.enum([\"development\", \"production\"]),\n port: t.integer(),\n uptime: t.number(),\n memoryUsage: t.number(),\n});\n\nexport type DevSystem = Static<typeof devSystemSchema>;\n\nexport const devMetadataSchema = t.object({\n system: devSystemSchema,\n actions: t.array(devActionMetadataSchema),\n queues: t.array(devQueueMetadataSchema),\n schedulers: t.array(devSchedulerMetadataSchema),\n topics: t.array(devTopicMetadataSchema),\n buckets: t.array(devBucketMetadataSchema),\n realms: t.array(devRealmMetadataSchema),\n caches: t.array(devCacheMetadataSchema),\n pages: t.array(devPageMetadataSchema),\n providers: t.array(devProviderMetadataSchema),\n modules: t.array(devModuleMetadataSchema),\n entities: t.array(devEntityMetadataSchema),\n routes: t.array(devRouteMetadataSchema),\n envs: t.array(devEnvMetadataSchema),\n atoms: t.array(devAtomMetadataSchema),\n});\n\nexport type DevMetadata = Static<typeof devMetadataSchema>;\n","import { $hook, $inject, Alepha, t } from \"alepha\";\nimport { $logger, MemoryDestinationProvider } from \"alepha/logger\";\nimport { RepositoryProvider } from \"alepha/orm\";\nimport { $route, ServerProvider } from \"alepha/server\";\nimport { $serve } from \"alepha/server/static\";\nimport { devtoolsAssets } from \"../assets.ts\";\nimport { devMetadataSchema } from \"../schemas/DevMetadata.ts\";\nimport { DevToolsMetadataProvider } from \"./DevToolsMetadataProvider.ts\";\n\nexport class DevToolsProvider {\n protected readonly log = $logger();\n protected readonly alepha = $inject(Alepha);\n protected readonly serverProvider = $inject(ServerProvider);\n protected readonly devCollectorProvider = $inject(DevToolsMetadataProvider);\n protected readonly memoryDestination = $inject(MemoryDestinationProvider);\n\n protected readonly onStart = $hook({\n on: \"start\",\n handler: () => {\n this.log.info(\"Devtools OK\", {\n url: `${this.serverProvider.hostname}/__devtools/`,\n });\n },\n });\n\n /**\n * Capture all logs into memory so the devtools UI can display them.\n * In dev mode, LogDestinationProvider is bound to ConsoleDestinationProvider,\n * so MemoryDestinationProvider would otherwise never receive writes.\n */\n protected readonly onLog = $hook({\n on: \"log\",\n handler: ({ message, entry }) => {\n if (message) {\n this.memoryDestination.write(message, entry);\n }\n },\n });\n\n protected readonly uiRoute = $serve({\n path: \"/__devtools\",\n root: devtoolsAssets.ui,\n historyApiFallback: true,\n silent: true,\n });\n\n protected readonly metadataRoute = $route({\n method: \"GET\",\n path: \"/__devtools/api/metadata\",\n silent: true,\n schema: {\n response: devMetadataSchema,\n },\n handler: () => {\n return this.devCollectorProvider.getMetadata();\n },\n });\n\n protected readonly updateAtomRoute = $route({\n method: \"POST\",\n path: \"/__devtools/api/atoms\",\n silent: true,\n schema: {\n body: t.object({\n name: t.text(),\n value: t.any(),\n }),\n response: t.object({\n success: t.boolean(),\n }),\n },\n handler: ({ body }) => {\n const atoms = this.alepha.store.getAtoms(false);\n const atomEntry = atoms.find((a) => a.atom.key === body.name);\n\n if (atomEntry) {\n this.alepha.store.set(atomEntry.atom, body.value);\n return { success: true };\n }\n\n return { success: false };\n },\n });\n\n // -------------------------------------------------------------------------------------------------------------------\n // Logs endpoint\n // -------------------------------------------------------------------------------------------------------------------\n\n protected readonly logsRoute = $route({\n method: \"GET\",\n path: \"/__devtools/api/logs\",\n silent: true,\n schema: {\n query: t.object({\n level: t.optional(t.text()),\n type: t.optional(t.text()),\n module: t.optional(t.text()),\n search: t.optional(t.text()),\n since: t.optional(t.text()),\n limit: t.optional(t.text()),\n offset: t.optional(t.text()),\n }),\n response: t.object({\n logs: t.array(t.any()),\n total: t.integer(),\n }),\n },\n handler: ({ query }) => {\n let memoryProvider: MemoryDestinationProvider;\n try {\n memoryProvider = this.alepha.inject(MemoryDestinationProvider);\n } catch {\n return { logs: [], total: 0 };\n }\n\n const levelOrder = [\"TRACE\", \"DEBUG\", \"INFO\", \"WARN\", \"ERROR\"];\n let entries = memoryProvider.logs;\n\n if (query.level) {\n const minIndex = levelOrder.indexOf(query.level.toUpperCase());\n if (minIndex >= 0) {\n entries = entries.filter(\n (e) => levelOrder.indexOf(e.level) >= minIndex,\n );\n }\n }\n\n if (query.type) {\n const types = query.type.split(\",\").map((t) => t.trim());\n entries = entries.filter((e) => {\n if (!e.data || typeof e.data !== \"object\") return false;\n const d = e.data as Record<string, unknown>;\n for (const t of types) {\n if (t === \"http\" || t === \"http:request\") {\n if (d.status && d.method && d.path && d.duration) return true;\n } else if (t === \"db\" || t === \"db:query\") {\n if (d.type === \"db:query\") return true;\n } else if (d.type === t) {\n return true;\n }\n }\n return false;\n });\n }\n\n if (query.module) {\n entries = entries.filter((e) => e.module === query.module);\n }\n\n if (query.search) {\n const terms = query.search.toLowerCase().split(/\\s+/);\n entries = entries.filter((e) => {\n const text = `${e.message} ${e.module} ${e.service}`.toLowerCase();\n return terms.every((term) => text.includes(term));\n });\n }\n\n if (query.since) {\n const since = Number(query.since);\n if (!Number.isNaN(since)) {\n entries = entries.filter((e) => e.timestamp >= since);\n }\n }\n\n const total = entries.length;\n\n // Reverse so newest first\n entries = entries.reverse();\n\n const offset = query.offset ? Number(query.offset) : 0;\n const limit = query.limit ? Number(query.limit) : 100;\n entries = entries.slice(offset, offset + limit);\n\n return { logs: entries, total };\n },\n });\n\n // -------------------------------------------------------------------------------------------------------------------\n // DB CRUD endpoints\n // -------------------------------------------------------------------------------------------------------------------\n\n protected readonly dbListRoute = $route({\n method: \"GET\",\n path: \"/__devtools/api/db/:entity/records\",\n silent: true,\n schema: {\n params: t.object({ entity: t.text() }),\n query: t.object({\n page: t.optional(t.text()),\n size: t.optional(t.text()),\n sort: t.optional(t.text()),\n }),\n response: t.record(t.text(), t.any()),\n },\n handler: async ({ params, query }) => {\n const repo = this.getRepository(params.entity);\n if (!repo) {\n return { content: [], page: { totalElements: 0 } };\n }\n\n return repo.paginate(\n {\n page: query.page ? Number(query.page) : 0,\n size: query.size ? Number(query.size) : 50,\n sort: query.sort || undefined,\n },\n {},\n { count: true },\n ) as any;\n },\n });\n\n protected readonly dbCreateRoute = $route({\n method: \"POST\",\n path: \"/__devtools/api/db/:entity/records\",\n silent: true,\n schema: {\n params: t.object({ entity: t.text() }),\n body: t.record(t.text(), t.any()),\n response: t.record(t.text(), t.any()),\n },\n handler: async ({ params, body }) => {\n const repo = this.getRepository(params.entity);\n if (!repo) {\n return { error: \"Entity not found\" };\n }\n return repo.create(body) as any;\n },\n });\n\n protected readonly dbUpdateRoute = $route({\n method: \"PUT\",\n path: \"/__devtools/api/db/:entity/records/:id\",\n silent: true,\n schema: {\n params: t.object({ entity: t.text(), id: t.text() }),\n body: t.record(t.text(), t.any()),\n response: t.record(t.text(), t.any()),\n },\n handler: async ({ params, body }) => {\n const repo = this.getRepository(params.entity);\n if (!repo) {\n return { error: \"Entity not found\" };\n }\n\n const idValue = this.parseId(repo, params.id);\n return repo.updateById(idValue, body) as any;\n },\n });\n\n protected readonly dbDeleteRoute = $route({\n method: \"DELETE\",\n path: \"/__devtools/api/db/:entity/records/:id\",\n silent: true,\n schema: {\n params: t.object({ entity: t.text(), id: t.text() }),\n response: t.record(t.text(), t.any()),\n },\n handler: async ({ params }) => {\n const repo = this.getRepository(params.entity);\n if (!repo) {\n return { error: \"Entity not found\" };\n }\n\n const idValue = this.parseId(repo, params.id);\n return repo.deleteById(idValue) as any;\n },\n });\n\n // -------------------------------------------------------------------------------------------------------------------\n\n protected getRepository(entityName: string) {\n try {\n const repositoryProvider = this.alepha.inject(RepositoryProvider);\n const repos = repositoryProvider.getRepositories();\n return repos.find((r) => r.entity.name === entityName);\n } catch {\n return undefined;\n }\n }\n\n protected parseId(repo: any, rawId: string): string | number {\n const idType = repo.id.type;\n if (idType?.type === \"integer\" || idType?.type === \"number\") {\n return Number(rawId);\n }\n return rawId;\n }\n}\n","import { $module } from \"alepha\";\nimport { AlephaServer } from \"alepha/server\";\nimport { AlephaServerStatic } from \"alepha/server/static\";\nimport { DevToolsMetadataProvider } from \"./providers/DevToolsMetadataProvider.ts\";\nimport { DevToolsProvider } from \"./providers/DevToolsProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./index.shared.ts\";\nexport * from \"./providers/DevToolsMetadataProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Runtime inspection and debugging UI.\n *\n * **Features:**\n * - DevTools UI at `GET /devtools`\n * - Application metadata at `GET /devtools/metadata`\n * - Last 10,000 logs at `GET /devtools/logs`\n * - Runtime inspection of actions, queues, schedulers, topics, buckets\n * - Log viewer with filtering\n * - React Flow visualization\n * - Provider and module browsing\n *\n * @module alepha.devtools\n */\nexport const AlephaDevtools = $module({\n name: \"alepha.devtools\",\n primitives: [],\n services: [DevToolsMetadataProvider, DevToolsProvider],\n register: (alepha) => {\n alepha.with(AlephaServer);\n alepha.with(AlephaServerStatic);\n alepha.with(DevToolsProvider);\n alepha.with(DevToolsMetadataProvider);\n alepha.store.push(\"alepha.build.assets\", \"alepha\");\n },\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/devtools/providers/DevToolsMetadataProvider.ts","../../src/devtools/assets.ts","../../src/devtools/schemas/DevActionMetadata.ts","../../src/devtools/schemas/DevAtomMetadata.ts","../../src/devtools/schemas/DevBucketMetadata.ts","../../src/devtools/schemas/DevCacheMetadata.ts","../../src/devtools/schemas/DevEntityMetadata.ts","../../src/devtools/schemas/DevEnvMetadata.ts","../../src/devtools/schemas/DevModuleMetadata.ts","../../src/devtools/schemas/DevPageMetadata.ts","../../src/devtools/schemas/DevProviderMetadata.ts","../../src/devtools/schemas/DevQueueMetadata.ts","../../src/devtools/schemas/DevRealmMetadata.ts","../../src/devtools/schemas/DevRouteMetadata.ts","../../src/devtools/schemas/DevSchedulerMetadata.ts","../../src/devtools/schemas/DevTopicMetadata.ts","../../src/devtools/schemas/DevMetadata.ts","../../src/devtools/providers/DevToolsProvider.ts","../../src/devtools/index.ts"],"sourcesContent":["import { $inject, Alepha, type TObject, type TSchema, t } from \"alepha\";\nimport { $bucket } from \"alepha/bucket\";\nimport { $cache } from \"alepha/cache\";\nimport { $logger } from \"alepha/logger\";\nimport {\n PG_CREATED_AT,\n PG_DEFAULT,\n PG_DELETED_AT,\n PG_IDENTITY,\n PG_PRIMARY_KEY,\n PG_REF,\n PG_SERIAL,\n PG_UPDATED_AT,\n PG_VERSION,\n RepositoryProvider,\n} from \"alepha/orm\";\nimport { $queue } from \"alepha/queue\";\nimport { $page } from \"alepha/react/router\";\nimport { $scheduler } from \"alepha/scheduler\";\nimport { $issuer } from \"alepha/security\";\nimport { $action, ServerProvider } from \"alepha/server\";\nimport { $topic } from \"alepha/topic\";\nimport type { DevActionMetadata } from \"../schemas/DevActionMetadata.ts\";\nimport type { DevAtomMetadata } from \"../schemas/DevAtomMetadata.ts\";\nimport type { DevBucketMetadata } from \"../schemas/DevBucketMetadata.ts\";\nimport type { DevCacheMetadata } from \"../schemas/DevCacheMetadata.ts\";\nimport type {\n DevEntityColumn,\n DevEntityConstraint,\n DevEntityForeignKey,\n DevEntityIndex,\n DevEntityMetadata,\n} from \"../schemas/DevEntityMetadata.ts\";\nimport type { DevEnvMetadata } from \"../schemas/DevEnvMetadata.ts\";\nimport type { DevMetadata, DevSystem } from \"../schemas/DevMetadata.ts\";\nimport type { DevModuleMetadata } from \"../schemas/DevModuleMetadata.ts\";\nimport type { DevPageMetadata } from \"../schemas/DevPageMetadata.ts\";\nimport type { DevProviderMetadata } from \"../schemas/DevProviderMetadata.ts\";\nimport type { DevQueueMetadata } from \"../schemas/DevQueueMetadata.ts\";\nimport type { DevRealmMetadata } from \"../schemas/DevRealmMetadata.ts\";\nimport type { DevRouteMetadata } from \"../schemas/DevRouteMetadata.ts\";\nimport type { DevSchedulerMetadata } from \"../schemas/DevSchedulerMetadata.ts\";\nimport type { DevTopicMetadata } from \"../schemas/DevTopicMetadata.ts\";\n\nexport class DevToolsMetadataProvider {\n protected readonly alepha = $inject(Alepha);\n protected readonly log = $logger();\n protected readonly serverProvider = $inject(ServerProvider);\n protected readonly startedAt = Date.now();\n\n public getActions(): DevActionMetadata[] {\n const actionPrimitives = this.alepha.primitives($action);\n\n return actionPrimitives.map((action) => {\n const schema = action.schema;\n const options = action.options as any; // Allow accessing augmented properties\n\n return {\n name: action.name,\n group: action.group,\n method: action.method,\n path: action.path,\n prefix: action.prefix,\n fullPath: action.route.path,\n description: action.options.description,\n summary: options.summary,\n disabled: action.options.disabled,\n secure:\n action.middlewares.some((m) => m?.name === \"$secure\") || undefined,\n hide: options.hide,\n body: schema?.body,\n params: schema?.params,\n query: schema?.query,\n response: schema?.response,\n bodyContentType: action.getBodyContentType(),\n middlewares: action.middlewares.filter(Boolean).length\n ? action.middlewares.filter(Boolean)\n : undefined,\n };\n });\n }\n\n public getQueues(): DevQueueMetadata[] {\n const queuePrimitives = this.alepha.primitives($queue);\n\n return queuePrimitives.map((queue) => ({\n name: queue.name,\n description: queue.options.description,\n schema: queue.options.schema,\n provider: this.getProviderName(queue.options.provider),\n }));\n }\n\n public getSchedulers(): DevSchedulerMetadata[] {\n const schedulerPrimitives = this.alepha.primitives($scheduler);\n\n return schedulerPrimitives.map((scheduler) => ({\n name: scheduler.name,\n description: scheduler.options.description,\n cron: scheduler.options.cron,\n interval: scheduler.options.interval,\n lock: scheduler.options.lock,\n }));\n }\n\n public getTopics(): DevTopicMetadata[] {\n const topicPrimitives = this.alepha.primitives($topic);\n\n // Deduplicate by name, count subscribers\n const topicMap = new Map<string, DevTopicMetadata>();\n for (const topic of topicPrimitives) {\n const existing = topicMap.get(topic.name);\n if (existing) {\n existing.subscribers++;\n } else {\n topicMap.set(topic.name, {\n name: topic.name,\n description: topic.options.description,\n schema: topic.options.schema,\n provider: this.getProviderName(topic.options.provider),\n subscribers: 1,\n });\n }\n }\n return Array.from(topicMap.values());\n }\n\n public getBuckets(): DevBucketMetadata[] {\n const bucketPrimitives = this.alepha.primitives($bucket);\n\n return bucketPrimitives.map((bucket) => ({\n name: bucket.name,\n description: bucket.options.description,\n mimeTypes: bucket.options.mimeTypes,\n maxSize: bucket.options.maxSize,\n provider: this.getProviderName(bucket.options.provider),\n }));\n }\n\n public getRealms(): DevRealmMetadata[] {\n const realmPrimitives = this.alepha.primitives($issuer);\n\n return realmPrimitives.map((realm) => ({\n name: realm.name,\n description: realm.options.description,\n roles: realm.options.roles,\n type: \"secret\" in realm.options ? \"internal\" : \"external\",\n settings: {\n accessTokenExpiration: realm.options.settings?.accessToken?.expiration,\n refreshTokenExpiration:\n realm.options.settings?.refreshToken?.expiration,\n hasOnCreateSession: !!realm.options.settings?.onCreateSession,\n hasOnRefreshSession: !!realm.options.settings?.onRefreshSession,\n hasOnDeleteSession: !!realm.options.settings?.onDeleteSession,\n },\n }));\n }\n\n public getCaches(): DevCacheMetadata[] {\n const cachePrimitives = this.alepha.primitives($cache);\n\n return cachePrimitives.map((cache) => ({\n name: cache.container,\n ttl: cache.options.ttl,\n disabled: cache.options.disabled,\n provider: this.getProviderName(cache.options.provider),\n }));\n }\n\n public getPages(): DevPageMetadata[] {\n const pagePrimitives = this.alepha.primitives($page);\n\n return pagePrimitives.map((page: any) => {\n // Resolve children (can be an array or a function returning an array)\n const children =\n typeof page.options.children === \"function\"\n ? page.options.children()\n : page.options.children;\n const childrenNames = Array.isArray(children)\n ? children.map((c: any) => c.name).filter(Boolean)\n : undefined;\n\n return {\n name: page.name,\n label: page.options.label,\n description: page.options.description,\n path: page.options.path,\n parentName: page.options.parent?.name,\n params: page.options.schema?.params,\n query: page.options.schema?.query,\n hasComponent: !!page.options.component,\n hasLazy: !!page.options.lazy,\n hasResolve: !!page.options.resolve,\n childrenNames: childrenNames?.length ? childrenNames : undefined,\n hasChildren: !!page.options.children,\n hasParent: !!page.options.parent,\n hasErrorHandler: !!page.options.errorHandler,\n static:\n typeof page.options.static === \"boolean\"\n ? page.options.static\n : !!page.options.static,\n cache: page.options.cache,\n client: page.options.client,\n animation: page.options.animation,\n };\n });\n }\n\n public getProviders(): DevProviderMetadata[] {\n const graph = this.alepha.graph();\n\n return Object.entries(graph).map(([name, info]) => ({\n name,\n module: info.module ?? name,\n dependencies: info.from,\n aliases: info.as,\n }));\n }\n\n public getModules(): DevModuleMetadata[] {\n const graph = this.alepha.graph();\n const moduleMap = new Map<string, Set<string>>();\n\n // Group providers by module\n for (const [providerName, info] of Object.entries(graph)) {\n if (info.module) {\n if (!moduleMap.has(info.module)) {\n moduleMap.set(info.module, new Set());\n }\n moduleMap.get(info.module)!.add(providerName);\n }\n }\n\n return Array.from(moduleMap.entries()).map(([name, providers]) => ({\n name,\n providers: Array.from(providers),\n }));\n }\n\n public getEntities(): DevEntityMetadata[] {\n try {\n const repositoryProvider = this.alepha.inject(RepositoryProvider);\n const repositories = repositoryProvider.getRepositories();\n\n return repositories.map((repo) => {\n const entity = repo.entity;\n const schema = entity.schema as TObject;\n const options = entity.options;\n\n // Extract columns from schema\n const columns: DevEntityColumn[] = Object.entries(\n schema.properties,\n ).map(([name, field]) => {\n const fieldSchema = field as TSchema & Record<symbol, any>;\n const refData = fieldSchema[PG_REF];\n\n return {\n name,\n type: this.getColumnType(fieldSchema),\n nullable: this.isNullable(fieldSchema),\n primaryKey: PG_PRIMARY_KEY in fieldSchema,\n identity: PG_IDENTITY in fieldSchema || PG_SERIAL in fieldSchema,\n createdAt: PG_CREATED_AT in fieldSchema,\n updatedAt: PG_UPDATED_AT in fieldSchema,\n deletedAt: PG_DELETED_AT in fieldSchema,\n version: PG_VERSION in fieldSchema,\n hasDefault: PG_DEFAULT in fieldSchema,\n ref: refData\n ? {\n entity: refData.ref?.()?.entity?.name ?? \"unknown\",\n column: refData.ref?.()?.name ?? \"unknown\",\n onUpdate: refData.actions?.onUpdate,\n onDelete: refData.actions?.onDelete,\n }\n : undefined,\n };\n });\n\n // Extract indexes\n const indexes: DevEntityIndex[] = (options.indexes ?? []).map(\n (idx: any) => {\n if (typeof idx === \"string\") {\n return { columns: [idx], unique: false };\n }\n return {\n name: idx.name,\n columns: idx.column ? [idx.column] : (idx.columns ?? []),\n unique: idx.unique ?? false,\n };\n },\n );\n\n // Extract foreign keys\n const foreignKeys: DevEntityForeignKey[] = (\n options.foreignKeys ?? []\n ).map((fk: any) => ({\n name: fk.name,\n columns: fk.columns.map(String),\n foreignEntity: fk.foreignColumns?.[0]?.()?.entity?.name ?? \"unknown\",\n foreignColumns: fk.foreignColumns?.map(\n (fc: any) => fc?.()?.name ?? \"unknown\",\n ),\n }));\n\n // Extract constraints\n const constraints: DevEntityConstraint[] = (\n options.constraints ?? []\n ).map((c: any) => ({\n name: c.name,\n columns: c.columns.map(String),\n unique: !!c.unique,\n hasCheck: !!c.check,\n }));\n\n return {\n name: entity.name,\n provider: repo.provider.constructor.name,\n columns,\n indexes,\n foreignKeys,\n constraints,\n schema: entity.schema,\n insertSchema: entity.insertSchema,\n updateSchema: entity.updateSchema,\n };\n });\n } catch {\n // RepositoryProvider not available (ORM not used)\n return [];\n }\n }\n\n protected getColumnType(field: TSchema): string {\n // Handle optional/nullable wrappers (unions with null)\n if (t.schema.isUnion(field) && (field as any).anyOf) {\n const types = (field as any).anyOf as TSchema[];\n const nonNull = types.find((type) => !t.schema.isNull(type));\n if (nonNull) {\n return this.getColumnType(nonNull);\n }\n }\n\n const f = field as any;\n\n // Check for enum (t.enum wraps in Unsafe with type=string and enum array)\n if (\n t.schema.isUnsafe(field) &&\n f.type === \"string\" &&\n Array.isArray(f.enum)\n ) {\n return \"enum\";\n }\n\n // Use TypeBox's type guards\n if (t.schema.isString(field)) {\n if (f.enum) return \"enum\";\n if (f.format === \"uuid\") return \"uuid\";\n if (f.format === \"date-time\") return \"datetime\";\n if (f.format === \"date\") return \"date\";\n if (f.format === \"bigint\") return \"bigint\";\n return \"text\";\n }\n if (t.schema.isInteger(field)) return \"integer\";\n if (t.schema.isNumber(field)) return \"number\";\n if (t.schema.isBoolean(field)) return \"boolean\";\n if (t.schema.isArray(field)) return \"array\";\n if (t.schema.isObject(field)) return \"json\";\n if (t.schema.isLiteral(field)) return \"literal\";\n\n return \"unknown\";\n }\n\n protected isNullable(field: TSchema): boolean {\n if (t.schema.isUnion(field) && (field as any).anyOf) {\n const types = (field as any).anyOf as TSchema[];\n return types.some((type) => t.schema.isNull(type));\n }\n return false;\n }\n\n public getRoutes(): DevRouteMetadata[] {\n // Routes are the base primitive - actions and pages are routes\n // Showing them separately would be redundant with actions\n return [];\n }\n\n public getEnvs(): DevEnvMetadata[] {\n const envSchemas = this.alepha.getEnvSchemas();\n\n return envSchemas.map((item, index) => ({\n propertyKey: `env_${index}`,\n schema: item.schema,\n values: item.values,\n serviceName: undefined,\n }));\n }\n\n public getAtoms(): DevAtomMetadata[] {\n const atomsWithValues = this.alepha.store.getAtoms(false);\n\n return atomsWithValues.map(({ atom, value }) => ({\n name: atom.key,\n description: atom.options.description,\n schema: atom.schema,\n defaultValue: atom.options.default,\n currentValue: value,\n }));\n }\n\n public getSystem(): DevSystem {\n const isBun = typeof globalThis.Bun !== \"undefined\";\n const port = Number(this.alepha.env.SERVER_PORT) || 3000;\n return {\n alephaVersion: String(this.alepha.env.npm_package_version ?? \"unknown\"),\n nodeVersion: isBun\n ? (globalThis.Bun?.version ?? \"unknown\")\n : process.version,\n runtime: isBun ? \"bun\" : \"node\",\n mode: this.alepha.isProduction() ? \"production\" : \"development\",\n port,\n uptime: (Date.now() - this.startedAt) / 1000,\n memoryUsage: process.memoryUsage?.()?.rss ?? 0,\n };\n }\n\n public getMetadata(): DevMetadata {\n return {\n system: this.getSystem(),\n actions: this.getActions(),\n queues: this.getQueues(),\n schedulers: this.getSchedulers(),\n topics: this.getTopics(),\n buckets: this.getBuckets(),\n realms: this.getRealms(),\n caches: this.getCaches(),\n pages: this.getPages(),\n providers: this.getProviders(),\n modules: this.getModules(),\n entities: this.getEntities(),\n routes: this.getRoutes(),\n envs: this.getEnvs(),\n atoms: this.getAtoms(),\n };\n }\n\n // -------------------------------------------------------------------------------------------------------------------\n\n protected getProviderName(provider?: \"memory\" | any): string {\n if (!provider) {\n return \"default\";\n }\n if (provider === \"memory\") {\n return \"memory\";\n }\n return provider.name || \"custom\";\n }\n}\n","import { join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nexport const devtoolsAssets = {\n ui: join(fileURLToPath(import.meta.url), \"../../../assets/devtools-ui\"),\n};\n","import { type Static, t } from \"alepha\";\n\nexport const devActionMetadataSchema = t.object({\n name: t.text(),\n group: t.text(),\n method: t.text(),\n path: t.text(),\n prefix: t.text(),\n fullPath: t.text(),\n description: t.optional(t.text()),\n summary: t.optional(t.text()),\n disabled: t.optional(t.boolean()),\n secure: t.optional(t.boolean()),\n hide: t.optional(t.boolean()),\n body: t.optional(t.any()),\n params: t.optional(t.any()),\n query: t.optional(t.any()),\n response: t.optional(t.any()),\n bodyContentType: t.optional(t.text()),\n middlewares: t.optional(\n t.array(\n t.object({\n name: t.text(),\n options: t.optional(t.any()),\n }),\n ),\n ),\n});\n\nexport type DevActionMetadata = Static<typeof devActionMetadataSchema>;\n","import { type Static, t } from \"alepha\";\n\nexport const devAtomMetadataSchema = t.object({\n /**\n * The unique name/key of the atom\n */\n name: t.text(),\n /**\n * Optional description of the atom\n */\n description: t.optional(t.text()),\n /**\n * The schema for the atom value (TypeBox/JSON Schema)\n */\n schema: t.any(),\n /**\n * The default value defined for the atom\n */\n defaultValue: t.optional(t.any()),\n /**\n * The current value of the atom\n */\n currentValue: t.optional(t.any()),\n});\n\nexport type DevAtomMetadata = Static<typeof devAtomMetadataSchema>;\n","import { type Static, t } from \"alepha\";\n\nexport const devBucketMetadataSchema = t.object({\n name: t.text(),\n description: t.optional(t.text()),\n mimeTypes: t.optional(t.array(t.text())),\n maxSize: t.optional(t.number()),\n provider: t.text(),\n});\n\nexport type DevBucketMetadata = Static<typeof devBucketMetadataSchema>;\n","import { type Static, t } from \"alepha\";\n\nexport const devCacheMetadataSchema = t.object({\n name: t.text(),\n ttl: t.optional(t.any()),\n disabled: t.optional(t.boolean()),\n provider: t.text(),\n});\n\nexport type DevCacheMetadata = Static<typeof devCacheMetadataSchema>;\n","import { type Static, t } from \"alepha\";\n\nexport const devEntityColumnSchema = t.object({\n name: t.text(),\n type: t.text(),\n nullable: t.boolean(),\n primaryKey: t.boolean(),\n identity: t.boolean(),\n createdAt: t.boolean(),\n updatedAt: t.boolean(),\n deletedAt: t.boolean(),\n version: t.boolean(),\n hasDefault: t.boolean(),\n ref: t.optional(\n t.object({\n entity: t.text(),\n column: t.text(),\n onUpdate: t.optional(t.text()),\n onDelete: t.optional(t.text()),\n }),\n ),\n});\n\nexport const devEntityIndexSchema = t.object({\n name: t.optional(t.text()),\n columns: t.array(t.text()),\n unique: t.boolean(),\n});\n\nexport const devEntityForeignKeySchema = t.object({\n name: t.optional(t.text()),\n columns: t.array(t.text()),\n foreignEntity: t.text(),\n foreignColumns: t.array(t.text()),\n});\n\nexport const devEntityConstraintSchema = t.object({\n name: t.optional(t.text()),\n columns: t.array(t.text()),\n unique: t.boolean(),\n hasCheck: t.boolean(),\n});\n\nexport const devEntityMetadataSchema = t.object({\n name: t.text(),\n provider: t.text(),\n columns: t.array(devEntityColumnSchema),\n indexes: t.array(devEntityIndexSchema),\n foreignKeys: t.array(devEntityForeignKeySchema),\n constraints: t.array(devEntityConstraintSchema),\n schema: t.optional(t.any()),\n insertSchema: t.optional(t.any()),\n updateSchema: t.optional(t.any()),\n});\n\nexport type DevEntityColumn = Static<typeof devEntityColumnSchema>;\nexport type DevEntityIndex = Static<typeof devEntityIndexSchema>;\nexport type DevEntityForeignKey = Static<typeof devEntityForeignKeySchema>;\nexport type DevEntityConstraint = Static<typeof devEntityConstraintSchema>;\nexport type DevEntityMetadata = Static<typeof devEntityMetadataSchema>;\n","import { type Static, t } from \"alepha\";\n\nexport const devEnvMetadataSchema = t.object({\n /**\n * The property name in the service where $env is defined\n */\n propertyKey: t.text(),\n /**\n * The schema for the environment variables (TypeBox/JSON Schema)\n */\n schema: t.any(),\n /**\n * The parsed values from the environment\n */\n values: t.record(t.text(), t.any()),\n /**\n * The service class name where this $env is defined\n */\n serviceName: t.optional(t.text()),\n});\n\nexport type DevEnvMetadata = Static<typeof devEnvMetadataSchema>;\n","import { type Static, t } from \"alepha\";\n\nexport const devModuleMetadataSchema = t.object({\n name: t.text(),\n providers: t.array(t.text()),\n});\n\nexport type DevModuleMetadata = Static<typeof devModuleMetadataSchema>;\n","import { type Static, t } from \"alepha\";\n\nexport const devPageMetadataSchema = t.object({\n name: t.text(),\n label: t.optional(t.text()),\n description: t.optional(t.text()),\n path: t.optional(t.text()),\n parentName: t.optional(t.text()),\n params: t.optional(t.any()),\n query: t.optional(t.any()),\n hasComponent: t.boolean(),\n hasLazy: t.boolean(),\n hasResolve: t.boolean(),\n childrenNames: t.optional(t.array(t.text())),\n hasChildren: t.boolean(),\n hasParent: t.boolean(),\n hasErrorHandler: t.boolean(),\n static: t.optional(t.boolean()),\n cache: t.optional(t.any()),\n client: t.optional(t.any()),\n animation: t.optional(t.any()),\n});\n\nexport type DevPageMetadata = Static<typeof devPageMetadataSchema>;\n","import { type Static, t } from \"alepha\";\n\nexport const devProviderMetadataSchema = t.object({\n name: t.text(),\n module: t.optional(t.text()),\n dependencies: t.array(t.text()),\n aliases: t.optional(t.array(t.text())),\n});\n\nexport type DevProviderMetadata = Static<typeof devProviderMetadataSchema>;\n","import { type Static, t } from \"alepha\";\n\nexport const devQueueMetadataSchema = t.object({\n name: t.text(),\n description: t.optional(t.text()),\n schema: t.optional(t.any()),\n provider: t.text(),\n});\n\nexport type DevQueueMetadata = Static<typeof devQueueMetadataSchema>;\n","import { type Static, t } from \"alepha\";\n\nexport const devRealmMetadataSchema = t.object({\n name: t.text(),\n description: t.optional(t.text()),\n roles: t.optional(t.array(t.any())),\n type: t.enum([\"internal\", \"external\"]),\n settings: t.optional(\n t.object({\n accessTokenExpiration: t.optional(t.any()),\n refreshTokenExpiration: t.optional(t.any()),\n hasOnCreateSession: t.boolean(),\n hasOnRefreshSession: t.boolean(),\n hasOnDeleteSession: t.boolean(),\n }),\n ),\n});\n\nexport type DevRealmMetadata = Static<typeof devRealmMetadataSchema>;\n","import { type Static, t } from \"alepha\";\n\nexport const devRouteMetadataSchema = t.object({\n method: t.text(),\n path: t.text(),\n});\n\nexport type DevRouteMetadata = Static<typeof devRouteMetadataSchema>;\n","import { type Static, t } from \"alepha\";\n\nexport const devSchedulerMetadataSchema = t.object({\n name: t.text(),\n description: t.optional(t.text()),\n cron: t.optional(t.text()),\n interval: t.optional(t.any()),\n lock: t.optional(t.boolean()),\n});\n\nexport type DevSchedulerMetadata = Static<typeof devSchedulerMetadataSchema>;\n","import { type Static, t } from \"alepha\";\n\nexport const devTopicMetadataSchema = t.object({\n name: t.text(),\n description: t.optional(t.text()),\n schema: t.optional(t.any()),\n provider: t.text(),\n subscribers: t.integer(),\n});\n\nexport type DevTopicMetadata = Static<typeof devTopicMetadataSchema>;\n","import { type Static, t } from \"alepha\";\nimport { devActionMetadataSchema } from \"./DevActionMetadata.ts\";\nimport { devAtomMetadataSchema } from \"./DevAtomMetadata.ts\";\nimport { devBucketMetadataSchema } from \"./DevBucketMetadata.ts\";\nimport { devCacheMetadataSchema } from \"./DevCacheMetadata.ts\";\nimport { devEntityMetadataSchema } from \"./DevEntityMetadata.ts\";\nimport { devEnvMetadataSchema } from \"./DevEnvMetadata.ts\";\nimport { devModuleMetadataSchema } from \"./DevModuleMetadata.ts\";\nimport { devPageMetadataSchema } from \"./DevPageMetadata.ts\";\nimport { devProviderMetadataSchema } from \"./DevProviderMetadata.ts\";\nimport { devQueueMetadataSchema } from \"./DevQueueMetadata.ts\";\nimport { devRealmMetadataSchema } from \"./DevRealmMetadata.ts\";\nimport { devRouteMetadataSchema } from \"./DevRouteMetadata.ts\";\nimport { devSchedulerMetadataSchema } from \"./DevSchedulerMetadata.ts\";\nimport { devTopicMetadataSchema } from \"./DevTopicMetadata.ts\";\n\nexport const devSystemSchema = t.object({\n alephaVersion: t.text(),\n nodeVersion: t.text(),\n runtime: t.enum([\"node\", \"bun\"]),\n mode: t.enum([\"development\", \"production\"]),\n port: t.integer(),\n uptime: t.number(),\n memoryUsage: t.number(),\n});\n\nexport type DevSystem = Static<typeof devSystemSchema>;\n\nexport const devMetadataSchema = t.object({\n system: devSystemSchema,\n actions: t.array(devActionMetadataSchema),\n queues: t.array(devQueueMetadataSchema),\n schedulers: t.array(devSchedulerMetadataSchema),\n topics: t.array(devTopicMetadataSchema),\n buckets: t.array(devBucketMetadataSchema),\n realms: t.array(devRealmMetadataSchema),\n caches: t.array(devCacheMetadataSchema),\n pages: t.array(devPageMetadataSchema),\n providers: t.array(devProviderMetadataSchema),\n modules: t.array(devModuleMetadataSchema),\n entities: t.array(devEntityMetadataSchema),\n routes: t.array(devRouteMetadataSchema),\n envs: t.array(devEnvMetadataSchema),\n atoms: t.array(devAtomMetadataSchema),\n});\n\nexport type DevMetadata = Static<typeof devMetadataSchema>;\n","import { $hook, $inject, Alepha, t } from \"alepha\";\nimport { $logger, MemoryDestinationProvider } from \"alepha/logger\";\nimport { RepositoryProvider } from \"alepha/orm\";\nimport { $route, ServerProvider } from \"alepha/server\";\nimport { $serve } from \"alepha/server/static\";\nimport { devtoolsAssets } from \"../assets.ts\";\nimport { devMetadataSchema } from \"../schemas/DevMetadata.ts\";\nimport { DevToolsMetadataProvider } from \"./DevToolsMetadataProvider.ts\";\n\nexport class DevToolsProvider {\n protected readonly log = $logger();\n protected readonly alepha = $inject(Alepha);\n protected readonly serverProvider = $inject(ServerProvider);\n protected readonly devCollectorProvider = $inject(DevToolsMetadataProvider);\n protected readonly memoryDestination = $inject(MemoryDestinationProvider);\n\n protected readonly onStart = $hook({\n on: \"start\",\n handler: () => {\n this.log.info(\"Devtools OK\", {\n url: `${this.serverProvider.hostname}/__devtools/`,\n });\n },\n });\n\n /**\n * Capture all logs into memory so the devtools UI can display them.\n * In dev mode, LogDestinationProvider is bound to ConsoleDestinationProvider,\n * so MemoryDestinationProvider would otherwise never receive writes.\n */\n protected readonly onLog = $hook({\n on: \"log\",\n handler: ({ entry }) => {\n this.memoryDestination.write(\"\", entry);\n },\n });\n\n protected readonly uiRoute = $serve({\n path: \"/__devtools\",\n root: devtoolsAssets.ui,\n historyApiFallback: true,\n silent: true,\n });\n\n protected readonly metadataRoute = $route({\n method: \"GET\",\n path: \"/__devtools/api/metadata\",\n silent: true,\n schema: {\n response: devMetadataSchema,\n },\n handler: () => {\n return this.devCollectorProvider.getMetadata();\n },\n });\n\n protected readonly updateAtomRoute = $route({\n method: \"POST\",\n path: \"/__devtools/api/atoms\",\n silent: true,\n schema: {\n body: t.object({\n name: t.text(),\n value: t.any(),\n }),\n response: t.object({\n success: t.boolean(),\n }),\n },\n handler: ({ body }) => {\n const atoms = this.alepha.store.getAtoms(false);\n const atomEntry = atoms.find((a) => a.atom.key === body.name);\n\n if (atomEntry) {\n this.alepha.store.set(atomEntry.atom, body.value);\n return { success: true };\n }\n\n return { success: false };\n },\n });\n\n // -------------------------------------------------------------------------------------------------------------------\n // Logs endpoint\n // -------------------------------------------------------------------------------------------------------------------\n\n protected readonly logsRoute = $route({\n method: \"GET\",\n path: \"/__devtools/api/logs\",\n silent: true,\n schema: {\n query: t.object({\n level: t.optional(t.text()),\n type: t.optional(t.text()),\n module: t.optional(t.text()),\n search: t.optional(t.text()),\n since: t.optional(t.text()),\n limit: t.optional(t.text()),\n offset: t.optional(t.text()),\n }),\n response: t.object({\n logs: t.array(t.any()),\n total: t.integer(),\n }),\n },\n handler: ({ query }) => {\n const levelOrder = [\"TRACE\", \"DEBUG\", \"INFO\", \"WARN\", \"ERROR\"];\n let entries = this.memoryDestination.logs;\n\n if (query.level) {\n const minIndex = levelOrder.indexOf(query.level.toUpperCase());\n if (minIndex >= 0) {\n entries = entries.filter(\n (e) => levelOrder.indexOf(e.level) >= minIndex,\n );\n }\n }\n\n if (query.type) {\n const types = query.type.split(\",\").map((t) => t.trim());\n entries = entries.filter((e) => {\n if (!e.data || typeof e.data !== \"object\") return false;\n const d = e.data as Record<string, unknown>;\n for (const t of types) {\n if (t === \"http\" || t === \"http:request\") {\n if (d.status && d.method && d.path && d.duration) return true;\n } else if (t === \"db\" || t === \"db:query\") {\n if (d.type === \"db:query\") return true;\n } else if (d.type === t) {\n return true;\n }\n }\n return false;\n });\n }\n\n if (query.module) {\n entries = entries.filter((e) => e.module === query.module);\n }\n\n if (query.search) {\n const terms = query.search.toLowerCase().split(/\\s+/);\n entries = entries.filter((e) => {\n const text = `${e.message} ${e.module} ${e.service}`.toLowerCase();\n return terms.every((term) => text.includes(term));\n });\n }\n\n if (query.since) {\n const since = Number(query.since);\n if (!Number.isNaN(since)) {\n entries = entries.filter((e) => e.timestamp >= since);\n }\n }\n\n const total = entries.length;\n\n // Reverse so newest first\n entries = entries.reverse();\n\n const offset = query.offset ? Number(query.offset) : 0;\n const limit = query.limit ? Number(query.limit) : 100;\n entries = entries.slice(offset, offset + limit);\n\n return { logs: entries, total };\n },\n });\n\n // -------------------------------------------------------------------------------------------------------------------\n // DB CRUD endpoints\n // -------------------------------------------------------------------------------------------------------------------\n\n protected readonly dbListRoute = $route({\n method: \"GET\",\n path: \"/__devtools/api/db/:entity/records\",\n silent: true,\n schema: {\n params: t.object({ entity: t.text() }),\n query: t.object({\n page: t.optional(t.text()),\n size: t.optional(t.text()),\n sort: t.optional(t.text()),\n }),\n response: t.record(t.text(), t.any()),\n },\n handler: async ({ params, query }) => {\n const repo = this.getRepository(params.entity);\n if (!repo) {\n return { content: [], page: { totalElements: 0 } };\n }\n\n return repo.paginate(\n {\n page: query.page ? Number(query.page) : 0,\n size: query.size ? Number(query.size) : 50,\n sort: query.sort || undefined,\n },\n {},\n { count: true },\n ) as any;\n },\n });\n\n protected readonly dbCreateRoute = $route({\n method: \"POST\",\n path: \"/__devtools/api/db/:entity/records\",\n silent: true,\n schema: {\n params: t.object({ entity: t.text() }),\n body: t.record(t.text(), t.any()),\n response: t.record(t.text(), t.any()),\n },\n handler: async ({ params, body }) => {\n const repo = this.getRepository(params.entity);\n if (!repo) {\n return { error: \"Entity not found\" };\n }\n return repo.create(body) as any;\n },\n });\n\n protected readonly dbUpdateRoute = $route({\n method: \"PUT\",\n path: \"/__devtools/api/db/:entity/records/:id\",\n silent: true,\n schema: {\n params: t.object({ entity: t.text(), id: t.text() }),\n body: t.record(t.text(), t.any()),\n response: t.record(t.text(), t.any()),\n },\n handler: async ({ params, body }) => {\n const repo = this.getRepository(params.entity);\n if (!repo) {\n return { error: \"Entity not found\" };\n }\n\n const idValue = this.parseId(repo, params.id);\n return repo.updateById(idValue, body) as any;\n },\n });\n\n protected readonly dbDeleteRoute = $route({\n method: \"DELETE\",\n path: \"/__devtools/api/db/:entity/records/:id\",\n silent: true,\n schema: {\n params: t.object({ entity: t.text(), id: t.text() }),\n response: t.record(t.text(), t.any()),\n },\n handler: async ({ params }) => {\n const repo = this.getRepository(params.entity);\n if (!repo) {\n return { error: \"Entity not found\" };\n }\n\n const idValue = this.parseId(repo, params.id);\n return repo.deleteById(idValue) as any;\n },\n });\n\n // -------------------------------------------------------------------------------------------------------------------\n\n protected getRepository(entityName: string) {\n try {\n const repositoryProvider = this.alepha.inject(RepositoryProvider);\n const repos = repositoryProvider.getRepositories();\n return repos.find((r) => r.entity.name === entityName);\n } catch {\n return undefined;\n }\n }\n\n protected parseId(repo: any, rawId: string): string | number {\n const idType = repo.id.type;\n if (idType?.type === \"integer\" || idType?.type === \"number\") {\n return Number(rawId);\n }\n return rawId;\n }\n}\n","import { $module } from \"alepha\";\nimport { AlephaServer } from \"alepha/server\";\nimport { AlephaServerStatic } from \"alepha/server/static\";\nimport { DevToolsMetadataProvider } from \"./providers/DevToolsMetadataProvider.ts\";\nimport { DevToolsProvider } from \"./providers/DevToolsProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./index.shared.ts\";\nexport * from \"./providers/DevToolsMetadataProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Runtime inspection and debugging UI.\n *\n * **Features:**\n * - DevTools UI at `GET /devtools`\n * - Application metadata at `GET /devtools/metadata`\n * - Last 10,000 logs at `GET /devtools/logs`\n * - Runtime inspection of actions, queues, schedulers, topics, buckets\n * - Log viewer with filtering\n * - React Flow visualization\n * - Provider and module browsing\n *\n * @module alepha.devtools\n */\nexport const AlephaDevtools = $module({\n name: \"alepha.devtools\",\n primitives: [],\n services: [DevToolsMetadataProvider, DevToolsProvider],\n register: (alepha) => {\n alepha.with(AlephaServer);\n alepha.with(AlephaServerStatic);\n alepha.with(DevToolsProvider);\n alepha.with(DevToolsMetadataProvider);\n alepha.store.push(\"alepha.build.assets\", \"alepha\");\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;AA4CA,IAAa,2BAAb,MAAsC;CACpC,AAAmB,SAAS,QAAQ,OAAO;CAC3C,AAAmB,MAAM,SAAS;CAClC,AAAmB,iBAAiB,QAAQ,eAAe;CAC3D,AAAmB,YAAY,KAAK,KAAK;CAEzC,AAAO,aAAkC;AAGvC,SAFyB,KAAK,OAAO,WAAW,QAAQ,CAEhC,KAAK,WAAW;GACtC,MAAM,SAAS,OAAO;GACtB,MAAM,UAAU,OAAO;AAEvB,UAAO;IACL,MAAM,OAAO;IACb,OAAO,OAAO;IACd,QAAQ,OAAO;IACf,MAAM,OAAO;IACb,QAAQ,OAAO;IACf,UAAU,OAAO,MAAM;IACvB,aAAa,OAAO,QAAQ;IAC5B,SAAS,QAAQ;IACjB,UAAU,OAAO,QAAQ;IACzB,QACE,OAAO,YAAY,MAAM,MAAM,GAAG,SAAS,UAAU,IAAI;IAC3D,MAAM,QAAQ;IACd,MAAM,QAAQ;IACd,QAAQ,QAAQ;IAChB,OAAO,QAAQ;IACf,UAAU,QAAQ;IAClB,iBAAiB,OAAO,oBAAoB;IAC5C,aAAa,OAAO,YAAY,OAAO,QAAQ,CAAC,SAC5C,OAAO,YAAY,OAAO,QAAQ,GAClC;IACL;IACD;;CAGJ,AAAO,YAAgC;AAGrC,SAFwB,KAAK,OAAO,WAAW,OAAO,CAE/B,KAAK,WAAW;GACrC,MAAM,MAAM;GACZ,aAAa,MAAM,QAAQ;GAC3B,QAAQ,MAAM,QAAQ;GACtB,UAAU,KAAK,gBAAgB,MAAM,QAAQ,SAAS;GACvD,EAAE;;CAGL,AAAO,gBAAwC;AAG7C,SAF4B,KAAK,OAAO,WAAW,WAAW,CAEnC,KAAK,eAAe;GAC7C,MAAM,UAAU;GAChB,aAAa,UAAU,QAAQ;GAC/B,MAAM,UAAU,QAAQ;GACxB,UAAU,UAAU,QAAQ;GAC5B,MAAM,UAAU,QAAQ;GACzB,EAAE;;CAGL,AAAO,YAAgC;EACrC,MAAM,kBAAkB,KAAK,OAAO,WAAW,OAAO;EAGtD,MAAM,2BAAW,IAAI,KAA+B;AACpD,OAAK,MAAM,SAAS,iBAAiB;GACnC,MAAM,WAAW,SAAS,IAAI,MAAM,KAAK;AACzC,OAAI,SACF,UAAS;OAET,UAAS,IAAI,MAAM,MAAM;IACvB,MAAM,MAAM;IACZ,aAAa,MAAM,QAAQ;IAC3B,QAAQ,MAAM,QAAQ;IACtB,UAAU,KAAK,gBAAgB,MAAM,QAAQ,SAAS;IACtD,aAAa;IACd,CAAC;;AAGN,SAAO,MAAM,KAAK,SAAS,QAAQ,CAAC;;CAGtC,AAAO,aAAkC;AAGvC,SAFyB,KAAK,OAAO,WAAW,QAAQ,CAEhC,KAAK,YAAY;GACvC,MAAM,OAAO;GACb,aAAa,OAAO,QAAQ;GAC5B,WAAW,OAAO,QAAQ;GAC1B,SAAS,OAAO,QAAQ;GACxB,UAAU,KAAK,gBAAgB,OAAO,QAAQ,SAAS;GACxD,EAAE;;CAGL,AAAO,YAAgC;AAGrC,SAFwB,KAAK,OAAO,WAAW,QAAQ,CAEhC,KAAK,WAAW;GACrC,MAAM,MAAM;GACZ,aAAa,MAAM,QAAQ;GAC3B,OAAO,MAAM,QAAQ;GACrB,MAAM,YAAY,MAAM,UAAU,aAAa;GAC/C,UAAU;IACR,uBAAuB,MAAM,QAAQ,UAAU,aAAa;IAC5D,wBACE,MAAM,QAAQ,UAAU,cAAc;IACxC,oBAAoB,CAAC,CAAC,MAAM,QAAQ,UAAU;IAC9C,qBAAqB,CAAC,CAAC,MAAM,QAAQ,UAAU;IAC/C,oBAAoB,CAAC,CAAC,MAAM,QAAQ,UAAU;IAC/C;GACF,EAAE;;CAGL,AAAO,YAAgC;AAGrC,SAFwB,KAAK,OAAO,WAAW,OAAO,CAE/B,KAAK,WAAW;GACrC,MAAM,MAAM;GACZ,KAAK,MAAM,QAAQ;GACnB,UAAU,MAAM,QAAQ;GACxB,UAAU,KAAK,gBAAgB,MAAM,QAAQ,SAAS;GACvD,EAAE;;CAGL,AAAO,WAA8B;AAGnC,SAFuB,KAAK,OAAO,WAAW,MAAM,CAE9B,KAAK,SAAc;GAEvC,MAAM,WACJ,OAAO,KAAK,QAAQ,aAAa,aAC7B,KAAK,QAAQ,UAAU,GACvB,KAAK,QAAQ;GACnB,MAAM,gBAAgB,MAAM,QAAQ,SAAS,GACzC,SAAS,KAAK,MAAW,EAAE,KAAK,CAAC,OAAO,QAAQ,GAChD;AAEJ,UAAO;IACL,MAAM,KAAK;IACX,OAAO,KAAK,QAAQ;IACpB,aAAa,KAAK,QAAQ;IAC1B,MAAM,KAAK,QAAQ;IACnB,YAAY,KAAK,QAAQ,QAAQ;IACjC,QAAQ,KAAK,QAAQ,QAAQ;IAC7B,OAAO,KAAK,QAAQ,QAAQ;IAC5B,cAAc,CAAC,CAAC,KAAK,QAAQ;IAC7B,SAAS,CAAC,CAAC,KAAK,QAAQ;IACxB,YAAY,CAAC,CAAC,KAAK,QAAQ;IAC3B,eAAe,eAAe,SAAS,gBAAgB;IACvD,aAAa,CAAC,CAAC,KAAK,QAAQ;IAC5B,WAAW,CAAC,CAAC,KAAK,QAAQ;IAC1B,iBAAiB,CAAC,CAAC,KAAK,QAAQ;IAChC,QACE,OAAO,KAAK,QAAQ,WAAW,YAC3B,KAAK,QAAQ,SACb,CAAC,CAAC,KAAK,QAAQ;IACrB,OAAO,KAAK,QAAQ;IACpB,QAAQ,KAAK,QAAQ;IACrB,WAAW,KAAK,QAAQ;IACzB;IACD;;CAGJ,AAAO,eAAsC;EAC3C,MAAM,QAAQ,KAAK,OAAO,OAAO;AAEjC,SAAO,OAAO,QAAQ,MAAM,CAAC,KAAK,CAAC,MAAM,WAAW;GAClD;GACA,QAAQ,KAAK,UAAU;GACvB,cAAc,KAAK;GACnB,SAAS,KAAK;GACf,EAAE;;CAGL,AAAO,aAAkC;EACvC,MAAM,QAAQ,KAAK,OAAO,OAAO;EACjC,MAAM,4BAAY,IAAI,KAA0B;AAGhD,OAAK,MAAM,CAAC,cAAc,SAAS,OAAO,QAAQ,MAAM,CACtD,KAAI,KAAK,QAAQ;AACf,OAAI,CAAC,UAAU,IAAI,KAAK,OAAO,CAC7B,WAAU,IAAI,KAAK,wBAAQ,IAAI,KAAK,CAAC;AAEvC,aAAU,IAAI,KAAK,OAAO,CAAE,IAAI,aAAa;;AAIjD,SAAO,MAAM,KAAK,UAAU,SAAS,CAAC,CAAC,KAAK,CAAC,MAAM,gBAAgB;GACjE;GACA,WAAW,MAAM,KAAK,UAAU;GACjC,EAAE;;CAGL,AAAO,cAAmC;AACxC,MAAI;AAIF,UAH2B,KAAK,OAAO,OAAO,mBAAmB,CACzB,iBAAiB,CAErC,KAAK,SAAS;IAChC,MAAM,SAAS,KAAK;IACpB,MAAM,SAAS,OAAO;IACtB,MAAM,UAAU,OAAO;IAGvB,MAAM,UAA6B,OAAO,QACxC,OAAO,WACR,CAAC,KAAK,CAAC,MAAM,WAAW;KACvB,MAAM,cAAc;KACpB,MAAM,UAAU,YAAY;AAE5B,YAAO;MACL;MACA,MAAM,KAAK,cAAc,YAAY;MACrC,UAAU,KAAK,WAAW,YAAY;MACtC,YAAY,kBAAkB;MAC9B,UAAU,eAAe,eAAe,aAAa;MACrD,WAAW,iBAAiB;MAC5B,WAAW,iBAAiB;MAC5B,WAAW,iBAAiB;MAC5B,SAAS,cAAc;MACvB,YAAY,cAAc;MAC1B,KAAK,UACD;OACE,QAAQ,QAAQ,OAAO,EAAE,QAAQ,QAAQ;OACzC,QAAQ,QAAQ,OAAO,EAAE,QAAQ;OACjC,UAAU,QAAQ,SAAS;OAC3B,UAAU,QAAQ,SAAS;OAC5B,GACD;MACL;MACD;IAGF,MAAM,WAA6B,QAAQ,WAAW,EAAE,EAAE,KACvD,QAAa;AACZ,SAAI,OAAO,QAAQ,SACjB,QAAO;MAAE,SAAS,CAAC,IAAI;MAAE,QAAQ;MAAO;AAE1C,YAAO;MACL,MAAM,IAAI;MACV,SAAS,IAAI,SAAS,CAAC,IAAI,OAAO,GAAI,IAAI,WAAW,EAAE;MACvD,QAAQ,IAAI,UAAU;MACvB;MAEJ;IAGD,MAAM,eACJ,QAAQ,eAAe,EAAE,EACzB,KAAK,QAAa;KAClB,MAAM,GAAG;KACT,SAAS,GAAG,QAAQ,IAAI,OAAO;KAC/B,eAAe,GAAG,iBAAiB,MAAM,EAAE,QAAQ,QAAQ;KAC3D,gBAAgB,GAAG,gBAAgB,KAChC,OAAY,MAAM,EAAE,QAAQ,UAC9B;KACF,EAAE;IAGH,MAAM,eACJ,QAAQ,eAAe,EAAE,EACzB,KAAK,OAAY;KACjB,MAAM,EAAE;KACR,SAAS,EAAE,QAAQ,IAAI,OAAO;KAC9B,QAAQ,CAAC,CAAC,EAAE;KACZ,UAAU,CAAC,CAAC,EAAE;KACf,EAAE;AAEH,WAAO;KACL,MAAM,OAAO;KACb,UAAU,KAAK,SAAS,YAAY;KACpC;KACA;KACA;KACA;KACA,QAAQ,OAAO;KACf,cAAc,OAAO;KACrB,cAAc,OAAO;KACtB;KACD;UACI;AAEN,UAAO,EAAE;;;CAIb,AAAU,cAAc,OAAwB;AAE9C,MAAI,EAAE,OAAO,QAAQ,MAAM,IAAK,MAAc,OAAO;GAEnD,MAAM,UADS,MAAc,MACP,MAAM,SAAS,CAAC,EAAE,OAAO,OAAO,KAAK,CAAC;AAC5D,OAAI,QACF,QAAO,KAAK,cAAc,QAAQ;;EAItC,MAAM,IAAI;AAGV,MACE,EAAE,OAAO,SAAS,MAAM,IACxB,EAAE,SAAS,YACX,MAAM,QAAQ,EAAE,KAAK,CAErB,QAAO;AAIT,MAAI,EAAE,OAAO,SAAS,MAAM,EAAE;AAC5B,OAAI,EAAE,KAAM,QAAO;AACnB,OAAI,EAAE,WAAW,OAAQ,QAAO;AAChC,OAAI,EAAE,WAAW,YAAa,QAAO;AACrC,OAAI,EAAE,WAAW,OAAQ,QAAO;AAChC,OAAI,EAAE,WAAW,SAAU,QAAO;AAClC,UAAO;;AAET,MAAI,EAAE,OAAO,UAAU,MAAM,CAAE,QAAO;AACtC,MAAI,EAAE,OAAO,SAAS,MAAM,CAAE,QAAO;AACrC,MAAI,EAAE,OAAO,UAAU,MAAM,CAAE,QAAO;AACtC,MAAI,EAAE,OAAO,QAAQ,MAAM,CAAE,QAAO;AACpC,MAAI,EAAE,OAAO,SAAS,MAAM,CAAE,QAAO;AACrC,MAAI,EAAE,OAAO,UAAU,MAAM,CAAE,QAAO;AAEtC,SAAO;;CAGT,AAAU,WAAW,OAAyB;AAC5C,MAAI,EAAE,OAAO,QAAQ,MAAM,IAAK,MAAc,MAE5C,QADe,MAAc,MAChB,MAAM,SAAS,EAAE,OAAO,OAAO,KAAK,CAAC;AAEpD,SAAO;;CAGT,AAAO,YAAgC;AAGrC,SAAO,EAAE;;CAGX,AAAO,UAA4B;AAGjC,SAFmB,KAAK,OAAO,eAAe,CAE5B,KAAK,MAAM,WAAW;GACtC,aAAa,OAAO;GACpB,QAAQ,KAAK;GACb,QAAQ,KAAK;GACb,aAAa;GACd,EAAE;;CAGL,AAAO,WAA8B;AAGnC,SAFwB,KAAK,OAAO,MAAM,SAAS,MAAM,CAElC,KAAK,EAAE,MAAM,aAAa;GAC/C,MAAM,KAAK;GACX,aAAa,KAAK,QAAQ;GAC1B,QAAQ,KAAK;GACb,cAAc,KAAK,QAAQ;GAC3B,cAAc;GACf,EAAE;;CAGL,AAAO,YAAuB;EAC5B,MAAM,QAAQ,OAAO,WAAW,QAAQ;EACxC,MAAM,OAAO,OAAO,KAAK,OAAO,IAAI,YAAY,IAAI;AACpD,SAAO;GACL,eAAe,OAAO,KAAK,OAAO,IAAI,uBAAuB,UAAU;GACvE,aAAa,QACR,WAAW,KAAK,WAAW,YAC5B,QAAQ;GACZ,SAAS,QAAQ,QAAQ;GACzB,MAAM,KAAK,OAAO,cAAc,GAAG,eAAe;GAClD;GACA,SAAS,KAAK,KAAK,GAAG,KAAK,aAAa;GACxC,aAAa,QAAQ,eAAe,EAAE,OAAO;GAC9C;;CAGH,AAAO,cAA2B;AAChC,SAAO;GACL,QAAQ,KAAK,WAAW;GACxB,SAAS,KAAK,YAAY;GAC1B,QAAQ,KAAK,WAAW;GACxB,YAAY,KAAK,eAAe;GAChC,QAAQ,KAAK,WAAW;GACxB,SAAS,KAAK,YAAY;GAC1B,QAAQ,KAAK,WAAW;GACxB,QAAQ,KAAK,WAAW;GACxB,OAAO,KAAK,UAAU;GACtB,WAAW,KAAK,cAAc;GAC9B,SAAS,KAAK,YAAY;GAC1B,UAAU,KAAK,aAAa;GAC5B,QAAQ,KAAK,WAAW;GACxB,MAAM,KAAK,SAAS;GACpB,OAAO,KAAK,UAAU;GACvB;;CAKH,AAAU,gBAAgB,UAAmC;AAC3D,MAAI,CAAC,SACH,QAAO;AAET,MAAI,aAAa,SACf,QAAO;AAET,SAAO,SAAS,QAAQ;;;;;;ACnc5B,MAAa,iBAAiB,EAC5B,IAAI,KAAK,cAAc,OAAO,KAAK,IAAI,EAAE,8BAA8B,EACxE;;;;ACHD,MAAa,0BAA0B,EAAE,OAAO;CAC9C,MAAM,EAAE,MAAM;CACd,OAAO,EAAE,MAAM;CACf,QAAQ,EAAE,MAAM;CAChB,MAAM,EAAE,MAAM;CACd,QAAQ,EAAE,MAAM;CAChB,UAAU,EAAE,MAAM;CAClB,aAAa,EAAE,SAAS,EAAE,MAAM,CAAC;CACjC,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC;CAC7B,UAAU,EAAE,SAAS,EAAE,SAAS,CAAC;CACjC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC;CAC/B,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC;CAC7B,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC;CACzB,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC;CAC3B,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC;CAC1B,UAAU,EAAE,SAAS,EAAE,KAAK,CAAC;CAC7B,iBAAiB,EAAE,SAAS,EAAE,MAAM,CAAC;CACrC,aAAa,EAAE,SACb,EAAE,MACA,EAAE,OAAO;EACP,MAAM,EAAE,MAAM;EACd,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC;EAC7B,CAAC,CACH,CACF;CACF,CAAC;;;;ACzBF,MAAa,wBAAwB,EAAE,OAAO;CAI5C,MAAM,EAAE,MAAM;CAId,aAAa,EAAE,SAAS,EAAE,MAAM,CAAC;CAIjC,QAAQ,EAAE,KAAK;CAIf,cAAc,EAAE,SAAS,EAAE,KAAK,CAAC;CAIjC,cAAc,EAAE,SAAS,EAAE,KAAK,CAAC;CAClC,CAAC;;;;ACrBF,MAAa,0BAA0B,EAAE,OAAO;CAC9C,MAAM,EAAE,MAAM;CACd,aAAa,EAAE,SAAS,EAAE,MAAM,CAAC;CACjC,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CACxC,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC;CAC/B,UAAU,EAAE,MAAM;CACnB,CAAC;;;;ACNF,MAAa,yBAAyB,EAAE,OAAO;CAC7C,MAAM,EAAE,MAAM;CACd,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC;CACxB,UAAU,EAAE,SAAS,EAAE,SAAS,CAAC;CACjC,UAAU,EAAE,MAAM;CACnB,CAAC;;;;ACLF,MAAa,wBAAwB,EAAE,OAAO;CAC5C,MAAM,EAAE,MAAM;CACd,MAAM,EAAE,MAAM;CACd,UAAU,EAAE,SAAS;CACrB,YAAY,EAAE,SAAS;CACvB,UAAU,EAAE,SAAS;CACrB,WAAW,EAAE,SAAS;CACtB,WAAW,EAAE,SAAS;CACtB,WAAW,EAAE,SAAS;CACtB,SAAS,EAAE,SAAS;CACpB,YAAY,EAAE,SAAS;CACvB,KAAK,EAAE,SACL,EAAE,OAAO;EACP,QAAQ,EAAE,MAAM;EAChB,QAAQ,EAAE,MAAM;EAChB,UAAU,EAAE,SAAS,EAAE,MAAM,CAAC;EAC9B,UAAU,EAAE,SAAS,EAAE,MAAM,CAAC;EAC/B,CAAC,CACH;CACF,CAAC;AAEF,MAAa,uBAAuB,EAAE,OAAO;CAC3C,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC;CAC1B,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC;CAC1B,QAAQ,EAAE,SAAS;CACpB,CAAC;AAEF,MAAa,4BAA4B,EAAE,OAAO;CAChD,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC;CAC1B,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC;CAC1B,eAAe,EAAE,MAAM;CACvB,gBAAgB,EAAE,MAAM,EAAE,MAAM,CAAC;CAClC,CAAC;AAEF,MAAa,4BAA4B,EAAE,OAAO;CAChD,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC;CAC1B,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC;CAC1B,QAAQ,EAAE,SAAS;CACnB,UAAU,EAAE,SAAS;CACtB,CAAC;AAEF,MAAa,0BAA0B,EAAE,OAAO;CAC9C,MAAM,EAAE,MAAM;CACd,UAAU,EAAE,MAAM;CAClB,SAAS,EAAE,MAAM,sBAAsB;CACvC,SAAS,EAAE,MAAM,qBAAqB;CACtC,aAAa,EAAE,MAAM,0BAA0B;CAC/C,aAAa,EAAE,MAAM,0BAA0B;CAC/C,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC;CAC3B,cAAc,EAAE,SAAS,EAAE,KAAK,CAAC;CACjC,cAAc,EAAE,SAAS,EAAE,KAAK,CAAC;CAClC,CAAC;;;;ACnDF,MAAa,uBAAuB,EAAE,OAAO;CAI3C,aAAa,EAAE,MAAM;CAIrB,QAAQ,EAAE,KAAK;CAIf,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK,CAAC;CAInC,aAAa,EAAE,SAAS,EAAE,MAAM,CAAC;CAClC,CAAC;;;;ACjBF,MAAa,0BAA0B,EAAE,OAAO;CAC9C,MAAM,EAAE,MAAM;CACd,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC;CAC7B,CAAC;;;;ACHF,MAAa,wBAAwB,EAAE,OAAO;CAC5C,MAAM,EAAE,MAAM;CACd,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC;CAC3B,aAAa,EAAE,SAAS,EAAE,MAAM,CAAC;CACjC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC;CAC1B,YAAY,EAAE,SAAS,EAAE,MAAM,CAAC;CAChC,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC;CAC3B,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC;CAC1B,cAAc,EAAE,SAAS;CACzB,SAAS,EAAE,SAAS;CACpB,YAAY,EAAE,SAAS;CACvB,eAAe,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CAC5C,aAAa,EAAE,SAAS;CACxB,WAAW,EAAE,SAAS;CACtB,iBAAiB,EAAE,SAAS;CAC5B,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC;CAC/B,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC;CAC1B,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC;CAC3B,WAAW,EAAE,SAAS,EAAE,KAAK,CAAC;CAC/B,CAAC;;;;ACnBF,MAAa,4BAA4B,EAAE,OAAO;CAChD,MAAM,EAAE,MAAM;CACd,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC;CAC5B,cAAc,EAAE,MAAM,EAAE,MAAM,CAAC;CAC/B,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC,CAAC;;;;ACLF,MAAa,yBAAyB,EAAE,OAAO;CAC7C,MAAM,EAAE,MAAM;CACd,aAAa,EAAE,SAAS,EAAE,MAAM,CAAC;CACjC,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC;CAC3B,UAAU,EAAE,MAAM;CACnB,CAAC;;;;ACLF,MAAa,yBAAyB,EAAE,OAAO;CAC7C,MAAM,EAAE,MAAM;CACd,aAAa,EAAE,SAAS,EAAE,MAAM,CAAC;CACjC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;CACnC,MAAM,EAAE,KAAK,CAAC,YAAY,WAAW,CAAC;CACtC,UAAU,EAAE,SACV,EAAE,OAAO;EACP,uBAAuB,EAAE,SAAS,EAAE,KAAK,CAAC;EAC1C,wBAAwB,EAAE,SAAS,EAAE,KAAK,CAAC;EAC3C,oBAAoB,EAAE,SAAS;EAC/B,qBAAqB,EAAE,SAAS;EAChC,oBAAoB,EAAE,SAAS;EAChC,CAAC,CACH;CACF,CAAC;;;;ACdF,MAAa,yBAAyB,EAAE,OAAO;CAC7C,QAAQ,EAAE,MAAM;CAChB,MAAM,EAAE,MAAM;CACf,CAAC;;;;ACHF,MAAa,6BAA6B,EAAE,OAAO;CACjD,MAAM,EAAE,MAAM;CACd,aAAa,EAAE,SAAS,EAAE,MAAM,CAAC;CACjC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC;CAC1B,UAAU,EAAE,SAAS,EAAE,KAAK,CAAC;CAC7B,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC;CAC9B,CAAC;;;;ACNF,MAAa,yBAAyB,EAAE,OAAO;CAC7C,MAAM,EAAE,MAAM;CACd,aAAa,EAAE,SAAS,EAAE,MAAM,CAAC;CACjC,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC;CAC3B,UAAU,EAAE,MAAM;CAClB,aAAa,EAAE,SAAS;CACzB,CAAC;;;;ACQF,MAAa,kBAAkB,EAAE,OAAO;CACtC,eAAe,EAAE,MAAM;CACvB,aAAa,EAAE,MAAM;CACrB,SAAS,EAAE,KAAK,CAAC,QAAQ,MAAM,CAAC;CAChC,MAAM,EAAE,KAAK,CAAC,eAAe,aAAa,CAAC;CAC3C,MAAM,EAAE,SAAS;CACjB,QAAQ,EAAE,QAAQ;CAClB,aAAa,EAAE,QAAQ;CACxB,CAAC;AAIF,MAAa,oBAAoB,EAAE,OAAO;CACxC,QAAQ;CACR,SAAS,EAAE,MAAM,wBAAwB;CACzC,QAAQ,EAAE,MAAM,uBAAuB;CACvC,YAAY,EAAE,MAAM,2BAA2B;CAC/C,QAAQ,EAAE,MAAM,uBAAuB;CACvC,SAAS,EAAE,MAAM,wBAAwB;CACzC,QAAQ,EAAE,MAAM,uBAAuB;CACvC,QAAQ,EAAE,MAAM,uBAAuB;CACvC,OAAO,EAAE,MAAM,sBAAsB;CACrC,WAAW,EAAE,MAAM,0BAA0B;CAC7C,SAAS,EAAE,MAAM,wBAAwB;CACzC,UAAU,EAAE,MAAM,wBAAwB;CAC1C,QAAQ,EAAE,MAAM,uBAAuB;CACvC,MAAM,EAAE,MAAM,qBAAqB;CACnC,OAAO,EAAE,MAAM,sBAAsB;CACtC,CAAC;;;;ACnCF,IAAa,mBAAb,MAA8B;CAC5B,AAAmB,MAAM,SAAS;CAClC,AAAmB,SAAS,QAAQ,OAAO;CAC3C,AAAmB,iBAAiB,QAAQ,eAAe;CAC3D,AAAmB,uBAAuB,QAAQ,yBAAyB;CAC3E,AAAmB,oBAAoB,QAAQ,0BAA0B;CAEzE,AAAmB,UAAU,MAAM;EACjC,IAAI;EACJ,eAAe;AACb,QAAK,IAAI,KAAK,eAAe,EAC3B,KAAK,GAAG,KAAK,eAAe,SAAS,eACtC,CAAC;;EAEL,CAAC;;;;;;CAOF,AAAmB,QAAQ,MAAM;EAC/B,IAAI;EACJ,UAAU,EAAE,YAAY;AACtB,QAAK,kBAAkB,MAAM,IAAI,MAAM;;EAE1C,CAAC;CAEF,AAAmB,UAAU,OAAO;EAClC,MAAM;EACN,MAAM,eAAe;EACrB,oBAAoB;EACpB,QAAQ;EACT,CAAC;CAEF,AAAmB,gBAAgB,OAAO;EACxC,QAAQ;EACR,MAAM;EACN,QAAQ;EACR,QAAQ,EACN,UAAU,mBACX;EACD,eAAe;AACb,UAAO,KAAK,qBAAqB,aAAa;;EAEjD,CAAC;CAEF,AAAmB,kBAAkB,OAAO;EAC1C,QAAQ;EACR,MAAM;EACN,QAAQ;EACR,QAAQ;GACN,MAAM,EAAE,OAAO;IACb,MAAM,EAAE,MAAM;IACd,OAAO,EAAE,KAAK;IACf,CAAC;GACF,UAAU,EAAE,OAAO,EACjB,SAAS,EAAE,SAAS,EACrB,CAAC;GACH;EACD,UAAU,EAAE,WAAW;GAErB,MAAM,YADQ,KAAK,OAAO,MAAM,SAAS,MAAM,CACvB,MAAM,MAAM,EAAE,KAAK,QAAQ,KAAK,KAAK;AAE7D,OAAI,WAAW;AACb,SAAK,OAAO,MAAM,IAAI,UAAU,MAAM,KAAK,MAAM;AACjD,WAAO,EAAE,SAAS,MAAM;;AAG1B,UAAO,EAAE,SAAS,OAAO;;EAE5B,CAAC;CAMF,AAAmB,YAAY,OAAO;EACpC,QAAQ;EACR,MAAM;EACN,QAAQ;EACR,QAAQ;GACN,OAAO,EAAE,OAAO;IACd,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC;IAC3B,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC;IAC5B,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC;IAC7B,CAAC;GACF,UAAU,EAAE,OAAO;IACjB,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC;IACtB,OAAO,EAAE,SAAS;IACnB,CAAC;GACH;EACD,UAAU,EAAE,YAAY;GACtB,MAAM,aAAa;IAAC;IAAS;IAAS;IAAQ;IAAQ;IAAQ;GAC9D,IAAI,UAAU,KAAK,kBAAkB;AAErC,OAAI,MAAM,OAAO;IACf,MAAM,WAAW,WAAW,QAAQ,MAAM,MAAM,aAAa,CAAC;AAC9D,QAAI,YAAY,EACd,WAAU,QAAQ,QACf,MAAM,WAAW,QAAQ,EAAE,MAAM,IAAI,SACvC;;AAIL,OAAI,MAAM,MAAM;IACd,MAAM,QAAQ,MAAM,KAAK,MAAM,IAAI,CAAC,KAAK,MAAM,EAAE,MAAM,CAAC;AACxD,cAAU,QAAQ,QAAQ,MAAM;AAC9B,SAAI,CAAC,EAAE,QAAQ,OAAO,EAAE,SAAS,SAAU,QAAO;KAClD,MAAM,IAAI,EAAE;AACZ,UAAK,MAAM,KAAK,MACd,KAAI,MAAM,UAAU,MAAM,gBACxB;UAAI,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAU,QAAO;gBAChD,MAAM,QAAQ,MAAM,YAC7B;UAAI,EAAE,SAAS,WAAY,QAAO;gBACzB,EAAE,SAAS,EACpB,QAAO;AAGX,YAAO;MACP;;AAGJ,OAAI,MAAM,OACR,WAAU,QAAQ,QAAQ,MAAM,EAAE,WAAW,MAAM,OAAO;AAG5D,OAAI,MAAM,QAAQ;IAChB,MAAM,QAAQ,MAAM,OAAO,aAAa,CAAC,MAAM,MAAM;AACrD,cAAU,QAAQ,QAAQ,MAAM;KAC9B,MAAM,OAAO,GAAG,EAAE,QAAQ,GAAG,EAAE,OAAO,GAAG,EAAE,UAAU,aAAa;AAClE,YAAO,MAAM,OAAO,SAAS,KAAK,SAAS,KAAK,CAAC;MACjD;;AAGJ,OAAI,MAAM,OAAO;IACf,MAAM,QAAQ,OAAO,MAAM,MAAM;AACjC,QAAI,CAAC,OAAO,MAAM,MAAM,CACtB,WAAU,QAAQ,QAAQ,MAAM,EAAE,aAAa,MAAM;;GAIzD,MAAM,QAAQ,QAAQ;AAGtB,aAAU,QAAQ,SAAS;GAE3B,MAAM,SAAS,MAAM,SAAS,OAAO,MAAM,OAAO,GAAG;GACrD,MAAM,QAAQ,MAAM,QAAQ,OAAO,MAAM,MAAM,GAAG;AAClD,aAAU,QAAQ,MAAM,QAAQ,SAAS,MAAM;AAE/C,UAAO;IAAE,MAAM;IAAS;IAAO;;EAElC,CAAC;CAMF,AAAmB,cAAc,OAAO;EACtC,QAAQ;EACR,MAAM;EACN,QAAQ;EACR,QAAQ;GACN,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;GACtC,OAAO,EAAE,OAAO;IACd,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC;IAC3B,CAAC;GACF,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK,CAAC;GACtC;EACD,SAAS,OAAO,EAAE,QAAQ,YAAY;GACpC,MAAM,OAAO,KAAK,cAAc,OAAO,OAAO;AAC9C,OAAI,CAAC,KACH,QAAO;IAAE,SAAS,EAAE;IAAE,MAAM,EAAE,eAAe,GAAG;IAAE;AAGpD,UAAO,KAAK,SACV;IACE,MAAM,MAAM,OAAO,OAAO,MAAM,KAAK,GAAG;IACxC,MAAM,MAAM,OAAO,OAAO,MAAM,KAAK,GAAG;IACxC,MAAM,MAAM,QAAQ;IACrB,EACD,EAAE,EACF,EAAE,OAAO,MAAM,CAChB;;EAEJ,CAAC;CAEF,AAAmB,gBAAgB,OAAO;EACxC,QAAQ;EACR,MAAM;EACN,QAAQ;EACR,QAAQ;GACN,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;GACtC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK,CAAC;GACjC,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK,CAAC;GACtC;EACD,SAAS,OAAO,EAAE,QAAQ,WAAW;GACnC,MAAM,OAAO,KAAK,cAAc,OAAO,OAAO;AAC9C,OAAI,CAAC,KACH,QAAO,EAAE,OAAO,oBAAoB;AAEtC,UAAO,KAAK,OAAO,KAAK;;EAE3B,CAAC;CAEF,AAAmB,gBAAgB,OAAO;EACxC,QAAQ;EACR,MAAM;EACN,QAAQ;EACR,QAAQ;GACN,QAAQ,EAAE,OAAO;IAAE,QAAQ,EAAE,MAAM;IAAE,IAAI,EAAE,MAAM;IAAE,CAAC;GACpD,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK,CAAC;GACjC,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK,CAAC;GACtC;EACD,SAAS,OAAO,EAAE,QAAQ,WAAW;GACnC,MAAM,OAAO,KAAK,cAAc,OAAO,OAAO;AAC9C,OAAI,CAAC,KACH,QAAO,EAAE,OAAO,oBAAoB;GAGtC,MAAM,UAAU,KAAK,QAAQ,MAAM,OAAO,GAAG;AAC7C,UAAO,KAAK,WAAW,SAAS,KAAK;;EAExC,CAAC;CAEF,AAAmB,gBAAgB,OAAO;EACxC,QAAQ;EACR,MAAM;EACN,QAAQ;EACR,QAAQ;GACN,QAAQ,EAAE,OAAO;IAAE,QAAQ,EAAE,MAAM;IAAE,IAAI,EAAE,MAAM;IAAE,CAAC;GACpD,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK,CAAC;GACtC;EACD,SAAS,OAAO,EAAE,aAAa;GAC7B,MAAM,OAAO,KAAK,cAAc,OAAO,OAAO;AAC9C,OAAI,CAAC,KACH,QAAO,EAAE,OAAO,oBAAoB;GAGtC,MAAM,UAAU,KAAK,QAAQ,MAAM,OAAO,GAAG;AAC7C,UAAO,KAAK,WAAW,QAAQ;;EAElC,CAAC;CAIF,AAAU,cAAc,YAAoB;AAC1C,MAAI;AAGF,UAF2B,KAAK,OAAO,OAAO,mBAAmB,CAChC,iBAAiB,CACrC,MAAM,MAAM,EAAE,OAAO,SAAS,WAAW;UAChD;AACN;;;CAIJ,AAAU,QAAQ,MAAW,OAAgC;EAC3D,MAAM,SAAS,KAAK,GAAG;AACvB,MAAI,QAAQ,SAAS,aAAa,QAAQ,SAAS,SACjD,QAAO,OAAO,MAAM;AAEtB,SAAO;;;;;;;;;;;;;;;;;;;;AC1PX,MAAa,iBAAiB,QAAQ;CACpC,MAAM;CACN,YAAY,EAAE;CACd,UAAU,CAAC,0BAA0B,iBAAiB;CACtD,WAAW,WAAW;AACpB,SAAO,KAAK,aAAa;AACzB,SAAO,KAAK,mBAAmB;AAC/B,SAAO,KAAK,iBAAiB;AAC7B,SAAO,KAAK,yBAAyB;AACrC,SAAO,MAAM,KAAK,uBAAuB,SAAS;;CAErD,CAAC"}
@@ -176,12 +176,21 @@ declare class PrettyFormatterProvider extends LogFormatterProvider {
176
176
  * - Console destination
177
177
  * - Memory destination (for devtools)
178
178
  * - Custom handlers
179
- * - Configuration via `LOG_LEVEL` and `LOG_FORMAT`
179
+ * - Configuration via `LOG_LEVEL`, `LOG_FORMAT`, and `DEBUG`
180
180
  *
181
181
  * @module alepha.logger
182
182
  */
183
183
  declare const AlephaLogger: alepha.Service<alepha.Module>;
184
184
  declare const envSchema: alepha.TObject<{
185
+ /**
186
+ * Enable debug logging for specific modules using the `debug` package convention.
187
+ *
188
+ * @example
189
+ * DEBUG=alepha:* # Enable debug logging for all alepha modules
190
+ * DEBUG=alepha:orm:* # Enable debug logging for alepha.orm modules
191
+ * DEBUG=* # Enable debug logging for all modules
192
+ */
193
+ DEBUG: alepha.TOptional<alepha.TString>;
185
194
  /**
186
195
  * Default log level for the application.
187
196
  *
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/logger/schemas/logEntrySchema.ts","../../src/logger/providers/LogDestinationProvider.ts","../../src/logger/providers/LogFormatterProvider.ts","../../src/logger/services/Logger.ts","../../src/logger/primitives/$logger.ts","../../src/logger/providers/ConsoleColorProvider.ts","../../src/logger/providers/ConsoleDestinationProvider.ts","../../src/logger/providers/JsonFormatterProvider.ts","../../src/logger/providers/MemoryDestinationProvider.ts","../../src/logger/providers/PrettyFormatterProvider.ts","../../src/logger/index.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/logger/schemas/logEntrySchema.ts","../../src/logger/providers/LogDestinationProvider.ts","../../src/logger/providers/LogFormatterProvider.ts","../../src/logger/services/Logger.ts","../../src/logger/primitives/$logger.ts","../../src/logger/providers/ConsoleColorProvider.ts","../../src/logger/providers/ConsoleDestinationProvider.ts","../../src/logger/providers/JsonFormatterProvider.ts","../../src/logger/providers/MemoryDestinationProvider.ts","../../src/logger/providers/PrettyFormatterProvider.ts","../../src/logger/index.ts"],"mappings":"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"}
@@ -274,12 +274,14 @@ var PrettyFormatterProvider = class extends LogFormatterProvider {
274
274
  if (isError) details = this.formatError(data);
275
275
  else if (data) {
276
276
  let error = "";
277
+ let jsonData = data;
277
278
  if ("error" in data && data.error instanceof Error) {
278
279
  error = this.formatError(data.error);
279
- delete data.error;
280
+ const { error: _, ...rest } = data;
281
+ jsonData = rest;
280
282
  }
281
- if (Object.keys(data).length > 0) try {
282
- details = JSON.stringify(data);
283
+ if (Object.keys(jsonData).length > 0) try {
284
+ details = JSON.stringify(jsonData);
283
285
  } catch {
284
286
  details = "[Unserializable Object]";
285
287
  }
@@ -394,7 +396,7 @@ const logEntrySchema = t.object({
394
396
  * - Console destination
395
397
  * - Memory destination (for devtools)
396
398
  * - Custom handlers
397
- * - Configuration via `LOG_LEVEL` and `LOG_FORMAT`
399
+ * - Configuration via `LOG_LEVEL`, `LOG_FORMAT`, and `DEBUG`
398
400
  *
399
401
  * @module alepha.logger
400
402
  */
@@ -412,8 +414,15 @@ const AlephaLogger = $module({
412
414
  ],
413
415
  register: (alepha) => {
414
416
  const env = alepha.parseEnv(envSchema);
417
+ let logLevel = env.LOG_LEVEL;
418
+ let logFormat = env.LOG_FORMAT;
419
+ if (env.DEBUG) {
420
+ const patterns = env.DEBUG.split(",").map((p) => p.trim().replaceAll(":", ".")).filter(Boolean);
421
+ logLevel ??= `${patterns.map((p) => `${p}:debug`).join(",")},info`;
422
+ logFormat ??= "pretty";
423
+ }
415
424
  const getLogDestinationProvider = () => {
416
- if (alepha.isTest() && !env.LOG_LEVEL) {
425
+ if (alepha.isTest() && !logLevel) {
417
426
  const printOnError = (ev) => {
418
427
  if (ev.task?.result?.state === "fail") {
419
428
  const output = alepha.inject(MemoryDestinationProvider);
@@ -429,9 +438,9 @@ const AlephaLogger = $module({
429
438
  return ConsoleDestinationProvider;
430
439
  };
431
440
  const getLogFormatterProvider = () => {
432
- if (env.LOG_FORMAT) {
433
- if (env.LOG_FORMAT === "json") return JsonFormatterProvider;
434
- if (env.LOG_FORMAT === "raw") return RawFormatterProvider;
441
+ if (logFormat) {
442
+ if (logFormat === "json") return JsonFormatterProvider;
443
+ if (logFormat === "raw") return RawFormatterProvider;
435
444
  return PrettyFormatterProvider;
436
445
  }
437
446
  if (alepha.isProduction() && !alepha.isBrowser()) return JsonFormatterProvider;
@@ -451,10 +460,11 @@ const AlephaLogger = $module({
451
460
  lifetime: "transient",
452
461
  args: ["Alepha", "alepha.core"]
453
462
  }));
454
- alepha.store.set("alepha.logger.level", env.LOG_LEVEL ?? (alepha.isTest() ? "trace" : "info"));
463
+ alepha.store.set("alepha.logger.level", logLevel ?? (alepha.isTest() ? "trace" : "info"));
455
464
  }
456
465
  });
457
466
  const envSchema = t.object({
467
+ DEBUG: t.optional(t.text({ description: "Enable debug logging for specific modules using the debug package convention. Example: DEBUG=alepha:*" })),
458
468
  LOG_LEVEL: t.optional(t.text({
459
469
  description: `Application log level on startup.
460
470
  Levels are: trace, debug, info, warn, error, silent