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,439 @@
1
+ import { Alepha } from "alepha";
2
+ import { describe, expect, it, vi } from "vitest";
3
+ import { $serviceAccount } from "../index.ts";
4
+
5
+ /**
6
+ * Bug #4: Missing HTTP Response Validation in OAuth2 Service Account
7
+ *
8
+ * Issue: The OAuth2 token fetching code didn't:
9
+ * 1. Check HTTP response.ok or status codes
10
+ * 2. Handle JSON parsing errors
11
+ * 3. Handle network errors properly
12
+ * 4. Provide meaningful error messages
13
+ *
14
+ * Expected: All failure modes should throw clear errors instead of crashing.
15
+ */
16
+ describe("Bug #4: Missing HTTP Response Validation in OAuth2", () => {
17
+ // Helper to create a service account within Alepha context
18
+ const createServiceAccount = (
19
+ url: string,
20
+ clientId: string,
21
+ clientSecret: string,
22
+ gracePeriod?: number,
23
+ ) => {
24
+ const alepha = Alepha.create();
25
+
26
+ class TestService {
27
+ serviceAccount = $serviceAccount({
28
+ oauth2: {
29
+ url,
30
+ clientId,
31
+ clientSecret,
32
+ },
33
+ gracePeriod,
34
+ });
35
+ }
36
+
37
+ const service = alepha.inject(TestService);
38
+ return service.serviceAccount;
39
+ };
40
+
41
+ // Helper to create a mock fetch response
42
+ const createMockResponse = (
43
+ status: number,
44
+ body: any,
45
+ options: { isJson?: boolean; throwOnJson?: boolean } = {},
46
+ ): Response => {
47
+ const { isJson = true, throwOnJson = false } = options;
48
+
49
+ return {
50
+ ok: status >= 200 && status < 300,
51
+ status,
52
+ statusText:
53
+ status === 200
54
+ ? "OK"
55
+ : status === 400
56
+ ? "Bad Request"
57
+ : status === 401
58
+ ? "Unauthorized"
59
+ : status === 500
60
+ ? "Internal Server Error"
61
+ : "Error",
62
+ json: async () => {
63
+ if (throwOnJson) {
64
+ throw new Error("Invalid JSON");
65
+ }
66
+ return isJson ? body : Promise.reject(new Error("Not JSON"));
67
+ },
68
+ text: async () =>
69
+ typeof body === "string" ? body : JSON.stringify(body),
70
+ } as Response;
71
+ };
72
+
73
+ it("should successfully fetch and cache token", async () => {
74
+ const mockToken = "mock-access-token";
75
+ const mockResponse = {
76
+ access_token: mockToken,
77
+ expires_in: 3600,
78
+ token_type: "Bearer",
79
+ };
80
+
81
+ (global as any).fetch = vi
82
+ .fn()
83
+ .mockResolvedValue(createMockResponse(200, mockResponse));
84
+
85
+ const serviceAccount = createServiceAccount(
86
+ "https://auth.example.com/token",
87
+ "test-client",
88
+ "test-secret",
89
+ );
90
+
91
+ const token = await serviceAccount.token();
92
+ expect(token).toBe(mockToken);
93
+
94
+ // Verify fetch was called correctly
95
+ expect((global as any).fetch).toHaveBeenCalledWith(
96
+ "https://auth.example.com/token",
97
+ expect.objectContaining({
98
+ method: "POST",
99
+ headers: {
100
+ "Content-Type": "application/x-www-form-urlencoded",
101
+ },
102
+ body: expect.any(URLSearchParams),
103
+ }),
104
+ );
105
+ });
106
+
107
+ it("should throw error on network failure", async () => {
108
+ (global as any).fetch = vi
109
+ .fn()
110
+ .mockRejectedValue(new Error("Network error"));
111
+
112
+ const serviceAccount = createServiceAccount(
113
+ "https://auth.example.com/token",
114
+ "test-client",
115
+ "test-secret",
116
+ );
117
+
118
+ await expect(serviceAccount.token()).rejects.toThrow(
119
+ /Failed to fetch access token from.*Network error/,
120
+ );
121
+ });
122
+
123
+ it("should throw error on HTTP 400 Bad Request", async () => {
124
+ const errorBody = {
125
+ error: "invalid_request",
126
+ error_description: "Missing parameter",
127
+ };
128
+
129
+ (global as any).fetch = vi
130
+ .fn()
131
+ .mockResolvedValue(createMockResponse(400, errorBody));
132
+
133
+ const serviceAccount = createServiceAccount(
134
+ "https://auth.example.com/token",
135
+ "test-client",
136
+ "test-secret",
137
+ );
138
+
139
+ await expect(serviceAccount.token()).rejects.toThrow(
140
+ /HTTP 400 Bad Request/,
141
+ );
142
+ });
143
+
144
+ it("should throw error on HTTP 401 Unauthorized", async () => {
145
+ const errorBody = { error: "invalid_client" };
146
+
147
+ (global as any).fetch = vi
148
+ .fn()
149
+ .mockResolvedValue(createMockResponse(401, errorBody));
150
+
151
+ const serviceAccount = createServiceAccount(
152
+ "https://auth.example.com/token",
153
+ "wrong-client",
154
+ "wrong-secret",
155
+ );
156
+
157
+ await expect(serviceAccount.token()).rejects.toThrow(
158
+ /HTTP 401 Unauthorized/,
159
+ );
160
+ });
161
+
162
+ it("should throw error on HTTP 500 Internal Server Error", async () => {
163
+ (global as any).fetch = vi
164
+ .fn()
165
+ .mockResolvedValue(createMockResponse(500, "Internal Server Error"));
166
+
167
+ const serviceAccount = createServiceAccount(
168
+ "https://auth.example.com/token",
169
+ "test-client",
170
+ "test-secret",
171
+ );
172
+
173
+ await expect(serviceAccount.token()).rejects.toThrow(
174
+ /HTTP 500 Internal Server Error/,
175
+ );
176
+ });
177
+
178
+ it("should throw error when response is not JSON", async () => {
179
+ (global as any).fetch = vi
180
+ .fn()
181
+ .mockResolvedValue(
182
+ createMockResponse(200, "Not a JSON response", { throwOnJson: true }),
183
+ );
184
+
185
+ const serviceAccount = createServiceAccount(
186
+ "https://auth.example.com/token",
187
+ "test-client",
188
+ "test-secret",
189
+ );
190
+
191
+ await expect(serviceAccount.token()).rejects.toThrow(
192
+ /Failed to parse access token response as JSON/,
193
+ );
194
+ });
195
+
196
+ it("should throw error when response is missing access_token", async () => {
197
+ const invalidResponse = {
198
+ // Missing access_token
199
+ expires_in: 3600,
200
+ token_type: "Bearer",
201
+ };
202
+
203
+ (global as any).fetch = vi
204
+ .fn()
205
+ .mockResolvedValue(createMockResponse(200, invalidResponse));
206
+
207
+ const serviceAccount = createServiceAccount(
208
+ "https://auth.example.com/token",
209
+ "test-client",
210
+ "test-secret",
211
+ );
212
+
213
+ await expect(serviceAccount.token()).rejects.toThrow(
214
+ /Invalid access token response: missing access_token or expires_in/,
215
+ );
216
+ });
217
+
218
+ it("should throw error when response is missing expires_in", async () => {
219
+ const invalidResponse = {
220
+ access_token: "token123",
221
+ // Missing expires_in
222
+ token_type: "Bearer",
223
+ };
224
+
225
+ (global as any).fetch = vi
226
+ .fn()
227
+ .mockResolvedValue(createMockResponse(200, invalidResponse));
228
+
229
+ const serviceAccount = createServiceAccount(
230
+ "https://auth.example.com/token",
231
+ "test-client",
232
+ "test-secret",
233
+ );
234
+
235
+ await expect(serviceAccount.token()).rejects.toThrow(
236
+ /Invalid access token response: missing access_token or expires_in/,
237
+ );
238
+ });
239
+
240
+ it("should throw error when response has null access_token", async () => {
241
+ const invalidResponse = {
242
+ access_token: null,
243
+ expires_in: 3600,
244
+ };
245
+
246
+ (global as any).fetch = vi
247
+ .fn()
248
+ .mockResolvedValue(createMockResponse(200, invalidResponse));
249
+
250
+ const serviceAccount = createServiceAccount(
251
+ "https://auth.example.com/token",
252
+ "test-client",
253
+ "test-secret",
254
+ );
255
+
256
+ await expect(serviceAccount.token()).rejects.toThrow(
257
+ /Invalid access token response: missing access_token or expires_in/,
258
+ );
259
+ });
260
+
261
+ it("should throw error when response has empty string access_token", async () => {
262
+ const invalidResponse = {
263
+ access_token: "",
264
+ expires_in: 3600,
265
+ };
266
+
267
+ (global as any).fetch = vi
268
+ .fn()
269
+ .mockResolvedValue(createMockResponse(200, invalidResponse));
270
+
271
+ const serviceAccount = createServiceAccount(
272
+ "https://auth.example.com/token",
273
+ "test-client",
274
+ "test-secret",
275
+ );
276
+
277
+ await expect(serviceAccount.token()).rejects.toThrow(
278
+ /Invalid access token response: missing access_token or expires_in/,
279
+ );
280
+ });
281
+
282
+ it("should use cached token instead of fetching again", async () => {
283
+ const mockToken = "cached-token";
284
+ const mockResponse = {
285
+ access_token: mockToken,
286
+ expires_in: 3600,
287
+ token_type: "Bearer",
288
+ };
289
+
290
+ const fetchMock = vi
291
+ .fn()
292
+ .mockResolvedValue(createMockResponse(200, mockResponse));
293
+ (global as any).fetch = fetchMock;
294
+
295
+ const serviceAccount = createServiceAccount(
296
+ "https://auth.example.com/token",
297
+ "test-client",
298
+ "test-secret",
299
+ 30,
300
+ );
301
+
302
+ // First call should fetch
303
+ const token1 = await serviceAccount.token();
304
+ expect(token1).toBe(mockToken);
305
+ expect(fetchMock).toHaveBeenCalledTimes(1);
306
+
307
+ // Second call should use cache
308
+ const token2 = await serviceAccount.token();
309
+ expect(token2).toBe(mockToken);
310
+ expect(fetchMock).toHaveBeenCalledTimes(1); // Still 1, not called again
311
+ });
312
+
313
+ it("should include error body in error message for non-200 responses", async () => {
314
+ const errorBody = {
315
+ error: "invalid_scope",
316
+ error_description: "The requested scope is invalid",
317
+ };
318
+
319
+ (global as any).fetch = vi
320
+ .fn()
321
+ .mockResolvedValue(createMockResponse(400, errorBody));
322
+
323
+ const serviceAccount = createServiceAccount(
324
+ "https://auth.example.com/token",
325
+ "test-client",
326
+ "test-secret",
327
+ );
328
+
329
+ try {
330
+ await serviceAccount.token();
331
+ expect.fail("Should have thrown");
332
+ } catch (error) {
333
+ expect(error).toBeInstanceOf(Error);
334
+ expect((error as Error).message).toContain("HTTP 400 Bad Request");
335
+ expect((error as Error).message).toContain("invalid_scope");
336
+ }
337
+ });
338
+
339
+ it("should handle HTML error responses gracefully", async () => {
340
+ const htmlError =
341
+ "<html><body><h1>500 Internal Server Error</h1></body></html>";
342
+
343
+ (global as any).fetch = vi
344
+ .fn()
345
+ .mockResolvedValue(
346
+ createMockResponse(500, htmlError, { throwOnJson: true }),
347
+ );
348
+
349
+ const serviceAccount = createServiceAccount(
350
+ "https://auth.example.com/token",
351
+ "test-client",
352
+ "test-secret",
353
+ );
354
+
355
+ await expect(serviceAccount.token()).rejects.toThrow(/HTTP 500/);
356
+ });
357
+
358
+ it("should handle fetch timeout or abort", async () => {
359
+ (global as any).fetch = vi
360
+ .fn()
361
+ .mockRejectedValue(new Error("The operation was aborted"));
362
+
363
+ const serviceAccount = createServiceAccount(
364
+ "https://auth.example.com/token",
365
+ "test-client",
366
+ "test-secret",
367
+ );
368
+
369
+ await expect(serviceAccount.token()).rejects.toThrow(
370
+ /Failed to fetch access token.*aborted/,
371
+ );
372
+ });
373
+
374
+ it("should handle DNS resolution failure", async () => {
375
+ (global as any).fetch = vi
376
+ .fn()
377
+ .mockRejectedValue(
378
+ new Error("getaddrinfo ENOTFOUND invalid-domain.example"),
379
+ );
380
+
381
+ const serviceAccount = createServiceAccount(
382
+ "https://invalid-domain.example/token",
383
+ "test-client",
384
+ "test-secret",
385
+ );
386
+
387
+ await expect(serviceAccount.token()).rejects.toThrow(/ENOTFOUND/);
388
+ });
389
+
390
+ it("should handle response with unexpected structure", async () => {
391
+ const weirdResponse = {
392
+ data: {
393
+ token: "nested-token",
394
+ },
395
+ // Missing top-level access_token
396
+ };
397
+
398
+ (global as any).fetch = vi
399
+ .fn()
400
+ .mockResolvedValue(createMockResponse(200, weirdResponse));
401
+
402
+ const serviceAccount = createServiceAccount(
403
+ "https://auth.example.com/token",
404
+ "test-client",
405
+ "test-secret",
406
+ );
407
+
408
+ await expect(serviceAccount.token()).rejects.toThrow(
409
+ /Invalid access token response/,
410
+ );
411
+ });
412
+
413
+ it("should properly format URLSearchParams in request body", async () => {
414
+ const mockResponse = {
415
+ access_token: "token",
416
+ expires_in: 3600,
417
+ };
418
+
419
+ const fetchMock = vi
420
+ .fn()
421
+ .mockResolvedValue(createMockResponse(200, mockResponse));
422
+ (global as any).fetch = fetchMock;
423
+
424
+ const serviceAccount = createServiceAccount(
425
+ "https://auth.example.com/token",
426
+ "my-client-id",
427
+ "my-secret",
428
+ );
429
+
430
+ await serviceAccount.token();
431
+
432
+ const callArgs = fetchMock.mock.calls[0];
433
+ const body = callArgs[1].body as URLSearchParams;
434
+
435
+ expect(body.get("grant_type")).toBe("client_credentials");
436
+ expect(body.get("client_id")).toBe("my-client-id");
437
+ expect(body.get("client_secret")).toBe("my-secret");
438
+ });
439
+ });