alepha 0.13.7 → 0.13.8

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 (424) hide show
  1. package/README.md +5 -2
  2. package/assets/swagger-ui/swagger-ui-bundle.js +1 -1
  3. package/assets/swagger-ui/swagger-ui-standalone-preset.js +1 -1
  4. package/assets/swagger-ui/swagger-ui.css +1 -1
  5. package/dist/{api-audits → api/audits}/index.browser.js +4 -4
  6. package/dist/api/audits/index.browser.js.map +1 -0
  7. package/dist/{api-audits → api/audits}/index.d.ts +8 -8
  8. package/dist/{api-audits → api/audits}/index.js +8 -8
  9. package/dist/api/audits/index.js.map +1 -0
  10. package/dist/{api-files → api/files}/index.browser.js +5 -5
  11. package/dist/api/files/index.browser.js.map +1 -0
  12. package/dist/{api-files → api/files}/index.d.ts +16 -9
  13. package/dist/{api-files → api/files}/index.js +10 -10
  14. package/dist/api/files/index.js.map +1 -0
  15. package/dist/{api-jobs → api/jobs}/index.browser.js +5 -5
  16. package/dist/api/jobs/index.browser.js.map +1 -0
  17. package/dist/{api-jobs → api/jobs}/index.d.ts +35 -35
  18. package/dist/{api-jobs → api/jobs}/index.js +9 -9
  19. package/dist/api/jobs/index.js.map +1 -0
  20. package/dist/{api-notifications → api/notifications}/index.browser.js +11 -11
  21. package/dist/api/notifications/index.browser.js.map +1 -0
  22. package/dist/api/notifications/index.d.ts +327 -0
  23. package/dist/{api-notifications → api/notifications}/index.js +11 -11
  24. package/dist/api/notifications/index.js.map +1 -0
  25. package/dist/{api-parameters → api/parameters}/index.browser.js +2 -2
  26. package/dist/api/parameters/index.browser.js.map +1 -0
  27. package/dist/{api-parameters → api/parameters}/index.d.ts +7 -7
  28. package/dist/{api-parameters → api/parameters}/index.js +7 -7
  29. package/dist/api/parameters/index.js.map +1 -0
  30. package/dist/{api-users → api/users}/index.browser.js +6 -6
  31. package/dist/api/users/index.browser.js.map +1 -0
  32. package/dist/{api-users → api/users}/index.d.ts +844 -845
  33. package/dist/{api-users → api/users}/index.js +99 -766
  34. package/dist/api/users/index.js.map +1 -0
  35. package/dist/{api-verifications → api/verifications}/index.browser.js +5 -5
  36. package/dist/api/verifications/index.browser.js.map +1 -0
  37. package/dist/api/verifications/index.d.ts +248 -0
  38. package/dist/{api-verifications → api/verifications}/index.js +11 -11
  39. package/dist/api/verifications/index.js.map +1 -0
  40. package/dist/cache/{index.d.ts → core/index.d.ts} +4 -4
  41. package/dist/cache/{index.js → core/index.js} +5 -5
  42. package/dist/cache/core/index.js.map +1 -0
  43. package/dist/{cache-redis → cache/redis}/index.d.ts +2 -2
  44. package/dist/{cache-redis → cache/redis}/index.js +2 -2
  45. package/dist/cache/redis/index.js.map +1 -0
  46. package/dist/cli/index.d.ts +34 -26
  47. package/dist/cli/index.js +75 -46
  48. package/dist/cli/index.js.map +1 -1
  49. package/dist/command/index.d.ts +4 -4
  50. package/dist/core/index.browser.js.map +1 -1
  51. package/dist/core/index.js.map +1 -1
  52. package/dist/core/index.native.js.map +1 -1
  53. package/dist/lock/{index.d.ts → core/index.d.ts} +5 -5
  54. package/dist/lock/{index.js → core/index.js} +5 -5
  55. package/dist/lock/core/index.js.map +1 -0
  56. package/dist/{lock-redis → lock/redis}/index.d.ts +2 -2
  57. package/dist/{lock-redis → lock/redis}/index.js +2 -2
  58. package/dist/lock/redis/index.js.map +1 -0
  59. package/dist/queue/core/index.d.ts +548 -0
  60. package/dist/queue/core/index.js +391 -0
  61. package/dist/queue/core/index.js.map +1 -0
  62. package/dist/queue/redis/index.d.ts +28 -0
  63. package/dist/queue/redis/index.js +43 -0
  64. package/dist/queue/redis/index.js.map +1 -0
  65. package/dist/scheduler/index.d.ts +1 -1
  66. package/dist/scheduler/index.js +1 -393
  67. package/dist/scheduler/index.js.map +1 -1
  68. package/dist/security/index.d.ts +1 -1
  69. package/dist/security/index.js +2 -1413
  70. package/dist/security/index.js.map +1 -1
  71. package/dist/{server-auth → server/auth}/index.browser.js +6 -6
  72. package/dist/server/auth/index.browser.js.map +1 -0
  73. package/dist/{server-auth → server/auth}/index.d.ts +167 -167
  74. package/dist/server/auth/index.js +742 -0
  75. package/dist/server/auth/index.js.map +1 -0
  76. package/dist/{server-cache → server/cache}/index.d.ts +2 -2
  77. package/dist/{server-cache → server/cache}/index.js +2 -2
  78. package/dist/server/cache/index.js.map +1 -0
  79. package/dist/{server-compress → server/compress}/index.d.ts +2 -2
  80. package/dist/{server-compress → server/compress}/index.js +2 -2
  81. package/dist/server/compress/index.js.map +1 -0
  82. package/dist/{server-cookies → server/cookies}/index.browser.js +3 -3
  83. package/dist/server/cookies/index.browser.js.map +1 -0
  84. package/dist/{server-cookies → server/cookies}/index.d.ts +4 -4
  85. package/dist/{server-cookies → server/cookies}/index.js +4 -4
  86. package/dist/server/cookies/index.js.map +1 -0
  87. package/dist/server/{index.browser.js → core/index.browser.js} +14 -14
  88. package/dist/server/core/index.browser.js.map +1 -0
  89. package/dist/server/{index.d.ts → core/index.d.ts} +36 -36
  90. package/dist/server/{index.js → core/index.js} +27 -27
  91. package/dist/server/core/index.js.map +1 -0
  92. package/dist/{server-cors → server/cors}/index.d.ts +3 -3
  93. package/dist/{server-cors → server/cors}/index.js +3 -3
  94. package/dist/server/cors/index.js.map +1 -0
  95. package/dist/{server-health → server/health}/index.d.ts +3 -3
  96. package/dist/{server-health → server/health}/index.js +3 -3
  97. package/dist/server/health/index.js.map +1 -0
  98. package/dist/{server-helmet → server/helmet}/index.d.ts +2 -2
  99. package/dist/{server-helmet → server/helmet}/index.js +2 -2
  100. package/dist/server/helmet/index.js.map +1 -0
  101. package/dist/{server-links → server/links}/index.browser.js +5 -5
  102. package/dist/server/links/index.browser.js.map +1 -0
  103. package/dist/{server-links → server/links}/index.d.ts +7 -7
  104. package/dist/{server-links → server/links}/index.js +7 -7
  105. package/dist/server/links/index.js.map +1 -0
  106. package/dist/{server-metrics → server/metrics}/index.d.ts +2 -2
  107. package/dist/server/metrics/index.js +74 -0
  108. package/dist/server/metrics/index.js.map +1 -0
  109. package/dist/{server-multipart → server/multipart}/index.d.ts +2 -2
  110. package/dist/{server-multipart → server/multipart}/index.js +2 -2
  111. package/dist/server/multipart/index.js.map +1 -0
  112. package/dist/{server-proxy → server/proxy}/index.d.ts +3 -3
  113. package/dist/{server-proxy → server/proxy}/index.js +3 -3
  114. package/dist/server/proxy/index.js.map +1 -0
  115. package/dist/{server-rate-limit → server/rate-limit}/index.d.ts +4 -4
  116. package/dist/{server-rate-limit → server/rate-limit}/index.js +4 -4
  117. package/dist/server/rate-limit/index.js.map +1 -0
  118. package/dist/{server-security → server/security}/index.browser.js +1 -1
  119. package/dist/server/security/index.browser.js.map +1 -0
  120. package/dist/{server-security → server/security}/index.d.ts +13 -13
  121. package/dist/{server-security → server/security}/index.js +4 -4
  122. package/dist/server/security/index.js.map +1 -0
  123. package/dist/{server-static → server/static}/index.d.ts +3 -3
  124. package/dist/{server-static → server/static}/index.js +3 -3
  125. package/dist/server/static/index.js.map +1 -0
  126. package/dist/{server-swagger → server/swagger}/index.d.ts +3 -3
  127. package/dist/{server-swagger → server/swagger}/index.js +4 -4
  128. package/dist/server/swagger/index.js.map +1 -0
  129. package/dist/topic/{index.d.ts → core/index.d.ts} +6 -6
  130. package/dist/topic/{index.js → core/index.js} +6 -6
  131. package/dist/topic/core/index.js.map +1 -0
  132. package/dist/{topic-redis → topic/redis}/index.d.ts +2 -2
  133. package/dist/{topic-redis → topic/redis}/index.js +2 -2
  134. package/dist/topic/redis/index.js.map +1 -0
  135. package/dist/vite/index.d.ts +11 -0
  136. package/dist/vite/index.js +12 -5
  137. package/dist/vite/index.js.map +1 -1
  138. package/package.json +156 -157
  139. package/src/{api-files → api/files}/index.ts +1 -0
  140. package/src/{api-parameters → api/parameters}/index.ts +1 -1
  141. package/src/{api-users → api/users}/primitives/$userRealm.ts +1 -1
  142. package/src/{api-users → api/users}/providers/UserRealmProvider.ts +6 -7
  143. package/src/{api-verifications → api/verifications}/index.ts +2 -0
  144. package/src/cli/apps/AlephaPackageBuilderCli.ts +73 -48
  145. package/src/cli/assets/appRouterTs.ts +1 -1
  146. package/src/cli/assets/biomeJson.ts +1 -1
  147. package/src/cli/assets/indexHtml.ts +1 -1
  148. package/src/cli/assets/mainBrowserTs.ts +1 -1
  149. package/src/cli/assets/viteConfigTs.ts +1 -1
  150. package/src/cli/commands/CoreCommands.ts +10 -6
  151. package/src/cli/commands/VerifyCommands.ts +4 -1
  152. package/src/cli/commands/ViteCommands.ts +20 -9
  153. package/src/cli/services/AlephaCliUtils.ts +29 -14
  154. package/src/core/providers/SchemaValidator.ts +1 -1
  155. package/src/queue/{index.ts → core/index.ts} +2 -3
  156. package/src/queue/{primitives → core/primitives}/$queue.ts +17 -162
  157. package/src/queue/core/providers/MemoryQueueProvider.ts +19 -0
  158. package/src/queue/core/providers/QueueProvider.ts +23 -0
  159. package/src/queue/core/providers/WorkerProvider.ts +244 -0
  160. package/src/queue/redis/providers/RedisQueueProvider.ts +31 -0
  161. package/src/server/{index.ts → core/index.ts} +1 -0
  162. package/src/{server-rate-limit → server/rate-limit}/index.ts +1 -1
  163. package/src/{server-swagger → server/swagger}/providers/ServerSwaggerProvider.ts +1 -0
  164. package/src/vite/tasks/copyAssets.ts +32 -8
  165. package/dist/api-audits/index.browser.js.map +0 -1
  166. package/dist/api-audits/index.js.map +0 -1
  167. package/dist/api-files/index.browser.js.map +0 -1
  168. package/dist/api-files/index.js.map +0 -1
  169. package/dist/api-jobs/index.browser.js.map +0 -1
  170. package/dist/api-jobs/index.js.map +0 -1
  171. package/dist/api-notifications/index.browser.js.map +0 -1
  172. package/dist/api-notifications/index.d.ts +0 -327
  173. package/dist/api-notifications/index.js.map +0 -1
  174. package/dist/api-parameters/index.browser.js.map +0 -1
  175. package/dist/api-parameters/index.js.map +0 -1
  176. package/dist/api-users/index.browser.js.map +0 -1
  177. package/dist/api-users/index.js.map +0 -1
  178. package/dist/api-verifications/index.browser.js.map +0 -1
  179. package/dist/api-verifications/index.d.ts +0 -229
  180. package/dist/api-verifications/index.js.map +0 -1
  181. package/dist/cache/index.js.map +0 -1
  182. package/dist/cache-redis/index.js.map +0 -1
  183. package/dist/lock/index.js.map +0 -1
  184. package/dist/lock-redis/index.js.map +0 -1
  185. package/dist/queue/index.d.ts +0 -1265
  186. package/dist/queue/index.js +0 -1037
  187. package/dist/queue/index.js.map +0 -1
  188. package/dist/queue-redis/index.d.ts +0 -82
  189. package/dist/queue-redis/index.js +0 -872
  190. package/dist/queue-redis/index.js.map +0 -1
  191. package/dist/server/index.browser.js.map +0 -1
  192. package/dist/server/index.js.map +0 -1
  193. package/dist/server-auth/index.browser.js.map +0 -1
  194. package/dist/server-auth/index.js +0 -1973
  195. package/dist/server-auth/index.js.map +0 -1
  196. package/dist/server-cache/index.js.map +0 -1
  197. package/dist/server-compress/index.js.map +0 -1
  198. package/dist/server-cookies/index.browser.js.map +0 -1
  199. package/dist/server-cookies/index.js.map +0 -1
  200. package/dist/server-cors/index.js.map +0 -1
  201. package/dist/server-health/index.js.map +0 -1
  202. package/dist/server-helmet/index.js.map +0 -1
  203. package/dist/server-links/index.browser.js.map +0 -1
  204. package/dist/server-links/index.js.map +0 -1
  205. package/dist/server-metrics/index.js +0 -4532
  206. package/dist/server-metrics/index.js.map +0 -1
  207. package/dist/server-multipart/index.js.map +0 -1
  208. package/dist/server-proxy/index.js.map +0 -1
  209. package/dist/server-rate-limit/index.js.map +0 -1
  210. package/dist/server-security/index.browser.js.map +0 -1
  211. package/dist/server-security/index.js.map +0 -1
  212. package/dist/server-static/index.js.map +0 -1
  213. package/dist/server-swagger/index.js.map +0 -1
  214. package/dist/topic/index.js.map +0 -1
  215. package/dist/topic-redis/index.js.map +0 -1
  216. package/src/queue/interfaces/QueueJob.ts +0 -459
  217. package/src/queue/providers/MemoryQueueProvider.ts +0 -850
  218. package/src/queue/providers/QueueProvider.ts +0 -319
  219. package/src/queue/providers/WorkerProvider.ts +0 -344
  220. package/src/queue-redis/providers/RedisQueueProvider.ts +0 -1209
  221. /package/src/{api-audits → api/audits}/controllers/AuditController.ts +0 -0
  222. /package/src/{api-audits → api/audits}/entities/audits.ts +0 -0
  223. /package/src/{api-audits → api/audits}/index.browser.ts +0 -0
  224. /package/src/{api-audits → api/audits}/index.ts +0 -0
  225. /package/src/{api-audits → api/audits}/primitives/$audit.ts +0 -0
  226. /package/src/{api-audits → api/audits}/schemas/auditQuerySchema.ts +0 -0
  227. /package/src/{api-audits → api/audits}/schemas/auditResourceSchema.ts +0 -0
  228. /package/src/{api-audits → api/audits}/schemas/createAuditSchema.ts +0 -0
  229. /package/src/{api-audits → api/audits}/services/AuditService.ts +0 -0
  230. /package/src/{api-files → api/files}/controllers/FileController.ts +0 -0
  231. /package/src/{api-files → api/files}/controllers/StorageStatsController.ts +0 -0
  232. /package/src/{api-files → api/files}/entities/files.ts +0 -0
  233. /package/src/{api-files → api/files}/index.browser.ts +0 -0
  234. /package/src/{api-files → api/files}/jobs/FileJobs.ts +0 -0
  235. /package/src/{api-files → api/files}/schemas/fileQuerySchema.ts +0 -0
  236. /package/src/{api-files → api/files}/schemas/fileResourceSchema.ts +0 -0
  237. /package/src/{api-files → api/files}/schemas/storageStatsSchema.ts +0 -0
  238. /package/src/{api-files → api/files}/services/FileService.ts +0 -0
  239. /package/src/{api-jobs → api/jobs}/controllers/JobController.ts +0 -0
  240. /package/src/{api-jobs → api/jobs}/entities/jobExecutions.ts +0 -0
  241. /package/src/{api-jobs → api/jobs}/index.browser.ts +0 -0
  242. /package/src/{api-jobs → api/jobs}/index.ts +0 -0
  243. /package/src/{api-jobs → api/jobs}/primitives/$job.ts +0 -0
  244. /package/src/{api-jobs → api/jobs}/providers/JobProvider.ts +0 -0
  245. /package/src/{api-jobs → api/jobs}/schemas/jobExecutionQuerySchema.ts +0 -0
  246. /package/src/{api-jobs → api/jobs}/schemas/jobExecutionResourceSchema.ts +0 -0
  247. /package/src/{api-jobs → api/jobs}/schemas/triggerJobSchema.ts +0 -0
  248. /package/src/{api-jobs → api/jobs}/services/JobService.ts +0 -0
  249. /package/src/{api-notifications → api/notifications}/controllers/NotificationController.ts +0 -0
  250. /package/src/{api-notifications → api/notifications}/entities/notifications.ts +0 -0
  251. /package/src/{api-notifications → api/notifications}/index.browser.ts +0 -0
  252. /package/src/{api-notifications → api/notifications}/index.ts +0 -0
  253. /package/src/{api-notifications → api/notifications}/jobs/NotificationJobs.ts +0 -0
  254. /package/src/{api-notifications → api/notifications}/primitives/$notification.ts +0 -0
  255. /package/src/{api-notifications → api/notifications}/queues/NotificationQueues.ts +0 -0
  256. /package/src/{api-notifications → api/notifications}/schemas/notificationContactPreferencesSchema.ts +0 -0
  257. /package/src/{api-notifications → api/notifications}/schemas/notificationContactSchema.ts +0 -0
  258. /package/src/{api-notifications → api/notifications}/schemas/notificationCreateSchema.ts +0 -0
  259. /package/src/{api-notifications → api/notifications}/schemas/notificationQuerySchema.ts +0 -0
  260. /package/src/{api-notifications → api/notifications}/services/NotificationSenderService.ts +0 -0
  261. /package/src/{api-notifications → api/notifications}/services/NotificationService.ts +0 -0
  262. /package/src/{api-parameters → api/parameters}/controllers/ConfigController.ts +0 -0
  263. /package/src/{api-parameters → api/parameters}/entities/parameters.ts +0 -0
  264. /package/src/{api-parameters → api/parameters}/index.browser.ts +0 -0
  265. /package/src/{api-parameters → api/parameters}/primitives/$config.ts +0 -0
  266. /package/src/{api-parameters → api/parameters}/schedulers/ConfigActivationScheduler.ts +0 -0
  267. /package/src/{api-parameters → api/parameters}/services/ConfigStore.ts +0 -0
  268. /package/src/{api-users → api/users}/atoms/realmAuthSettingsAtom.ts +0 -0
  269. /package/src/{api-users → api/users}/controllers/IdentityController.ts +0 -0
  270. /package/src/{api-users → api/users}/controllers/SessionController.ts +0 -0
  271. /package/src/{api-users → api/users}/controllers/UserController.ts +0 -0
  272. /package/src/{api-users → api/users}/controllers/UserRealmController.ts +0 -0
  273. /package/src/{api-users → api/users}/entities/identities.ts +0 -0
  274. /package/src/{api-users → api/users}/entities/sessions.ts +0 -0
  275. /package/src/{api-users → api/users}/entities/users.ts +0 -0
  276. /package/src/{api-users → api/users}/index.browser.ts +0 -0
  277. /package/src/{api-users → api/users}/index.ts +0 -0
  278. /package/src/{api-users → api/users}/notifications/UserNotifications.ts +0 -0
  279. /package/src/{api-users → api/users}/schemas/completePasswordResetRequestSchema.ts +0 -0
  280. /package/src/{api-users → api/users}/schemas/completeRegistrationRequestSchema.ts +0 -0
  281. /package/src/{api-users → api/users}/schemas/createUserSchema.ts +0 -0
  282. /package/src/{api-users → api/users}/schemas/identityQuerySchema.ts +0 -0
  283. /package/src/{api-users → api/users}/schemas/identityResourceSchema.ts +0 -0
  284. /package/src/{api-users → api/users}/schemas/loginSchema.ts +0 -0
  285. /package/src/{api-users → api/users}/schemas/passwordResetIntentResponseSchema.ts +0 -0
  286. /package/src/{api-users → api/users}/schemas/registerQuerySchema.ts +0 -0
  287. /package/src/{api-users → api/users}/schemas/registerRequestSchema.ts +0 -0
  288. /package/src/{api-users → api/users}/schemas/registerResponseSchema.ts +0 -0
  289. /package/src/{api-users → api/users}/schemas/registerSchema.ts +0 -0
  290. /package/src/{api-users → api/users}/schemas/registrationIntentResponseSchema.ts +0 -0
  291. /package/src/{api-users → api/users}/schemas/resetPasswordSchema.ts +0 -0
  292. /package/src/{api-users → api/users}/schemas/sessionQuerySchema.ts +0 -0
  293. /package/src/{api-users → api/users}/schemas/sessionResourceSchema.ts +0 -0
  294. /package/src/{api-users → api/users}/schemas/updateUserSchema.ts +0 -0
  295. /package/src/{api-users → api/users}/schemas/userQuerySchema.ts +0 -0
  296. /package/src/{api-users → api/users}/schemas/userRealmConfigSchema.ts +0 -0
  297. /package/src/{api-users → api/users}/schemas/userResourceSchema.ts +0 -0
  298. /package/src/{api-users → api/users}/services/CredentialService.ts +0 -0
  299. /package/src/{api-users → api/users}/services/IdentityService.ts +0 -0
  300. /package/src/{api-users → api/users}/services/RegistrationService.ts +0 -0
  301. /package/src/{api-users → api/users}/services/SessionCrudService.ts +0 -0
  302. /package/src/{api-users → api/users}/services/SessionService.ts +0 -0
  303. /package/src/{api-users → api/users}/services/UserService.ts +0 -0
  304. /package/src/{api-verifications → api/verifications}/controllers/VerificationController.ts +0 -0
  305. /package/src/{api-verifications → api/verifications}/entities/verifications.ts +0 -0
  306. /package/src/{api-verifications → api/verifications}/index.browser.ts +0 -0
  307. /package/src/{api-verifications → api/verifications}/jobs/VerificationJobs.ts +0 -0
  308. /package/src/{api-verifications → api/verifications}/parameters/VerificationParameters.ts +0 -0
  309. /package/src/{api-verifications → api/verifications}/schemas/requestVerificationCodeResponseSchema.ts +0 -0
  310. /package/src/{api-verifications → api/verifications}/schemas/validateVerificationCodeResponseSchema.ts +0 -0
  311. /package/src/{api-verifications → api/verifications}/schemas/verificationSettingsSchema.ts +0 -0
  312. /package/src/{api-verifications → api/verifications}/schemas/verificationTypeEnumSchema.ts +0 -0
  313. /package/src/{api-verifications → api/verifications}/services/VerificationService.ts +0 -0
  314. /package/src/cache/{errors → core/errors}/CacheError.ts +0 -0
  315. /package/src/cache/{index.ts → core/index.ts} +0 -0
  316. /package/src/cache/{primitives → core/primitives}/$cache.ts +0 -0
  317. /package/src/cache/{providers → core/providers}/CacheProvider.ts +0 -0
  318. /package/src/cache/{providers → core/providers}/MemoryCacheProvider.ts +0 -0
  319. /package/src/{cache-redis → cache/redis}/index.ts +0 -0
  320. /package/src/{cache-redis → cache/redis}/providers/RedisCacheProvider.ts +0 -0
  321. /package/src/lock/{index.ts → core/index.ts} +0 -0
  322. /package/src/lock/{primitives → core/primitives}/$lock.ts +0 -0
  323. /package/src/lock/{providers → core/providers}/LockProvider.ts +0 -0
  324. /package/src/lock/{providers → core/providers}/LockTopicProvider.ts +0 -0
  325. /package/src/lock/{providers → core/providers}/MemoryLockProvider.ts +0 -0
  326. /package/src/{lock-redis → lock/redis}/index.ts +0 -0
  327. /package/src/{lock-redis → lock/redis}/providers/RedisLockProvider.ts +0 -0
  328. /package/src/queue/{primitives → core/primitives}/$consumer.ts +0 -0
  329. /package/src/{queue-redis → queue/redis}/index.ts +0 -0
  330. /package/src/{server-auth → server/auth}/constants/routes.ts +0 -0
  331. /package/src/{server-auth → server/auth}/index.browser.ts +0 -0
  332. /package/src/{server-auth → server/auth}/index.shared.ts +0 -0
  333. /package/src/{server-auth → server/auth}/index.ts +0 -0
  334. /package/src/{server-auth → server/auth}/primitives/$auth.ts +0 -0
  335. /package/src/{server-auth → server/auth}/primitives/$authApple.ts +0 -0
  336. /package/src/{server-auth → server/auth}/primitives/$authCredentials.ts +0 -0
  337. /package/src/{server-auth → server/auth}/primitives/$authGithub.ts +0 -0
  338. /package/src/{server-auth → server/auth}/primitives/$authGoogle.ts +0 -0
  339. /package/src/{server-auth → server/auth}/providers/ServerAuthProvider.ts +0 -0
  340. /package/src/{server-auth → server/auth}/schemas/authenticationProviderSchema.ts +0 -0
  341. /package/src/{server-auth → server/auth}/schemas/tokenResponseSchema.ts +0 -0
  342. /package/src/{server-auth → server/auth}/schemas/tokensSchema.ts +0 -0
  343. /package/src/{server-auth → server/auth}/schemas/userinfoResponseSchema.ts +0 -0
  344. /package/src/{server-cache → server/cache}/index.ts +0 -0
  345. /package/src/{server-cache → server/cache}/providers/ServerCacheProvider.ts +0 -0
  346. /package/src/{server-compress → server/compress}/index.ts +0 -0
  347. /package/src/{server-compress → server/compress}/providers/ServerCompressProvider.ts +0 -0
  348. /package/src/{server-cookies → server/cookies}/index.browser.ts +0 -0
  349. /package/src/{server-cookies → server/cookies}/index.ts +0 -0
  350. /package/src/{server-cookies → server/cookies}/primitives/$cookie.browser.ts +0 -0
  351. /package/src/{server-cookies → server/cookies}/primitives/$cookie.ts +0 -0
  352. /package/src/{server-cookies → server/cookies}/providers/ServerCookiesProvider.ts +0 -0
  353. /package/src/{server-cookies → server/cookies}/services/CookieParser.ts +0 -0
  354. /package/src/server/{constants → core/constants}/routeMethods.ts +0 -0
  355. /package/src/server/{errors → core/errors}/BadRequestError.ts +0 -0
  356. /package/src/server/{errors → core/errors}/ConflictError.ts +0 -0
  357. /package/src/server/{errors → core/errors}/ForbiddenError.ts +0 -0
  358. /package/src/server/{errors → core/errors}/HttpError.ts +0 -0
  359. /package/src/server/{errors → core/errors}/NotFoundError.ts +0 -0
  360. /package/src/server/{errors → core/errors}/UnauthorizedError.ts +0 -0
  361. /package/src/server/{errors → core/errors}/ValidationError.ts +0 -0
  362. /package/src/server/{helpers → core/helpers}/ServerReply.ts +0 -0
  363. /package/src/server/{helpers → core/helpers}/isMultipart.ts +0 -0
  364. /package/src/server/{index.browser.ts → core/index.browser.ts} +0 -0
  365. /package/src/server/{index.shared.ts → core/index.shared.ts} +0 -0
  366. /package/src/server/{interfaces → core/interfaces}/ServerRequest.ts +0 -0
  367. /package/src/server/{primitives → core/primitives}/$action.ts +0 -0
  368. /package/src/server/{primitives → core/primitives}/$route.ts +0 -0
  369. /package/src/server/{providers → core/providers}/BunHttpServerProvider.ts +0 -0
  370. /package/src/server/{providers → core/providers}/NodeHttpServerProvider.ts +0 -0
  371. /package/src/server/{providers → core/providers}/ServerBodyParserProvider.ts +0 -0
  372. /package/src/server/{providers → core/providers}/ServerLoggerProvider.ts +0 -0
  373. /package/src/server/{providers → core/providers}/ServerNotReadyProvider.ts +0 -0
  374. /package/src/server/{providers → core/providers}/ServerProvider.ts +0 -0
  375. /package/src/server/{providers → core/providers}/ServerRouterProvider.ts +0 -0
  376. /package/src/server/{providers → core/providers}/ServerTimingProvider.ts +0 -0
  377. /package/src/server/{schemas → core/schemas}/errorSchema.ts +0 -0
  378. /package/src/server/{schemas → core/schemas}/okSchema.ts +0 -0
  379. /package/src/server/{services → core/services}/HttpClient.ts +0 -0
  380. /package/src/server/{services → core/services}/ServerRequestParser.ts +0 -0
  381. /package/src/server/{services → core/services}/UserAgentParser.ts +0 -0
  382. /package/src/{server-cors → server/cors}/index.ts +0 -0
  383. /package/src/{server-cors → server/cors}/primitives/$cors.ts +0 -0
  384. /package/src/{server-cors → server/cors}/providers/ServerCorsProvider.ts +0 -0
  385. /package/src/{server-health → server/health}/index.ts +0 -0
  386. /package/src/{server-health → server/health}/providers/ServerHealthProvider.ts +0 -0
  387. /package/src/{server-health → server/health}/schemas/healthSchema.ts +0 -0
  388. /package/src/{server-helmet → server/helmet}/index.ts +0 -0
  389. /package/src/{server-helmet → server/helmet}/providers/ServerHelmetProvider.ts +0 -0
  390. /package/src/{server-links → server/links}/index.browser.ts +0 -0
  391. /package/src/{server-links → server/links}/index.ts +0 -0
  392. /package/src/{server-links → server/links}/primitives/$client.ts +0 -0
  393. /package/src/{server-links → server/links}/primitives/$remote.ts +0 -0
  394. /package/src/{server-links → server/links}/providers/LinkProvider.ts +0 -0
  395. /package/src/{server-links → server/links}/providers/RemotePrimitiveProvider.ts +0 -0
  396. /package/src/{server-links → server/links}/providers/ServerLinksProvider.ts +0 -0
  397. /package/src/{server-links → server/links}/schemas/apiLinksResponseSchema.ts +0 -0
  398. /package/src/{server-metrics → server/metrics}/index.ts +0 -0
  399. /package/src/{server-metrics → server/metrics}/providers/ServerMetricsProvider.ts +0 -0
  400. /package/src/{server-multipart → server/multipart}/index.ts +0 -0
  401. /package/src/{server-multipart → server/multipart}/providers/ServerMultipartProvider.ts +0 -0
  402. /package/src/{server-proxy → server/proxy}/index.ts +0 -0
  403. /package/src/{server-proxy → server/proxy}/primitives/$proxy.ts +0 -0
  404. /package/src/{server-proxy → server/proxy}/providers/ServerProxyProvider.ts +0 -0
  405. /package/src/{server-rate-limit → server/rate-limit}/primitives/$rateLimit.ts +0 -0
  406. /package/src/{server-rate-limit → server/rate-limit}/providers/ServerRateLimitProvider.ts +0 -0
  407. /package/src/{server-security → server/security}/index.browser.ts +0 -0
  408. /package/src/{server-security → server/security}/index.ts +0 -0
  409. /package/src/{server-security → server/security}/primitives/$basicAuth.ts +0 -0
  410. /package/src/{server-security → server/security}/providers/ServerBasicAuthProvider.ts +0 -0
  411. /package/src/{server-security → server/security}/providers/ServerSecurityProvider.ts +0 -0
  412. /package/src/{server-static → server/static}/index.ts +0 -0
  413. /package/src/{server-static → server/static}/primitives/$serve.ts +0 -0
  414. /package/src/{server-static → server/static}/providers/ServerStaticProvider.ts +0 -0
  415. /package/src/{server-swagger → server/swagger}/index.ts +0 -0
  416. /package/src/{server-swagger → server/swagger}/primitives/$swagger.ts +0 -0
  417. /package/src/topic/{errors → core/errors}/TopicTimeoutError.ts +0 -0
  418. /package/src/topic/{index.ts → core/index.ts} +0 -0
  419. /package/src/topic/{primitives → core/primitives}/$subscriber.ts +0 -0
  420. /package/src/topic/{primitives → core/primitives}/$topic.ts +0 -0
  421. /package/src/topic/{providers → core/providers}/MemoryTopicProvider.ts +0 -0
  422. /package/src/topic/{providers → core/providers}/TopicProvider.ts +0 -0
  423. /package/src/{topic-redis → topic/redis}/index.ts +0 -0
  424. /package/src/{topic-redis → topic/redis}/providers/RedisTopicProvider.ts +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["handlers: Array<() => Promise<unknown>>","ref: { timeout?: Timeout }"],"sources":["../../../src/topic/core/primitives/$subscriber.ts","../../../src/topic/core/errors/TopicTimeoutError.ts","../../../src/topic/core/providers/TopicProvider.ts","../../../src/topic/core/providers/MemoryTopicProvider.ts","../../../src/topic/core/primitives/$topic.ts","../../../src/topic/core/index.ts"],"sourcesContent":["import { createPrimitive, KIND, Primitive } from \"alepha\";\nimport type {\n TopicHandler,\n TopicMessageSchema,\n TopicPrimitive,\n} from \"./$topic.ts\";\n\n/**\n * Creates a subscriber primitive to listen for messages from a specific topic.\n *\n * Provides a dedicated message subscriber that connects to a topic and processes messages\n * with custom handler logic, enabling scalable pub/sub architectures where multiple\n * subscribers can react to the same events independently.\n *\n * **Key Features**\n * - Seamless integration with any $topic primitive\n * - Full type safety inherited from topic schema\n * - Real-time message delivery when events are published\n * - Error isolation between subscribers\n * - Support for multiple independent subscribers per topic\n *\n * **Common Use Cases**\n * - Notification services and audit logging\n * - Analytics and metrics collection\n * - Data synchronization and real-time UI updates\n *\n * @example\n * ```ts\n * class UserActivityService {\n * userEvents = $topic({\n * name: \"user-activity\",\n * schema: {\n * payload: t.object({\n * userId: t.text(),\n * action: t.enum([\"login\", \"logout\", \"purchase\"]),\n * timestamp: t.number()\n * })\n * }\n * });\n *\n * activityLogger = $subscriber({\n * topic: this.userEvents,\n * handler: async (message) => {\n * const { userId, action, timestamp } = message.payload;\n * await this.auditLogger.log({\n * userId,\n * action,\n * timestamp\n * });\n * }\n * });\n *\n * async trackUserLogin(userId: string) {\n * await this.userEvents.publish({\n * userId,\n * action: \"login\",\n * timestamp: Date.now()\n * });\n * }\n * }\n * ```\n */\nexport const $subscriber = <T extends TopicMessageSchema>(\n options: SubscriberPrimitiveOptions<T>,\n): SubscriberPrimitive<T> => {\n return createPrimitive(SubscriberPrimitive<T>, options);\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface SubscriberPrimitiveOptions<T extends TopicMessageSchema> {\n /**\n * The topic primitive that this subscriber will listen to for messages.\n *\n * This establishes the connection between the subscriber and its source topic:\n * - The subscriber inherits the topic's message schema for type safety\n * - Messages published to the topic will be automatically delivered to this subscriber\n * - Multiple subscribers can listen to the same topic independently\n * - The subscriber will use the topic's provider and configuration settings\n *\n * **Topic Integration Benefits**:\n * - Type safety: Subscriber handler gets fully typed message payloads\n * - Schema validation: Messages are validated before reaching the subscriber\n * - Real-time delivery: Messages are delivered immediately upon publication\n * - Error isolation: Subscriber errors don't affect the topic or other subscribers\n * - Monitoring: Topic metrics include subscriber processing statistics\n *\n * @example\n * ```ts\n * // First, define a topic\n * userEvents = $topic({\n * name: \"user-activity\",\n * schema: {\n * payload: t.object({ userId: t.text(), action: t.text() })\n * }\n * });\n *\n * // Then, create a subscriber for that topic\n * activitySubscriber = $subscriber({\n * topic: this.userEvents, // Reference the topic primitive\n * handler: async (message) => { } // Process messages here\n * });\n * ```\n */\n topic: TopicPrimitive<T>;\n\n /**\n * Message handler function that processes individual messages from the topic.\n *\n * This function:\n * - Receives fully typed and validated message payloads from the connected topic\n * - Executes immediately when messages are published to the topic\n * - Should implement the core business logic for reacting to these events\n * - Runs independently of other subscribers to the same topic\n * - Should handle errors gracefully to avoid affecting other subscribers\n * - Has access to the full Alepha dependency injection container\n *\n * **Handler Design Guidelines**:\n * - Keep handlers focused on a single responsibility\n * - Use proper error handling and logging\n * - Consider performance impact for high-frequency topics\n * - Make handlers idempotent when possible for reliability\n * - Validate business rules within the handler logic\n * - Log important processing steps for debugging and monitoring\n *\n * **Error Handling Strategy**:\n * - Log errors but don't re-throw to avoid affecting other subscribers\n * - Use try-catch blocks for external service calls\n * - Implement circuit breakers for resilience with external systems\n * - Monitor error rates and patterns for system health\n * - Consider implementing retry logic for temporary failures\n *\n * **Performance Considerations**:\n * - Keep handler execution time minimal for high-throughput topics\n * - Use background queues for heavy processing triggered by events\n * - Implement batching for efficiency when processing many similar events\n * - Consider async processing patterns for non-critical operations\n *\n * @param message - The topic message with validated payload and optional headers\n * @param message.payload - The typed message data based on the topic's schema\n * @returns Promise that resolves when processing is complete\n *\n * @example\n * ```ts\n * handler: async (message) => {\n * const { userId, eventType, timestamp } = message.payload;\n *\n * try {\n * // Log event receipt\n * this.logger.info(`Processing ${eventType} event for user ${userId}`, {\n * timestamp,\n * userId,\n * eventType\n * });\n *\n * // Perform event-specific processing\n * switch (eventType) {\n * case 'user.login':\n * await this.updateLastLogin(userId, timestamp);\n * await this.sendWelcomeNotification(userId);\n * break;\n * case 'user.logout':\n * await this.updateSessionDuration(userId, timestamp);\n * break;\n * case 'user.purchase':\n * await this.updateRewardsPoints(userId, message.payload.purchaseAmount);\n * await this.triggerRecommendations(userId);\n * break;\n * default:\n * this.logger.warn(`Unknown event type: ${eventType}`);\n * }\n *\n * // Update analytics\n * await this.analytics.track(eventType, {\n * userId,\n * timestamp,\n * source: 'topic-subscriber'\n * });\n *\n * this.logger.info(`Successfully processed ${eventType} for user ${userId}`);\n *\n * } catch (error) {\n * // Log error but don't re-throw to avoid affecting other subscribers\n * this.logger.error(`Failed to process ${eventType} for user ${userId}`, {\n * error: error.message,\n * stack: error.stack,\n * userId,\n * eventType,\n * timestamp\n * });\n *\n * // Optionally send to error tracking service\n * await this.errorTracker.captureException(error, {\n * context: { userId, eventType, timestamp },\n * tags: { component: 'topic-subscriber' }\n * });\n * }\n * }\n * ```\n */\n handler: TopicHandler<T>;\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class SubscriberPrimitive<\n T extends TopicMessageSchema,\n> extends Primitive<SubscriberPrimitiveOptions<T>> {}\n\n$subscriber[KIND] = SubscriberPrimitive;\n","export class TopicTimeoutError extends Error {\n public readonly topic: string;\n public readonly timeout: number;\n\n constructor(topic: string, timeout: number) {\n super(`Timeout of ${timeout}ms exceeded for topic ${topic}`);\n this.timeout = timeout;\n this.topic = topic;\n }\n}\n","import { $inject, Alepha } from \"alepha\";\nimport { $subscriber } from \"../primitives/$subscriber.ts\";\nimport { $topic } from \"../primitives/$topic.ts\";\n\n/**\n * Base class for topic providers.\n */\nexport abstract class TopicProvider {\n protected readonly alepha = $inject(Alepha);\n\n /**\n * Publish a message to a topic.\n *\n * @param topic - The topic to publish to.\n * @param message - The message to publish.\n */\n public abstract publish(topic: string, message: string): Promise<void>;\n\n /**\n * Subscribe to a topic.\n *\n * @param topic - The topic to subscribe to.\n * @param callback - The callback to call when a message is received.\n */\n public abstract subscribe(\n topic: string,\n callback: SubscribeCallback,\n ): Promise<UnSubscribeFn>;\n\n /**\n * Unsubscribe from a topic.\n *\n * @param topic - The topic to unsubscribe from.\n */\n public abstract unsubscribe(topic: string): Promise<void>;\n\n /**\n * Returns the list of $subscribers for this provider.\n */\n protected subscribers(): Array<() => Promise<unknown>> {\n const handlers: Array<() => Promise<unknown>> = [];\n\n const topics = this.alepha.primitives($topic);\n\n for (const topic of topics) {\n if (topic.provider !== this) {\n continue;\n }\n\n const handler = topic.options.handler;\n if (handler && topic.provider === this) {\n handlers.push(() => topic.subscribe(handler));\n }\n }\n\n const subscribers = this.alepha.primitives($subscriber);\n for (const subscriber of subscribers) {\n if (subscriber.options.topic.provider !== this) {\n continue;\n }\n\n handlers.push(() =>\n subscriber.options.topic.subscribe(subscriber.options.handler),\n );\n }\n\n return handlers;\n }\n}\n\nexport type SubscribeCallback = (message: string) => Promise<void> | void;\n\nexport type UnSubscribeFn = () => Promise<void>;\n","import { $hook } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport {\n type SubscribeCallback,\n TopicProvider,\n type UnSubscribeFn,\n} from \"./TopicProvider.ts\";\n\nexport class MemoryTopicProvider extends TopicProvider {\n protected readonly log = $logger();\n protected readonly subscriptions: Record<string, SubscribeCallback[]> = {};\n\n protected readonly start = $hook({\n on: \"start\",\n handler: async () => {\n const subscribers = this.subscribers();\n if (subscribers.length) {\n await Promise.all(subscribers.map((fn) => fn()));\n for (const subscriber of subscribers) {\n this.log.debug(`Subscribed to topic '${subscriber.name}'`);\n }\n }\n },\n });\n\n /**\n * Publish a message to a topic.\n *\n * @param topic\n * @param message\n */\n public async publish(topic: string, message: string): Promise<void> {\n if (!this.subscriptions[topic]) {\n return;\n }\n\n for (const callback of this.subscriptions[topic]) {\n await callback(message);\n }\n }\n\n /**\n * Subscribe to a topic.\n *\n * @param topic - The topic to subscribe to.\n * @param callback\n */\n\n public async subscribe(\n topic: string,\n callback: SubscribeCallback,\n ): Promise<UnSubscribeFn> {\n if (!this.subscriptions[topic]) {\n this.subscriptions[topic] = [];\n }\n\n this.subscriptions[topic].push(callback);\n\n return async () => {\n const callbacks = this.subscriptions[topic];\n if (!callbacks) {\n return;\n }\n\n this.subscriptions[topic] = callbacks.filter((cb) => cb !== callback);\n if (this.subscriptions[topic].length === 0) {\n delete this.subscriptions[topic];\n }\n };\n }\n\n /**\n * Unsubscribe from a topic.\n *\n * @param topic - The topic to unsubscribe from.\n */\n public async unsubscribe(topic: string): Promise<void> {\n delete this.subscriptions[topic];\n }\n}\n","import {\n $inject,\n createPrimitive,\n KIND,\n Primitive,\n type Service,\n type Static,\n type TSchema,\n} from \"alepha\";\nimport {\n DateTimeProvider,\n type DurationLike,\n type Timeout,\n} from \"alepha/datetime\";\nimport { $logger } from \"alepha/logger\";\nimport { TopicTimeoutError } from \"../errors/TopicTimeoutError.ts\";\nimport { MemoryTopicProvider } from \"../providers/MemoryTopicProvider.ts\";\nimport {\n TopicProvider,\n type UnSubscribeFn,\n} from \"../providers/TopicProvider.ts\";\n\n/**\n * Creates a topic primitive for publish/subscribe messaging and event-driven architecture.\n *\n * Enables decoupled communication through a pub/sub pattern where publishers send messages\n * and multiple subscribers receive them. Supports type-safe messages, real-time delivery,\n * event filtering, and pluggable backends (memory, Redis, custom providers).\n *\n * **Use Cases**: User notifications, real-time chat, event broadcasting, microservice communication\n *\n * @example\n * ```ts\n * class NotificationService {\n * userActivity = $topic({\n * name: \"user-activity\",\n * schema: {\n * payload: t.object({\n * userId: t.text(),\n * action: t.enum([\"login\", \"logout\", \"purchase\"]),\n * timestamp: t.number()\n * })\n * },\n * handler: async (message) => {\n * console.log(`User ${message.payload.userId}: ${message.payload.action}`);\n * }\n * });\n *\n * async trackLogin(userId: string) {\n * await this.userActivity.publish({ userId, action: \"login\", timestamp: Date.now() });\n * }\n *\n * async subscribeToEvents() {\n * await this.userActivity.subscribe(async (message) => {\n * // Additional subscriber logic\n * });\n * }\n * }\n * ```\n */\nexport const $topic = <T extends TopicMessageSchema>(\n options: TopicPrimitiveOptions<T>,\n): TopicPrimitive<T> => {\n return createPrimitive(TopicPrimitive<T>, options);\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface TopicPrimitiveOptions<T extends TopicMessageSchema> {\n /**\n * Unique name identifier for the topic.\n *\n * This name is used for:\n * - Topic identification across the pub/sub system\n * - Message routing between publishers and subscribers\n * - Logging and debugging topic-related operations\n * - Provider-specific topic management (channels, keys, etc.)\n *\n * If not provided, defaults to the property key where the topic is declared.\n *\n * **Naming Conventions**:\n * - Use descriptive, hierarchical names: \"user.activity\", \"order.events\"\n * - Avoid spaces and special characters\n * - Consider using dot notation for categorization\n * - Keep names concise but meaningful\n *\n * @example \"user-activity\"\n * @example \"chat.messages\"\n * @example \"system.health.checks\"\n * @example \"payment.webhooks\"\n */\n name?: string;\n\n /**\n * Human-readable description of the topic's purpose and usage.\n *\n * Used for:\n * - Documentation generation and API references\n * - Developer onboarding and understanding\n * - Monitoring dashboards and admin interfaces\n * - Team communication about system architecture\n *\n * **Description Best Practices**:\n * - Explain what events/messages this topic handles\n * - Mention key use cases and subscribers\n * - Include any important timing or ordering guarantees\n * - Note any special processing requirements\n *\n * @example \"Real-time user activity events for analytics and notifications\"\n * @example \"Order lifecycle events from creation to delivery\"\n * @example \"Chat messages broadcast to all room participants\"\n * @example \"System health checks and service status updates\"\n */\n description?: string;\n\n /**\n * Topic provider configuration for message storage and delivery.\n *\n * Options:\n * - **\"memory\"**: In-memory provider (default for development, lost on restart)\n * - **Service<TopicProvider>**: Custom provider class (e.g., RedisTopicProvider)\n * - **undefined**: Uses the default topic provider from dependency injection\n *\n * **Provider Selection Guidelines**:\n * - **Development**: Use \"memory\" for fast, simple testing without external dependencies\n * - **Production**: Use Redis or message brokers for persistence and scalability\n * - **Distributed systems**: Use Redis/RabbitMQ for cross-service communication\n * - **High-throughput**: Use specialized providers with connection pooling\n * - **Real-time**: Ensure provider supports low-latency message delivery\n *\n * **Provider Capabilities**:\n * - Message persistence and durability\n * - Subscriber management and connection handling\n * - Message ordering and delivery guarantees\n * - Horizontal scaling and load distribution\n *\n * @default Uses injected TopicProvider\n * @example \"memory\"\n * @example RedisTopicProvider\n * @example RabbitMQTopicProvider\n */\n provider?: \"memory\" | Service<TopicProvider>;\n\n /**\n * TypeBox schema defining the structure of messages published to this topic.\n *\n * The schema must include:\n * - **payload**: Required schema for the main message data\n * - **headers**: Optional schema for message metadata\n *\n * This schema:\n * - Validates all messages published to the topic\n * - Provides full TypeScript type inference for subscribers\n * - Ensures type safety between publishers and subscribers\n * - Enables automatic serialization/deserialization\n *\n * **Schema Design Best Practices**:\n * - Keep payload schemas focused and cohesive\n * - Use optional fields for data that might not always be present\n * - Include timestamp fields for event ordering\n * - Consider versioning for schema evolution\n * - Use union types for different event types in the same topic\n *\n * @example\n * ```ts\n * {\n * payload: t.object({\n * eventId: t.text(),\n * eventType: t.enum([\"created\", \"updated\"]),\n * data: t.record(t.text(), t.any()),\n * timestamp: t.number(),\n * userId: t.optional(t.text())\n * }),\n * headers: t.optional(t.object({\n * source: t.text(),\n * correlationId: t.text()\n * }))\n * }\n * ```\n */\n schema: T;\n\n /**\n * Default subscriber handler function that processes messages published to this topic.\n *\n * This handler:\n * - Automatically subscribes when the topic is initialized\n * - Receives all messages published to the topic\n * - Runs for every message without additional subscription setup\n * - Can be supplemented with additional subscribers via `subscribe()` method\n * - Should handle errors gracefully to avoid breaking other subscribers\n *\n * **Handler Design Guidelines**:\n * - Keep handlers focused on a single responsibility\n * - Use proper error handling and logging\n * - Consider performance impact for high-frequency topics\n * - Make handlers idempotent when possible\n * - Validate business rules within the handler logic\n * - Log important processing steps for debugging\n *\n * **Error Handling Strategy**:\n * - Log errors but don't re-throw to avoid affecting other subscribers\n * - Use try-catch blocks for external service calls\n * - Consider implementing circuit breakers for resilience\n * - Monitor error rates and patterns for system health\n *\n * @param message - The topic message with validated payload and headers\n * @param message.payload - The typed message data based on the schema\n * @returns Promise that resolves when processing is complete\n *\n * @example\n * ```ts\n * handler: async (message) => {\n * const { eventType, data, timestamp } = message.payload;\n *\n * try {\n * // Log message receipt\n * this.logger.info(`Processing ${eventType} event`, { timestamp, data });\n *\n * // Process based on event type\n * switch (eventType) {\n * case \"created\":\n * await this.handleCreation(data);\n * break;\n * case \"updated\":\n * await this.handleUpdate(data);\n * break;\n * default:\n * this.logger.warn(`Unknown event type: ${eventType}`);\n * }\n *\n * this.logger.info(`Successfully processed ${eventType} event`);\n *\n * } catch (error) {\n * // Log error but don't re-throw to avoid affecting other subscribers\n * this.logger.error(`Failed to process ${eventType} event`, {\n * error: error.message,\n * eventType,\n * timestamp,\n * data\n * });\n * }\n * }\n * ```\n */\n handler?: TopicHandler<T>;\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class TopicPrimitive<T extends TopicMessageSchema> extends Primitive<\n TopicPrimitiveOptions<T>\n> {\n protected readonly log = $logger();\n protected readonly dateTimeProvider = $inject(DateTimeProvider);\n public readonly provider = this.$provider();\n\n public get name(): string {\n return this.options.name || this.config.propertyKey;\n }\n\n public async publish(payload: TopicMessage<T>[\"payload\"]): Promise<void> {\n await this.provider.publish(\n this.name,\n JSON.stringify({\n payload: this.alepha.codec.encode(this.options.schema.payload, payload),\n }),\n );\n }\n\n public async subscribe(handler: TopicHandler<T>): Promise<UnSubscribeFn> {\n return this.provider.subscribe(this.name, async (message) => {\n try {\n await handler(this.parseMessage(message));\n } catch (error) {\n this.log.error(\"Message processing has failed\", error);\n }\n });\n }\n\n public async wait(\n options: TopicWaitOptions<T> = {},\n ): Promise<TopicMessage<T>> {\n const filter = options.filter ?? (() => true);\n\n return new Promise((resolve, reject) => {\n const ref: { timeout?: Timeout } = {};\n\n (async () => {\n const clear = await this.provider.subscribe(this.name, (raw) => {\n const message = this.parseMessage(raw);\n if (!filter(message)) {\n return;\n }\n\n ref.timeout?.clear();\n clear();\n resolve(message);\n });\n\n const timeoutDuration = options.timeout ?? [10, \"seconds\"];\n\n ref.timeout = this.dateTimeProvider.createTimeout(() => {\n clear();\n reject(\n new TopicTimeoutError(\n this.name,\n this.dateTimeProvider.duration(timeoutDuration).asMilliseconds(),\n ),\n );\n }, timeoutDuration);\n })();\n });\n }\n\n protected $provider(): TopicProvider {\n if (!this.options.provider) {\n return this.alepha.inject(TopicProvider);\n }\n\n if (this.options.provider === \"memory\") {\n return this.alepha.inject(MemoryTopicProvider);\n }\n\n return this.alepha.inject(this.options.provider);\n }\n\n protected parseMessage(message: string): TopicMessage<T> {\n const { payload } = JSON.parse(message);\n return {\n payload: this.alepha.codec.decode(\n this.options.schema.payload,\n payload,\n ) as TopicMessage<T>[\"payload\"],\n };\n }\n}\n\n$topic[KIND] = TopicPrimitive;\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface TopicMessage<T extends TopicMessageSchema> {\n payload: Static<T[\"payload\"]>;\n}\n\nexport interface TopicWaitOptions<T extends TopicMessageSchema> {\n timeout?: DurationLike;\n filter?: (message: { payload: Static<T[\"payload\"]> }) => boolean;\n}\n\nexport interface TopicMessageSchema {\n payload: TSchema;\n}\n\nexport type TopicHandler<T extends TopicMessageSchema = TopicMessageSchema> = (\n message: TopicMessage<T>,\n) => unknown;\n","import { $module, type Alepha } from \"alepha\";\nimport { $subscriber } from \"./primitives/$subscriber.ts\";\nimport { $topic } from \"./primitives/$topic.ts\";\nimport { MemoryTopicProvider } from \"./providers/MemoryTopicProvider.ts\";\nimport { TopicProvider } from \"./providers/TopicProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./errors/TopicTimeoutError.ts\";\nexport * from \"./primitives/$subscriber.ts\";\nexport * from \"./primitives/$topic.ts\";\nexport * from \"./providers/MemoryTopicProvider.ts\";\nexport * from \"./providers/TopicProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Generic interface for pub/sub messaging.\n * Gives you the ability to create topics and subscribers.\n * This module provides only a memory implementation of the topic provider.\n *\n * @see {@link $topic}\n * @see {@link $subscriber}\n * @module alepha.topic\n */\nexport const AlephaTopic = $module({\n name: \"alepha.topic\",\n primitives: [$topic, $subscriber],\n services: [TopicProvider, MemoryTopicProvider],\n register: (alepha: Alepha) =>\n alepha.with({\n optional: true,\n provide: TopicProvider,\n use: MemoryTopicProvider,\n }),\n});\n"],"mappings":"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"}
@@ -4,7 +4,7 @@ import { SubscribeCallback, TopicProvider, UnSubscribeFn } from "alepha/topic";
4
4
  import * as alepha_logger0 from "alepha/logger";
5
5
  import { RedisProvider, RedisSubscriberProvider } from "alepha/redis";
6
6
 
7
- //#region ../../src/topic-redis/providers/RedisTopicProvider.d.ts
7
+ //#region ../../src/topic/redis/providers/RedisTopicProvider.d.ts
8
8
  declare class RedisTopicProvider extends TopicProvider {
9
9
  protected readonly env: {
10
10
  REDIS_TOPIC_PREFIX: string;
@@ -29,7 +29,7 @@ declare class RedisTopicProvider extends TopicProvider {
29
29
  unsubscribe(name: string, callback?: SubscribeCallback): Promise<void>;
30
30
  }
31
31
  //#endregion
32
- //#region ../../src/topic-redis/index.d.ts
32
+ //#region ../../src/topic/redis/index.d.ts
33
33
  /**
34
34
  * Plugin for Alepha Topic that provides Redis pub/sub capabilities.
35
35
  *
@@ -3,7 +3,7 @@ import { AlephaTopic, TopicProvider } from "alepha/topic";
3
3
  import { $logger } from "alepha/logger";
4
4
  import { RedisProvider, RedisSubscriberProvider } from "alepha/redis";
5
5
 
6
- //#region ../../src/topic-redis/providers/RedisTopicProvider.ts
6
+ //#region ../../src/topic/redis/providers/RedisTopicProvider.ts
7
7
  const envSchema = t.object({ REDIS_TOPIC_PREFIX: t.text({ default: "topic" }) });
8
8
  var RedisTopicProvider = class extends TopicProvider {
9
9
  env = $env(envSchema);
@@ -48,7 +48,7 @@ var RedisTopicProvider = class extends TopicProvider {
48
48
  };
49
49
 
50
50
  //#endregion
51
- //#region ../../src/topic-redis/index.ts
51
+ //#region ../../src/topic/redis/index.ts
52
52
  /**
53
53
  * Plugin for Alepha Topic that provides Redis pub/sub capabilities.
54
54
  *
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/topic/redis/providers/RedisTopicProvider.ts","../../../src/topic/redis/index.ts"],"sourcesContent":["import { $env, $hook, $inject, Alepha, t } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport { RedisProvider, RedisSubscriberProvider } from \"alepha/redis\";\nimport {\n type SubscribeCallback,\n TopicProvider,\n type UnSubscribeFn,\n} from \"alepha/topic\";\n\nconst envSchema = t.object({\n REDIS_TOPIC_PREFIX: t.text({\n default: \"topic\",\n }),\n});\n\nexport class RedisTopicProvider extends TopicProvider {\n protected readonly env = $env(envSchema);\n protected readonly alepha = $inject(Alepha);\n protected readonly redisProvider = $inject(RedisProvider);\n protected readonly redisSubscriberProvider = $inject(RedisSubscriberProvider);\n\n protected readonly log = $logger();\n\n protected readonly start = $hook({\n on: \"start\",\n handler: async () => {\n const subscribers = this.subscribers();\n if (subscribers.length) {\n await Promise.all(subscribers.map((fn) => fn()));\n for (const subscriber of subscribers) {\n this.log.debug(`Subscribed to topic '${subscriber.name}'`);\n }\n }\n },\n });\n\n public prefix(queue: string): string {\n return `${this.env.REDIS_TOPIC_PREFIX}:${queue}`;\n }\n\n /**\n * Publish a message to a topic.\n */\n public async publish(topic: string, message: string): Promise<void> {\n await this.redisProvider.publisher.publish(this.prefix(topic), message);\n }\n\n /**\n * Subscribe to a topic.\n */\n public async subscribe(\n name: string,\n callback: SubscribeCallback,\n ): Promise<UnSubscribeFn> {\n const topic = this.prefix(name);\n await this.redisSubscriberProvider.subscriber.subscribe(topic, callback);\n\n return () => this.unsubscribe(name, callback);\n }\n\n /**\n * Unsubscribe from a topic.\n */\n public async unsubscribe(\n name: string,\n callback?: SubscribeCallback,\n ): Promise<void> {\n const topic = this.prefix(name);\n\n await this.redisSubscriberProvider.subscriber.unsubscribe(topic, callback);\n }\n}\n","import { $module, type Alepha } from \"alepha\";\nimport { AlephaTopic, TopicProvider } from \"alepha/topic\";\nimport { RedisTopicProvider } from \"./providers/RedisTopicProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./providers/RedisTopicProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Plugin for Alepha Topic that provides Redis pub/sub capabilities.\n *\n * @see {@link RedisTopicProvider}\n * @module alepha.topic.redis\n */\nexport const AlephaTopicRedis = $module({\n name: \"alepha.topic.redis\",\n services: [RedisTopicProvider],\n register: (alepha: Alepha): Alepha =>\n alepha\n .with({\n optional: true,\n provide: TopicProvider,\n use: RedisTopicProvider,\n })\n .with(AlephaTopic),\n});\n"],"mappings":";;;;;;AASA,MAAM,YAAY,EAAE,OAAO,EACzB,oBAAoB,EAAE,KAAK,EACzB,SAAS,SACV,CAAC,EACH,CAAC;AAEF,IAAa,qBAAb,cAAwC,cAAc;CACpD,AAAmB,MAAM,KAAK,UAAU;CACxC,AAAmB,SAAS,QAAQ,OAAO;CAC3C,AAAmB,gBAAgB,QAAQ,cAAc;CACzD,AAAmB,0BAA0B,QAAQ,wBAAwB;CAE7E,AAAmB,MAAM,SAAS;CAElC,AAAmB,QAAQ,MAAM;EAC/B,IAAI;EACJ,SAAS,YAAY;GACnB,MAAM,cAAc,KAAK,aAAa;AACtC,OAAI,YAAY,QAAQ;AACtB,UAAM,QAAQ,IAAI,YAAY,KAAK,OAAO,IAAI,CAAC,CAAC;AAChD,SAAK,MAAM,cAAc,YACvB,MAAK,IAAI,MAAM,wBAAwB,WAAW,KAAK,GAAG;;;EAIjE,CAAC;CAEF,AAAO,OAAO,OAAuB;AACnC,SAAO,GAAG,KAAK,IAAI,mBAAmB,GAAG;;;;;CAM3C,MAAa,QAAQ,OAAe,SAAgC;AAClE,QAAM,KAAK,cAAc,UAAU,QAAQ,KAAK,OAAO,MAAM,EAAE,QAAQ;;;;;CAMzE,MAAa,UACX,MACA,UACwB;EACxB,MAAM,QAAQ,KAAK,OAAO,KAAK;AAC/B,QAAM,KAAK,wBAAwB,WAAW,UAAU,OAAO,SAAS;AAExE,eAAa,KAAK,YAAY,MAAM,SAAS;;;;;CAM/C,MAAa,YACX,MACA,UACe;EACf,MAAM,QAAQ,KAAK,OAAO,KAAK;AAE/B,QAAM,KAAK,wBAAwB,WAAW,YAAY,OAAO,SAAS;;;;;;;;;;;;ACrD9E,MAAa,mBAAmB,QAAQ;CACtC,MAAM;CACN,UAAU,CAAC,mBAAmB;CAC9B,WAAW,WACT,OACG,KAAK;EACJ,UAAU;EACV,SAAS;EACT,KAAK;EACN,CAAC,CACD,KAAK,YAAY;CACvB,CAAC"}
@@ -181,6 +181,17 @@ interface CopyAssetsOptions {
181
181
  * Output directory for copied assets.
182
182
  */
183
183
  distDir: string;
184
+ /**
185
+ * @default process.cwd()
186
+ */
187
+ root?: string;
188
+ /**
189
+ * Add Runner for logging (@see Alepha CLI)
190
+ */
191
+ run?: (opts: {
192
+ name: string;
193
+ handler: () => Promise<void>;
194
+ }) => Promise<string>;
184
195
  }
185
196
  /**
186
197
  * Copy assets from Alepha packages to the build output directory.
@@ -399,13 +399,20 @@ const importAlepha = async (entry, options) => {
399
399
  * Used by modules like AlephaServerSwagger to distribute UI files.
400
400
  */
401
401
  async function copyAssets(opts) {
402
- const root = process.cwd();
402
+ const root = opts.root ?? process.cwd();
403
403
  const assets = (await importAlepha(opts.entry)).store.get("alepha.build.assets");
404
404
  if (!assets || assets.length === 0) return;
405
- const require = createRequire(join(root, opts.entry));
406
- const buildAssetsDir = join(root, `${opts.distDir}/assets`);
407
- await mkdir(buildAssetsDir).catch(() => null);
408
- for (const pkgName of assets ?? []) await cp(resolve(dirname(require.resolve(`${pkgName}/package.json`)), "assets"), buildAssetsDir, { recursive: true });
405
+ const fn = async () => {
406
+ const require = createRequire(join(root, opts.entry));
407
+ const buildAssetsDir = join(root, `${opts.distDir}/assets`);
408
+ await mkdir(buildAssetsDir).catch(() => null);
409
+ for (const pkgName of assets ?? []) await cp(resolve(dirname(require.resolve(`${pkgName}/package.json`)), "assets"), buildAssetsDir, { recursive: true });
410
+ };
411
+ if (opts.run) await opts.run({
412
+ name: "copy assets",
413
+ handler: fn
414
+ });
415
+ else await fn();
409
416
  }
410
417
 
411
418
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["path","match: RegExpExecArray | null","entries: BufferedLogEntry[]","path","_error","gzipCb","brotliCompress","brotliCompressCb","compressionTasks: Promise<void>[]","fs","gzip","plugins: any[]","compress: ViteCompressOptions | undefined","viteAnalyzer","viteBuildClientConfig: UserConfig","deps: Record<string, string>","plugins: any[]","viteAnalyzer","viteBuildServerConfig: UserConfig","result: vite.Rollup.RollupOutput | vite.Rollup.RollupOutput[]","externals: string[]","WARNING_COMMENT","urls: string[]","path","path","it: any","path","rootConfig: UserConfig","plugins: (Plugin | Promise<Plugin>)[] & { [OPTIONS]?: any }"],"sources":["../../src/vite/helpers/boot.ts","../../src/vite/helpers/createBufferedLogger.ts","../../src/vite/helpers/fileExists.ts","../../src/vite/helpers/importVite.ts","../../src/vite/plugins/viteCompress.ts","../../src/vite/tasks/buildClient.ts","../../src/vite/tasks/generateExternals.ts","../../src/vite/tasks/buildServer.ts","../../src/vite/helpers/importAlepha.ts","../../src/vite/tasks/copyAssets.ts","../../src/vite/tasks/generateCloudflare.ts","../../src/vite/tasks/generateDocker.ts","../../src/vite/tasks/generateSitemap.ts","../../src/vite/tasks/generateVercel.ts","../../src/vite/tasks/prerenderPages.ts","../../src/vite/tasks/runAlepha.ts","../../src/vite/plugins/viteAlephaBuild.ts","../../src/vite/plugins/viteAlephaDev.ts","../../src/vite/plugins/viteAlepha.ts","../../src/vite/index.ts"],"sourcesContent":["import { access, readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { AlephaError } from \"alepha\";\n\n/**\n * Remember:\n * At first, functions was inside alepha/vite package, but it's now used in alepha too.\n * For avoiding cli -> vite, all code moved here.\n */\n\n/**\n * Find browser/client entry file path.\n */\nconst getClientEntry = async (\n root = process.cwd(),\n): Promise<string | undefined> => {\n const indexPath = join(root, \"index.html\");\n try {\n const html = await readFile(indexPath, \"utf8\");\n return extractFirstModuleScriptSrc(html).replace(/\\\\/g, \"/\");\n } catch {\n return undefined;\n }\n};\n\n/**\n * Find server entry file path.\n */\nconst getServerEntry = async (\n root = process.cwd(),\n explicitEntry?: string,\n): Promise<string> => {\n if (explicitEntry) {\n const explicitPath = join(root, explicitEntry);\n try {\n await access(explicitPath);\n return explicitPath;\n } catch {\n throw new AlephaError(\n `Explicit server entry file \"${explicitEntry}\" not found.`,\n );\n }\n }\n\n const maybeEntry = [\n \"src/main.server.ts\",\n \"src/server-entry.ts\",\n \"src/main.server.tsx\",\n \"src/server-entry.tsx\",\n \"src/main.ts\",\n \"src/main.tsx\",\n ];\n\n for (const entry of maybeEntry) {\n try {\n const path = join(root, entry).replace(/\\\\/g, \"/\");\n await access(path);\n return path;\n } catch {\n // continue to next entry\n }\n }\n\n const clientEntry = await getClientEntry(root);\n if (clientEntry) {\n return clientEntry;\n }\n\n throw new AlephaError(\n `Could not find a server entry file. List of supported entry file: ${maybeEntry.join(\", \")}`,\n );\n};\n\n/**\n * Extract first module script src from HTML.\n */\nfunction extractFirstModuleScriptSrc(html: string): string {\n const scriptRegex = /<script\\b[^>]*>[\\s\\S]*?<\\/script>/gi;\n let match: RegExpExecArray | null = scriptRegex.exec(html);\n\n while (match) {\n const tag = match[0];\n\n // Check for type=\"module\"\n if (/type=[\"']module[\"']/i.test(tag)) {\n // Extract the src value\n const srcMatch = tag.match(/\\bsrc=[\"']([^\"']+)[\"']/i);\n const entry = srcMatch?.[1];\n if (entry) {\n if (entry.startsWith(\"/\")) {\n return entry.substring(1); // Remove leading slash\n }\n return entry;\n }\n }\n\n match = scriptRegex.exec(html);\n }\n\n throw new AlephaError(`No module script found in the provided HTML.`);\n}\n\nexport const boot = {\n getClientEntry,\n getServerEntry,\n};\n","import type { Logger } from \"vite\";\n\ninterface BufferedLogEntry {\n level: \"info\" | \"warn\" | \"error\";\n msg: string;\n timestamp: Date;\n}\n\nexport interface BufferedLogger extends Logger {\n /**\n * Flush all buffered log messages to console.\n * Call this on build failure to show what happened.\n */\n flush(): void;\n\n /**\n * Get all buffered log entries.\n */\n getEntries(): BufferedLogEntry[];\n\n /**\n * Clear all buffered entries without printing.\n */\n clear(): void;\n}\n\n/**\n * Creates a Vite logger that buffers all messages instead of printing them.\n * Useful for silent builds that only show output on failure.\n *\n * @example\n * ```ts\n * const logger = createBufferedLogger();\n * try {\n * await viteBuild({ customLogger: logger, logLevel: 'info' });\n * } catch (error) {\n * logger.flush(); // Print all buffered logs\n * throw error;\n * }\n * ```\n */\nexport function createBufferedLogger(): BufferedLogger {\n const entries: BufferedLogEntry[] = [];\n const loggedErrors = new WeakSet<Error>();\n const warnedMessages = new Set<string>();\n let hasWarned = false;\n\n const logger: BufferedLogger = {\n get hasWarned() {\n return hasWarned;\n },\n\n info(msg: string) {\n entries.push({ level: \"info\", msg, timestamp: new Date() });\n },\n\n warn(msg: string) {\n hasWarned = true;\n entries.push({ level: \"warn\", msg, timestamp: new Date() });\n },\n\n warnOnce(msg: string) {\n if (warnedMessages.has(msg)) {\n return;\n }\n warnedMessages.add(msg);\n hasWarned = true;\n entries.push({ level: \"warn\", msg, timestamp: new Date() });\n },\n\n error(msg: string, options?: { error?: Error | null }) {\n if (options?.error) {\n loggedErrors.add(options.error);\n }\n entries.push({ level: \"error\", msg, timestamp: new Date() });\n },\n\n clearScreen() {\n // No-op in buffered mode - we don't clear anything\n },\n\n hasErrorLogged(error: Error): boolean {\n return loggedErrors.has(error);\n },\n\n flush() {\n for (const entry of entries) {\n const prefix =\n entry.level === \"error\"\n ? \"\\x1b[31m✖\\x1b[0m\"\n : entry.level === \"warn\"\n ? \"\\x1b[33m⚠\\x1b[0m\"\n : \"\\x1b[36mℹ\\x1b[0m\";\n console.log(`${prefix} ${entry.msg}`);\n }\n },\n\n getEntries() {\n return [...entries];\n },\n\n clear() {\n entries.length = 0;\n warnedMessages.clear();\n hasWarned = false;\n },\n };\n\n return logger;\n}\n","import { access } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport const fileExists = async (path: string): Promise<boolean> => {\n return await access(join(process.cwd(), path))\n .then(() => true)\n .catch(() => false);\n};\n","import { createRequire } from \"node:module\";\nimport type * as vite from \"vite\";\n\nexport const importVite = async (): Promise<typeof vite> => {\n try {\n return createRequire(import.meta.url)(\"rolldown-vite\");\n } catch (_error) {\n try {\n return createRequire(import.meta.url)(\"vite\");\n } catch (_error) {\n throw new Error(\n \"Vite is not installed. Please install it with `npm install vite`.\",\n );\n }\n }\n};\n","import { promises as fs } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport {\n type BrotliOptions,\n brotliCompress as brotliCompressCb,\n gzip as gzipCb,\n type ZlibOptions,\n} from \"node:zlib\";\nimport type { Plugin } from \"vite\";\n\nconst gzipCompress = promisify(gzipCb);\nconst brotliCompress = promisify(brotliCompressCb);\n\nexport interface ViteCompressOptions {\n /**\n * If true, the plugin will not compress the files.\n *\n * @default false\n */\n disabled?: boolean;\n\n /**\n * If true, the plugin will compress the files using brotli.\n * Can also be an object with brotli options.\n *\n * @default true\n */\n brotli?: boolean | BrotliOptions;\n\n /**\n * If true, the plugin will compress the files using gzip.\n * Can also be an object with gzip options.\n *\n * @default true\n */\n gzip?: boolean | ZlibOptions;\n\n /**\n * A filter to determine which files to compress.\n * Can be a RegExp or a function that returns true for files to compress.\n *\n * @default /\\.(js|mjs|cjs|css|wasm|svg|html)$/\n */\n filter?: RegExp | ((fileName: string) => boolean);\n}\n\nexport function viteCompress(options: ViteCompressOptions = {}): Plugin {\n const { disabled = false, filter = /\\.(js|mjs|cjs|css|wasm|svg)$/ } = options;\n\n return {\n name: \"compress\",\n apply: \"build\",\n async writeBundle(outputOptions, bundle) {\n if (disabled) {\n return;\n }\n\n const now = Date.now();\n\n const outputDir = outputOptions.dir || resolve(process.cwd(), \"dist\");\n\n const files = Object.keys(bundle)\n .filter((fileName) => {\n // [feature]: filter\n if (typeof filter === \"function\") {\n return filter(fileName);\n }\n return filter.test(fileName);\n })\n .map((fileName) => ({\n fileName,\n filePath: join(outputDir, fileName),\n }));\n\n // Compress each file\n const compressionTasks: Promise<void>[] = [];\n\n for (const { filePath } of files) {\n compressionTasks.push(compressFile(options, filePath));\n }\n\n // Wait for all compression tasks to complete\n await Promise.all(compressionTasks);\n\n this.info(\n `Compressed ${files.length} file${files.length > 1 ? \"s\" : \"\"} in ${Date.now() - now}ms.`,\n );\n },\n };\n}\n\nexport async function compressFile(\n options: ViteCompressOptions = {},\n filePath: string,\n) {\n const { brotli = true, gzip = true } = options;\n\n const compressionTasks: Promise<void>[] = [];\n\n const fileContentPromise = fs.readFile(filePath);\n\n if (gzip) {\n const gzipOptions =\n typeof gzip === \"object\"\n ? gzip\n : {\n level: 9, // default gzip compression level\n };\n compressionTasks.push(\n fileContentPromise.then(async (content) => {\n const compressed = await gzipCompress(content, gzipOptions);\n await fs.writeFile(`${filePath}.gz`, compressed);\n }),\n );\n }\n\n if (brotli) {\n const brotliOptions = typeof brotli === \"object\" ? brotli : {};\n compressionTasks.push(\n fileContentPromise.then(async (content) => {\n const compressed = await brotliCompress(content, brotliOptions);\n await fs.writeFile(`${filePath}.br`, compressed);\n }),\n );\n }\n\n await Promise.all(compressionTasks);\n}\n","import type { UserConfig } from \"vite\";\nimport { analyzer as viteAnalyzer } from \"vite-bundle-analyzer\";\nimport { createBufferedLogger } from \"../helpers/createBufferedLogger.ts\";\nimport { importVite } from \"../helpers/importVite.ts\";\nimport {\n type ViteCompressOptions,\n viteCompress,\n} from \"../plugins/viteCompress.ts\";\n\nexport interface BuildClientOptions {\n /**\n * Output directory for client build.\n */\n dist: string;\n\n /**\n * If true, precompress assets using gzip and brotli compression.\n *\n * @default false\n */\n precompress?: ViteCompressOptions | boolean;\n\n /**\n * If true, prerender all static routes found in the $pages directory.\n *\n * @default false\n */\n prerender?: boolean;\n\n /**\n * Build a sitemap.xml file based on the $pages routes.\n */\n sitemap?: {\n hostname: string;\n };\n\n /**\n * Override Vite config options.\n */\n config?: UserConfig;\n\n /**\n * If true, generate build stats report.\n */\n stats?: boolean;\n\n /**\n * If true, suppress build output. Logs are buffered and only shown on failure.\n *\n * @default false\n */\n silent?: boolean;\n}\n\n/**\n * Build client-side bundle with Vite.\n *\n * This task compiles the browser/client code for production,\n * including code splitting, minification, and optional compression.\n */\nexport async function buildClient(opts: BuildClientOptions): Promise<void> {\n const { build: viteBuild, mergeConfig } = await importVite();\n const plugins: any[] = [];\n\n const compress: ViteCompressOptions | undefined = opts.precompress\n ? typeof opts.precompress === \"object\"\n ? opts.precompress\n : {}\n : undefined;\n\n if (opts.stats) {\n plugins.push(\n viteAnalyzer({\n analyzerMode: \"static\",\n }),\n );\n }\n\n if (opts.precompress && compress) {\n plugins.push(viteCompress(compress));\n }\n\n // Create buffered logger for silent mode\n const logger = opts.silent ? createBufferedLogger() : undefined;\n\n const viteBuildClientConfig: UserConfig = {\n mode: \"production\",\n logLevel: opts.silent ? \"silent\" : undefined,\n define: {\n \"process.env.NODE_ENV\": '\"production\"',\n },\n publicDir: \"public\",\n build: {\n chunkSizeWarningLimit: 1000,\n outDir: opts.dist,\n rollupOptions: {\n output: {\n entryFileNames: \"entry.[hash].js\",\n chunkFileNames: \"chunk.[hash].js\",\n assetFileNames: \"asset.[hash][extname]\",\n },\n },\n },\n esbuild: { legalComments: \"none\" },\n customLogger: logger,\n plugins,\n };\n\n try {\n await viteBuild(mergeConfig(viteBuildClientConfig, opts.config ?? {}));\n } catch (error) {\n // Flush buffered logs on failure so user can see what happened\n logger?.flush();\n throw error;\n }\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport m from \"node:module\";\nimport { join } from \"node:path\";\n\nexport interface GenerateExternalsOptions {\n /**\n * Output directory for package.json.\n */\n distDir: string;\n\n /**\n * List of external package names.\n */\n externals: string[];\n}\n\n/**\n * Generate minimal package.json with pinned external dependencies.\n *\n * This task creates a package.json in the dist directory containing\n * only the external dependencies needed at runtime, with their versions\n * pinned to the currently installed versions.\n */\nexport async function generateExternals(\n opts: GenerateExternalsOptions,\n): Promise<void> {\n const require = m.createRequire(import.meta.filename);\n const deps: Record<string, string> = {};\n\n for (const dep of opts.externals) {\n try {\n const requirePath = require.resolve(dep);\n const pkgPath = `${requirePath.split(`node_modules/${dep}`)[0]}node_modules/${dep}/package.json`;\n const pkg = JSON.parse(await readFile(pkgPath, \"utf-8\"));\n deps[dep] = `^${pkg.version}`;\n } catch (_err) {\n console.warn(`[generateExternals] Cannot find '${dep}' in node_modules`);\n }\n }\n\n const minimalPkg = {\n type: \"module\",\n main: \"index.js\",\n dependencies: deps,\n };\n\n await mkdir(opts.distDir, { recursive: true });\n\n const target = join(opts.distDir, \"package.json\");\n await writeFile(target, JSON.stringify(minimalPkg, null, 2), \"utf-8\");\n}\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { AlephaError } from \"alepha\";\nimport type * as vite from \"vite\";\nimport type { UserConfig } from \"vite\";\nimport { analyzer as viteAnalyzer } from \"vite-bundle-analyzer\";\nimport { createBufferedLogger } from \"../helpers/createBufferedLogger.ts\";\nimport { importVite } from \"../helpers/importVite.ts\";\nimport { generateExternals } from \"./generateExternals.ts\";\n\nexport interface BuildServerOptions {\n /**\n * Path to the server entry file.\n */\n entry: string;\n\n /**\n * Output directory for server build.\n */\n distDir: string;\n\n /**\n * Optional client directory name (relative to distDir).\n * If provided, the client template will be embedded in the server output.\n */\n clientDir?: string;\n\n /**\n * Override Vite config options.\n */\n config?: UserConfig;\n\n /**\n * If true, generate build stats report.\n */\n stats?: boolean;\n\n /**\n * If true, suppress build output. Logs are buffered and only shown on failure.\n *\n * @default false\n */\n silent?: boolean;\n}\n\nexport interface BuildServerResult {\n /**\n * The filename of the built server entry (e.g., \"abc123.js\").\n */\n entryFile: string;\n}\n\n/**\n * Build server-side SSR bundle with Vite.\n *\n * This task compiles the server code for production,\n * generates the externals package.json, and creates\n * the dist/index.js entry wrapper.\n */\nexport async function buildServer(\n opts: BuildServerOptions,\n): Promise<BuildServerResult> {\n const { build: viteBuild, mergeConfig } = await importVite();\n const plugins: any[] = [];\n\n if (opts.stats) {\n plugins.push(\n viteAnalyzer({\n analyzerMode: \"static\",\n }),\n );\n }\n\n // Create buffered logger for silent mode\n const logger = opts.silent ? createBufferedLogger() : undefined;\n\n const viteBuildServerConfig: UserConfig = {\n mode: \"production\",\n logLevel: opts.silent ? \"silent\" : undefined,\n define: {\n \"process.env.NODE_ENV\": '\"production\"',\n },\n publicDir: false,\n ssr: {\n noExternal: true,\n },\n build: {\n sourcemap: true, // or \"hidden\" if you don't want to expose source maps\n ssr: opts.entry,\n outDir: `${opts.distDir}/server`,\n minify: true,\n chunkSizeWarningLimit: 10000,\n rollupOptions: {\n output: {\n entryFileNames: \"[hash].js\",\n chunkFileNames: \"[hash].js\",\n assetFileNames: \"[hash][extname]\",\n format: \"esm\",\n },\n },\n },\n esbuild: { legalComments: \"none\", keepNames: true },\n customLogger: logger,\n plugins,\n };\n\n let result: vite.Rollup.RollupOutput | vite.Rollup.RollupOutput[];\n try {\n result = (await viteBuild(\n mergeConfig(viteBuildServerConfig, opts.config || {}),\n )) as vite.Rollup.RollupOutput | vite.Rollup.RollupOutput[];\n } catch (error) {\n // Flush buffered logs on failure so user can see what happened\n logger?.flush();\n throw error;\n }\n\n // Extract resolved config to get externals\n const resolvedConfig = (result as any).resolvedConfig;\n const externals: string[] = resolvedConfig?.ssr?.external ?? [];\n\n // Generate package.json with externals\n await generateExternals({\n distDir: opts.distDir,\n externals,\n });\n\n const entryFile = extractEntryFromBundle(opts.entry, result);\n\n // Embed client template if client was built\n let template = \"\";\n if (opts.clientDir) {\n const index = await readFile(\n `${opts.distDir}/${opts.clientDir}/index.html`,\n \"utf-8\",\n );\n template = `__alepha.set(\"alepha.react.server.template\", \\`${index.replace(/>\\s*</g, \"><\").trim()}\\`);\\n`;\n }\n\n const warning =\n \"// This file was automatically generated. DO NOT MODIFY.\" +\n \"\\n\" +\n \"// Changes to this file will be lost when the code is regenerated.\\n\";\n\n await writeFile(\n `${opts.distDir}/index.js`,\n `${warning}\\nimport './server/${entryFile}';${template}`.trim(),\n );\n\n return { entryFile };\n}\n\n/**\n * Extract entry filename from Vite build result.\n */\nfunction extractEntryFromBundle(\n entry: string,\n result:\n | vite.Rollup.RollupOutput\n | vite.Rollup.RollupOutput[]\n | vite.Rollup.RollupWatcher,\n): string {\n const entryFilePath = entry.startsWith(\"/\")\n ? entry\n : join(process.cwd(), entry);\n\n const rollupOutput = (\n Array.isArray(result) ? result[0] : result\n ) as vite.Rollup.RollupOutput;\n\n const entryFile = rollupOutput.output.find(\n (it) => \"facadeModuleId\" in it && it.facadeModuleId === entryFilePath,\n )?.fileName;\n\n if (!entryFile) {\n throw new AlephaError(\n `Could not find the entry file \"${entryFilePath}\" in the build output. Please check your entry file and try again.`,\n );\n }\n\n return entryFile;\n}\n","import { join } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { type Alepha, AlephaError } from \"alepha\";\nimport { importVite } from \"./importVite.ts\";\n\n/**\n * Import Alepha instance from a transpiled server entry file.\n */\nexport const importAlepha = async (\n entry: string,\n options?: {\n env: Record<string, string>;\n },\n): Promise<Alepha> => {\n if (global.__cli_alepha) {\n return global.__cli_alepha as Alepha;\n }\n\n const { loadEnv } = await importVite();\n\n const env = loadEnv(\"development\", process.cwd(), \"\");\n\n for (const key in env) {\n process.env[key] = env[key];\n }\n\n if (options?.env) {\n for (const key in options.env) {\n process.env[key] = options.env[key];\n }\n }\n\n process.env.ALEPHA_CLI_IMPORT = \"true\";\n process.env.LOG_LEVEL = \"error\";\n process.env.LOG_FORMAT = \"pretty\";\n process.env.NODE_ENV = \"production\";\n\n const entryFile = pathToFileURL(join(process.cwd(), entry)).href;\n const mod = await import(entryFile);\n\n // check if alepha is correctly exported\n if (mod.default) {\n return mod.default;\n }\n\n // else, try with global variable\n const alepha = global.__cli_alepha as Alepha | undefined;\n if (!alepha) {\n throw new AlephaError(\n \"Alepha instance not found. Ensure Alepha is initialized.\",\n );\n }\n\n return alepha;\n};\n","import { cp, mkdir } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { importAlepha } from \"../helpers/importAlepha.ts\";\n\nexport interface CopyAssetsOptions {\n /**\n * Entry point for the built Alepha application.\n */\n entry: string;\n\n /**\n * Output directory for copied assets.\n */\n distDir: string;\n}\n\n/**\n * Copy assets from Alepha packages to the build output directory.\n *\n * This task loads the built Alepha application, reads the\n * `alepha.build.assets` state to find packages with assets,\n * and copies their `/assets` directories to the build output.\n *\n * Used by modules like AlephaServerSwagger to distribute UI files.\n */\nexport async function copyAssets(opts: CopyAssetsOptions): Promise<void> {\n const root = process.cwd();\n const alepha = await importAlepha(opts.entry);\n const assets = alepha.store.get(\"alepha.build.assets\");\n\n if (!assets || assets.length === 0) {\n return;\n }\n\n const require = createRequire(join(root, opts.entry));\n const buildAssetsDir = join(root, `${opts.distDir}/assets`);\n await mkdir(buildAssetsDir).catch(() => null);\n\n for (const pkgName of assets ?? []) {\n const pkgDir = dirname(require.resolve(`${pkgName}/package.json`));\n const assetsPkgDir = resolve(pkgDir, \"assets\");\n await cp(assetsPkgDir, buildAssetsDir, { recursive: true });\n }\n}\n","import { writeFile } from \"node:fs/promises\";\nimport { basename, join } from \"node:path\";\n\nexport interface GenerateCloudflareOptions {\n /**\n * The directory where the build output is placed.\n *\n * @default \"dist\"\n */\n distDir?: string;\n}\n\nconst WARNING_COMMENT =\n \"// This file was automatically generated. DO NOT MODIFY.\\n\" +\n \"// Changes to this file will be lost when the code is regenerated.\\n\";\n\n/**\n * Generate Cloudflare Workers deployment configuration.\n *\n * This task creates:\n * - wrangler.jsonc with worker configuration\n * - worker.js entry point for Cloudflare Workers\n */\nexport async function generateCloudflare(\n opts: GenerateCloudflareOptions = {},\n): Promise<void> {\n const distDir = opts.distDir ?? \"dist\";\n const root = process.cwd();\n const name = basename(root);\n\n await writeWranglerConfig(root, distDir, name);\n await writeWorkerEntryPoint(root, distDir);\n}\n\n/**\n * Write the wrangler.jsonc configuration file for Cloudflare Workers\n */\nasync function writeWranglerConfig(\n root: string,\n distDir: string,\n name: string,\n): Promise<void> {\n const wrangler = {\n name,\n main: \"./main.cloudflare.js\",\n compatibility_flags: [\"nodejs_compat\"],\n compatibility_date: \"2025-11-17\",\n };\n\n await writeFile(\n join(root, distDir, \"wrangler.jsonc\"),\n JSON.stringify(wrangler, null, 2),\n );\n}\n\n/**\n * Write the worker entry point that bootstraps Alepha and handles fetch requests\n */\nasync function writeWorkerEntryPoint(\n root: string,\n distDir: string,\n): Promise<void> {\n const workerCode = `\nimport \"./index.js\";\n\nexport default {\n fetch: async (request) => {\n const ctx = { req: request, res: undefined };\n\n await __alepha.start();\n await __alepha.events.emit(\"web:request\", ctx);\n\n return ctx.res;\n },\n};\n`.trim();\n\n await writeFile(\n join(root, distDir, \"main.cloudflare.js\"),\n `${WARNING_COMMENT}\\n${workerCode}`.trim(),\n );\n}\n","import { cp, writeFile } from \"node:fs/promises\";\nimport { fileExists } from \"../helpers/fileExists.ts\";\n\nexport interface GenerateDockerOptions {\n /**\n * The directory where the build output is placed.\n *\n * @default \"dist\"\n */\n distDir?: string;\n\n /**\n * Docker image name to use in the Dockerfile.\n *\n * @default \"node:24-alpine\"\n */\n image?: string;\n\n /**\n * Command to run in the Docker container.\n *\n * @default \"node\"\n */\n command?: string;\n}\n\n/**\n * Generate Docker deployment configuration.\n *\n * This task creates:\n * - Dockerfile with configurable Node image\n * - Copies drizzle migrations if they exist\n */\nexport async function generateDocker(\n opts: GenerateDockerOptions = {},\n): Promise<void> {\n const distDir = opts.distDir ?? \"dist\";\n const image = opts.image ?? \"node:24-alpine\";\n const command = opts.command ?? \"node\";\n\n await copyDrizzleMigrations(distDir);\n await writeDockerfile(distDir, image, command);\n}\n\n/**\n * Copy drizzle migrations to the dist directory if they exist\n */\nasync function copyDrizzleMigrations(distDir: string): Promise<void> {\n const hasMigrations = await fileExists(\"drizzle\");\n if (hasMigrations) {\n await cp(\"drizzle\", `${distDir}/drizzle`, { recursive: true });\n }\n}\n\n/**\n * Write the Dockerfile with the specified base image and command\n */\nasync function writeDockerfile(\n distDir: string,\n image: string,\n command: string,\n): Promise<void> {\n const dockerfile = `# This file was automatically generated. DO NOT MODIFY.\n# Changes to this file will be lost when the code is regenerated.\nFROM ${image}\nWORKDIR /app\n\nCOPY . .\n\nCMD [\"${command}\", \"index.js\"]\n`;\n\n await writeFile(`${distDir}/Dockerfile`, dockerfile);\n}\n","import type { Alepha } from \"alepha\";\nimport { importAlepha } from \"../helpers/importAlepha.ts\";\n\nexport interface GenerateSitemapOptions {\n /**\n * Entry point for the built Alepha application.\n */\n entry: string;\n\n /**\n * Base URL for the sitemap (e.g., \"https://example.com\").\n */\n baseUrl: string;\n\n /**\n * Optional HTML template (for React SSR).\n */\n template?: string;\n}\n\n/**\n * Generate sitemap.xml from Alepha page primitives.\n *\n * This task loads the built Alepha application,\n * queries all page primitives, and generates a sitemap.xml\n * containing URLs for all accessible pages.\n */\nexport async function generateSitemap(\n opts: GenerateSitemapOptions,\n): Promise<string> {\n const alepha = await importAlepha(opts.entry);\n\n if (opts.template) {\n alepha.set(\"alepha.react.server.template\", opts.template);\n }\n\n if (!alepha.isConfigured()) {\n await alepha.events.emit(\"configure\", alepha);\n (alepha as any).configured = true;\n }\n\n return generateSitemapFromAlepha(alepha, opts.baseUrl);\n}\n\nfunction generateSitemapFromAlepha(alepha: Alepha, baseUrl: string): string {\n const pages = alepha.primitives(\"page\") as any[];\n const urls: string[] = [];\n\n for (const page of pages) {\n const options = page.options;\n\n // Skip pages with children (parent pages that can't be rendered directly)\n if (options.children) {\n continue;\n }\n\n // Only include static pages or pages without parameters\n if (!options.schema?.params) {\n // Simple page without parameters\n const path = options.path || \"\";\n const url = `${baseUrl.replace(/\\/$/, \"\")}${path === \"\" ? \"/\" : path}`;\n urls.push(url);\n } else if (\n options.static &&\n typeof options.static === \"object\" &&\n options.static.entries\n ) {\n // Static page with predefined entries\n for (const entry of options.static.entries) {\n const path = buildPathFromParams(\n options.path || \"\",\n entry.params || {},\n );\n const url = `${baseUrl.replace(/\\/$/, \"\")}${path}`;\n urls.push(url);\n }\n }\n }\n\n return buildSitemapXml(urls);\n}\n\nfunction buildPathFromParams(\n pathPattern: string,\n params: Record<string, any>,\n): string {\n let path = pathPattern;\n\n for (const [key, value] of Object.entries(params)) {\n path = path.replace(`:${key}`, String(value));\n }\n\n return path || \"/\";\n}\n\nfunction buildSitemapXml(urls: string[]): string {\n const lastMod = new Date().toISOString().split(\"T\")[0];\n const urlEntries = urls\n .map(\n (url) =>\n ` <url>\\n <loc>${escapeXml(url)}</loc>\\n\\t\\t<lastmod>${lastMod}</lastmod>\\n </url>`,\n )\n .join(\"\\n\");\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n${urlEntries}\n</urlset>`;\n}\n\nfunction escapeXml(str: string): string {\n return str\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n}\n","import { mkdir, stat, writeFile } from \"node:fs/promises\";\nimport { importVite } from \"../helpers/importVite.ts\";\n\nexport interface GenerateVercelOptions {\n /**\n * The directory where the build output is placed.\n *\n * @default \"dist\"\n */\n distDir?: string;\n\n /**\n * The name of the client directory.\n *\n * @default \"public\"\n */\n clientDir?: string;\n\n /**\n * Vercel configuration options.\n */\n config?: VercelConfig;\n}\n\nexport interface VercelConfig {\n projectName?: string;\n orgId?: string;\n projectId?: string;\n config?: Record<string, any> & {\n crons?: Array<{\n path: string;\n schedule: string;\n }>;\n };\n}\n\nconst WARNING_COMMENT =\n \"// This file was automatically generated. DO NOT MODIFY.\\n\" +\n \"// Changes to this file will be lost when the code is regenerated.\\n\";\n\n/**\n * Generate Vercel deployment configuration.\n *\n * This task creates:\n * - vercel.json with route rewrites\n * - api/index.js entry point for Vercel serverless function\n * - .vercel/project.json if VERCEL_PROJECT_ID and VERCEL_ORG_ID are set\n */\nexport async function generateVercel(\n opts: GenerateVercelOptions = {},\n): Promise<void> {\n const distDir = opts.distDir ?? \"dist\";\n const clientDir = opts.clientDir ?? \"public\";\n const { loadEnv } = await importVite();\n const env = loadEnv(\"production\", process.cwd(), \"\");\n\n await writeApiEntryPoint(distDir);\n await writeVercelConfig(distDir, clientDir, opts.config?.config);\n\n const projectId = env.VERCEL_PROJECT_ID ?? opts.config?.projectId;\n const projectName = env.VERCEL_PROJECT_NAME ?? opts.config?.projectName;\n const orgId = env.VERCEL_ORG_ID ?? opts.config?.orgId;\n\n if (projectId && orgId) {\n await writeProjectConfig(distDir, projectId, projectName, orgId);\n }\n\n await ensureClientDir(distDir, clientDir);\n}\n\n/**\n * Check if a file or directory exists at the given path\n */\nasync function exists(path: string): Promise<boolean> {\n return stat(path)\n .then(() => true)\n .catch(() => false);\n}\n\n/**\n * Create the serverless function entry point that bootstraps Alepha and handles requests\n */\nasync function writeApiEntryPoint(distDir: string): Promise<void> {\n await mkdir(`${distDir}/api`, { recursive: true });\n await writeFile(\n `${distDir}/api/index.js`,\n `${WARNING_COMMENT}\nimport \"../index.js\";\n\nexport default async (req, res) => {\n\\tawait __alepha.start();\n\\tawait __alepha.events.emit(\"node:request\", { req, res });\n}\n`,\n );\n}\n\n/**\n * Generate vercel.json with route rewrites to direct all traffic to the serverless function\n */\nasync function writeVercelConfig(\n distDir: string,\n clientDir: string,\n config?: VercelConfig[\"config\"],\n): Promise<void> {\n await writeFile(\n `${distDir}/vercel.json`,\n JSON.stringify(\n {\n ...config,\n rewrites: [\n {\n source: \"/(.*)\",\n destination: \"/api/index.js\",\n },\n ],\n buildCommand: \"\",\n installCommand: \"\",\n outputDirectory: clientDir,\n },\n null,\n \" \",\n ),\n );\n}\n\n/**\n * Generate .vercel/project.json to link the deployment to a Vercel project\n */\nasync function writeProjectConfig(\n distDir: string,\n projectId: string,\n projectName: string | undefined,\n orgId: string,\n): Promise<void> {\n await mkdir(`${distDir}/.vercel`, { recursive: true });\n await writeFile(\n `${distDir}/.vercel/project.json`,\n JSON.stringify(\n {\n projectId,\n projectName,\n orgId,\n },\n null,\n \" \",\n ),\n );\n}\n\n/**\n * Create the client directory with a .keep file if it doesn't exist to avoid Vercel errors\n */\nasync function ensureClientDir(\n distDir: string,\n clientDir: string,\n): Promise<void> {\n const path = `${distDir}/${clientDir}`;\n if (!(await exists(path))) {\n await mkdir(path, { recursive: true });\n await writeFile(`${path}/.keep`, \"\");\n }\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport type { Alepha } from \"alepha\";\nimport { importAlepha } from \"../helpers/importAlepha.ts\";\nimport {\n compressFile,\n type ViteCompressOptions,\n} from \"../plugins/viteCompress.ts\";\n\nexport interface PrerenderPagesOptions {\n /**\n * Entry point for the built Alepha application.\n */\n entry: string;\n\n /**\n * Client dist directory for output files.\n */\n dist: string;\n\n /**\n * Optional compression options.\n */\n compress?: ViteCompressOptions | boolean;\n}\n\nexport interface PrerenderPagesResult {\n /**\n * Number of pages pre-rendered.\n */\n count: number;\n}\n\n/**\n * Pre-render static pages defined in the Alepha application.\n *\n * This task loads the built Alepha application, queries all page\n * primitives with `static: true`, and generates static HTML files\n * for each page. Supports pages with parameterized routes via\n * `static.entries` configuration.\n */\nexport async function prerenderPages(\n opts: PrerenderPagesOptions,\n): Promise<PrerenderPagesResult> {\n const alepha = await importAlepha(opts.entry);\n\n const now = Date.now();\n\n if (!alepha.isConfigured()) {\n await alepha.events.emit(\"configure\", alepha);\n (alepha as any).configured = true;\n }\n\n return await prerenderFromAlepha(alepha, opts.dist, opts.compress);\n}\n\nasync function prerenderFromAlepha(\n alepha: Alepha,\n dist: string,\n compress?: ViteCompressOptions | boolean,\n): Promise<PrerenderPagesResult> {\n let count = 0;\n const pages = alepha.primitives(\"page\") as any[];\n\n for (const page of pages) {\n const options = page.options;\n\n if (options.children) {\n continue;\n }\n\n if (!options.static) {\n continue;\n }\n\n const config = typeof options.static === \"object\" ? options.static : {};\n\n if (!options.schema?.params) {\n count += 1;\n await renderFile(page, {}, dist, compress);\n continue;\n }\n\n if (config.entries) {\n for (const entry of config.entries) {\n count += 1;\n await renderFile(page, entry, dist, compress);\n }\n }\n }\n\n return { count };\n}\n\nasync function renderFile(\n page: any,\n options: any,\n dist: string,\n compress?: ViteCompressOptions | boolean,\n) {\n const { html, state } = await page.render({\n html: true,\n ...options,\n });\n\n const pathname = state.url.pathname;\n const filepath = `${dist}${pathname === \"/\" ? \"/index\" : pathname}.html`;\n\n await mkdir(filepath.substring(0, filepath.lastIndexOf(\"/\")), {\n recursive: true,\n });\n\n await writeFile(filepath, html);\n\n if (compress) {\n await compressFile(typeof compress === \"object\" ? compress : {}, filepath);\n }\n}\n","import path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport type { Alepha, State } from \"alepha\";\nimport type { ResolvedConfig, ViteDevServer } from \"vite\";\nimport { importVite } from \"../helpers/importVite.ts\";\n\nexport interface AlephaRunnerOptions {\n /**\n * Path to the server entry file.\n */\n entry: string;\n\n /**\n * Enable debug logging.\n */\n debug?: boolean;\n}\n\nexport interface AlephaRunnerState {\n root: string;\n started: boolean;\n app?: Alepha;\n config?: ResolvedConfig;\n lock?: PromiseWithResolvers<void>;\n log: (...msg: string[]) => void;\n entry: string;\n onReload?: () => void;\n}\n\n/**\n * Create an Alepha runner for development.\n *\n * The runner manages the lifecycle of an Alepha application during\n * Vite dev server operation, handling start/stop/restart and HMR.\n */\nexport function createAlephaRunner(opts: AlephaRunnerOptions): AlephaRunner {\n const state: AlephaRunnerState = {\n root: process.cwd().replace(/\\\\/g, \"/\"),\n started: false,\n log: opts.debug ? (...msg: string[]) => console.log(...msg) : () => {},\n entry: opts.entry,\n onReload: () => {},\n };\n\n return new AlephaRunner(state);\n}\n\nexport class AlephaRunner {\n protected state: AlephaRunnerState;\n\n constructor(state: AlephaRunnerState) {\n this.state = state;\n }\n\n /**\n * Set resolved Vite config.\n */\n setConfig(config: ResolvedConfig): void {\n this.state.config = config;\n }\n\n /**\n * Check if SSR is enabled for the running app.\n */\n isSsrEnabled(): boolean {\n if (!this.state.app) return false;\n return (\n (this.state.app.store.get(\"alepha.react.server.ssr\" as keyof State) as\n | boolean\n | undefined) ?? false\n );\n }\n\n /**\n * Check if app is started.\n */\n get isStarted(): boolean {\n return this.state.started;\n }\n\n /**\n * Get the running Alepha app instance.\n */\n get app(): Alepha | undefined {\n return this.state.app;\n }\n\n /**\n * Start the Alepha application.\n */\n async start(server: ViteDevServer): Promise<void> {\n const { loadEnv } = await importVite();\n\n // unfortunately, vite SSR loader does not fix stack traces automatically\n // for now, we make a global helper and alepha/logger will use it before logging errors\n // that's not ideal but works for now\n (global as any).ssrFixStacktrace = (e: Error) => {\n server.ssrFixStacktrace(e);\n let it: any = e;\n do {\n server.ssrFixStacktrace(it);\n it = it.cause;\n } while (it instanceof Error);\n };\n\n if (this.state.started) {\n await this.restart(server, true);\n return;\n }\n\n if (!this.state.config) {\n this.state.log(\"[DEBUG] No config - skip starting\");\n return;\n }\n\n this.state.onReload?.();\n\n this.state.log(\"[DEBUG] Starting Alepha app...\");\n\n this.state.started = false;\n this.state.app = undefined;\n\n const serverEntryPath = path.resolve(\n this.state.config.root,\n this.state.entry,\n );\n const fileUrl = pathToFileURL(`${serverEntryPath}`).href;\n const env = loadEnv(\"development\", this.state.config.root, \"\");\n const before = { ...process.env };\n\n for (const key in env) {\n process.env[key] = env[key];\n }\n\n process.env.NODE_ENV ??= \"development\";\n process.env.VITE_ALEPHA_DEV = \"true\";\n process.env.SERVER_HOST ??=\n typeof server.config.server.host === \"string\"\n ? server.config.server.host\n : \"localhost\";\n process.env.SERVER_PORT ??= String(server.config.server.port || \"5173\");\n\n try {\n const now = Date.now();\n await server.ssrLoadModule(fileUrl, {\n fixStacktrace: true,\n });\n this.state.log(`[DEBUG] Alepha app loaded in ${Date.now() - now}ms`);\n await new Promise((r) => setTimeout(r, 10));\n\n this.state.app = (globalThis as any).__alepha;\n if (!this.state.app) {\n this.state.log(\"[DEBUG] No app found - skip starting\");\n return;\n }\n\n this.state.app.store.set(\"alepha.node.server\" as any, server.httpServer);\n\n await this.state.app.start();\n this.state.started = true;\n\n process.env = { ...before };\n\n this.state.log(\"[DEBUG] Starting Done!\");\n } catch (e) {\n if (e instanceof Error) {\n let it: any = e;\n do {\n server.ssrFixStacktrace(it);\n it = it.cause;\n } while (it instanceof Error);\n\n server.ssrFixStacktrace(e);\n if (e.cause instanceof Error) {\n server.ssrFixStacktrace(e.cause);\n }\n\n this.state.app?.log?.error(\"App failed to start:\", e);\n this.state.app?.log?.info(\"Waiting for changes to restart...\");\n }\n this.state.log(\"[DEBUG] Alepha app start error\");\n this.state.started = false;\n }\n }\n\n /**\n * Stop the Alepha application.\n */\n async stop(): Promise<void> {\n if (this.state.app?.stop && this.state.started) {\n this.state.log(\"[DEBUG] Stopping Alepha app...\");\n await this.state.app.stop();\n this.state.started = false;\n this.state.log(\"[DEBUG] Stopping Done!\");\n } else {\n this.state.log(\"[DEBUG] Alepha app not started - skip stop\");\n }\n }\n\n /**\n * Restart the Alepha application.\n *\n * @returns true if the restart was skipped due to locking\n */\n async restart(server: ViteDevServer, invalidate?: boolean): Promise<boolean> {\n if (this.state.lock) {\n this.state.log(\"[DEBUG] STILL LOCKING\");\n return true;\n }\n\n this.state.log(\"[DEBUG] LOCK RESTART\");\n this.state.lock = Promise.withResolvers();\n\n const now = Date.now();\n this.state.log(\"[DEBUG] RESTART\");\n await this.stop();\n this.state.log(`[DEBUG] RESTART (stop) in ${Date.now() - now}ms`);\n\n if (invalidate) {\n server.moduleGraph.invalidateAll();\n }\n\n await this.start(server);\n this.state.log(`[DEBUG] RESTART OK in ${Date.now() - now}ms`);\n\n setTimeout(() => {\n this.state.log(\"[DEBUG] UNLOCK RESTART\");\n this.state.lock?.resolve();\n this.state.lock = undefined;\n }, 500);\n\n return false;\n }\n\n /**\n * Send reload event to client.\n */\n sendReload(server: ViteDevServer): void {\n server.ws.send({\n type: \"custom\",\n event: \"alepha:reload\",\n data: {},\n });\n }\n}\n\n/**\n * Check if a URL path is a Vite internal file.\n */\nexport function isViteInternalPath(pathname: string): boolean {\n const [path] = pathname.split(\"?\");\n\n // Vite internal files\n if (\n path.startsWith(\"/@\") ||\n path.startsWith(\"/src\") ||\n path.includes(\"/node_modules/\")\n ) {\n return true;\n }\n\n return false;\n}\n","import { readFile, unlink, writeFile } from \"node:fs/promises\";\nimport type { Plugin, UserConfig } from \"vite\";\nimport { boot } from \"../helpers/boot.ts\";\nimport { fileExists } from \"../helpers/fileExists.ts\";\nimport {\n type BuildClientOptions,\n buildClient,\n buildServer,\n copyAssets,\n type GenerateDockerOptions,\n generateCloudflare,\n generateDocker,\n generateSitemap,\n generateVercel,\n prerenderPages,\n type VercelConfig,\n} from \"../tasks/index.ts\";\n\nexport interface ViteAlephaBuildOptions {\n /**\n * Path to the entry file for the server build.\n * If empty, SSR build will be skipped.\n */\n serverEntry?: string | false;\n\n /**\n * Set false to skip the client build.\n * This is useful if you only want to build the server-side application.\n */\n client?: false | Partial<BuildClientOptions>;\n\n /**\n * If true, the build will be optimized for Vercel deployment.\n *\n * If `VERCEL_PROJECT_ID` and `VERCEL_ORG_ID` environment variables are set, .vercel will be generated with the correct configuration.\n *\n * @default false\n */\n vercel?: boolean | VercelConfig;\n\n /**\n * If true, the build will generate Cloudflare Workers configuration.\n *\n * @default false\n */\n cloudflare?: boolean;\n\n /**\n * If true, the build will be optimized for Docker deployment.\n * Additionally, it will generate a Dockerfile in the dist directory.\n */\n docker?: boolean | Omit<GenerateDockerOptions, \"distDir\">;\n\n /**\n * If true, build statistics will be printed after the build completes.\n */\n stats?: boolean;\n}\n\n/**\n * Build modes controlled by ALEPHA_BUILD_MODE environment variable:\n * - \"cli\": Skip plugin entirely, CLI handles all tasks\n * - \"client\": Only build client bundle\n * - \"server\": Only build server bundle\n * - undefined/other: Full build (default behavior)\n */\nexport type AlephaBuildMode = \"cli\" | \"client\" | \"server\";\n\n/**\n * Alepha build plugin for Vite.\n *\n * This plugin orchestrates the complete build process:\n * 1. Build client (if index.html exists)\n * 2. Build server (SSR)\n * 3. Copy assets from packages\n * 4. Pre-render static pages (if enabled)\n * 5. Generate sitemap (if enabled)\n * 6. Generate deployment config (Vercel/Cloudflare/Docker)\n *\n * Build mode can be controlled via ALEPHA_BUILD_MODE env var for CLI integration.\n */\nexport async function viteAlephaBuild(\n options: ViteAlephaBuildOptions = {},\n): Promise<Plugin> {\n const entry = options.serverEntry ?? (await boot.getServerEntry());\n const distDir = \"dist\";\n const clientDir = \"public\";\n\n let rootConfig: UserConfig = {};\n\n return {\n name: \"alepha-build\",\n apply: \"build\",\n config(config, ctx) {\n const buildMode = process.env.ALEPHA_BUILD_MODE as\n | AlephaBuildMode\n | undefined;\n\n // CLI mode: plugin does nothing, CLI handles everything\n if (buildMode === \"cli\") {\n return;\n }\n\n // For now, we run two separate builds: one for the client and one for the server\n // We distinguish them using an environment variable\n if (!process.env.VITE_DOUBLE_BUILD_DONE) {\n rootConfig = config;\n }\n\n if (ctx.isSsrBuild || !process.env.VITE_DOUBLE_BUILD_DONE) {\n // Server build, so we don't need the public directory\n config.publicDir = false;\n } else {\n // Client build, so we need the public directory\n config.publicDir = \"public\";\n }\n },\n async buildStart() {\n const buildMode = process.env.ALEPHA_BUILD_MODE as\n | AlephaBuildMode\n | undefined;\n\n // CLI mode: skip entirely\n if (buildMode === \"cli\") {\n return;\n }\n\n if (process.env.VITE_DOUBLE_BUILD_DONE === \"true\") {\n return;\n }\n\n process.env.VITE_DOUBLE_BUILD_DONE = \"true\";\n\n const hasClient =\n options.client !== false && (await fileExists(\"index.html\"));\n\n const buildClientOptions =\n typeof options.client === \"object\" ? options.client : {};\n\n const stats = options.stats ?? process.env.ALEPHA_BUILD_STATS === \"true\";\n\n // Client-only mode\n if (buildMode === \"client\") {\n if (hasClient) {\n await buildClient({\n ...buildClientOptions,\n config: rootConfig,\n dist: `${distDir}/${clientDir}`,\n stats,\n });\n }\n process.exit(0);\n }\n\n // Server-only mode\n if (buildMode === \"server\") {\n if (entry) {\n // Check if client was already built (template exists)\n let clientBuilt = false;\n try {\n await readFile(`${distDir}/${clientDir}/index.html`, \"utf-8\");\n clientBuilt = true;\n } catch {\n // No client build\n }\n\n await buildServer({\n config: {\n base: rootConfig.base || \"\",\n },\n entry,\n distDir,\n clientDir: clientBuilt ? clientDir : undefined,\n stats,\n });\n }\n process.exit(0);\n }\n\n // Full build mode (default)\n\n // Task 1: Build client\n if (hasClient) {\n await buildClient({\n ...buildClientOptions,\n config: rootConfig,\n dist: `${distDir}/${clientDir}`,\n stats,\n });\n }\n\n let template = \"\";\n if (hasClient) {\n // Load output index.html for template embedding\n template = await readFile(\n `${distDir}/${clientDir}/index.html`,\n \"utf-8\",\n );\n }\n\n // Task 2: Build server\n if (entry) {\n await buildServer({\n config: {\n base: rootConfig.base || \"\",\n },\n entry,\n distDir,\n clientDir: hasClient ? clientDir : undefined,\n stats,\n });\n\n // Server will handle index.html if both client & server are built\n if (hasClient && options.serverEntry !== false) {\n await unlink(`${distDir}/${clientDir}/index.html`);\n }\n\n // Task 3: Copy assets (swagger ui & others)\n await copyAssets({\n entry: `${distDir}/index.js`,\n distDir,\n });\n }\n\n // Task 4: Generate sitemap\n if (buildClientOptions.sitemap && entry) {\n await writeFile(\n `${distDir}/${clientDir}/sitemap.xml`,\n await generateSitemap({\n entry: `${distDir}/index.js`,\n baseUrl: buildClientOptions.sitemap.hostname,\n }),\n );\n }\n\n // Task 5: Pre-render static pages\n if (buildClientOptions.prerender && template) {\n await prerenderPages({\n dist: `${distDir}/${clientDir}`,\n entry: `${distDir}/index.js`,\n compress: buildClientOptions.precompress,\n });\n }\n\n // Task 6: Generate deployment configurations\n if (options.vercel) {\n const config =\n typeof options.vercel === \"boolean\" ? {} : options.vercel;\n await generateVercel({\n distDir,\n clientDir,\n config,\n });\n }\n\n if (options.cloudflare) {\n await generateCloudflare({\n distDir,\n });\n }\n\n if (options.docker) {\n const dockerOpts =\n typeof options.docker === \"boolean\" ? {} : options.docker;\n await generateDocker({\n distDir,\n ...dockerOpts,\n });\n }\n\n // Prevent the default build from running again\n process.exit(0);\n },\n };\n}\n","import type { Plugin, ResolvedConfig } from \"vite\";\nimport { boot } from \"../helpers/boot.ts\";\nimport { createAlephaRunner, isViteInternalPath } from \"../tasks/runAlepha.ts\";\n\nexport interface ViteAlephaDevOptions {\n /**\n * Path to the entry file for the server build.\n * If empty, plugin will be disabled.\n */\n serverEntry?: string | false;\n\n /**\n * If true, enables debug logging.\n *\n * @default false\n */\n debug?: boolean;\n}\n\n/**\n * Plug Alepha into Vite development server.\n *\n * This plugin manages the Alepha application lifecycle during development,\n * handling hot module replacement and request forwarding.\n */\nexport async function viteAlephaDev(\n options: ViteAlephaDevOptions = {},\n): Promise<Plugin> {\n let entry = options.serverEntry;\n if (!entry) {\n entry = await boot.getServerEntry();\n if (!entry) {\n return {\n name: \"alepha-dev\",\n apply: \"serve\",\n config() {},\n };\n }\n }\n\n const runner = createAlephaRunner({\n entry,\n debug: options.debug,\n });\n\n return {\n name: \"alepha-dev\",\n apply: \"serve\",\n configResolved(resolvedConfig: ResolvedConfig) {\n runner.setConfig(resolvedConfig);\n },\n async handleHotUpdate(ctx) {\n if (options.debug) {\n console.log(\"[DEBUG] HMR\", ctx.file);\n }\n\n if (ctx.file.includes(\"/.idea/\")) {\n return [];\n }\n\n const isServerOnly = !ctx.modules[0]?._clientModule;\n const isBrowserOnly = !ctx.modules[0]?._ssrModule;\n const isSsrEnabled = runner.isSsrEnabled();\n\n if (isBrowserOnly) {\n if (options.debug) {\n console.log(\n \"[DEBUG] HMR - browser only - no reason to reload server\",\n );\n }\n return;\n }\n\n const root = process.cwd().replace(/\\\\/g, \"/\");\n const invalidate = !ctx.file.startsWith(root);\n if (invalidate && options.debug) {\n console.log(\"[DEBUG] HMR - outside root - invalidate all\");\n }\n\n if (!isSsrEnabled && isServerOnly) {\n await runner.restart(ctx.server, invalidate);\n return [];\n }\n\n if (isSsrEnabled && ctx.modules[0]) {\n const skip = await runner.restart(ctx.server, invalidate);\n if (skip) {\n return [];\n }\n\n if (!runner.isStarted) {\n if (options.debug) {\n console.log(\"[DEBUG] HMR - abort due to app not started\");\n }\n return [];\n }\n\n if (isServerOnly && runner.isStarted) {\n runner.sendReload(ctx.server);\n return [];\n }\n }\n },\n async configureServer(server) {\n // Forward vite request to alepha server\n server.middlewares.use((req, res, next) => {\n if (\n runner.isStarted &&\n runner.app &&\n req.url &&\n !isViteInternalPath(req.url)\n ) {\n // Patch res.end to detect if alepha handled the request\n // If not, we call next() to let vite handle it (e.g. for static files)\n let ended = false;\n\n const writeHead = res.writeHead.bind(res);\n res.writeHead = (...args: any[]) => {\n ended = true;\n return writeHead(args[0], args[1], args[2]);\n };\n\n return runner.app.events\n .emit(\"node:request\" as any, { req, res })\n .then(() => {\n if (!ended) {\n next();\n }\n });\n }\n next();\n });\n\n server.config.logger.info = (msg: string) => {\n runner.app?.log?.info(msg.trim());\n };\n\n server.config.logger.clearScreen = () => {};\n\n await runner.start(server);\n },\n async closeBundle() {\n // Cleanup handled by runner\n },\n };\n}\n","import { createRequire } from \"node:module\";\nimport { OPTIONS } from \"alepha\";\nimport type { Plugin } from \"vite\";\nimport {\n type ViteAlephaBuildOptions,\n viteAlephaBuild,\n} from \"./viteAlephaBuild.ts\";\nimport { type ViteAlephaDevOptions, viteAlephaDev } from \"./viteAlephaDev.ts\";\n\nexport type ViteAlephaOptions = ViteAlephaDevOptions &\n ViteAlephaBuildOptions & {\n react?: false;\n };\n\nexport function viteAlepha(\n options: ViteAlephaOptions = {},\n): (Plugin | Promise<Plugin>)[] {\n if (process.env.NODE_ENV === \"test\") {\n return [];\n }\n\n const plugins: (Plugin | Promise<Plugin>)[] & { [OPTIONS]?: any } = [];\n\n if (options.react !== false) {\n try {\n const { default: viteReact } = createRequire(import.meta.url)(\n \"@vitejs/plugin-react\",\n );\n plugins.push(viteReact());\n } catch (e) {}\n }\n\n plugins.push(viteAlephaDev(options), viteAlephaBuild(options));\n plugins[OPTIONS] = options;\n\n return plugins;\n}\n","import type { Alepha } from \"alepha\";\n\n// Helpers (for advanced use)\nexport * from \"./helpers/boot.ts\";\nexport * from \"./helpers/createBufferedLogger.ts\";\n// Plugins (public API)\nexport * from \"./plugins/viteAlepha.ts\";\nexport * from \"./plugins/viteAlephaBuild.ts\";\nexport * from \"./plugins/viteAlephaDev.ts\";\nexport * from \"./plugins/viteCompress.ts\";\n// Tasks (for CLI integration)\nexport * from \"./tasks/index.ts\";\n\ndeclare global {\n var __cli_alepha: Alepha;\n}\n\n/**\n * Plugin vite for Alepha framework.\n *\n * This module provides Vite plugins and configurations to integrate Alepha applications with Vite's build and development processes.\n *\n * @example\n * ```ts\n * import { defineConfig } from \"vite\";\n * import { viteAlepha } from \"alepha/vite\";\n *\n * export default defineConfig({\n * plugins: [viteAlepha()],\n * // other Vite configurations...\n * });\n * ```\n *\n * @module alepha.vite\n */\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["path","match: RegExpExecArray | null","entries: BufferedLogEntry[]","path","_error","gzipCb","brotliCompress","brotliCompressCb","compressionTasks: Promise<void>[]","fs","gzip","plugins: any[]","compress: ViteCompressOptions | undefined","viteAnalyzer","viteBuildClientConfig: UserConfig","deps: Record<string, string>","plugins: any[]","viteAnalyzer","viteBuildServerConfig: UserConfig","result: vite.Rollup.RollupOutput | vite.Rollup.RollupOutput[]","externals: string[]","WARNING_COMMENT","urls: string[]","path","path","it: any","path","rootConfig: UserConfig","plugins: (Plugin | Promise<Plugin>)[] & { [OPTIONS]?: any }"],"sources":["../../src/vite/helpers/boot.ts","../../src/vite/helpers/createBufferedLogger.ts","../../src/vite/helpers/fileExists.ts","../../src/vite/helpers/importVite.ts","../../src/vite/plugins/viteCompress.ts","../../src/vite/tasks/buildClient.ts","../../src/vite/tasks/generateExternals.ts","../../src/vite/tasks/buildServer.ts","../../src/vite/helpers/importAlepha.ts","../../src/vite/tasks/copyAssets.ts","../../src/vite/tasks/generateCloudflare.ts","../../src/vite/tasks/generateDocker.ts","../../src/vite/tasks/generateSitemap.ts","../../src/vite/tasks/generateVercel.ts","../../src/vite/tasks/prerenderPages.ts","../../src/vite/tasks/runAlepha.ts","../../src/vite/plugins/viteAlephaBuild.ts","../../src/vite/plugins/viteAlephaDev.ts","../../src/vite/plugins/viteAlepha.ts","../../src/vite/index.ts"],"sourcesContent":["import { access, readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { AlephaError } from \"alepha\";\n\n/**\n * Remember:\n * At first, functions was inside alepha/vite package, but it's now used in alepha too.\n * For avoiding cli -> vite, all code moved here.\n */\n\n/**\n * Find browser/client entry file path.\n */\nconst getClientEntry = async (\n root = process.cwd(),\n): Promise<string | undefined> => {\n const indexPath = join(root, \"index.html\");\n try {\n const html = await readFile(indexPath, \"utf8\");\n return extractFirstModuleScriptSrc(html).replace(/\\\\/g, \"/\");\n } catch {\n return undefined;\n }\n};\n\n/**\n * Find server entry file path.\n */\nconst getServerEntry = async (\n root = process.cwd(),\n explicitEntry?: string,\n): Promise<string> => {\n if (explicitEntry) {\n const explicitPath = join(root, explicitEntry);\n try {\n await access(explicitPath);\n return explicitPath;\n } catch {\n throw new AlephaError(\n `Explicit server entry file \"${explicitEntry}\" not found.`,\n );\n }\n }\n\n const maybeEntry = [\n \"src/main.server.ts\",\n \"src/server-entry.ts\",\n \"src/main.server.tsx\",\n \"src/server-entry.tsx\",\n \"src/main.ts\",\n \"src/main.tsx\",\n ];\n\n for (const entry of maybeEntry) {\n try {\n const path = join(root, entry).replace(/\\\\/g, \"/\");\n await access(path);\n return path;\n } catch {\n // continue to next entry\n }\n }\n\n const clientEntry = await getClientEntry(root);\n if (clientEntry) {\n return clientEntry;\n }\n\n throw new AlephaError(\n `Could not find a server entry file. List of supported entry file: ${maybeEntry.join(\", \")}`,\n );\n};\n\n/**\n * Extract first module script src from HTML.\n */\nfunction extractFirstModuleScriptSrc(html: string): string {\n const scriptRegex = /<script\\b[^>]*>[\\s\\S]*?<\\/script>/gi;\n let match: RegExpExecArray | null = scriptRegex.exec(html);\n\n while (match) {\n const tag = match[0];\n\n // Check for type=\"module\"\n if (/type=[\"']module[\"']/i.test(tag)) {\n // Extract the src value\n const srcMatch = tag.match(/\\bsrc=[\"']([^\"']+)[\"']/i);\n const entry = srcMatch?.[1];\n if (entry) {\n if (entry.startsWith(\"/\")) {\n return entry.substring(1); // Remove leading slash\n }\n return entry;\n }\n }\n\n match = scriptRegex.exec(html);\n }\n\n throw new AlephaError(`No module script found in the provided HTML.`);\n}\n\nexport const boot = {\n getClientEntry,\n getServerEntry,\n};\n","import type { Logger } from \"vite\";\n\ninterface BufferedLogEntry {\n level: \"info\" | \"warn\" | \"error\";\n msg: string;\n timestamp: Date;\n}\n\nexport interface BufferedLogger extends Logger {\n /**\n * Flush all buffered log messages to console.\n * Call this on build failure to show what happened.\n */\n flush(): void;\n\n /**\n * Get all buffered log entries.\n */\n getEntries(): BufferedLogEntry[];\n\n /**\n * Clear all buffered entries without printing.\n */\n clear(): void;\n}\n\n/**\n * Creates a Vite logger that buffers all messages instead of printing them.\n * Useful for silent builds that only show output on failure.\n *\n * @example\n * ```ts\n * const logger = createBufferedLogger();\n * try {\n * await viteBuild({ customLogger: logger, logLevel: 'info' });\n * } catch (error) {\n * logger.flush(); // Print all buffered logs\n * throw error;\n * }\n * ```\n */\nexport function createBufferedLogger(): BufferedLogger {\n const entries: BufferedLogEntry[] = [];\n const loggedErrors = new WeakSet<Error>();\n const warnedMessages = new Set<string>();\n let hasWarned = false;\n\n const logger: BufferedLogger = {\n get hasWarned() {\n return hasWarned;\n },\n\n info(msg: string) {\n entries.push({ level: \"info\", msg, timestamp: new Date() });\n },\n\n warn(msg: string) {\n hasWarned = true;\n entries.push({ level: \"warn\", msg, timestamp: new Date() });\n },\n\n warnOnce(msg: string) {\n if (warnedMessages.has(msg)) {\n return;\n }\n warnedMessages.add(msg);\n hasWarned = true;\n entries.push({ level: \"warn\", msg, timestamp: new Date() });\n },\n\n error(msg: string, options?: { error?: Error | null }) {\n if (options?.error) {\n loggedErrors.add(options.error);\n }\n entries.push({ level: \"error\", msg, timestamp: new Date() });\n },\n\n clearScreen() {\n // No-op in buffered mode - we don't clear anything\n },\n\n hasErrorLogged(error: Error): boolean {\n return loggedErrors.has(error);\n },\n\n flush() {\n for (const entry of entries) {\n const prefix =\n entry.level === \"error\"\n ? \"\\x1b[31m✖\\x1b[0m\"\n : entry.level === \"warn\"\n ? \"\\x1b[33m⚠\\x1b[0m\"\n : \"\\x1b[36mℹ\\x1b[0m\";\n console.log(`${prefix} ${entry.msg}`);\n }\n },\n\n getEntries() {\n return [...entries];\n },\n\n clear() {\n entries.length = 0;\n warnedMessages.clear();\n hasWarned = false;\n },\n };\n\n return logger;\n}\n","import { access } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport const fileExists = async (path: string): Promise<boolean> => {\n return await access(join(process.cwd(), path))\n .then(() => true)\n .catch(() => false);\n};\n","import { createRequire } from \"node:module\";\nimport type * as vite from \"vite\";\n\nexport const importVite = async (): Promise<typeof vite> => {\n try {\n return createRequire(import.meta.url)(\"rolldown-vite\");\n } catch (_error) {\n try {\n return createRequire(import.meta.url)(\"vite\");\n } catch (_error) {\n throw new Error(\n \"Vite is not installed. Please install it with `npm install vite`.\",\n );\n }\n }\n};\n","import { promises as fs } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport {\n type BrotliOptions,\n brotliCompress as brotliCompressCb,\n gzip as gzipCb,\n type ZlibOptions,\n} from \"node:zlib\";\nimport type { Plugin } from \"vite\";\n\nconst gzipCompress = promisify(gzipCb);\nconst brotliCompress = promisify(brotliCompressCb);\n\nexport interface ViteCompressOptions {\n /**\n * If true, the plugin will not compress the files.\n *\n * @default false\n */\n disabled?: boolean;\n\n /**\n * If true, the plugin will compress the files using brotli.\n * Can also be an object with brotli options.\n *\n * @default true\n */\n brotli?: boolean | BrotliOptions;\n\n /**\n * If true, the plugin will compress the files using gzip.\n * Can also be an object with gzip options.\n *\n * @default true\n */\n gzip?: boolean | ZlibOptions;\n\n /**\n * A filter to determine which files to compress.\n * Can be a RegExp or a function that returns true for files to compress.\n *\n * @default /\\.(js|mjs|cjs|css|wasm|svg|html)$/\n */\n filter?: RegExp | ((fileName: string) => boolean);\n}\n\nexport function viteCompress(options: ViteCompressOptions = {}): Plugin {\n const { disabled = false, filter = /\\.(js|mjs|cjs|css|wasm|svg)$/ } = options;\n\n return {\n name: \"compress\",\n apply: \"build\",\n async writeBundle(outputOptions, bundle) {\n if (disabled) {\n return;\n }\n\n const now = Date.now();\n\n const outputDir = outputOptions.dir || resolve(process.cwd(), \"dist\");\n\n const files = Object.keys(bundle)\n .filter((fileName) => {\n // [feature]: filter\n if (typeof filter === \"function\") {\n return filter(fileName);\n }\n return filter.test(fileName);\n })\n .map((fileName) => ({\n fileName,\n filePath: join(outputDir, fileName),\n }));\n\n // Compress each file\n const compressionTasks: Promise<void>[] = [];\n\n for (const { filePath } of files) {\n compressionTasks.push(compressFile(options, filePath));\n }\n\n // Wait for all compression tasks to complete\n await Promise.all(compressionTasks);\n\n this.info(\n `Compressed ${files.length} file${files.length > 1 ? \"s\" : \"\"} in ${Date.now() - now}ms.`,\n );\n },\n };\n}\n\nexport async function compressFile(\n options: ViteCompressOptions = {},\n filePath: string,\n) {\n const { brotli = true, gzip = true } = options;\n\n const compressionTasks: Promise<void>[] = [];\n\n const fileContentPromise = fs.readFile(filePath);\n\n if (gzip) {\n const gzipOptions =\n typeof gzip === \"object\"\n ? gzip\n : {\n level: 9, // default gzip compression level\n };\n compressionTasks.push(\n fileContentPromise.then(async (content) => {\n const compressed = await gzipCompress(content, gzipOptions);\n await fs.writeFile(`${filePath}.gz`, compressed);\n }),\n );\n }\n\n if (brotli) {\n const brotliOptions = typeof brotli === \"object\" ? brotli : {};\n compressionTasks.push(\n fileContentPromise.then(async (content) => {\n const compressed = await brotliCompress(content, brotliOptions);\n await fs.writeFile(`${filePath}.br`, compressed);\n }),\n );\n }\n\n await Promise.all(compressionTasks);\n}\n","import type { UserConfig } from \"vite\";\nimport { analyzer as viteAnalyzer } from \"vite-bundle-analyzer\";\nimport { createBufferedLogger } from \"../helpers/createBufferedLogger.ts\";\nimport { importVite } from \"../helpers/importVite.ts\";\nimport {\n type ViteCompressOptions,\n viteCompress,\n} from \"../plugins/viteCompress.ts\";\n\nexport interface BuildClientOptions {\n /**\n * Output directory for client build.\n */\n dist: string;\n\n /**\n * If true, precompress assets using gzip and brotli compression.\n *\n * @default false\n */\n precompress?: ViteCompressOptions | boolean;\n\n /**\n * If true, prerender all static routes found in the $pages directory.\n *\n * @default false\n */\n prerender?: boolean;\n\n /**\n * Build a sitemap.xml file based on the $pages routes.\n */\n sitemap?: {\n hostname: string;\n };\n\n /**\n * Override Vite config options.\n */\n config?: UserConfig;\n\n /**\n * If true, generate build stats report.\n */\n stats?: boolean;\n\n /**\n * If true, suppress build output. Logs are buffered and only shown on failure.\n *\n * @default false\n */\n silent?: boolean;\n}\n\n/**\n * Build client-side bundle with Vite.\n *\n * This task compiles the browser/client code for production,\n * including code splitting, minification, and optional compression.\n */\nexport async function buildClient(opts: BuildClientOptions): Promise<void> {\n const { build: viteBuild, mergeConfig } = await importVite();\n const plugins: any[] = [];\n\n const compress: ViteCompressOptions | undefined = opts.precompress\n ? typeof opts.precompress === \"object\"\n ? opts.precompress\n : {}\n : undefined;\n\n if (opts.stats) {\n plugins.push(\n viteAnalyzer({\n analyzerMode: \"static\",\n }),\n );\n }\n\n if (opts.precompress && compress) {\n plugins.push(viteCompress(compress));\n }\n\n // Create buffered logger for silent mode\n const logger = opts.silent ? createBufferedLogger() : undefined;\n\n const viteBuildClientConfig: UserConfig = {\n mode: \"production\",\n logLevel: opts.silent ? \"silent\" : undefined,\n define: {\n \"process.env.NODE_ENV\": '\"production\"',\n },\n publicDir: \"public\",\n build: {\n chunkSizeWarningLimit: 1000,\n outDir: opts.dist,\n rollupOptions: {\n output: {\n entryFileNames: \"entry.[hash].js\",\n chunkFileNames: \"chunk.[hash].js\",\n assetFileNames: \"asset.[hash][extname]\",\n },\n },\n },\n esbuild: { legalComments: \"none\" },\n customLogger: logger,\n plugins,\n };\n\n try {\n await viteBuild(mergeConfig(viteBuildClientConfig, opts.config ?? {}));\n } catch (error) {\n // Flush buffered logs on failure so user can see what happened\n logger?.flush();\n throw error;\n }\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport m from \"node:module\";\nimport { join } from \"node:path\";\n\nexport interface GenerateExternalsOptions {\n /**\n * Output directory for package.json.\n */\n distDir: string;\n\n /**\n * List of external package names.\n */\n externals: string[];\n}\n\n/**\n * Generate minimal package.json with pinned external dependencies.\n *\n * This task creates a package.json in the dist directory containing\n * only the external dependencies needed at runtime, with their versions\n * pinned to the currently installed versions.\n */\nexport async function generateExternals(\n opts: GenerateExternalsOptions,\n): Promise<void> {\n const require = m.createRequire(import.meta.filename);\n const deps: Record<string, string> = {};\n\n for (const dep of opts.externals) {\n try {\n const requirePath = require.resolve(dep);\n const pkgPath = `${requirePath.split(`node_modules/${dep}`)[0]}node_modules/${dep}/package.json`;\n const pkg = JSON.parse(await readFile(pkgPath, \"utf-8\"));\n deps[dep] = `^${pkg.version}`;\n } catch (_err) {\n console.warn(`[generateExternals] Cannot find '${dep}' in node_modules`);\n }\n }\n\n const minimalPkg = {\n type: \"module\",\n main: \"index.js\",\n dependencies: deps,\n };\n\n await mkdir(opts.distDir, { recursive: true });\n\n const target = join(opts.distDir, \"package.json\");\n await writeFile(target, JSON.stringify(minimalPkg, null, 2), \"utf-8\");\n}\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { AlephaError } from \"alepha\";\nimport type * as vite from \"vite\";\nimport type { UserConfig } from \"vite\";\nimport { analyzer as viteAnalyzer } from \"vite-bundle-analyzer\";\nimport { createBufferedLogger } from \"../helpers/createBufferedLogger.ts\";\nimport { importVite } from \"../helpers/importVite.ts\";\nimport { generateExternals } from \"./generateExternals.ts\";\n\nexport interface BuildServerOptions {\n /**\n * Path to the server entry file.\n */\n entry: string;\n\n /**\n * Output directory for server build.\n */\n distDir: string;\n\n /**\n * Optional client directory name (relative to distDir).\n * If provided, the client template will be embedded in the server output.\n */\n clientDir?: string;\n\n /**\n * Override Vite config options.\n */\n config?: UserConfig;\n\n /**\n * If true, generate build stats report.\n */\n stats?: boolean;\n\n /**\n * If true, suppress build output. Logs are buffered and only shown on failure.\n *\n * @default false\n */\n silent?: boolean;\n}\n\nexport interface BuildServerResult {\n /**\n * The filename of the built server entry (e.g., \"abc123.js\").\n */\n entryFile: string;\n}\n\n/**\n * Build server-side SSR bundle with Vite.\n *\n * This task compiles the server code for production,\n * generates the externals package.json, and creates\n * the dist/index.js entry wrapper.\n */\nexport async function buildServer(\n opts: BuildServerOptions,\n): Promise<BuildServerResult> {\n const { build: viteBuild, mergeConfig } = await importVite();\n const plugins: any[] = [];\n\n if (opts.stats) {\n plugins.push(\n viteAnalyzer({\n analyzerMode: \"static\",\n }),\n );\n }\n\n // Create buffered logger for silent mode\n const logger = opts.silent ? createBufferedLogger() : undefined;\n\n const viteBuildServerConfig: UserConfig = {\n mode: \"production\",\n logLevel: opts.silent ? \"silent\" : undefined,\n define: {\n \"process.env.NODE_ENV\": '\"production\"',\n },\n publicDir: false,\n ssr: {\n noExternal: true,\n },\n build: {\n sourcemap: true, // or \"hidden\" if you don't want to expose source maps\n ssr: opts.entry,\n outDir: `${opts.distDir}/server`,\n minify: true,\n chunkSizeWarningLimit: 10000,\n rollupOptions: {\n output: {\n entryFileNames: \"[hash].js\",\n chunkFileNames: \"[hash].js\",\n assetFileNames: \"[hash][extname]\",\n format: \"esm\",\n },\n },\n },\n esbuild: { legalComments: \"none\", keepNames: true },\n customLogger: logger,\n plugins,\n };\n\n let result: vite.Rollup.RollupOutput | vite.Rollup.RollupOutput[];\n try {\n result = (await viteBuild(\n mergeConfig(viteBuildServerConfig, opts.config || {}),\n )) as vite.Rollup.RollupOutput | vite.Rollup.RollupOutput[];\n } catch (error) {\n // Flush buffered logs on failure so user can see what happened\n logger?.flush();\n throw error;\n }\n\n // Extract resolved config to get externals\n const resolvedConfig = (result as any).resolvedConfig;\n const externals: string[] = resolvedConfig?.ssr?.external ?? [];\n\n // Generate package.json with externals\n await generateExternals({\n distDir: opts.distDir,\n externals,\n });\n\n const entryFile = extractEntryFromBundle(opts.entry, result);\n\n // Embed client template if client was built\n let template = \"\";\n if (opts.clientDir) {\n const index = await readFile(\n `${opts.distDir}/${opts.clientDir}/index.html`,\n \"utf-8\",\n );\n template = `__alepha.set(\"alepha.react.server.template\", \\`${index.replace(/>\\s*</g, \"><\").trim()}\\`);\\n`;\n }\n\n const warning =\n \"// This file was automatically generated. DO NOT MODIFY.\" +\n \"\\n\" +\n \"// Changes to this file will be lost when the code is regenerated.\\n\";\n\n await writeFile(\n `${opts.distDir}/index.js`,\n `${warning}\\nimport './server/${entryFile}';${template}`.trim(),\n );\n\n return { entryFile };\n}\n\n/**\n * Extract entry filename from Vite build result.\n */\nfunction extractEntryFromBundle(\n entry: string,\n result:\n | vite.Rollup.RollupOutput\n | vite.Rollup.RollupOutput[]\n | vite.Rollup.RollupWatcher,\n): string {\n const entryFilePath = entry.startsWith(\"/\")\n ? entry\n : join(process.cwd(), entry);\n\n const rollupOutput = (\n Array.isArray(result) ? result[0] : result\n ) as vite.Rollup.RollupOutput;\n\n const entryFile = rollupOutput.output.find(\n (it) => \"facadeModuleId\" in it && it.facadeModuleId === entryFilePath,\n )?.fileName;\n\n if (!entryFile) {\n throw new AlephaError(\n `Could not find the entry file \"${entryFilePath}\" in the build output. Please check your entry file and try again.`,\n );\n }\n\n return entryFile;\n}\n","import { join } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { type Alepha, AlephaError } from \"alepha\";\nimport { importVite } from \"./importVite.ts\";\n\n/**\n * Import Alepha instance from a transpiled server entry file.\n */\nexport const importAlepha = async (\n entry: string,\n options?: {\n env: Record<string, string>;\n },\n): Promise<Alepha> => {\n if (global.__cli_alepha) {\n return global.__cli_alepha as Alepha;\n }\n\n const { loadEnv } = await importVite();\n\n const env = loadEnv(\"development\", process.cwd(), \"\");\n\n for (const key in env) {\n process.env[key] = env[key];\n }\n\n if (options?.env) {\n for (const key in options.env) {\n process.env[key] = options.env[key];\n }\n }\n\n process.env.ALEPHA_CLI_IMPORT = \"true\";\n process.env.LOG_LEVEL = \"error\";\n process.env.LOG_FORMAT = \"pretty\";\n process.env.NODE_ENV = \"production\";\n\n const entryFile = pathToFileURL(join(process.cwd(), entry)).href;\n const mod = await import(entryFile);\n\n // check if alepha is correctly exported\n if (mod.default) {\n return mod.default;\n }\n\n // else, try with global variable\n const alepha = global.__cli_alepha as Alepha | undefined;\n if (!alepha) {\n throw new AlephaError(\n \"Alepha instance not found. Ensure Alepha is initialized.\",\n );\n }\n\n return alepha;\n};\n","import { cp, mkdir } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { importAlepha } from \"../helpers/importAlepha.ts\";\n\nexport interface CopyAssetsOptions {\n /**\n * Entry point for the built Alepha application.\n */\n entry: string;\n\n /**\n * Output directory for copied assets.\n */\n distDir: string;\n\n /**\n * @default process.cwd()\n */\n root?: string;\n\n /**\n * Add Runner for logging (@see Alepha CLI)\n */\n run?: (opts: {\n name: string;\n handler: () => Promise<void>;\n }) => Promise<string>;\n}\n\n/**\n * Copy assets from Alepha packages to the build output directory.\n *\n * This task loads the built Alepha application, reads the\n * `alepha.build.assets` state to find packages with assets,\n * and copies their `/assets` directories to the build output.\n *\n * Used by modules like AlephaServerSwagger to distribute UI files.\n */\nexport async function copyAssets(opts: CopyAssetsOptions): Promise<void> {\n const root = opts.root ?? process.cwd();\n const alepha = await importAlepha(opts.entry);\n const assets = alepha.store.get(\"alepha.build.assets\");\n\n if (!assets || assets.length === 0) {\n return;\n }\n\n const fn = async () => {\n const require = createRequire(join(root, opts.entry));\n const buildAssetsDir = join(root, `${opts.distDir}/assets`);\n await mkdir(buildAssetsDir).catch(() => null);\n\n for (const pkgName of assets ?? []) {\n const pkgDir = dirname(require.resolve(`${pkgName}/package.json`));\n const assetsPkgDir = resolve(pkgDir, \"assets\");\n await cp(assetsPkgDir, buildAssetsDir, { recursive: true });\n }\n };\n\n if (opts.run) {\n await opts.run({\n name: \"copy assets\",\n handler: fn,\n });\n } else {\n await fn();\n }\n}\n","import { writeFile } from \"node:fs/promises\";\nimport { basename, join } from \"node:path\";\n\nexport interface GenerateCloudflareOptions {\n /**\n * The directory where the build output is placed.\n *\n * @default \"dist\"\n */\n distDir?: string;\n}\n\nconst WARNING_COMMENT =\n \"// This file was automatically generated. DO NOT MODIFY.\\n\" +\n \"// Changes to this file will be lost when the code is regenerated.\\n\";\n\n/**\n * Generate Cloudflare Workers deployment configuration.\n *\n * This task creates:\n * - wrangler.jsonc with worker configuration\n * - worker.js entry point for Cloudflare Workers\n */\nexport async function generateCloudflare(\n opts: GenerateCloudflareOptions = {},\n): Promise<void> {\n const distDir = opts.distDir ?? \"dist\";\n const root = process.cwd();\n const name = basename(root);\n\n await writeWranglerConfig(root, distDir, name);\n await writeWorkerEntryPoint(root, distDir);\n}\n\n/**\n * Write the wrangler.jsonc configuration file for Cloudflare Workers\n */\nasync function writeWranglerConfig(\n root: string,\n distDir: string,\n name: string,\n): Promise<void> {\n const wrangler = {\n name,\n main: \"./main.cloudflare.js\",\n compatibility_flags: [\"nodejs_compat\"],\n compatibility_date: \"2025-11-17\",\n };\n\n await writeFile(\n join(root, distDir, \"wrangler.jsonc\"),\n JSON.stringify(wrangler, null, 2),\n );\n}\n\n/**\n * Write the worker entry point that bootstraps Alepha and handles fetch requests\n */\nasync function writeWorkerEntryPoint(\n root: string,\n distDir: string,\n): Promise<void> {\n const workerCode = `\nimport \"./index.js\";\n\nexport default {\n fetch: async (request) => {\n const ctx = { req: request, res: undefined };\n\n await __alepha.start();\n await __alepha.events.emit(\"web:request\", ctx);\n\n return ctx.res;\n },\n};\n`.trim();\n\n await writeFile(\n join(root, distDir, \"main.cloudflare.js\"),\n `${WARNING_COMMENT}\\n${workerCode}`.trim(),\n );\n}\n","import { cp, writeFile } from \"node:fs/promises\";\nimport { fileExists } from \"../helpers/fileExists.ts\";\n\nexport interface GenerateDockerOptions {\n /**\n * The directory where the build output is placed.\n *\n * @default \"dist\"\n */\n distDir?: string;\n\n /**\n * Docker image name to use in the Dockerfile.\n *\n * @default \"node:24-alpine\"\n */\n image?: string;\n\n /**\n * Command to run in the Docker container.\n *\n * @default \"node\"\n */\n command?: string;\n}\n\n/**\n * Generate Docker deployment configuration.\n *\n * This task creates:\n * - Dockerfile with configurable Node image\n * - Copies drizzle migrations if they exist\n */\nexport async function generateDocker(\n opts: GenerateDockerOptions = {},\n): Promise<void> {\n const distDir = opts.distDir ?? \"dist\";\n const image = opts.image ?? \"node:24-alpine\";\n const command = opts.command ?? \"node\";\n\n await copyDrizzleMigrations(distDir);\n await writeDockerfile(distDir, image, command);\n}\n\n/**\n * Copy drizzle migrations to the dist directory if they exist\n */\nasync function copyDrizzleMigrations(distDir: string): Promise<void> {\n const hasMigrations = await fileExists(\"drizzle\");\n if (hasMigrations) {\n await cp(\"drizzle\", `${distDir}/drizzle`, { recursive: true });\n }\n}\n\n/**\n * Write the Dockerfile with the specified base image and command\n */\nasync function writeDockerfile(\n distDir: string,\n image: string,\n command: string,\n): Promise<void> {\n const dockerfile = `# This file was automatically generated. DO NOT MODIFY.\n# Changes to this file will be lost when the code is regenerated.\nFROM ${image}\nWORKDIR /app\n\nCOPY . .\n\nCMD [\"${command}\", \"index.js\"]\n`;\n\n await writeFile(`${distDir}/Dockerfile`, dockerfile);\n}\n","import type { Alepha } from \"alepha\";\nimport { importAlepha } from \"../helpers/importAlepha.ts\";\n\nexport interface GenerateSitemapOptions {\n /**\n * Entry point for the built Alepha application.\n */\n entry: string;\n\n /**\n * Base URL for the sitemap (e.g., \"https://example.com\").\n */\n baseUrl: string;\n\n /**\n * Optional HTML template (for React SSR).\n */\n template?: string;\n}\n\n/**\n * Generate sitemap.xml from Alepha page primitives.\n *\n * This task loads the built Alepha application,\n * queries all page primitives, and generates a sitemap.xml\n * containing URLs for all accessible pages.\n */\nexport async function generateSitemap(\n opts: GenerateSitemapOptions,\n): Promise<string> {\n const alepha = await importAlepha(opts.entry);\n\n if (opts.template) {\n alepha.set(\"alepha.react.server.template\", opts.template);\n }\n\n if (!alepha.isConfigured()) {\n await alepha.events.emit(\"configure\", alepha);\n (alepha as any).configured = true;\n }\n\n return generateSitemapFromAlepha(alepha, opts.baseUrl);\n}\n\nfunction generateSitemapFromAlepha(alepha: Alepha, baseUrl: string): string {\n const pages = alepha.primitives(\"page\") as any[];\n const urls: string[] = [];\n\n for (const page of pages) {\n const options = page.options;\n\n // Skip pages with children (parent pages that can't be rendered directly)\n if (options.children) {\n continue;\n }\n\n // Only include static pages or pages without parameters\n if (!options.schema?.params) {\n // Simple page without parameters\n const path = options.path || \"\";\n const url = `${baseUrl.replace(/\\/$/, \"\")}${path === \"\" ? \"/\" : path}`;\n urls.push(url);\n } else if (\n options.static &&\n typeof options.static === \"object\" &&\n options.static.entries\n ) {\n // Static page with predefined entries\n for (const entry of options.static.entries) {\n const path = buildPathFromParams(\n options.path || \"\",\n entry.params || {},\n );\n const url = `${baseUrl.replace(/\\/$/, \"\")}${path}`;\n urls.push(url);\n }\n }\n }\n\n return buildSitemapXml(urls);\n}\n\nfunction buildPathFromParams(\n pathPattern: string,\n params: Record<string, any>,\n): string {\n let path = pathPattern;\n\n for (const [key, value] of Object.entries(params)) {\n path = path.replace(`:${key}`, String(value));\n }\n\n return path || \"/\";\n}\n\nfunction buildSitemapXml(urls: string[]): string {\n const lastMod = new Date().toISOString().split(\"T\")[0];\n const urlEntries = urls\n .map(\n (url) =>\n ` <url>\\n <loc>${escapeXml(url)}</loc>\\n\\t\\t<lastmod>${lastMod}</lastmod>\\n </url>`,\n )\n .join(\"\\n\");\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n${urlEntries}\n</urlset>`;\n}\n\nfunction escapeXml(str: string): string {\n return str\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n}\n","import { mkdir, stat, writeFile } from \"node:fs/promises\";\nimport { importVite } from \"../helpers/importVite.ts\";\n\nexport interface GenerateVercelOptions {\n /**\n * The directory where the build output is placed.\n *\n * @default \"dist\"\n */\n distDir?: string;\n\n /**\n * The name of the client directory.\n *\n * @default \"public\"\n */\n clientDir?: string;\n\n /**\n * Vercel configuration options.\n */\n config?: VercelConfig;\n}\n\nexport interface VercelConfig {\n projectName?: string;\n orgId?: string;\n projectId?: string;\n config?: Record<string, any> & {\n crons?: Array<{\n path: string;\n schedule: string;\n }>;\n };\n}\n\nconst WARNING_COMMENT =\n \"// This file was automatically generated. DO NOT MODIFY.\\n\" +\n \"// Changes to this file will be lost when the code is regenerated.\\n\";\n\n/**\n * Generate Vercel deployment configuration.\n *\n * This task creates:\n * - vercel.json with route rewrites\n * - api/index.js entry point for Vercel serverless function\n * - .vercel/project.json if VERCEL_PROJECT_ID and VERCEL_ORG_ID are set\n */\nexport async function generateVercel(\n opts: GenerateVercelOptions = {},\n): Promise<void> {\n const distDir = opts.distDir ?? \"dist\";\n const clientDir = opts.clientDir ?? \"public\";\n const { loadEnv } = await importVite();\n const env = loadEnv(\"production\", process.cwd(), \"\");\n\n await writeApiEntryPoint(distDir);\n await writeVercelConfig(distDir, clientDir, opts.config?.config);\n\n const projectId = env.VERCEL_PROJECT_ID ?? opts.config?.projectId;\n const projectName = env.VERCEL_PROJECT_NAME ?? opts.config?.projectName;\n const orgId = env.VERCEL_ORG_ID ?? opts.config?.orgId;\n\n if (projectId && orgId) {\n await writeProjectConfig(distDir, projectId, projectName, orgId);\n }\n\n await ensureClientDir(distDir, clientDir);\n}\n\n/**\n * Check if a file or directory exists at the given path\n */\nasync function exists(path: string): Promise<boolean> {\n return stat(path)\n .then(() => true)\n .catch(() => false);\n}\n\n/**\n * Create the serverless function entry point that bootstraps Alepha and handles requests\n */\nasync function writeApiEntryPoint(distDir: string): Promise<void> {\n await mkdir(`${distDir}/api`, { recursive: true });\n await writeFile(\n `${distDir}/api/index.js`,\n `${WARNING_COMMENT}\nimport \"../index.js\";\n\nexport default async (req, res) => {\n\\tawait __alepha.start();\n\\tawait __alepha.events.emit(\"node:request\", { req, res });\n}\n`,\n );\n}\n\n/**\n * Generate vercel.json with route rewrites to direct all traffic to the serverless function\n */\nasync function writeVercelConfig(\n distDir: string,\n clientDir: string,\n config?: VercelConfig[\"config\"],\n): Promise<void> {\n await writeFile(\n `${distDir}/vercel.json`,\n JSON.stringify(\n {\n ...config,\n rewrites: [\n {\n source: \"/(.*)\",\n destination: \"/api/index.js\",\n },\n ],\n buildCommand: \"\",\n installCommand: \"\",\n outputDirectory: clientDir,\n },\n null,\n \" \",\n ),\n );\n}\n\n/**\n * Generate .vercel/project.json to link the deployment to a Vercel project\n */\nasync function writeProjectConfig(\n distDir: string,\n projectId: string,\n projectName: string | undefined,\n orgId: string,\n): Promise<void> {\n await mkdir(`${distDir}/.vercel`, { recursive: true });\n await writeFile(\n `${distDir}/.vercel/project.json`,\n JSON.stringify(\n {\n projectId,\n projectName,\n orgId,\n },\n null,\n \" \",\n ),\n );\n}\n\n/**\n * Create the client directory with a .keep file if it doesn't exist to avoid Vercel errors\n */\nasync function ensureClientDir(\n distDir: string,\n clientDir: string,\n): Promise<void> {\n const path = `${distDir}/${clientDir}`;\n if (!(await exists(path))) {\n await mkdir(path, { recursive: true });\n await writeFile(`${path}/.keep`, \"\");\n }\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport type { Alepha } from \"alepha\";\nimport { importAlepha } from \"../helpers/importAlepha.ts\";\nimport {\n compressFile,\n type ViteCompressOptions,\n} from \"../plugins/viteCompress.ts\";\n\nexport interface PrerenderPagesOptions {\n /**\n * Entry point for the built Alepha application.\n */\n entry: string;\n\n /**\n * Client dist directory for output files.\n */\n dist: string;\n\n /**\n * Optional compression options.\n */\n compress?: ViteCompressOptions | boolean;\n}\n\nexport interface PrerenderPagesResult {\n /**\n * Number of pages pre-rendered.\n */\n count: number;\n}\n\n/**\n * Pre-render static pages defined in the Alepha application.\n *\n * This task loads the built Alepha application, queries all page\n * primitives with `static: true`, and generates static HTML files\n * for each page. Supports pages with parameterized routes via\n * `static.entries` configuration.\n */\nexport async function prerenderPages(\n opts: PrerenderPagesOptions,\n): Promise<PrerenderPagesResult> {\n const alepha = await importAlepha(opts.entry);\n\n const now = Date.now();\n\n if (!alepha.isConfigured()) {\n await alepha.events.emit(\"configure\", alepha);\n (alepha as any).configured = true;\n }\n\n return await prerenderFromAlepha(alepha, opts.dist, opts.compress);\n}\n\nasync function prerenderFromAlepha(\n alepha: Alepha,\n dist: string,\n compress?: ViteCompressOptions | boolean,\n): Promise<PrerenderPagesResult> {\n let count = 0;\n const pages = alepha.primitives(\"page\") as any[];\n\n for (const page of pages) {\n const options = page.options;\n\n if (options.children) {\n continue;\n }\n\n if (!options.static) {\n continue;\n }\n\n const config = typeof options.static === \"object\" ? options.static : {};\n\n if (!options.schema?.params) {\n count += 1;\n await renderFile(page, {}, dist, compress);\n continue;\n }\n\n if (config.entries) {\n for (const entry of config.entries) {\n count += 1;\n await renderFile(page, entry, dist, compress);\n }\n }\n }\n\n return { count };\n}\n\nasync function renderFile(\n page: any,\n options: any,\n dist: string,\n compress?: ViteCompressOptions | boolean,\n) {\n const { html, state } = await page.render({\n html: true,\n ...options,\n });\n\n const pathname = state.url.pathname;\n const filepath = `${dist}${pathname === \"/\" ? \"/index\" : pathname}.html`;\n\n await mkdir(filepath.substring(0, filepath.lastIndexOf(\"/\")), {\n recursive: true,\n });\n\n await writeFile(filepath, html);\n\n if (compress) {\n await compressFile(typeof compress === \"object\" ? compress : {}, filepath);\n }\n}\n","import path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport type { Alepha, State } from \"alepha\";\nimport type { ResolvedConfig, ViteDevServer } from \"vite\";\nimport { importVite } from \"../helpers/importVite.ts\";\n\nexport interface AlephaRunnerOptions {\n /**\n * Path to the server entry file.\n */\n entry: string;\n\n /**\n * Enable debug logging.\n */\n debug?: boolean;\n}\n\nexport interface AlephaRunnerState {\n root: string;\n started: boolean;\n app?: Alepha;\n config?: ResolvedConfig;\n lock?: PromiseWithResolvers<void>;\n log: (...msg: string[]) => void;\n entry: string;\n onReload?: () => void;\n}\n\n/**\n * Create an Alepha runner for development.\n *\n * The runner manages the lifecycle of an Alepha application during\n * Vite dev server operation, handling start/stop/restart and HMR.\n */\nexport function createAlephaRunner(opts: AlephaRunnerOptions): AlephaRunner {\n const state: AlephaRunnerState = {\n root: process.cwd().replace(/\\\\/g, \"/\"),\n started: false,\n log: opts.debug ? (...msg: string[]) => console.log(...msg) : () => {},\n entry: opts.entry,\n onReload: () => {},\n };\n\n return new AlephaRunner(state);\n}\n\nexport class AlephaRunner {\n protected state: AlephaRunnerState;\n\n constructor(state: AlephaRunnerState) {\n this.state = state;\n }\n\n /**\n * Set resolved Vite config.\n */\n setConfig(config: ResolvedConfig): void {\n this.state.config = config;\n }\n\n /**\n * Check if SSR is enabled for the running app.\n */\n isSsrEnabled(): boolean {\n if (!this.state.app) return false;\n return (\n (this.state.app.store.get(\"alepha.react.server.ssr\" as keyof State) as\n | boolean\n | undefined) ?? false\n );\n }\n\n /**\n * Check if app is started.\n */\n get isStarted(): boolean {\n return this.state.started;\n }\n\n /**\n * Get the running Alepha app instance.\n */\n get app(): Alepha | undefined {\n return this.state.app;\n }\n\n /**\n * Start the Alepha application.\n */\n async start(server: ViteDevServer): Promise<void> {\n const { loadEnv } = await importVite();\n\n // unfortunately, vite SSR loader does not fix stack traces automatically\n // for now, we make a global helper and alepha/logger will use it before logging errors\n // that's not ideal but works for now\n (global as any).ssrFixStacktrace = (e: Error) => {\n server.ssrFixStacktrace(e);\n let it: any = e;\n do {\n server.ssrFixStacktrace(it);\n it = it.cause;\n } while (it instanceof Error);\n };\n\n if (this.state.started) {\n await this.restart(server, true);\n return;\n }\n\n if (!this.state.config) {\n this.state.log(\"[DEBUG] No config - skip starting\");\n return;\n }\n\n this.state.onReload?.();\n\n this.state.log(\"[DEBUG] Starting Alepha app...\");\n\n this.state.started = false;\n this.state.app = undefined;\n\n const serverEntryPath = path.resolve(\n this.state.config.root,\n this.state.entry,\n );\n const fileUrl = pathToFileURL(`${serverEntryPath}`).href;\n const env = loadEnv(\"development\", this.state.config.root, \"\");\n const before = { ...process.env };\n\n for (const key in env) {\n process.env[key] = env[key];\n }\n\n process.env.NODE_ENV ??= \"development\";\n process.env.VITE_ALEPHA_DEV = \"true\";\n process.env.SERVER_HOST ??=\n typeof server.config.server.host === \"string\"\n ? server.config.server.host\n : \"localhost\";\n process.env.SERVER_PORT ??= String(server.config.server.port || \"5173\");\n\n try {\n const now = Date.now();\n await server.ssrLoadModule(fileUrl, {\n fixStacktrace: true,\n });\n this.state.log(`[DEBUG] Alepha app loaded in ${Date.now() - now}ms`);\n await new Promise((r) => setTimeout(r, 10));\n\n this.state.app = (globalThis as any).__alepha;\n if (!this.state.app) {\n this.state.log(\"[DEBUG] No app found - skip starting\");\n return;\n }\n\n this.state.app.store.set(\"alepha.node.server\" as any, server.httpServer);\n\n await this.state.app.start();\n this.state.started = true;\n\n process.env = { ...before };\n\n this.state.log(\"[DEBUG] Starting Done!\");\n } catch (e) {\n if (e instanceof Error) {\n let it: any = e;\n do {\n server.ssrFixStacktrace(it);\n it = it.cause;\n } while (it instanceof Error);\n\n server.ssrFixStacktrace(e);\n if (e.cause instanceof Error) {\n server.ssrFixStacktrace(e.cause);\n }\n\n this.state.app?.log?.error(\"App failed to start:\", e);\n this.state.app?.log?.info(\"Waiting for changes to restart...\");\n }\n this.state.log(\"[DEBUG] Alepha app start error\");\n this.state.started = false;\n }\n }\n\n /**\n * Stop the Alepha application.\n */\n async stop(): Promise<void> {\n if (this.state.app?.stop && this.state.started) {\n this.state.log(\"[DEBUG] Stopping Alepha app...\");\n await this.state.app.stop();\n this.state.started = false;\n this.state.log(\"[DEBUG] Stopping Done!\");\n } else {\n this.state.log(\"[DEBUG] Alepha app not started - skip stop\");\n }\n }\n\n /**\n * Restart the Alepha application.\n *\n * @returns true if the restart was skipped due to locking\n */\n async restart(server: ViteDevServer, invalidate?: boolean): Promise<boolean> {\n if (this.state.lock) {\n this.state.log(\"[DEBUG] STILL LOCKING\");\n return true;\n }\n\n this.state.log(\"[DEBUG] LOCK RESTART\");\n this.state.lock = Promise.withResolvers();\n\n const now = Date.now();\n this.state.log(\"[DEBUG] RESTART\");\n await this.stop();\n this.state.log(`[DEBUG] RESTART (stop) in ${Date.now() - now}ms`);\n\n if (invalidate) {\n server.moduleGraph.invalidateAll();\n }\n\n await this.start(server);\n this.state.log(`[DEBUG] RESTART OK in ${Date.now() - now}ms`);\n\n setTimeout(() => {\n this.state.log(\"[DEBUG] UNLOCK RESTART\");\n this.state.lock?.resolve();\n this.state.lock = undefined;\n }, 500);\n\n return false;\n }\n\n /**\n * Send reload event to client.\n */\n sendReload(server: ViteDevServer): void {\n server.ws.send({\n type: \"custom\",\n event: \"alepha:reload\",\n data: {},\n });\n }\n}\n\n/**\n * Check if a URL path is a Vite internal file.\n */\nexport function isViteInternalPath(pathname: string): boolean {\n const [path] = pathname.split(\"?\");\n\n // Vite internal files\n if (\n path.startsWith(\"/@\") ||\n path.startsWith(\"/src\") ||\n path.includes(\"/node_modules/\")\n ) {\n return true;\n }\n\n return false;\n}\n","import { readFile, unlink, writeFile } from \"node:fs/promises\";\nimport type { Plugin, UserConfig } from \"vite\";\nimport { boot } from \"../helpers/boot.ts\";\nimport { fileExists } from \"../helpers/fileExists.ts\";\nimport {\n type BuildClientOptions,\n buildClient,\n buildServer,\n copyAssets,\n type GenerateDockerOptions,\n generateCloudflare,\n generateDocker,\n generateSitemap,\n generateVercel,\n prerenderPages,\n type VercelConfig,\n} from \"../tasks/index.ts\";\n\nexport interface ViteAlephaBuildOptions {\n /**\n * Path to the entry file for the server build.\n * If empty, SSR build will be skipped.\n */\n serverEntry?: string | false;\n\n /**\n * Set false to skip the client build.\n * This is useful if you only want to build the server-side application.\n */\n client?: false | Partial<BuildClientOptions>;\n\n /**\n * If true, the build will be optimized for Vercel deployment.\n *\n * If `VERCEL_PROJECT_ID` and `VERCEL_ORG_ID` environment variables are set, .vercel will be generated with the correct configuration.\n *\n * @default false\n */\n vercel?: boolean | VercelConfig;\n\n /**\n * If true, the build will generate Cloudflare Workers configuration.\n *\n * @default false\n */\n cloudflare?: boolean;\n\n /**\n * If true, the build will be optimized for Docker deployment.\n * Additionally, it will generate a Dockerfile in the dist directory.\n */\n docker?: boolean | Omit<GenerateDockerOptions, \"distDir\">;\n\n /**\n * If true, build statistics will be printed after the build completes.\n */\n stats?: boolean;\n}\n\n/**\n * Build modes controlled by ALEPHA_BUILD_MODE environment variable:\n * - \"cli\": Skip plugin entirely, CLI handles all tasks\n * - \"client\": Only build client bundle\n * - \"server\": Only build server bundle\n * - undefined/other: Full build (default behavior)\n */\nexport type AlephaBuildMode = \"cli\" | \"client\" | \"server\";\n\n/**\n * Alepha build plugin for Vite.\n *\n * This plugin orchestrates the complete build process:\n * 1. Build client (if index.html exists)\n * 2. Build server (SSR)\n * 3. Copy assets from packages\n * 4. Pre-render static pages (if enabled)\n * 5. Generate sitemap (if enabled)\n * 6. Generate deployment config (Vercel/Cloudflare/Docker)\n *\n * Build mode can be controlled via ALEPHA_BUILD_MODE env var for CLI integration.\n */\nexport async function viteAlephaBuild(\n options: ViteAlephaBuildOptions = {},\n): Promise<Plugin> {\n const entry = options.serverEntry ?? (await boot.getServerEntry());\n const distDir = \"dist\";\n const clientDir = \"public\";\n\n let rootConfig: UserConfig = {};\n\n return {\n name: \"alepha-build\",\n apply: \"build\",\n config(config, ctx) {\n const buildMode = process.env.ALEPHA_BUILD_MODE as\n | AlephaBuildMode\n | undefined;\n\n // CLI mode: plugin does nothing, CLI handles everything\n if (buildMode === \"cli\") {\n return;\n }\n\n // For now, we run two separate builds: one for the client and one for the server\n // We distinguish them using an environment variable\n if (!process.env.VITE_DOUBLE_BUILD_DONE) {\n rootConfig = config;\n }\n\n if (ctx.isSsrBuild || !process.env.VITE_DOUBLE_BUILD_DONE) {\n // Server build, so we don't need the public directory\n config.publicDir = false;\n } else {\n // Client build, so we need the public directory\n config.publicDir = \"public\";\n }\n },\n async buildStart() {\n const buildMode = process.env.ALEPHA_BUILD_MODE as\n | AlephaBuildMode\n | undefined;\n\n // CLI mode: skip entirely\n if (buildMode === \"cli\") {\n return;\n }\n\n if (process.env.VITE_DOUBLE_BUILD_DONE === \"true\") {\n return;\n }\n\n process.env.VITE_DOUBLE_BUILD_DONE = \"true\";\n\n const hasClient =\n options.client !== false && (await fileExists(\"index.html\"));\n\n const buildClientOptions =\n typeof options.client === \"object\" ? options.client : {};\n\n const stats = options.stats ?? process.env.ALEPHA_BUILD_STATS === \"true\";\n\n // Client-only mode\n if (buildMode === \"client\") {\n if (hasClient) {\n await buildClient({\n ...buildClientOptions,\n config: rootConfig,\n dist: `${distDir}/${clientDir}`,\n stats,\n });\n }\n process.exit(0);\n }\n\n // Server-only mode\n if (buildMode === \"server\") {\n if (entry) {\n // Check if client was already built (template exists)\n let clientBuilt = false;\n try {\n await readFile(`${distDir}/${clientDir}/index.html`, \"utf-8\");\n clientBuilt = true;\n } catch {\n // No client build\n }\n\n await buildServer({\n config: {\n base: rootConfig.base || \"\",\n },\n entry,\n distDir,\n clientDir: clientBuilt ? clientDir : undefined,\n stats,\n });\n }\n process.exit(0);\n }\n\n // Full build mode (default)\n\n // Task 1: Build client\n if (hasClient) {\n await buildClient({\n ...buildClientOptions,\n config: rootConfig,\n dist: `${distDir}/${clientDir}`,\n stats,\n });\n }\n\n let template = \"\";\n if (hasClient) {\n // Load output index.html for template embedding\n template = await readFile(\n `${distDir}/${clientDir}/index.html`,\n \"utf-8\",\n );\n }\n\n // Task 2: Build server\n if (entry) {\n await buildServer({\n config: {\n base: rootConfig.base || \"\",\n },\n entry,\n distDir,\n clientDir: hasClient ? clientDir : undefined,\n stats,\n });\n\n // Server will handle index.html if both client & server are built\n if (hasClient && options.serverEntry !== false) {\n await unlink(`${distDir}/${clientDir}/index.html`);\n }\n\n // Task 3: Copy assets (swagger ui & others)\n await copyAssets({\n entry: `${distDir}/index.js`,\n distDir,\n });\n }\n\n // Task 4: Generate sitemap\n if (buildClientOptions.sitemap && entry) {\n await writeFile(\n `${distDir}/${clientDir}/sitemap.xml`,\n await generateSitemap({\n entry: `${distDir}/index.js`,\n baseUrl: buildClientOptions.sitemap.hostname,\n }),\n );\n }\n\n // Task 5: Pre-render static pages\n if (buildClientOptions.prerender && template) {\n await prerenderPages({\n dist: `${distDir}/${clientDir}`,\n entry: `${distDir}/index.js`,\n compress: buildClientOptions.precompress,\n });\n }\n\n // Task 6: Generate deployment configurations\n if (options.vercel) {\n const config =\n typeof options.vercel === \"boolean\" ? {} : options.vercel;\n await generateVercel({\n distDir,\n clientDir,\n config,\n });\n }\n\n if (options.cloudflare) {\n await generateCloudflare({\n distDir,\n });\n }\n\n if (options.docker) {\n const dockerOpts =\n typeof options.docker === \"boolean\" ? {} : options.docker;\n await generateDocker({\n distDir,\n ...dockerOpts,\n });\n }\n\n // Prevent the default build from running again\n process.exit(0);\n },\n };\n}\n","import type { Plugin, ResolvedConfig } from \"vite\";\nimport { boot } from \"../helpers/boot.ts\";\nimport { createAlephaRunner, isViteInternalPath } from \"../tasks/runAlepha.ts\";\n\nexport interface ViteAlephaDevOptions {\n /**\n * Path to the entry file for the server build.\n * If empty, plugin will be disabled.\n */\n serverEntry?: string | false;\n\n /**\n * If true, enables debug logging.\n *\n * @default false\n */\n debug?: boolean;\n}\n\n/**\n * Plug Alepha into Vite development server.\n *\n * This plugin manages the Alepha application lifecycle during development,\n * handling hot module replacement and request forwarding.\n */\nexport async function viteAlephaDev(\n options: ViteAlephaDevOptions = {},\n): Promise<Plugin> {\n let entry = options.serverEntry;\n if (!entry) {\n entry = await boot.getServerEntry();\n if (!entry) {\n return {\n name: \"alepha-dev\",\n apply: \"serve\",\n config() {},\n };\n }\n }\n\n const runner = createAlephaRunner({\n entry,\n debug: options.debug,\n });\n\n return {\n name: \"alepha-dev\",\n apply: \"serve\",\n configResolved(resolvedConfig: ResolvedConfig) {\n runner.setConfig(resolvedConfig);\n },\n async handleHotUpdate(ctx) {\n if (options.debug) {\n console.log(\"[DEBUG] HMR\", ctx.file);\n }\n\n if (ctx.file.includes(\"/.idea/\")) {\n return [];\n }\n\n const isServerOnly = !ctx.modules[0]?._clientModule;\n const isBrowserOnly = !ctx.modules[0]?._ssrModule;\n const isSsrEnabled = runner.isSsrEnabled();\n\n if (isBrowserOnly) {\n if (options.debug) {\n console.log(\n \"[DEBUG] HMR - browser only - no reason to reload server\",\n );\n }\n return;\n }\n\n const root = process.cwd().replace(/\\\\/g, \"/\");\n const invalidate = !ctx.file.startsWith(root);\n if (invalidate && options.debug) {\n console.log(\"[DEBUG] HMR - outside root - invalidate all\");\n }\n\n if (!isSsrEnabled && isServerOnly) {\n await runner.restart(ctx.server, invalidate);\n return [];\n }\n\n if (isSsrEnabled && ctx.modules[0]) {\n const skip = await runner.restart(ctx.server, invalidate);\n if (skip) {\n return [];\n }\n\n if (!runner.isStarted) {\n if (options.debug) {\n console.log(\"[DEBUG] HMR - abort due to app not started\");\n }\n return [];\n }\n\n if (isServerOnly && runner.isStarted) {\n runner.sendReload(ctx.server);\n return [];\n }\n }\n },\n async configureServer(server) {\n // Forward vite request to alepha server\n server.middlewares.use((req, res, next) => {\n if (\n runner.isStarted &&\n runner.app &&\n req.url &&\n !isViteInternalPath(req.url)\n ) {\n // Patch res.end to detect if alepha handled the request\n // If not, we call next() to let vite handle it (e.g. for static files)\n let ended = false;\n\n const writeHead = res.writeHead.bind(res);\n res.writeHead = (...args: any[]) => {\n ended = true;\n return writeHead(args[0], args[1], args[2]);\n };\n\n return runner.app.events\n .emit(\"node:request\" as any, { req, res })\n .then(() => {\n if (!ended) {\n next();\n }\n });\n }\n next();\n });\n\n server.config.logger.info = (msg: string) => {\n runner.app?.log?.info(msg.trim());\n };\n\n server.config.logger.clearScreen = () => {};\n\n await runner.start(server);\n },\n async closeBundle() {\n // Cleanup handled by runner\n },\n };\n}\n","import { createRequire } from \"node:module\";\nimport { OPTIONS } from \"alepha\";\nimport type { Plugin } from \"vite\";\nimport {\n type ViteAlephaBuildOptions,\n viteAlephaBuild,\n} from \"./viteAlephaBuild.ts\";\nimport { type ViteAlephaDevOptions, viteAlephaDev } from \"./viteAlephaDev.ts\";\n\nexport type ViteAlephaOptions = ViteAlephaDevOptions &\n ViteAlephaBuildOptions & {\n react?: false;\n };\n\nexport function viteAlepha(\n options: ViteAlephaOptions = {},\n): (Plugin | Promise<Plugin>)[] {\n if (process.env.NODE_ENV === \"test\") {\n return [];\n }\n\n const plugins: (Plugin | Promise<Plugin>)[] & { [OPTIONS]?: any } = [];\n\n if (options.react !== false) {\n try {\n const { default: viteReact } = createRequire(import.meta.url)(\n \"@vitejs/plugin-react\",\n );\n plugins.push(viteReact());\n } catch (e) {}\n }\n\n plugins.push(viteAlephaDev(options), viteAlephaBuild(options));\n plugins[OPTIONS] = options;\n\n return plugins;\n}\n","import type { Alepha } from \"alepha\";\n\n// Helpers (for advanced use)\nexport * from \"./helpers/boot.ts\";\nexport * from \"./helpers/createBufferedLogger.ts\";\n// Plugins (public API)\nexport * from \"./plugins/viteAlepha.ts\";\nexport * from \"./plugins/viteAlephaBuild.ts\";\nexport * from \"./plugins/viteAlephaDev.ts\";\nexport * from \"./plugins/viteCompress.ts\";\n// Tasks (for CLI integration)\nexport * from \"./tasks/index.ts\";\n\ndeclare global {\n var __cli_alepha: Alepha;\n}\n\n/**\n * Plugin vite for Alepha framework.\n *\n * This module provides Vite plugins and configurations to integrate Alepha applications with Vite's build and development processes.\n *\n * @example\n * ```ts\n * import { defineConfig } from \"vite\";\n * import { viteAlepha } from \"alepha/vite\";\n *\n * export default defineConfig({\n * plugins: [viteAlepha()],\n * // other Vite configurations...\n * });\n * ```\n *\n * @module alepha.vite\n */\n"],"mappings":"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"}