alepha 0.15.0 → 0.15.2

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 (551) hide show
  1. package/README.md +43 -98
  2. package/dist/api/audits/index.d.ts +630 -653
  3. package/dist/api/audits/index.d.ts.map +1 -1
  4. package/dist/api/audits/index.js +12 -35
  5. package/dist/api/audits/index.js.map +1 -1
  6. package/dist/api/files/index.d.ts +365 -358
  7. package/dist/api/files/index.d.ts.map +1 -1
  8. package/dist/api/files/index.js +12 -5
  9. package/dist/api/files/index.js.map +1 -1
  10. package/dist/api/jobs/index.d.ts +255 -248
  11. package/dist/api/jobs/index.d.ts.map +1 -1
  12. package/dist/api/jobs/index.js +10 -3
  13. package/dist/api/jobs/index.js.map +1 -1
  14. package/dist/api/keys/index.d.ts +413 -0
  15. package/dist/api/keys/index.d.ts.map +1 -0
  16. package/dist/api/keys/index.js +476 -0
  17. package/dist/api/keys/index.js.map +1 -0
  18. package/dist/api/notifications/index.browser.js +4 -4
  19. package/dist/api/notifications/index.browser.js.map +1 -1
  20. package/dist/api/notifications/index.d.ts +84 -78
  21. package/dist/api/notifications/index.d.ts.map +1 -1
  22. package/dist/api/notifications/index.js +14 -8
  23. package/dist/api/notifications/index.js.map +1 -1
  24. package/dist/api/parameters/index.d.ts +528 -535
  25. package/dist/api/parameters/index.d.ts.map +1 -1
  26. package/dist/api/parameters/index.js +30 -37
  27. package/dist/api/parameters/index.js.map +1 -1
  28. package/dist/api/users/index.d.ts +1221 -910
  29. package/dist/api/users/index.d.ts.map +1 -1
  30. package/dist/api/users/index.js +2556 -248
  31. package/dist/api/users/index.js.map +1 -1
  32. package/dist/api/verifications/index.d.ts +142 -136
  33. package/dist/api/verifications/index.d.ts.map +1 -1
  34. package/dist/api/verifications/index.js +12 -4
  35. package/dist/api/verifications/index.js.map +1 -1
  36. package/dist/batch/index.d.ts +142 -162
  37. package/dist/batch/index.d.ts.map +1 -1
  38. package/dist/batch/index.js +31 -44
  39. package/dist/batch/index.js.map +1 -1
  40. package/dist/bucket/index.d.ts +595 -171
  41. package/dist/bucket/index.d.ts.map +1 -1
  42. package/dist/bucket/index.js +1856 -12
  43. package/dist/bucket/index.js.map +1 -1
  44. package/dist/cache/core/index.d.ts +225 -53
  45. package/dist/cache/core/index.d.ts.map +1 -1
  46. package/dist/cache/core/index.js +213 -7
  47. package/dist/cache/core/index.js.map +1 -1
  48. package/dist/cache/redis/index.d.ts +1 -0
  49. package/dist/cache/redis/index.d.ts.map +1 -1
  50. package/dist/cache/redis/index.js +6 -2
  51. package/dist/cache/redis/index.js.map +1 -1
  52. package/dist/cli/index.d.ts +834 -226
  53. package/dist/cli/index.d.ts.map +1 -1
  54. package/dist/cli/index.js +2872 -417
  55. package/dist/cli/index.js.map +1 -1
  56. package/dist/command/index.d.ts +458 -310
  57. package/dist/command/index.d.ts.map +1 -1
  58. package/dist/command/index.js +2011 -76
  59. package/dist/command/index.js.map +1 -1
  60. package/dist/core/index.browser.js +309 -97
  61. package/dist/core/index.browser.js.map +1 -1
  62. package/dist/core/index.d.ts +796 -701
  63. package/dist/core/index.d.ts.map +1 -1
  64. package/dist/core/index.js +329 -97
  65. package/dist/core/index.js.map +1 -1
  66. package/dist/core/index.native.js +309 -97
  67. package/dist/core/index.native.js.map +1 -1
  68. package/dist/datetime/index.d.ts +59 -44
  69. package/dist/datetime/index.d.ts.map +1 -1
  70. package/dist/datetime/index.js +15 -0
  71. package/dist/datetime/index.js.map +1 -1
  72. package/dist/email/index.d.ts +314 -19
  73. package/dist/email/index.d.ts.map +1 -1
  74. package/dist/email/index.js +1852 -7
  75. package/dist/email/index.js.map +1 -1
  76. package/dist/fake/index.d.ts +5500 -5418
  77. package/dist/fake/index.d.ts.map +1 -1
  78. package/dist/fake/index.js +113 -42
  79. package/dist/fake/index.js.map +1 -1
  80. package/dist/lock/core/index.d.ts +219 -212
  81. package/dist/lock/core/index.d.ts.map +1 -1
  82. package/dist/lock/core/index.js +11 -4
  83. package/dist/lock/core/index.js.map +1 -1
  84. package/dist/lock/redis/index.d.ts.map +1 -1
  85. package/dist/logger/index.d.ts +41 -90
  86. package/dist/logger/index.d.ts.map +1 -1
  87. package/dist/logger/index.js +15 -68
  88. package/dist/logger/index.js.map +1 -1
  89. package/dist/mcp/index.d.ts +228 -230
  90. package/dist/mcp/index.d.ts.map +1 -1
  91. package/dist/mcp/index.js +32 -31
  92. package/dist/mcp/index.js.map +1 -1
  93. package/dist/orm/index.browser.js +12 -12
  94. package/dist/orm/index.browser.js.map +1 -1
  95. package/dist/orm/index.bun.js +90 -80
  96. package/dist/orm/index.bun.js.map +1 -1
  97. package/dist/orm/index.d.ts +1434 -1459
  98. package/dist/orm/index.d.ts.map +1 -1
  99. package/dist/orm/index.js +112 -130
  100. package/dist/orm/index.js.map +1 -1
  101. package/dist/queue/core/index.d.ts +262 -254
  102. package/dist/queue/core/index.d.ts.map +1 -1
  103. package/dist/queue/core/index.js +14 -6
  104. package/dist/queue/core/index.js.map +1 -1
  105. package/dist/queue/redis/index.d.ts.map +1 -1
  106. package/dist/react/auth/index.browser.js +108 -0
  107. package/dist/react/auth/index.browser.js.map +1 -0
  108. package/dist/react/auth/index.d.ts +100 -0
  109. package/dist/react/auth/index.d.ts.map +1 -0
  110. package/dist/react/auth/index.js +145 -0
  111. package/dist/react/auth/index.js.map +1 -0
  112. package/dist/react/core/index.d.ts +469 -0
  113. package/dist/react/core/index.d.ts.map +1 -0
  114. package/dist/react/core/index.js +464 -0
  115. package/dist/react/core/index.js.map +1 -0
  116. package/dist/react/form/index.d.ts +232 -0
  117. package/dist/react/form/index.d.ts.map +1 -0
  118. package/dist/react/form/index.js +432 -0
  119. package/dist/react/form/index.js.map +1 -0
  120. package/dist/react/head/index.browser.js +423 -0
  121. package/dist/react/head/index.browser.js.map +1 -0
  122. package/dist/react/head/index.d.ts +288 -0
  123. package/dist/react/head/index.d.ts.map +1 -0
  124. package/dist/react/head/index.js +465 -0
  125. package/dist/react/head/index.js.map +1 -0
  126. package/dist/react/i18n/index.d.ts +175 -0
  127. package/dist/react/i18n/index.d.ts.map +1 -0
  128. package/dist/react/i18n/index.js +224 -0
  129. package/dist/react/i18n/index.js.map +1 -0
  130. package/dist/react/router/index.browser.js +1980 -0
  131. package/dist/react/router/index.browser.js.map +1 -0
  132. package/dist/react/router/index.d.ts +2068 -0
  133. package/dist/react/router/index.d.ts.map +1 -0
  134. package/dist/react/router/index.js +4932 -0
  135. package/dist/react/router/index.js.map +1 -0
  136. package/dist/react/websocket/index.d.ts +117 -0
  137. package/dist/react/websocket/index.d.ts.map +1 -0
  138. package/dist/react/websocket/index.js +107 -0
  139. package/dist/react/websocket/index.js.map +1 -0
  140. package/dist/redis/index.bun.js +4 -0
  141. package/dist/redis/index.bun.js.map +1 -1
  142. package/dist/redis/index.d.ts +127 -130
  143. package/dist/redis/index.d.ts.map +1 -1
  144. package/dist/redis/index.js +16 -25
  145. package/dist/redis/index.js.map +1 -1
  146. package/dist/retry/index.d.ts +80 -71
  147. package/dist/retry/index.d.ts.map +1 -1
  148. package/dist/retry/index.js +11 -2
  149. package/dist/retry/index.js.map +1 -1
  150. package/dist/router/index.d.ts +6 -6
  151. package/dist/router/index.d.ts.map +1 -1
  152. package/dist/scheduler/index.d.ts +119 -28
  153. package/dist/scheduler/index.d.ts.map +1 -1
  154. package/dist/scheduler/index.js +404 -3
  155. package/dist/scheduler/index.js.map +1 -1
  156. package/dist/security/index.d.ts +642 -228
  157. package/dist/security/index.d.ts.map +1 -1
  158. package/dist/security/index.js +1579 -37
  159. package/dist/security/index.js.map +1 -1
  160. package/dist/server/auth/index.d.ts +1141 -111
  161. package/dist/server/auth/index.d.ts.map +1 -1
  162. package/dist/server/auth/index.js +1261 -25
  163. package/dist/server/auth/index.js.map +1 -1
  164. package/dist/server/cache/index.d.ts +63 -78
  165. package/dist/server/cache/index.d.ts.map +1 -1
  166. package/dist/server/cache/index.js +7 -22
  167. package/dist/server/cache/index.js.map +1 -1
  168. package/dist/server/compress/index.d.ts +13 -5
  169. package/dist/server/compress/index.d.ts.map +1 -1
  170. package/dist/server/compress/index.js +10 -2
  171. package/dist/server/compress/index.js.map +1 -1
  172. package/dist/server/cookies/index.d.ts +46 -22
  173. package/dist/server/cookies/index.d.ts.map +1 -1
  174. package/dist/server/cookies/index.js +7 -5
  175. package/dist/server/cookies/index.js.map +1 -1
  176. package/dist/server/core/index.d.ts +307 -196
  177. package/dist/server/core/index.d.ts.map +1 -1
  178. package/dist/server/core/index.js +271 -38
  179. package/dist/server/core/index.js.map +1 -1
  180. package/dist/server/cors/index.d.ts +24 -34
  181. package/dist/server/cors/index.d.ts.map +1 -1
  182. package/dist/server/cors/index.js +7 -21
  183. package/dist/server/cors/index.js.map +1 -1
  184. package/dist/server/health/index.d.ts +25 -19
  185. package/dist/server/health/index.d.ts.map +1 -1
  186. package/dist/server/health/index.js +8 -2
  187. package/dist/server/health/index.js.map +1 -1
  188. package/dist/server/helmet/index.d.ts +13 -5
  189. package/dist/server/helmet/index.d.ts.map +1 -1
  190. package/dist/server/helmet/index.js +11 -3
  191. package/dist/server/helmet/index.js.map +1 -1
  192. package/dist/server/links/index.browser.js +9 -1
  193. package/dist/server/links/index.browser.js.map +1 -1
  194. package/dist/server/links/index.d.ts +133 -128
  195. package/dist/server/links/index.d.ts.map +1 -1
  196. package/dist/server/links/index.js +24 -11
  197. package/dist/server/links/index.js.map +1 -1
  198. package/dist/server/metrics/index.d.ts +524 -4
  199. package/dist/server/metrics/index.d.ts.map +1 -1
  200. package/dist/server/metrics/index.js +4472 -7
  201. package/dist/server/metrics/index.js.map +1 -1
  202. package/dist/server/multipart/index.d.ts +15 -9
  203. package/dist/server/multipart/index.d.ts.map +1 -1
  204. package/dist/server/multipart/index.js +9 -3
  205. package/dist/server/multipart/index.js.map +1 -1
  206. package/dist/server/proxy/index.d.ts +110 -104
  207. package/dist/server/proxy/index.d.ts.map +1 -1
  208. package/dist/server/proxy/index.js +8 -2
  209. package/dist/server/proxy/index.js.map +1 -1
  210. package/dist/server/rate-limit/index.d.ts +46 -51
  211. package/dist/server/rate-limit/index.d.ts.map +1 -1
  212. package/dist/server/rate-limit/index.js +18 -55
  213. package/dist/server/rate-limit/index.js.map +1 -1
  214. package/dist/server/static/index.d.ts +181 -48
  215. package/dist/server/static/index.d.ts.map +1 -1
  216. package/dist/server/static/index.js +1848 -5
  217. package/dist/server/static/index.js.map +1 -1
  218. package/dist/server/swagger/index.d.ts +348 -53
  219. package/dist/server/swagger/index.d.ts.map +1 -1
  220. package/dist/server/swagger/index.js +1849 -6
  221. package/dist/server/swagger/index.js.map +1 -1
  222. package/dist/sms/index.d.ts +312 -18
  223. package/dist/sms/index.d.ts.map +1 -1
  224. package/dist/sms/index.js +1854 -10
  225. package/dist/sms/index.js.map +1 -1
  226. package/dist/system/index.browser.js +496 -0
  227. package/dist/system/index.browser.js.map +1 -0
  228. package/dist/system/index.d.ts +1158 -0
  229. package/dist/system/index.d.ts.map +1 -0
  230. package/dist/{file → system}/index.js +412 -20
  231. package/dist/system/index.js.map +1 -0
  232. package/dist/thread/index.d.ts +82 -73
  233. package/dist/thread/index.d.ts.map +1 -1
  234. package/dist/thread/index.js +13 -4
  235. package/dist/thread/index.js.map +1 -1
  236. package/dist/topic/core/index.d.ts +330 -323
  237. package/dist/topic/core/index.d.ts.map +1 -1
  238. package/dist/topic/core/index.js +12 -5
  239. package/dist/topic/core/index.js.map +1 -1
  240. package/dist/topic/redis/index.d.ts +6 -6
  241. package/dist/topic/redis/index.d.ts.map +1 -1
  242. package/dist/vite/index.d.ts +163 -5825
  243. package/dist/vite/index.d.ts.map +1 -1
  244. package/dist/vite/index.js +130 -477
  245. package/dist/vite/index.js.map +1 -1
  246. package/dist/websocket/index.browser.js +3 -3
  247. package/dist/websocket/index.browser.js.map +1 -1
  248. package/dist/websocket/index.d.ts +287 -283
  249. package/dist/websocket/index.d.ts.map +1 -1
  250. package/dist/websocket/index.js +15 -11
  251. package/dist/websocket/index.js.map +1 -1
  252. package/package.json +86 -17
  253. package/src/api/audits/index.ts +10 -33
  254. package/src/api/files/__tests__/$bucket.spec.ts +1 -1
  255. package/src/api/files/controllers/AdminFileStatsController.spec.ts +1 -1
  256. package/src/api/files/controllers/FileController.spec.ts +1 -1
  257. package/src/api/files/index.ts +10 -3
  258. package/src/api/files/jobs/FileJobs.spec.ts +1 -1
  259. package/src/api/files/services/FileService.spec.ts +1 -1
  260. package/src/api/jobs/index.ts +10 -3
  261. package/src/api/keys/controllers/AdminApiKeyController.ts +75 -0
  262. package/src/api/keys/controllers/ApiKeyController.ts +103 -0
  263. package/src/api/keys/entities/apiKeyEntity.ts +41 -0
  264. package/src/api/keys/index.ts +49 -0
  265. package/src/api/keys/schemas/adminApiKeyQuerySchema.ts +7 -0
  266. package/src/api/keys/schemas/adminApiKeyResourceSchema.ts +17 -0
  267. package/src/api/keys/schemas/createApiKeyBodySchema.ts +7 -0
  268. package/src/api/keys/schemas/createApiKeyResponseSchema.ts +11 -0
  269. package/src/api/keys/schemas/listApiKeyResponseSchema.ts +15 -0
  270. package/src/api/keys/schemas/revokeApiKeyParamsSchema.ts +5 -0
  271. package/src/api/keys/schemas/revokeApiKeyResponseSchema.ts +5 -0
  272. package/src/api/keys/services/ApiKeyService.spec.ts +553 -0
  273. package/src/api/keys/services/ApiKeyService.ts +306 -0
  274. package/src/api/logs/TODO.md +52 -0
  275. package/src/api/notifications/index.ts +10 -4
  276. package/src/api/parameters/index.ts +9 -30
  277. package/src/api/parameters/primitives/$config.ts +12 -4
  278. package/src/api/parameters/services/ConfigStore.ts +9 -3
  279. package/src/api/users/__tests__/ApiKeys-integration.spec.ts +1035 -0
  280. package/src/api/users/__tests__/ApiKeys.spec.ts +401 -0
  281. package/src/api/users/index.ts +14 -3
  282. package/src/api/users/primitives/$realm.ts +33 -5
  283. package/src/api/users/providers/RealmProvider.ts +1 -12
  284. package/src/api/users/services/SessionService.ts +1 -11
  285. package/src/api/verifications/controllers/VerificationController.ts +2 -0
  286. package/src/api/verifications/index.ts +10 -4
  287. package/src/batch/index.ts +9 -36
  288. package/src/batch/primitives/$batch.ts +0 -8
  289. package/src/batch/providers/BatchProvider.ts +29 -2
  290. package/src/bucket/__tests__/shared.ts +1 -1
  291. package/src/bucket/index.ts +13 -6
  292. package/src/bucket/primitives/$bucket.ts +1 -1
  293. package/src/bucket/providers/LocalFileStorageProvider.ts +1 -1
  294. package/src/bucket/providers/MemoryFileStorageProvider.ts +1 -1
  295. package/src/cache/core/__tests__/shared.ts +30 -0
  296. package/src/cache/core/index.ts +11 -6
  297. package/src/cache/core/primitives/$cache.spec.ts +5 -0
  298. package/src/cache/core/providers/CacheProvider.ts +17 -0
  299. package/src/cache/core/providers/MemoryCacheProvider.ts +300 -1
  300. package/src/cache/redis/__tests__/cache-redis.spec.ts +5 -0
  301. package/src/cache/redis/providers/RedisCacheProvider.ts +9 -0
  302. package/src/cli/apps/AlephaCli.ts +3 -16
  303. package/src/cli/apps/AlephaPackageBuilderCli.ts +10 -2
  304. package/src/cli/atoms/appEntryOptions.ts +13 -0
  305. package/src/cli/atoms/buildOptions.ts +1 -1
  306. package/src/cli/atoms/changelogOptions.ts +1 -1
  307. package/src/cli/commands/build.ts +64 -52
  308. package/src/cli/commands/db.ts +17 -11
  309. package/src/cli/commands/deploy.ts +1 -1
  310. package/src/cli/commands/dev.ts +13 -49
  311. package/src/cli/commands/gen/env.ts +6 -3
  312. package/src/cli/commands/gen/openapi.ts +5 -2
  313. package/src/cli/commands/init.spec.ts +544 -0
  314. package/src/cli/commands/init.ts +101 -58
  315. package/src/cli/commands/lint.ts +8 -2
  316. package/src/cli/commands/typecheck.ts +11 -0
  317. package/src/cli/defineConfig.ts +9 -0
  318. package/src/cli/index.ts +2 -1
  319. package/src/cli/providers/AppEntryProvider.ts +131 -0
  320. package/src/cli/providers/ViteBuildProvider.ts +40 -0
  321. package/src/cli/providers/ViteDevServerProvider.ts +378 -0
  322. package/src/cli/services/AlephaCliUtils.ts +39 -93
  323. package/src/cli/services/PackageManagerUtils.ts +140 -17
  324. package/src/cli/services/ProjectScaffolder.ts +169 -101
  325. package/src/cli/services/ViteUtils.ts +82 -0
  326. package/src/cli/{assets/claudeMd.ts → templates/agentMd.ts} +41 -28
  327. package/src/cli/{assets → templates}/apiHelloControllerTs.ts +2 -1
  328. package/src/cli/{assets → templates}/biomeJson.ts +2 -1
  329. package/src/cli/{assets → templates}/dummySpecTs.ts +2 -1
  330. package/src/cli/{assets → templates}/editorconfig.ts +2 -1
  331. package/src/cli/templates/gitignore.ts +39 -0
  332. package/src/cli/{assets → templates}/mainBrowserTs.ts +2 -1
  333. package/src/cli/templates/mainCss.ts +33 -0
  334. package/src/cli/templates/mainServerTs.ts +33 -0
  335. package/src/cli/{assets → templates}/tsconfigJson.ts +2 -1
  336. package/src/cli/templates/webAppRouterTs.ts +50 -0
  337. package/src/cli/templates/webHelloComponentTsx.ts +20 -0
  338. package/src/command/helpers/Runner.spec.ts +4 -0
  339. package/src/command/helpers/Runner.ts +3 -21
  340. package/src/command/index.ts +12 -4
  341. package/src/command/providers/CliProvider.spec.ts +1067 -0
  342. package/src/command/providers/CliProvider.ts +203 -40
  343. package/src/core/Alepha.ts +3 -9
  344. package/src/core/__tests__/Alepha-start.spec.ts +4 -4
  345. package/src/core/helpers/jsonSchemaToTypeBox.spec.ts +771 -0
  346. package/src/core/helpers/jsonSchemaToTypeBox.ts +62 -10
  347. package/src/core/index.shared.ts +1 -0
  348. package/src/core/index.ts +20 -0
  349. package/src/core/primitives/$module.ts +12 -0
  350. package/src/core/providers/EventManager.spec.ts +0 -71
  351. package/src/core/providers/EventManager.ts +3 -15
  352. package/src/core/providers/Json.ts +2 -14
  353. package/src/core/providers/KeylessJsonSchemaCodec.spec.ts +257 -0
  354. package/src/core/providers/KeylessJsonSchemaCodec.ts +396 -14
  355. package/src/core/providers/SchemaValidator.spec.ts +236 -0
  356. package/src/datetime/index.ts +15 -0
  357. package/src/email/index.ts +10 -5
  358. package/src/email/providers/LocalEmailProvider.spec.ts +1 -1
  359. package/src/email/providers/LocalEmailProvider.ts +1 -1
  360. package/src/fake/__tests__/keyName.example.ts +1 -1
  361. package/src/fake/__tests__/keyName.spec.ts +5 -5
  362. package/src/fake/index.ts +9 -6
  363. package/src/fake/providers/FakeProvider.spec.ts +258 -40
  364. package/src/fake/providers/FakeProvider.ts +133 -19
  365. package/src/lock/core/index.ts +11 -4
  366. package/src/logger/index.ts +17 -66
  367. package/src/logger/providers/PrettyFormatterProvider.ts +0 -9
  368. package/src/mcp/errors/McpError.ts +30 -0
  369. package/src/mcp/index.ts +13 -27
  370. package/src/mcp/transports/SseMcpTransport.ts +6 -7
  371. package/src/orm/__tests__/PostgresProvider.spec.ts +2 -2
  372. package/src/orm/index.browser.ts +2 -2
  373. package/src/orm/index.bun.ts +4 -2
  374. package/src/orm/index.ts +21 -47
  375. package/src/orm/providers/DrizzleKitProvider.ts +3 -5
  376. package/src/orm/providers/drivers/BunSqliteProvider.ts +1 -0
  377. package/src/orm/services/Repository.ts +18 -3
  378. package/src/queue/core/index.ts +14 -6
  379. package/src/react/auth/__tests__/$auth.spec.ts +202 -0
  380. package/src/react/auth/hooks/useAuth.ts +32 -0
  381. package/src/react/auth/index.browser.ts +13 -0
  382. package/src/react/auth/index.shared.ts +2 -0
  383. package/src/react/auth/index.ts +48 -0
  384. package/src/react/auth/providers/ReactAuthProvider.ts +16 -0
  385. package/src/react/auth/services/ReactAuth.ts +135 -0
  386. package/src/react/core/__tests__/Router.spec.tsx +169 -0
  387. package/src/react/core/components/ClientOnly.tsx +49 -0
  388. package/src/react/core/components/ErrorBoundary.tsx +73 -0
  389. package/src/react/core/contexts/AlephaContext.ts +7 -0
  390. package/src/react/core/contexts/AlephaProvider.tsx +42 -0
  391. package/src/react/core/hooks/useAction.browser.spec.tsx +569 -0
  392. package/src/react/core/hooks/useAction.ts +480 -0
  393. package/src/react/core/hooks/useAlepha.ts +26 -0
  394. package/src/react/core/hooks/useClient.ts +17 -0
  395. package/src/react/core/hooks/useEvents.ts +51 -0
  396. package/src/react/core/hooks/useInject.ts +12 -0
  397. package/src/react/core/hooks/useStore.ts +52 -0
  398. package/src/react/core/index.ts +90 -0
  399. package/src/react/form/components/FormState.tsx +17 -0
  400. package/src/react/form/errors/FormValidationError.ts +18 -0
  401. package/src/react/form/hooks/useForm.browser.spec.tsx +366 -0
  402. package/src/react/form/hooks/useForm.ts +47 -0
  403. package/src/react/form/hooks/useFormState.ts +130 -0
  404. package/src/react/form/index.ts +44 -0
  405. package/src/react/form/services/FormModel.ts +614 -0
  406. package/src/react/head/helpers/SeoExpander.spec.ts +203 -0
  407. package/src/react/head/helpers/SeoExpander.ts +142 -0
  408. package/src/react/head/hooks/useHead.spec.tsx +288 -0
  409. package/src/react/head/hooks/useHead.ts +62 -0
  410. package/src/react/head/index.browser.ts +26 -0
  411. package/src/react/head/index.ts +44 -0
  412. package/src/react/head/interfaces/Head.ts +105 -0
  413. package/src/react/head/primitives/$head.ts +25 -0
  414. package/src/react/head/providers/BrowserHeadProvider.browser.spec.ts +196 -0
  415. package/src/react/head/providers/BrowserHeadProvider.ts +212 -0
  416. package/src/react/head/providers/HeadProvider.ts +168 -0
  417. package/src/react/head/providers/ServerHeadProvider.ts +31 -0
  418. package/src/react/i18n/__tests__/integration.spec.tsx +239 -0
  419. package/src/react/i18n/components/Localize.spec.tsx +357 -0
  420. package/src/react/i18n/components/Localize.tsx +35 -0
  421. package/src/react/i18n/hooks/useI18n.browser.spec.tsx +438 -0
  422. package/src/react/i18n/hooks/useI18n.ts +18 -0
  423. package/src/react/i18n/index.ts +41 -0
  424. package/src/react/i18n/primitives/$dictionary.ts +69 -0
  425. package/src/react/i18n/providers/I18nProvider.spec.ts +389 -0
  426. package/src/react/i18n/providers/I18nProvider.ts +278 -0
  427. package/src/react/router/__tests__/page-head-browser.browser.spec.ts +95 -0
  428. package/src/react/router/__tests__/page-head.spec.ts +48 -0
  429. package/src/react/router/__tests__/seo-head.spec.ts +125 -0
  430. package/src/react/router/atoms/ssrManifestAtom.ts +58 -0
  431. package/src/react/router/components/ErrorViewer.tsx +872 -0
  432. package/src/react/router/components/Link.tsx +23 -0
  433. package/src/react/router/components/NestedView.tsx +223 -0
  434. package/src/react/router/components/NotFound.tsx +30 -0
  435. package/src/react/router/constants/PAGE_PRELOAD_KEY.ts +6 -0
  436. package/src/react/router/contexts/RouterLayerContext.ts +12 -0
  437. package/src/react/router/errors/Redirection.ts +28 -0
  438. package/src/react/router/hooks/useActive.ts +52 -0
  439. package/src/react/router/hooks/useQueryParams.ts +63 -0
  440. package/src/react/router/hooks/useRouter.ts +20 -0
  441. package/src/react/router/hooks/useRouterState.ts +11 -0
  442. package/src/react/router/index.browser.ts +45 -0
  443. package/src/react/router/index.shared.ts +19 -0
  444. package/src/react/router/index.ts +142 -0
  445. package/src/react/router/primitives/$page.browser.spec.tsx +851 -0
  446. package/src/react/router/primitives/$page.spec.tsx +708 -0
  447. package/src/react/router/primitives/$page.ts +497 -0
  448. package/src/react/router/providers/ReactBrowserProvider.ts +309 -0
  449. package/src/react/router/providers/ReactBrowserRendererProvider.ts +25 -0
  450. package/src/react/router/providers/ReactBrowserRouterProvider.ts +168 -0
  451. package/src/react/router/providers/ReactPageProvider.ts +726 -0
  452. package/src/react/router/providers/ReactServerProvider.spec.tsx +316 -0
  453. package/src/react/router/providers/ReactServerProvider.ts +558 -0
  454. package/src/react/router/providers/ReactServerTemplateProvider.ts +979 -0
  455. package/src/react/router/providers/SSRManifestProvider.ts +334 -0
  456. package/src/react/router/services/ReactPageServerService.ts +48 -0
  457. package/src/react/router/services/ReactPageService.ts +27 -0
  458. package/src/react/router/services/ReactRouter.ts +262 -0
  459. package/src/react/websocket/hooks/useRoom.tsx +242 -0
  460. package/src/react/websocket/index.ts +7 -0
  461. package/src/redis/__tests__/redis.spec.ts +13 -0
  462. package/src/redis/index.ts +9 -25
  463. package/src/redis/providers/BunRedisProvider.ts +9 -0
  464. package/src/redis/providers/NodeRedisProvider.ts +8 -0
  465. package/src/redis/providers/RedisProvider.ts +16 -0
  466. package/src/retry/index.ts +11 -2
  467. package/src/router/index.ts +15 -0
  468. package/src/scheduler/index.ts +11 -2
  469. package/src/security/__tests__/BasicAuth.spec.ts +2 -0
  470. package/src/security/__tests__/ServerSecurityProvider.spec.ts +13 -5
  471. package/src/security/index.ts +15 -10
  472. package/src/security/interfaces/IssuerResolver.ts +27 -0
  473. package/src/security/primitives/$issuer.ts +55 -0
  474. package/src/security/providers/SecurityProvider.ts +179 -0
  475. package/src/security/providers/ServerBasicAuthProvider.ts +6 -2
  476. package/src/security/providers/ServerSecurityProvider.ts +36 -22
  477. package/src/server/auth/index.ts +12 -7
  478. package/src/server/cache/index.ts +7 -22
  479. package/src/server/compress/index.ts +10 -2
  480. package/src/server/cookies/index.ts +7 -5
  481. package/src/server/cookies/primitives/$cookie.ts +33 -11
  482. package/src/server/core/index.ts +17 -7
  483. package/src/server/core/interfaces/ServerRequest.ts +83 -1
  484. package/src/server/core/primitives/$action.spec.ts +1 -1
  485. package/src/server/core/primitives/$action.ts +8 -3
  486. package/src/server/core/providers/BunHttpServerProvider.ts +1 -1
  487. package/src/server/core/providers/NodeHttpServerProvider.spec.ts +125 -0
  488. package/src/server/core/providers/NodeHttpServerProvider.ts +77 -22
  489. package/src/server/core/providers/ServerLoggerProvider.ts +2 -2
  490. package/src/server/core/providers/ServerProvider.ts +9 -12
  491. package/src/server/core/services/ServerRequestParser.spec.ts +520 -0
  492. package/src/server/core/services/ServerRequestParser.ts +306 -13
  493. package/src/server/cors/index.ts +7 -21
  494. package/src/server/cors/primitives/$cors.ts +6 -2
  495. package/src/server/health/index.ts +8 -2
  496. package/src/server/helmet/index.ts +11 -3
  497. package/src/server/links/atoms/apiLinksAtom.ts +7 -0
  498. package/src/server/links/index.browser.ts +2 -0
  499. package/src/server/links/index.ts +13 -6
  500. package/src/server/metrics/index.ts +10 -3
  501. package/src/server/multipart/index.ts +9 -3
  502. package/src/server/proxy/index.ts +8 -2
  503. package/src/server/rate-limit/index.ts +21 -25
  504. package/src/server/rate-limit/primitives/$rateLimit.ts +6 -2
  505. package/src/server/rate-limit/providers/ServerRateLimitProvider.spec.ts +38 -14
  506. package/src/server/rate-limit/providers/ServerRateLimitProvider.ts +22 -56
  507. package/src/server/static/index.ts +8 -2
  508. package/src/server/static/providers/ServerStaticProvider.ts +1 -1
  509. package/src/server/swagger/index.ts +9 -4
  510. package/src/server/swagger/providers/ServerSwaggerProvider.ts +1 -1
  511. package/src/sms/index.ts +9 -5
  512. package/src/sms/providers/LocalSmsProvider.spec.ts +1 -1
  513. package/src/sms/providers/LocalSmsProvider.ts +1 -1
  514. package/src/system/index.browser.ts +11 -0
  515. package/src/system/index.ts +62 -0
  516. package/src/{file → system}/providers/FileSystemProvider.ts +16 -0
  517. package/src/{file → system}/providers/MemoryFileSystemProvider.ts +116 -3
  518. package/src/system/providers/MemoryShellProvider.ts +164 -0
  519. package/src/{file → system}/providers/NodeFileSystemProvider.spec.ts +2 -2
  520. package/src/{file → system}/providers/NodeFileSystemProvider.ts +36 -0
  521. package/src/system/providers/NodeShellProvider.ts +184 -0
  522. package/src/system/providers/ShellProvider.ts +74 -0
  523. package/src/{file → system}/services/FileDetector.spec.ts +2 -2
  524. package/src/thread/index.ts +11 -2
  525. package/src/topic/core/index.ts +12 -5
  526. package/src/vite/index.ts +3 -2
  527. package/src/vite/tasks/buildClient.ts +2 -8
  528. package/src/vite/tasks/buildServer.ts +84 -21
  529. package/src/vite/tasks/copyAssets.ts +5 -4
  530. package/src/vite/tasks/generateSitemap.ts +64 -23
  531. package/src/vite/tasks/index.ts +0 -2
  532. package/src/vite/tasks/prerenderPages.ts +49 -24
  533. package/src/websocket/index.ts +12 -8
  534. package/dist/file/index.d.ts +0 -839
  535. package/dist/file/index.d.ts.map +0 -1
  536. package/dist/file/index.js.map +0 -1
  537. package/src/cli/assets/indexHtml.ts +0 -15
  538. package/src/cli/assets/mainServerTs.ts +0 -24
  539. package/src/cli/assets/webAppRouterTs.ts +0 -15
  540. package/src/cli/assets/webHelloComponentTsx.ts +0 -16
  541. package/src/cli/commands/format.ts +0 -23
  542. package/src/file/index.ts +0 -43
  543. package/src/vite/helpers/boot.ts +0 -117
  544. package/src/vite/plugins/viteAlephaDev.ts +0 -177
  545. package/src/vite/tasks/devServer.ts +0 -71
  546. package/src/vite/tasks/runAlepha.ts +0 -270
  547. /package/dist/orm/{chunk-DtkW-qnP.js → chunk-DH6iiROE.js} +0 -0
  548. /package/src/cli/{assets → templates}/apiIndexTs.ts +0 -0
  549. /package/src/cli/{assets → templates}/webIndexTs.ts +0 -0
  550. /package/src/{file → system}/errors/FileError.ts +0 -0
  551. /package/src/{file → system}/services/FileDetector.ts +0 -0
@@ -1,6 +1,6 @@
1
1
  import { readFile, rm, writeFile } from "node:fs/promises";
2
2
  import { join } from "node:path";
3
- import { AlephaError } from "alepha";
3
+ import { type Alepha, AlephaError } from "alepha";
4
4
  import type * as vite from "vite";
5
5
  import type { UserConfig } from "vite";
6
6
  import { analyzer as viteAnalyzer } from "vite-bundle-analyzer";
@@ -27,11 +27,6 @@ export interface BuildServerOptions {
27
27
  */
28
28
  clientDir?: string;
29
29
 
30
- /**
31
- * Override Vite config options.
32
- */
33
- config?: UserConfig;
34
-
35
30
  /**
36
31
  * If true, generate build stats report.
37
32
  */
@@ -48,6 +43,11 @@ export interface BuildServerOptions {
48
43
  * Add more entry point conditions for SSR module resolution (e.g., "bun").
49
44
  */
50
45
  conditions?: string[];
46
+
47
+ /**
48
+ * Alepha instance to set SSR manifest for pre-rendering.
49
+ */
50
+ alepha: Alepha;
51
51
  }
52
52
 
53
53
  export interface BuildServerResult {
@@ -55,6 +55,16 @@ export interface BuildServerResult {
55
55
  * The filename of the built server entry (e.g., "abc123.js").
56
56
  */
57
57
  entryFile: string;
58
+
59
+ /**
60
+ * SSR manifest data for module preloading.
61
+ * Can be used to set in alepha store for pre-rendering.
62
+ */
63
+ manifest?: {
64
+ base?: string;
65
+ client?: Record<string, any>;
66
+ preload?: Record<string, string>;
67
+ };
58
68
  }
59
69
 
60
70
  /**
@@ -67,7 +77,7 @@ export interface BuildServerResult {
67
77
  export async function buildServer(
68
78
  opts: BuildServerOptions,
69
79
  ): Promise<BuildServerResult> {
70
- const { build: viteBuild, mergeConfig } = await importVite();
80
+ const { build: viteBuild, resolveConfig } = await importVite();
71
81
  const plugins: any[] = [];
72
82
 
73
83
  const viteReact = await importViteReact();
@@ -93,6 +103,7 @@ export async function buildServer(
93
103
  conditions.unshift(...opts.conditions);
94
104
  }
95
105
 
106
+ // note: we still can override this config via config file (vite.config.ts)
96
107
  const viteBuildServerConfig: UserConfig = {
97
108
  mode: "production",
98
109
  logLevel: opts.silent ? "silent" : undefined,
@@ -121,24 +132,32 @@ export async function buildServer(
121
132
  },
122
133
  },
123
134
  esbuild: { legalComments: "none", keepNames: true },
124
- customLogger: logger,
135
+ customLogger: logger, // mock logger to avoid noisy output
125
136
  plugins,
126
137
  };
127
138
 
139
+ // create inline config by merging alepha built-in + extended config
140
+
128
141
  let result: vite.Rollup.RollupOutput | vite.Rollup.RollupOutput[];
129
142
  try {
130
- result = (await viteBuild(
131
- mergeConfig(viteBuildServerConfig, opts.config || {}),
132
- )) as vite.Rollup.RollupOutput | vite.Rollup.RollupOutput[];
143
+ result = (await viteBuild(viteBuildServerConfig)) as
144
+ | vite.Rollup.RollupOutput
145
+ | vite.Rollup.RollupOutput[];
133
146
  } catch (error) {
134
- // Flush buffered logs on failure so user can see what happened
147
+ // flush buffered logs on failure so user can see what happened
135
148
  logger?.flush();
136
149
  throw error;
137
150
  }
138
151
 
139
- // Extract resolved config to get externals
140
- const resolvedConfig = (result as any).resolvedConfig;
141
- const externals: string[] = resolvedConfig?.ssr?.external ?? [];
152
+ // resolve final config to read externals
153
+ const resolvedConfig = await resolveConfig(viteBuildServerConfig, "build");
154
+
155
+ // extract resolved config to get externals
156
+ const externals: string[] = [];
157
+
158
+ if (Array.isArray(resolvedConfig?.ssr?.external)) {
159
+ externals.push(...resolvedConfig.ssr.external);
160
+ }
142
161
 
143
162
  // Generate package.json with externals
144
163
  await generateExternals({
@@ -161,21 +180,44 @@ export async function buildServer(
161
180
  // Embed SSR manifests if client was built
162
181
  // This bundles all manifest data into index.js for serverless deployments
163
182
  let manifest = "";
183
+ let manifestData:
184
+ | {
185
+ base?: string;
186
+ client?: Record<string, any>;
187
+ preload?: Record<string, string>;
188
+ }
189
+ | undefined;
190
+
164
191
  if (opts.clientDir) {
165
192
  const viteDir = `${opts.distDir}/${opts.clientDir}/.vite`;
166
- const ssrManifest = await loadJsonFile(`${viteDir}/ssr-manifest.json`);
167
193
  const clientManifest = await loadJsonFile(`${viteDir}/manifest.json`);
168
194
  const preloadManifest = await loadJsonFile(
169
195
  `${viteDir}/preload-manifest.json`,
170
196
  );
171
197
 
172
- const combined = {
173
- ssr: ssrManifest,
174
- client: clientManifest,
198
+ // Strip unused fields from client manifest to reduce bundle size
199
+ const strippedClientManifest = stripClientManifest(clientManifest);
200
+
201
+ // Get base path from resolved config (defaults to "/" if not set)
202
+ // Normalize: ensure it starts with "/" and doesn't end with "/" (unless it's just "/")
203
+ let base = resolvedConfig.base || "/";
204
+ if (!base.startsWith("/")) {
205
+ base = `/${base}`;
206
+ }
207
+ if (base.length > 1 && base.endsWith("/")) {
208
+ base = base.slice(0, -1);
209
+ }
210
+
211
+ manifestData = {
212
+ base: base !== "/" ? base : undefined, // Only include if not default
213
+ client: strippedClientManifest,
175
214
  preload: preloadManifest,
176
215
  };
177
216
 
178
- manifest = `__alepha.set("alepha.react.ssr.manifest", ${JSON.stringify(combined)});\n`;
217
+ manifest = `__alepha.set("alepha.react.ssr.manifest", ${JSON.stringify(manifestData)});\n`;
218
+
219
+ // Set manifest in alepha store for pre-rendering
220
+ opts.alepha.store.set("alepha.react.ssr.manifest" as any, manifestData);
179
221
 
180
222
  // Remove .vite directory - no longer needed at runtime
181
223
  await rm(viteDir, { recursive: true, force: true });
@@ -191,7 +233,7 @@ export async function buildServer(
191
233
  `${warning}\n${template}${manifest}import './server/${entryFile}';\n`.trim(),
192
234
  );
193
235
 
194
- return { entryFile };
236
+ return { entryFile, manifest: manifestData };
195
237
  }
196
238
 
197
239
  /**
@@ -206,6 +248,27 @@ async function loadJsonFile(path: string): Promise<any> {
206
248
  }
207
249
  }
208
250
 
251
+ /**
252
+ * Strip unused fields from client manifest to reduce bundle size.
253
+ * Only keeps: file, isEntry, imports, css
254
+ */
255
+ function stripClientManifest(
256
+ manifest: Record<string, any> | undefined,
257
+ ): Record<string, any> | undefined {
258
+ if (!manifest) return undefined;
259
+
260
+ const stripped: Record<string, any> = {};
261
+ for (const [key, entry] of Object.entries(manifest)) {
262
+ stripped[key] = {
263
+ file: entry.file,
264
+ ...(entry.isEntry && { isEntry: entry.isEntry }),
265
+ ...(entry.imports?.length && { imports: entry.imports }),
266
+ ...(entry.css?.length && { css: entry.css }),
267
+ };
268
+ }
269
+ return stripped;
270
+ }
271
+
209
272
  /**
210
273
  * Extract entry filename from Vite build result.
211
274
  */
@@ -1,9 +1,10 @@
1
1
  import { cp, mkdir } from "node:fs/promises";
2
2
  import { createRequire } from "node:module";
3
3
  import { dirname, join, resolve } from "node:path";
4
- import { importAlepha } from "../helpers/importAlepha.ts";
4
+ import type { Alepha } from "alepha";
5
5
 
6
6
  export interface CopyAssetsOptions {
7
+ alepha: Alepha;
7
8
  /**
8
9
  * Entry point for the built Alepha application.
9
10
  */
@@ -17,7 +18,7 @@ export interface CopyAssetsOptions {
17
18
  /**
18
19
  * @default process.cwd()
19
20
  */
20
- root?: string;
21
+ root: string;
21
22
 
22
23
  /**
23
24
  * Add Runner for logging (@see Alepha CLI)
@@ -38,8 +39,8 @@ export interface CopyAssetsOptions {
38
39
  * Used by modules like AlephaServerSwagger to distribute UI files.
39
40
  */
40
41
  export async function copyAssets(opts: CopyAssetsOptions): Promise<void> {
41
- const root = opts.root ?? process.cwd();
42
- const alepha = await importAlepha(opts.entry);
42
+ const root = opts.root;
43
+ const alepha = opts.alepha;
43
44
  const assets = alepha.store.get("alepha.build.assets");
44
45
 
45
46
  if (!assets || assets.length === 0) {
@@ -1,11 +1,11 @@
1
+ import { writeFile } from "node:fs/promises";
1
2
  import type { Alepha } from "alepha";
2
- import { importAlepha } from "../helpers/importAlepha.ts";
3
3
 
4
4
  export interface GenerateSitemapOptions {
5
5
  /**
6
- * Entry point for the built Alepha application.
6
+ * Alepha instance to use for generating the sitemap.
7
7
  */
8
- entry: string;
8
+ alepha: Alepha;
9
9
 
10
10
  /**
11
11
  * Base URL for the sitemap (e.g., "https://example.com").
@@ -13,52 +13,93 @@ export interface GenerateSitemapOptions {
13
13
  baseUrl: string;
14
14
 
15
15
  /**
16
- * Optional HTML template (for React SSR).
16
+ * Output file path for the sitemap. If provided, writes the sitemap to disk.
17
17
  */
18
- template?: string;
18
+ output?: string;
19
+
20
+ /**
21
+ * Add Runner for logging (@see Alepha CLI)
22
+ */
23
+ run?: (opts: {
24
+ name: string;
25
+ handler: () => Promise<void>;
26
+ }) => Promise<string>;
19
27
  }
20
28
 
21
29
  /**
22
30
  * Generate sitemap.xml from Alepha page primitives.
23
31
  *
24
- * This task loads the built Alepha application,
25
- * queries all page primitives, and generates a sitemap.xml
32
+ * Queries all page primitives and generates a sitemap.xml
26
33
  * containing URLs for all accessible pages.
27
34
  */
28
35
  export async function generateSitemap(
29
36
  opts: GenerateSitemapOptions,
30
37
  ): Promise<string> {
31
- const alepha = await importAlepha(opts.entry);
38
+ const pages = getSitemapPages(opts.alepha);
32
39
 
33
- if (opts.template) {
34
- alepha.set("alepha.react.server.template", opts.template);
40
+ // Nothing to generate
41
+ if (pages.length === 0) {
42
+ return "";
35
43
  }
36
44
 
37
- if (!alepha.isConfigured()) {
38
- await alepha.events.emit("configure", alepha);
39
- (alepha as any).configured = true;
45
+ let result = "";
46
+
47
+ const fn = async () => {
48
+ result = generateSitemapFromPages(pages, opts.baseUrl);
49
+ if (opts.output) {
50
+ await writeFile(opts.output, result);
51
+ }
52
+ };
53
+
54
+ if (opts.run) {
55
+ await opts.run({
56
+ name: "generate sitemap",
57
+ handler: fn,
58
+ });
59
+ } else {
60
+ await fn();
40
61
  }
41
62
 
42
- return generateSitemapFromAlepha(alepha, opts.baseUrl);
63
+ return result;
43
64
  }
44
65
 
45
- function generateSitemapFromAlepha(alepha: Alepha, baseUrl: string): string {
66
+ /**
67
+ * Get all pages that should be included in the sitemap.
68
+ */
69
+ function getSitemapPages(alepha: Alepha): any[] {
46
70
  const pages = alepha.primitives("page") as any[];
47
- const urls: string[] = [];
48
-
49
- for (const page of pages) {
71
+ return pages.filter((page) => {
50
72
  const options = page.options;
51
-
52
73
  // Skip pages with children (parent pages that can't be rendered directly)
53
74
  if (options.children) {
54
- continue;
75
+ return false;
76
+ }
77
+ // Include pages without parameters or static pages with entries
78
+ if (!options.schema?.params) {
79
+ return true;
80
+ }
81
+ if (
82
+ options.static &&
83
+ typeof options.static === "object" &&
84
+ options.static.entries
85
+ ) {
86
+ return true;
55
87
  }
88
+ return false;
89
+ });
90
+ }
91
+
92
+ function generateSitemapFromPages(pages: any[], baseUrl: string): string {
93
+ const urls: string[] = [];
94
+ const normalizedBaseUrl = baseUrl.replace(/\/$/, "");
95
+
96
+ for (const page of pages) {
97
+ const options = page.options;
56
98
 
57
- // Only include static pages or pages without parameters
58
99
  if (!options.schema?.params) {
59
100
  // Simple page without parameters
60
101
  const path = options.path || "";
61
- const url = `${baseUrl.replace(/\/$/, "")}${path === "" ? "/" : path}`;
102
+ const url = `${normalizedBaseUrl}${path === "" ? "/" : path}`;
62
103
  urls.push(url);
63
104
  } else if (
64
105
  options.static &&
@@ -71,7 +112,7 @@ function generateSitemapFromAlepha(alepha: Alepha, baseUrl: string): string {
71
112
  options.path || "",
72
113
  entry.params || {},
73
114
  );
74
- const url = `${baseUrl.replace(/\/$/, "")}${path}`;
115
+ const url = `${normalizedBaseUrl}${path}`;
75
116
  urls.push(url);
76
117
  }
77
118
  }
@@ -13,11 +13,9 @@
13
13
  export * from "./buildClient.ts";
14
14
  export * from "./buildServer.ts";
15
15
  export * from "./copyAssets.ts";
16
- export * from "./devServer.ts";
17
16
  export * from "./generateCloudflare.ts";
18
17
  export * from "./generateDocker.ts";
19
18
  export * from "./generateExternals.ts";
20
19
  export * from "./generateSitemap.ts";
21
20
  export * from "./generateVercel.ts";
22
21
  export * from "./prerenderPages.ts";
23
- export * from "./runAlepha.ts";
@@ -1,6 +1,5 @@
1
1
  import { mkdir, writeFile } from "node:fs/promises";
2
2
  import type { Alepha } from "alepha";
3
- import { importAlepha } from "../helpers/importAlepha.ts";
4
3
  import {
5
4
  compressFile,
6
5
  type ViteCompressOptions,
@@ -8,9 +7,9 @@ import {
8
7
 
9
8
  export interface PrerenderPagesOptions {
10
9
  /**
11
- * Entry point for the built Alepha application.
10
+ * Alepha instance to use for pre-rendering.
12
11
  */
13
- entry: string;
12
+ alepha: Alepha;
14
13
 
15
14
  /**
16
15
  * Client dist directory for output files.
@@ -21,6 +20,14 @@ export interface PrerenderPagesOptions {
21
20
  * Optional compression options.
22
21
  */
23
22
  compress?: ViteCompressOptions | boolean;
23
+
24
+ /**
25
+ * Add Runner for logging (@see Alepha CLI)
26
+ */
27
+ run?: (opts: {
28
+ name: string;
29
+ handler: () => Promise<void>;
30
+ }) => Promise<string>;
24
31
  }
25
32
 
26
33
  export interface PrerenderPagesResult {
@@ -33,45 +40,63 @@ export interface PrerenderPagesResult {
33
40
  /**
34
41
  * Pre-render static pages defined in the Alepha application.
35
42
  *
36
- * This task loads the built Alepha application, queries all page
37
- * primitives with `static: true`, and generates static HTML files
38
- * for each page. Supports pages with parameterized routes via
39
- * `static.entries` configuration.
43
+ * Queries all page primitives with `static: true` and generates
44
+ * static HTML files for each page. Supports pages with parameterized
45
+ * routes via `static.entries` configuration.
40
46
  */
41
47
  export async function prerenderPages(
42
48
  opts: PrerenderPagesOptions,
43
49
  ): Promise<PrerenderPagesResult> {
44
- const alepha = await importAlepha(opts.entry);
50
+ const alepha = opts.alepha;
51
+ const pages = getStaticPages(alepha);
45
52
 
46
- const now = Date.now();
53
+ // Nothing to pre-render
54
+ if (pages.length === 0) {
55
+ return { count: 0 };
56
+ }
57
+
58
+ let result: PrerenderPagesResult = { count: 0 };
47
59
 
48
- if (!alepha.isConfigured()) {
49
- await alepha.events.emit("configure", alepha);
50
- (alepha as any).configured = true;
60
+ const fn = async () => {
61
+ // TODO: running configure here is a temporary workaround
62
+ if (!alepha.isConfigured()) {
63
+ await alepha.events.emit("configure", alepha);
64
+ }
65
+ result = await prerenderFromAlepha(pages, opts.dist, opts.compress);
66
+ };
67
+
68
+ if (opts.run) {
69
+ await opts.run({
70
+ name: "pre-render pages",
71
+ handler: fn,
72
+ });
73
+ } else {
74
+ await fn();
51
75
  }
52
76
 
53
- return await prerenderFromAlepha(alepha, opts.dist, opts.compress);
77
+ return result;
78
+ }
79
+
80
+ /**
81
+ * Get all static pages from the Alepha instance.
82
+ */
83
+ function getStaticPages(alepha: Alepha): any[] {
84
+ const pages = alepha.primitives("page") as any[];
85
+ return pages.filter((page) => {
86
+ const options = page.options;
87
+ return options.static && !options.children;
88
+ });
54
89
  }
55
90
 
56
91
  async function prerenderFromAlepha(
57
- alepha: Alepha,
92
+ pages: any[],
58
93
  dist: string,
59
94
  compress?: ViteCompressOptions | boolean,
60
95
  ): Promise<PrerenderPagesResult> {
61
96
  let count = 0;
62
- const pages = alepha.primitives("page") as any[];
63
97
 
64
98
  for (const page of pages) {
65
99
  const options = page.options;
66
-
67
- if (options.children) {
68
- continue;
69
- }
70
-
71
- if (!options.static) {
72
- continue;
73
- }
74
-
75
100
  const config = typeof options.static === "object" ? options.static : {};
76
101
 
77
102
  if (!options.schema?.params) {
@@ -58,17 +58,21 @@ export * from "./providers/NodeWebSocketServerProvider.ts";
58
58
  // ---------------------------------------------------------------------------------------------------------------------
59
59
 
60
60
  /**
61
- * Provides real-time bidirectional communication using WebSockets.
61
+ * | type | quality | stability |
62
+ * |------|---------|-----------|
63
+ * | backend | rare | experimental |
62
64
  *
63
- * The WebSockets module enables building real-time applications using the `$websocket` primitive
64
- * on class properties. It provides automatic connection management, message routing, type-safe
65
- * message handling, and seamless integration with other Alepha modules.
65
+ * Real-time bidirectional communication.
66
66
  *
67
- * On the server side (Node.js), it uses the 'ws' library to create a WebSocket server.
68
- * On the client side (browser), it uses the native WebSocket API.
67
+ * **Features:**
68
+ * - WebSocket server definition
69
+ * - Named communication channels
70
+ * - Type-safe message handling
71
+ * - Connection lifecycle management
72
+ * - Room/channel grouping
73
+ * - Browser compatibility
69
74
  *
70
- * @see {@link $websocket}
71
- * @module alepha.websockets
75
+ * @module alepha.websocket
72
76
  */
73
77
  export const AlephaWebSocket = $module({
74
78
  name: "alepha.websocket",