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,129 @@
1
+ import { Alepha } from "alepha";
2
+ import { beforeEach, describe, it } from "vitest";
3
+ import { $action, HttpClient, HttpError, ServerProvider } from "../index.ts";
4
+
5
+ class TestApp {
6
+ // HttpError with custom message
7
+ httpError = $action({
8
+ handler: () => {
9
+ throw new HttpError({
10
+ message: "Custom error message",
11
+ status: 400,
12
+ });
13
+ },
14
+ });
15
+
16
+ // Generic Error without status (500)
17
+ genericError = $action({
18
+ handler: () => {
19
+ throw new Error("Something went wrong");
20
+ },
21
+ });
22
+ }
23
+
24
+ describe("ServerRouterProvider - requestId", () => {
25
+ let alepha: Alepha;
26
+ let client: HttpClient;
27
+ let hostname: string;
28
+
29
+ beforeEach(async () => {
30
+ alepha = Alepha.create().with(TestApp);
31
+ client = alepha.inject(HttpClient);
32
+ await alepha.start();
33
+ hostname = alepha.inject(ServerProvider).hostname;
34
+ });
35
+
36
+ it("should include requestId in raw HTTP error response for HttpError", async ({
37
+ expect,
38
+ }) => {
39
+ // Make raw HTTP request to see the actual JSON response
40
+ const response = await fetch(`${hostname}/api/httpError`, {
41
+ headers: {
42
+ "x-request-id": "test-request-123",
43
+ },
44
+ });
45
+
46
+ expect(response.status).toBe(400);
47
+
48
+ const responseText = await response.text();
49
+ const responseJson = JSON.parse(responseText);
50
+
51
+ // Check that the raw HTTP response includes requestId
52
+ expect(responseJson).toMatchObject({
53
+ message: "Custom error message",
54
+ status: 400,
55
+ error: "BadRequestError",
56
+ requestId: "test-request-123",
57
+ });
58
+ });
59
+
60
+ it("should include requestId in raw HTTP error response for generic error", async ({
61
+ expect,
62
+ }) => {
63
+ // Make raw HTTP request to see the actual JSON response
64
+ const response = await fetch(`${hostname}/api/genericError`, {
65
+ headers: {
66
+ "x-request-id": "test-request-789",
67
+ },
68
+ });
69
+
70
+ expect(response.status).toBe(500);
71
+
72
+ const responseText = await response.text();
73
+ const responseJson = JSON.parse(responseText);
74
+
75
+ // Check that the raw HTTP response includes requestId
76
+ expect(responseJson).toMatchObject({
77
+ status: 500,
78
+ error: "InternalServerError",
79
+ message: "Something went wrong",
80
+ requestId: "test-request-789",
81
+ });
82
+ });
83
+
84
+ it("should auto-generate requestId in raw response when not provided", async ({
85
+ expect,
86
+ }) => {
87
+ // Make raw HTTP request without providing requestId
88
+ const response = await fetch(`${hostname}/api/genericError`);
89
+
90
+ expect(response.status).toBe(500);
91
+
92
+ const responseText = await response.text();
93
+ const responseJson = JSON.parse(responseText);
94
+
95
+ // Check that the raw HTTP response includes an auto-generated requestId
96
+ expect(responseJson).toMatchObject({
97
+ status: 500,
98
+ error: "InternalServerError",
99
+ message: "Something went wrong",
100
+ });
101
+
102
+ // Should have a requestId even when not provided in headers
103
+ expect(responseJson.requestId).toBeDefined();
104
+ expect(typeof responseJson.requestId).toBe("string");
105
+ expect(responseJson.requestId.length).toBeGreaterThan(0);
106
+ });
107
+
108
+ it("should properly handle error with requestId through HttpClient", async ({
109
+ expect,
110
+ }) => {
111
+ try {
112
+ await client.fetch(`${hostname}/api/httpError`, {
113
+ headers: {
114
+ "x-request-id": "test-request-client",
115
+ },
116
+ });
117
+ // Should not reach here
118
+ expect(true).toBe(false);
119
+ } catch (error) {
120
+ if (error instanceof HttpError) {
121
+ const errorJson = HttpError.toJSON(error);
122
+ expect(errorJson.requestId).toBe("test-request-client");
123
+ } else {
124
+ // For now, let's see what we actually get
125
+ expect(error).toBeInstanceOf(Error);
126
+ }
127
+ }
128
+ });
129
+ });
@@ -0,0 +1,191 @@
1
+ import { Alepha, t } from "alepha";
2
+ import { FileSystemProvider } from "alepha/file";
3
+ import { describe, test } from "vitest";
4
+ import { $action } from "../index.ts";
5
+
6
+ describe("$action", () => {
7
+ test("should expose api", async ({ expect }) => {
8
+ class Api {
9
+ hello = $action({
10
+ schema: {
11
+ params: t.object({
12
+ name: t.text(),
13
+ }),
14
+ query: t.object({
15
+ transform: t.optional(t.enum(["uppercase"])),
16
+ }),
17
+ response: t.object({
18
+ message: t.text(),
19
+ }),
20
+ },
21
+ handler: ({ params, query }) => {
22
+ const message = `Hello ${params.name}`;
23
+ if (query.transform === "uppercase") {
24
+ return {
25
+ message: message.toUpperCase(),
26
+ };
27
+ }
28
+ return { message };
29
+ },
30
+ });
31
+ }
32
+
33
+ const alepha = Alepha.create();
34
+ const app = alepha.inject(Api);
35
+ await alepha.start();
36
+
37
+ expect(await app.hello.run({ params: { name: "John" } })).toStrictEqual({
38
+ message: "Hello John",
39
+ });
40
+
41
+ expect(
42
+ await app.hello.run({
43
+ params: { name: "John" },
44
+ query: { transform: "uppercase" },
45
+ }),
46
+ ).toStrictEqual({
47
+ message: "HELLO JOHN",
48
+ });
49
+
50
+ expect(
51
+ await app.hello.fetch({ params: { name: "John" } }).then((it) => it.data),
52
+ ).toStrictEqual({
53
+ message: "Hello John",
54
+ });
55
+
56
+ expect(
57
+ await app.hello
58
+ .fetch({
59
+ params: { name: "John" },
60
+ query: { transform: "uppercase" },
61
+ })
62
+ .then((it) => it.data),
63
+ ).toStrictEqual({
64
+ message: "HELLO JOHN",
65
+ });
66
+ });
67
+
68
+ test("should not be exposed when disabled", async ({ expect }) => {
69
+ const alepha = Alepha.create();
70
+ class TestApp {
71
+ a1 = $action({
72
+ handler: () => "ok:a1",
73
+ });
74
+ a2 = $action({
75
+ handler: () => "ok:a2",
76
+ disabled: true,
77
+ });
78
+ }
79
+ const app = alepha.inject(TestApp);
80
+ await alepha.start();
81
+
82
+ expect(await app.a1.fetch({}).then((it) => it.data)).toBe("ok:a1");
83
+ expect(await app.a2.fetch({}).then((it) => it.data)).toBe("Not Found");
84
+ // note: $action disabled is callable locally
85
+ expect(await app.a2.run({})).toBe("ok:a2");
86
+ });
87
+
88
+ test("should return nothing", async ({ expect }) => {
89
+ const alepha = Alepha.create();
90
+ class TestApp {
91
+ test = $action({
92
+ schema: {
93
+ response: t.void(), // force no response
94
+ },
95
+ handler: () => {},
96
+ });
97
+ }
98
+ const app = alepha.inject(TestApp);
99
+ await alepha.start();
100
+
101
+ expect(await app.test.run({})).toStrictEqual(undefined);
102
+ expect(await app.test.fetch({}).then((it) => it.data)).toStrictEqual(
103
+ undefined,
104
+ );
105
+
106
+ const response = await app.test.fetch({});
107
+ expect(response.status).toBe(204); // No Content
108
+ });
109
+
110
+ test("should return an object", async ({ expect }) => {
111
+ const alepha = Alepha.create();
112
+ class TestApp {
113
+ test = $action({
114
+ schema: {
115
+ response: t.json(),
116
+ },
117
+ handler: () => ({
118
+ ok: true,
119
+ }),
120
+ });
121
+ }
122
+ const app = alepha.inject(TestApp);
123
+ await alepha.start();
124
+
125
+ expect(await app.test()).toStrictEqual({ ok: true });
126
+ expect(await app.test.run({})).toStrictEqual({ ok: true });
127
+ expect(await app.test.fetch({}).then((it) => it.data)).toStrictEqual({
128
+ ok: true,
129
+ });
130
+ });
131
+
132
+ test("should return a file", async ({ expect }) => {
133
+ const alepha = Alepha.create();
134
+ const fileSystem = alepha.inject(FileSystemProvider);
135
+ class TestApp {
136
+ test = $action({
137
+ schema: {
138
+ response: t.file(), // expect a file response
139
+ },
140
+ handler: () =>
141
+ fileSystem.createFile({
142
+ buffer: Buffer.from("hello"),
143
+ name: "hello.txt",
144
+ type: "text/plain",
145
+ }),
146
+ });
147
+ }
148
+ const app = alepha.inject(TestApp);
149
+ await alepha.start();
150
+
151
+ expect(await app.test().then((it) => it.text())).toBe("hello");
152
+ expect(await app.test.run().then((it) => it.text())).toBe("hello");
153
+ expect(await app.test.fetch({}).then((it) => it.data.text())).toBe("hello");
154
+
155
+ const file = await app.test.run({});
156
+ expect(file.name).toBe("hello.txt");
157
+ expect(file.type).toBe("text/plain");
158
+ });
159
+
160
+ test("should filter fields", async ({ expect }) => {
161
+ const alepha = Alepha.create();
162
+ const fileSystem = alepha.inject(FileSystemProvider);
163
+ class TestApp {
164
+ test = $action({
165
+ schema: {
166
+ body: t.object({
167
+ extra: t.text(),
168
+ }),
169
+ response: t.string(),
170
+ },
171
+ handler: ({ body }) => JSON.stringify(body),
172
+ });
173
+ }
174
+ const app = alepha.inject(TestApp);
175
+ await alepha.start();
176
+
177
+ expect(
178
+ await app.test.run({
179
+ body: { extra: "some extra", invalid: "nope" },
180
+ } as any),
181
+ ).toBe(JSON.stringify({ extra: "some extra" }));
182
+
183
+ expect(
184
+ await app.test
185
+ .fetch({
186
+ body: { extra: "some extra", invalid: "nope" },
187
+ } as any)
188
+ .then((it) => it.data),
189
+ ).toBe(JSON.stringify({ extra: "some extra" }));
190
+ });
191
+ });
@@ -0,0 +1,65 @@
1
+ import { Alepha, t } from "alepha";
2
+ import { describe, test } from "vitest";
3
+ import { $route, ServerProvider } from "../index.ts";
4
+
5
+ describe("$route", () => {
6
+ test("should return the correct route", async ({ expect }) => {
7
+ const alepha = Alepha.create();
8
+
9
+ class TestApp {
10
+ $route = $route({
11
+ path: "/hello",
12
+ handler: () => "OK",
13
+ });
14
+ }
15
+
16
+ await alepha.with(TestApp).start();
17
+
18
+ const resp = await fetch(`${alepha.inject(ServerProvider).hostname}/hello`);
19
+ expect(await resp.text()).toBe("OK");
20
+ });
21
+
22
+ test("should return the correct route with queryParams", async ({
23
+ expect,
24
+ }) => {
25
+ const alepha = Alepha.create();
26
+
27
+ class TestApp {
28
+ $route = $route({
29
+ path: "/hello",
30
+ schema: {
31
+ query: t.object({
32
+ a: t.optional(t.text()),
33
+ b: t.optional(t.array(t.text())),
34
+ c: t.optional(
35
+ t.object({
36
+ d: t.text(),
37
+ }),
38
+ ),
39
+ }),
40
+ },
41
+ handler: ({ query }) => JSON.stringify({ query }),
42
+ });
43
+ }
44
+
45
+ await alepha.with(TestApp).start();
46
+
47
+ const resp = await fetch(
48
+ `${alepha.inject(ServerProvider).hostname}/hello?a=1&b=["HELLO","WORLD"]&c=${encodeURIComponent(
49
+ JSON.stringify({
50
+ d: "e",
51
+ }),
52
+ )}`,
53
+ );
54
+
55
+ expect(await resp.json()).toEqual({
56
+ query: {
57
+ a: "1",
58
+ b: ["HELLO", "WORLD"],
59
+ c: {
60
+ d: "e",
61
+ },
62
+ },
63
+ });
64
+ });
65
+ });
@@ -0,0 +1,93 @@
1
+ import { Alepha, t } from "alepha";
2
+ import { describe, it } from "vitest";
3
+ import { $action, HttpError } from "../index.ts";
4
+
5
+ describe("ServerBodyParserProvider", () => {
6
+ it("should handle simple body", async ({ expect }) => {
7
+ const alepha = Alepha.create();
8
+
9
+ class TestApp {
10
+ json = $action({
11
+ schema: {
12
+ body: t.object({
13
+ message: t.text(),
14
+ }),
15
+ response: t.object({
16
+ received: t.text(),
17
+ }),
18
+ },
19
+ handler: ({ body }) => ({ received: body.message }),
20
+ });
21
+ string = $action({
22
+ schema: {
23
+ body: t.text(),
24
+ response: t.object({
25
+ received: t.text(),
26
+ }),
27
+ },
28
+ handler: ({ body }) => ({ received: body }),
29
+ });
30
+ }
31
+
32
+ const app = alepha.inject(TestApp);
33
+ await alepha.start();
34
+
35
+ expect(
36
+ await app.json.run({
37
+ body: { message: "Hello, World!" },
38
+ }),
39
+ ).toEqual({
40
+ received: "Hello, World!",
41
+ });
42
+
43
+ expect(app.json.getBodyContentType()).toBe("application/json");
44
+
45
+ expect(
46
+ await app.string.run({
47
+ body: "Hello, World!",
48
+ }),
49
+ ).toEqual({
50
+ received: "Hello, World!",
51
+ });
52
+
53
+ expect(app.string.getBodyContentType()).toBe("text/plain");
54
+ });
55
+
56
+ it("should reject big payload", async ({ expect }) => {
57
+ const alepha = Alepha.create();
58
+
59
+ class TestApp {
60
+ test = $action({
61
+ schema: {
62
+ body: t.object({
63
+ message: t.text({
64
+ maxLength: 1000000, // allow up to 1 million characters (for http client validation)
65
+ }),
66
+ }),
67
+ response: t.object({
68
+ received: t.text(),
69
+ }),
70
+ },
71
+ handler: ({ body }) => {
72
+ return { received: body.message };
73
+ },
74
+ });
75
+ }
76
+
77
+ const app = alepha.inject(TestApp);
78
+ await alepha.start();
79
+
80
+ expect(
81
+ await app.test
82
+ .fetch({
83
+ body: { message: "A".repeat(1000000) },
84
+ })
85
+ .catch((e) => HttpError.toJSON(e)),
86
+ ).toEqual({
87
+ error: "PayloadTooLargeError",
88
+ status: 413,
89
+ message: "Request body size limit exceeded",
90
+ requestId: expect.any(String),
91
+ });
92
+ });
93
+ });
@@ -0,0 +1,100 @@
1
+ import { Alepha } from "alepha";
2
+ import {
3
+ $logger,
4
+ LogDestinationProvider,
5
+ MemoryDestinationProvider,
6
+ } from "alepha/logger";
7
+ import { beforeEach, describe, it } from "vitest";
8
+ import {
9
+ $action,
10
+ AlephaServer,
11
+ HttpError,
12
+ ServerLoggerProvider,
13
+ } from "../index.ts";
14
+
15
+ class App {
16
+ log = $logger();
17
+ ping = $action({
18
+ handler: () => {
19
+ this.log.info("!!");
20
+ return "pong";
21
+ },
22
+ });
23
+ silent = $action({
24
+ silent: true,
25
+ handler: () => {
26
+ this.log.info("this message should be logged");
27
+ return "silent";
28
+ },
29
+ });
30
+ error = $action({
31
+ handler: () => {
32
+ throw new HttpError({
33
+ message: "Sorry",
34
+ status: 400,
35
+ });
36
+ },
37
+ });
38
+ }
39
+
40
+ const alepha = Alepha.create({
41
+ env: {
42
+ LOG_LEVEL: "info",
43
+ },
44
+ })
45
+ .with({
46
+ provide: LogDestinationProvider,
47
+ use: MemoryDestinationProvider,
48
+ })
49
+ .with(AlephaServer)
50
+ .with(ServerLoggerProvider);
51
+
52
+ const app = alepha.inject(App);
53
+ const log = alepha.inject(MemoryDestinationProvider);
54
+
55
+ describe("ServerLoggerProvider", () => {
56
+ beforeEach(() => {
57
+ log.clear();
58
+ });
59
+
60
+ it("should log incoming request, custom logs, and request completed for ok response", async ({
61
+ expect,
62
+ }) => {
63
+ expect(log.logs.length).toBe(0);
64
+ const response = await app.ping.fetch();
65
+ expect(response.data).toBe("pong");
66
+ expect(log.logs[0].message).toBe("Incoming request");
67
+ expect(log.logs[1].message).toBe("!!");
68
+ expect(log.logs[2].message).toBe("Request completed");
69
+ });
70
+
71
+ it("should log incoming request, failure, and completion for error response", async ({
72
+ expect,
73
+ }) => {
74
+ expect(log.logs.length).toBe(0);
75
+ const response = await app.error
76
+ .fetch()
77
+ .then((it) => it.data)
78
+ .catch((e) => HttpError.toJSON(e));
79
+
80
+ expect(response).toEqual({
81
+ message: "Sorry",
82
+ status: 400,
83
+ error: "BadRequestError",
84
+ requestId: expect.any(String),
85
+ });
86
+ expect(log.logs[0].message).toBe("Incoming request");
87
+ expect(log.logs[1].message).toBe("Request has failed");
88
+ expect(log.logs[2].message).toBe("Request completed");
89
+ });
90
+
91
+ it("should not log request lifecycle for silent actions but still log custom messages", async ({
92
+ expect,
93
+ }) => {
94
+ expect(log.logs.length).toBe(0);
95
+ const response = await app.silent.fetch();
96
+ expect(response.data).toBe("silent");
97
+ expect(log.logs[0].message).toBe("this message should be logged");
98
+ expect(log.logs.length).toBe(1);
99
+ });
100
+ });
@@ -203,7 +203,9 @@ export class ServerProvider {
203
203
  }
204
204
 
205
205
  if (Buffer.isBuffer(response.body)) {
206
- ev.res = new Response(response.body.buffer as ArrayBuffer, {
206
+ // Use Uint8Array to avoid Buffer pooling issues where .buffer returns
207
+ // the entire underlying ArrayBuffer which may be larger than the actual data
208
+ ev.res = new Response(new Uint8Array(response.body), {
207
209
  status: response.status,
208
210
  headers: response.headers,
209
211
  });
@@ -0,0 +1,123 @@
1
+ import { Alepha } from "alepha";
2
+ import { describe, test } from "vitest";
3
+ import {
4
+ $route,
5
+ BadRequestError,
6
+ HttpClient,
7
+ HttpError,
8
+ ServerProvider,
9
+ } from "../index.ts";
10
+
11
+ describe("HttpClient", () => {
12
+ test("should fetch a URL", async ({ expect }) => {
13
+ const alepha = Alepha.create();
14
+ class TestApp {
15
+ root = $route({
16
+ path: "/",
17
+ handler: () => "Hello, World!",
18
+ });
19
+ }
20
+ const client = alepha.with(TestApp).inject(HttpClient);
21
+ await alepha.start();
22
+
23
+ const resp = await client.fetch<string>(
24
+ `${alepha.inject(ServerProvider).hostname}`,
25
+ );
26
+
27
+ // response looks like Axios response
28
+ expect(resp.data).toBe("Hello, World!");
29
+ });
30
+
31
+ test("should throw on Error", async ({ expect }) => {
32
+ const alepha = Alepha.create();
33
+ class TestApp {
34
+ root = $route({
35
+ path: "/",
36
+ handler: () => {
37
+ throw new BadRequestError();
38
+ },
39
+ });
40
+ }
41
+ const client = alepha.with(TestApp).inject(HttpClient);
42
+ await alepha.start();
43
+
44
+ const resp = await client
45
+ .fetch<string>(`${alepha.inject(ServerProvider).hostname}`)
46
+ .catch((e) => e);
47
+
48
+ expect(resp).toBeInstanceOf(HttpError);
49
+ expect(HttpError.toJSON(resp)).toEqual({
50
+ error: "BadRequestError",
51
+ message: "Invalid request body",
52
+ status: 400,
53
+ requestId: expect.any(String),
54
+ });
55
+ });
56
+
57
+ test("should handle empty query params", async ({ expect }) => {
58
+ const alepha = Alepha.create();
59
+ const client = alepha.inject(HttpClient);
60
+ await alepha.start();
61
+
62
+ expect(client.queryParams("", {}, {})).toEqual("");
63
+ });
64
+
65
+ test("should handle simple query params", async ({ expect }) => {
66
+ const alepha = Alepha.create();
67
+ const client = alepha.inject(HttpClient);
68
+ await alepha.start();
69
+
70
+ expect(
71
+ client.queryParams(
72
+ "",
73
+ {},
74
+ {
75
+ query: {
76
+ hello: "world",
77
+ a: "b",
78
+ },
79
+ },
80
+ ),
81
+ ).toEqual("?hello=world&a=b");
82
+ });
83
+
84
+ test("should handle undefined query params", async ({ expect }) => {
85
+ const alepha = Alepha.create();
86
+ const client = alepha.inject(HttpClient);
87
+ await alepha.start();
88
+
89
+ expect(
90
+ client.queryParams(
91
+ "",
92
+ {},
93
+ {
94
+ query: {
95
+ hello: undefined as any,
96
+ a: "b",
97
+ },
98
+ },
99
+ ),
100
+ ).toEqual("?a=b");
101
+ });
102
+
103
+ test("should handle json", async ({ expect }) => {
104
+ const alepha = Alepha.create();
105
+ const client = alepha.inject(HttpClient);
106
+ await alepha.start();
107
+
108
+ expect(
109
+ client.queryParams(
110
+ "",
111
+ {},
112
+ {
113
+ query: {
114
+ tags: ["a", "b"],
115
+ user: { name: "john" },
116
+ },
117
+ },
118
+ ),
119
+ ).toEqual(
120
+ `?tags=${encodeURIComponent(JSON.stringify(["a", "b"]))}&user=${encodeURIComponent(JSON.stringify({ name: "john" }))}`,
121
+ );
122
+ });
123
+ });