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
@@ -3,7 +3,7 @@ import * as os from "node:os";
3
3
  import { join } from "node:path";
4
4
  import { $inject, AlephaError } from "alepha";
5
5
  import { $command } from "alepha/command";
6
- import { FileSystemProvider } from "alepha/file";
6
+ import { FileSystemProvider } from "alepha/system";
7
7
  import type { InlineConfig } from "tsdown";
8
8
 
9
9
  interface Module {
@@ -110,6 +110,7 @@ export class AlephaPackageBuilderCli {
110
110
  sourcemap: true,
111
111
  fixedExtension: false,
112
112
  platform: "node", // TODO: node must be enabled only if index.node.ts exists
113
+ inlineOnly: false,
113
114
  external,
114
115
  dts: {
115
116
  sourcemap: true,
@@ -123,6 +124,7 @@ export class AlephaPackageBuilderCli {
123
124
  platform: "neutral",
124
125
  sourcemap: true,
125
126
  dts: false,
127
+ inlineOnly: false,
126
128
  external,
127
129
  });
128
130
  }
@@ -134,6 +136,7 @@ export class AlephaPackageBuilderCli {
134
136
  platform: "browser",
135
137
  sourcemap: true,
136
138
  dts: false,
139
+ inlineOnly: false,
137
140
  external,
138
141
  });
139
142
  }
@@ -146,6 +149,7 @@ export class AlephaPackageBuilderCli {
146
149
  sourcemap: true,
147
150
  fixedExtension: false,
148
151
  dts: false,
152
+ inlineOnly: false,
149
153
  external,
150
154
  });
151
155
  }
@@ -158,8 +162,10 @@ export class AlephaPackageBuilderCli {
158
162
  config,
159
163
  `export default ${JSON.stringify(entries, null, 2)};`,
160
164
  );
165
+
166
+ // /!\ Warning /!\
167
+ // avoid to call tsdown programmatically, when we spawn 8 processes at once it 'JavaScript heap out of memory' :---)
161
168
  await run(`npx tsdown -c=${config}`);
162
- //await this.fs.rm(config);
163
169
  };
164
170
 
165
171
  const concurrency = Math.ceil(os.cpus().length / 2);
@@ -183,6 +189,8 @@ export class AlephaPackageBuilderCli {
183
189
  });
184
190
  }
185
191
 
192
+ export default AlephaPackageBuilderCli;
193
+
186
194
  async function getAllFiles(dir: string): Promise<string[]> {
187
195
  const files: string[] = [];
188
196
 
@@ -0,0 +1,13 @@
1
+ import { $atom, type Static, t } from "alepha";
2
+
3
+ export const appEntryOptions = $atom({
4
+ name: "alepha.cli.appEntry.options",
5
+ schema: t.object({
6
+ server: t.optional(t.text()),
7
+ browser: t.optional(t.text()),
8
+ style: t.optional(t.text()),
9
+ }),
10
+ default: {},
11
+ });
12
+
13
+ export type AppEntryOptions = Static<typeof appEntryOptions.schema>;
@@ -8,7 +8,7 @@ import { $atom } from "../../core/primitives/$atom.ts";
8
8
  * Options can be overridden via vite.config.ts or CLI flags.
9
9
  */
10
10
  export const buildOptions = $atom({
11
- name: "alepha.build.options",
11
+ name: "alepha.cli.build.options",
12
12
  description: "Build configuration options",
13
13
  schema: t.object({
14
14
  /**
@@ -29,7 +29,7 @@ export const DEFAULT_IGNORE = [
29
29
  * ```
30
30
  */
31
31
  export const changelogOptions = $atom({
32
- name: "alepha.changelog",
32
+ name: "alepha.cli.changelog.options",
33
33
  schema: t.object({
34
34
  /**
35
35
  * Scopes to ignore (e.g., "project", "release", "chore").
@@ -1,9 +1,8 @@
1
- import { $inject, $use, t } from "alepha";
1
+ import { $inject, $use, type Alepha, AlephaError, t } from "alepha";
2
2
  import { $command } from "alepha/command";
3
- import { FileSystemProvider } from "alepha/file";
4
3
  import { $logger } from "alepha/logger";
4
+ import { FileSystemProvider } from "alepha/system";
5
5
  import {
6
- boot,
7
6
  buildClient,
8
7
  buildServer,
9
8
  copyAssets,
@@ -14,6 +13,8 @@ import {
14
13
  prerenderPages,
15
14
  } from "alepha/vite";
16
15
  import { buildOptions } from "../atoms/buildOptions.ts";
16
+ import { AppEntryProvider } from "../providers/AppEntryProvider.ts";
17
+ import { ViteBuildProvider } from "../providers/ViteBuildProvider.ts";
17
18
  import { AlephaCliUtils } from "../services/AlephaCliUtils.ts";
18
19
  import { PackageManagerUtils } from "../services/PackageManagerUtils.ts";
19
20
  import { ProjectScaffolder } from "../services/ProjectScaffolder.ts";
@@ -24,15 +25,14 @@ export class BuildCommand {
24
25
  protected readonly utils = $inject(AlephaCliUtils);
25
26
  protected readonly pm = $inject(PackageManagerUtils);
26
27
  protected readonly scaffolder = $inject(ProjectScaffolder);
28
+ protected readonly boot = $inject(AppEntryProvider);
29
+ protected readonly viteBuildProvider = $inject(ViteBuildProvider);
27
30
  protected readonly options = $use(buildOptions);
28
31
 
29
32
  public readonly build = $command({
30
33
  name: "build",
31
34
  mode: "production",
32
35
  description: "Build the project for production",
33
- args: t.optional(
34
- t.text({ title: "path", description: "Filepath to build" }),
35
- ),
36
36
  flags: t.object({
37
37
  stats: t.optional(
38
38
  t.boolean({
@@ -65,9 +65,7 @@ export class BuildCommand {
65
65
  }),
66
66
  ),
67
67
  }),
68
- handler: async ({ flags, args, run, root }) => {
69
- // Tell viteAlephaBuild plugin to skip - CLI handles all tasks
70
- process.env.ALEPHA_BUILD_MODE = "cli";
68
+ handler: async ({ flags, run, root }) => {
71
69
  process.env.NODE_ENV = "production";
72
70
 
73
71
  if (await this.pm.hasExpo(root)) {
@@ -79,43 +77,67 @@ export class BuildCommand {
79
77
  tsconfigJson: true,
80
78
  });
81
79
 
82
- const entry = await boot.getServerEntry(root, args);
80
+ const entry = await this.boot.getAppEntry(root);
83
81
  this.log.trace("Entry file found", { entry });
84
82
 
85
83
  const distDir = "dist";
86
- const clientDir = "public";
84
+ const publicDir = "public";
87
85
 
88
- await this.pm.ensureDependency(root, "vite", {
89
- run,
90
- exec: (cmd, opts) => this.utils.exec(cmd, opts),
91
- });
92
86
  await run.rm("dist", { alias: "clean dist" });
93
87
 
94
88
  const options = this.options;
95
89
  await this.utils.loadEnv(root, [".env", ".env.production"]);
96
90
 
97
91
  const stats = flags.stats ?? options.stats ?? false;
98
- const hasClient = await this.fs.exists(this.fs.join(root, "index.html"));
92
+ let template = "";
93
+ let hasClient = false;
94
+ let alepha: Alepha | undefined;
95
+
96
+ await run({
97
+ name: "analyze app",
98
+ handler: async () => {
99
+ alepha = await this.viteBuildProvider.init({ entry });
100
+ hasClient = this.viteBuildProvider.hasClient();
101
+ if (hasClient) {
102
+ template = this.viteBuildProvider.generateIndexHtml();
103
+ }
104
+ },
105
+ });
106
+
107
+ if (!alepha) {
108
+ throw new AlephaError("Alepha instance not found");
109
+ }
99
110
 
100
111
  // Build client (precompress always enabled)
101
112
  if (hasClient) {
102
- await run({
103
- name: "vite build client",
104
- handler: () =>
105
- buildClient({
106
- silent: true,
107
- dist: `${distDir}/${clientDir}`,
108
- stats,
109
- precompress: true,
110
- }),
111
- });
113
+ // TODO: find a way to avoid writing index.html to disk
114
+ const indexHtmlPath = this.fs.join(root, "index.html");
115
+ await this.fs.writeFile(indexHtmlPath, template);
116
+ try {
117
+ await run({
118
+ name: "vite build client",
119
+ handler: () =>
120
+ buildClient({
121
+ silent: true,
122
+ dist: `${distDir}/${publicDir}`,
123
+ stats,
124
+ precompress: true,
125
+ }),
126
+ });
127
+ } finally {
128
+ await this.fs.rm(indexHtmlPath);
129
+ }
112
130
  }
113
131
 
114
132
  // Build server
115
133
  await run({
116
134
  name: "vite build server",
117
135
  handler: async () => {
118
- const clientIndexPath = `${distDir}/${clientDir}/index.html`;
136
+ if (!alepha) {
137
+ throw new AlephaError("Alepha instance not found");
138
+ }
139
+
140
+ const clientIndexPath = `${distDir}/${publicDir}/index.html`;
119
141
  const clientBuilt = await this.fs.exists(clientIndexPath);
120
142
 
121
143
  const conditions: string[] = [];
@@ -131,19 +153,18 @@ export class BuildCommand {
131
153
  // workerd:
132
154
  // - react-dom
133
155
  // - postgres
134
-
135
- // TODO: investigate if we have more conditions like 'edge' to add here
136
156
  if (options.cloudflare) {
137
157
  conditions.push("workerd");
138
158
  }
139
159
 
140
160
  await buildServer({
141
161
  silent: true,
142
- entry,
162
+ entry: entry.server,
143
163
  distDir,
144
- clientDir: clientBuilt ? clientDir : undefined,
164
+ clientDir: clientBuilt ? publicDir : undefined,
145
165
  stats,
146
166
  conditions,
167
+ alepha,
147
168
  });
148
169
 
149
170
  // Server will handle index.html if both client & server are built
@@ -155,6 +176,7 @@ export class BuildCommand {
155
176
 
156
177
  // Copy assets
157
178
  await copyAssets({
179
+ alepha,
158
180
  root,
159
181
  entry: `${distDir}/index.js`,
160
182
  distDir,
@@ -165,30 +187,20 @@ export class BuildCommand {
165
187
  // Generate sitemap
166
188
  const sitemapHostname = flags.sitemap ?? options.sitemap?.hostname;
167
189
  if (sitemapHostname) {
168
- await run({
169
- name: "add sitemap",
170
- handler: async () => {
171
- await this.fs.writeFile(
172
- `${distDir}/${clientDir}/sitemap.xml`,
173
- await generateSitemap({
174
- entry: `${distDir}/index.js`,
175
- baseUrl: sitemapHostname,
176
- }),
177
- );
178
- },
190
+ await generateSitemap({
191
+ alepha,
192
+ baseUrl: sitemapHostname,
193
+ output: `${distDir}/${publicDir}/sitemap.xml`,
194
+ run,
179
195
  });
180
196
  }
181
197
 
182
198
  // Pre-render static pages (always enabled)
183
- await run({
184
- name: "pre-render pages",
185
- handler: async () => {
186
- await prerenderPages({
187
- dist: `${distDir}/${clientDir}`,
188
- entry: `${distDir}/index.js`,
189
- compress: true,
190
- });
191
- },
199
+ await prerenderPages({
200
+ alepha,
201
+ dist: `${distDir}/${publicDir}`,
202
+ compress: true,
203
+ run,
192
204
  });
193
205
  }
194
206
 
@@ -199,7 +211,7 @@ export class BuildCommand {
199
211
  handler: () =>
200
212
  generateVercel({
201
213
  distDir,
202
- clientDir,
214
+ clientDir: publicDir,
203
215
  config: options.vercel,
204
216
  }),
205
217
  });
@@ -1,12 +1,13 @@
1
1
  import { $inject, AlephaError, t } from "alepha";
2
2
  import { $command } from "alepha/command";
3
- import { FileSystemProvider } from "alepha/file";
4
3
  import { $logger } from "alepha/logger";
5
4
  import type {
6
5
  DatabaseProvider,
7
6
  DrizzleKitProvider,
8
7
  RepositoryProvider,
9
8
  } from "alepha/orm";
9
+ import { FileSystemProvider } from "alepha/system";
10
+ import { AppEntryProvider } from "../providers/AppEntryProvider.ts";
10
11
  import { AlephaCliUtils } from "../services/AlephaCliUtils.ts";
11
12
 
12
13
  const drizzleCommandFlags = t.object({
@@ -28,6 +29,7 @@ export class DbCommand {
28
29
  protected readonly log = $logger();
29
30
  protected readonly fs = $inject(FileSystemProvider);
30
31
  protected readonly utils = $inject(AlephaCliUtils);
32
+ protected readonly entryProvider = $inject(AppEntryProvider);
31
33
 
32
34
  /**
33
35
  * Check if database migrations are up to date.
@@ -46,10 +48,11 @@ export class DbCommand {
46
48
  const rootDir = root;
47
49
  this.log.debug(`Using project root: ${rootDir}`);
48
50
 
49
- const { alepha } = await this.utils.loadAlephaFromServerEntryFile(
50
- rootDir,
51
- args,
52
- );
51
+ const entry = await this.entryProvider.getAppEntry(root);
52
+ const alepha = await this.utils.loadAlephaFromServerEntryFile({
53
+ mode: "development",
54
+ entry,
55
+ });
53
56
 
54
57
  const repositoryProvider =
55
58
  alepha.inject<RepositoryProvider>("RepositoryProvider");
@@ -276,10 +279,11 @@ export class DbCommand {
276
279
 
277
280
  this.log.debug(`Using project root: ${rootDir}`);
278
281
 
279
- const { alepha, entry } = await this.utils.loadAlephaFromServerEntryFile(
280
- rootDir,
281
- options.args,
282
- );
282
+ const entry = await this.entryProvider.getAppEntry(rootDir);
283
+ const alepha = await this.utils.loadAlephaFromServerEntryFile({
284
+ mode: "development",
285
+ entry,
286
+ });
283
287
 
284
288
  const drizzleKitProvider =
285
289
  alepha.inject<DrizzleKitProvider>("DrizzleKitProvider");
@@ -319,7 +323,7 @@ export class DbCommand {
319
323
  providerUrl: provider.url,
320
324
  providerDriver: provider.driver,
321
325
  dialect,
322
- entry,
326
+ entry: this.fs.join(rootDir, entry.server),
323
327
  rootDir,
324
328
  });
325
329
 
@@ -328,7 +332,9 @@ export class DbCommand {
328
332
  `drizzle-kit ${options.command} --config=${drizzleConfigJsPath}${flags}`,
329
333
  {
330
334
  env: {
331
- NODE_OPTIONS: "--import tsx",
335
+ NODE_OPTIONS: [process.env.NODE_OPTIONS, "--import tsx"]
336
+ .filter(Boolean)
337
+ .join(" "),
332
338
  },
333
339
  },
334
340
  );
@@ -1,7 +1,7 @@
1
1
  import { $inject, AlephaError, t } from "alepha";
2
2
  import { $command } from "alepha/command";
3
- import { FileSystemProvider } from "alepha/file";
4
3
  import { $logger } from "alepha/logger";
4
+ import { FileSystemProvider } from "alepha/system";
5
5
  import { AlephaCliUtils } from "../services/AlephaCliUtils.ts";
6
6
  import { PackageManagerUtils } from "../services/PackageManagerUtils.ts";
7
7
 
@@ -1,8 +1,9 @@
1
- import { $inject, Alepha, t } from "alepha";
1
+ import { $inject, Alepha } from "alepha";
2
2
  import { $command } from "alepha/command";
3
- import { FileSystemProvider } from "alepha/file";
4
3
  import { $logger } from "alepha/logger";
5
- import { boot, devServer } from "alepha/vite";
4
+ import { FileSystemProvider } from "alepha/system";
5
+ import { AppEntryProvider } from "../providers/AppEntryProvider.ts";
6
+ import { ViteDevServerProvider } from "../providers/ViteDevServerProvider.ts";
6
7
  import { AlephaCliUtils } from "../services/AlephaCliUtils.ts";
7
8
  import { PackageManagerUtils } from "../services/PackageManagerUtils.ts";
8
9
  import { ProjectScaffolder } from "../services/ProjectScaffolder.ts";
@@ -14,64 +15,27 @@ export class DevCommand {
14
15
  protected readonly pm = $inject(PackageManagerUtils);
15
16
  protected readonly scaffolder = $inject(ProjectScaffolder);
16
17
  protected readonly alepha = $inject(Alepha);
18
+ protected readonly viteDevServer = $inject(ViteDevServerProvider);
19
+ protected readonly boot = $inject(AppEntryProvider);
17
20
 
18
21
  /**
19
22
  * Will run the project in watch mode.
20
- *
21
- * - If an index.html file is found in the project root, it will run Vite in dev mode.
22
- * - Otherwise, it will look for a server entry file and run it with tsx in watch mode.
23
23
  */
24
24
  public readonly dev = $command({
25
25
  name: "dev",
26
26
  description: "Run the project in development mode",
27
- args: t.optional(t.text({ title: "path", description: "Filepath to run" })),
28
- handler: async ({ args, root }) => {
29
- const expo = await this.pm.hasExpo(root);
30
-
27
+ handler: async ({ root }) => {
31
28
  await this.scaffolder.ensureConfig(root, {
32
29
  tsconfigJson: true,
33
30
  });
34
31
 
35
- if (expo) {
36
- await this.utils.exec("expo start");
37
- return;
38
- }
39
-
40
- const entry = await boot.getServerEntry(root, args);
41
- this.log.trace("Entry file found", { entry });
42
-
43
- const isFullstack = await this.isFullstackProject(root);
44
-
45
- if (!isFullstack) {
46
- const exe = (await this.isBunProject(root)) ? "bun" : "tsx";
47
- let cmd = `${exe} --watch`;
48
- if (await this.utils.exists(root, ".env")) {
49
- cmd += " --env-file=./.env";
50
- }
51
- cmd += ` ${entry}`;
52
- await this.utils.exec(cmd, {
53
- global: exe === "bun",
54
- });
55
- return;
56
- }
32
+ const entry = await this.boot.getAppEntry(root);
33
+ this.log.debug("Entry file found", { entry });
57
34
 
58
- // Ensure vite is installed before running
59
- await this.pm.ensureDependency(root, "vite", {
60
- exec: (cmd, opts) => this.utils.exec(cmd, opts),
61
- });
62
-
63
- await devServer();
35
+ // -> here, we assume we use Vite as runner (api or fullstack)
36
+ // but it's planned to support Bun runner in the future as well
37
+ await this.viteDevServer.init({ root, entry });
38
+ await this.viteDevServer.start();
64
39
  },
65
40
  });
66
-
67
- protected async isBunProject(root: string): Promise<boolean> {
68
- if (this.alepha.isBun()) {
69
- return true;
70
- }
71
- return this.fs.exists(this.fs.join(root, "bun.lock"));
72
- }
73
-
74
- protected async isFullstackProject(root: string): Promise<boolean> {
75
- return this.fs.exists(this.fs.join(root, "index.html"));
76
- }
77
41
  }
@@ -1,7 +1,7 @@
1
1
  import { $inject, t } from "alepha";
2
2
  import { $command } from "alepha/command";
3
- import { FileSystemProvider } from "alepha/file";
4
3
  import { $logger } from "alepha/logger";
4
+ import { FileSystemProvider } from "alepha/system";
5
5
  import { AlephaCliUtils } from "../../services/AlephaCliUtils.ts";
6
6
 
7
7
  export class GenEnvCommand {
@@ -21,7 +21,10 @@ export class GenEnvCommand {
21
21
  ),
22
22
  }),
23
23
  handler: async ({ root, flags }) => {
24
- const { alepha } = await this.utils.loadAlephaFromServerEntryFile(root);
24
+ const alepha = await this.utils.loadAlephaFromServerEntryFile({
25
+ root,
26
+ mode: "development",
27
+ });
25
28
 
26
29
  try {
27
30
  const { env } = alepha.dump();
@@ -37,7 +40,7 @@ export class GenEnvCommand {
37
40
  if (value.enum) {
38
41
  dotEnvFile += `# Possible values: ${value.enum.join(", ")}\n`;
39
42
  }
40
- dotEnvFile += `${key}=${value.default || ""}\n\n`;
43
+ dotEnvFile += `#${key}=${value.default || ""}\n\n`;
41
44
  }
42
45
 
43
46
  if (flags.out) {
@@ -1,8 +1,8 @@
1
1
  import { $inject, t } from "alepha";
2
2
  import { $command } from "alepha/command";
3
- import { FileSystemProvider } from "alepha/file";
4
3
  import { $logger } from "alepha/logger";
5
4
  import { ServerSwaggerProvider } from "alepha/server/swagger";
5
+ import { FileSystemProvider } from "alepha/system";
6
6
  import { AlephaCliUtils } from "../../services/AlephaCliUtils.ts";
7
7
 
8
8
  export class OpenApiCommand {
@@ -22,7 +22,10 @@ export class OpenApiCommand {
22
22
  ),
23
23
  }),
24
24
  handler: async ({ root, flags }) => {
25
- const { alepha } = await this.utils.loadAlephaFromServerEntryFile(root);
25
+ const alepha = await this.utils.loadAlephaFromServerEntryFile({
26
+ root,
27
+ mode: "development",
28
+ });
26
29
 
27
30
  try {
28
31
  const openapiProvider = alepha.inject(