alepha 0.21.2 → 0.23.0

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 (519) hide show
  1. package/README.md +0 -1
  2. package/dist/api/audits/index.browser.js.map +1 -1
  3. package/dist/api/audits/index.d.ts +393 -403
  4. package/dist/api/audits/index.d.ts.map +1 -1
  5. package/dist/api/audits/index.js +25 -56
  6. package/dist/api/audits/index.js.map +1 -1
  7. package/dist/api/files/index.browser.js +31 -1
  8. package/dist/api/files/index.browser.js.map +1 -1
  9. package/dist/api/files/index.d.ts +313 -208
  10. package/dist/api/files/index.d.ts.map +1 -1
  11. package/dist/api/files/index.js +152 -42
  12. package/dist/api/files/index.js.map +1 -1
  13. package/dist/api/jobs/index.browser.js +2 -2
  14. package/dist/api/jobs/index.browser.js.map +1 -1
  15. package/dist/api/jobs/index.d.ts +282 -285
  16. package/dist/api/jobs/index.d.ts.map +1 -1
  17. package/dist/api/jobs/index.js +39 -33
  18. package/dist/api/jobs/index.js.map +1 -1
  19. package/dist/api/keys/index.d.ts +217 -222
  20. package/dist/api/keys/index.d.ts.map +1 -1
  21. package/dist/api/keys/index.js.map +1 -1
  22. package/dist/api/notifications/index.browser.js.map +1 -1
  23. package/dist/api/notifications/index.d.ts +188 -195
  24. package/dist/api/notifications/index.d.ts.map +1 -1
  25. package/dist/api/notifications/index.js.map +1 -1
  26. package/dist/api/oauth/index.d.ts +71 -76
  27. package/dist/api/oauth/index.d.ts.map +1 -1
  28. package/dist/api/oauth/index.js.map +1 -1
  29. package/dist/api/organizations/index.browser.js.map +1 -1
  30. package/dist/api/organizations/index.d.ts +104 -109
  31. package/dist/api/organizations/index.d.ts.map +1 -1
  32. package/dist/api/organizations/index.js.map +1 -1
  33. package/dist/api/parameters/index.browser.js +43 -16
  34. package/dist/api/parameters/index.browser.js.map +1 -1
  35. package/dist/api/parameters/index.d.ts +488 -344
  36. package/dist/api/parameters/index.d.ts.map +1 -1
  37. package/dist/api/parameters/index.js +175 -35
  38. package/dist/api/parameters/index.js.map +1 -1
  39. package/dist/api/payments/index.d.ts +396 -402
  40. package/dist/api/payments/index.d.ts.map +1 -1
  41. package/dist/api/payments/index.js.map +1 -1
  42. package/dist/api/subscriptions/index.d.ts +644 -652
  43. package/dist/api/subscriptions/index.d.ts.map +1 -1
  44. package/dist/api/subscriptions/index.js +1 -1
  45. package/dist/api/subscriptions/index.js.map +1 -1
  46. package/dist/api/users/index.browser.js +7 -0
  47. package/dist/api/users/index.browser.js.map +1 -1
  48. package/dist/api/users/index.d.ts +1106 -1005
  49. package/dist/api/users/index.d.ts.map +1 -1
  50. package/dist/api/users/index.js +307 -64
  51. package/dist/api/users/index.js.map +1 -1
  52. package/dist/api/verifications/index.browser.js.map +1 -1
  53. package/dist/api/verifications/index.d.ts +137 -143
  54. package/dist/api/verifications/index.d.ts.map +1 -1
  55. package/dist/api/verifications/index.js.map +1 -1
  56. package/dist/background/index.d.ts +95 -0
  57. package/dist/background/index.d.ts.map +1 -0
  58. package/dist/background/index.js +121 -0
  59. package/dist/background/index.js.map +1 -0
  60. package/dist/background/index.workerd.js +110 -0
  61. package/dist/background/index.workerd.js.map +1 -0
  62. package/dist/batch/index.d.ts +5 -7
  63. package/dist/batch/index.d.ts.map +1 -1
  64. package/dist/batch/index.js.map +1 -1
  65. package/dist/bin/index.js.map +1 -1
  66. package/dist/bucket/index.d.ts +76 -54
  67. package/dist/bucket/index.d.ts.map +1 -1
  68. package/dist/bucket/index.js +58 -11
  69. package/dist/bucket/index.js.map +1 -1
  70. package/dist/bucket/index.workerd.js +200 -5
  71. package/dist/bucket/index.workerd.js.map +1 -1
  72. package/dist/cache/core/index.d.ts +7 -10
  73. package/dist/cache/core/index.d.ts.map +1 -1
  74. package/dist/cache/core/index.js.map +1 -1
  75. package/dist/cache/core/index.workerd.js.map +1 -1
  76. package/dist/cache/database/index.d.ts +22 -26
  77. package/dist/cache/database/index.d.ts.map +1 -1
  78. package/dist/cache/database/index.js.map +1 -1
  79. package/dist/cache/redis/index.d.ts +4 -7
  80. package/dist/cache/redis/index.d.ts.map +1 -1
  81. package/dist/cache/redis/index.js.map +1 -1
  82. package/dist/captcha/index.d.ts +3 -6
  83. package/dist/captcha/index.d.ts.map +1 -1
  84. package/dist/captcha/index.js.map +1 -1
  85. package/dist/cli/config/index.d.ts.map +1 -1
  86. package/dist/cli/config/index.js.map +1 -1
  87. package/dist/cli/core/index.d.ts +458 -249
  88. package/dist/cli/core/index.d.ts.map +1 -1
  89. package/dist/cli/core/index.js +372 -660
  90. package/dist/cli/core/index.js.map +1 -1
  91. package/dist/cli/devtools/index.d.ts +3 -5
  92. package/dist/cli/devtools/index.d.ts.map +1 -1
  93. package/dist/cli/devtools/index.js.map +1 -1
  94. package/dist/cli/i18n/index.d.ts +20 -17
  95. package/dist/cli/i18n/index.d.ts.map +1 -1
  96. package/dist/cli/i18n/index.js +45 -11
  97. package/dist/cli/i18n/index.js.map +1 -1
  98. package/dist/cli/platform/index.d.ts +126 -1342
  99. package/dist/cli/platform/index.d.ts.map +1 -1
  100. package/dist/cli/platform/index.js +136 -2374
  101. package/dist/cli/platform/index.js.map +1 -1
  102. package/dist/cli/platform-lib/index.d.ts +1472 -0
  103. package/dist/cli/platform-lib/index.d.ts.map +1 -0
  104. package/dist/cli/platform-lib/index.js +2660 -0
  105. package/dist/cli/platform-lib/index.js.map +1 -0
  106. package/dist/cli/vendor/index.d.ts +17 -21
  107. package/dist/cli/vendor/index.d.ts.map +1 -1
  108. package/dist/cli/vendor/index.js.map +1 -1
  109. package/dist/command/index.d.ts +20 -19
  110. package/dist/command/index.d.ts.map +1 -1
  111. package/dist/command/index.js +39 -10
  112. package/dist/command/index.js.map +1 -1
  113. package/dist/{containers → container}/core/index.d.ts +13 -15
  114. package/dist/container/core/index.d.ts.map +1 -0
  115. package/dist/{containers → container}/core/index.js +23 -14
  116. package/dist/container/core/index.js.map +1 -0
  117. package/dist/{containers → container}/core/index.workerd.js +37 -22
  118. package/dist/container/core/index.workerd.js.map +1 -0
  119. package/dist/core/index.browser.js +27 -1
  120. package/dist/core/index.browser.js.map +1 -1
  121. package/dist/core/index.d.ts +48 -24
  122. package/dist/core/index.d.ts.map +1 -1
  123. package/dist/core/index.js +27 -1
  124. package/dist/core/index.js.map +1 -1
  125. package/dist/core/index.native.js +27 -1
  126. package/dist/core/index.native.js.map +1 -1
  127. package/dist/core/index.workerd.js +27 -1
  128. package/dist/core/index.workerd.js.map +1 -1
  129. package/dist/crypto/index.browser.js.map +1 -1
  130. package/dist/crypto/index.d.ts +5 -8
  131. package/dist/crypto/index.d.ts.map +1 -1
  132. package/dist/crypto/index.js.map +1 -1
  133. package/dist/datetime/index.d.ts +3 -4
  134. package/dist/datetime/index.d.ts.map +1 -1
  135. package/dist/datetime/index.js.map +1 -1
  136. package/dist/email/brevo/index.d.ts +2 -4
  137. package/dist/email/brevo/index.d.ts.map +1 -1
  138. package/dist/email/brevo/index.js.map +1 -1
  139. package/dist/email/cloudflare/index.d.ts +20 -7
  140. package/dist/email/cloudflare/index.d.ts.map +1 -1
  141. package/dist/email/cloudflare/index.js +46 -9
  142. package/dist/email/cloudflare/index.js.map +1 -1
  143. package/dist/email/core/index.d.ts +6 -9
  144. package/dist/email/core/index.d.ts.map +1 -1
  145. package/dist/email/core/index.js.map +1 -1
  146. package/dist/email/core/index.workerd.js.map +1 -1
  147. package/dist/email/smtp/index.d.ts +10 -13
  148. package/dist/email/smtp/index.d.ts.map +1 -1
  149. package/dist/email/smtp/index.js +107 -32
  150. package/dist/email/smtp/index.js.map +1 -1
  151. package/dist/fake/index.d.ts +1 -2
  152. package/dist/fake/index.d.ts.map +1 -1
  153. package/dist/fake/index.js.map +1 -1
  154. package/dist/lock/core/index.d.ts +9 -14
  155. package/dist/lock/core/index.d.ts.map +1 -1
  156. package/dist/lock/core/index.js.map +1 -1
  157. package/dist/lock/redis/index.d.ts +2 -4
  158. package/dist/lock/redis/index.d.ts.map +1 -1
  159. package/dist/lock/redis/index.js.map +1 -1
  160. package/dist/logger/index.d.ts +105 -76
  161. package/dist/logger/index.d.ts.map +1 -1
  162. package/dist/logger/index.js +196 -174
  163. package/dist/logger/index.js.map +1 -1
  164. package/dist/mcp/index.d.ts +25 -20
  165. package/dist/mcp/index.d.ts.map +1 -1
  166. package/dist/mcp/index.js +23 -0
  167. package/dist/mcp/index.js.map +1 -1
  168. package/dist/orm/core/index.browser.js.map +1 -1
  169. package/dist/orm/core/index.bun.js +19 -1
  170. package/dist/orm/core/index.bun.js.map +1 -1
  171. package/dist/orm/core/index.d.ts +76 -62
  172. package/dist/orm/core/index.d.ts.map +1 -1
  173. package/dist/orm/core/index.js +20 -2
  174. package/dist/orm/core/index.js.map +1 -1
  175. package/dist/orm/postgres/index.bun.js.map +1 -1
  176. package/dist/orm/postgres/index.d.ts +28 -20
  177. package/dist/orm/postgres/index.d.ts.map +1 -1
  178. package/dist/orm/postgres/index.js.map +1 -1
  179. package/dist/queue/core/index.d.ts +12 -15
  180. package/dist/queue/core/index.d.ts.map +1 -1
  181. package/dist/queue/core/index.js.map +1 -1
  182. package/dist/queue/core/index.workerd.js.map +1 -1
  183. package/dist/queue/redis/index.d.ts +3 -5
  184. package/dist/queue/redis/index.d.ts.map +1 -1
  185. package/dist/queue/redis/index.js.map +1 -1
  186. package/dist/react/auth/index.browser.js +9 -2
  187. package/dist/react/auth/index.browser.js.map +1 -1
  188. package/dist/react/auth/index.d.ts +14 -9
  189. package/dist/react/auth/index.d.ts.map +1 -1
  190. package/dist/react/auth/index.js +9 -2
  191. package/dist/react/auth/index.js.map +1 -1
  192. package/dist/react/core/index.d.ts +7 -8
  193. package/dist/react/core/index.d.ts.map +1 -1
  194. package/dist/react/core/index.js +6 -3
  195. package/dist/react/core/index.js.map +1 -1
  196. package/dist/react/form/index.d.ts +2 -5
  197. package/dist/react/form/index.d.ts.map +1 -1
  198. package/dist/react/form/index.js +16 -15
  199. package/dist/react/form/index.js.map +1 -1
  200. package/dist/react/head/index.browser.js.map +1 -1
  201. package/dist/react/head/index.d.ts +2 -4
  202. package/dist/react/head/index.d.ts.map +1 -1
  203. package/dist/react/head/index.js.map +1 -1
  204. package/dist/react/i18n/index.d.ts +90 -11
  205. package/dist/react/i18n/index.d.ts.map +1 -1
  206. package/dist/react/i18n/index.js +147 -11
  207. package/dist/react/i18n/index.js.map +1 -1
  208. package/dist/react/intro/index.d.ts +1 -2
  209. package/dist/react/intro/index.d.ts.map +1 -1
  210. package/dist/react/intro/index.js +2 -2
  211. package/dist/react/intro/index.js.map +1 -1
  212. package/dist/react/router/index.browser.js +193 -24
  213. package/dist/react/router/index.browser.js.map +1 -1
  214. package/dist/react/router/index.d.ts +434 -222
  215. package/dist/react/router/index.d.ts.map +1 -1
  216. package/dist/react/router/index.js +249 -35
  217. package/dist/react/router/index.js.map +1 -1
  218. package/dist/react/sitemap/index.browser.js +35 -0
  219. package/dist/react/sitemap/index.browser.js.map +1 -0
  220. package/dist/react/sitemap/index.d.ts +92 -0
  221. package/dist/react/sitemap/index.d.ts.map +1 -0
  222. package/dist/react/sitemap/index.js +131 -0
  223. package/dist/react/sitemap/index.js.map +1 -0
  224. package/dist/react/testing/index.d.ts +1 -2
  225. package/dist/react/testing/index.d.ts.map +1 -1
  226. package/dist/react/testing/index.js +16 -17
  227. package/dist/react/testing/index.js.map +1 -1
  228. package/dist/react/ui/index.d.ts +20 -25
  229. package/dist/react/ui/index.d.ts.map +1 -1
  230. package/dist/react/ui/index.js.map +1 -1
  231. package/dist/redis/index.bun.js.map +1 -1
  232. package/dist/redis/index.d.ts +17 -19
  233. package/dist/redis/index.d.ts.map +1 -1
  234. package/dist/redis/index.js.map +1 -1
  235. package/dist/retry/index.d.ts +2 -4
  236. package/dist/retry/index.d.ts.map +1 -1
  237. package/dist/retry/index.js.map +1 -1
  238. package/dist/router/index.d.ts.map +1 -1
  239. package/dist/router/index.js.map +1 -1
  240. package/dist/scheduler/index.d.ts +10 -13
  241. package/dist/scheduler/index.d.ts.map +1 -1
  242. package/dist/scheduler/index.js.map +1 -1
  243. package/dist/scheduler/index.workerd.js.map +1 -1
  244. package/dist/security/index.browser.js.map +1 -1
  245. package/dist/security/index.d.ts +45 -48
  246. package/dist/security/index.d.ts.map +1 -1
  247. package/dist/security/index.js.map +1 -1
  248. package/dist/server/auth/index.browser.js.map +1 -1
  249. package/dist/server/auth/index.d.ts +272 -173
  250. package/dist/server/auth/index.d.ts.map +1 -1
  251. package/dist/server/auth/index.js +1608 -15
  252. package/dist/server/auth/index.js.map +1 -1
  253. package/dist/server/cookies/index.browser.js.map +1 -1
  254. package/dist/server/cookies/index.d.ts +20 -7
  255. package/dist/server/cookies/index.d.ts.map +1 -1
  256. package/dist/server/cookies/index.js +22 -3
  257. package/dist/server/cookies/index.js.map +1 -1
  258. package/dist/server/core/index.browser.js.map +1 -1
  259. package/dist/server/core/index.d.ts +106 -73
  260. package/dist/server/core/index.d.ts.map +1 -1
  261. package/dist/server/core/index.js +44 -0
  262. package/dist/server/core/index.js.map +1 -1
  263. package/dist/server/cors/index.d.ts +11 -14
  264. package/dist/server/cors/index.d.ts.map +1 -1
  265. package/dist/server/cors/index.js.map +1 -1
  266. package/dist/server/etag/index.d.ts +6 -9
  267. package/dist/server/etag/index.d.ts.map +1 -1
  268. package/dist/server/etag/index.js.map +1 -1
  269. package/dist/server/health/index.d.ts +18 -21
  270. package/dist/server/health/index.d.ts.map +1 -1
  271. package/dist/server/health/index.js.map +1 -1
  272. package/dist/server/links/index.browser.js +2 -0
  273. package/dist/server/links/index.browser.js.map +1 -1
  274. package/dist/server/links/index.d.ts +63 -67
  275. package/dist/server/links/index.d.ts.map +1 -1
  276. package/dist/server/links/index.js +2 -0
  277. package/dist/server/links/index.js.map +1 -1
  278. package/dist/server/metrics/index.d.ts +5 -7
  279. package/dist/server/metrics/index.d.ts.map +1 -1
  280. package/dist/server/metrics/index.js.map +1 -1
  281. package/dist/server/proxy/index.d.ts +3 -5
  282. package/dist/server/proxy/index.d.ts.map +1 -1
  283. package/dist/server/proxy/index.js.map +1 -1
  284. package/dist/server/rate-limit/index.d.ts +10 -13
  285. package/dist/server/rate-limit/index.d.ts.map +1 -1
  286. package/dist/server/rate-limit/index.js.map +1 -1
  287. package/dist/server/static/index.d.ts +3 -5
  288. package/dist/server/static/index.d.ts.map +1 -1
  289. package/dist/server/static/index.js.map +1 -1
  290. package/dist/server/swagger/index.d.ts +5 -8
  291. package/dist/server/swagger/index.d.ts.map +1 -1
  292. package/dist/server/swagger/index.js.map +1 -1
  293. package/dist/sms/index.d.ts +3 -5
  294. package/dist/sms/index.d.ts.map +1 -1
  295. package/dist/sms/index.js.map +1 -1
  296. package/dist/system/index.browser.js.map +1 -1
  297. package/dist/system/index.d.ts +2 -4
  298. package/dist/system/index.d.ts.map +1 -1
  299. package/dist/system/index.js.map +1 -1
  300. package/dist/system/index.workerd.js.map +1 -1
  301. package/dist/topic/core/index.d.ts +4 -6
  302. package/dist/topic/core/index.d.ts.map +1 -1
  303. package/dist/topic/core/index.js.map +1 -1
  304. package/dist/topic/redis/index.d.ts +5 -8
  305. package/dist/topic/redis/index.d.ts.map +1 -1
  306. package/dist/topic/redis/index.js.map +1 -1
  307. package/package.json +59 -23
  308. package/src/api/audits/__tests__/AuditService.spec.ts +18 -110
  309. package/src/api/audits/controllers/AdminAuditController.ts +14 -0
  310. package/src/api/audits/services/AuditService.ts +21 -88
  311. package/src/api/files/__tests__/FileService.spec.ts +207 -2
  312. package/src/api/files/index.ts +3 -0
  313. package/src/api/files/schemas/fileCreatorSummarySchema.ts +22 -0
  314. package/src/api/files/schemas/fileResourceSchema.ts +10 -1
  315. package/src/api/files/services/FileService.ts +170 -72
  316. package/src/api/jobs/__tests__/$job.spec.ts +24 -1
  317. package/src/api/jobs/index.ts +4 -3
  318. package/src/api/jobs/primitives/$job.ts +7 -3
  319. package/src/api/jobs/providers/DirectJobDispatcher.ts +17 -36
  320. package/src/api/jobs/providers/JobProvider.ts +53 -24
  321. package/src/api/jobs/schemas/jobConfigAtom.ts +1 -1
  322. package/src/api/jobs/schemas/jobExecutionResourceSchema.ts +4 -1
  323. package/src/api/keys/schemas/adminApiKeyResourceSchema.ts +3 -1
  324. package/src/api/parameters/__tests__/$parameter.spec.ts +19 -2
  325. package/src/api/parameters/audits/ParameterAudits.ts +17 -0
  326. package/src/api/parameters/controllers/AdminParameterController.ts +95 -19
  327. package/src/api/parameters/index.ts +3 -0
  328. package/src/api/parameters/schemas/activateParameterBodySchema.ts +3 -3
  329. package/src/api/parameters/schemas/createParameterVersionBodySchema.ts +3 -2
  330. package/src/api/parameters/schemas/parameterCreatorSummarySchema.ts +25 -0
  331. package/src/api/parameters/schemas/parameterResponseSchema.ts +5 -0
  332. package/src/api/parameters/schemas/rollbackParameterBodySchema.ts +4 -2
  333. package/src/api/parameters/services/ParameterProvider.ts +69 -6
  334. package/src/api/subscriptions/jobs/SubscriptionJobs.ts +1 -1
  335. package/src/api/users/__tests__/AdminSessionController.spec.ts +37 -0
  336. package/src/api/users/audits/SessionAudits.ts +33 -0
  337. package/src/api/users/audits/UserAudits.ts +19 -43
  338. package/src/api/users/controllers/AdminUserController.ts +66 -1
  339. package/src/api/users/controllers/RealmController.ts +1 -0
  340. package/src/api/users/entities/sessions.ts +6 -0
  341. package/src/api/users/entities/users.ts +2 -0
  342. package/src/api/users/index.ts +9 -1
  343. package/src/api/users/primitives/$realm.ts +29 -0
  344. package/src/api/users/providers/RealmProvider.ts +15 -0
  345. package/src/api/users/schemas/realmConfigSchema.ts +14 -0
  346. package/src/api/users/schemas/sessionResourceSchema.ts +16 -0
  347. package/src/api/users/schemas/updateUserSchema.ts +1 -8
  348. package/src/api/users/schemas/userQuerySchema.ts +7 -0
  349. package/src/api/users/services/CredentialService.ts +15 -6
  350. package/src/api/users/services/IdentityService.ts +2 -1
  351. package/src/api/users/services/RegistrationService.ts +2 -1
  352. package/src/api/users/services/SessionCrudService.ts +19 -2
  353. package/src/api/users/services/SessionService.ts +39 -19
  354. package/src/api/users/services/UserService.ts +106 -8
  355. package/src/background/__tests__/BackgroundTaskProvider.spec.ts +96 -0
  356. package/src/background/index.ts +37 -0
  357. package/src/background/index.workerd.ts +28 -0
  358. package/src/background/providers/BackgroundTaskProvider.ts +70 -0
  359. package/src/background/providers/WorkerdBackgroundTaskProvider.ts +43 -0
  360. package/src/bucket/__tests__/$bucket.spec.ts +18 -0
  361. package/src/bucket/__tests__/LocalFileStorageProvider.spec.ts +5 -0
  362. package/src/bucket/__tests__/MemoryFileStorageProvider.spec.ts +5 -0
  363. package/src/bucket/__tests__/NodeS3BucketProvider.spec.ts +23 -4
  364. package/src/bucket/__tests__/shared.ts +30 -0
  365. package/src/bucket/index.ts +5 -5
  366. package/src/bucket/index.workerd.ts +11 -4
  367. package/src/bucket/primitives/$bucket.ts +27 -0
  368. package/src/bucket/providers/FileStorageProvider.ts +13 -0
  369. package/src/bucket/providers/LocalFileStorageProvider.ts +17 -1
  370. package/src/bucket/providers/MemoryFileStorageProvider.ts +7 -0
  371. package/src/bucket/providers/{CloudflareR2Provider.ts → R2FileStorageProvider.ts} +10 -1
  372. package/src/bucket/providers/{NodeS3BucketProvider.ts → S3FileStorageProvider.ts} +27 -5
  373. package/src/cli/core/__tests__/BuildDockerTask.spec.ts +25 -1
  374. package/src/cli/core/__tests__/init.spec.ts +0 -219
  375. package/src/cli/core/atoms/buildOptions.ts +0 -12
  376. package/src/cli/core/commands/__tests__/BuildCommand.spec.ts +43 -0
  377. package/src/cli/core/commands/build.ts +105 -37
  378. package/src/cli/core/commands/init.ts +0 -12
  379. package/src/cli/core/commands/pack.ts +133 -0
  380. package/src/cli/core/index.ts +3 -3
  381. package/src/cli/core/providers/ViteDevServerProvider.ts +40 -16
  382. package/src/cli/core/services/PackageManagerUtils.ts +0 -16
  383. package/src/cli/core/services/ProjectScaffolder.ts +29 -291
  384. package/src/cli/core/tasks/BuildCloudflareTask.ts +382 -56
  385. package/src/cli/core/tasks/BuildDockerTask.ts +33 -3
  386. package/src/cli/core/tasks/BuildPrerenderTask.ts +44 -7
  387. package/src/cli/core/tasks/BuildTask.ts +34 -0
  388. package/src/cli/core/templates/apiIndexTs.ts +1 -22
  389. package/src/cli/core/templates/mainCss.ts +0 -1
  390. package/src/cli/core/templates/webAppRouterTs.ts +0 -99
  391. package/src/cli/core/templates/webIndexTs.ts +1 -22
  392. package/src/cli/i18n/__tests__/I18nCheckService.spec.ts +48 -0
  393. package/src/cli/i18n/services/I18nCheckService.ts +65 -11
  394. package/src/cli/platform/__tests__/SecretsCommand.spec.ts +5 -3
  395. package/src/cli/platform/commands/SecretsCommand.ts +8 -6
  396. package/src/cli/platform/commands/platform.ts +192 -46
  397. package/src/cli/platform/index.ts +12 -52
  398. package/src/cli/{platform → platform-lib}/__tests__/CloudflareAdapter.spec.ts +426 -169
  399. package/src/cli/{platform → platform-lib}/__tests__/NamingService.spec.ts +91 -4
  400. package/src/cli/{platform → platform-lib}/__tests__/VercelAdapter.spec.ts +56 -85
  401. package/src/cli/{platform → platform-lib}/adapters/CloudflareAdapter.ts +519 -190
  402. package/src/cli/{platform → platform-lib}/adapters/PlatformAdapter.ts +62 -35
  403. package/src/cli/{platform → platform-lib}/adapters/VercelAdapter.ts +6 -10
  404. package/src/cli/{platform → platform-lib}/atoms/platformOptions.ts +34 -1
  405. package/src/cli/platform-lib/index.ts +67 -0
  406. package/src/cli/platform-lib/services/NamingService.ts +136 -0
  407. package/src/cli/{platform → platform-lib}/services/PlatformInspector.ts +60 -13
  408. package/src/cli/{platform → platform-lib}/services/PlatformOrchestrator.ts +54 -43
  409. package/src/cli/{platform → platform-lib}/services/WranglerApi.ts +4 -2
  410. package/src/command/__tests__/Runner.spec.ts +20 -0
  411. package/src/command/helpers/EnvUtils.ts +19 -3
  412. package/src/command/helpers/Runner.ts +12 -2
  413. package/src/command/providers/CliProvider.ts +34 -1
  414. package/src/{containers → container}/core/__tests__/$container.spec.ts +5 -5
  415. package/src/{containers → container}/core/index.ts +4 -4
  416. package/src/{containers → container}/core/index.workerd.ts +19 -3
  417. package/src/{containers → container}/core/primitives/$container.ts +1 -1
  418. package/src/{containers → container}/core/providers/CloudflareContainerProvider.ts +17 -19
  419. package/src/{containers → container}/core/providers/ContainerProvider.ts +16 -2
  420. package/src/{containers → container}/core/providers/MockContainerProvider.ts +1 -1
  421. package/src/core/Alepha.ts +49 -1
  422. package/src/core/__tests__/$env.spec.ts +42 -0
  423. package/src/core/__tests__/dump.spec.ts +47 -0
  424. package/src/email/cloudflare/__tests__/CloudflareEmailProvider.spec.ts +42 -10
  425. package/src/email/cloudflare/index.ts +14 -5
  426. package/src/email/cloudflare/providers/CloudflareEmailProvider.ts +54 -9
  427. package/src/logger/__tests__/Logger.spec.ts +55 -0
  428. package/src/logger/index.ts +13 -0
  429. package/src/logger/services/Logger.ts +31 -1
  430. package/src/mcp/__tests__/McpServerProvider.spec.ts +71 -0
  431. package/src/mcp/providers/McpServerProvider.ts +55 -0
  432. package/src/orm/__tests__/orm-showcase-tests.ts +27 -0
  433. package/src/orm/__tests__/orm-showcase.spec.ts +12 -0
  434. package/src/orm/core/interfaces/PgQuery.ts +4 -1
  435. package/src/orm/core/services/Repository.ts +27 -11
  436. package/src/react/auth/hooks/useAuth.ts +10 -5
  437. package/src/react/core/__tests__/useQuery.browser.spec.tsx +25 -0
  438. package/src/react/core/hooks/useAction.ts +14 -3
  439. package/src/react/core/hooks/useQuery.ts +24 -4
  440. package/src/react/form/__tests__/FormModel-submit-loading.spec.ts +71 -0
  441. package/src/react/form/__tests__/form-submitting-reactive.browser.spec.tsx +96 -0
  442. package/src/react/form/services/FormModel.ts +57 -39
  443. package/src/react/i18n/__tests__/I18nProvider.spec.ts +89 -0
  444. package/src/react/i18n/__tests__/locale-routing.spec.ts +107 -0
  445. package/src/react/i18n/components/Translate.tsx +47 -0
  446. package/src/react/i18n/index.ts +2 -0
  447. package/src/react/i18n/providers/I18nProvider.ts +171 -12
  448. package/src/react/intro/components/GettingStartedAdminSlide.tsx +2 -2
  449. package/src/react/router/__tests__/$page.spec.tsx +3 -2
  450. package/src/react/router/__tests__/RouterLocaleProvider.spec.ts +127 -0
  451. package/src/react/router/__tests__/page-can.spec.ts +18 -13
  452. package/src/react/router/hooks/useQueryParams.ts +114 -14
  453. package/src/react/router/index.browser.ts +4 -0
  454. package/src/react/router/index.shared.ts +1 -0
  455. package/src/react/router/index.ts +9 -0
  456. package/src/react/router/primitives/$page.ts +85 -4
  457. package/src/react/router/providers/ReactBrowserRouterProvider.ts +18 -8
  458. package/src/react/router/providers/ReactPageProvider.ts +12 -1
  459. package/src/react/router/providers/ReactServerProvider.ts +96 -14
  460. package/src/react/router/providers/RootComponentsProvider.ts +13 -0
  461. package/src/react/router/providers/RouterLocaleProvider.ts +125 -0
  462. package/src/react/router/providers/__tests__/RootComponentsProvider.spec.ts +15 -0
  463. package/src/react/router/providers/__tests__/rootComponents.ssr.browser.spec.tsx +67 -0
  464. package/src/react/sitemap/__tests__/$sitemap.spec.ts +131 -0
  465. package/src/react/sitemap/index.browser.ts +21 -0
  466. package/src/react/sitemap/index.ts +25 -0
  467. package/src/react/sitemap/primitives/$sitemap.browser.ts +26 -0
  468. package/src/react/sitemap/primitives/$sitemap.ts +196 -0
  469. package/src/react/ui/services/SchemaControl.ts +3 -4
  470. package/src/server/auth/__tests__/appleClientSecret.spec.ts +34 -0
  471. package/src/server/auth/__tests__/authFederationClient.spec.ts +40 -0
  472. package/src/server/auth/__tests__/federationAssertion.spec.ts +146 -0
  473. package/src/server/auth/__tests__/federationRedirectReplay.spec.ts +44 -0
  474. package/src/server/auth/helpers/appleClientSecret.ts +24 -0
  475. package/src/server/auth/helpers/federationAssertion.ts +74 -0
  476. package/src/server/auth/helpers/jtiReplayGuard.ts +41 -0
  477. package/src/server/auth/helpers/safeRedirectPath.ts +19 -0
  478. package/src/server/auth/index.ts +4 -0
  479. package/src/server/auth/primitives/$authFederationBroker.ts +273 -0
  480. package/src/server/auth/primitives/$authFederationClient.ts +89 -0
  481. package/src/server/auth/providers/ServerAuthProvider.ts +18 -4
  482. package/src/server/cookies/__tests__/ServerCookiesProvider.spec.ts +70 -0
  483. package/src/server/cookies/providers/ServerCookiesProvider.ts +23 -3
  484. package/src/server/core/interfaces/ServerRequest.ts +8 -0
  485. package/src/server/core/primitives/$route.ts +27 -0
  486. package/src/server/core/providers/ServerMultipartProvider.ts +19 -0
  487. package/src/server/links/providers/LinkProvider.ts +10 -0
  488. package/dist/containers/core/index.d.ts.map +0 -1
  489. package/dist/containers/core/index.js.map +0 -1
  490. package/dist/containers/core/index.workerd.js.map +0 -1
  491. package/src/cli/core/tasks/BuildSitemapTask.ts +0 -130
  492. package/src/cli/core/templates/componentsJsonTs.ts +0 -39
  493. package/src/cli/core/templates/saasAdminLayoutTsx.ts +0 -77
  494. package/src/cli/core/templates/saasAdminPagesTsx.ts +0 -26
  495. package/src/cli/core/templates/saasAuthLayoutTsx.ts +0 -22
  496. package/src/cli/core/templates/saasAuthPagesTsx.ts +0 -62
  497. package/src/cli/core/templates/saasRealmProviderTs.ts +0 -52
  498. package/src/cli/platform/services/NamingService.ts +0 -54
  499. /package/dist/orm/core/{chunk-o8xxKEmq.js → chunk-B4FMCO8f.js} +0 -0
  500. /package/dist/react/testing/{chunk-6Ep1yQYe.js → chunk-BpyX8vjI.js} +0 -0
  501. /package/src/cli/{platform → platform-lib}/__tests__/GitHubSecretStore.spec.ts +0 -0
  502. /package/src/cli/{platform → platform-lib}/__tests__/PlatformCacheProvider.spec.ts +0 -0
  503. /package/src/cli/{platform → platform-lib}/__tests__/PlatformInspector.spec.ts +0 -0
  504. /package/src/cli/{platform → platform-lib}/__tests__/PlatformOrchestrator.spec.ts +0 -0
  505. /package/src/cli/{platform → platform-lib}/__tests__/SecretFilterService.spec.ts +0 -0
  506. /package/src/cli/{platform → platform-lib}/__tests__/detectResources.spec.ts +0 -0
  507. /package/src/cli/{platform → platform-lib}/providers/GitHubSecretStore.ts +0 -0
  508. /package/src/cli/{platform → platform-lib}/providers/MemorySecretStore.ts +0 -0
  509. /package/src/cli/{platform → platform-lib}/providers/PlatformCacheProvider.ts +0 -0
  510. /package/src/cli/{platform → platform-lib}/providers/SecretStoreProvider.ts +0 -0
  511. /package/src/cli/{platform → platform-lib}/schemas/cloudflare.ts +0 -0
  512. /package/src/cli/{platform → platform-lib}/schemas/platform.ts +0 -0
  513. /package/src/cli/{platform → platform-lib}/schemas/vercel.ts +0 -0
  514. /package/src/cli/{platform → platform-lib}/services/CloudflareApi.ts +0 -0
  515. /package/src/cli/{platform → platform-lib}/services/SecretFilterService.ts +0 -0
  516. /package/src/cli/{platform → platform-lib}/services/VercelApi.ts +0 -0
  517. /package/src/cli/{platform → platform-lib}/services/VercelCli.ts +0 -0
  518. /package/src/{containers → container}/core/interfaces/ContainerOptions.ts +0 -0
  519. /package/src/{containers → container}/core/providers/NodeContainerProvider.ts +0 -0
@@ -1,15 +1,193 @@
1
1
  import { $context, $inject, $module, Alepha, AlephaError, KIND, t } from "alepha";
2
2
  import { DateTimeProvider } from "alepha/datetime";
3
+ //#region ../../src/logger/providers/LogFormatterProvider.ts
4
+ var LogFormatterProvider = class {};
5
+ //#endregion
6
+ //#region ../../src/logger/providers/JsonFormatterProvider.ts
7
+ var JsonFormatterProvider = class extends LogFormatterProvider {
8
+ format(entry) {
9
+ const json = {
10
+ level: entry.level,
11
+ message: entry.message,
12
+ context: entry.context,
13
+ service: entry.service,
14
+ module: entry.module,
15
+ app: entry.app,
16
+ time: entry.timestamp
17
+ };
18
+ if (entry.data instanceof Error) json.error = this.formatJsonError(entry.data);
19
+ else json.data = entry.data;
20
+ return JSON.stringify(json);
21
+ }
22
+ formatJsonError(error) {
23
+ return {
24
+ name: error.name,
25
+ message: error.message,
26
+ stack: error.stack,
27
+ cause: error.cause instanceof Error ? this.formatJsonError(error.cause) : void 0
28
+ };
29
+ }
30
+ };
31
+ //#endregion
3
32
  //#region ../../src/logger/providers/LogDestinationProvider.ts
4
33
  var LogDestinationProvider = class {};
5
34
  //#endregion
6
- //#region ../../src/logger/providers/LogFormatterProvider.ts
7
- var LogFormatterProvider = class {};
35
+ //#region ../../src/logger/providers/ConsoleColorProvider.ts
36
+ var ConsoleColorProvider = class ConsoleColorProvider {
37
+ static COLORS = {
38
+ RESET: "\x1B[0m",
39
+ BLACK: "\x1B[30m",
40
+ RED: "\x1B[31m",
41
+ GREEN: "\x1B[32m",
42
+ ORANGE: "\x1B[33m",
43
+ BLUE: "\x1B[34m",
44
+ PURPLE: "\x1B[35m",
45
+ CYAN: "\x1B[36m",
46
+ GREY_LIGHT: "\x1B[37m",
47
+ GREY_LIGHT_BOLD: "\x1B[1;37m",
48
+ GREY_DARK: "\x1B[90m",
49
+ GREY_DARK_BOLD: "\x1B[1;90m",
50
+ WHITE: "\x1B[97m",
51
+ WHITE_BOLD: "\x1B[1;97m",
52
+ DIM: "\x1B[2m",
53
+ BOLD: "\x1B[1m",
54
+ INVERSE: "\x1B[7m",
55
+ SILENT: "",
56
+ ERROR: "\x1B[31m",
57
+ WARN: "\x1B[33m",
58
+ INFO: "\x1B[32m",
59
+ DEBUG: "\x1B[34m",
60
+ TRACE: "\x1B[90m"
61
+ };
62
+ alepha = $inject(Alepha);
63
+ enabled = true;
64
+ constructor() {
65
+ this.enabled = this.isEnabled();
66
+ }
67
+ isEnabled() {
68
+ if (this.alepha.env.NO_COLOR) return false;
69
+ if (this.alepha.env.FORCE_COLOR) return true;
70
+ if (this.alepha.isBrowser() && !navigator.userAgent.includes("Chrome")) return false;
71
+ return !this.alepha.isProduction();
72
+ }
73
+ set(color, text, reset = ConsoleColorProvider.COLORS.RESET) {
74
+ if (!this.enabled) return text;
75
+ return `${ConsoleColorProvider.COLORS[color]}${text}${reset}`;
76
+ }
77
+ };
78
+ //#endregion
79
+ //#region ../../src/logger/providers/PrettyFormatterProvider.ts
80
+ var PrettyFormatterProvider = class extends LogFormatterProvider {
81
+ color = $inject(ConsoleColorProvider);
82
+ alepha = $inject(Alepha);
83
+ format(entry) {
84
+ const { data, timestamp } = entry;
85
+ let output = "";
86
+ let details = "";
87
+ const isError = data instanceof Error;
88
+ if (isError) details = this.formatError(data);
89
+ else if (data) {
90
+ let error = "";
91
+ let jsonData = data;
92
+ if ("error" in data && data.error instanceof Error) {
93
+ error = this.formatError(data.error);
94
+ const { error: _, ...rest } = data;
95
+ jsonData = rest;
96
+ }
97
+ if (Object.keys(jsonData).length > 0) try {
98
+ details = JSON.stringify(jsonData);
99
+ } catch {
100
+ details = "[Unserializable Object]";
101
+ }
102
+ if (error) details += `\n${error}`;
103
+ }
104
+ output += this.color.set("GREY_DARK", `[${this.formatTimestamp(timestamp)}]`);
105
+ output += " ";
106
+ output += this.color.set(entry.level, entry.level.toUpperCase());
107
+ output += " ";
108
+ if (entry.app) {
109
+ output += this.color.set("GREY_DARK", `${entry.app}`);
110
+ output += " ";
111
+ }
112
+ if (entry.context) {
113
+ output += this.color.set("GREY_DARK", `(${this.formatContext(entry.context)})`);
114
+ output += " ";
115
+ }
116
+ const module = this.color.set("GREY_LIGHT", `${entry.module}.`);
117
+ const service = this.color.set(this.alepha.isBrowser() ? "RESET" : "WHITE", entry.service);
118
+ output += `<${module}${service}>`;
119
+ if (entry.message) output += `: ${this.color.set("CYAN", entry.message)}`;
120
+ else output += ":";
121
+ if (details) if (isError) output += ` \n${details}`;
122
+ else output += ` ${this.color.set("GREY_DARK", details)}`;
123
+ return output;
124
+ }
125
+ formatTimestamp(timestamp) {
126
+ const d = new Date(timestamp);
127
+ const h = d.getHours();
128
+ const m = d.getMinutes();
129
+ const s = d.getSeconds();
130
+ const ms = d.getMilliseconds();
131
+ return `${this.pad2(h)}:${this.pad2(m)}:${this.pad2(s)}.${this.pad3(ms)}`;
132
+ }
133
+ pad2 = (n) => (n < 10 ? "0" : "") + n;
134
+ pad3 = (n) => n < 10 ? `00${n}` : n < 100 ? `0${n}` : `${n}`;
135
+ /**
136
+ * Avoid to display the whole UUID in development mode
137
+ */
138
+ formatContext(context) {
139
+ if (this.alepha.isProduction()) return context;
140
+ return context.slice(0, 8);
141
+ }
142
+ formatError(error) {
143
+ if (this.alepha.isBrowser()) {
144
+ setTimeout(() => {
145
+ console.error(error);
146
+ });
147
+ return "";
148
+ }
149
+ const vite = this.alepha.store.get("alepha.vite.server");
150
+ vite?.ssrFixStacktrace(error);
151
+ let str = error.stack ?? error.message;
152
+ let currentCause = error.cause;
153
+ while (currentCause && currentCause instanceof Error) {
154
+ vite?.ssrFixStacktrace(currentCause);
155
+ str += `\nCaused by: ${currentCause.stack ?? currentCause.message}`;
156
+ currentCause = currentCause.cause;
157
+ }
158
+ return str;
159
+ }
160
+ };
161
+ //#endregion
162
+ //#region ../../src/logger/providers/RawFormatterProvider.ts
163
+ var RawFormatterProvider = class extends LogFormatterProvider {
164
+ format(entry) {
165
+ let output = "";
166
+ output += `${entry.message}`;
167
+ if (entry.data instanceof Error) {
168
+ output += `\n${entry.data.message}`;
169
+ let cause = entry.data.cause;
170
+ while (cause instanceof Error) {
171
+ output += `\nCaused by: ${cause.message}`;
172
+ cause = cause.cause;
173
+ }
174
+ }
175
+ return output;
176
+ }
177
+ };
8
178
  //#endregion
9
179
  //#region ../../src/logger/services/Logger.ts
10
180
  var Logger = class {
11
181
  alepha = $inject(Alepha);
12
- formatter = $inject(LogFormatterProvider);
182
+ /**
183
+ * Formatter chosen at register time (from `LOG_FORMAT`, honoring any
184
+ * custom `LogFormatterProvider` substitution). Used unless a runtime
185
+ * `alepha.logger.format` override is set — see {@link formatter}.
186
+ */
187
+ defaultFormatter = $inject(LogFormatterProvider);
188
+ jsonFormatter = $inject(JsonFormatterProvider);
189
+ prettyFormatter = $inject(PrettyFormatterProvider);
190
+ rawFormatter = $inject(RawFormatterProvider);
13
191
  destination = $inject(LogDestinationProvider);
14
192
  dateTimeProvider = $inject(DateTimeProvider);
15
193
  levels = {
@@ -41,6 +219,20 @@ var Logger = class {
41
219
  }
42
220
  return this.logLevel;
43
221
  }
222
+ /**
223
+ * Active formatter. Honors a runtime `alepha.logger.format` override
224
+ * (read live, like {@link level}); otherwise falls back to the
225
+ * register-time {@link defaultFormatter} so custom substitutions and the
226
+ * `LOG_FORMAT` default keep working.
227
+ */
228
+ get formatter() {
229
+ switch (this.alepha.store.get("alepha.logger.format")) {
230
+ case "json": return this.jsonFormatter;
231
+ case "pretty": return this.prettyFormatter;
232
+ case "raw": return this.rawFormatter;
233
+ default: return this.defaultFormatter;
234
+ }
235
+ }
44
236
  parseLevel(level, app) {
45
237
  const parts = level.toLowerCase().split(/[,;]/);
46
238
  for (const part of parts) {
@@ -158,50 +350,6 @@ const $logger = (options = {}) => {
158
350
  };
159
351
  $logger[KIND] = Logger;
160
352
  //#endregion
161
- //#region ../../src/logger/providers/ConsoleColorProvider.ts
162
- var ConsoleColorProvider = class ConsoleColorProvider {
163
- static COLORS = {
164
- RESET: "\x1B[0m",
165
- BLACK: "\x1B[30m",
166
- RED: "\x1B[31m",
167
- GREEN: "\x1B[32m",
168
- ORANGE: "\x1B[33m",
169
- BLUE: "\x1B[34m",
170
- PURPLE: "\x1B[35m",
171
- CYAN: "\x1B[36m",
172
- GREY_LIGHT: "\x1B[37m",
173
- GREY_LIGHT_BOLD: "\x1B[1;37m",
174
- GREY_DARK: "\x1B[90m",
175
- GREY_DARK_BOLD: "\x1B[1;90m",
176
- WHITE: "\x1B[97m",
177
- WHITE_BOLD: "\x1B[1;97m",
178
- DIM: "\x1B[2m",
179
- BOLD: "\x1B[1m",
180
- INVERSE: "\x1B[7m",
181
- SILENT: "",
182
- ERROR: "\x1B[31m",
183
- WARN: "\x1B[33m",
184
- INFO: "\x1B[32m",
185
- DEBUG: "\x1B[34m",
186
- TRACE: "\x1B[90m"
187
- };
188
- alepha = $inject(Alepha);
189
- enabled = true;
190
- constructor() {
191
- this.enabled = this.isEnabled();
192
- }
193
- isEnabled() {
194
- if (this.alepha.env.NO_COLOR) return false;
195
- if (this.alepha.env.FORCE_COLOR) return true;
196
- if (this.alepha.isBrowser() && !navigator.userAgent.includes("Chrome")) return false;
197
- return !this.alepha.isProduction();
198
- }
199
- set(color, text, reset = ConsoleColorProvider.COLORS.RESET) {
200
- if (!this.enabled) return text;
201
- return `${ConsoleColorProvider.COLORS[color]}${text}${reset}`;
202
- }
203
- };
204
- //#endregion
205
353
  //#region ../../src/logger/providers/ConsoleDestinationProvider.ts
206
354
  var ConsoleDestinationProvider = class extends LogDestinationProvider {
207
355
  write(message) {
@@ -209,32 +357,6 @@ var ConsoleDestinationProvider = class extends LogDestinationProvider {
209
357
  }
210
358
  };
211
359
  //#endregion
212
- //#region ../../src/logger/providers/JsonFormatterProvider.ts
213
- var JsonFormatterProvider = class extends LogFormatterProvider {
214
- format(entry) {
215
- const json = {
216
- level: entry.level,
217
- message: entry.message,
218
- context: entry.context,
219
- service: entry.service,
220
- module: entry.module,
221
- app: entry.app,
222
- time: entry.timestamp
223
- };
224
- if (entry.data instanceof Error) json.error = this.formatJsonError(entry.data);
225
- else json.data = entry.data;
226
- return JSON.stringify(json);
227
- }
228
- formatJsonError(error) {
229
- return {
230
- name: error.name,
231
- message: error.message,
232
- stack: error.stack,
233
- cause: error.cause instanceof Error ? this.formatJsonError(error.cause) : void 0
234
- };
235
- }
236
- };
237
- //#endregion
238
360
  //#region ../../src/logger/providers/MemoryDestinationProvider.ts
239
361
  var MemoryDestinationProvider = class extends LogDestinationProvider {
240
362
  entries = [];
@@ -254,106 +376,6 @@ var MemoryDestinationProvider = class extends LogDestinationProvider {
254
376
  }
255
377
  };
256
378
  //#endregion
257
- //#region ../../src/logger/providers/PrettyFormatterProvider.ts
258
- var PrettyFormatterProvider = class extends LogFormatterProvider {
259
- color = $inject(ConsoleColorProvider);
260
- alepha = $inject(Alepha);
261
- format(entry) {
262
- const { data, timestamp } = entry;
263
- let output = "";
264
- let details = "";
265
- const isError = data instanceof Error;
266
- if (isError) details = this.formatError(data);
267
- else if (data) {
268
- let error = "";
269
- let jsonData = data;
270
- if ("error" in data && data.error instanceof Error) {
271
- error = this.formatError(data.error);
272
- const { error: _, ...rest } = data;
273
- jsonData = rest;
274
- }
275
- if (Object.keys(jsonData).length > 0) try {
276
- details = JSON.stringify(jsonData);
277
- } catch {
278
- details = "[Unserializable Object]";
279
- }
280
- if (error) details += `\n${error}`;
281
- }
282
- output += this.color.set("GREY_DARK", `[${this.formatTimestamp(timestamp)}]`);
283
- output += " ";
284
- output += this.color.set(entry.level, entry.level.toUpperCase());
285
- output += " ";
286
- if (entry.app) {
287
- output += this.color.set("GREY_DARK", `${entry.app}`);
288
- output += " ";
289
- }
290
- if (entry.context) {
291
- output += this.color.set("GREY_DARK", `(${this.formatContext(entry.context)})`);
292
- output += " ";
293
- }
294
- const module = this.color.set("GREY_LIGHT", `${entry.module}.`);
295
- const service = this.color.set(this.alepha.isBrowser() ? "RESET" : "WHITE", entry.service);
296
- output += `<${module}${service}>`;
297
- if (entry.message) output += `: ${this.color.set("CYAN", entry.message)}`;
298
- else output += ":";
299
- if (details) if (isError) output += ` \n${details}`;
300
- else output += ` ${this.color.set("GREY_DARK", details)}`;
301
- return output;
302
- }
303
- formatTimestamp(timestamp) {
304
- const d = new Date(timestamp);
305
- const h = d.getHours();
306
- const m = d.getMinutes();
307
- const s = d.getSeconds();
308
- const ms = d.getMilliseconds();
309
- return `${this.pad2(h)}:${this.pad2(m)}:${this.pad2(s)}.${this.pad3(ms)}`;
310
- }
311
- pad2 = (n) => (n < 10 ? "0" : "") + n;
312
- pad3 = (n) => n < 10 ? `00${n}` : n < 100 ? `0${n}` : `${n}`;
313
- /**
314
- * Avoid to display the whole UUID in development mode
315
- */
316
- formatContext(context) {
317
- if (this.alepha.isProduction()) return context;
318
- return context.slice(0, 8);
319
- }
320
- formatError(error) {
321
- if (this.alepha.isBrowser()) {
322
- setTimeout(() => {
323
- console.error(error);
324
- });
325
- return "";
326
- }
327
- const vite = this.alepha.store.get("alepha.vite.server");
328
- vite?.ssrFixStacktrace(error);
329
- let str = error.stack ?? error.message;
330
- let currentCause = error.cause;
331
- while (currentCause && currentCause instanceof Error) {
332
- vite?.ssrFixStacktrace(currentCause);
333
- str += `\nCaused by: ${currentCause.stack ?? currentCause.message}`;
334
- currentCause = currentCause.cause;
335
- }
336
- return str;
337
- }
338
- };
339
- //#endregion
340
- //#region ../../src/logger/providers/RawFormatterProvider.ts
341
- var RawFormatterProvider = class extends LogFormatterProvider {
342
- format(entry) {
343
- let output = "";
344
- output += `${entry.message}`;
345
- if (entry.data instanceof Error) {
346
- output += `\n${entry.data.message}`;
347
- let cause = entry.data.cause;
348
- while (cause instanceof Error) {
349
- output += `\nCaused by: ${cause.message}`;
350
- cause = cause.cause;
351
- }
352
- }
353
- return output;
354
- }
355
- };
356
- //#endregion
357
379
  //#region ../../src/logger/schemas/logEntrySchema.ts
358
380
  const logEntrySchema = t.object({
359
381
  level: t.enum([
@@ -505,6 +527,6 @@ Level can be set for a specific module:
505
527
  }))
506
528
  });
507
529
  //#endregion
508
- export { $logger, AlephaLogger, ConsoleColorProvider, ConsoleDestinationProvider, JsonFormatterProvider, LogDestinationProvider, LogFormatterProvider, Logger, MemoryDestinationProvider, PrettyFormatterProvider, logEntrySchema };
530
+ export { $logger, AlephaLogger, ConsoleColorProvider, ConsoleDestinationProvider, JsonFormatterProvider, LogDestinationProvider, LogFormatterProvider, Logger, MemoryDestinationProvider, PrettyFormatterProvider, RawFormatterProvider, logEntrySchema };
509
531
 
510
532
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../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/providers/RawFormatterProvider.ts","../../src/logger/schemas/logEntrySchema.ts","../../src/logger/index.ts"],"sourcesContent":["import type { LogEntry } from \"../schemas/logEntrySchema.ts\";\n\nexport abstract class LogDestinationProvider {\n public abstract write(message: string, entry: LogEntry): void;\n}\n","import type { LogEntry } from \"../schemas/logEntrySchema.ts\";\n\nexport abstract class LogFormatterProvider {\n public abstract format(entry: LogEntry): string;\n}\n","import {\n $inject,\n Alepha,\n AlephaError,\n type LoggerInterface,\n type LogLevel,\n} from \"alepha\";\nimport { DateTimeProvider } from \"alepha/datetime\";\nimport { LogDestinationProvider } from \"../providers/LogDestinationProvider.ts\";\nimport { LogFormatterProvider } from \"../providers/LogFormatterProvider.ts\";\nimport type { LogEntry } from \"../schemas/logEntrySchema.ts\";\n\nexport class Logger implements LoggerInterface {\n protected readonly alepha = $inject(Alepha);\n protected readonly formatter = $inject(LogFormatterProvider);\n protected readonly destination = $inject(LogDestinationProvider);\n protected readonly dateTimeProvider = $inject(DateTimeProvider);\n\n protected readonly levels: Record<string, number> = {\n SILENT: -1,\n ERROR: 0,\n WARN: 1,\n INFO: 2,\n DEBUG: 3,\n TRACE: 4,\n };\n\n protected readonly service: string;\n protected readonly module: string;\n protected readonly app?: string;\n\n protected appLogLevel: string = \"INFO\";\n protected logLevel: LogLevel = \"INFO\";\n\n constructor(service: string, module: string) {\n this.service = service;\n this.module = module;\n this.app = this.alepha.env.APP_NAME;\n }\n\n public get context(): string | undefined {\n return this.alepha.context.get<string>(\"context\");\n }\n\n public get level(): string {\n const stateLogLevel = this.alepha.store.get(\"alepha.logger.level\");\n if (stateLogLevel && stateLogLevel !== this.appLogLevel) {\n this.appLogLevel = stateLogLevel;\n this.logLevel = this.parseLevel(this.appLogLevel, this.module);\n }\n return this.logLevel;\n }\n\n public parseLevel(level: string, app: string): LogLevel {\n const parts = level.toLowerCase().split(/[,;]/);\n\n // First pass: check for module-specific configurations\n for (const part of parts) {\n const trimmedPart = part.trim();\n if (!trimmedPart) continue; // Skip empty parts\n\n if (trimmedPart.includes(\":\") || trimmedPart.includes(\"=\")) {\n const [modulePattern, levelValue] = trimmedPart.split(/[:=]/);\n const trimmedModule = modulePattern.trim();\n const trimmedLevel = levelValue?.trim();\n\n if (!trimmedLevel) continue; // Skip if no level specified\n\n if (this.matchesPattern(app, trimmedModule)) {\n try {\n return this.asLogLevel(trimmedLevel);\n } catch (error) {\n throw new AlephaError(\n `Invalid log level '${levelValue?.trim()}' for module pattern '${trimmedModule}'`,\n );\n }\n }\n }\n }\n\n // Second pass: look for global level\n for (const part of parts) {\n const trimmedPart = part.trim();\n if (!trimmedPart) continue; // Skip empty parts\n\n if (!trimmedPart.includes(\":\") && !trimmedPart.includes(\"=\")) {\n try {\n return this.asLogLevel(trimmedPart);\n } catch (error) {\n throw new AlephaError(`Invalid global log level \"${trimmedPart}\"`);\n }\n }\n }\n\n return \"INFO\";\n }\n\n protected matchesPattern(moduleName: string, pattern: string): boolean {\n if (pattern.includes(\"*\")) {\n // Convert wildcard pattern to regex\n const regexPattern = pattern.replace(/\\./g, \"\\\\.\").replace(/\\*/g, \".*\");\n return new RegExp(`^${regexPattern}`).test(moduleName);\n }\n\n // Exact prefix match (existing behavior)\n return moduleName.startsWith(pattern);\n }\n\n public asLogLevel(something: string): LogLevel {\n const level = something.trim().toUpperCase();\n if (this.levels[level] !== undefined) {\n return level as LogLevel;\n }\n\n throw new AlephaError(`Invalid log level: ${something}`);\n }\n\n // -------------------------------------------------------------------------------------------------------------------\n\n public error(message: string, data?: unknown): void {\n this.log(\"ERROR\", message, data);\n }\n\n public warn(message: string, data?: unknown): void {\n this.log(\"WARN\", message, data);\n }\n\n public info(message: string, data?: unknown): void {\n this.log(\"INFO\", message, data);\n }\n\n public debug(message: string, data?: unknown): void {\n this.log(\"DEBUG\", message, data);\n }\n\n public trace(message: string, data?: unknown): void {\n this.log(\"TRACE\", message, data);\n }\n\n protected log(level: LogLevel, message: string, data?: unknown): void {\n let _message = \"\";\n if (typeof message === \"string\") {\n _message = message;\n } else if (typeof data === \"string\") {\n _message = data;\n }\n\n let _data: object | Error | undefined;\n if (typeof data === \"object\" && data) {\n _data = data;\n } else if (typeof message === \"object\" && message) {\n _data = message;\n }\n\n const logEntry: LogEntry = {\n level,\n message: _message,\n data: _data,\n context: this.context,\n service: this.service,\n module: this.module,\n app: this.app,\n timestamp: this.dateTimeProvider.nowMillis(),\n };\n\n if (this.levels[level] > this.levels[this.level]) {\n this.emit(logEntry);\n return;\n }\n\n const formatted = this.formatter.format(logEntry);\n\n this.emit(logEntry, formatted);\n\n this.destination.write(formatted, logEntry);\n }\n\n protected emit(entry: LogEntry, message?: string) {\n this.alepha.events\n .emit(\n \"log\",\n {\n message,\n entry,\n },\n {\n catch: true,\n },\n )\n .catch(() => null);\n }\n}\n","import { $context, $inject, KIND } from \"alepha\";\nimport { Logger } from \"../services/Logger.ts\";\n\n/**\n * Create a logger.\n *\n * `name` is optional, by default it will use the name of the service.\n *\n * @example\n * ```ts\n * import { $logger } from \"alepha\";\n *\n * class MyService {\n * \tlog = $logger();\n *\n * constructor() {\n * this.log.info(\"Service initialized\");\n * // print something like '[23:45:53.326] INFO <app.MyService>: Service initialized'\n * }\n * }\n * ```\n */\nexport const $logger = (options: LoggerPrimitiveOptions = {}): Logger => {\n const { alepha, service, module } = $context();\n\n return $inject(Logger, {\n lifetime: \"transient\",\n args: [\n options.name ?? service?.name ?? \"Func\",\n module?.name ?? alepha.env.MODULE_NAME ?? \"app\",\n ],\n });\n};\n\nexport interface LoggerPrimitiveOptions {\n name?: string;\n}\n\n$logger[KIND] = Logger;\n","import { $inject, Alepha } from \"alepha\";\n\nexport class ConsoleColorProvider {\n static readonly COLORS = {\n RESET: \"\\x1b[0m\",\n BLACK: \"\\x1b[30m\",\n RED: \"\\x1b[31m\",\n GREEN: \"\\x1b[32m\",\n ORANGE: \"\\x1b[33m\", // using yellow for orange-ish\n BLUE: \"\\x1b[34m\",\n PURPLE: \"\\x1b[35m\",\n CYAN: \"\\x1b[36m\",\n GREY_LIGHT: \"\\x1b[37m\",\n GREY_LIGHT_BOLD: \"\\x1b[1;37m\",\n GREY_DARK: \"\\x1b[90m\",\n GREY_DARK_BOLD: \"\\x1b[1;90m\",\n WHITE: \"\\x1b[97m\",\n WHITE_BOLD: \"\\x1b[1;97m\",\n // modifiers\n DIM: \"\\x1b[2m\",\n BOLD: \"\\x1b[1m\",\n INVERSE: \"\\x1b[7m\",\n // levels\n SILENT: \"\",\n ERROR: \"\\x1b[31m\",\n WARN: \"\\x1b[33m\",\n INFO: \"\\x1b[32m\",\n DEBUG: \"\\x1b[34m\",\n TRACE: \"\\x1b[90m\",\n };\n\n protected readonly alepha = $inject(Alepha);\n\n protected enabled = true;\n\n constructor() {\n this.enabled = this.isEnabled();\n }\n\n public isEnabled(): boolean {\n if (this.alepha.env.NO_COLOR) {\n return false;\n }\n\n if (this.alepha.env.FORCE_COLOR) {\n return true;\n }\n\n if (this.alepha.isBrowser() && !navigator.userAgent.includes(\"Chrome\")) {\n return false;\n }\n\n return !this.alepha.isProduction();\n }\n\n public set(\n color: keyof typeof ConsoleColorProvider.COLORS,\n text: string,\n reset: string = ConsoleColorProvider.COLORS.RESET,\n ): string {\n if (!this.enabled) {\n return text;\n }\n\n return `${ConsoleColorProvider.COLORS[color]}${text}${reset}`;\n }\n}\n","import { LogDestinationProvider } from \"./LogDestinationProvider.ts\";\n\nexport class ConsoleDestinationProvider extends LogDestinationProvider {\n public write(message: string): void {\n console.log(message);\n }\n}\n","import type { LogEntry } from \"../schemas/logEntrySchema.ts\";\nimport { LogFormatterProvider } from \"./LogFormatterProvider.ts\";\n\nexport class JsonFormatterProvider extends LogFormatterProvider {\n public format(entry: LogEntry): string {\n const json: Record<string, any> = {\n level: entry.level,\n message: entry.message,\n context: entry.context,\n service: entry.service,\n module: entry.module,\n app: entry.app,\n time: entry.timestamp,\n };\n\n if (entry.data instanceof Error) {\n json.error = this.formatJsonError(entry.data);\n } else {\n json.data = entry.data;\n }\n\n return JSON.stringify(json);\n }\n\n public formatJsonError(error: Error): object {\n return {\n name: error.name,\n message: error.message,\n stack: error.stack,\n cause:\n error.cause instanceof Error\n ? this.formatJsonError(error.cause)\n : undefined,\n };\n }\n}\n","import type { LogEntry } from \"../schemas/logEntrySchema.ts\";\nimport { LogDestinationProvider } from \"./LogDestinationProvider.ts\";\n\nexport class MemoryDestinationProvider extends LogDestinationProvider {\n protected entries: Array<LogEntry & { formatted: string }> = [];\n\n public readonly options = {\n maxEntries: 10_000,\n };\n\n public write(formatted: string, entry: LogEntry): void {\n this.entries.push({ ...entry, formatted });\n\n if (this.entries.length > this.options.maxEntries) {\n this.entries = this.entries.slice(\n -Math.floor(this.options.maxEntries * 0.8),\n );\n }\n }\n\n public get logs() {\n return [...this.entries];\n }\n\n public clear(): void {\n this.entries = [];\n }\n}\n","import { $inject, Alepha } from \"alepha\";\nimport type { LogEntry } from \"../schemas/logEntrySchema.ts\";\nimport { ConsoleColorProvider } from \"./ConsoleColorProvider.ts\";\nimport { LogFormatterProvider } from \"./LogFormatterProvider.ts\";\n\nexport class PrettyFormatterProvider extends LogFormatterProvider {\n protected color = $inject(ConsoleColorProvider);\n protected alepha = $inject(Alepha);\n\n public format(entry: LogEntry): string {\n const { data, timestamp } = entry;\n\n let output = \"\";\n let details = \"\";\n\n const isError = data instanceof Error;\n if (isError) {\n details = this.formatError(data);\n } else if (data) {\n let error = \"\";\n let jsonData = data;\n if (\"error\" in data && data.error instanceof Error) {\n error = this.formatError(data.error);\n const { error: _, ...rest } = data;\n jsonData = rest;\n }\n\n if (Object.keys(jsonData).length > 0) {\n try {\n details = JSON.stringify(jsonData);\n } catch {\n details = \"[Unserializable Object]\";\n }\n }\n\n if (error) {\n details += `\\n${error}`;\n }\n }\n\n output += this.color.set(\n \"GREY_DARK\",\n `[${this.formatTimestamp(timestamp)}]`,\n );\n output += \" \";\n\n output += this.color.set(entry.level, entry.level.toUpperCase());\n output += \" \";\n\n if (entry.app) {\n output += this.color.set(\"GREY_DARK\", `${entry.app}`);\n output += \" \";\n }\n\n if (entry.context) {\n output += this.color.set(\n \"GREY_DARK\",\n `(${this.formatContext(entry.context)})`,\n );\n output += \" \";\n }\n\n const module = this.color.set(\"GREY_LIGHT\", `${entry.module}.`);\n const service = this.color.set(\n this.alepha.isBrowser() ? \"RESET\" : \"WHITE\",\n entry.service,\n );\n\n output += `<${module}${service}>`;\n\n if (entry.message) {\n output += `: ${this.color.set(\"CYAN\", entry.message)}`;\n } else {\n output += \":\";\n }\n\n if (details) {\n if (isError) {\n output += ` \\n${details}`;\n } else {\n output += ` ${this.color.set(\"GREY_DARK\", details)}`;\n }\n }\n\n return output;\n }\n\n public formatTimestamp(timestamp: number): string {\n const d = new Date(timestamp);\n const h = d.getHours();\n const m = d.getMinutes();\n const s = d.getSeconds();\n const ms = d.getMilliseconds();\n\n return `${this.pad2(h)}:${this.pad2(m)}:${this.pad2(s)}.${this.pad3(ms)}`;\n }\n\n protected pad2 = (n: number) => (n < 10 ? \"0\" : \"\") + n;\n protected pad3 = (n: number) =>\n n < 10 ? `00${n}` : n < 100 ? `0${n}` : `${n}`;\n\n /**\n * Avoid to display the whole UUID in development mode\n */\n protected formatContext(context: string): string {\n if (this.alepha.isProduction()) {\n return context;\n }\n\n return context.slice(0, 8);\n }\n\n protected formatError(error: Error): string {\n // Chrome does not like stack traces with ASCII colors\n // so we remove the stack trace from log and just print with console.error\n if (this.alepha.isBrowser()) {\n // call console.error in a separate tick to avoid messing with log order\n setTimeout(() => {\n console.error(error);\n });\n return \"\";\n }\n\n // hack: use vite's stack trace formatter if available\n const vite = this.alepha.store.get(\"alepha.vite.server\") as\n | {\n ssrFixStacktrace: (error: Error) => void;\n }\n | undefined;\n\n vite?.ssrFixStacktrace(error);\n\n let str = error.stack ?? error.message;\n\n let currentCause = (error as any).cause;\n while (currentCause && currentCause instanceof Error) {\n vite?.ssrFixStacktrace(currentCause);\n\n str += `\\nCaused by: ${currentCause.stack ?? currentCause.message}`;\n currentCause = currentCause.cause;\n }\n\n return str;\n }\n}\n","import type { LogEntry } from \"../schemas/logEntrySchema.ts\";\nimport { LogFormatterProvider } from \"./LogFormatterProvider.ts\";\n\nexport class RawFormatterProvider extends LogFormatterProvider {\n public format(entry: LogEntry): string {\n let output = \"\";\n\n output += `${entry.message}`;\n\n if (entry.data instanceof Error) {\n output += `\\n${entry.data.message}`;\n let cause = entry.data.cause;\n while (cause instanceof Error) {\n output += `\\nCaused by: ${cause.message}`;\n cause = cause.cause;\n }\n }\n\n return output;\n }\n}\n","import { type Static, t } from \"alepha\";\n\nexport const logEntrySchema = t.object({\n level: t.enum([\"SILENT\", \"TRACE\", \"DEBUG\", \"INFO\", \"WARN\", \"ERROR\"]),\n message: t.text({\n size: \"rich\",\n }),\n service: t.text(),\n module: t.text(),\n context: t.optional(t.text()),\n app: t.optional(t.text()),\n data: t.optional(t.any()),\n timestamp: t.number(),\n});\n\nexport type LogEntry = Static<typeof logEntrySchema>;\n","import { $module, type Static, t } from \"alepha\";\nimport { $logger } from \"./primitives/$logger.ts\";\nimport { ConsoleColorProvider } from \"./providers/ConsoleColorProvider.ts\";\nimport { ConsoleDestinationProvider } from \"./providers/ConsoleDestinationProvider.ts\";\nimport { JsonFormatterProvider } from \"./providers/JsonFormatterProvider.ts\";\nimport { LogDestinationProvider } from \"./providers/LogDestinationProvider.ts\";\nimport { LogFormatterProvider } from \"./providers/LogFormatterProvider.ts\";\nimport { MemoryDestinationProvider } from \"./providers/MemoryDestinationProvider.ts\";\nimport { PrettyFormatterProvider } from \"./providers/PrettyFormatterProvider.ts\";\nimport { RawFormatterProvider } from \"./providers/RawFormatterProvider.ts\";\nimport type { LogEntry } from \"./schemas/logEntrySchema.ts\";\nimport { Logger } from \"./services/Logger.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./primitives/$logger.ts\";\nexport * from \"./providers/ConsoleColorProvider.ts\";\nexport * from \"./providers/ConsoleDestinationProvider.ts\";\nexport * from \"./providers/JsonFormatterProvider.ts\";\nexport * from \"./providers/LogDestinationProvider.ts\";\nexport * from \"./providers/LogFormatterProvider.ts\";\nexport * from \"./providers/MemoryDestinationProvider.ts\";\nexport * from \"./providers/PrettyFormatterProvider.ts\";\nexport * from \"./schemas/logEntrySchema.ts\";\nexport * from \"./services/Logger.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Configurable logging with multiple outputs.\n *\n * **Features:**\n * - Global logger access\n * - JSON format\n * - Pretty colored output\n * - Raw text format\n * - Console destination\n * - Memory destination (for devtools)\n * - Custom handlers\n * - Configuration via `LOG_LEVEL`, `LOG_FORMAT`, and `DEBUG`\n *\n * @module alepha.logger\n */\nexport const AlephaLogger = $module({\n name: \"alepha.logger\",\n primitives: [$logger],\n services: [Logger, ConsoleColorProvider],\n variants: [\n ConsoleDestinationProvider,\n MemoryDestinationProvider,\n JsonFormatterProvider,\n PrettyFormatterProvider,\n RawFormatterProvider,\n ],\n register: (alepha) => {\n const env = alepha.parseEnv(envSchema);\n\n // Support DEBUG env var (debug package convention) as shorthand for LOG_LEVEL/LOG_FORMAT.\n // DEBUG=1 → LOG_LEVEL=trace LOG_FORMAT=pretty\n // DEBUG=alepha:* → LOG_LEVEL=alepha.*:debug,info LOG_FORMAT=pretty\n let logLevel = env.LOG_LEVEL;\n let logFormat = env.LOG_FORMAT;\n if (env.DEBUG) {\n if (env.DEBUG === \"1\" || env.DEBUG === \"true\") {\n logLevel ??= \"trace\";\n } else {\n const patterns = env.DEBUG.split(\",\")\n .map((p) => p.trim().replaceAll(\":\", \".\"))\n .filter(Boolean);\n logLevel ??= `${patterns.map((p) => `${p}:debug`).join(\",\")},info`;\n }\n logFormat ??= \"pretty\";\n }\n\n const getLogDestinationProvider = () => {\n // in test mode, if no LOG_LEVEL is set, use MemoryDestinationProvider to capture logs for inspection.\n // logs will be printed to console only if the test fails.\n if (alepha.isTest() && !logLevel) {\n const printOnError = (ev: any) => {\n if (ev.task?.result?.state === \"fail\") {\n const output = alepha.inject(MemoryDestinationProvider);\n for (const log of output.logs) {\n console.log(log.formatted);\n }\n }\n };\n\n try {\n alepha.store.get(\"alepha.test.afterEach\")?.(printOnError);\n alepha.store.get(\"alepha.test.onTestFinished\")?.(printOnError);\n } catch {\n // ignore\n }\n\n return MemoryDestinationProvider;\n }\n\n return ConsoleDestinationProvider;\n };\n\n const getLogFormatterProvider = () => {\n if (logFormat) {\n if (logFormat === \"json\") {\n return JsonFormatterProvider;\n }\n if (logFormat === \"raw\") {\n return RawFormatterProvider;\n }\n return PrettyFormatterProvider;\n }\n\n if (alepha.isProduction() && !alepha.isBrowser()) {\n return JsonFormatterProvider;\n }\n\n return PrettyFormatterProvider;\n };\n\n alepha.with({\n optional: true,\n provide: LogDestinationProvider,\n use: getLogDestinationProvider(),\n });\n\n alepha.with({\n optional: true,\n provide: LogFormatterProvider,\n use: getLogFormatterProvider(),\n });\n\n alepha.store.set(\n \"alepha.logger\",\n alepha.inject(Logger, {\n lifetime: \"transient\",\n args: [\"Alepha\", \"alepha.core\"],\n }),\n );\n\n alepha.store.set(\n \"alepha.logger.level\",\n logLevel ??\n (alepha.isTest()\n ? \"trace\"\n : alepha.isProduction() && alepha.isBrowser()\n ? \"warn\"\n : \"info\"),\n );\n },\n});\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nconst envSchema = t.object({\n /**\n * Enable debug logging for specific modules using the `debug` package convention.\n *\n * @example\n * DEBUG=1 # Shorthand for LOG_LEVEL=trace LOG_FORMAT=pretty\n * DEBUG=alepha:* # Enable debug logging for all alepha modules\n * DEBUG=alepha:orm:* # Enable debug logging for alepha.orm modules\n * DEBUG=* # Enable debug logging for all modules\n */\n DEBUG: t.optional(\n t.text({\n description:\n \"Enable debug logging for specific modules using the debug package convention. Example: DEBUG=alepha:*\",\n }),\n ),\n\n /**\n * Default log level for the application.\n *\n * Default by environment:\n * - dev = info\n * - prod = info\n * - test = error\n *\n * Levels are: \"trace\" | \"debug\" | \"info\" | \"warn\" | \"error\" | \"silent\"\n *\n * Level can be set for a specific module:\n *\n * @example\n * LOG_LEVEL=my.module.name:debug,info # Set debug level for my.module.name and info for all other modules\n * LOG_LEVEL=alepha:trace, info # Set trace level for all alepha modules and info for all other modules\n */\n LOG_LEVEL: t.optional(\n t.text({\n description: `Application log level on startup.\nLevels are: trace, debug, info, warn, error, silent\nLevel can be set for a specific module:\n\"my.module.name:debug,info\" -> Set debug level for my.module.name and info for all other modules\n\"alepha:trace,info\" -> Set trace level for all alepha modules and info for all other modules`,\n lowercase: true,\n }),\n ),\n\n /**\n * Built-in log formats.\n * - \"json\" - JSON format, useful for structured logging and log aggregation. {@link JsonFormatterProvider}\n * - \"pretty\" - Simple text format, human-readable, with colors. {@link PrettyFormatterProvider}\n * - \"raw\" - Raw format, no formatting, just the message. {@link RawFormatterProvider}\n */\n LOG_FORMAT: t.optional(\n t.enum([\"json\", \"pretty\", \"raw\"], {\n description: \"Default log format for the application.\",\n lowercase: true,\n }),\n ),\n});\n\n// ---------------------------------------------------------------------------------------------------------------------\n\ndeclare module \"alepha\" {\n export interface Env extends Partial<Static<typeof envSchema>> {}\n\n export interface State {\n /**\n * Current log level for the application or specific modules.\n */\n \"alepha.logger.level\"?: string;\n }\n\n export interface Hooks {\n log: {\n message?: string;\n entry: LogEntry;\n };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/logger/providers/LogFormatterProvider.ts","../../src/logger/providers/JsonFormatterProvider.ts","../../src/logger/providers/LogDestinationProvider.ts","../../src/logger/providers/ConsoleColorProvider.ts","../../src/logger/providers/PrettyFormatterProvider.ts","../../src/logger/providers/RawFormatterProvider.ts","../../src/logger/services/Logger.ts","../../src/logger/primitives/$logger.ts","../../src/logger/providers/ConsoleDestinationProvider.ts","../../src/logger/providers/MemoryDestinationProvider.ts","../../src/logger/schemas/logEntrySchema.ts","../../src/logger/index.ts"],"sourcesContent":["import type { LogEntry } from \"../schemas/logEntrySchema.ts\";\n\nexport abstract class LogFormatterProvider {\n public abstract format(entry: LogEntry): string;\n}\n","import type { LogEntry } from \"../schemas/logEntrySchema.ts\";\nimport { LogFormatterProvider } from \"./LogFormatterProvider.ts\";\n\nexport class JsonFormatterProvider extends LogFormatterProvider {\n public format(entry: LogEntry): string {\n const json: Record<string, any> = {\n level: entry.level,\n message: entry.message,\n context: entry.context,\n service: entry.service,\n module: entry.module,\n app: entry.app,\n time: entry.timestamp,\n };\n\n if (entry.data instanceof Error) {\n json.error = this.formatJsonError(entry.data);\n } else {\n json.data = entry.data;\n }\n\n return JSON.stringify(json);\n }\n\n public formatJsonError(error: Error): object {\n return {\n name: error.name,\n message: error.message,\n stack: error.stack,\n cause:\n error.cause instanceof Error\n ? this.formatJsonError(error.cause)\n : undefined,\n };\n }\n}\n","import type { LogEntry } from \"../schemas/logEntrySchema.ts\";\n\nexport abstract class LogDestinationProvider {\n public abstract write(message: string, entry: LogEntry): void;\n}\n","import { $inject, Alepha } from \"alepha\";\n\nexport class ConsoleColorProvider {\n static readonly COLORS = {\n RESET: \"\\x1b[0m\",\n BLACK: \"\\x1b[30m\",\n RED: \"\\x1b[31m\",\n GREEN: \"\\x1b[32m\",\n ORANGE: \"\\x1b[33m\", // using yellow for orange-ish\n BLUE: \"\\x1b[34m\",\n PURPLE: \"\\x1b[35m\",\n CYAN: \"\\x1b[36m\",\n GREY_LIGHT: \"\\x1b[37m\",\n GREY_LIGHT_BOLD: \"\\x1b[1;37m\",\n GREY_DARK: \"\\x1b[90m\",\n GREY_DARK_BOLD: \"\\x1b[1;90m\",\n WHITE: \"\\x1b[97m\",\n WHITE_BOLD: \"\\x1b[1;97m\",\n // modifiers\n DIM: \"\\x1b[2m\",\n BOLD: \"\\x1b[1m\",\n INVERSE: \"\\x1b[7m\",\n // levels\n SILENT: \"\",\n ERROR: \"\\x1b[31m\",\n WARN: \"\\x1b[33m\",\n INFO: \"\\x1b[32m\",\n DEBUG: \"\\x1b[34m\",\n TRACE: \"\\x1b[90m\",\n };\n\n protected readonly alepha = $inject(Alepha);\n\n protected enabled = true;\n\n constructor() {\n this.enabled = this.isEnabled();\n }\n\n public isEnabled(): boolean {\n if (this.alepha.env.NO_COLOR) {\n return false;\n }\n\n if (this.alepha.env.FORCE_COLOR) {\n return true;\n }\n\n if (this.alepha.isBrowser() && !navigator.userAgent.includes(\"Chrome\")) {\n return false;\n }\n\n return !this.alepha.isProduction();\n }\n\n public set(\n color: keyof typeof ConsoleColorProvider.COLORS,\n text: string,\n reset: string = ConsoleColorProvider.COLORS.RESET,\n ): string {\n if (!this.enabled) {\n return text;\n }\n\n return `${ConsoleColorProvider.COLORS[color]}${text}${reset}`;\n }\n}\n","import { $inject, Alepha } from \"alepha\";\nimport type { LogEntry } from \"../schemas/logEntrySchema.ts\";\nimport { ConsoleColorProvider } from \"./ConsoleColorProvider.ts\";\nimport { LogFormatterProvider } from \"./LogFormatterProvider.ts\";\n\nexport class PrettyFormatterProvider extends LogFormatterProvider {\n protected color = $inject(ConsoleColorProvider);\n protected alepha = $inject(Alepha);\n\n public format(entry: LogEntry): string {\n const { data, timestamp } = entry;\n\n let output = \"\";\n let details = \"\";\n\n const isError = data instanceof Error;\n if (isError) {\n details = this.formatError(data);\n } else if (data) {\n let error = \"\";\n let jsonData = data;\n if (\"error\" in data && data.error instanceof Error) {\n error = this.formatError(data.error);\n const { error: _, ...rest } = data;\n jsonData = rest;\n }\n\n if (Object.keys(jsonData).length > 0) {\n try {\n details = JSON.stringify(jsonData);\n } catch {\n details = \"[Unserializable Object]\";\n }\n }\n\n if (error) {\n details += `\\n${error}`;\n }\n }\n\n output += this.color.set(\n \"GREY_DARK\",\n `[${this.formatTimestamp(timestamp)}]`,\n );\n output += \" \";\n\n output += this.color.set(entry.level, entry.level.toUpperCase());\n output += \" \";\n\n if (entry.app) {\n output += this.color.set(\"GREY_DARK\", `${entry.app}`);\n output += \" \";\n }\n\n if (entry.context) {\n output += this.color.set(\n \"GREY_DARK\",\n `(${this.formatContext(entry.context)})`,\n );\n output += \" \";\n }\n\n const module = this.color.set(\"GREY_LIGHT\", `${entry.module}.`);\n const service = this.color.set(\n this.alepha.isBrowser() ? \"RESET\" : \"WHITE\",\n entry.service,\n );\n\n output += `<${module}${service}>`;\n\n if (entry.message) {\n output += `: ${this.color.set(\"CYAN\", entry.message)}`;\n } else {\n output += \":\";\n }\n\n if (details) {\n if (isError) {\n output += ` \\n${details}`;\n } else {\n output += ` ${this.color.set(\"GREY_DARK\", details)}`;\n }\n }\n\n return output;\n }\n\n public formatTimestamp(timestamp: number): string {\n const d = new Date(timestamp);\n const h = d.getHours();\n const m = d.getMinutes();\n const s = d.getSeconds();\n const ms = d.getMilliseconds();\n\n return `${this.pad2(h)}:${this.pad2(m)}:${this.pad2(s)}.${this.pad3(ms)}`;\n }\n\n protected pad2 = (n: number) => (n < 10 ? \"0\" : \"\") + n;\n protected pad3 = (n: number) =>\n n < 10 ? `00${n}` : n < 100 ? `0${n}` : `${n}`;\n\n /**\n * Avoid to display the whole UUID in development mode\n */\n protected formatContext(context: string): string {\n if (this.alepha.isProduction()) {\n return context;\n }\n\n return context.slice(0, 8);\n }\n\n protected formatError(error: Error): string {\n // Chrome does not like stack traces with ASCII colors\n // so we remove the stack trace from log and just print with console.error\n if (this.alepha.isBrowser()) {\n // call console.error in a separate tick to avoid messing with log order\n setTimeout(() => {\n console.error(error);\n });\n return \"\";\n }\n\n // hack: use vite's stack trace formatter if available\n const vite = this.alepha.store.get(\"alepha.vite.server\") as\n | {\n ssrFixStacktrace: (error: Error) => void;\n }\n | undefined;\n\n vite?.ssrFixStacktrace(error);\n\n let str = error.stack ?? error.message;\n\n let currentCause = (error as any).cause;\n while (currentCause && currentCause instanceof Error) {\n vite?.ssrFixStacktrace(currentCause);\n\n str += `\\nCaused by: ${currentCause.stack ?? currentCause.message}`;\n currentCause = currentCause.cause;\n }\n\n return str;\n }\n}\n","import type { LogEntry } from \"../schemas/logEntrySchema.ts\";\nimport { LogFormatterProvider } from \"./LogFormatterProvider.ts\";\n\nexport class RawFormatterProvider extends LogFormatterProvider {\n public format(entry: LogEntry): string {\n let output = \"\";\n\n output += `${entry.message}`;\n\n if (entry.data instanceof Error) {\n output += `\\n${entry.data.message}`;\n let cause = entry.data.cause;\n while (cause instanceof Error) {\n output += `\\nCaused by: ${cause.message}`;\n cause = cause.cause;\n }\n }\n\n return output;\n }\n}\n","import {\n $inject,\n Alepha,\n AlephaError,\n type LoggerInterface,\n type LogLevel,\n} from \"alepha\";\nimport { DateTimeProvider } from \"alepha/datetime\";\nimport { JsonFormatterProvider } from \"../providers/JsonFormatterProvider.ts\";\nimport { LogDestinationProvider } from \"../providers/LogDestinationProvider.ts\";\nimport { LogFormatterProvider } from \"../providers/LogFormatterProvider.ts\";\nimport { PrettyFormatterProvider } from \"../providers/PrettyFormatterProvider.ts\";\nimport { RawFormatterProvider } from \"../providers/RawFormatterProvider.ts\";\nimport type { LogEntry } from \"../schemas/logEntrySchema.ts\";\n\nexport class Logger implements LoggerInterface {\n protected readonly alepha = $inject(Alepha);\n /**\n * Formatter chosen at register time (from `LOG_FORMAT`, honoring any\n * custom `LogFormatterProvider` substitution). Used unless a runtime\n * `alepha.logger.format` override is set — see {@link formatter}.\n */\n protected readonly defaultFormatter = $inject(LogFormatterProvider);\n protected readonly jsonFormatter = $inject(JsonFormatterProvider);\n protected readonly prettyFormatter = $inject(PrettyFormatterProvider);\n protected readonly rawFormatter = $inject(RawFormatterProvider);\n protected readonly destination = $inject(LogDestinationProvider);\n protected readonly dateTimeProvider = $inject(DateTimeProvider);\n\n protected readonly levels: Record<string, number> = {\n SILENT: -1,\n ERROR: 0,\n WARN: 1,\n INFO: 2,\n DEBUG: 3,\n TRACE: 4,\n };\n\n protected readonly service: string;\n protected readonly module: string;\n protected readonly app?: string;\n\n protected appLogLevel: string = \"INFO\";\n protected logLevel: LogLevel = \"INFO\";\n\n constructor(service: string, module: string) {\n this.service = service;\n this.module = module;\n this.app = this.alepha.env.APP_NAME;\n }\n\n public get context(): string | undefined {\n return this.alepha.context.get<string>(\"context\");\n }\n\n public get level(): string {\n const stateLogLevel = this.alepha.store.get(\"alepha.logger.level\");\n if (stateLogLevel && stateLogLevel !== this.appLogLevel) {\n this.appLogLevel = stateLogLevel;\n this.logLevel = this.parseLevel(this.appLogLevel, this.module);\n }\n return this.logLevel;\n }\n\n /**\n * Active formatter. Honors a runtime `alepha.logger.format` override\n * (read live, like {@link level}); otherwise falls back to the\n * register-time {@link defaultFormatter} so custom substitutions and the\n * `LOG_FORMAT` default keep working.\n */\n protected get formatter(): LogFormatterProvider {\n switch (this.alepha.store.get(\"alepha.logger.format\")) {\n case \"json\":\n return this.jsonFormatter;\n case \"pretty\":\n return this.prettyFormatter;\n case \"raw\":\n return this.rawFormatter;\n default:\n return this.defaultFormatter;\n }\n }\n\n public parseLevel(level: string, app: string): LogLevel {\n const parts = level.toLowerCase().split(/[,;]/);\n\n // First pass: check for module-specific configurations\n for (const part of parts) {\n const trimmedPart = part.trim();\n if (!trimmedPart) continue; // Skip empty parts\n\n if (trimmedPart.includes(\":\") || trimmedPart.includes(\"=\")) {\n const [modulePattern, levelValue] = trimmedPart.split(/[:=]/);\n const trimmedModule = modulePattern.trim();\n const trimmedLevel = levelValue?.trim();\n\n if (!trimmedLevel) continue; // Skip if no level specified\n\n if (this.matchesPattern(app, trimmedModule)) {\n try {\n return this.asLogLevel(trimmedLevel);\n } catch (error) {\n throw new AlephaError(\n `Invalid log level '${levelValue?.trim()}' for module pattern '${trimmedModule}'`,\n );\n }\n }\n }\n }\n\n // Second pass: look for global level\n for (const part of parts) {\n const trimmedPart = part.trim();\n if (!trimmedPart) continue; // Skip empty parts\n\n if (!trimmedPart.includes(\":\") && !trimmedPart.includes(\"=\")) {\n try {\n return this.asLogLevel(trimmedPart);\n } catch (error) {\n throw new AlephaError(`Invalid global log level \"${trimmedPart}\"`);\n }\n }\n }\n\n return \"INFO\";\n }\n\n protected matchesPattern(moduleName: string, pattern: string): boolean {\n if (pattern.includes(\"*\")) {\n // Convert wildcard pattern to regex\n const regexPattern = pattern.replace(/\\./g, \"\\\\.\").replace(/\\*/g, \".*\");\n return new RegExp(`^${regexPattern}`).test(moduleName);\n }\n\n // Exact prefix match (existing behavior)\n return moduleName.startsWith(pattern);\n }\n\n public asLogLevel(something: string): LogLevel {\n const level = something.trim().toUpperCase();\n if (this.levels[level] !== undefined) {\n return level as LogLevel;\n }\n\n throw new AlephaError(`Invalid log level: ${something}`);\n }\n\n // -------------------------------------------------------------------------------------------------------------------\n\n public error(message: string, data?: unknown): void {\n this.log(\"ERROR\", message, data);\n }\n\n public warn(message: string, data?: unknown): void {\n this.log(\"WARN\", message, data);\n }\n\n public info(message: string, data?: unknown): void {\n this.log(\"INFO\", message, data);\n }\n\n public debug(message: string, data?: unknown): void {\n this.log(\"DEBUG\", message, data);\n }\n\n public trace(message: string, data?: unknown): void {\n this.log(\"TRACE\", message, data);\n }\n\n protected log(level: LogLevel, message: string, data?: unknown): void {\n let _message = \"\";\n if (typeof message === \"string\") {\n _message = message;\n } else if (typeof data === \"string\") {\n _message = data;\n }\n\n let _data: object | Error | undefined;\n if (typeof data === \"object\" && data) {\n _data = data;\n } else if (typeof message === \"object\" && message) {\n _data = message;\n }\n\n const logEntry: LogEntry = {\n level,\n message: _message,\n data: _data,\n context: this.context,\n service: this.service,\n module: this.module,\n app: this.app,\n timestamp: this.dateTimeProvider.nowMillis(),\n };\n\n if (this.levels[level] > this.levels[this.level]) {\n this.emit(logEntry);\n return;\n }\n\n const formatted = this.formatter.format(logEntry);\n\n this.emit(logEntry, formatted);\n\n this.destination.write(formatted, logEntry);\n }\n\n protected emit(entry: LogEntry, message?: string) {\n this.alepha.events\n .emit(\n \"log\",\n {\n message,\n entry,\n },\n {\n catch: true,\n },\n )\n .catch(() => null);\n }\n}\n","import { $context, $inject, KIND } from \"alepha\";\nimport { Logger } from \"../services/Logger.ts\";\n\n/**\n * Create a logger.\n *\n * `name` is optional, by default it will use the name of the service.\n *\n * @example\n * ```ts\n * import { $logger } from \"alepha\";\n *\n * class MyService {\n * \tlog = $logger();\n *\n * constructor() {\n * this.log.info(\"Service initialized\");\n * // print something like '[23:45:53.326] INFO <app.MyService>: Service initialized'\n * }\n * }\n * ```\n */\nexport const $logger = (options: LoggerPrimitiveOptions = {}): Logger => {\n const { alepha, service, module } = $context();\n\n return $inject(Logger, {\n lifetime: \"transient\",\n args: [\n options.name ?? service?.name ?? \"Func\",\n module?.name ?? alepha.env.MODULE_NAME ?? \"app\",\n ],\n });\n};\n\nexport interface LoggerPrimitiveOptions {\n name?: string;\n}\n\n$logger[KIND] = Logger;\n","import { LogDestinationProvider } from \"./LogDestinationProvider.ts\";\n\nexport class ConsoleDestinationProvider extends LogDestinationProvider {\n public write(message: string): void {\n console.log(message);\n }\n}\n","import type { LogEntry } from \"../schemas/logEntrySchema.ts\";\nimport { LogDestinationProvider } from \"./LogDestinationProvider.ts\";\n\nexport class MemoryDestinationProvider extends LogDestinationProvider {\n protected entries: Array<LogEntry & { formatted: string }> = [];\n\n public readonly options = {\n maxEntries: 10_000,\n };\n\n public write(formatted: string, entry: LogEntry): void {\n this.entries.push({ ...entry, formatted });\n\n if (this.entries.length > this.options.maxEntries) {\n this.entries = this.entries.slice(\n -Math.floor(this.options.maxEntries * 0.8),\n );\n }\n }\n\n public get logs() {\n return [...this.entries];\n }\n\n public clear(): void {\n this.entries = [];\n }\n}\n","import { type Static, t } from \"alepha\";\n\nexport const logEntrySchema = t.object({\n level: t.enum([\"SILENT\", \"TRACE\", \"DEBUG\", \"INFO\", \"WARN\", \"ERROR\"]),\n message: t.text({\n size: \"rich\",\n }),\n service: t.text(),\n module: t.text(),\n context: t.optional(t.text()),\n app: t.optional(t.text()),\n data: t.optional(t.any()),\n timestamp: t.number(),\n});\n\nexport type LogEntry = Static<typeof logEntrySchema>;\n","import { $module, type Static, t } from \"alepha\";\nimport { $logger } from \"./primitives/$logger.ts\";\nimport { ConsoleColorProvider } from \"./providers/ConsoleColorProvider.ts\";\nimport { ConsoleDestinationProvider } from \"./providers/ConsoleDestinationProvider.ts\";\nimport { JsonFormatterProvider } from \"./providers/JsonFormatterProvider.ts\";\nimport { LogDestinationProvider } from \"./providers/LogDestinationProvider.ts\";\nimport { LogFormatterProvider } from \"./providers/LogFormatterProvider.ts\";\nimport { MemoryDestinationProvider } from \"./providers/MemoryDestinationProvider.ts\";\nimport { PrettyFormatterProvider } from \"./providers/PrettyFormatterProvider.ts\";\nimport { RawFormatterProvider } from \"./providers/RawFormatterProvider.ts\";\nimport type { LogEntry } from \"./schemas/logEntrySchema.ts\";\nimport { Logger } from \"./services/Logger.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./primitives/$logger.ts\";\nexport * from \"./providers/ConsoleColorProvider.ts\";\nexport * from \"./providers/ConsoleDestinationProvider.ts\";\nexport * from \"./providers/JsonFormatterProvider.ts\";\nexport * from \"./providers/LogDestinationProvider.ts\";\nexport * from \"./providers/LogFormatterProvider.ts\";\nexport * from \"./providers/MemoryDestinationProvider.ts\";\nexport * from \"./providers/PrettyFormatterProvider.ts\";\nexport * from \"./providers/RawFormatterProvider.ts\";\nexport * from \"./schemas/logEntrySchema.ts\";\nexport * from \"./services/Logger.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Configurable logging with multiple outputs.\n *\n * **Features:**\n * - Global logger access\n * - JSON format\n * - Pretty colored output\n * - Raw text format\n * - Console destination\n * - Memory destination (for devtools)\n * - Custom handlers\n * - Configuration via `LOG_LEVEL`, `LOG_FORMAT`, and `DEBUG`\n *\n * @module alepha.logger\n */\nexport const AlephaLogger = $module({\n name: \"alepha.logger\",\n primitives: [$logger],\n services: [Logger, ConsoleColorProvider],\n variants: [\n ConsoleDestinationProvider,\n MemoryDestinationProvider,\n JsonFormatterProvider,\n PrettyFormatterProvider,\n RawFormatterProvider,\n ],\n register: (alepha) => {\n const env = alepha.parseEnv(envSchema);\n\n // Support DEBUG env var (debug package convention) as shorthand for LOG_LEVEL/LOG_FORMAT.\n // DEBUG=1 → LOG_LEVEL=trace LOG_FORMAT=pretty\n // DEBUG=alepha:* → LOG_LEVEL=alepha.*:debug,info LOG_FORMAT=pretty\n let logLevel = env.LOG_LEVEL;\n let logFormat = env.LOG_FORMAT;\n if (env.DEBUG) {\n if (env.DEBUG === \"1\" || env.DEBUG === \"true\") {\n logLevel ??= \"trace\";\n } else {\n const patterns = env.DEBUG.split(\",\")\n .map((p) => p.trim().replaceAll(\":\", \".\"))\n .filter(Boolean);\n logLevel ??= `${patterns.map((p) => `${p}:debug`).join(\",\")},info`;\n }\n logFormat ??= \"pretty\";\n }\n\n const getLogDestinationProvider = () => {\n // in test mode, if no LOG_LEVEL is set, use MemoryDestinationProvider to capture logs for inspection.\n // logs will be printed to console only if the test fails.\n if (alepha.isTest() && !logLevel) {\n const printOnError = (ev: any) => {\n if (ev.task?.result?.state === \"fail\") {\n const output = alepha.inject(MemoryDestinationProvider);\n for (const log of output.logs) {\n console.log(log.formatted);\n }\n }\n };\n\n try {\n alepha.store.get(\"alepha.test.afterEach\")?.(printOnError);\n alepha.store.get(\"alepha.test.onTestFinished\")?.(printOnError);\n } catch {\n // ignore\n }\n\n return MemoryDestinationProvider;\n }\n\n return ConsoleDestinationProvider;\n };\n\n const getLogFormatterProvider = () => {\n if (logFormat) {\n if (logFormat === \"json\") {\n return JsonFormatterProvider;\n }\n if (logFormat === \"raw\") {\n return RawFormatterProvider;\n }\n return PrettyFormatterProvider;\n }\n\n if (alepha.isProduction() && !alepha.isBrowser()) {\n return JsonFormatterProvider;\n }\n\n return PrettyFormatterProvider;\n };\n\n alepha.with({\n optional: true,\n provide: LogDestinationProvider,\n use: getLogDestinationProvider(),\n });\n\n alepha.with({\n optional: true,\n provide: LogFormatterProvider,\n use: getLogFormatterProvider(),\n });\n\n alepha.store.set(\n \"alepha.logger\",\n alepha.inject(Logger, {\n lifetime: \"transient\",\n args: [\"Alepha\", \"alepha.core\"],\n }),\n );\n\n alepha.store.set(\n \"alepha.logger.level\",\n logLevel ??\n (alepha.isTest()\n ? \"trace\"\n : alepha.isProduction() && alepha.isBrowser()\n ? \"warn\"\n : \"info\"),\n );\n },\n});\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nconst envSchema = t.object({\n /**\n * Enable debug logging for specific modules using the `debug` package convention.\n *\n * @example\n * DEBUG=1 # Shorthand for LOG_LEVEL=trace LOG_FORMAT=pretty\n * DEBUG=alepha:* # Enable debug logging for all alepha modules\n * DEBUG=alepha:orm:* # Enable debug logging for alepha.orm modules\n * DEBUG=* # Enable debug logging for all modules\n */\n DEBUG: t.optional(\n t.text({\n description:\n \"Enable debug logging for specific modules using the debug package convention. Example: DEBUG=alepha:*\",\n }),\n ),\n\n /**\n * Default log level for the application.\n *\n * Default by environment:\n * - dev = info\n * - prod = info\n * - test = error\n *\n * Levels are: \"trace\" | \"debug\" | \"info\" | \"warn\" | \"error\" | \"silent\"\n *\n * Level can be set for a specific module:\n *\n * @example\n * LOG_LEVEL=my.module.name:debug,info # Set debug level for my.module.name and info for all other modules\n * LOG_LEVEL=alepha:trace, info # Set trace level for all alepha modules and info for all other modules\n */\n LOG_LEVEL: t.optional(\n t.text({\n description: `Application log level on startup.\nLevels are: trace, debug, info, warn, error, silent\nLevel can be set for a specific module:\n\"my.module.name:debug,info\" -> Set debug level for my.module.name and info for all other modules\n\"alepha:trace,info\" -> Set trace level for all alepha modules and info for all other modules`,\n lowercase: true,\n }),\n ),\n\n /**\n * Built-in log formats.\n * - \"json\" - JSON format, useful for structured logging and log aggregation. {@link JsonFormatterProvider}\n * - \"pretty\" - Simple text format, human-readable, with colors. {@link PrettyFormatterProvider}\n * - \"raw\" - Raw format, no formatting, just the message. {@link RawFormatterProvider}\n */\n LOG_FORMAT: t.optional(\n t.enum([\"json\", \"pretty\", \"raw\"], {\n description: \"Default log format for the application.\",\n lowercase: true,\n }),\n ),\n});\n\n// ---------------------------------------------------------------------------------------------------------------------\n\ndeclare module \"alepha\" {\n export interface Env extends Partial<Static<typeof envSchema>> {}\n\n export interface State {\n /**\n * Current log level for the application or specific modules.\n */\n \"alepha.logger.level\"?: string;\n\n /**\n * Runtime override for the log format (`json` | `pretty` | `raw`).\n *\n * Unset → the formatter chosen at register time from `LOG_FORMAT`\n * (honoring any custom `LogFormatterProvider` substitution) is used.\n * When set, it overrides both the active formatter and the CLI's\n * dynamic/\"stylish\" task UI (which is enabled only for `raw`). Set it\n * to flip output at runtime — e.g. the CLI `--verbose` flag forces\n * `pretty`.\n */\n \"alepha.logger.format\"?: string;\n }\n\n export interface Hooks {\n log: {\n message?: string;\n entry: LogEntry;\n };\n }\n}\n"],"mappings":"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"}