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,4 @@
1
1
  import type { TArray, TObject, TSchema, TUnion } from "typebox";
2
- import { AlephaError } from "../errors/AlephaError.ts";
3
2
  import { $hook } from "../primitives/$hook.ts";
4
3
  import { SchemaCodec } from "./SchemaCodec.ts";
5
4
  import { type Static, t } from "./TypeProvider.ts";
@@ -18,9 +17,6 @@ import { type Static, t } from "./TypeProvider.ts";
18
17
  // Keyless: ["Alice",30,true] (17 bytes)
19
18
  // =============================================================================
20
19
 
21
- // Security: Keys that could enable prototype pollution attacks
22
- const UNSAFE_KEYS = new Set(["__proto__", "constructor", "prototype"]);
23
-
24
20
  export interface KeylessCodec<T = any> {
25
21
  encode: (value: T) => string;
26
22
  decode: (str: string) => T;
@@ -34,30 +30,6 @@ export interface KeylessCodecOptions {
34
30
  * @default Auto-detected: false in browser (CSP compatibility), true on server
35
31
  */
36
32
  useFunctionCompilation?: boolean;
37
-
38
- /**
39
- * Maximum allowed array length during encoding/decoding.
40
- * Prevents DoS attacks via large arrays.
41
- *
42
- * @default 10000
43
- */
44
- maxArrayLength?: number;
45
-
46
- /**
47
- * Maximum allowed string length during encoding/decoding.
48
- * Prevents DoS attacks via large strings.
49
- *
50
- * @default 1000000 (1MB)
51
- */
52
- maxStringLength?: number;
53
-
54
- /**
55
- * Maximum recursion depth for nested objects.
56
- * Prevents stack overflow attacks.
57
- *
58
- * @default 50
59
- */
60
- maxDepth?: number;
61
33
  }
62
34
 
63
35
  /**
@@ -71,12 +43,7 @@ export class KeylessJsonSchemaCodec extends SchemaCodec {
71
43
  protected readonly textEncoder = new TextEncoder();
72
44
  protected readonly textDecoder = new TextDecoder();
73
45
  protected varCounter = 0;
74
-
75
- // Options with defaults
76
46
  protected useFunctionCompilation = true;
77
- protected maxArrayLength = 10000;
78
- protected maxStringLength = 1000000;
79
- protected maxDepth = 50;
80
47
 
81
48
  /**
82
49
  * Configure codec options.
@@ -86,15 +53,6 @@ export class KeylessJsonSchemaCodec extends SchemaCodec {
86
53
  this.useFunctionCompilation = options.useFunctionCompilation;
87
54
  this.cache.clear(); // Clear cache when compilation mode changes
88
55
  }
89
- if (options.maxArrayLength !== undefined) {
90
- this.maxArrayLength = options.maxArrayLength;
91
- }
92
- if (options.maxStringLength !== undefined) {
93
- this.maxStringLength = options.maxStringLength;
94
- }
95
- if (options.maxDepth !== undefined) {
96
- this.maxDepth = options.maxDepth;
97
- }
98
56
  return this;
99
57
  }
100
58
 
@@ -152,10 +110,6 @@ export class KeylessJsonSchemaCodec extends SchemaCodec {
152
110
  return value as T;
153
111
  }
154
112
 
155
- // ===========================================================================
156
- // Security Validation
157
- // ===========================================================================
158
-
159
113
  /**
160
114
  * Test if `new Function()` is available (not blocked by CSP).
161
115
  */
@@ -168,72 +122,6 @@ export class KeylessJsonSchemaCodec extends SchemaCodec {
168
122
  }
169
123
  }
170
124
 
171
- /**
172
- * Validate schema keys for prototype pollution.
173
- * Uses a visited set to avoid infinite recursion on recursive schemas.
174
- */
175
- protected validateSchemaKeys(
176
- schema: TSchema,
177
- depth = 0,
178
- visited = new Set<TSchema>(),
179
- ): void {
180
- // Avoid infinite recursion on recursive schemas
181
- if (visited.has(schema)) {
182
- return;
183
- }
184
- visited.add(schema);
185
-
186
- if (depth > this.maxDepth) {
187
- throw new AlephaError(
188
- `Schema depth exceeds maximum allowed (${this.maxDepth})`,
189
- );
190
- }
191
-
192
- if (t.schema.isObject(schema)) {
193
- const objSchema = schema as TObject;
194
- const props = objSchema.properties as Record<string, TSchema>;
195
-
196
- for (const key of Object.keys(props)) {
197
- if (UNSAFE_KEYS.has(key)) {
198
- throw new AlephaError(
199
- `Unsafe schema key "${key}" detected. This key is blocked to prevent prototype pollution.`,
200
- );
201
- }
202
- // Depth increases for object properties
203
- this.validateSchemaKeys(props[key], depth + 1, visited);
204
- }
205
- } else if (t.schema.isArray(schema)) {
206
- const arrSchema = schema as TArray;
207
- // Depth increases for array items
208
- this.validateSchemaKeys(arrSchema.items, depth + 1, visited);
209
- } else if (t.schema.isUnion(schema) || t.schema.isOptional(schema)) {
210
- // Optional/union wrappers don't increase depth - they're type modifiers
211
- this.validateSchemaKeys(this.unwrap(schema), depth, visited);
212
- }
213
- }
214
-
215
- /**
216
- * Validate array length.
217
- */
218
- protected validateArrayLength(arr: unknown[]): void {
219
- if (arr.length > this.maxArrayLength) {
220
- throw new AlephaError(
221
- `Array length (${arr.length}) exceeds maximum allowed (${this.maxArrayLength})`,
222
- );
223
- }
224
- }
225
-
226
- /**
227
- * Validate string length.
228
- */
229
- protected validateStringLength(str: string): void {
230
- if (str.length > this.maxStringLength) {
231
- throw new AlephaError(
232
- `String length (${str.length}) exceeds maximum allowed (${this.maxStringLength})`,
233
- );
234
- }
235
- }
236
-
237
125
  // ===========================================================================
238
126
  // Codec Compilation
239
127
  // ===========================================================================
@@ -493,12 +381,14 @@ export class KeylessJsonSchemaCodec extends SchemaCodec {
493
381
  for (const { key, isOpt, isNullable, inner } of this.getObjectFields(
494
382
  schema as TObject,
495
383
  )) {
496
- const innerEnc = this.genEnc(inner, `${ve}.${key}`);
384
+ const sk = JSON.stringify(key);
385
+ const access = `${ve}[${sk}]`;
386
+ const innerEnc = this.genEnc(inner, access);
497
387
 
498
388
  if (isOpt) {
499
- parts.push(`${ve}.${key}!==undefined?${innerEnc}:null`);
389
+ parts.push(`${access}!==undefined?${innerEnc}:null`);
500
390
  } else if (isNullable) {
501
- parts.push(`${ve}.${key}!==null?${innerEnc}:null`);
391
+ parts.push(`${access}!==null?${innerEnc}:null`);
502
392
  } else {
503
393
  parts.push(innerEnc);
504
394
  }
@@ -557,32 +447,35 @@ export class KeylessJsonSchemaCodec extends SchemaCodec {
557
447
  );
558
448
 
559
449
  if (simple) {
560
- const fieldExprs = fields.map(({ key }) => `${key}:a[i++]`);
450
+ const fieldExprs = fields.map(
451
+ ({ key }) => `${JSON.stringify(key)}:a[i++]`,
452
+ );
561
453
  return { code: "", result: `{${fieldExprs.join(",")}}` };
562
454
  }
563
455
 
564
456
  let code = `const ${v}={};`;
565
457
  for (const { key, isOpt, isNullable, inner } of fields) {
458
+ const sk = JSON.stringify(key);
566
459
  if (isOpt) {
567
460
  const nested = this.genDecFromValue(inner, "t");
568
- code += `{const t=a[i++];if(t!==null){${v}.${key}=${nested};}}`;
461
+ code += `{const t=a[i++];if(t!==null){${v}[${sk}]=${nested};}}`;
569
462
  } else if (isNullable) {
570
463
  const nested = this.genDecFromValue(inner, "t");
571
- code += `{const t=a[i++];if(t===null){${v}.${key}=null;}else{${v}.${key}=${nested};}}`;
464
+ code += `{const t=a[i++];if(t===null){${v}[${sk}]=null;}else{${v}[${sk}]=${nested};}}`;
572
465
  } else if (t.schema.isObject(inner)) {
573
466
  const nested = this.genDecFromValue(inner, "a[i++]");
574
- code += `${v}.${key}=${nested};`;
467
+ code += `${v}[${sk}]=${nested};`;
575
468
  } else if (t.schema.isArray(inner)) {
576
469
  // Handle arrays - check if items need transformation
577
470
  const arrSchema = inner as TArray;
578
471
  if (t.schema.isObject(arrSchema.items)) {
579
472
  const itemTransform = this.genDecFromValue(arrSchema.items, "e");
580
- code += `${v}.${key}=a[i++].map(e=>${itemTransform});`;
473
+ code += `${v}[${sk}]=a[i++].map(e=>${itemTransform});`;
581
474
  } else {
582
- code += `${v}.${key}=a[i++];`;
475
+ code += `${v}[${sk}]=a[i++];`;
583
476
  }
584
477
  } else {
585
- code += `${v}.${key}=a[i++];`;
478
+ code += `${v}[${sk}]=a[i++];`;
586
479
  }
587
480
  }
588
481
 
@@ -620,13 +513,14 @@ export class KeylessJsonSchemaCodec extends SchemaCodec {
620
513
  const fields = keys.map((k, idx) => {
621
514
  const inner = this.unwrap(props[k]);
622
515
  const innerExpr = `${v}[${idx}]`;
516
+ const sk = JSON.stringify(k);
623
517
  if (t.schema.isObject(inner)) {
624
- return `${k}:${this.genDecFromValue(inner, innerExpr)}`;
518
+ return `${sk}:${this.genDecFromValue(inner, innerExpr)}`;
625
519
  }
626
520
  if (t.schema.isBigInt(inner)) {
627
- return `${k}:BigInt(${innerExpr}.slice(0,-1))`;
521
+ return `${sk}:BigInt(${innerExpr}.slice(0,-1))`;
628
522
  }
629
- return `${k}:${innerExpr}`;
523
+ return `${sk}:${innerExpr}`;
630
524
  });
631
525
  return `((${v}=${expr})=>({${fields.join(",")}}))()`;
632
526
  }
@@ -209,6 +209,42 @@ describe("SchemaValidator", () => {
209
209
  expect(result.tags).toEqual(["tag1", "tag2"]);
210
210
  });
211
211
 
212
+ test("should unwrap optional arrays and preprocess items", async ({
213
+ expect,
214
+ }) => {
215
+ const alepha = Alepha.create();
216
+ const validator = alepha.inject(SchemaValidator);
217
+
218
+ const schema = t.object({
219
+ tags: t.optional(t.array(t.text({ trim: true }))),
220
+ });
221
+
222
+ const data = {
223
+ tags: [" tag1 ", " tag2 "],
224
+ };
225
+
226
+ const result = validator.validate(schema, data);
227
+ expect(result.tags).toEqual(["tag1", "tag2"]);
228
+ });
229
+
230
+ test("should unwrap nullable arrays and preprocess items", async ({
231
+ expect,
232
+ }) => {
233
+ const alepha = Alepha.create();
234
+ const validator = alepha.inject(SchemaValidator);
235
+
236
+ const schema = t.object({
237
+ tags: t.union([t.array(t.text({ trim: true })), t.null()]),
238
+ });
239
+
240
+ const data = {
241
+ tags: [" tag1 ", " tag2 "],
242
+ };
243
+
244
+ const result = validator.validate(schema, data);
245
+ expect(result.tags).toEqual(["tag1", "tag2"]);
246
+ });
247
+
212
248
  test("should delete undefined values when option is enabled", async ({
213
249
  expect,
214
250
  }) => {
@@ -67,6 +67,15 @@ export class SchemaValidator {
67
67
  return undefined;
68
68
  }
69
69
 
70
+ // Unwrap optional/union to access the inner type schema (e.g. array items, object properties).
71
+ // Must happen after the null check above which needs the original schema for nullability.
72
+ if (!schema.type && schema.anyOf) {
73
+ schema =
74
+ schema.anyOf.find(
75
+ (s: any) => s.type !== "null" && s.type !== "undefined",
76
+ ) || schema;
77
+ }
78
+
70
79
  if (Array.isArray(value)) {
71
80
  return value.map((it) => this.beforeParse(schema.items, it, options));
72
81
  }
@@ -1,7 +1,9 @@
1
1
  import { $module } from "alepha";
2
2
  import { CryptoProvider } from "./providers/CryptoProvider.ts";
3
+ import { SecretProvider } from "./providers/SecretProvider.ts";
3
4
 
4
5
  export * from "./providers/CryptoProvider.ts";
6
+ export * from "./providers/SecretProvider.ts";
5
7
 
6
8
  /**
7
9
  * Cryptographic utilities: hashing, HMAC, AES-256-GCM encryption, password hashing, and secure random generation.
@@ -10,5 +12,8 @@ export * from "./providers/CryptoProvider.ts";
10
12
  */
11
13
  export const AlephaCrypto = $module({
12
14
  name: "alepha.crypto",
13
- services: [CryptoProvider],
15
+ services: [CryptoProvider, SecretProvider],
16
+ register: (alepha) => {
17
+ alepha.with(CryptoProvider);
18
+ },
14
19
  });
@@ -0,0 +1,36 @@
1
+ import { $env, $hook, $inject, Alepha, t } from "alepha";
2
+ import { $logger } from "alepha/logger";
3
+
4
+ export const DEFAULT_SECRET_KEY_VALUE = "change-me-in-production";
5
+
6
+ export const alephaSecretEnvSchema = t.object({
7
+ APP_SECRET: t.text({
8
+ default: DEFAULT_SECRET_KEY_VALUE,
9
+ description:
10
+ "The secret key used for signing JWTs, encrypting cookies, and other security features.",
11
+ }),
12
+ });
13
+
14
+ export class SecretProvider {
15
+ protected readonly log = $logger();
16
+ protected readonly alepha = $inject(Alepha);
17
+ protected readonly env = $env(alephaSecretEnvSchema);
18
+
19
+ public get secretKey(): string {
20
+ return this.env.APP_SECRET;
21
+ }
22
+
23
+ protected readonly configure = $hook({
24
+ on: "configure",
25
+ handler: async () => {
26
+ if (
27
+ this.secretKey === DEFAULT_SECRET_KEY_VALUE &&
28
+ this.alepha.isProduction()
29
+ ) {
30
+ this.log.warn(
31
+ "Using default secret key. Please set a secure APP_SECRET environment variable.",
32
+ );
33
+ }
34
+ },
35
+ });
36
+ }
@@ -30,10 +30,8 @@ export class DevToolsProvider {
30
30
  */
31
31
  protected readonly onLog = $hook({
32
32
  on: "log",
33
- handler: ({ message, entry }) => {
34
- if (message) {
35
- this.memoryDestination.write(message, entry);
36
- }
33
+ handler: ({ entry }) => {
34
+ this.memoryDestination.write("", entry);
37
35
  },
38
36
  });
39
37
 
@@ -106,15 +104,8 @@ export class DevToolsProvider {
106
104
  }),
107
105
  },
108
106
  handler: ({ query }) => {
109
- let memoryProvider: MemoryDestinationProvider;
110
- try {
111
- memoryProvider = this.alepha.inject(MemoryDestinationProvider);
112
- } catch {
113
- return { logs: [], total: 0 };
114
- }
115
-
116
107
  const levelOrder = ["TRACE", "DEBUG", "INFO", "WARN", "ERROR"];
117
- let entries = memoryProvider.logs;
108
+ let entries = this.memoryDestination.logs;
118
109
 
119
110
  if (query.level) {
120
111
  const minIndex = levelOrder.indexOf(query.level.toUpperCase());
@@ -37,7 +37,7 @@ export * from "./services/Logger.ts";
37
37
  * - Console destination
38
38
  * - Memory destination (for devtools)
39
39
  * - Custom handlers
40
- * - Configuration via `LOG_LEVEL` and `LOG_FORMAT`
40
+ * - Configuration via `LOG_LEVEL`, `LOG_FORMAT`, and `DEBUG`
41
41
  *
42
42
  * @module alepha.logger
43
43
  */
@@ -56,10 +56,22 @@ export const AlephaLogger = $module({
56
56
  register: (alepha) => {
57
57
  const env = alepha.parseEnv(envSchema);
58
58
 
59
+ // Support DEBUG env var (debug package convention) as shorthand for LOG_LEVEL/LOG_FORMAT.
60
+ // DEBUG=alepha:* → LOG_LEVEL=alepha.*:debug,info LOG_FORMAT=pretty
61
+ let logLevel = env.LOG_LEVEL;
62
+ let logFormat = env.LOG_FORMAT;
63
+ if (env.DEBUG) {
64
+ const patterns = env.DEBUG.split(",")
65
+ .map((p) => p.trim().replaceAll(":", "."))
66
+ .filter(Boolean);
67
+ logLevel ??= `${patterns.map((p) => `${p}:debug`).join(",")},info`;
68
+ logFormat ??= "pretty";
69
+ }
70
+
59
71
  const getLogDestinationProvider = () => {
60
72
  // in test mode, if no LOG_LEVEL is set, use MemoryDestinationProvider to capture logs for inspection.
61
73
  // logs will be printed to console only if the test fails.
62
- if (alepha.isTest() && !env.LOG_LEVEL) {
74
+ if (alepha.isTest() && !logLevel) {
63
75
  const printOnError = (ev: any) => {
64
76
  if (ev.task?.result?.state === "fail") {
65
77
  const output = alepha.inject(MemoryDestinationProvider);
@@ -83,11 +95,11 @@ export const AlephaLogger = $module({
83
95
  };
84
96
 
85
97
  const getLogFormatterProvider = () => {
86
- if (env.LOG_FORMAT) {
87
- if (env.LOG_FORMAT === "json") {
98
+ if (logFormat) {
99
+ if (logFormat === "json") {
88
100
  return JsonFormatterProvider;
89
101
  }
90
- if (env.LOG_FORMAT === "raw") {
102
+ if (logFormat === "raw") {
91
103
  return RawFormatterProvider;
92
104
  }
93
105
  return PrettyFormatterProvider;
@@ -122,7 +134,7 @@ export const AlephaLogger = $module({
122
134
 
123
135
  alepha.store.set(
124
136
  "alepha.logger.level",
125
- env.LOG_LEVEL ?? (alepha.isTest() ? "trace" : "info"),
137
+ logLevel ?? (alepha.isTest() ? "trace" : "info"),
126
138
  );
127
139
  },
128
140
  });
@@ -130,6 +142,21 @@ export const AlephaLogger = $module({
130
142
  // ---------------------------------------------------------------------------------------------------------------------
131
143
 
132
144
  const envSchema = t.object({
145
+ /**
146
+ * Enable debug logging for specific modules using the `debug` package convention.
147
+ *
148
+ * @example
149
+ * DEBUG=alepha:* # Enable debug logging for all alepha modules
150
+ * DEBUG=alepha:orm:* # Enable debug logging for alepha.orm modules
151
+ * DEBUG=* # Enable debug logging for all modules
152
+ */
153
+ DEBUG: t.optional(
154
+ t.text({
155
+ description:
156
+ "Enable debug logging for specific modules using the debug package convention. Example: DEBUG=alepha:*",
157
+ }),
158
+ ),
159
+
133
160
  /**
134
161
  * Default log level for the application.
135
162
  *
@@ -18,14 +18,16 @@ export class PrettyFormatterProvider extends LogFormatterProvider {
18
18
  details = this.formatError(data);
19
19
  } else if (data) {
20
20
  let error = "";
21
+ let jsonData = data;
21
22
  if ("error" in data && data.error instanceof Error) {
22
23
  error = this.formatError(data.error);
23
- delete data.error;
24
+ const { error: _, ...rest } = data;
25
+ jsonData = rest;
24
26
  }
25
27
 
26
- if (Object.keys(data).length > 0) {
28
+ if (Object.keys(jsonData).length > 0) {
27
29
  try {
28
- details = JSON.stringify(data);
30
+ details = JSON.stringify(jsonData);
29
31
  } catch {
30
32
  details = "[Unserializable Object]";
31
33
  }