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,12 @@
1
+ import { type Static, t } from "alepha";
2
+
3
+ /**
4
+ * Activate config body schema.
5
+ */
6
+ export const activateConfigBodySchema = t.object({
7
+ version: t.integer({ description: "Version number to activate" }),
8
+ creatorId: t.optional(t.uuid()),
9
+ creatorName: t.optional(t.text()),
10
+ });
11
+
12
+ export type ActivateConfigBody = Static<typeof activateConfigBodySchema>;
@@ -0,0 +1,8 @@
1
+ import { t } from "alepha";
2
+
3
+ /**
4
+ * Check scheduled response schema.
5
+ */
6
+ export const checkScheduledResponseSchema = t.object({
7
+ message: t.text(),
8
+ });
@@ -0,0 +1,13 @@
1
+ import { t } from "alepha";
2
+ import { parameterResponseSchema } from "./parameterResponseSchema.ts";
3
+
4
+ /**
5
+ * Current config response schema.
6
+ */
7
+ export const configCurrentResponseSchema = t.object({
8
+ current: t.optional(parameterResponseSchema),
9
+ next: t.optional(parameterResponseSchema),
10
+ defaultValue: t.optional(t.json()),
11
+ currentValue: t.optional(t.json()),
12
+ schema: t.optional(t.json()),
13
+ });
@@ -0,0 +1,9 @@
1
+ import { t } from "alepha";
2
+ import { parameterResponseSchema } from "./parameterResponseSchema.ts";
3
+
4
+ /**
5
+ * Config history response schema.
6
+ */
7
+ export const configHistoryResponseSchema = t.object({
8
+ versions: t.array(parameterResponseSchema),
9
+ });
@@ -0,0 +1,10 @@
1
+ import { t } from "alepha";
2
+
3
+ /**
4
+ * Config name param schema.
5
+ */
6
+ export const configNameParamSchema = t.object({
7
+ name: t.text({
8
+ description: "Configuration name (e.g., app.features.flags)",
9
+ }),
10
+ });
@@ -0,0 +1,8 @@
1
+ import { t } from "alepha";
2
+
3
+ /**
4
+ * Config names list response schema.
5
+ */
6
+ export const configNamesResponseSchema = t.object({
7
+ names: t.array(t.text()),
8
+ });
@@ -0,0 +1,13 @@
1
+ import { type Static, t } from "alepha";
2
+
3
+ /**
4
+ * Tree node schema for configuration tree navigation.
5
+ */
6
+ export const configTreeNodeSchema = t.object({
7
+ name: t.text(),
8
+ path: t.text(),
9
+ isLeaf: t.boolean(),
10
+ children: t.array(t.any()),
11
+ });
12
+
13
+ export type ConfigTreeNode = Static<typeof configTreeNodeSchema>;
@@ -0,0 +1,9 @@
1
+ import { t } from "alepha";
2
+
3
+ /**
4
+ * Config name and version param schema.
5
+ */
6
+ export const configVersionParamSchema = t.object({
7
+ name: t.text(),
8
+ version: t.integer(),
9
+ });
@@ -0,0 +1,9 @@
1
+ import { t } from "alepha";
2
+ import { parameterResponseSchema } from "./parameterResponseSchema.ts";
3
+
4
+ /**
5
+ * Config version response schema.
6
+ */
7
+ export const configVersionResponseSchema = t.object({
8
+ config: t.optional(parameterResponseSchema),
9
+ });
@@ -0,0 +1,9 @@
1
+ import { t } from "alepha";
2
+ import { parameterResponseSchema } from "./parameterResponseSchema.ts";
3
+
4
+ /**
5
+ * Configs by status response schema.
6
+ */
7
+ export const configsByStatusResponseSchema = t.object({
8
+ configs: t.array(parameterResponseSchema),
9
+ });
@@ -0,0 +1,24 @@
1
+ import { type Static, t } from "alepha";
2
+
3
+ /**
4
+ * Create config version body schema.
5
+ */
6
+ export const createConfigVersionBodySchema = t.object({
7
+ content: t.json({ description: "New configuration content" }),
8
+ schemaHash: t.text({
9
+ description: "Hash of the schema for migration detection",
10
+ }),
11
+ activationDate: t.optional(
12
+ t.datetime({ description: "When to activate (default: now)" }),
13
+ ),
14
+ changeDescription: t.optional(
15
+ t.text({ description: "Description of changes" }),
16
+ ),
17
+ tags: t.optional(t.array(t.text())),
18
+ creatorId: t.optional(t.uuid()),
19
+ creatorName: t.optional(t.text()),
20
+ });
21
+
22
+ export type CreateConfigVersionBody = Static<
23
+ typeof createConfigVersionBodySchema
24
+ >;
@@ -0,0 +1,15 @@
1
+ export * from "./activateConfigBodySchema.ts";
2
+ export * from "./checkScheduledResponseSchema.ts";
3
+ export * from "./configCurrentResponseSchema.ts";
4
+ export * from "./configHistoryResponseSchema.ts";
5
+ export * from "./configNameParamSchema.ts";
6
+ export * from "./configNamesResponseSchema.ts";
7
+ export * from "./configsByStatusResponseSchema.ts";
8
+ export * from "./configTreeNodeSchema.ts";
9
+ export * from "./configVersionParamSchema.ts";
10
+ export * from "./configVersionResponseSchema.ts";
11
+ export * from "./createConfigVersionBodySchema.ts";
12
+ export * from "./parameterResponseSchema.ts";
13
+ export * from "./parameterStatusSchema.ts";
14
+ export * from "./rollbackConfigBodySchema.ts";
15
+ export * from "./statusParamSchema.ts";
@@ -0,0 +1,26 @@
1
+ import { type Static, t } from "alepha";
2
+ import { parameterStatusSchema } from "./parameterStatusSchema.ts";
3
+
4
+ /**
5
+ * Parameter response schema for API responses.
6
+ */
7
+ export const parameterResponseSchema = t.object({
8
+ id: t.uuid(),
9
+ createdAt: t.datetime(),
10
+ updatedAt: t.datetime(),
11
+ name: t.text(),
12
+ content: t.json(),
13
+ schemaHash: t.text(),
14
+ status: parameterStatusSchema,
15
+ activationDate: t.datetime(),
16
+ expiredAt: t.optional(t.datetime()),
17
+ version: t.integer(),
18
+ changeDescription: t.optional(t.text()),
19
+ tags: t.optional(t.array(t.text())),
20
+ creatorId: t.optional(t.uuid()),
21
+ creatorName: t.optional(t.text()),
22
+ previousContent: t.optional(t.json()),
23
+ migrationLog: t.optional(t.text()),
24
+ });
25
+
26
+ export type ParameterResponse = Static<typeof parameterResponseSchema>;
@@ -0,0 +1,13 @@
1
+ import { type Static, t } from "alepha";
2
+
3
+ /**
4
+ * Parameter status enum schema.
5
+ */
6
+ export const parameterStatusSchema = t.enum([
7
+ "expired",
8
+ "current",
9
+ "next",
10
+ "future",
11
+ ]);
12
+
13
+ export type ParameterStatus = Static<typeof parameterStatusSchema>;
@@ -0,0 +1,15 @@
1
+ import { type Static, t } from "alepha";
2
+
3
+ /**
4
+ * Rollback config body schema.
5
+ */
6
+ export const rollbackConfigBodySchema = t.object({
7
+ targetVersion: t.integer({
8
+ description: "Version number to rollback to",
9
+ }),
10
+ changeDescription: t.optional(t.text()),
11
+ creatorId: t.optional(t.uuid()),
12
+ creatorName: t.optional(t.text()),
13
+ });
14
+
15
+ export type RollbackConfigBody = Static<typeof rollbackConfigBodySchema>;
@@ -0,0 +1,9 @@
1
+ import { t } from "alepha";
2
+ import { parameterStatusSchema } from "./parameterStatusSchema.ts";
3
+
4
+ /**
5
+ * Status param schema.
6
+ */
7
+ export const statusParamSchema = t.object({
8
+ status: parameterStatusSchema,
9
+ });
@@ -0,0 +1,369 @@
1
+ import { Alepha } from "alepha";
2
+ import { AlephaApiVerification } from "alepha/api/verifications";
3
+ import { DateTimeProvider } from "alepha/datetime";
4
+ import { AlephaEmail, MemoryEmailProvider } from "alepha/email";
5
+ import { AlephaSecurity } from "alepha/security";
6
+ import { BadRequestError } from "alepha/server";
7
+ import { describe, it } from "vitest";
8
+ import { AlephaApiUsers, UserController, UserService } from "../index.ts";
9
+
10
+ const setup = async () => {
11
+ const alepha = Alepha.create({
12
+ env: { LOG_LEVEL: "error" },
13
+ });
14
+
15
+ alepha.with(AlephaSecurity);
16
+ alepha.with(AlephaEmail);
17
+ alepha.with(AlephaApiVerification);
18
+ alepha.with(AlephaApiUsers);
19
+
20
+ await alepha.start();
21
+
22
+ const emailProvider = alepha.inject(MemoryEmailProvider);
23
+ emailProvider.records = [];
24
+
25
+ return {
26
+ alepha,
27
+ userService: alepha.inject(UserService),
28
+ dateTimeProvider: alepha.inject(DateTimeProvider),
29
+ emailProvider,
30
+ actions: alepha.inject(UserController),
31
+ };
32
+ };
33
+
34
+ // Helper to extract code from email
35
+ const extractCode = (emailBody: string): string => {
36
+ // Code is displayed in the email body as a 6-digit number
37
+ const match = emailBody.match(/(\d{6})/);
38
+ if (!match) throw new Error("Code not found in email");
39
+ return match[1];
40
+ };
41
+
42
+ describe("alepha/api/users - Email Verification", () => {
43
+ it("should successfully request email verification and send email", async ({
44
+ expect,
45
+ }) => {
46
+ const { userService, emailProvider, actions } = await setup();
47
+
48
+ // Create a test user
49
+ const user = await userService.users().create({
50
+ username: "testuser",
51
+ email: "test@example.com",
52
+ roles: ["user"],
53
+ emailVerified: false,
54
+ });
55
+
56
+ // Request email verification
57
+ const result = await actions.requestEmailVerification({
58
+ body: {
59
+ email: "test@example.com",
60
+ },
61
+ });
62
+
63
+ expect(result.success).toBe(true);
64
+ expect(result.message).toContain("verification code has been sent");
65
+
66
+ // Verify email was sent via verification service
67
+ await expect.poll(() => emailProvider.records.length).toBe(1);
68
+ const email = emailProvider.records[0];
69
+ expect(email.to).toBe("test@example.com");
70
+ expect(email.subject).toBe("Verify your email address");
71
+ // Check for 6-digit code in email
72
+ expect(email.body).toMatch(/\d{6}/);
73
+ expect(email.body).toContain("5 minutes"); // Default code verification expiration
74
+ });
75
+
76
+ it("should not reveal if email does not exist", async ({ expect }) => {
77
+ const { emailProvider, actions } = await setup();
78
+
79
+ // Request email verification for non-existent email
80
+ const result = await actions.requestEmailVerification({
81
+ body: {
82
+ email: "nonexistent@example.com",
83
+ },
84
+ });
85
+
86
+ // Should return success to prevent email enumeration
87
+ expect(result.success).toBe(true);
88
+ expect(result.message).toContain("verification code has been sent");
89
+
90
+ // But no email should be sent
91
+ expect(emailProvider.records).toHaveLength(0);
92
+ });
93
+
94
+ it("should not send email if already verified", async ({ expect }) => {
95
+ const { userService, emailProvider, actions } = await setup();
96
+
97
+ // Create a user with already verified email
98
+ await userService.users().create({
99
+ username: "verifieduser",
100
+ email: "verified@example.com",
101
+ roles: ["user"],
102
+ emailVerified: true,
103
+ });
104
+
105
+ // Request email verification
106
+ const result = await actions.requestEmailVerification({
107
+ body: {
108
+ email: "verified@example.com",
109
+ },
110
+ });
111
+
112
+ // Should return success but not send email
113
+ expect(result.success).toBe(true);
114
+ expect(emailProvider.records).toHaveLength(0);
115
+ });
116
+
117
+ it("should successfully verify email with valid token", async ({
118
+ expect,
119
+ }) => {
120
+ const { userService, emailProvider, actions } = await setup();
121
+
122
+ // Create a test user
123
+ const user = await userService.users().create({
124
+ username: "testuser",
125
+ email: "test@example.com",
126
+ roles: ["user"],
127
+ emailVerified: false,
128
+ });
129
+
130
+ // Request email verification
131
+ await userService.requestEmailVerification("test@example.com");
132
+
133
+ // Extract code from email
134
+ await expect.poll(() => emailProvider.records.length).toBe(1);
135
+ const token = extractCode(emailProvider.records[0].body);
136
+
137
+ // Verify email
138
+ const result = await actions.verifyEmail({
139
+ body: {
140
+ email: "test@example.com",
141
+ token,
142
+ },
143
+ });
144
+
145
+ expect(result.success).toBe(true);
146
+ expect(result.message).toContain("Email has been verified successfully");
147
+
148
+ // Check that emailVerified is now true
149
+ const updatedUser = await userService.users().findOne({
150
+ where: { id: { eq: user.id } },
151
+ });
152
+ expect(updatedUser.emailVerified).toBe(true);
153
+ });
154
+
155
+ it("should reject invalid verification token", async ({ expect }) => {
156
+ const { userService, actions } = await setup();
157
+
158
+ // Create a test user
159
+ await userService.users().create({
160
+ username: "testuser",
161
+ email: "test@example.com",
162
+ roles: ["user"],
163
+ emailVerified: false,
164
+ });
165
+
166
+ // Attempt to verify with invalid token
167
+ await expect(
168
+ actions.verifyEmail({
169
+ body: {
170
+ email: "test@example.com",
171
+ token: "550e8400-e29b-41d4-a716-446655440000",
172
+ },
173
+ }),
174
+ ).rejects.toThrowError(BadRequestError);
175
+ });
176
+
177
+ it("should reject expired verification token", async ({ expect }) => {
178
+ const { userService, dateTimeProvider, emailProvider, actions } =
179
+ await setup();
180
+
181
+ // Create a test user
182
+ await userService.users().create({
183
+ username: "testuser",
184
+ email: "test@example.com",
185
+ roles: ["user"],
186
+ emailVerified: false,
187
+ });
188
+
189
+ // Request email verification
190
+ await userService.requestEmailVerification("test@example.com");
191
+
192
+ // Extract code
193
+ await expect.poll(() => emailProvider.records.length).toBe(1);
194
+ const token = extractCode(emailProvider.records[0].body);
195
+
196
+ // Travel forward in time to expire the token (default expiration is 5 minutes for code verification)
197
+ dateTimeProvider.travel(6, "minutes");
198
+
199
+ // Attempt to verify with expired token
200
+ await expect(
201
+ actions.verifyEmail({
202
+ body: {
203
+ email: "test@example.com",
204
+ token,
205
+ },
206
+ }),
207
+ ).rejects.toThrowError(BadRequestError);
208
+ });
209
+
210
+ it("should not allow token reuse after successful verification", async ({
211
+ expect,
212
+ }) => {
213
+ const { userService, emailProvider, actions } = await setup();
214
+
215
+ // Create a test user
216
+ await userService.users().create({
217
+ username: "testuser",
218
+ email: "test@example.com",
219
+ roles: ["user"],
220
+ emailVerified: false,
221
+ });
222
+
223
+ // Request email verification
224
+ await userService.requestEmailVerification("test@example.com");
225
+
226
+ // Extract code
227
+ await expect.poll(() => emailProvider.records.length).toBe(1);
228
+ const token = extractCode(emailProvider.records[0].body);
229
+
230
+ // Verify email
231
+ await actions.verifyEmail({
232
+ body: {
233
+ email: "test@example.com",
234
+ token,
235
+ },
236
+ });
237
+
238
+ // Attempt to use the same token again should fail
239
+ await expect(
240
+ actions.verifyEmail({
241
+ body: {
242
+ email: "test@example.com",
243
+ token,
244
+ },
245
+ }),
246
+ ).rejects.toThrowError(BadRequestError);
247
+ });
248
+
249
+ it("should check email verification status", async ({ expect }) => {
250
+ const { userService, actions } = await setup();
251
+
252
+ // Create a test user with unverified email
253
+ await userService.users().create({
254
+ username: "unverifieduser",
255
+ email: "unverified@example.com",
256
+ roles: ["user"],
257
+ emailVerified: false,
258
+ });
259
+
260
+ // Create a test user with verified email
261
+ await userService.users().create({
262
+ username: "verifieduser",
263
+ email: "verified@example.com",
264
+ roles: ["user"],
265
+ emailVerified: true,
266
+ });
267
+
268
+ // Check unverified email
269
+ const unverifiedResult = await actions.checkEmailVerification({
270
+ query: { email: "unverified@example.com" },
271
+ });
272
+ expect(unverifiedResult.verified).toBe(false);
273
+
274
+ // Check verified email
275
+ const verifiedResult = await actions.checkEmailVerification({
276
+ query: { email: "verified@example.com" },
277
+ });
278
+ expect(verifiedResult.verified).toBe(true);
279
+
280
+ // Check non-existent email
281
+ const nonExistentResult = await actions.checkEmailVerification({
282
+ query: { email: "nonexistent@example.com" },
283
+ });
284
+ expect(nonExistentResult.verified).toBe(false);
285
+ });
286
+
287
+ it("should respect rate limiting on verification requests", async ({
288
+ expect,
289
+ }) => {
290
+ const { userService, dateTimeProvider, emailProvider, actions } =
291
+ await setup();
292
+
293
+ // Create a test user
294
+ await userService.users().create({
295
+ username: "testuser",
296
+ email: "test@example.com",
297
+ roles: ["user"],
298
+ emailVerified: false,
299
+ });
300
+
301
+ // Request email verification multiple times within cooldown period
302
+ await actions.requestEmailVerification({
303
+ body: {
304
+ email: "test@example.com",
305
+ },
306
+ });
307
+
308
+ await expect.poll(() => emailProvider.records.length).toBe(1);
309
+
310
+ // Second request should be silently ignored (cooldown)
311
+ await actions.requestEmailVerification({
312
+ body: {
313
+ email: "test@example.com",
314
+ },
315
+ });
316
+
317
+ // Still only 1 email
318
+ expect(emailProvider.records.length).toBe(1);
319
+
320
+ // Wait for cooldown to pass (90 seconds default)
321
+ dateTimeProvider.travel(91, "seconds");
322
+
323
+ // Now should work
324
+ await actions.requestEmailVerification({
325
+ body: {
326
+ email: "test@example.com",
327
+ },
328
+ });
329
+
330
+ await expect.poll(() => emailProvider.records.length).toBe(2);
331
+ });
332
+
333
+ it("should correctly identify verified vs unverified users using isEmailVerified", async ({
334
+ expect,
335
+ }) => {
336
+ const { userService } = await setup();
337
+
338
+ // Create users with different verification statuses
339
+ await userService.users().create({
340
+ username: "unverifieduser",
341
+ email: "unverified@example.com",
342
+ roles: ["user"],
343
+ emailVerified: false,
344
+ });
345
+
346
+ await userService.users().create({
347
+ username: "verifieduser",
348
+ email: "verified@example.com",
349
+ roles: ["user"],
350
+ emailVerified: true,
351
+ });
352
+
353
+ // Check verification status
354
+ const unverifiedStatus = await userService.isEmailVerified(
355
+ "unverified@example.com",
356
+ );
357
+ expect(unverifiedStatus).toBe(false);
358
+
359
+ const verifiedStatus = await userService.isEmailVerified(
360
+ "verified@example.com",
361
+ );
362
+ expect(verifiedStatus).toBe(true);
363
+
364
+ const nonExistentStatus = await userService.isEmailVerified(
365
+ "nonexistent@example.com",
366
+ );
367
+ expect(nonExistentStatus).toBe(false);
368
+ });
369
+ });