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 { $inject, t } from "alepha";
2
2
  import { $command } from "alepha/command";
3
- import { FileSystemProvider } from "alepha/file";
3
+ import { FileSystemProvider } from "alepha/system";
4
4
  import { AlephaCliUtils } from "../services/AlephaCliUtils.ts";
5
5
  import { PackageManagerUtils } from "../services/PackageManagerUtils.ts";
6
6
  import { ProjectScaffolder } from "../services/ProjectScaffolder.ts";
@@ -29,107 +29,150 @@ export class InitCommand {
29
29
  agent: t.optional(
30
30
  t.boolean({
31
31
  aliases: ["a"],
32
- description: "Add CLAUDE.md for Claude Code AI assistant",
32
+ description:
33
+ "Add AI agent instructions (CLAUDE.md if claude CLI installed, else AGENTS.md)",
33
34
  }),
34
35
  ),
35
- // choose package manager
36
- yarn: t.optional(t.boolean({ description: "Use Yarn package manager" })),
37
- pnpm: t.optional(t.boolean({ description: "Use pnpm package manager" })),
38
- npm: t.optional(t.boolean({ description: "Use npm package manager" })),
39
- bun: t.optional(t.boolean({ description: "Use Bun package manager" })),
40
- // choose which dependencies to add
41
- web: t.optional(
36
+ pm: t.optional(
37
+ t.enum(["yarn", "npm", "pnpm", "bun"], {
38
+ description: "Package manager to use",
39
+ }),
40
+ ),
41
+ // choose which modules to scaffold
42
+ api: t.optional(
43
+ t.boolean({
44
+ description: "Include API module structure (src/api/)",
45
+ }),
46
+ ),
47
+ react: t.optional(
42
48
  t.boolean({
43
49
  aliases: ["r"],
44
- description: "Include Alepha React dependencies",
50
+ description: "Include React dependencies and web module (src/web/)",
45
51
  }),
46
52
  ),
47
- admin: t.optional(
48
- t.boolean({ description: "Include Alepha UI dependencies" }),
53
+ ui: t.optional(
54
+ t.boolean({
55
+ description:
56
+ "Include @alepha/ui (components, auth portal, admin portal)",
57
+ }),
49
58
  ),
50
59
  test: t.optional(
51
60
  t.boolean({ description: "Include Vitest and create test directory" }),
52
61
  ),
62
+ force: t.optional(
63
+ t.boolean({
64
+ aliases: ["f"],
65
+ description: "Override existing files",
66
+ }),
67
+ ),
53
68
  }),
54
69
  handler: async ({ run, flags, root, args }) => {
55
- if (flags.admin) {
56
- flags.web = true;
57
- }
58
-
59
70
  if (args) {
60
71
  root = this.fs.join(root, args);
61
72
  await this.fs.mkdir(root);
62
73
  }
63
74
 
75
+ if (flags.ui) {
76
+ flags.react = true;
77
+ }
78
+
79
+ // Detect workspace context (are we inside packages/ or apps/ of a monorepo?)
80
+ const workspace = await this.pm.getWorkspaceContext(root);
81
+
82
+ // Detect agent type: claude CLI → CLAUDE.md, else → AGENTS.md
83
+ let agentType: "claude" | "agents" | false = false;
84
+ if (flags.agent) {
85
+ const hasClaudeCli = await this.utils.isInstalledAsync("claude");
86
+ agentType = hasClaudeCli ? "claude" : "agents";
87
+ }
88
+
64
89
  const isExpo = await this.pm.hasExpo(root);
65
90
 
91
+ const force = !!flags.force;
92
+
66
93
  await run({
67
94
  name: "ensuring configuration files",
68
95
  handler: async () => {
69
96
  await this.scaffolder.ensureConfig(root, {
70
- tsconfigJson: true,
71
- packageJson: flags,
72
- biomeJson: true,
73
- editorconfig: true,
74
- indexHtml: !!flags.web && !isExpo,
75
- claudeMd: flags.agent
76
- ? { react: !!flags.web, ui: !!flags.admin }
97
+ force,
98
+ tsconfigJson: !workspace.config.tsconfigJson,
99
+ packageJson: { ...flags, isPackage: workspace.isPackage },
100
+ // Skip workspace-level configs if they exist at workspace root
101
+ biomeJson: !workspace.config.biomeJson,
102
+ editorconfig: !workspace.config.editorconfig,
103
+ agentMd: agentType
104
+ ? { type: agentType, react: !!flags.react, ui: !!flags.ui }
77
105
  : false,
78
106
  });
79
107
 
80
- // Create API project structure if not React
81
- if (!flags.web) {
82
- await this.scaffolder.ensureApiProject(root);
108
+ // Create project structure based on flags
109
+ await this.scaffolder.ensureMainServerTs(root, {
110
+ api: !!flags.api,
111
+ react: !!flags.react && !isExpo,
112
+ force,
113
+ });
114
+ if (flags.api) {
115
+ await this.scaffolder.ensureApiProject(root, { force });
116
+ }
117
+ if (flags.react && !isExpo) {
118
+ await this.scaffolder.ensureWebProject(root, {
119
+ api: !!flags.api,
120
+ ui: !!flags.ui,
121
+ force,
122
+ });
83
123
  }
84
124
  },
85
125
  });
86
126
 
87
- // TODO: check if all alepha dependencies are same version
127
+ // Use workspace PM if detected, otherwise detect from current root
128
+ const pmName = await this.pm.getPackageManager(
129
+ workspace.workspaceRoot ?? root,
130
+ flags.pm ?? workspace.packageManager ?? undefined,
131
+ );
88
132
 
89
- const pmName = await this.pm.getPackageManager(root, flags);
90
- if (pmName === "yarn") {
91
- await this.pm.ensureYarn(root);
92
- await run("yarn set version stable", { root });
93
- } else if (pmName === "bun") {
94
- await this.pm.ensureBun(root);
95
- } else if (pmName === "pnpm") {
96
- await this.pm.ensurePnpm(root);
97
- } else {
98
- await this.pm.ensureNpm(root);
133
+ // Only setup PM files if not in a workspace package
134
+ if (!workspace.isPackage) {
135
+ if (pmName === "yarn") {
136
+ await this.pm.ensureYarn(root);
137
+ await run("yarn set version stable", { root });
138
+ } else if (pmName === "bun") {
139
+ await this.pm.ensureBun(root);
140
+ } else if (pmName === "pnpm") {
141
+ await this.pm.ensurePnpm(root);
142
+ } else {
143
+ await this.pm.ensureNpm(root);
144
+ }
99
145
  }
100
146
 
147
+ // Run install from workspace root if in a package, otherwise from current root
148
+ const installRoot = workspace.workspaceRoot ?? root;
101
149
  await run(`${pmName} install`, {
102
150
  alias: `installing dependencies with ${pmName}`,
103
- root,
104
- });
105
-
106
- if (!isExpo) {
107
- await this.pm.ensureDependency(root, "vite", {
108
- run,
109
- exec: (cmd, opts) => this.utils.exec(cmd, opts),
110
- });
111
- }
112
-
113
- await this.pm.ensureDependency(root, "@biomejs/biome", {
114
- run,
115
- exec: (cmd, opts) => this.utils.exec(cmd, opts),
151
+ root: installRoot,
116
152
  });
117
153
 
118
- // Install vitest and create test directory if --test flag is set
154
+ // Create test directory if --test flag is set (vitest is in package.json)
119
155
  if (flags.test) {
120
156
  await this.scaffolder.ensureTestDir(root);
121
- await run(
122
- `${pmName} ${pmName === "yarn" ? "add" : "install"} -D vitest`,
123
- {
124
- alias: "setup testing with Vitest",
125
- },
126
- );
127
157
  }
128
158
 
129
159
  await run(`${pmName} run lint`, {
130
160
  alias: "running linter",
131
- root,
161
+ root: installRoot,
132
162
  });
163
+
164
+ // Initialize git repository if not in a workspace package
165
+ if (!workspace.isPackage) {
166
+ const gitInitialized = await this.scaffolder.ensureGitRepo(root, {
167
+ force,
168
+ });
169
+ if (gitInitialized) {
170
+ await run("git add .", {
171
+ alias: "staging generated files",
172
+ root,
173
+ });
174
+ }
175
+ }
133
176
  },
134
177
  });
135
178
  }
@@ -13,11 +13,17 @@ export class LintCommand {
13
13
  name: "lint",
14
14
  description: "Run linter across the codebase using Biome",
15
15
  handler: async ({ root }) => {
16
- await this.scaffolder.ensureConfig(root, { biomeJson: true });
16
+ await this.scaffolder.ensureConfig(root, {
17
+ biomeJson: true,
18
+ checkWorkspace: true,
19
+ });
20
+
17
21
  await this.pm.ensureDependency(root, "@biomejs/biome", {
22
+ checkWorkspace: true,
18
23
  exec: (cmd, opts) => this.utils.exec(cmd, opts),
19
24
  });
20
- await this.utils.exec("biome check --formatter-enabled=false --fix");
25
+
26
+ await this.utils.exec("biome check --fix");
21
27
  },
22
28
  });
23
29
  }
@@ -3,11 +3,13 @@ import { $command } from "alepha/command";
3
3
  import { $logger } from "alepha/logger";
4
4
  import { AlephaCliUtils } from "../services/AlephaCliUtils.ts";
5
5
  import { PackageManagerUtils } from "../services/PackageManagerUtils.ts";
6
+ import { ProjectScaffolder } from "../services/ProjectScaffolder.ts";
6
7
 
7
8
  export class TypecheckCommand {
8
9
  protected readonly utils = $inject(AlephaCliUtils);
9
10
  protected readonly pm = $inject(PackageManagerUtils);
10
11
  protected readonly log = $logger();
12
+ protected readonly scaffolder = $inject(ProjectScaffolder);
11
13
 
12
14
  /**
13
15
  * Run TypeScript type checking across the codebase with no emit.
@@ -18,10 +20,19 @@ export class TypecheckCommand {
18
20
  description: "Check TypeScript types across the codebase",
19
21
  handler: async ({ root }) => {
20
22
  this.log.info("Starting TypeScript type checking...");
23
+
24
+ await this.scaffolder.ensureConfig(root, {
25
+ tsconfigJson: true,
26
+ checkWorkspace: true,
27
+ });
28
+
21
29
  await this.pm.ensureDependency(root, "typescript", {
30
+ checkWorkspace: true,
22
31
  exec: (cmd, opts) => this.utils.exec(cmd, opts),
23
32
  });
33
+
24
34
  await this.utils.exec("tsc --noEmit");
35
+
25
36
  this.log.info("TypeScript type checking completed successfully.");
26
37
  },
27
38
  });
@@ -1,8 +1,13 @@
1
1
  import type { Alepha } from "alepha";
2
2
  import type { CommandPrimitive } from "alepha/command";
3
+ import {
4
+ type AppEntryOptions,
5
+ appEntryOptions,
6
+ } from "./atoms/appEntryOptions.ts";
3
7
  import { type BuildOptions, buildOptions } from "./atoms/buildOptions.ts";
4
8
 
5
9
  export interface AlephaCliConfig {
10
+ entry?: AppEntryOptions;
6
11
  /**
7
12
  * Add custom commands to the Alepha CLI.
8
13
  *
@@ -54,6 +59,10 @@ export const defineConfig = (
54
59
  alepha.set(buildOptions, config.build);
55
60
  }
56
61
 
62
+ if (config.entry) {
63
+ alepha.set(appEntryOptions, config.entry);
64
+ }
65
+
57
66
  return {
58
67
  ...config.commands,
59
68
  };
package/src/cli/index.ts CHANGED
@@ -1,12 +1,12 @@
1
1
  export * from "./apps/AlephaCli.ts";
2
2
  export * from "./apps/AlephaPackageBuilderCli.ts";
3
+ export { default as AlephaPackageBuilderCli } from "./apps/AlephaPackageBuilderCli.ts";
3
4
  export * from "./atoms/changelogOptions.ts";
4
5
  export * from "./commands/build.ts";
5
6
  export * from "./commands/clean.ts";
6
7
  export * from "./commands/db.ts";
7
8
  export * from "./commands/deploy.ts";
8
9
  export * from "./commands/dev.ts";
9
- export * from "./commands/format.ts";
10
10
  export * from "./commands/gen/changelog.ts";
11
11
  export * from "./commands/gen/openapi.ts";
12
12
  export * from "./commands/init.ts";
@@ -16,6 +16,7 @@ export * from "./commands/test.ts";
16
16
  export * from "./commands/typecheck.ts";
17
17
  export * from "./commands/verify.ts";
18
18
  export * from "./defineConfig.ts";
19
+ export * from "./providers/AppEntryProvider.ts";
19
20
  export * from "./services/AlephaCliUtils.ts";
20
21
  export * from "./services/GitMessageParser.ts";
21
22
  export * from "./version.ts";
@@ -0,0 +1,131 @@
1
+ import { $inject, $use, AlephaError } from "alepha";
2
+ import { FileSystemProvider } from "alepha/system";
3
+ import { appEntryOptions } from "../atoms/appEntryOptions.ts";
4
+
5
+ /**
6
+ * Service for locating entry files in Alepha projects.
7
+ *
8
+ * Originally in alepha/vite, moved to CLI to avoid cli -> vite dependency.
9
+ */
10
+ export class AppEntryProvider {
11
+ protected readonly fs = $inject(FileSystemProvider);
12
+ protected readonly options = $use(appEntryOptions);
13
+
14
+ protected readonly serverEntries = [
15
+ "main.server.ts",
16
+ "main.server.tsx",
17
+ "main.ts",
18
+ "main.tsx",
19
+ ] as const;
20
+
21
+ protected readonly browserEntries = [
22
+ "main.browser.ts",
23
+ "main.browser.tsx",
24
+ "main.ts",
25
+ "main.tsx",
26
+ ] as const;
27
+
28
+ protected readonly styleEntries = [
29
+ "main.css",
30
+ "styles.css",
31
+ "style.css",
32
+ ] as const;
33
+
34
+ /**
35
+ * Get application entry points.
36
+ *
37
+ * Server entry is required, an error is thrown if not found.
38
+ * Browser entry is optional.
39
+ *
40
+ * It will first check for custom entries in options, see appEntryOptions.
41
+ */
42
+ public async getAppEntry(root: string): Promise<AppEntry> {
43
+ const appEntry: AppEntry = {
44
+ root,
45
+ server: "",
46
+ };
47
+
48
+ if (this.options.server) {
49
+ const serverExists = await this.fs.exists(
50
+ this.fs.join(root, this.options.server),
51
+ );
52
+ if (!serverExists) {
53
+ throw new AlephaError(
54
+ `Custom server entry "${this.options.server}" not found.`,
55
+ );
56
+ }
57
+ appEntry.server = this.options.server;
58
+ }
59
+
60
+ if (this.options.browser) {
61
+ const browserExists = await this.fs.exists(
62
+ this.fs.join(root, this.options.browser),
63
+ );
64
+ if (!browserExists) {
65
+ throw new AlephaError(
66
+ `Custom browser entry "${this.options.browser}" not found.`,
67
+ );
68
+ }
69
+ appEntry.browser = this.options.browser;
70
+ }
71
+
72
+ if (this.options.style) {
73
+ const styleExists = await this.fs.exists(
74
+ this.fs.join(root, this.options.style),
75
+ );
76
+ if (!styleExists) {
77
+ throw new AlephaError(
78
+ `Custom style entry "${this.options.style}" not found.`,
79
+ );
80
+ }
81
+ appEntry.style = this.options.style;
82
+ }
83
+
84
+ const srcFiles = await this.fs.ls(this.fs.join(root, "src"));
85
+
86
+ if (!appEntry.server) {
87
+ // find in conventional locations
88
+ for (const entry of this.serverEntries) {
89
+ if (srcFiles.includes(entry)) {
90
+ appEntry.server = this.fs.join("src", entry);
91
+ break;
92
+ }
93
+ }
94
+ }
95
+
96
+ if (!appEntry.server) {
97
+ throw new AlephaError(
98
+ "No server entry found. Please, add a main.server.ts file in the src/ directory or configure a custom entry in alepha.config.ts.",
99
+ );
100
+ }
101
+
102
+ if (!appEntry.browser) {
103
+ // find in conventional locations
104
+ for (const entry of this.browserEntries) {
105
+ if (srcFiles.includes(entry)) {
106
+ appEntry.browser = this.fs.join("src", entry);
107
+ break;
108
+ }
109
+ }
110
+ }
111
+
112
+ if (!appEntry.style) {
113
+ // find in conventional locations
114
+ for (const entry of this.styleEntries) {
115
+ if (srcFiles.includes(entry)) {
116
+ appEntry.style = this.fs.join("src", entry);
117
+ break;
118
+ }
119
+ }
120
+ }
121
+
122
+ return appEntry;
123
+ }
124
+ }
125
+
126
+ export interface AppEntry {
127
+ root: string;
128
+ server: string;
129
+ browser?: string;
130
+ style?: string;
131
+ }
@@ -0,0 +1,40 @@
1
+ import { $inject, type Alepha, AlephaError } from "alepha";
2
+ import { ViteUtils } from "../services/ViteUtils.ts";
3
+ import type { AppEntry } from "./AppEntryProvider.ts";
4
+
5
+ export class ViteBuildProvider {
6
+ protected alepha?: Alepha;
7
+ protected appEntry?: AppEntry;
8
+ protected readonly viteUtils = $inject(ViteUtils);
9
+
10
+ public async init(opts: { entry: AppEntry }) {
11
+ const alepha = await this.viteUtils.runAlepha({
12
+ entry: opts.entry,
13
+ mode: "production",
14
+ });
15
+
16
+ this.alepha = alepha;
17
+ this.appEntry = opts.entry;
18
+
19
+ return alepha;
20
+ }
21
+
22
+ public hasClient(): boolean {
23
+ if (!this.alepha) {
24
+ throw new AlephaError("ViteBuildProvider not initialized");
25
+ }
26
+ try {
27
+ this.alepha.inject("ReactServerProvider");
28
+ return true;
29
+ } catch {
30
+ return false;
31
+ }
32
+ }
33
+
34
+ public generateIndexHtml(): string {
35
+ if (!this.appEntry) {
36
+ throw new AlephaError("ViteBuildProvider not initialized");
37
+ }
38
+ return this.viteUtils.generateIndexHtml(this.appEntry);
39
+ }
40
+ }