alepha 0.14.1 → 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 (402) hide show
  1. package/README.md +3 -3
  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 +784 -784
  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 +57 -57
  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 +165 -165
  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 +583 -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 +281 -276
  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 +778 -764
  35. package/dist/api/users/index.d.ts.map +1 -1
  36. package/dist/api/users/index.js +831 -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 +125 -125
  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/batch/index.js.map +1 -1
  45. package/dist/bin/index.d.ts +1 -2
  46. package/dist/bin/index.js +0 -1
  47. package/dist/bin/index.js.map +1 -1
  48. package/dist/cache/core/index.js.map +1 -1
  49. package/dist/cli/index.d.ts +249 -218
  50. package/dist/cli/index.d.ts.map +1 -1
  51. package/dist/cli/index.js +951 -821
  52. package/dist/cli/index.js.map +1 -1
  53. package/dist/command/index.d.ts +40 -0
  54. package/dist/command/index.d.ts.map +1 -1
  55. package/dist/command/index.js +97 -17
  56. package/dist/command/index.js.map +1 -1
  57. package/dist/core/index.browser.js +14 -18
  58. package/dist/core/index.browser.js.map +1 -1
  59. package/dist/core/index.d.ts +29 -0
  60. package/dist/core/index.d.ts.map +1 -1
  61. package/dist/core/index.js +21 -24
  62. package/dist/core/index.js.map +1 -1
  63. package/dist/core/index.native.js +21 -24
  64. package/dist/core/index.native.js.map +1 -1
  65. package/dist/datetime/index.js.map +1 -1
  66. package/dist/fake/index.js +195 -168
  67. package/dist/fake/index.js.map +1 -1
  68. package/dist/file/index.d.ts +8 -0
  69. package/dist/file/index.d.ts.map +1 -1
  70. package/dist/file/index.js +3 -0
  71. package/dist/file/index.js.map +1 -1
  72. package/dist/lock/redis/index.js.map +1 -1
  73. package/dist/logger/index.js.map +1 -1
  74. package/dist/mcp/index.d.ts.map +1 -1
  75. package/dist/mcp/index.js.map +1 -1
  76. package/dist/orm/index.browser.js +26 -5
  77. package/dist/orm/index.browser.js.map +1 -1
  78. package/dist/orm/index.d.ts +146 -121
  79. package/dist/orm/index.d.ts.map +1 -1
  80. package/dist/orm/index.js +49 -24
  81. package/dist/orm/index.js.map +1 -1
  82. package/dist/redis/index.js.map +1 -1
  83. package/dist/retry/index.js.map +1 -1
  84. package/dist/router/index.js.map +1 -1
  85. package/dist/scheduler/index.d.ts +6 -6
  86. package/dist/scheduler/index.js.map +1 -1
  87. package/dist/security/index.d.ts +29 -29
  88. package/dist/security/index.d.ts.map +1 -1
  89. package/dist/security/index.js +1 -1
  90. package/dist/security/index.js.map +1 -1
  91. package/dist/server/auth/index.d.ts +171 -155
  92. package/dist/server/auth/index.d.ts.map +1 -1
  93. package/dist/server/auth/index.js +0 -1
  94. package/dist/server/auth/index.js.map +1 -1
  95. package/dist/server/cache/index.js.map +1 -1
  96. package/dist/server/compress/index.d.ts.map +1 -1
  97. package/dist/server/compress/index.js +2 -0
  98. package/dist/server/compress/index.js.map +1 -1
  99. package/dist/server/cookies/index.browser.js.map +1 -1
  100. package/dist/server/cookies/index.js.map +1 -1
  101. package/dist/server/core/index.browser.js.map +1 -1
  102. package/dist/server/core/index.d.ts.map +1 -1
  103. package/dist/server/core/index.js +1 -1
  104. package/dist/server/core/index.js.map +1 -1
  105. package/dist/server/health/index.d.ts +17 -17
  106. package/dist/server/helmet/index.js.map +1 -1
  107. package/dist/server/links/index.browser.js +22 -6
  108. package/dist/server/links/index.browser.js.map +1 -1
  109. package/dist/server/links/index.d.ts +46 -44
  110. package/dist/server/links/index.d.ts.map +1 -1
  111. package/dist/server/links/index.js +24 -41
  112. package/dist/server/links/index.js.map +1 -1
  113. package/dist/server/multipart/index.js.map +1 -1
  114. package/dist/server/rate-limit/index.js.map +1 -1
  115. package/dist/server/security/index.js.map +1 -1
  116. package/dist/server/swagger/index.d.ts +2 -1
  117. package/dist/server/swagger/index.d.ts.map +1 -1
  118. package/dist/server/swagger/index.js +8 -3
  119. package/dist/server/swagger/index.js.map +1 -1
  120. package/dist/thread/index.js.map +1 -1
  121. package/dist/topic/core/index.js.map +1 -1
  122. package/dist/vite/index.d.ts.map +1 -1
  123. package/dist/vite/index.js +12 -4
  124. package/dist/vite/index.js.map +1 -1
  125. package/dist/websocket/index.browser.js.map +1 -1
  126. package/dist/websocket/index.js.map +1 -1
  127. package/package.json +7 -7
  128. package/src/api/audits/controllers/{AuditController.ts → AdminAuditController.ts} +5 -6
  129. package/src/api/audits/entities/audits.ts +5 -5
  130. package/src/api/audits/index.browser.ts +1 -1
  131. package/src/api/audits/index.ts +3 -3
  132. package/src/api/audits/primitives/$audit.spec.ts +276 -0
  133. package/src/api/audits/services/AuditService.spec.ts +495 -0
  134. package/src/api/files/__tests__/$bucket.spec.ts +91 -0
  135. package/src/api/files/controllers/AdminFileStatsController.spec.ts +166 -0
  136. package/src/api/files/controllers/{StorageStatsController.ts → AdminFileStatsController.ts} +2 -2
  137. package/src/api/files/controllers/FileController.spec.ts +558 -0
  138. package/src/api/files/controllers/FileController.ts +4 -5
  139. package/src/api/files/entities/files.ts +5 -5
  140. package/src/api/files/index.browser.ts +1 -1
  141. package/src/api/files/index.ts +4 -4
  142. package/src/api/files/jobs/FileJobs.spec.ts +52 -0
  143. package/src/api/files/services/FileService.spec.ts +109 -0
  144. package/src/api/jobs/__tests__/JobController.spec.ts +343 -0
  145. package/src/api/jobs/controllers/{JobController.ts → AdminJobController.ts} +2 -2
  146. package/src/api/jobs/entities/jobExecutions.ts +5 -5
  147. package/src/api/jobs/index.ts +3 -3
  148. package/src/api/jobs/primitives/$job.spec.ts +476 -0
  149. package/src/api/notifications/controllers/{NotificationController.ts → AdminNotificationController.ts} +4 -5
  150. package/src/api/notifications/entities/notifications.ts +5 -5
  151. package/src/api/notifications/index.browser.ts +1 -1
  152. package/src/api/notifications/index.ts +4 -4
  153. package/src/api/parameters/controllers/{ConfigController.ts → AdminConfigController.ts} +46 -107
  154. package/src/api/parameters/entities/parameters.ts +7 -17
  155. package/src/api/parameters/index.ts +3 -3
  156. package/src/api/parameters/primitives/$config.spec.ts +356 -0
  157. package/src/api/parameters/schemas/activateConfigBodySchema.ts +12 -0
  158. package/src/api/parameters/schemas/checkScheduledResponseSchema.ts +8 -0
  159. package/src/api/parameters/schemas/configCurrentResponseSchema.ts +13 -0
  160. package/src/api/parameters/schemas/configHistoryResponseSchema.ts +9 -0
  161. package/src/api/parameters/schemas/configNameParamSchema.ts +10 -0
  162. package/src/api/parameters/schemas/configNamesResponseSchema.ts +8 -0
  163. package/src/api/parameters/schemas/configTreeNodeSchema.ts +13 -0
  164. package/src/api/parameters/schemas/configVersionParamSchema.ts +9 -0
  165. package/src/api/parameters/schemas/configVersionResponseSchema.ts +9 -0
  166. package/src/api/parameters/schemas/configsByStatusResponseSchema.ts +9 -0
  167. package/src/api/parameters/schemas/createConfigVersionBodySchema.ts +24 -0
  168. package/src/api/parameters/schemas/index.ts +15 -0
  169. package/src/api/parameters/schemas/parameterResponseSchema.ts +26 -0
  170. package/src/api/parameters/schemas/parameterStatusSchema.ts +13 -0
  171. package/src/api/parameters/schemas/rollbackConfigBodySchema.ts +15 -0
  172. package/src/api/parameters/schemas/statusParamSchema.ts +9 -0
  173. package/src/api/users/__tests__/EmailVerification.spec.ts +369 -0
  174. package/src/api/users/__tests__/PasswordReset.spec.ts +550 -0
  175. package/src/api/users/controllers/AdminIdentityController.spec.ts +365 -0
  176. package/src/api/users/controllers/{IdentityController.ts → AdminIdentityController.ts} +3 -4
  177. package/src/api/users/controllers/AdminSessionController.spec.ts +274 -0
  178. package/src/api/users/controllers/{SessionController.ts → AdminSessionController.ts} +3 -4
  179. package/src/api/users/controllers/AdminUserController.spec.ts +372 -0
  180. package/src/api/users/controllers/AdminUserController.ts +116 -0
  181. package/src/api/users/controllers/UserController.ts +4 -107
  182. package/src/api/users/controllers/UserRealmController.ts +3 -0
  183. package/src/api/users/entities/identities.ts +6 -6
  184. package/src/api/users/entities/sessions.ts +6 -6
  185. package/src/api/users/entities/users.ts +9 -9
  186. package/src/api/users/index.ts +13 -6
  187. package/src/api/users/primitives/$userRealm.ts +13 -8
  188. package/src/api/users/services/CredentialService.spec.ts +509 -0
  189. package/src/api/users/services/CredentialService.ts +46 -0
  190. package/src/api/users/services/IdentityService.ts +15 -0
  191. package/src/api/users/services/RegistrationService.spec.ts +630 -0
  192. package/src/api/users/services/RegistrationService.ts +18 -0
  193. package/src/api/users/services/SessionService.spec.ts +301 -0
  194. package/src/api/users/services/SessionService.ts +110 -1
  195. package/src/api/users/services/UserService.ts +67 -2
  196. package/src/api/verifications/__tests__/CodeVerification.spec.ts +318 -0
  197. package/src/api/verifications/__tests__/LinkVerification.spec.ts +279 -0
  198. package/src/api/verifications/entities/verifications.ts +6 -6
  199. package/src/api/verifications/jobs/VerificationJobs.spec.ts +50 -0
  200. package/src/batch/__tests__/startup-buffering.spec.ts +458 -0
  201. package/src/batch/primitives/$batch.spec.ts +766 -0
  202. package/src/batch/providers/BatchProvider.spec.ts +786 -0
  203. package/src/bin/index.ts +0 -1
  204. package/src/bucket/__tests__/shared.ts +194 -0
  205. package/src/bucket/primitives/$bucket.spec.ts +104 -0
  206. package/src/bucket/providers/FileStorageProvider.spec.ts +13 -0
  207. package/src/bucket/providers/LocalFileStorageProvider.spec.ts +77 -0
  208. package/src/bucket/providers/MemoryFileStorageProvider.spec.ts +82 -0
  209. package/src/cache/core/__tests__/shared.ts +377 -0
  210. package/src/cache/core/primitives/$cache.spec.ts +111 -0
  211. package/src/cache/redis/__tests__/cache-redis.spec.ts +70 -0
  212. package/src/cli/apps/AlephaCli.ts +54 -16
  213. package/src/cli/apps/AlephaPackageBuilderCli.ts +2 -1
  214. package/src/cli/assets/appRouterTs.ts +1 -1
  215. package/src/cli/commands/{ViteCommands.ts → build.ts} +2 -105
  216. package/src/cli/commands/clean.ts +14 -0
  217. package/src/cli/commands/{DrizzleCommands.ts → db.ts} +10 -117
  218. package/src/cli/commands/{DeployCommands.ts → deploy.ts} +1 -1
  219. package/src/cli/commands/dev.ts +69 -0
  220. package/src/cli/commands/format.ts +17 -0
  221. package/src/cli/commands/gen/changelog.spec.ts +315 -0
  222. package/src/cli/commands/{ChangelogCommands.ts → gen/changelog.ts} +16 -31
  223. package/src/cli/commands/gen/openapi.ts +71 -0
  224. package/src/cli/commands/gen.ts +18 -0
  225. package/src/cli/commands/{CoreCommands.ts → init.ts} +4 -40
  226. package/src/cli/commands/lint.ts +17 -0
  227. package/src/cli/commands/root.ts +41 -0
  228. package/src/cli/commands/run.ts +24 -0
  229. package/src/cli/commands/test.ts +42 -0
  230. package/src/cli/commands/typecheck.ts +24 -0
  231. package/src/cli/commands/{VerifyCommands.ts → verify.ts} +1 -13
  232. package/src/cli/defineConfig.ts +10 -1
  233. package/src/cli/index.ts +17 -7
  234. package/src/cli/services/AlephaCliUtils.ts +71 -32
  235. package/src/cli/services/GitMessageParser.ts +1 -1
  236. package/src/command/helpers/Asker.spec.ts +127 -0
  237. package/src/command/helpers/Runner.spec.ts +126 -0
  238. package/src/command/primitives/$command.spec.ts +1588 -0
  239. package/src/command/providers/CliProvider.ts +74 -24
  240. package/src/core/Alepha.ts +52 -4
  241. package/src/core/__tests__/Alepha-emit.spec.ts +22 -0
  242. package/src/core/__tests__/Alepha-graph.spec.ts +93 -0
  243. package/src/core/__tests__/Alepha-has.spec.ts +41 -0
  244. package/src/core/__tests__/Alepha-inject.spec.ts +93 -0
  245. package/src/core/__tests__/Alepha-register.spec.ts +81 -0
  246. package/src/core/__tests__/Alepha-start.spec.ts +176 -0
  247. package/src/core/__tests__/Alepha-with.spec.ts +14 -0
  248. package/src/core/__tests__/TypeBox-usecases.spec.ts +35 -0
  249. package/src/core/__tests__/TypeBoxLocale.spec.ts +15 -0
  250. package/src/core/__tests__/descriptor.spec.ts +34 -0
  251. package/src/core/__tests__/fixtures/A.ts +5 -0
  252. package/src/core/__tests__/pagination.spec.ts +77 -0
  253. package/src/core/helpers/jsonSchemaToTypeBox.ts +2 -2
  254. package/src/core/primitives/$atom.spec.ts +43 -0
  255. package/src/core/primitives/$hook.spec.ts +130 -0
  256. package/src/core/primitives/$inject.spec.ts +175 -0
  257. package/src/core/primitives/$module.spec.ts +115 -0
  258. package/src/core/providers/CodecManager.spec.ts +740 -0
  259. package/src/core/providers/EventManager.spec.ts +762 -0
  260. package/src/core/providers/EventManager.ts +4 -0
  261. package/src/core/providers/StateManager.spec.ts +365 -0
  262. package/src/core/providers/TypeProvider.spec.ts +1607 -0
  263. package/src/core/providers/TypeProvider.ts +20 -26
  264. package/src/datetime/primitives/$interval.spec.ts +103 -0
  265. package/src/datetime/providers/DateTimeProvider.spec.ts +86 -0
  266. package/src/email/primitives/$email.spec.ts +175 -0
  267. package/src/email/providers/LocalEmailProvider.spec.ts +341 -0
  268. package/src/fake/__tests__/keyName.example.ts +40 -0
  269. package/src/fake/__tests__/keyName.spec.ts +152 -0
  270. package/src/fake/__tests__/module.example.ts +32 -0
  271. package/src/fake/providers/FakeProvider.spec.ts +438 -0
  272. package/src/file/providers/FileSystemProvider.ts +8 -0
  273. package/src/file/providers/NodeFileSystemProvider.spec.ts +418 -0
  274. package/src/file/providers/NodeFileSystemProvider.ts +5 -0
  275. package/src/file/services/FileDetector.spec.ts +591 -0
  276. package/src/lock/core/__tests__/shared.ts +190 -0
  277. package/src/lock/core/providers/MemoryLockProvider.spec.ts +25 -0
  278. package/src/lock/redis/providers/RedisLockProvider.spec.ts +25 -0
  279. package/src/logger/__tests__/SimpleFormatterProvider.spec.ts +109 -0
  280. package/src/logger/primitives/$logger.spec.ts +108 -0
  281. package/src/logger/services/Logger.spec.ts +295 -0
  282. package/src/mcp/__tests__/errors.spec.ts +175 -0
  283. package/src/mcp/__tests__/integration.spec.ts +450 -0
  284. package/src/mcp/helpers/jsonrpc.spec.ts +380 -0
  285. package/src/mcp/primitives/$prompt.spec.ts +468 -0
  286. package/src/mcp/primitives/$resource.spec.ts +390 -0
  287. package/src/mcp/primitives/$tool.spec.ts +406 -0
  288. package/src/mcp/providers/McpServerProvider.spec.ts +797 -0
  289. package/src/orm/__tests__/$repository-crud.spec.ts +276 -0
  290. package/src/orm/__tests__/$repository-hooks.spec.ts +325 -0
  291. package/src/orm/__tests__/$repository-orderBy.spec.ts +128 -0
  292. package/src/orm/__tests__/$repository-pagination-sort.spec.ts +149 -0
  293. package/src/orm/__tests__/$repository-save.spec.ts +37 -0
  294. package/src/orm/__tests__/ModelBuilder-integration.spec.ts +490 -0
  295. package/src/orm/__tests__/ModelBuilder-types.spec.ts +186 -0
  296. package/src/orm/__tests__/PostgresProvider.spec.ts +46 -0
  297. package/src/orm/__tests__/delete-returning.spec.ts +256 -0
  298. package/src/orm/__tests__/deletedAt.spec.ts +80 -0
  299. package/src/orm/__tests__/enums.spec.ts +315 -0
  300. package/src/orm/__tests__/execute.spec.ts +72 -0
  301. package/src/orm/__tests__/fixtures/bigEntitySchema.ts +65 -0
  302. package/src/orm/__tests__/fixtures/userEntitySchema.ts +27 -0
  303. package/src/orm/__tests__/joins.spec.ts +1114 -0
  304. package/src/orm/__tests__/page.spec.ts +287 -0
  305. package/src/orm/__tests__/primaryKey.spec.ts +87 -0
  306. package/src/orm/__tests__/query-date-encoding.spec.ts +402 -0
  307. package/src/orm/__tests__/ref-auto-onDelete.spec.ts +156 -0
  308. package/src/orm/__tests__/references.spec.ts +102 -0
  309. package/src/orm/__tests__/security.spec.ts +710 -0
  310. package/src/orm/__tests__/sqlite.spec.ts +111 -0
  311. package/src/orm/__tests__/string-operators.spec.ts +429 -0
  312. package/src/orm/__tests__/timestamps.spec.ts +388 -0
  313. package/src/orm/__tests__/validation.spec.ts +183 -0
  314. package/src/orm/__tests__/version.spec.ts +64 -0
  315. package/src/orm/helpers/parseQueryString.spec.ts +196 -0
  316. package/src/orm/index.browser.ts +1 -1
  317. package/src/orm/index.ts +10 -6
  318. package/src/orm/primitives/$repository.spec.ts +137 -0
  319. package/src/orm/primitives/$sequence.spec.ts +29 -0
  320. package/src/orm/primitives/$transaction.spec.ts +82 -0
  321. package/src/orm/providers/{PostgresTypeProvider.ts → DatabaseTypeProvider.ts} +25 -3
  322. package/src/orm/providers/drivers/BunPostgresProvider.ts +3 -3
  323. package/src/orm/providers/drivers/BunSqliteProvider.ts +1 -1
  324. package/src/orm/providers/drivers/CloudflareD1Provider.ts +1 -1
  325. package/src/orm/providers/drivers/DatabaseProvider.ts +1 -1
  326. package/src/orm/providers/drivers/NodePostgresProvider.ts +3 -3
  327. package/src/orm/providers/drivers/NodeSqliteProvider.ts +1 -1
  328. package/src/orm/providers/drivers/PglitePostgresProvider.ts +2 -2
  329. package/src/orm/services/ModelBuilder.spec.ts +575 -0
  330. package/src/orm/services/Repository.spec.ts +137 -0
  331. package/src/queue/core/__tests__/shared.ts +143 -0
  332. package/src/queue/core/providers/MemoryQueueProvider.spec.ts +23 -0
  333. package/src/queue/core/providers/WorkerProvider.spec.ts +378 -0
  334. package/src/queue/redis/providers/RedisQueueProvider.spec.ts +23 -0
  335. package/src/redis/__tests__/redis.spec.ts +58 -0
  336. package/src/retry/primitives/$retry.spec.ts +234 -0
  337. package/src/retry/providers/RetryProvider.spec.ts +438 -0
  338. package/src/router/__tests__/match.spec.ts +252 -0
  339. package/src/router/providers/RouterProvider.spec.ts +197 -0
  340. package/src/scheduler/__tests__/$scheduler-cron.spec.ts +25 -0
  341. package/src/scheduler/__tests__/$scheduler-interval.spec.ts +25 -0
  342. package/src/scheduler/__tests__/shared.ts +77 -0
  343. package/src/security/__tests__/bug-1-wildcard-after-start.spec.ts +229 -0
  344. package/src/security/__tests__/bug-2-password-validation.spec.ts +245 -0
  345. package/src/security/__tests__/bug-3-regex-vulnerability.spec.ts +407 -0
  346. package/src/security/__tests__/bug-4-oauth2-validation.spec.ts +439 -0
  347. package/src/security/__tests__/multi-layer-permissions.spec.ts +522 -0
  348. package/src/security/primitives/$permission.spec.ts +30 -0
  349. package/src/security/primitives/$permission.ts +2 -2
  350. package/src/security/primitives/$realm.spec.ts +101 -0
  351. package/src/security/primitives/$role.spec.ts +52 -0
  352. package/src/security/primitives/$serviceAccount.spec.ts +61 -0
  353. package/src/security/providers/SecurityProvider.spec.ts +350 -0
  354. package/src/server/auth/providers/ServerAuthProvider.ts +0 -2
  355. package/src/server/cache/providers/ServerCacheProvider.spec.ts +942 -0
  356. package/src/server/compress/providers/ServerCompressProvider.spec.ts +31 -0
  357. package/src/server/compress/providers/ServerCompressProvider.ts +2 -0
  358. package/src/server/cookies/providers/ServerCookiesProvider.spec.ts +253 -0
  359. package/src/server/core/__tests__/ServerRouterProvider-getRoutes.spec.ts +334 -0
  360. package/src/server/core/__tests__/ServerRouterProvider-requestId.spec.ts +129 -0
  361. package/src/server/core/primitives/$action.spec.ts +191 -0
  362. package/src/server/core/primitives/$route.spec.ts +65 -0
  363. package/src/server/core/providers/ServerBodyParserProvider.spec.ts +93 -0
  364. package/src/server/core/providers/ServerLoggerProvider.spec.ts +100 -0
  365. package/src/server/core/providers/ServerProvider.ts +3 -1
  366. package/src/server/core/services/HttpClient.spec.ts +123 -0
  367. package/src/server/core/services/UserAgentParser.spec.ts +111 -0
  368. package/src/server/cors/providers/ServerCorsProvider.spec.ts +481 -0
  369. package/src/server/health/providers/ServerHealthProvider.spec.ts +22 -0
  370. package/src/server/helmet/providers/ServerHelmetProvider.spec.ts +105 -0
  371. package/src/server/links/__tests__/$action.spec.ts +238 -0
  372. package/src/server/links/__tests__/fixtures/CrudApp.ts +122 -0
  373. package/src/server/links/__tests__/requestId.spec.ts +120 -0
  374. package/src/server/links/primitives/$remote.spec.ts +228 -0
  375. package/src/server/links/providers/LinkProvider.spec.ts +54 -0
  376. package/src/server/links/providers/LinkProvider.ts +49 -3
  377. package/src/server/links/providers/ServerLinksProvider.ts +1 -53
  378. package/src/server/links/schemas/apiLinksResponseSchema.ts +7 -0
  379. package/src/server/metrics/providers/ServerMetricsProvider.spec.ts +25 -0
  380. package/src/server/multipart/providers/ServerMultipartProvider.spec.ts +528 -0
  381. package/src/server/proxy/primitives/$proxy.spec.ts +87 -0
  382. package/src/server/rate-limit/__tests__/ActionRateLimit.spec.ts +211 -0
  383. package/src/server/rate-limit/providers/ServerRateLimitProvider.spec.ts +344 -0
  384. package/src/server/security/__tests__/BasicAuth.spec.ts +684 -0
  385. package/src/server/security/__tests__/ServerSecurityProvider-realm.spec.ts +388 -0
  386. package/src/server/security/providers/ServerSecurityProvider.spec.ts +123 -0
  387. package/src/server/static/primitives/$serve.spec.ts +193 -0
  388. package/src/server/swagger/__tests__/ui.spec.ts +52 -0
  389. package/src/server/swagger/primitives/$swagger.spec.ts +193 -0
  390. package/src/server/swagger/providers/ServerSwaggerProvider.ts +18 -8
  391. package/src/sms/primitives/$sms.spec.ts +165 -0
  392. package/src/sms/providers/LocalSmsProvider.spec.ts +224 -0
  393. package/src/sms/providers/MemorySmsProvider.spec.ts +193 -0
  394. package/src/thread/primitives/$thread.spec.ts +186 -0
  395. package/src/topic/core/__tests__/shared.ts +144 -0
  396. package/src/topic/core/providers/MemoryTopicProvider.spec.ts +23 -0
  397. package/src/topic/redis/providers/RedisTopicProvider.spec.ts +23 -0
  398. package/src/vite/plugins/viteAlephaDev.ts +16 -4
  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/commands/BiomeCommands.ts +0 -29
@@ -0,0 +1,458 @@
1
+ import { $hook, Alepha, t } from "alepha";
2
+ import { DateTimeProvider } from "alepha/datetime";
3
+ import { afterEach, beforeEach, describe, expect, test, vi } from "vitest";
4
+ import { $batch, AlephaBatch } from "../index.ts";
5
+
6
+ /**
7
+ * Tests for startup buffering behavior.
8
+ *
9
+ * Requirements:
10
+ * - During startup (before "ready" hook), items should be buffered in memory
11
+ * - No size checks should occur during startup
12
+ * - No timeouts should be created during startup
13
+ * - After "ready" hook, all buffered items should be processed correctly
14
+ * - Items pushed after "ready" should behave normally
15
+ */
16
+ describe("Batch startup buffering", () => {
17
+ let alepha: Alepha;
18
+ let time: DateTimeProvider;
19
+
20
+ beforeEach(() => {
21
+ alepha = Alepha.create().with(AlephaBatch);
22
+ time = alepha.inject(DateTimeProvider);
23
+ });
24
+
25
+ afterEach(async () => {
26
+ await alepha.stop();
27
+ });
28
+
29
+ test("should buffer items during startup without size checks", async () => {
30
+ const mockHandler = vi.fn(async (items: string[]) => {
31
+ return `processed ${items.length} items`;
32
+ });
33
+
34
+ class TestApp {
35
+ batcher = $batch({
36
+ schema: t.text(),
37
+ maxSize: 10, // Would normally trigger flush at 10 items
38
+ maxDuration: [1, "second"],
39
+ handler: mockHandler,
40
+ });
41
+
42
+ // Push items during start hook (before ready)
43
+ onStart = $hook({
44
+ on: "start",
45
+ handler: async () => {
46
+ // Push 15 items during startup (exceeds maxSize of 10)
47
+ for (let i = 0; i < 15; i++) {
48
+ await this.batcher.push(`startup-item-${i}`);
49
+ }
50
+ },
51
+ });
52
+ }
53
+
54
+ const app = alepha.inject(TestApp);
55
+
56
+ // Handler should not be called during startup
57
+ expect(mockHandler).not.toHaveBeenCalled();
58
+
59
+ await alepha.start();
60
+
61
+ // After start completes (which includes "ready" hook), handler should be called
62
+ await vi.waitFor(() => {
63
+ expect(mockHandler).toHaveBeenCalled();
64
+ });
65
+
66
+ // Should have flushed once with 10 items (maxSize)
67
+ // and started a timeout for the remaining 5 items
68
+ expect(mockHandler).toHaveBeenCalledTimes(1);
69
+ expect(mockHandler).toHaveBeenNthCalledWith(
70
+ 1,
71
+ expect.arrayContaining([
72
+ "startup-item-0",
73
+ "startup-item-1",
74
+ "startup-item-2",
75
+ "startup-item-3",
76
+ "startup-item-4",
77
+ "startup-item-5",
78
+ "startup-item-6",
79
+ "startup-item-7",
80
+ "startup-item-8",
81
+ "startup-item-9",
82
+ ]),
83
+ );
84
+
85
+ // Wait for timeout to flush remaining items
86
+ await time.travel([1.1, "seconds"]);
87
+
88
+ await vi.waitFor(() => {
89
+ expect(mockHandler).toHaveBeenCalledTimes(2);
90
+ });
91
+
92
+ expect(mockHandler).toHaveBeenNthCalledWith(
93
+ 2,
94
+ expect.arrayContaining([
95
+ "startup-item-10",
96
+ "startup-item-11",
97
+ "startup-item-12",
98
+ "startup-item-13",
99
+ "startup-item-14",
100
+ ]),
101
+ );
102
+ });
103
+
104
+ test("should not create timeouts during startup", async () => {
105
+ const mockHandler = vi.fn(async (items: string[]) => {
106
+ return "processed";
107
+ });
108
+
109
+ class TestApp {
110
+ batcher = $batch({
111
+ schema: t.text(),
112
+ maxSize: 100,
113
+ maxDuration: [100, "milliseconds"], // Short timeout
114
+ handler: mockHandler,
115
+ });
116
+
117
+ onStart = $hook({
118
+ on: "start",
119
+ handler: async () => {
120
+ // Push 5 items during startup
121
+ await this.batcher.push("item-1");
122
+ await this.batcher.push("item-2");
123
+ await this.batcher.push("item-3");
124
+ await this.batcher.push("item-4");
125
+ await this.batcher.push("item-5");
126
+ },
127
+ });
128
+ }
129
+
130
+ const app = alepha.inject(TestApp);
131
+
132
+ // Travel time forward before starting (should have no effect)
133
+ await time.travel([200, "milliseconds"]);
134
+
135
+ // Handler should still not be called
136
+ expect(mockHandler).not.toHaveBeenCalled();
137
+
138
+ await alepha.start();
139
+
140
+ // After ready, timeout should be created
141
+ // Wait for timeout to trigger
142
+ await time.travel([150, "milliseconds"]);
143
+
144
+ await vi.waitFor(() => {
145
+ expect(mockHandler).toHaveBeenCalledTimes(1);
146
+ });
147
+
148
+ expect(mockHandler).toHaveBeenCalledWith([
149
+ "item-1",
150
+ "item-2",
151
+ "item-3",
152
+ "item-4",
153
+ "item-5",
154
+ ]);
155
+ });
156
+
157
+ test("should handle 1000+ items pushed during startup", async () => {
158
+ const mockHandler = vi.fn(async (items: string[]) => {
159
+ return `batch of ${items.length}`;
160
+ });
161
+
162
+ class TestApp {
163
+ batcher = $batch({
164
+ schema: t.text(),
165
+ maxSize: 100,
166
+ maxDuration: [1, "second"],
167
+ handler: mockHandler,
168
+ });
169
+
170
+ onStart = $hook({
171
+ on: "start",
172
+ handler: async () => {
173
+ // Push 1000 items during startup
174
+ const pushPromises: Promise<string>[] = [];
175
+ for (let i = 0; i < 1000; i++) {
176
+ pushPromises.push(this.batcher.push(`item-${i}`));
177
+ }
178
+ await Promise.all(pushPromises);
179
+ },
180
+ });
181
+ }
182
+
183
+ const app = alepha.inject(TestApp);
184
+
185
+ // Handler should not be called during startup
186
+ expect(mockHandler).not.toHaveBeenCalled();
187
+
188
+ await alepha.start();
189
+
190
+ // After ready, should flush batches of 100 items each
191
+ await vi.waitFor(
192
+ () => {
193
+ // Should have 10 batches (1000 / 100)
194
+ expect(mockHandler).toHaveBeenCalledTimes(10);
195
+ },
196
+ { timeout: 2000 },
197
+ );
198
+
199
+ // Each call should have 100 items
200
+ for (let i = 0; i < 10; i++) {
201
+ const call = mockHandler.mock.calls[i];
202
+ expect(call[0]).toHaveLength(100);
203
+ }
204
+ });
205
+
206
+ test("should handle partitioned items during startup", async () => {
207
+ const mockHandler = vi.fn(async (items: any[]) => {
208
+ return "processed";
209
+ });
210
+
211
+ class TestApp {
212
+ batcher = $batch({
213
+ schema: t.object({ partition: t.text(), value: t.text() }),
214
+ maxSize: 5,
215
+ partitionBy: (item) => item.partition,
216
+ handler: mockHandler,
217
+ });
218
+
219
+ onStart = $hook({
220
+ on: "start",
221
+ handler: async () => {
222
+ // Push items to different partitions
223
+ await this.batcher.push({ partition: "A", value: "a1" });
224
+ await this.batcher.push({ partition: "A", value: "a2" });
225
+ await this.batcher.push({ partition: "B", value: "b1" });
226
+ await this.batcher.push({ partition: "B", value: "b2" });
227
+ await this.batcher.push({ partition: "A", value: "a3" });
228
+ await this.batcher.push({ partition: "A", value: "a4" });
229
+ await this.batcher.push({ partition: "A", value: "a5" });
230
+ // Partition A now has 5 items (maxSize)
231
+ await this.batcher.push({ partition: "A", value: "a6" });
232
+ // Partition A now has 6 items (exceeds maxSize during startup - should NOT flush)
233
+ },
234
+ });
235
+ }
236
+
237
+ const app = alepha.inject(TestApp);
238
+
239
+ // No flushes during startup
240
+ expect(mockHandler).not.toHaveBeenCalled();
241
+
242
+ await alepha.start();
243
+
244
+ // After ready, partition A should flush immediately (6 > 5)
245
+ // It will flush 5 items first (maxSize), leaving 1 item
246
+ await vi.waitFor(() => {
247
+ expect(mockHandler).toHaveBeenCalledTimes(1);
248
+ });
249
+
250
+ // Should flush partition A with 5 items (first batch of maxSize)
251
+ const firstCall = mockHandler.mock.calls[0][0];
252
+ expect(firstCall).toHaveLength(5);
253
+ expect(firstCall).toEqual([
254
+ { partition: "A", value: "a1" },
255
+ { partition: "A", value: "a2" },
256
+ { partition: "A", value: "a3" },
257
+ { partition: "A", value: "a4" },
258
+ { partition: "A", value: "a5" },
259
+ ]);
260
+
261
+ // Partition A has 1 remaining item and partition B has 2 items
262
+ // Wait for timeout to flush them
263
+ await time.travel([1.1, "seconds"]);
264
+
265
+ await vi.waitFor(() => {
266
+ expect(mockHandler).toHaveBeenCalledTimes(3);
267
+ });
268
+
269
+ // Second call should be the remaining item from partition A
270
+ const secondCall = mockHandler.mock.calls[1][0];
271
+ expect(secondCall).toHaveLength(1);
272
+ expect(secondCall).toEqual([{ partition: "A", value: "a6" }]);
273
+
274
+ // Third call should be partition B
275
+ const thirdCall = mockHandler.mock.calls[2][0];
276
+ expect(thirdCall).toHaveLength(2);
277
+ expect(thirdCall).toEqual([
278
+ { partition: "B", value: "b1" },
279
+ { partition: "B", value: "b2" },
280
+ ]);
281
+ });
282
+
283
+ test("should work correctly when items are pushed both during and after startup", async () => {
284
+ const mockHandler = vi.fn(async (items: string[]) => {
285
+ return "processed";
286
+ });
287
+
288
+ class TestApp {
289
+ batcher = $batch({
290
+ schema: t.text(),
291
+ maxSize: 3,
292
+ maxDuration: [500, "milliseconds"],
293
+ handler: mockHandler,
294
+ });
295
+
296
+ onStart = $hook({
297
+ on: "start",
298
+ handler: async () => {
299
+ await this.batcher.push("startup-1");
300
+ await this.batcher.push("startup-2");
301
+ },
302
+ });
303
+ }
304
+
305
+ const app = alepha.inject(TestApp);
306
+
307
+ // No handler calls yet
308
+ expect(mockHandler).not.toHaveBeenCalled();
309
+
310
+ await alepha.start();
311
+
312
+ // After ready, timeout starts for the 2 startup items
313
+ // Push another item (should trigger flush at maxSize=3)
314
+ await app.batcher.push("runtime-1");
315
+
316
+ await vi.waitFor(() => {
317
+ expect(mockHandler).toHaveBeenCalledTimes(1);
318
+ });
319
+
320
+ expect(mockHandler).toHaveBeenCalledWith([
321
+ "startup-1",
322
+ "startup-2",
323
+ "runtime-1",
324
+ ]);
325
+
326
+ // Push more items after flush
327
+ await app.batcher.push("runtime-2");
328
+ await app.batcher.push("runtime-3");
329
+
330
+ // Wait for timeout
331
+ await time.travel([600, "milliseconds"]);
332
+
333
+ await vi.waitFor(() => {
334
+ expect(mockHandler).toHaveBeenCalledTimes(2);
335
+ });
336
+
337
+ expect(mockHandler).toHaveBeenNthCalledWith(2, ["runtime-2", "runtime-3"]);
338
+ });
339
+
340
+ test("should handle wait() for items pushed during startup", async () => {
341
+ const mockHandler = vi.fn(async (items: string[]) => {
342
+ return items.map((item) => `processed-${item}`);
343
+ });
344
+
345
+ class TestApp {
346
+ batcher = $batch({
347
+ schema: t.text(),
348
+ maxSize: 10,
349
+ handler: mockHandler,
350
+ });
351
+
352
+ startupIds: string[] = [];
353
+
354
+ onStart = $hook({
355
+ on: "start",
356
+ handler: async () => {
357
+ this.startupIds.push(await this.batcher.push("item-1"));
358
+ this.startupIds.push(await this.batcher.push("item-2"));
359
+ this.startupIds.push(await this.batcher.push("item-3"));
360
+ },
361
+ });
362
+ }
363
+
364
+ const app = alepha.inject(TestApp);
365
+
366
+ await alepha.start();
367
+
368
+ // Wait for all startup items to be processed
369
+ const results = await Promise.all(
370
+ app.startupIds.map((id) => app.batcher.wait(id)),
371
+ );
372
+
373
+ expect(results).toEqual([
374
+ ["processed-item-1", "processed-item-2", "processed-item-3"],
375
+ ["processed-item-1", "processed-item-2", "processed-item-3"],
376
+ ["processed-item-1", "processed-item-2", "processed-item-3"],
377
+ ]);
378
+ });
379
+
380
+ test("should immediately flush startup items that exceed maxSize on ready", async () => {
381
+ const mockHandler = vi.fn(async (items: string[]) => {
382
+ return "processed";
383
+ });
384
+
385
+ class TestApp {
386
+ batcher = $batch({
387
+ schema: t.text(),
388
+ maxSize: 5,
389
+ maxDuration: [10, "seconds"], // Long timeout so it doesn't interfere
390
+ handler: mockHandler,
391
+ });
392
+
393
+ onStart = $hook({
394
+ on: "start",
395
+ handler: async () => {
396
+ // Push exactly maxSize items
397
+ for (let i = 0; i < 5; i++) {
398
+ await this.batcher.push(`item-${i}`);
399
+ }
400
+ },
401
+ });
402
+ }
403
+
404
+ const app = alepha.inject(TestApp);
405
+
406
+ await alepha.start();
407
+
408
+ // Should flush immediately on ready (5 >= maxSize)
409
+ await vi.waitFor(() => {
410
+ expect(mockHandler).toHaveBeenCalledTimes(1);
411
+ });
412
+
413
+ expect(mockHandler).toHaveBeenCalledWith([
414
+ "item-0",
415
+ "item-1",
416
+ "item-2",
417
+ "item-3",
418
+ "item-4",
419
+ ]);
420
+ });
421
+
422
+ test("should handle status() for buffered items", async () => {
423
+ const mockHandler = vi.fn(async (items: string[]) => {
424
+ return "success";
425
+ });
426
+
427
+ class TestApp {
428
+ batcher = $batch({
429
+ schema: t.text(),
430
+ maxSize: 10,
431
+ handler: mockHandler,
432
+ });
433
+
434
+ itemId?: string;
435
+
436
+ onStart = $hook({
437
+ on: "start",
438
+ handler: async () => {
439
+ this.itemId = await this.batcher.push("test-item");
440
+ },
441
+ });
442
+ }
443
+
444
+ const app = alepha.inject(TestApp);
445
+
446
+ await alepha.start();
447
+
448
+ // Item should be pending or processing
449
+ const status1 = app.batcher.status(app.itemId!);
450
+ expect(status1?.status).toMatch(/pending|processing|completed/);
451
+
452
+ // Wait for processing
453
+ await app.batcher.wait(app.itemId!);
454
+
455
+ const status2 = app.batcher.status(app.itemId!);
456
+ expect(status2?.status).toBe("completed");
457
+ });
458
+ });