alepha 0.14.2 → 0.14.4

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 (405) hide show
  1. package/README.md +1 -1
  2. package/dist/api/audits/index.browser.js +5 -5
  3. package/dist/api/audits/index.browser.js.map +1 -1
  4. package/dist/api/audits/index.d.ts +706 -785
  5. package/dist/api/audits/index.d.ts.map +1 -1
  6. package/dist/api/audits/index.js +13 -13
  7. package/dist/api/audits/index.js.map +1 -1
  8. package/dist/api/files/index.browser.js +5 -5
  9. package/dist/api/files/index.browser.js.map +1 -1
  10. package/dist/api/files/index.d.ts +58 -137
  11. package/dist/api/files/index.d.ts.map +1 -1
  12. package/dist/api/files/index.js +71 -71
  13. package/dist/api/files/index.js.map +1 -1
  14. package/dist/api/jobs/index.browser.js +5 -5
  15. package/dist/api/jobs/index.browser.js.map +1 -1
  16. package/dist/api/jobs/index.d.ts +29 -108
  17. package/dist/api/jobs/index.d.ts.map +1 -1
  18. package/dist/api/jobs/index.js +10 -10
  19. package/dist/api/jobs/index.js.map +1 -1
  20. package/dist/api/notifications/index.browser.js +10 -10
  21. package/dist/api/notifications/index.browser.js.map +1 -1
  22. package/dist/api/notifications/index.d.ts +504 -171
  23. package/dist/api/notifications/index.d.ts.map +1 -1
  24. package/dist/api/notifications/index.js +12 -12
  25. package/dist/api/notifications/index.js.map +1 -1
  26. package/dist/api/parameters/index.browser.js +163 -10
  27. package/dist/api/parameters/index.browser.js.map +1 -1
  28. package/dist/api/parameters/index.d.ts +277 -351
  29. package/dist/api/parameters/index.d.ts.map +1 -1
  30. package/dist/api/parameters/index.js +196 -91
  31. package/dist/api/parameters/index.js.map +1 -1
  32. package/dist/api/users/index.browser.js +19 -19
  33. package/dist/api/users/index.browser.js.map +1 -1
  34. package/dist/api/users/index.d.ts +787 -852
  35. package/dist/api/users/index.d.ts.map +1 -1
  36. package/dist/api/users/index.js +827 -596
  37. package/dist/api/users/index.js.map +1 -1
  38. package/dist/api/verifications/index.browser.js +6 -6
  39. package/dist/api/verifications/index.browser.js.map +1 -1
  40. package/dist/api/verifications/index.d.ts +128 -128
  41. package/dist/api/verifications/index.d.ts.map +1 -1
  42. package/dist/api/verifications/index.js +6 -6
  43. package/dist/api/verifications/index.js.map +1 -1
  44. package/dist/bin/index.d.ts +1 -2
  45. package/dist/bin/index.js +0 -1
  46. package/dist/bin/index.js.map +1 -1
  47. package/dist/cli/index.d.ts +252 -131
  48. package/dist/cli/index.d.ts.map +1 -1
  49. package/dist/cli/index.js +595 -395
  50. package/dist/cli/index.js.map +1 -1
  51. package/dist/command/index.d.ts +46 -11
  52. package/dist/command/index.d.ts.map +1 -1
  53. package/dist/command/index.js +99 -19
  54. package/dist/command/index.js.map +1 -1
  55. package/dist/core/index.browser.js +40 -22
  56. package/dist/core/index.browser.js.map +1 -1
  57. package/dist/core/index.d.ts +45 -1
  58. package/dist/core/index.d.ts.map +1 -1
  59. package/dist/core/index.js +40 -22
  60. package/dist/core/index.js.map +1 -1
  61. package/dist/core/index.native.js +40 -22
  62. package/dist/core/index.native.js.map +1 -1
  63. package/dist/fake/index.js +195 -168
  64. package/dist/fake/index.js.map +1 -1
  65. package/dist/file/index.d.ts +8 -0
  66. package/dist/file/index.d.ts.map +1 -1
  67. package/dist/file/index.js +3 -0
  68. package/dist/file/index.js.map +1 -1
  69. package/dist/logger/index.d.ts +1 -1
  70. package/dist/logger/index.d.ts.map +1 -1
  71. package/dist/logger/index.js +12 -2
  72. package/dist/logger/index.js.map +1 -1
  73. package/dist/mcp/index.js +1 -1
  74. package/dist/mcp/index.js.map +1 -1
  75. package/dist/orm/index.d.ts +59 -195
  76. package/dist/orm/index.d.ts.map +1 -1
  77. package/dist/orm/index.js +201 -430
  78. package/dist/orm/index.js.map +1 -1
  79. package/dist/security/index.d.ts +1 -1
  80. package/dist/security/index.d.ts.map +1 -1
  81. package/dist/security/index.js +1 -1
  82. package/dist/security/index.js.map +1 -1
  83. package/dist/server/auth/index.d.ts +171 -155
  84. package/dist/server/auth/index.d.ts.map +1 -1
  85. package/dist/server/auth/index.js +0 -1
  86. package/dist/server/auth/index.js.map +1 -1
  87. package/dist/server/cache/index.d.ts +12 -0
  88. package/dist/server/cache/index.d.ts.map +1 -1
  89. package/dist/server/cache/index.js +55 -2
  90. package/dist/server/cache/index.js.map +1 -1
  91. package/dist/server/compress/index.d.ts +6 -0
  92. package/dist/server/compress/index.d.ts.map +1 -1
  93. package/dist/server/compress/index.js +38 -1
  94. package/dist/server/compress/index.js.map +1 -1
  95. package/dist/server/core/index.browser.js +2 -2
  96. package/dist/server/core/index.browser.js.map +1 -1
  97. package/dist/server/core/index.d.ts +10 -10
  98. package/dist/server/core/index.d.ts.map +1 -1
  99. package/dist/server/core/index.js +7 -4
  100. package/dist/server/core/index.js.map +1 -1
  101. package/dist/server/links/index.browser.js +22 -6
  102. package/dist/server/links/index.browser.js.map +1 -1
  103. package/dist/server/links/index.d.ts +46 -44
  104. package/dist/server/links/index.d.ts.map +1 -1
  105. package/dist/server/links/index.js +24 -41
  106. package/dist/server/links/index.js.map +1 -1
  107. package/dist/server/static/index.d.ts.map +1 -1
  108. package/dist/server/static/index.js +4 -0
  109. package/dist/server/static/index.js.map +1 -1
  110. package/dist/server/swagger/index.d.ts +2 -1
  111. package/dist/server/swagger/index.d.ts.map +1 -1
  112. package/dist/server/swagger/index.js +9 -5
  113. package/dist/server/swagger/index.js.map +1 -1
  114. package/dist/vite/index.d.ts +101 -106
  115. package/dist/vite/index.d.ts.map +1 -1
  116. package/dist/vite/index.js +574 -503
  117. package/dist/vite/index.js.map +1 -1
  118. package/dist/websocket/index.d.ts +7 -7
  119. package/package.json +7 -7
  120. package/src/api/audits/controllers/{AuditController.ts → AdminAuditController.ts} +5 -6
  121. package/src/api/audits/entities/audits.ts +5 -5
  122. package/src/api/audits/index.browser.ts +1 -1
  123. package/src/api/audits/index.ts +3 -3
  124. package/src/api/audits/primitives/$audit.spec.ts +276 -0
  125. package/src/api/audits/services/AuditService.spec.ts +495 -0
  126. package/src/api/files/__tests__/$bucket.spec.ts +91 -0
  127. package/src/api/files/controllers/AdminFileStatsController.spec.ts +166 -0
  128. package/src/api/files/controllers/{StorageStatsController.ts → AdminFileStatsController.ts} +2 -2
  129. package/src/api/files/controllers/FileController.spec.ts +558 -0
  130. package/src/api/files/controllers/FileController.ts +4 -5
  131. package/src/api/files/entities/files.ts +5 -5
  132. package/src/api/files/index.browser.ts +1 -1
  133. package/src/api/files/index.ts +4 -4
  134. package/src/api/files/jobs/FileJobs.spec.ts +52 -0
  135. package/src/api/files/services/FileService.spec.ts +109 -0
  136. package/src/api/jobs/__tests__/JobController.spec.ts +343 -0
  137. package/src/api/jobs/controllers/{JobController.ts → AdminJobController.ts} +2 -2
  138. package/src/api/jobs/entities/jobExecutions.ts +5 -5
  139. package/src/api/jobs/index.ts +3 -3
  140. package/src/api/jobs/primitives/$job.spec.ts +476 -0
  141. package/src/api/notifications/controllers/{NotificationController.ts → AdminNotificationController.ts} +4 -5
  142. package/src/api/notifications/entities/notifications.ts +5 -5
  143. package/src/api/notifications/index.browser.ts +1 -1
  144. package/src/api/notifications/index.ts +4 -4
  145. package/src/api/parameters/controllers/{ConfigController.ts → AdminConfigController.ts} +46 -107
  146. package/src/api/parameters/entities/parameters.ts +7 -17
  147. package/src/api/parameters/index.ts +3 -3
  148. package/src/api/parameters/primitives/$config.spec.ts +356 -0
  149. package/src/api/parameters/schemas/activateConfigBodySchema.ts +12 -0
  150. package/src/api/parameters/schemas/checkScheduledResponseSchema.ts +8 -0
  151. package/src/api/parameters/schemas/configCurrentResponseSchema.ts +13 -0
  152. package/src/api/parameters/schemas/configHistoryResponseSchema.ts +9 -0
  153. package/src/api/parameters/schemas/configNameParamSchema.ts +10 -0
  154. package/src/api/parameters/schemas/configNamesResponseSchema.ts +8 -0
  155. package/src/api/parameters/schemas/configTreeNodeSchema.ts +13 -0
  156. package/src/api/parameters/schemas/configVersionParamSchema.ts +9 -0
  157. package/src/api/parameters/schemas/configVersionResponseSchema.ts +9 -0
  158. package/src/api/parameters/schemas/configsByStatusResponseSchema.ts +9 -0
  159. package/src/api/parameters/schemas/createConfigVersionBodySchema.ts +24 -0
  160. package/src/api/parameters/schemas/index.ts +15 -0
  161. package/src/api/parameters/schemas/parameterResponseSchema.ts +26 -0
  162. package/src/api/parameters/schemas/parameterStatusSchema.ts +13 -0
  163. package/src/api/parameters/schemas/rollbackConfigBodySchema.ts +15 -0
  164. package/src/api/parameters/schemas/statusParamSchema.ts +9 -0
  165. package/src/api/users/__tests__/EmailVerification.spec.ts +369 -0
  166. package/src/api/users/__tests__/PasswordReset.spec.ts +550 -0
  167. package/src/api/users/controllers/AdminIdentityController.spec.ts +365 -0
  168. package/src/api/users/controllers/{IdentityController.ts → AdminIdentityController.ts} +3 -4
  169. package/src/api/users/controllers/AdminSessionController.spec.ts +274 -0
  170. package/src/api/users/controllers/{SessionController.ts → AdminSessionController.ts} +3 -4
  171. package/src/api/users/controllers/AdminUserController.spec.ts +372 -0
  172. package/src/api/users/controllers/AdminUserController.ts +116 -0
  173. package/src/api/users/controllers/UserController.ts +4 -107
  174. package/src/api/users/controllers/UserRealmController.ts +3 -0
  175. package/src/api/users/entities/identities.ts +6 -6
  176. package/src/api/users/entities/sessions.ts +6 -6
  177. package/src/api/users/entities/users.ts +9 -9
  178. package/src/api/users/index.ts +9 -6
  179. package/src/api/users/primitives/$userRealm.ts +13 -8
  180. package/src/api/users/services/CredentialService.spec.ts +509 -0
  181. package/src/api/users/services/CredentialService.ts +46 -0
  182. package/src/api/users/services/IdentityService.ts +15 -0
  183. package/src/api/users/services/RegistrationService.spec.ts +630 -0
  184. package/src/api/users/services/RegistrationService.ts +18 -0
  185. package/src/api/users/services/SessionService.spec.ts +301 -0
  186. package/src/api/users/services/SessionService.ts +110 -1
  187. package/src/api/users/services/UserService.ts +67 -2
  188. package/src/api/verifications/__tests__/CodeVerification.spec.ts +318 -0
  189. package/src/api/verifications/__tests__/LinkVerification.spec.ts +279 -0
  190. package/src/api/verifications/entities/verifications.ts +6 -6
  191. package/src/api/verifications/jobs/VerificationJobs.spec.ts +50 -0
  192. package/src/batch/__tests__/startup-buffering.spec.ts +458 -0
  193. package/src/batch/primitives/$batch.spec.ts +766 -0
  194. package/src/batch/providers/BatchProvider.spec.ts +786 -0
  195. package/src/bin/index.ts +0 -1
  196. package/src/bucket/__tests__/shared.ts +194 -0
  197. package/src/bucket/primitives/$bucket.spec.ts +104 -0
  198. package/src/bucket/providers/FileStorageProvider.spec.ts +13 -0
  199. package/src/bucket/providers/LocalFileStorageProvider.spec.ts +77 -0
  200. package/src/bucket/providers/MemoryFileStorageProvider.spec.ts +82 -0
  201. package/src/cache/core/__tests__/shared.ts +377 -0
  202. package/src/cache/core/primitives/$cache.spec.ts +111 -0
  203. package/src/cache/redis/__tests__/cache-redis.spec.ts +70 -0
  204. package/src/cli/apps/AlephaCli.ts +25 -6
  205. package/src/cli/atoms/buildOptions.ts +88 -0
  206. package/src/cli/commands/build.ts +32 -69
  207. package/src/cli/commands/db.ts +0 -4
  208. package/src/cli/commands/dev.ts +34 -10
  209. package/src/cli/commands/gen/changelog.spec.ts +315 -0
  210. package/src/cli/commands/{changelog.ts → gen/changelog.ts} +9 -9
  211. package/src/cli/commands/gen/env.ts +53 -0
  212. package/src/cli/commands/gen/openapi.ts +71 -0
  213. package/src/cli/commands/gen/resource.ts +15 -0
  214. package/src/cli/commands/gen.ts +24 -0
  215. package/src/cli/commands/init.ts +2 -1
  216. package/src/cli/commands/root.ts +12 -3
  217. package/src/cli/commands/test.ts +0 -1
  218. package/src/cli/commands/typecheck.ts +5 -0
  219. package/src/cli/commands/verify.ts +1 -1
  220. package/src/cli/defineConfig.ts +49 -7
  221. package/src/cli/index.ts +2 -2
  222. package/src/cli/services/AlephaCliUtils.ts +105 -55
  223. package/src/cli/services/GitMessageParser.ts +1 -1
  224. package/src/command/helpers/Asker.spec.ts +127 -0
  225. package/src/command/helpers/Runner.spec.ts +126 -0
  226. package/src/command/helpers/Runner.ts +1 -1
  227. package/src/command/primitives/$command.spec.ts +1588 -0
  228. package/src/command/primitives/$command.ts +0 -6
  229. package/src/command/providers/CliProvider.ts +75 -27
  230. package/src/core/Alepha.ts +87 -0
  231. package/src/core/__tests__/Alepha-emit.spec.ts +22 -0
  232. package/src/core/__tests__/Alepha-graph.spec.ts +93 -0
  233. package/src/core/__tests__/Alepha-has.spec.ts +41 -0
  234. package/src/core/__tests__/Alepha-inject.spec.ts +93 -0
  235. package/src/core/__tests__/Alepha-register.spec.ts +81 -0
  236. package/src/core/__tests__/Alepha-start.spec.ts +176 -0
  237. package/src/core/__tests__/Alepha-with.spec.ts +14 -0
  238. package/src/core/__tests__/TypeBox-usecases.spec.ts +35 -0
  239. package/src/core/__tests__/TypeBoxLocale.spec.ts +15 -0
  240. package/src/core/__tests__/descriptor.spec.ts +34 -0
  241. package/src/core/__tests__/fixtures/A.ts +5 -0
  242. package/src/core/__tests__/pagination.spec.ts +77 -0
  243. package/src/core/helpers/jsonSchemaToTypeBox.ts +2 -2
  244. package/src/core/primitives/$atom.spec.ts +43 -0
  245. package/src/core/primitives/$hook.spec.ts +130 -0
  246. package/src/core/primitives/$inject.spec.ts +175 -0
  247. package/src/core/primitives/$module.spec.ts +115 -0
  248. package/src/core/providers/CodecManager.spec.ts +740 -0
  249. package/src/core/providers/EventManager.spec.ts +762 -0
  250. package/src/core/providers/EventManager.ts +4 -0
  251. package/src/core/providers/StateManager.spec.ts +365 -0
  252. package/src/core/providers/TypeProvider.spec.ts +1607 -0
  253. package/src/core/providers/TypeProvider.ts +20 -26
  254. package/src/datetime/primitives/$interval.spec.ts +103 -0
  255. package/src/datetime/providers/DateTimeProvider.spec.ts +86 -0
  256. package/src/email/primitives/$email.spec.ts +175 -0
  257. package/src/email/providers/LocalEmailProvider.spec.ts +341 -0
  258. package/src/fake/__tests__/keyName.example.ts +40 -0
  259. package/src/fake/__tests__/keyName.spec.ts +152 -0
  260. package/src/fake/__tests__/module.example.ts +32 -0
  261. package/src/fake/providers/FakeProvider.spec.ts +438 -0
  262. package/src/file/providers/FileSystemProvider.ts +8 -0
  263. package/src/file/providers/NodeFileSystemProvider.spec.ts +418 -0
  264. package/src/file/providers/NodeFileSystemProvider.ts +5 -0
  265. package/src/file/services/FileDetector.spec.ts +591 -0
  266. package/src/lock/core/__tests__/shared.ts +190 -0
  267. package/src/lock/core/providers/MemoryLockProvider.spec.ts +25 -0
  268. package/src/lock/redis/providers/RedisLockProvider.spec.ts +25 -0
  269. package/src/logger/__tests__/SimpleFormatterProvider.spec.ts +109 -0
  270. package/src/logger/index.ts +15 -3
  271. package/src/logger/primitives/$logger.spec.ts +108 -0
  272. package/src/logger/services/Logger.spec.ts +295 -0
  273. package/src/mcp/__tests__/errors.spec.ts +175 -0
  274. package/src/mcp/__tests__/integration.spec.ts +450 -0
  275. package/src/mcp/helpers/jsonrpc.spec.ts +380 -0
  276. package/src/mcp/primitives/$prompt.spec.ts +468 -0
  277. package/src/mcp/primitives/$resource.spec.ts +390 -0
  278. package/src/mcp/primitives/$tool.spec.ts +406 -0
  279. package/src/mcp/providers/McpServerProvider.spec.ts +797 -0
  280. package/src/mcp/transports/StdioMcpTransport.ts +1 -1
  281. package/src/orm/__tests__/$repository-crud.spec.ts +276 -0
  282. package/src/orm/__tests__/$repository-hooks.spec.ts +325 -0
  283. package/src/orm/__tests__/$repository-orderBy.spec.ts +128 -0
  284. package/src/orm/__tests__/$repository-pagination-sort.spec.ts +149 -0
  285. package/src/orm/__tests__/$repository-save.spec.ts +37 -0
  286. package/src/orm/__tests__/ModelBuilder-integration.spec.ts +490 -0
  287. package/src/orm/__tests__/ModelBuilder-types.spec.ts +186 -0
  288. package/src/orm/__tests__/PostgresProvider.spec.ts +46 -0
  289. package/src/orm/__tests__/delete-returning.spec.ts +256 -0
  290. package/src/orm/__tests__/deletedAt.spec.ts +80 -0
  291. package/src/orm/__tests__/enums.spec.ts +315 -0
  292. package/src/orm/__tests__/execute.spec.ts +72 -0
  293. package/src/orm/__tests__/fixtures/bigEntitySchema.ts +65 -0
  294. package/src/orm/__tests__/fixtures/userEntitySchema.ts +27 -0
  295. package/src/orm/__tests__/joins.spec.ts +1114 -0
  296. package/src/orm/__tests__/page.spec.ts +287 -0
  297. package/src/orm/__tests__/primaryKey.spec.ts +87 -0
  298. package/src/orm/__tests__/query-date-encoding.spec.ts +402 -0
  299. package/src/orm/__tests__/ref-auto-onDelete.spec.ts +156 -0
  300. package/src/orm/__tests__/references.spec.ts +102 -0
  301. package/src/orm/__tests__/security.spec.ts +710 -0
  302. package/src/orm/__tests__/sqlite.spec.ts +111 -0
  303. package/src/orm/__tests__/string-operators.spec.ts +429 -0
  304. package/src/orm/__tests__/timestamps.spec.ts +388 -0
  305. package/src/orm/__tests__/validation.spec.ts +183 -0
  306. package/src/orm/__tests__/version.spec.ts +64 -0
  307. package/src/orm/helpers/parseQueryString.spec.ts +196 -0
  308. package/src/orm/index.ts +2 -8
  309. package/src/orm/primitives/$repository.spec.ts +137 -0
  310. package/src/orm/primitives/$sequence.spec.ts +29 -0
  311. package/src/orm/primitives/$transaction.spec.ts +82 -0
  312. package/src/orm/providers/drivers/BunPostgresProvider.ts +3 -3
  313. package/src/orm/providers/drivers/BunSqliteProvider.ts +1 -1
  314. package/src/orm/providers/drivers/CloudflareD1Provider.ts +1 -1
  315. package/src/orm/providers/drivers/DatabaseProvider.ts +1 -1
  316. package/src/orm/providers/drivers/NodePostgresProvider.ts +3 -3
  317. package/src/orm/providers/drivers/NodeSqliteProvider.ts +1 -1
  318. package/src/orm/providers/drivers/PglitePostgresProvider.ts +2 -2
  319. package/src/orm/services/ModelBuilder.spec.ts +575 -0
  320. package/src/orm/services/Repository.spec.ts +137 -0
  321. package/src/queue/core/__tests__/shared.ts +143 -0
  322. package/src/queue/core/providers/MemoryQueueProvider.spec.ts +23 -0
  323. package/src/queue/core/providers/WorkerProvider.spec.ts +394 -0
  324. package/src/queue/redis/providers/RedisQueueProvider.spec.ts +23 -0
  325. package/src/redis/__tests__/redis.spec.ts +58 -0
  326. package/src/retry/primitives/$retry.spec.ts +234 -0
  327. package/src/retry/providers/RetryProvider.spec.ts +438 -0
  328. package/src/router/__tests__/match.spec.ts +252 -0
  329. package/src/router/providers/RouterProvider.spec.ts +197 -0
  330. package/src/scheduler/__tests__/$scheduler-cron.spec.ts +25 -0
  331. package/src/scheduler/__tests__/$scheduler-interval.spec.ts +25 -0
  332. package/src/scheduler/__tests__/shared.ts +77 -0
  333. package/src/security/__tests__/bug-1-wildcard-after-start.spec.ts +229 -0
  334. package/src/security/__tests__/bug-2-password-validation.spec.ts +245 -0
  335. package/src/security/__tests__/bug-3-regex-vulnerability.spec.ts +407 -0
  336. package/src/security/__tests__/bug-4-oauth2-validation.spec.ts +439 -0
  337. package/src/security/__tests__/multi-layer-permissions.spec.ts +522 -0
  338. package/src/security/primitives/$permission.spec.ts +30 -0
  339. package/src/security/primitives/$permission.ts +2 -2
  340. package/src/security/primitives/$realm.spec.ts +101 -0
  341. package/src/security/primitives/$role.spec.ts +52 -0
  342. package/src/security/primitives/$serviceAccount.spec.ts +61 -0
  343. package/src/security/providers/SecurityProvider.spec.ts +350 -0
  344. package/src/server/auth/providers/ServerAuthProvider.ts +0 -2
  345. package/src/server/cache/providers/ServerCacheProvider.spec.ts +1125 -0
  346. package/src/server/cache/providers/ServerCacheProvider.ts +94 -9
  347. package/src/server/compress/providers/ServerCompressProvider.spec.ts +31 -0
  348. package/src/server/compress/providers/ServerCompressProvider.ts +63 -2
  349. package/src/server/cookies/providers/ServerCookiesProvider.spec.ts +253 -0
  350. package/src/server/core/__tests__/ServerRouterProvider-getRoutes.spec.ts +334 -0
  351. package/src/server/core/__tests__/ServerRouterProvider-requestId.spec.ts +129 -0
  352. package/src/server/core/helpers/ServerReply.ts +2 -2
  353. package/src/server/core/primitives/$action.spec.ts +191 -0
  354. package/src/server/core/primitives/$route.spec.ts +65 -0
  355. package/src/server/core/providers/ServerBodyParserProvider.spec.ts +93 -0
  356. package/src/server/core/providers/ServerLoggerProvider.spec.ts +100 -0
  357. package/src/server/core/providers/ServerProvider.ts +14 -2
  358. package/src/server/core/services/HttpClient.spec.ts +123 -0
  359. package/src/server/core/services/UserAgentParser.spec.ts +111 -0
  360. package/src/server/cors/providers/ServerCorsProvider.spec.ts +481 -0
  361. package/src/server/health/providers/ServerHealthProvider.spec.ts +22 -0
  362. package/src/server/helmet/providers/ServerHelmetProvider.spec.ts +105 -0
  363. package/src/server/links/__tests__/$action.spec.ts +238 -0
  364. package/src/server/links/__tests__/fixtures/CrudApp.ts +122 -0
  365. package/src/server/links/__tests__/requestId.spec.ts +120 -0
  366. package/src/server/links/primitives/$remote.spec.ts +228 -0
  367. package/src/server/links/providers/LinkProvider.spec.ts +54 -0
  368. package/src/server/links/providers/LinkProvider.ts +49 -3
  369. package/src/server/links/providers/ServerLinksProvider.ts +1 -53
  370. package/src/server/links/schemas/apiLinksResponseSchema.ts +7 -0
  371. package/src/server/metrics/providers/ServerMetricsProvider.spec.ts +25 -0
  372. package/src/server/multipart/providers/ServerMultipartProvider.spec.ts +528 -0
  373. package/src/server/proxy/primitives/$proxy.spec.ts +87 -0
  374. package/src/server/rate-limit/__tests__/ActionRateLimit.spec.ts +211 -0
  375. package/src/server/rate-limit/providers/ServerRateLimitProvider.spec.ts +344 -0
  376. package/src/server/security/__tests__/BasicAuth.spec.ts +684 -0
  377. package/src/server/security/__tests__/ServerSecurityProvider-realm.spec.ts +388 -0
  378. package/src/server/security/providers/ServerSecurityProvider.spec.ts +123 -0
  379. package/src/server/static/primitives/$serve.spec.ts +193 -0
  380. package/src/server/static/providers/ServerStaticProvider.ts +10 -0
  381. package/src/server/swagger/__tests__/ui.spec.ts +52 -0
  382. package/src/server/swagger/primitives/$swagger.spec.ts +193 -0
  383. package/src/server/swagger/providers/ServerSwaggerProvider.ts +19 -12
  384. package/src/sms/primitives/$sms.spec.ts +165 -0
  385. package/src/sms/providers/LocalSmsProvider.spec.ts +224 -0
  386. package/src/sms/providers/MemorySmsProvider.spec.ts +193 -0
  387. package/src/thread/primitives/$thread.spec.ts +186 -0
  388. package/src/topic/core/__tests__/shared.ts +144 -0
  389. package/src/topic/core/providers/MemoryTopicProvider.spec.ts +23 -0
  390. package/src/topic/redis/providers/RedisTopicProvider.spec.ts +23 -0
  391. package/src/vite/helpers/importViteReact.ts +13 -0
  392. package/src/vite/index.ts +1 -21
  393. package/src/vite/plugins/viteAlephaDev.ts +32 -5
  394. package/src/vite/plugins/viteAlephaSsrPreload.ts +222 -0
  395. package/src/vite/tasks/buildClient.ts +11 -0
  396. package/src/vite/tasks/buildServer.ts +47 -3
  397. package/src/vite/tasks/devServer.ts +69 -0
  398. package/src/vite/tasks/index.ts +2 -1
  399. package/src/vite/tasks/runAlepha.ts +7 -1
  400. package/src/websocket/__tests__/$websocket-new.spec.ts +195 -0
  401. package/src/websocket/primitives/$channel.spec.ts +30 -0
  402. package/src/cli/assets/viteConfigTs.ts +0 -14
  403. package/src/cli/commands/run.ts +0 -24
  404. package/src/vite/plugins/viteAlepha.ts +0 -37
  405. package/src/vite/plugins/viteAlephaBuild.ts +0 -281
@@ -0,0 +1,52 @@
1
+ import { Alepha } from "alepha";
2
+ import { DateTimeProvider } from "alepha/datetime";
3
+ import { FileSystemProvider } from "alepha/file";
4
+ import { describe, expect, it } from "vitest";
5
+ import { FileJobs, FileService } from "../index.ts";
6
+
7
+ describe("FileJobRegistry", () => {
8
+ const alepha = Alepha.create();
9
+ const jobs = alepha.inject(FileJobs);
10
+ const service = alepha.inject(FileService);
11
+ const dtp = alepha.inject(DateTimeProvider);
12
+ const fs = alepha.inject(FileSystemProvider);
13
+
14
+ const createFile = (
15
+ textOrOpts: string | { text: string; name?: string; type?: string },
16
+ opts?: { name?: string; type?: string },
17
+ ) => {
18
+ if (typeof textOrOpts === "string") {
19
+ return fs.createFile({ text: textOrOpts, ...(opts || {}) });
20
+ }
21
+ return fs.createFile(textOrOpts);
22
+ };
23
+
24
+ it("should remove expired files", { retry: 2 }, async () => {
25
+ const file = createFile("");
26
+
27
+ await Promise.all([
28
+ service.uploadFile(file),
29
+ service.uploadFile(file, {
30
+ expirationDate: new Date().toISOString(),
31
+ }),
32
+ service.uploadFile(file, {
33
+ expirationDate: dtp.now().add(1, "hour").toISOString(),
34
+ }),
35
+ service.uploadFile(file, {
36
+ expirationDate: dtp.now().add(4, "hours").toISOString(),
37
+ }),
38
+ ]);
39
+
40
+ const list = () => service.findFiles().then((it) => it.content);
41
+
42
+ expect(await list()).toHaveLength(4);
43
+
44
+ await jobs.purgeFiles.trigger();
45
+
46
+ expect(await list()).toHaveLength(3);
47
+
48
+ await dtp.travel(2, "hours");
49
+
50
+ expect(await list()).toHaveLength(2); // TODO: fail sometimes here
51
+ });
52
+ });
@@ -0,0 +1,109 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { Alepha, type Service } from "alepha";
3
+ import {
4
+ $bucket,
5
+ FileStorageProvider,
6
+ LocalFileStorageProvider,
7
+ MemoryFileStorageProvider,
8
+ } from "alepha/bucket";
9
+ import { FileSystemProvider } from "alepha/file";
10
+ import { describe, expect, it } from "vitest";
11
+ import { AlephaApiFiles, FileController } from "../index.ts";
12
+
13
+ const testFileServiceOperations = async (
14
+ provider: Service<FileStorageProvider>,
15
+ ) => {
16
+ const alepha = Alepha.create()
17
+ .with({
18
+ provide: FileStorageProvider,
19
+ use: provider,
20
+ })
21
+ .with(AlephaApiFiles);
22
+
23
+ class Assets {
24
+ images = $bucket({
25
+ name: randomUUID(),
26
+ ttl: 1000,
27
+ });
28
+ }
29
+
30
+ const assets = alepha.inject(Assets);
31
+ const ctrl = alepha.inject(FileController);
32
+ const fs = alepha.inject(FileSystemProvider);
33
+
34
+ await alepha.start();
35
+
36
+ const createFile = (
37
+ textOrOpts: string | { text: string; name?: string; type?: string },
38
+ opts?: { name?: string; type?: string },
39
+ ) => {
40
+ if (typeof textOrOpts === "string") {
41
+ return fs.createFile({ text: textOrOpts, ...(opts || {}) });
42
+ }
43
+ return fs.createFile(textOrOpts);
44
+ };
45
+
46
+ await assets.images.upload(
47
+ createFile("Hello World 1", {
48
+ type: "text/plain",
49
+ name: "hello.txt",
50
+ }),
51
+ );
52
+
53
+ const files = await ctrl.findFiles.run({});
54
+
55
+ expect(files.content[0].bucket).toBe(assets.images.name);
56
+
57
+ await ctrl.uploadFile.run({
58
+ query: {
59
+ bucket: assets.images.name,
60
+ },
61
+ body: {
62
+ file: createFile("Hello World 2"),
63
+ },
64
+ });
65
+
66
+ await ctrl.uploadFile.fetch({
67
+ query: {
68
+ bucket: assets.images.name,
69
+ },
70
+ body: {
71
+ file: createFile("Hello World 3"),
72
+ },
73
+ });
74
+
75
+ await ctrl.uploadFile.fetch({
76
+ query: {
77
+ bucket: assets.images.name,
78
+ },
79
+ body: {
80
+ file: createFile("Hello World 4"),
81
+ },
82
+ });
83
+
84
+ const files2 = await ctrl.findFiles.run({});
85
+
86
+ expect(files2.content.length).toBe(4);
87
+
88
+ const response = await ctrl.streamFile.run({
89
+ params: { id: files2.content[1].id },
90
+ });
91
+
92
+ expect(await response.text()).toBe("Hello World 3");
93
+
94
+ const response2 = await ctrl.streamFile.fetch({
95
+ params: { id: files2.content[0].id },
96
+ });
97
+
98
+ expect(await response2.data.text()).toBe("Hello World 4");
99
+ };
100
+
101
+ describe("FileService", () => {
102
+ it("should handle basic file operations with memory storage", async () => {
103
+ await testFileServiceOperations(MemoryFileStorageProvider);
104
+ });
105
+
106
+ it("should handle basic file operations with local storage", async () => {
107
+ await testFileServiceOperations(LocalFileStorageProvider);
108
+ });
109
+ });
@@ -0,0 +1,343 @@
1
+ import { Alepha } from "alepha";
2
+ import { DateTimeProvider, dayjs } from "alepha/datetime";
3
+ import { $logger } from "alepha/logger";
4
+ import { describe, expect, it } from "vitest";
5
+ import { $job, AdminJobController, JobService } from "../index.ts";
6
+
7
+ describe("JobController", () => {
8
+ class App {
9
+ testJob = $job({
10
+ name: "test-job",
11
+ handler: async () => {
12
+ // Test job that is manually triggered
13
+ },
14
+ });
15
+
16
+ dailyJob = $job({
17
+ name: "daily-job",
18
+ handler: async () => {
19
+ // Another test job
20
+ },
21
+ });
22
+ }
23
+
24
+ const setup = async () => {
25
+ const alepha = Alepha.create();
26
+ const app = alepha.inject(App);
27
+ const ctrl = alepha.inject(AdminJobController);
28
+ const service = alepha.inject(JobService);
29
+ const dtp = alepha.inject(DateTimeProvider);
30
+ await alepha.start();
31
+ return { alepha, app, ctrl, service, dtp };
32
+ };
33
+
34
+ describe("getJobs", () => {
35
+ it("should return all job names", async () => {
36
+ const { ctrl } = await setup();
37
+ const jobs = await ctrl.getJobs();
38
+ expect(jobs).toContain("test-job");
39
+ expect(jobs).toContain("daily-job");
40
+ expect(jobs.length).toBeGreaterThanOrEqual(2);
41
+ });
42
+
43
+ it("should return empty array when no jobs exist", async () => {
44
+ const alepha = Alepha.create();
45
+ const ctrl = alepha.inject(AdminJobController);
46
+ await alepha.start();
47
+ const jobs = await ctrl.getJobs();
48
+ expect(jobs).toEqual([]);
49
+ });
50
+ });
51
+
52
+ describe("getJobExecutions", () => {
53
+ it("should return job executions for a specific job", async () => {
54
+ const { app, ctrl } = await setup();
55
+
56
+ // Trigger a job to create execution records
57
+ await app.testJob.trigger();
58
+
59
+ const executions = await ctrl.getJobExecutions({
60
+ query: { job: "test-job" },
61
+ });
62
+
63
+ expect(executions.content.length).toBeGreaterThan(0);
64
+ expect(executions.content[0].job).toBe("test-job");
65
+ });
66
+
67
+ it("should populate finishedAt when job completes", async () => {
68
+ const { app, ctrl } = await setup();
69
+
70
+ await app.testJob.trigger();
71
+
72
+ const executions = await ctrl.getJobExecutions({
73
+ query: { job: "test-job", status: "COMPLETED" },
74
+ });
75
+
76
+ expect(executions.content.length).toBeGreaterThan(0);
77
+ const execution = executions.content[0];
78
+ expect(execution.status).toBe("COMPLETED");
79
+ expect(execution.finishedAt).toBeDefined();
80
+ expect(new Date(execution.finishedAt!).valueOf()).toBeGreaterThan(0);
81
+ });
82
+
83
+ it("should capture logs during job execution", async () => {
84
+ class TestAppWithLogs {
85
+ log = $logger();
86
+
87
+ loggingJob = $job({
88
+ name: "logging-job",
89
+ handler: async () => {
90
+ this.log.info("Starting job execution");
91
+ this.log.info("Processing data");
92
+ this.log.info("Job completed successfully");
93
+ },
94
+ });
95
+ }
96
+
97
+ const alepha = Alepha.create();
98
+ const testApp = alepha.inject(TestAppWithLogs);
99
+ const ctrl = alepha.inject(AdminJobController);
100
+ await alepha.start();
101
+
102
+ await testApp.loggingJob.trigger();
103
+
104
+ const executions = await ctrl.getJobExecutions({
105
+ query: { job: "logging-job" },
106
+ });
107
+
108
+ expect(executions.content.length).toBeGreaterThan(0);
109
+ const execution = executions.content[0];
110
+ expect(execution.logs).toBeDefined();
111
+ expect(Array.isArray(execution.logs)).toBe(true);
112
+ const logInfos = execution.logs?.filter(
113
+ (log: any) => log.level === "INFO",
114
+ );
115
+ expect(logInfos?.length).toBeGreaterThanOrEqual(3);
116
+ expect(logInfos?.[0].message).toBe("Starting job execution");
117
+ expect(logInfos?.[1].message).toBe("Processing data");
118
+ expect(logInfos?.[2].message).toBe("Job completed successfully");
119
+ });
120
+
121
+ it("should capture error and finishedAt when job fails", async () => {
122
+ // Create a separate Alepha instance with a failing job
123
+ class FailingApp {
124
+ failingJob = $job({
125
+ name: "failing-job",
126
+ handler: async () => {
127
+ throw new Error("Intentional test failure");
128
+ },
129
+ });
130
+ }
131
+
132
+ const alepha = Alepha.create();
133
+ const failingApp = alepha.inject(FailingApp);
134
+ const ctrl = alepha.inject(AdminJobController);
135
+ await alepha.start();
136
+
137
+ // Trigger the job (it will fail silently)
138
+ await failingApp.failingJob.trigger().catch(() => {
139
+ // Expected to fail
140
+ });
141
+
142
+ const executions = await ctrl.getJobExecutions({
143
+ query: { job: "failing-job", status: "FAILED" },
144
+ });
145
+
146
+ expect(executions.content.length).toBeGreaterThan(0);
147
+ const execution = executions.content[0];
148
+ expect(execution.status).toBe("FAILED");
149
+ expect(execution.error).toBe("Intentional test failure");
150
+ expect(execution.finishedAt).toBeDefined();
151
+ expect(new Date(execution.finishedAt!).valueOf()).toBeGreaterThan(0);
152
+ });
153
+
154
+ it("should return empty list when job has no executions", async () => {
155
+ const { ctrl } = await setup();
156
+
157
+ const executions = await ctrl.getJobExecutions({
158
+ query: { job: "test-job" },
159
+ });
160
+
161
+ expect(executions.content).toEqual([]);
162
+ expect(executions.page.totalElements).toBe(0);
163
+ });
164
+
165
+ it("should filter executions by status", async () => {
166
+ const { app, ctrl } = await setup();
167
+
168
+ // Trigger job to create STARTED and COMPLETED execution
169
+ await app.testJob.trigger();
170
+
171
+ const allExecutions = await ctrl.getJobExecutions({
172
+ query: { job: "test-job" },
173
+ });
174
+ expect(allExecutions.content.length).toBeGreaterThan(0);
175
+
176
+ const completedExecutions = await ctrl.getJobExecutions({
177
+ query: { job: "test-job", status: "COMPLETED" },
178
+ });
179
+ expect(
180
+ completedExecutions.content.every((e) => e.status === "COMPLETED"),
181
+ ).toBe(true);
182
+ });
183
+
184
+ it("should support pagination", async () => {
185
+ const { app, ctrl } = await setup();
186
+
187
+ // Trigger job multiple times
188
+ await app.testJob.trigger();
189
+ await app.testJob.trigger();
190
+ await app.testJob.trigger();
191
+
192
+ const page1 = await ctrl.getJobExecutions({
193
+ query: { job: "test-job", size: 2, page: 0 },
194
+ });
195
+
196
+ expect(page1.content.length).toBeLessThanOrEqual(2);
197
+ expect(page1.page.totalElements).toBeGreaterThanOrEqual(3);
198
+
199
+ if (page1.page.totalElements && page1.page.totalElements > 2) {
200
+ const page2 = await ctrl.getJobExecutions({
201
+ query: { job: "test-job", size: 2, page: 1 },
202
+ });
203
+ expect(page2.content.length).toBeGreaterThan(0);
204
+ }
205
+ });
206
+
207
+ it("should return executions sorted by creation date descending by default", async () => {
208
+ const { app, ctrl } = await setup();
209
+
210
+ // Trigger job multiple times
211
+ await app.testJob.trigger();
212
+ await app.testJob.trigger();
213
+
214
+ const executions = await ctrl.getJobExecutions({
215
+ query: { job: "test-job" },
216
+ });
217
+
218
+ expect(executions.content.length).toBeGreaterThanOrEqual(2);
219
+
220
+ // Verify descending order
221
+ for (let i = 1; i < executions.content.length; i++) {
222
+ const prev = dayjs(executions.content[i - 1].createdAt);
223
+ const curr = dayjs(executions.content[i].createdAt);
224
+ expect(prev.valueOf()).toBeGreaterThanOrEqual(curr.valueOf());
225
+ }
226
+ });
227
+ });
228
+
229
+ describe("triggerJob", () => {
230
+ it("should trigger a job by name", async () => {
231
+ const { ctrl } = await setup();
232
+
233
+ const result = await ctrl.triggerJob({
234
+ body: { name: "test-job" },
235
+ });
236
+
237
+ expect(result.ok).toBe(true);
238
+ });
239
+
240
+ it("should throw error for non-existent job", async () => {
241
+ const { ctrl } = await setup();
242
+
243
+ await expect(
244
+ ctrl.triggerJob({
245
+ body: { name: "non-existent-job" },
246
+ }),
247
+ ).rejects.toThrow("Job not found: non-existent-job");
248
+ });
249
+
250
+ it("should create execution record when job is triggered", async () => {
251
+ const { ctrl } = await setup();
252
+
253
+ // Get initial execution count
254
+ const initialExecutions = await ctrl.getJobExecutions({
255
+ query: { job: "test-job" },
256
+ });
257
+ const initialCount = initialExecutions.page.totalElements ?? 0;
258
+
259
+ // Trigger job
260
+ await ctrl.triggerJob({
261
+ body: { name: "test-job" },
262
+ });
263
+
264
+ // Verify execution record was created
265
+ const finalExecutions = await ctrl.getJobExecutions({
266
+ query: { job: "test-job" },
267
+ });
268
+ expect(finalExecutions.page.totalElements ?? 0).toBe(initialCount + 1);
269
+ });
270
+ });
271
+
272
+ describe("integration scenarios", () => {
273
+ it("should handle complete job lifecycle", async () => {
274
+ const { ctrl } = await setup();
275
+
276
+ // Get all jobs
277
+ const jobs = await ctrl.getJobs();
278
+ expect(jobs).toContain("test-job");
279
+
280
+ // Trigger job
281
+ const triggerResult = await ctrl.triggerJob({
282
+ body: { name: "test-job" },
283
+ });
284
+ expect(triggerResult.ok).toBe(true);
285
+
286
+ // Get executions
287
+ const executions = await ctrl.getJobExecutions({
288
+ query: { job: "test-job" },
289
+ });
290
+ expect(executions.content.length).toBeGreaterThan(0);
291
+ const execution = executions.content[0];
292
+ expect(execution.job).toBe("test-job");
293
+ expect(execution.status).toBe("COMPLETED");
294
+ expect(execution.finishedAt).toBeDefined();
295
+ expect(execution.createdAt).toBeDefined();
296
+ expect(execution.updatedAt).toBeDefined();
297
+ });
298
+
299
+ it("should handle multiple jobs with different execution statuses", async () => {
300
+ const { app, ctrl } = await setup();
301
+
302
+ // Trigger both jobs
303
+ await app.testJob.trigger();
304
+ await app.dailyJob.trigger();
305
+
306
+ // Get all executions for test-job
307
+ const testJobExecutions = await ctrl.getJobExecutions({
308
+ query: { job: "test-job" },
309
+ });
310
+ expect(testJobExecutions.content.length).toBeGreaterThan(0);
311
+ expect(testJobExecutions.content.every((e) => e.job === "test-job")).toBe(
312
+ true,
313
+ );
314
+
315
+ // Get all executions for daily-job
316
+ const dailyJobExecutions = await ctrl.getJobExecutions({
317
+ query: { job: "daily-job" },
318
+ });
319
+ expect(dailyJobExecutions.content.length).toBeGreaterThan(0);
320
+ expect(
321
+ dailyJobExecutions.content.every((e) => e.job === "daily-job"),
322
+ ).toBe(true);
323
+ });
324
+
325
+ it("should track job execution history over multiple triggers", async () => {
326
+ const { app, ctrl } = await setup();
327
+
328
+ // Trigger job multiple times
329
+ await app.testJob.trigger();
330
+ await app.testJob.trigger();
331
+ await app.testJob.trigger();
332
+
333
+ const executions = await ctrl.getJobExecutions({
334
+ query: { job: "test-job" },
335
+ });
336
+
337
+ expect(executions.page.totalElements).toBeGreaterThanOrEqual(3);
338
+
339
+ // Verify all executions are for the same job
340
+ expect(executions.content.every((e) => e.job === "test-job")).toBe(true);
341
+ });
342
+ });
343
+ });
@@ -5,9 +5,9 @@ import { jobExecutionResourceSchema } from "../schemas/jobExecutionResourceSchem
5
5
  import { triggerJobSchema } from "../schemas/triggerJobSchema.ts";
6
6
  import { JobService } from "../services/JobService.ts";
7
7
 
8
- export class JobController {
8
+ export class AdminJobController {
9
9
  protected readonly url: string = "/jobs";
10
- protected readonly group: string = "jobs";
10
+ protected readonly group: string = "admin:jobs";
11
11
  protected readonly jobService = $inject(JobService);
12
12
 
13
13
  public readonly getJobs = $action({
@@ -1,14 +1,14 @@
1
1
  import { type Static, t } from "alepha";
2
2
  import { logEntrySchema } from "alepha/logger";
3
- import { $entity, pg } from "alepha/orm";
3
+ import { $entity, db } from "alepha/orm";
4
4
 
5
5
  export const jobExecutions = $entity({
6
6
  name: "job_executions",
7
7
  schema: t.object({
8
- id: pg.primaryKey(t.uuid()),
9
- version: pg.version(),
10
- createdAt: pg.createdAt(),
11
- updatedAt: pg.updatedAt(),
8
+ id: db.primaryKey(t.uuid()),
9
+ version: db.version(),
10
+ createdAt: db.createdAt(),
11
+ updatedAt: db.updatedAt(),
12
12
  finishedAt: t.optional(t.datetime()),
13
13
  job: t.string(),
14
14
  status: t.enum(["STARTED", "FAILED", "COMPLETED"]),
@@ -1,11 +1,11 @@
1
1
  import { $module } from "alepha";
2
- import { JobController } from "./controllers/JobController.ts";
2
+ import { AdminJobController } from "./controllers/AdminJobController.ts";
3
3
  import { JobProvider } from "./providers/JobProvider.ts";
4
4
  import { JobService } from "./services/JobService.ts";
5
5
 
6
6
  // ---------------------------------------------------------------------------------------------------------------------
7
7
 
8
- export * from "./controllers/JobController.ts";
8
+ export * from "./controllers/AdminJobController.ts";
9
9
  export * from "./entities/jobExecutions.ts";
10
10
  export * from "./primitives/$job.ts";
11
11
  export * from "./providers/JobProvider.ts";
@@ -26,5 +26,5 @@ export * from "./services/JobService.ts";
26
26
  */
27
27
  export const AlephaApiJobs = $module({
28
28
  name: "alepha.api.jobs",
29
- services: [JobController, JobProvider, JobService],
29
+ services: [AdminJobController, JobProvider, JobService],
30
30
  });