alepha 0.14.2 → 0.14.3

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 (361) hide show
  1. package/dist/api/audits/index.browser.js +5 -5
  2. package/dist/api/audits/index.browser.js.map +1 -1
  3. package/dist/api/audits/index.d.ts +784 -784
  4. package/dist/api/audits/index.d.ts.map +1 -1
  5. package/dist/api/audits/index.js +13 -13
  6. package/dist/api/audits/index.js.map +1 -1
  7. package/dist/api/files/index.browser.js +5 -5
  8. package/dist/api/files/index.browser.js.map +1 -1
  9. package/dist/api/files/index.d.ts +57 -57
  10. package/dist/api/files/index.d.ts.map +1 -1
  11. package/dist/api/files/index.js +71 -71
  12. package/dist/api/files/index.js.map +1 -1
  13. package/dist/api/jobs/index.browser.js +5 -5
  14. package/dist/api/jobs/index.browser.js.map +1 -1
  15. package/dist/api/jobs/index.d.ts +165 -165
  16. package/dist/api/jobs/index.d.ts.map +1 -1
  17. package/dist/api/jobs/index.js +10 -10
  18. package/dist/api/jobs/index.js.map +1 -1
  19. package/dist/api/notifications/index.browser.js +10 -10
  20. package/dist/api/notifications/index.browser.js.map +1 -1
  21. package/dist/api/notifications/index.d.ts +583 -171
  22. package/dist/api/notifications/index.d.ts.map +1 -1
  23. package/dist/api/notifications/index.js +12 -12
  24. package/dist/api/notifications/index.js.map +1 -1
  25. package/dist/api/parameters/index.browser.js +163 -10
  26. package/dist/api/parameters/index.browser.js.map +1 -1
  27. package/dist/api/parameters/index.d.ts +281 -276
  28. package/dist/api/parameters/index.d.ts.map +1 -1
  29. package/dist/api/parameters/index.js +196 -91
  30. package/dist/api/parameters/index.js.map +1 -1
  31. package/dist/api/users/index.browser.js +19 -19
  32. package/dist/api/users/index.browser.js.map +1 -1
  33. package/dist/api/users/index.d.ts +1137 -1123
  34. package/dist/api/users/index.d.ts.map +1 -1
  35. package/dist/api/users/index.js +827 -596
  36. package/dist/api/users/index.js.map +1 -1
  37. package/dist/api/verifications/index.browser.js +6 -6
  38. package/dist/api/verifications/index.browser.js.map +1 -1
  39. package/dist/api/verifications/index.d.ts +13 -13
  40. package/dist/api/verifications/index.d.ts.map +1 -1
  41. package/dist/api/verifications/index.js +6 -6
  42. package/dist/api/verifications/index.js.map +1 -1
  43. package/dist/bin/index.d.ts +1 -2
  44. package/dist/bin/index.js +0 -1
  45. package/dist/bin/index.js.map +1 -1
  46. package/dist/cli/index.d.ts +137 -112
  47. package/dist/cli/index.d.ts.map +1 -1
  48. package/dist/cli/index.js +371 -259
  49. package/dist/cli/index.js.map +1 -1
  50. package/dist/command/index.d.ts +45 -5
  51. package/dist/command/index.d.ts.map +1 -1
  52. package/dist/command/index.js +97 -17
  53. package/dist/command/index.js.map +1 -1
  54. package/dist/core/index.browser.js +14 -18
  55. package/dist/core/index.browser.js.map +1 -1
  56. package/dist/core/index.d.ts +29 -0
  57. package/dist/core/index.d.ts.map +1 -1
  58. package/dist/core/index.js +14 -18
  59. package/dist/core/index.js.map +1 -1
  60. package/dist/core/index.native.js +14 -18
  61. package/dist/core/index.native.js.map +1 -1
  62. package/dist/fake/index.js +195 -168
  63. package/dist/fake/index.js.map +1 -1
  64. package/dist/file/index.d.ts +8 -0
  65. package/dist/file/index.d.ts.map +1 -1
  66. package/dist/file/index.js +3 -0
  67. package/dist/file/index.js.map +1 -1
  68. package/dist/mcp/index.d.ts.map +1 -1
  69. package/dist/orm/index.d.ts +32 -32
  70. package/dist/orm/index.d.ts.map +1 -1
  71. package/dist/orm/index.js +12 -12
  72. package/dist/orm/index.js.map +1 -1
  73. package/dist/security/index.d.ts +1 -1
  74. package/dist/security/index.d.ts.map +1 -1
  75. package/dist/security/index.js +1 -1
  76. package/dist/security/index.js.map +1 -1
  77. package/dist/server/auth/index.d.ts +171 -155
  78. package/dist/server/auth/index.d.ts.map +1 -1
  79. package/dist/server/auth/index.js +0 -1
  80. package/dist/server/auth/index.js.map +1 -1
  81. package/dist/server/compress/index.d.ts.map +1 -1
  82. package/dist/server/compress/index.js +2 -0
  83. package/dist/server/compress/index.js.map +1 -1
  84. package/dist/server/core/index.d.ts.map +1 -1
  85. package/dist/server/core/index.js +1 -1
  86. package/dist/server/core/index.js.map +1 -1
  87. package/dist/server/links/index.browser.js +22 -6
  88. package/dist/server/links/index.browser.js.map +1 -1
  89. package/dist/server/links/index.d.ts +46 -44
  90. package/dist/server/links/index.d.ts.map +1 -1
  91. package/dist/server/links/index.js +24 -41
  92. package/dist/server/links/index.js.map +1 -1
  93. package/dist/server/security/index.d.ts +9 -9
  94. package/dist/server/swagger/index.d.ts +2 -1
  95. package/dist/server/swagger/index.d.ts.map +1 -1
  96. package/dist/server/swagger/index.js +8 -3
  97. package/dist/server/swagger/index.js.map +1 -1
  98. package/dist/vite/index.d.ts.map +1 -1
  99. package/dist/vite/index.js +12 -4
  100. package/dist/vite/index.js.map +1 -1
  101. package/dist/websocket/index.d.ts +7 -7
  102. package/package.json +7 -7
  103. package/src/api/audits/controllers/{AuditController.ts → AdminAuditController.ts} +5 -6
  104. package/src/api/audits/entities/audits.ts +5 -5
  105. package/src/api/audits/index.browser.ts +1 -1
  106. package/src/api/audits/index.ts +3 -3
  107. package/src/api/audits/primitives/$audit.spec.ts +276 -0
  108. package/src/api/audits/services/AuditService.spec.ts +495 -0
  109. package/src/api/files/__tests__/$bucket.spec.ts +91 -0
  110. package/src/api/files/controllers/AdminFileStatsController.spec.ts +166 -0
  111. package/src/api/files/controllers/{StorageStatsController.ts → AdminFileStatsController.ts} +2 -2
  112. package/src/api/files/controllers/FileController.spec.ts +558 -0
  113. package/src/api/files/controllers/FileController.ts +4 -5
  114. package/src/api/files/entities/files.ts +5 -5
  115. package/src/api/files/index.browser.ts +1 -1
  116. package/src/api/files/index.ts +4 -4
  117. package/src/api/files/jobs/FileJobs.spec.ts +52 -0
  118. package/src/api/files/services/FileService.spec.ts +109 -0
  119. package/src/api/jobs/__tests__/JobController.spec.ts +343 -0
  120. package/src/api/jobs/controllers/{JobController.ts → AdminJobController.ts} +2 -2
  121. package/src/api/jobs/entities/jobExecutions.ts +5 -5
  122. package/src/api/jobs/index.ts +3 -3
  123. package/src/api/jobs/primitives/$job.spec.ts +476 -0
  124. package/src/api/notifications/controllers/{NotificationController.ts → AdminNotificationController.ts} +4 -5
  125. package/src/api/notifications/entities/notifications.ts +5 -5
  126. package/src/api/notifications/index.browser.ts +1 -1
  127. package/src/api/notifications/index.ts +4 -4
  128. package/src/api/parameters/controllers/{ConfigController.ts → AdminConfigController.ts} +46 -107
  129. package/src/api/parameters/entities/parameters.ts +7 -17
  130. package/src/api/parameters/index.ts +3 -3
  131. package/src/api/parameters/primitives/$config.spec.ts +356 -0
  132. package/src/api/parameters/schemas/activateConfigBodySchema.ts +12 -0
  133. package/src/api/parameters/schemas/checkScheduledResponseSchema.ts +8 -0
  134. package/src/api/parameters/schemas/configCurrentResponseSchema.ts +13 -0
  135. package/src/api/parameters/schemas/configHistoryResponseSchema.ts +9 -0
  136. package/src/api/parameters/schemas/configNameParamSchema.ts +10 -0
  137. package/src/api/parameters/schemas/configNamesResponseSchema.ts +8 -0
  138. package/src/api/parameters/schemas/configTreeNodeSchema.ts +13 -0
  139. package/src/api/parameters/schemas/configVersionParamSchema.ts +9 -0
  140. package/src/api/parameters/schemas/configVersionResponseSchema.ts +9 -0
  141. package/src/api/parameters/schemas/configsByStatusResponseSchema.ts +9 -0
  142. package/src/api/parameters/schemas/createConfigVersionBodySchema.ts +24 -0
  143. package/src/api/parameters/schemas/index.ts +15 -0
  144. package/src/api/parameters/schemas/parameterResponseSchema.ts +26 -0
  145. package/src/api/parameters/schemas/parameterStatusSchema.ts +13 -0
  146. package/src/api/parameters/schemas/rollbackConfigBodySchema.ts +15 -0
  147. package/src/api/parameters/schemas/statusParamSchema.ts +9 -0
  148. package/src/api/users/__tests__/EmailVerification.spec.ts +369 -0
  149. package/src/api/users/__tests__/PasswordReset.spec.ts +550 -0
  150. package/src/api/users/controllers/AdminIdentityController.spec.ts +365 -0
  151. package/src/api/users/controllers/{IdentityController.ts → AdminIdentityController.ts} +3 -4
  152. package/src/api/users/controllers/AdminSessionController.spec.ts +274 -0
  153. package/src/api/users/controllers/{SessionController.ts → AdminSessionController.ts} +3 -4
  154. package/src/api/users/controllers/AdminUserController.spec.ts +372 -0
  155. package/src/api/users/controllers/AdminUserController.ts +116 -0
  156. package/src/api/users/controllers/UserController.ts +4 -107
  157. package/src/api/users/controllers/UserRealmController.ts +3 -0
  158. package/src/api/users/entities/identities.ts +6 -6
  159. package/src/api/users/entities/sessions.ts +6 -6
  160. package/src/api/users/entities/users.ts +9 -9
  161. package/src/api/users/index.ts +9 -6
  162. package/src/api/users/primitives/$userRealm.ts +13 -8
  163. package/src/api/users/services/CredentialService.spec.ts +509 -0
  164. package/src/api/users/services/CredentialService.ts +46 -0
  165. package/src/api/users/services/IdentityService.ts +15 -0
  166. package/src/api/users/services/RegistrationService.spec.ts +630 -0
  167. package/src/api/users/services/RegistrationService.ts +18 -0
  168. package/src/api/users/services/SessionService.spec.ts +301 -0
  169. package/src/api/users/services/SessionService.ts +110 -1
  170. package/src/api/users/services/UserService.ts +67 -2
  171. package/src/api/verifications/__tests__/CodeVerification.spec.ts +318 -0
  172. package/src/api/verifications/__tests__/LinkVerification.spec.ts +279 -0
  173. package/src/api/verifications/entities/verifications.ts +6 -6
  174. package/src/api/verifications/jobs/VerificationJobs.spec.ts +50 -0
  175. package/src/batch/__tests__/startup-buffering.spec.ts +458 -0
  176. package/src/batch/primitives/$batch.spec.ts +766 -0
  177. package/src/batch/providers/BatchProvider.spec.ts +786 -0
  178. package/src/bin/index.ts +0 -1
  179. package/src/bucket/__tests__/shared.ts +194 -0
  180. package/src/bucket/primitives/$bucket.spec.ts +104 -0
  181. package/src/bucket/providers/FileStorageProvider.spec.ts +13 -0
  182. package/src/bucket/providers/LocalFileStorageProvider.spec.ts +77 -0
  183. package/src/bucket/providers/MemoryFileStorageProvider.spec.ts +82 -0
  184. package/src/cache/core/__tests__/shared.ts +377 -0
  185. package/src/cache/core/primitives/$cache.spec.ts +111 -0
  186. package/src/cache/redis/__tests__/cache-redis.spec.ts +70 -0
  187. package/src/cli/apps/AlephaCli.ts +25 -4
  188. package/src/cli/commands/dev.ts +19 -7
  189. package/src/cli/commands/gen/changelog.spec.ts +315 -0
  190. package/src/cli/commands/{changelog.ts → gen/changelog.ts} +9 -9
  191. package/src/cli/commands/gen/openapi.ts +71 -0
  192. package/src/cli/commands/gen.ts +18 -0
  193. package/src/cli/commands/init.ts +2 -0
  194. package/src/cli/commands/root.ts +12 -3
  195. package/src/cli/commands/typecheck.ts +5 -0
  196. package/src/cli/index.ts +2 -1
  197. package/src/cli/services/AlephaCliUtils.ts +71 -32
  198. package/src/cli/services/GitMessageParser.ts +1 -1
  199. package/src/command/helpers/Asker.spec.ts +127 -0
  200. package/src/command/helpers/Runner.spec.ts +126 -0
  201. package/src/command/primitives/$command.spec.ts +1588 -0
  202. package/src/command/providers/CliProvider.ts +74 -24
  203. package/src/core/Alepha.ts +45 -0
  204. package/src/core/__tests__/Alepha-emit.spec.ts +22 -0
  205. package/src/core/__tests__/Alepha-graph.spec.ts +93 -0
  206. package/src/core/__tests__/Alepha-has.spec.ts +41 -0
  207. package/src/core/__tests__/Alepha-inject.spec.ts +93 -0
  208. package/src/core/__tests__/Alepha-register.spec.ts +81 -0
  209. package/src/core/__tests__/Alepha-start.spec.ts +176 -0
  210. package/src/core/__tests__/Alepha-with.spec.ts +14 -0
  211. package/src/core/__tests__/TypeBox-usecases.spec.ts +35 -0
  212. package/src/core/__tests__/TypeBoxLocale.spec.ts +15 -0
  213. package/src/core/__tests__/descriptor.spec.ts +34 -0
  214. package/src/core/__tests__/fixtures/A.ts +5 -0
  215. package/src/core/__tests__/pagination.spec.ts +77 -0
  216. package/src/core/helpers/jsonSchemaToTypeBox.ts +2 -2
  217. package/src/core/primitives/$atom.spec.ts +43 -0
  218. package/src/core/primitives/$hook.spec.ts +130 -0
  219. package/src/core/primitives/$inject.spec.ts +175 -0
  220. package/src/core/primitives/$module.spec.ts +115 -0
  221. package/src/core/providers/CodecManager.spec.ts +740 -0
  222. package/src/core/providers/EventManager.spec.ts +762 -0
  223. package/src/core/providers/EventManager.ts +4 -0
  224. package/src/core/providers/StateManager.spec.ts +365 -0
  225. package/src/core/providers/TypeProvider.spec.ts +1607 -0
  226. package/src/core/providers/TypeProvider.ts +20 -26
  227. package/src/datetime/primitives/$interval.spec.ts +103 -0
  228. package/src/datetime/providers/DateTimeProvider.spec.ts +86 -0
  229. package/src/email/primitives/$email.spec.ts +175 -0
  230. package/src/email/providers/LocalEmailProvider.spec.ts +341 -0
  231. package/src/fake/__tests__/keyName.example.ts +40 -0
  232. package/src/fake/__tests__/keyName.spec.ts +152 -0
  233. package/src/fake/__tests__/module.example.ts +32 -0
  234. package/src/fake/providers/FakeProvider.spec.ts +438 -0
  235. package/src/file/providers/FileSystemProvider.ts +8 -0
  236. package/src/file/providers/NodeFileSystemProvider.spec.ts +418 -0
  237. package/src/file/providers/NodeFileSystemProvider.ts +5 -0
  238. package/src/file/services/FileDetector.spec.ts +591 -0
  239. package/src/lock/core/__tests__/shared.ts +190 -0
  240. package/src/lock/core/providers/MemoryLockProvider.spec.ts +25 -0
  241. package/src/lock/redis/providers/RedisLockProvider.spec.ts +25 -0
  242. package/src/logger/__tests__/SimpleFormatterProvider.spec.ts +109 -0
  243. package/src/logger/primitives/$logger.spec.ts +108 -0
  244. package/src/logger/services/Logger.spec.ts +295 -0
  245. package/src/mcp/__tests__/errors.spec.ts +175 -0
  246. package/src/mcp/__tests__/integration.spec.ts +450 -0
  247. package/src/mcp/helpers/jsonrpc.spec.ts +380 -0
  248. package/src/mcp/primitives/$prompt.spec.ts +468 -0
  249. package/src/mcp/primitives/$resource.spec.ts +390 -0
  250. package/src/mcp/primitives/$tool.spec.ts +406 -0
  251. package/src/mcp/providers/McpServerProvider.spec.ts +797 -0
  252. package/src/orm/__tests__/$repository-crud.spec.ts +276 -0
  253. package/src/orm/__tests__/$repository-hooks.spec.ts +325 -0
  254. package/src/orm/__tests__/$repository-orderBy.spec.ts +128 -0
  255. package/src/orm/__tests__/$repository-pagination-sort.spec.ts +149 -0
  256. package/src/orm/__tests__/$repository-save.spec.ts +37 -0
  257. package/src/orm/__tests__/ModelBuilder-integration.spec.ts +490 -0
  258. package/src/orm/__tests__/ModelBuilder-types.spec.ts +186 -0
  259. package/src/orm/__tests__/PostgresProvider.spec.ts +46 -0
  260. package/src/orm/__tests__/delete-returning.spec.ts +256 -0
  261. package/src/orm/__tests__/deletedAt.spec.ts +80 -0
  262. package/src/orm/__tests__/enums.spec.ts +315 -0
  263. package/src/orm/__tests__/execute.spec.ts +72 -0
  264. package/src/orm/__tests__/fixtures/bigEntitySchema.ts +65 -0
  265. package/src/orm/__tests__/fixtures/userEntitySchema.ts +27 -0
  266. package/src/orm/__tests__/joins.spec.ts +1114 -0
  267. package/src/orm/__tests__/page.spec.ts +287 -0
  268. package/src/orm/__tests__/primaryKey.spec.ts +87 -0
  269. package/src/orm/__tests__/query-date-encoding.spec.ts +402 -0
  270. package/src/orm/__tests__/ref-auto-onDelete.spec.ts +156 -0
  271. package/src/orm/__tests__/references.spec.ts +102 -0
  272. package/src/orm/__tests__/security.spec.ts +710 -0
  273. package/src/orm/__tests__/sqlite.spec.ts +111 -0
  274. package/src/orm/__tests__/string-operators.spec.ts +429 -0
  275. package/src/orm/__tests__/timestamps.spec.ts +388 -0
  276. package/src/orm/__tests__/validation.spec.ts +183 -0
  277. package/src/orm/__tests__/version.spec.ts +64 -0
  278. package/src/orm/helpers/parseQueryString.spec.ts +196 -0
  279. package/src/orm/primitives/$repository.spec.ts +137 -0
  280. package/src/orm/primitives/$sequence.spec.ts +29 -0
  281. package/src/orm/primitives/$transaction.spec.ts +82 -0
  282. package/src/orm/providers/drivers/BunPostgresProvider.ts +3 -3
  283. package/src/orm/providers/drivers/BunSqliteProvider.ts +1 -1
  284. package/src/orm/providers/drivers/CloudflareD1Provider.ts +1 -1
  285. package/src/orm/providers/drivers/DatabaseProvider.ts +1 -1
  286. package/src/orm/providers/drivers/NodePostgresProvider.ts +3 -3
  287. package/src/orm/providers/drivers/NodeSqliteProvider.ts +1 -1
  288. package/src/orm/providers/drivers/PglitePostgresProvider.ts +2 -2
  289. package/src/orm/services/ModelBuilder.spec.ts +575 -0
  290. package/src/orm/services/Repository.spec.ts +137 -0
  291. package/src/queue/core/__tests__/shared.ts +143 -0
  292. package/src/queue/core/providers/MemoryQueueProvider.spec.ts +23 -0
  293. package/src/queue/core/providers/WorkerProvider.spec.ts +378 -0
  294. package/src/queue/redis/providers/RedisQueueProvider.spec.ts +23 -0
  295. package/src/redis/__tests__/redis.spec.ts +58 -0
  296. package/src/retry/primitives/$retry.spec.ts +234 -0
  297. package/src/retry/providers/RetryProvider.spec.ts +438 -0
  298. package/src/router/__tests__/match.spec.ts +252 -0
  299. package/src/router/providers/RouterProvider.spec.ts +197 -0
  300. package/src/scheduler/__tests__/$scheduler-cron.spec.ts +25 -0
  301. package/src/scheduler/__tests__/$scheduler-interval.spec.ts +25 -0
  302. package/src/scheduler/__tests__/shared.ts +77 -0
  303. package/src/security/__tests__/bug-1-wildcard-after-start.spec.ts +229 -0
  304. package/src/security/__tests__/bug-2-password-validation.spec.ts +245 -0
  305. package/src/security/__tests__/bug-3-regex-vulnerability.spec.ts +407 -0
  306. package/src/security/__tests__/bug-4-oauth2-validation.spec.ts +439 -0
  307. package/src/security/__tests__/multi-layer-permissions.spec.ts +522 -0
  308. package/src/security/primitives/$permission.spec.ts +30 -0
  309. package/src/security/primitives/$permission.ts +2 -2
  310. package/src/security/primitives/$realm.spec.ts +101 -0
  311. package/src/security/primitives/$role.spec.ts +52 -0
  312. package/src/security/primitives/$serviceAccount.spec.ts +61 -0
  313. package/src/security/providers/SecurityProvider.spec.ts +350 -0
  314. package/src/server/auth/providers/ServerAuthProvider.ts +0 -2
  315. package/src/server/cache/providers/ServerCacheProvider.spec.ts +942 -0
  316. package/src/server/compress/providers/ServerCompressProvider.spec.ts +31 -0
  317. package/src/server/compress/providers/ServerCompressProvider.ts +2 -0
  318. package/src/server/cookies/providers/ServerCookiesProvider.spec.ts +253 -0
  319. package/src/server/core/__tests__/ServerRouterProvider-getRoutes.spec.ts +334 -0
  320. package/src/server/core/__tests__/ServerRouterProvider-requestId.spec.ts +129 -0
  321. package/src/server/core/primitives/$action.spec.ts +191 -0
  322. package/src/server/core/primitives/$route.spec.ts +65 -0
  323. package/src/server/core/providers/ServerBodyParserProvider.spec.ts +93 -0
  324. package/src/server/core/providers/ServerLoggerProvider.spec.ts +100 -0
  325. package/src/server/core/providers/ServerProvider.ts +3 -1
  326. package/src/server/core/services/HttpClient.spec.ts +123 -0
  327. package/src/server/core/services/UserAgentParser.spec.ts +111 -0
  328. package/src/server/cors/providers/ServerCorsProvider.spec.ts +481 -0
  329. package/src/server/health/providers/ServerHealthProvider.spec.ts +22 -0
  330. package/src/server/helmet/providers/ServerHelmetProvider.spec.ts +105 -0
  331. package/src/server/links/__tests__/$action.spec.ts +238 -0
  332. package/src/server/links/__tests__/fixtures/CrudApp.ts +122 -0
  333. package/src/server/links/__tests__/requestId.spec.ts +120 -0
  334. package/src/server/links/primitives/$remote.spec.ts +228 -0
  335. package/src/server/links/providers/LinkProvider.spec.ts +54 -0
  336. package/src/server/links/providers/LinkProvider.ts +49 -3
  337. package/src/server/links/providers/ServerLinksProvider.ts +1 -53
  338. package/src/server/links/schemas/apiLinksResponseSchema.ts +7 -0
  339. package/src/server/metrics/providers/ServerMetricsProvider.spec.ts +25 -0
  340. package/src/server/multipart/providers/ServerMultipartProvider.spec.ts +528 -0
  341. package/src/server/proxy/primitives/$proxy.spec.ts +87 -0
  342. package/src/server/rate-limit/__tests__/ActionRateLimit.spec.ts +211 -0
  343. package/src/server/rate-limit/providers/ServerRateLimitProvider.spec.ts +344 -0
  344. package/src/server/security/__tests__/BasicAuth.spec.ts +684 -0
  345. package/src/server/security/__tests__/ServerSecurityProvider-realm.spec.ts +388 -0
  346. package/src/server/security/providers/ServerSecurityProvider.spec.ts +123 -0
  347. package/src/server/static/primitives/$serve.spec.ts +193 -0
  348. package/src/server/swagger/__tests__/ui.spec.ts +52 -0
  349. package/src/server/swagger/primitives/$swagger.spec.ts +193 -0
  350. package/src/server/swagger/providers/ServerSwaggerProvider.ts +18 -8
  351. package/src/sms/primitives/$sms.spec.ts +165 -0
  352. package/src/sms/providers/LocalSmsProvider.spec.ts +224 -0
  353. package/src/sms/providers/MemorySmsProvider.spec.ts +193 -0
  354. package/src/thread/primitives/$thread.spec.ts +186 -0
  355. package/src/topic/core/__tests__/shared.ts +144 -0
  356. package/src/topic/core/providers/MemoryTopicProvider.spec.ts +23 -0
  357. package/src/topic/redis/providers/RedisTopicProvider.spec.ts +23 -0
  358. package/src/vite/plugins/viteAlephaDev.ts +16 -4
  359. package/src/vite/tasks/runAlepha.ts +7 -1
  360. package/src/websocket/__tests__/$websocket-new.spec.ts +195 -0
  361. package/src/websocket/primitives/$channel.spec.ts +30 -0
@@ -0,0 +1,315 @@
1
+ import { Alepha } from "alepha";
2
+ import { cliOptions } from "alepha/command";
3
+ import {
4
+ LogDestinationProvider,
5
+ MemoryDestinationProvider,
6
+ } from "alepha/logger";
7
+ import { describe, expect, test } from "vitest";
8
+ import {
9
+ ChangelogCommand,
10
+ changelogOptions,
11
+ GitMessageParser,
12
+ GitProvider,
13
+ } from "./changelog.ts";
14
+
15
+ // =============================================================================
16
+ // MOCK GIT PROVIDER
17
+ // =============================================================================
18
+
19
+ let currentMockResponses: Map<string, string> | null = null;
20
+
21
+ class MockGitProvider extends GitProvider {
22
+ override async exec(cmd: string, _cwd: string): Promise<string> {
23
+ if (!currentMockResponses) {
24
+ throw new Error("No git mocks configured");
25
+ }
26
+ const response = currentMockResponses.get(cmd);
27
+ if (response === undefined) {
28
+ throw new Error(`Unmocked git command: ${cmd}`);
29
+ }
30
+ return response;
31
+ }
32
+ }
33
+
34
+ function setMockGitResponses(
35
+ mocks: Array<{ cmd: string; response: string }>,
36
+ ): void {
37
+ currentMockResponses = new Map<string, string>();
38
+ for (const { cmd, response } of mocks) {
39
+ currentMockResponses.set(cmd, response);
40
+ }
41
+ }
42
+
43
+ // =============================================================================
44
+ // TESTS
45
+ // =============================================================================
46
+
47
+ describe("changelog", () => {
48
+ describe("GitMessageParser.parseCommit", () => {
49
+ const defaultConfig = { ignore: ["chore", "ci", "build", "test"] };
50
+
51
+ const getParser = () => {
52
+ const alepha = Alepha.create();
53
+ return alepha.inject(GitMessageParser);
54
+ };
55
+
56
+ test("should parse conventional commit with scope", () => {
57
+ const parser = getParser();
58
+ const result = parser.parseCommit(
59
+ "abc12345 feat(ui): add button component",
60
+ defaultConfig,
61
+ );
62
+
63
+ expect(result).toEqual({
64
+ hash: "abc12345",
65
+ type: "feat",
66
+ scope: "ui",
67
+ description: "add button component",
68
+ breaking: false,
69
+ });
70
+ });
71
+
72
+ test("should ignore conventional commit without scope", () => {
73
+ const parser = getParser();
74
+ const result = parser.parseCommit(
75
+ "def45678 fix: resolve memory leak",
76
+ defaultConfig,
77
+ );
78
+ expect(result).toBeNull();
79
+ });
80
+
81
+ test("should detect breaking change with ! marker", () => {
82
+ const parser = getParser();
83
+ const result = parser.parseCommit(
84
+ "aaa78901 feat(api)!: remove deprecated endpoint",
85
+ defaultConfig,
86
+ );
87
+
88
+ expect(result).toEqual({
89
+ hash: "aaa78901",
90
+ type: "feat",
91
+ scope: "api",
92
+ description: "remove deprecated endpoint",
93
+ breaking: true,
94
+ });
95
+ });
96
+
97
+ test("should detect breaking change in description", () => {
98
+ const parser = getParser();
99
+ const result = parser.parseCommit(
100
+ "bbb01234 feat(auth): breaking change to token format",
101
+ defaultConfig,
102
+ );
103
+
104
+ expect(result).toEqual({
105
+ hash: "bbb01234",
106
+ type: "feat",
107
+ scope: "auth",
108
+ description: "breaking change to token format",
109
+ breaking: true,
110
+ });
111
+ });
112
+
113
+ test("should ignore commits with ignored scope", () => {
114
+ const parser = getParser();
115
+ const result = parser.parseCommit(
116
+ "ccc34567 feat(chore): update deps",
117
+ defaultConfig,
118
+ );
119
+ expect(result).toBeNull();
120
+ });
121
+
122
+ test("should ignore commits with nested ignored scope", () => {
123
+ const parser = getParser();
124
+ const result = parser.parseCommit(
125
+ "ddd67890 feat(test/unit): add tests",
126
+ defaultConfig,
127
+ );
128
+ expect(result).toBeNull();
129
+ });
130
+
131
+ test("should ignore module-style commits (no type)", () => {
132
+ const parser = getParser();
133
+ const result = parser.parseCommit("eee90123 cli: add new command", {});
134
+ expect(result).toBeNull();
135
+ });
136
+
137
+ test("should return null for non-matching commits", () => {
138
+ const parser = getParser();
139
+ const result = parser.parseCommit(
140
+ "fff78901 random commit message",
141
+ defaultConfig,
142
+ );
143
+ expect(result).toBeNull();
144
+ });
145
+
146
+ test("should truncate hash to 8 characters", () => {
147
+ const parser = getParser();
148
+ const result = parser.parseCommit(
149
+ "abcdef1234567890 feat(core): something",
150
+ defaultConfig,
151
+ );
152
+ expect(result?.hash).toBe("abcdef12");
153
+ });
154
+
155
+ test("should parse all supported types", () => {
156
+ const parser = getParser();
157
+ const types = ["feat", "fix", "docs", "refactor", "perf", "revert"];
158
+
159
+ for (const type of types) {
160
+ const result = parser.parseCommit(
161
+ `abc12345 ${type}(core): test`,
162
+ defaultConfig,
163
+ );
164
+ expect(result?.type).toBe(type);
165
+ }
166
+ });
167
+
168
+ test("should handle nested scopes", () => {
169
+ const parser = getParser();
170
+ const result = parser.parseCommit(
171
+ "abc12345 feat(api/users): add endpoint",
172
+ defaultConfig,
173
+ );
174
+
175
+ expect(result).toEqual({
176
+ hash: "abc12345",
177
+ type: "feat",
178
+ scope: "api/users",
179
+ description: "add endpoint",
180
+ breaking: false,
181
+ });
182
+ });
183
+ });
184
+
185
+ describe("changelogOptions atom", () => {
186
+ test("should have default ignore list", async () => {
187
+ const alepha = Alepha.create();
188
+ await alepha.start();
189
+
190
+ const config = alepha.store.get(changelogOptions);
191
+ expect(config.ignore).toContain("chore");
192
+ expect(config.ignore).toContain("ci");
193
+ expect(config.ignore).toContain("build");
194
+ expect(config.ignore).toContain("test");
195
+ });
196
+
197
+ test("should allow custom configuration", async () => {
198
+ const alepha = Alepha.create();
199
+ alepha.set(changelogOptions, {
200
+ ignore: ["custom", "internal"],
201
+ });
202
+ await alepha.start();
203
+
204
+ const config = alepha.store.get(changelogOptions);
205
+ expect(config.ignore).toEqual(["custom", "internal"]);
206
+ });
207
+ });
208
+
209
+ describe("changelog command", () => {
210
+ const setupCommand = async (
211
+ gitMocks: { cmd: string; response: string }[],
212
+ argv: string[] = ["changelog"],
213
+ options?: { ignore?: string[] },
214
+ ) => {
215
+ setMockGitResponses(gitMocks);
216
+
217
+ const alepha = Alepha.create()
218
+ .with({
219
+ provide: LogDestinationProvider,
220
+ use: MemoryDestinationProvider,
221
+ })
222
+ .with({ provide: GitProvider, use: MockGitProvider })
223
+ .with(ChangelogCommand);
224
+
225
+ alepha.store.mut(cliOptions, (old) => ({
226
+ ...old,
227
+ argv,
228
+ }));
229
+
230
+ if (options) {
231
+ alepha.set(changelogOptions, options);
232
+ }
233
+
234
+ await alepha.start();
235
+
236
+ return {
237
+ alepha,
238
+ logger: alepha.inject(MemoryDestinationProvider),
239
+ };
240
+ };
241
+
242
+ test("should show changes since latest tag", async () => {
243
+ await setupCommand([
244
+ { cmd: "tag --sort=-version:refname", response: "1.0.0\n0.9.0\n" },
245
+ {
246
+ cmd: "log 1.0.0..HEAD --oneline",
247
+ response: [
248
+ "abc12345 feat(ui): add dashboard",
249
+ "def56789 fix(core): resolve crash",
250
+ ].join("\n"),
251
+ },
252
+ ]);
253
+ // Outputs to stdout - test verifies no error
254
+ });
255
+
256
+ test("should show changes from specified version", async () => {
257
+ await setupCommand(
258
+ [
259
+ {
260
+ cmd: "log 0.5.0..HEAD --oneline",
261
+ response: "abc12345 feat(api): new feature",
262
+ },
263
+ ],
264
+ ["changelog", "--from=0.5.0"],
265
+ );
266
+ // Outputs to stdout - test verifies no error
267
+ });
268
+
269
+ test("should handle no tags found", async () => {
270
+ await setupCommand([
271
+ { cmd: "tag --sort=-version:refname", response: "" },
272
+ ]);
273
+ // Should output "No version tags found" - no error
274
+ });
275
+
276
+ test("should handle no changes since tag", async () => {
277
+ await setupCommand([
278
+ { cmd: "tag --sort=-version:refname", response: "1.0.0\n" },
279
+ { cmd: "log 1.0.0..HEAD --oneline", response: "" },
280
+ ]);
281
+ // Should output "No changes since 1.0.0" - no error
282
+ });
283
+
284
+ test("should filter commits by ignore list", async () => {
285
+ await setupCommand(
286
+ [
287
+ { cmd: "tag --sort=-version:refname", response: "1.0.0\n" },
288
+ {
289
+ cmd: "log 1.0.0..HEAD --oneline",
290
+ response: [
291
+ "abc12345 feat(ui): add dashboard",
292
+ "def56789 feat(internal): should be filtered",
293
+ ].join("\n"),
294
+ },
295
+ ],
296
+ ["changelog"],
297
+ { ignore: ["internal"] },
298
+ );
299
+ // "feat(internal)" is filtered out
300
+ });
301
+
302
+ test("should use -f alias for --from", async () => {
303
+ await setupCommand(
304
+ [
305
+ {
306
+ cmd: "log 0.8.0..HEAD --oneline",
307
+ response: "abc12345 feat(cli): new command",
308
+ },
309
+ ],
310
+ ["changelog", "-f=0.8.0"],
311
+ );
312
+ // Outputs to stdout - test verifies no error
313
+ });
314
+ });
315
+ });
@@ -3,15 +3,15 @@ import { promisify } from "node:util";
3
3
  import { $inject, $use, t } from "alepha";
4
4
  import { $command } from "alepha/command";
5
5
  import { $logger } from "alepha/logger";
6
- import { changelogOptions } from "../atoms/changelogOptions.ts";
7
- import { GitMessageParser } from "../services/GitMessageParser.ts";
6
+ import { changelogOptions } from "../../atoms/changelogOptions.ts";
7
+ import { GitMessageParser } from "../../services/GitMessageParser.ts";
8
8
 
9
9
  export {
10
10
  type ChangelogOptions,
11
11
  changelogOptions,
12
12
  DEFAULT_IGNORE,
13
- } from "../atoms/changelogOptions.ts";
14
- export { GitMessageParser } from "../services/GitMessageParser.ts";
13
+ } from "../../atoms/changelogOptions.ts";
14
+ export { GitMessageParser } from "../../services/GitMessageParser.ts";
15
15
 
16
16
  const execAsync = promisify(exec);
17
17
 
@@ -55,10 +55,10 @@ interface ChangelogEntry {
55
55
  * Changelog command for generating release notes from git commits.
56
56
  *
57
57
  * Usage:
58
- * - `alepha changelog` - Show unreleased changes since latest tag to HEAD
59
- * - `alepha changelog --from=1.0.0` - Show changes from version to HEAD
60
- * - `alepha changelog --from=1.0.0 --to=1.1.0` - Show changes between two refs
61
- * - `alepha changelog | tee -a CHANGELOG.md` - Append to file
58
+ * - `alepha gen changelog` - Show unreleased changes since latest tag to HEAD
59
+ * - `alepha gen changelog --from=1.0.0` - Show changes from version to HEAD
60
+ * - `alepha gen changelog --from=1.0.0 --to=1.1.0` - Show changes between two refs
61
+ * - `alepha gen changelog | tee -a CHANGELOG.md` - Append to file
62
62
  */
63
63
  export class ChangelogCommand {
64
64
  protected readonly log = $logger();
@@ -166,7 +166,7 @@ export class ChangelogCommand {
166
166
  // COMMAND
167
167
  // ---------------------------------------------------------------------------
168
168
 
169
- public readonly changelog = $command({
169
+ public readonly command = $command({
170
170
  name: "changelog",
171
171
  description:
172
172
  "Generate changelog from conventional commits (outputs to stdout)",
@@ -0,0 +1,71 @@
1
+ import { $inject, t } from "alepha";
2
+ import { $command } from "alepha/command";
3
+ import { FileSystemProvider } from "alepha/file";
4
+ import { $logger } from "alepha/logger";
5
+ import { ServerSwaggerProvider } from "alepha/server/swagger";
6
+ import { AlephaCliUtils } from "../../services/AlephaCliUtils.ts";
7
+
8
+ export class OpenApiCommand {
9
+ protected readonly log = $logger();
10
+ protected readonly utils = $inject(AlephaCliUtils);
11
+ protected readonly fs = $inject(FileSystemProvider);
12
+
13
+ public readonly command = $command({
14
+ name: "openapi",
15
+ description: "Generate OpenAPI specification from actions",
16
+ flags: t.object({
17
+ out: t.optional(
18
+ t.text({
19
+ aliases: ["o"],
20
+ description: "Output file path",
21
+ }),
22
+ ),
23
+ }),
24
+ handler: async ({ root, flags }) => {
25
+ const { alepha } = await this.utils.loadAlephaFromServerEntryFile(root);
26
+
27
+ try {
28
+ const openapiProvider = alepha.inject(
29
+ ServerSwaggerProvider,
30
+ ) as ServerSwaggerProvider;
31
+
32
+ await alepha.events.emit("configure", alepha);
33
+
34
+ let json: any = openapiProvider.json;
35
+
36
+ if (!json) {
37
+ json = openapiProvider.generateSwaggerDoc({
38
+ info: {
39
+ title: "API Documentation",
40
+ version: "1.0.0",
41
+ },
42
+ });
43
+ }
44
+
45
+ if (!json) {
46
+ this.log.error("No actions found to generate OpenAPI specification.");
47
+ return;
48
+ }
49
+
50
+ if (flags.out) {
51
+ await this.fs.writeFile(
52
+ this.fs.join(root, flags.out),
53
+ JSON.stringify(json, null, 2),
54
+ );
55
+ } else {
56
+ this.log.info(JSON.stringify(json, null, 2));
57
+ }
58
+ } catch (err) {
59
+ const message = err instanceof Error ? err.message : String(err);
60
+ if (message.includes("Service not found")) {
61
+ this.log.error(
62
+ "Missing $swagger() primitive in your server configuration.",
63
+ );
64
+ return;
65
+ }
66
+
67
+ this.log.error(`OpenAPI generation failed - ${message}`, { err });
68
+ }
69
+ },
70
+ });
71
+ }
@@ -0,0 +1,18 @@
1
+ import { $inject } from "alepha";
2
+ import { $command } from "alepha/command";
3
+ import { ChangelogCommand } from "./gen/changelog.ts";
4
+ import { OpenApiCommand } from "./gen/openapi.ts";
5
+
6
+ export class GenCommand {
7
+ protected readonly changelog = $inject(ChangelogCommand);
8
+ protected readonly openapi = $inject(OpenApiCommand);
9
+
10
+ public readonly gen = $command({
11
+ name: "gen",
12
+ description: "Generate code, documentation, ...",
13
+ children: [this.changelog.command, this.openapi.command],
14
+ handler: async ({ help }) => {
15
+ help();
16
+ },
17
+ });
18
+ }
@@ -61,6 +61,8 @@ export class InitCommand {
61
61
  if (pm === "yarn") {
62
62
  await this.utils.ensureYarn(root);
63
63
  await run("yarn set version stable");
64
+ } else if (pm === "bun") {
65
+ await this.utils.ensureBun(root);
64
66
  } else if (pm === "pnpm") {
65
67
  await this.utils.ensurePnpm(root);
66
68
  } else {
@@ -1,11 +1,13 @@
1
- import { $inject, t } from "alepha";
1
+ import { $inject, Alepha, t } from "alepha";
2
2
  import { $command, CliProvider } from "alepha/command";
3
- import { $logger } from "alepha/logger";
3
+ import { $logger, ConsoleColorProvider } from "alepha/logger";
4
4
  import { version } from "../version.ts";
5
5
 
6
6
  export class RootCommand {
7
7
  protected readonly log = $logger();
8
8
  protected readonly cli = $inject(CliProvider);
9
+ protected readonly alepha = $inject(Alepha);
10
+ protected readonly color = $inject(ConsoleColorProvider);
9
11
 
10
12
  /**
11
13
  * Called when no command is provided
@@ -22,7 +24,14 @@ export class RootCommand {
22
24
  }),
23
25
  handler: async ({ flags }) => {
24
26
  if (flags.version) {
25
- this.log.info(version);
27
+ this.log.info(this.color.set("WHITE_BOLD", `Alepha v${version}`));
28
+ if (this.alepha.isBun()) {
29
+ this.log.info(this.color.set("GREY_DARK", `└─ Bun v${Bun.version}`));
30
+ } else {
31
+ this.log.info(
32
+ this.color.set("GREY_DARK", `└─ Node ${process.version}`),
33
+ );
34
+ }
26
35
  return;
27
36
  }
28
37
 
@@ -1,19 +1,24 @@
1
1
  import { $inject } from "alepha";
2
2
  import { $command } from "alepha/command";
3
+ import { $logger } from "alepha/logger";
3
4
  import { AlephaCliUtils } from "../services/AlephaCliUtils.ts";
4
5
 
5
6
  export class TypecheckCommand {
6
7
  protected readonly utils = $inject(AlephaCliUtils);
8
+ protected readonly log = $logger();
7
9
 
8
10
  /**
9
11
  * Run TypeScript type checking across the codebase with no emit.
10
12
  */
11
13
  public readonly typecheck = $command({
12
14
  name: "typecheck",
15
+ aliases: ["tc"],
13
16
  description: "Check TypeScript types across the codebase",
14
17
  handler: async ({ root }) => {
18
+ this.log.info("Starting TypeScript type checking...");
15
19
  await this.utils.ensureDependency(root, "typescript");
16
20
  await this.utils.exec("tsc --noEmit");
21
+ this.log.info("TypeScript type checking completed successfully.");
17
22
  },
18
23
  });
19
24
  }
package/src/cli/index.ts CHANGED
@@ -2,12 +2,13 @@ export * from "./apps/AlephaCli.ts";
2
2
  export * from "./apps/AlephaPackageBuilderCli.ts";
3
3
  export * from "./atoms/changelogOptions.ts";
4
4
  export * from "./commands/build.ts";
5
- export * from "./commands/changelog.ts";
6
5
  export * from "./commands/clean.ts";
7
6
  export * from "./commands/db.ts";
8
7
  export * from "./commands/deploy.ts";
9
8
  export * from "./commands/dev.ts";
10
9
  export * from "./commands/format.ts";
10
+ export * from "./commands/gen/changelog.ts";
11
+ export * from "./commands/gen/openapi.ts";
11
12
  export * from "./commands/init.ts";
12
13
  export * from "./commands/lint.ts";
13
14
  export * from "./commands/root.ts";
@@ -6,7 +6,6 @@ import { EnvUtils, type RunnerMethod } from "alepha/command";
6
6
  import { FileSystemProvider } from "alepha/file";
7
7
  import { $logger } from "alepha/logger";
8
8
  import { boot } from "alepha/vite";
9
- import { tsImport } from "tsx/esm/api";
10
9
  import { appRouterTs } from "../assets/appRouterTs.ts";
11
10
  import { biomeJson } from "../assets/biomeJson.ts";
12
11
  import { dummySpecTs } from "../assets/dummySpecTs.ts";
@@ -32,6 +31,7 @@ export class AlephaCliUtils {
32
31
  protected readonly log = $logger();
33
32
  protected readonly fs = $inject(FileSystemProvider);
34
33
  protected readonly envUtils = $inject(EnvUtils);
34
+ protected readonly alepha = $inject(Alepha);
35
35
 
36
36
  /**
37
37
  * Execute a command using npx with inherited stdio.
@@ -142,6 +142,40 @@ export class AlephaCliUtils {
142
142
  // Package Manager & Project Setup
143
143
  // ===================================================================================================================
144
144
 
145
+ public async removeFiles(root: string, files: string[]): Promise<void> {
146
+ await Promise.all(
147
+ files.map((file) =>
148
+ this.fs.rm(join(root, file), { force: true, recursive: true }),
149
+ ),
150
+ );
151
+ }
152
+
153
+ public async removeYarn(root: string): Promise<void> {
154
+ await this.removeFiles(root, [".yarn", ".yarnrc.yml", ".yarn"]);
155
+ }
156
+
157
+ public async removePnpm(root: string): Promise<void> {
158
+ await this.removeFiles(root, ["pnpm-lock.yaml", "pnpm-workspace.yaml"]);
159
+ }
160
+
161
+ public async removeNpm(root: string): Promise<void> {
162
+ await this.removeFiles(root, ["package-lock.json"]);
163
+ }
164
+
165
+ public async removeBun(root: string): Promise<void> {
166
+ await this.removeFiles(root, ["bun.lockb"]);
167
+ }
168
+
169
+ public async removeAllPmFilesExcept(
170
+ root: string,
171
+ except: string,
172
+ ): Promise<void> {
173
+ if (except !== "yarn") await this.removeYarn(root);
174
+ if (except !== "pnpm") await this.removePnpm(root);
175
+ if (except !== "npm") await this.removeNpm(root);
176
+ if (except !== "bun") await this.removeBun(root);
177
+ }
178
+
145
179
  /**
146
180
  * Ensure Yarn is configured in the project directory.
147
181
  *
@@ -157,25 +191,19 @@ export class AlephaCliUtils {
157
191
  false,
158
192
  );
159
193
 
160
- // remove lock files from other package managers
161
- await this.fs.rm(join(root, "package-lock.json"), { force: true });
162
- await this.fs.rm(join(root, "pnpm-lock.yaml"), { force: true });
194
+ await this.removeAllPmFilesExcept(root, "yarn");
195
+ }
196
+
197
+ public async ensureBun(root: string): Promise<void> {
198
+ await this.removeAllPmFilesExcept(root, "bun");
163
199
  }
164
200
 
165
201
  public async ensurePnpm(root: string): Promise<void> {
166
- // remove lock files from other package managers
167
- await this.fs.rm(join(root, "package-lock.json"), { force: true });
168
- await this.fs.rm(join(root, "yarn.lock"), { force: true });
169
- await this.fs.rm(join(root, ".yarn"), { force: true, recursive: true });
170
- await this.fs.rm(join(root, ".yarnrc.yml"), { force: true });
202
+ await this.removeAllPmFilesExcept(root, "pnpm");
171
203
  }
172
204
 
173
205
  public async ensureNpm(root: string): Promise<void> {
174
- // remove lock files from other package managers
175
- await this.fs.rm(join(root, "pnpm-lock.yaml"), { force: true });
176
- await this.fs.rm(join(root, "yarn.lock"), { force: true });
177
- await this.fs.rm(join(root, ".yarn"), { force: true, recursive: true });
178
- await this.fs.rm(join(root, ".yarnrc.yml"), { force: true });
206
+ await this.removeAllPmFilesExcept(root, "npm");
179
207
  }
180
208
 
181
209
  /**
@@ -436,9 +464,10 @@ export class AlephaCliUtils {
436
464
  process.env.ALEPHA_CLI_IMPORT = "true";
437
465
 
438
466
  const entry = await boot.getServerEntry(rootDir, explicitEntry);
439
- const mod = await tsImport(entry, {
440
- parentURL: import.meta.url,
441
- });
467
+
468
+ delete (global as any).__alepha;
469
+
470
+ const mod = await import(entry);
442
471
 
443
472
  this.log.debug(`Load entry: ${entry}`);
444
473
 
@@ -523,6 +552,9 @@ ${models.map((it: string) => `export const ${it} = models["${it}"];`).join("\n")
523
552
  if (flags?.bun) {
524
553
  return "bun";
525
554
  }
555
+ if (this.alepha.isBun()) {
556
+ return "bun";
557
+ }
526
558
  if (await this.checkFileExists(root, "yarn.lock", true)) {
527
559
  return "yarn";
528
560
  }
@@ -659,6 +691,27 @@ ${models.map((it: string) => `export const ${it} = models["${it}"];`).join("\n")
659
691
  return this.hasDependency(root, "expo");
660
692
  }
661
693
 
694
+ async getInstallCommand(root: string, packageName: string, dev = true) {
695
+ const pm = await this.getPackageManager(root);
696
+ let cmd: string;
697
+
698
+ switch (pm) {
699
+ case "yarn":
700
+ cmd = `yarn add ${dev ? "-D" : ""} ${packageName}`;
701
+ break;
702
+ case "pnpm":
703
+ cmd = `pnpm add ${dev ? "-D" : ""} ${packageName}`;
704
+ break;
705
+ case "bun":
706
+ cmd = `bun add ${dev ? "-d" : ""} ${packageName}`;
707
+ break;
708
+ default:
709
+ cmd = `npm install ${dev ? "--save-dev" : ""} ${packageName}`;
710
+ }
711
+
712
+ return cmd.replace(/\s+/g, " ").trim();
713
+ }
714
+
662
715
  /**
663
716
  * Install a dependency if it's missing from the project.
664
717
  *
@@ -677,21 +730,7 @@ ${models.map((it: string) => `export const ${it} = models["${it}"];`).join("\n")
677
730
  return;
678
731
  }
679
732
 
680
- const pm = await this.getPackageManager(root);
681
- let cmd: string;
682
-
683
- switch (pm) {
684
- case "yarn":
685
- cmd = `yarn add ${dev ? "-D" : ""} ${packageName}`;
686
- break;
687
- case "pnpm":
688
- cmd = `pnpm add ${dev ? "-D" : ""} ${packageName}`;
689
- break;
690
- default:
691
- cmd = `npm install ${dev ? "--save-dev" : ""} ${packageName}`;
692
- }
693
-
694
- cmd = cmd.replace(/\s+/g, " ").trim();
733
+ const cmd = await this.getInstallCommand(root, packageName, dev);
695
734
 
696
735
  if (options.run) {
697
736
  // if it's during a Runner flow, just use the runner's run method