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,111 @@
1
+ import { Alepha } from "alepha";
2
+ import { describe, it } from "vitest";
3
+ import { UserAgentParser } from "../index.ts";
4
+
5
+ describe("UserAgentParser", () => {
6
+ const alepha = Alepha.create();
7
+ const parser = alepha.inject(UserAgentParser);
8
+
9
+ it("should parse Windows user agent", ({ expect }) => {
10
+ const ua =
11
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3";
12
+ const result = parser.parse(ua);
13
+ expect(result.os).toBe("Windows");
14
+ expect(result.browser).toBe("Chrome");
15
+ expect(result.device).toBe("DESKTOP");
16
+
17
+ const ua2 =
18
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36";
19
+ const result2 = parser.parse(ua2);
20
+ expect(result2.os).toBe("Windows");
21
+ expect(result2.browser).toBe("Chrome");
22
+ expect(result2.device).toBe("DESKTOP");
23
+
24
+ const firefoxUa =
25
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0";
26
+ const firefoxResult = parser.parse(firefoxUa);
27
+ expect(firefoxResult.os).toBe("Windows");
28
+ expect(firefoxResult.browser).toBe("Firefox");
29
+ expect(firefoxResult.device).toBe("DESKTOP");
30
+ });
31
+
32
+ it("should parse Android user agent", ({ expect }) => {
33
+ const ua =
34
+ "Mozilla/5.0 (Linux; Android 10; Pixel 3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 MOBILE Safari/537.36";
35
+ const result = parser.parse(ua);
36
+ expect(result.os).toBe("Android");
37
+ expect(result.browser).toBe("Chrome");
38
+ expect(result.device).toBe("MOBILE");
39
+ });
40
+
41
+ it("should parse iOS user agent", ({ expect }) => {
42
+ const ua =
43
+ "Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 MOBILE/15E148 Safari/604.1";
44
+ const result = parser.parse(ua);
45
+ expect(result.os).toBe("iOS");
46
+ expect(result.browser).toBe("Safari");
47
+ expect(result.device).toBe("MOBILE");
48
+ });
49
+
50
+ it("should parse MacOS user agent", ({ expect }) => {
51
+ const ua =
52
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Safari/605.1.15";
53
+ const result = parser.parse(ua);
54
+ expect(result.os).toBe("MacOS");
55
+ expect(result.browser).toBe("Safari");
56
+ expect(result.device).toBe("DESKTOP");
57
+ });
58
+
59
+ it("should parse Linux user agent", ({ expect }) => {
60
+ const ua =
61
+ "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36";
62
+ const result = parser.parse(ua);
63
+ expect(result.os).toBe("Linux");
64
+ expect(result.browser).toBe("Chrome");
65
+ expect(result.device).toBe("DESKTOP");
66
+ });
67
+
68
+ it("should parse FreeBSD user agent", ({ expect }) => {
69
+ const ua =
70
+ "Mozilla/5.0 (X11; FreeBSD amd64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36";
71
+ const result = parser.parse(ua);
72
+ expect(result.os).toBe("FreeBSD");
73
+ expect(result.browser).toBe("Chrome");
74
+ expect(result.device).toBe("DESKTOP");
75
+ });
76
+
77
+ it("should parse OpenBSD user agent", ({ expect }) => {
78
+ const ua =
79
+ "Mozilla/5.0 (X11; OpenBSD amd64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36";
80
+ const result = parser.parse(ua);
81
+ expect(result.os).toBe("OpenBSD");
82
+ expect(result.browser).toBe("Chrome");
83
+ expect(result.device).toBe("DESKTOP");
84
+ });
85
+
86
+ it("should parse ChromeOS user agent", ({ expect }) => {
87
+ const ua =
88
+ "Mozilla/5.0 (X11; CrOS x86_64 12345.67.89) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36";
89
+ const result = parser.parse(ua);
90
+ expect(result.os).toBe("ChromeOS");
91
+ expect(result.browser).toBe("Chrome");
92
+ expect(result.device).toBe("DESKTOP");
93
+ });
94
+
95
+ it("should parse BlackBerry user agent", ({ expect }) => {
96
+ const ua =
97
+ "Mozilla/5.0 (BB10; Touch) AppleWebKit/537.36 (KHTML, like Gecko) Version/10.3.2.2876 MOBILE Safari/537.36";
98
+ const result = parser.parse(ua);
99
+ expect(result.os).toBe("BlackBerry");
100
+ expect(result.browser).toBe("Safari");
101
+ expect(result.device).toBe("MOBILE");
102
+ });
103
+
104
+ it("should parse empty string", ({ expect }) => {
105
+ const ua = "";
106
+ const result = parser.parse(ua);
107
+ expect(result.os).toBe("Windows");
108
+ expect(result.browser).toBe("Chrome");
109
+ expect(result.device).toBe("DESKTOP");
110
+ });
111
+ });
@@ -0,0 +1,481 @@
1
+ import { Alepha } from "alepha";
2
+ import { $action, AlephaServer, ServerProvider } from "alepha/server";
3
+ import { afterEach, describe, expect, test } from "vitest";
4
+ import {
5
+ $cors,
6
+ AlephaServerCors,
7
+ corsOptions,
8
+ ServerCorsProvider,
9
+ type ServerCorsProviderOptions,
10
+ } from "../index.ts";
11
+
12
+ // A simple test action to hit
13
+ class TestApp {
14
+ hello = $action({
15
+ method: "POST",
16
+ handler: () => "world",
17
+ });
18
+ }
19
+
20
+ describe("ServerCorsProvider", () => {
21
+ let alepha: Alepha;
22
+ let server: ServerProvider;
23
+
24
+ const setupServer = async (options?: Partial<ServerCorsProviderOptions>) => {
25
+ alepha = Alepha.create()
26
+ .with(AlephaServer)
27
+ .with(AlephaServerCors)
28
+ .with(TestApp);
29
+
30
+ if (options) {
31
+ alepha.store.mut(corsOptions, (old) => ({
32
+ ...old,
33
+ ...options,
34
+ }));
35
+ }
36
+
37
+ server = alepha.inject(ServerProvider);
38
+
39
+ await alepha.start();
40
+ };
41
+
42
+ afterEach(async () => {
43
+ if (alepha) {
44
+ await alepha.stop();
45
+ }
46
+ });
47
+
48
+ test("should return correct CORS headers for a simple request from an allowed origin", async () => {
49
+ await setupServer({
50
+ origin: "https://allowed.example.com",
51
+ });
52
+
53
+ const response = await fetch(`${server.hostname}/api/hello`, {
54
+ method: "POST",
55
+ headers: {
56
+ Origin: "https://allowed.example.com",
57
+ },
58
+ });
59
+
60
+ expect(response.status).toBe(200);
61
+ expect(response.headers.get("access-control-allow-origin")).toBe(
62
+ "https://allowed.example.com",
63
+ );
64
+ expect(response.headers.get("access-control-allow-credentials")).toBe(
65
+ "true",
66
+ );
67
+ });
68
+
69
+ test("should handle wildcard origin correctly", async () => {
70
+ await setupServer({
71
+ origin: "*",
72
+ });
73
+
74
+ const response = await fetch(`${server.hostname}/api/hello`, {
75
+ method: "POST",
76
+ headers: {
77
+ origin: "https://any.origin.com",
78
+ },
79
+ });
80
+
81
+ expect(response.status).toBe(200);
82
+ // Note: Wildcard returns the specific origin, not '*' when credentials are not sent by browser
83
+ expect(response.headers.get("access-control-allow-origin")).toBe(
84
+ "https://any.origin.com",
85
+ );
86
+ });
87
+
88
+ test("should handle preflight OPTIONS request correctly", async () => {
89
+ await setupServer({
90
+ origin: "https://preflight.example.com",
91
+ methods: ["GET", "POST", "OPTIONS"],
92
+ headers: ["Content-Type", "X-Custom-Header"],
93
+ maxAge: 86400,
94
+ });
95
+
96
+ const response = await fetch(`${server.hostname}/api/hello`, {
97
+ method: "OPTIONS",
98
+ headers: {
99
+ Origin: "https://preflight.example.com",
100
+ "Access-Control-Request-Method": "POST",
101
+ "Access-Control-Request-Headers": "X-Custom-Header",
102
+ },
103
+ });
104
+
105
+ expect(response.status).toBe(204); // Preflight should return 204 No Content
106
+ expect(response.headers.get("access-control-allow-origin")).toBe(
107
+ "https://preflight.example.com",
108
+ );
109
+ expect(response.headers.get("access-control-allow-methods")).toBe(
110
+ "GET, POST, OPTIONS",
111
+ );
112
+ expect(response.headers.get("access-control-allow-headers")).toBe(
113
+ "Content-Type, X-Custom-Header",
114
+ );
115
+ expect(response.headers.get("access-control-max-age")).toBe("86400");
116
+ });
117
+
118
+ test("should NOT return CORS headers for a request from a disallowed origin", async () => {
119
+ await setupServer({
120
+ origin: "https://allowed.example.com",
121
+ });
122
+
123
+ const response = await fetch(`${server.hostname}/api/hello`, {
124
+ headers: {
125
+ Origin: "https://disallowed.example.com",
126
+ },
127
+ });
128
+
129
+ // The header should not be set because the origin is not in the allow list.
130
+ // Some servers might omit it, others might return null. Checking for not-allowed is key.
131
+ expect(response.headers.get("access-control-allow-origin")).not.toBe(
132
+ "https://disallowed.example.com",
133
+ );
134
+ });
135
+
136
+ test("should handle an array of allowed origins", async () => {
137
+ const allowedOrigins = [
138
+ "https://app1.example.com",
139
+ "https://app2.example.com",
140
+ ];
141
+ await setupServer({
142
+ origin: allowedOrigins.join(","),
143
+ });
144
+
145
+ // First allowed origin
146
+ const res1 = await fetch(`${server.hostname}/api/hello`, {
147
+ method: "POST",
148
+ headers: { Origin: allowedOrigins[0] },
149
+ });
150
+ expect(res1.headers.get("access-control-allow-origin")).toBe(
151
+ allowedOrigins[0],
152
+ );
153
+
154
+ // Second allowed origin
155
+ const res2 = await fetch(`${server.hostname}/api/hello`, {
156
+ method: "POST",
157
+ headers: { Origin: allowedOrigins[1] },
158
+ });
159
+ expect(res2.headers.get("access-control-allow-origin")).toBe(
160
+ allowedOrigins[1],
161
+ );
162
+
163
+ // Disallowed origin
164
+ const res3 = await fetch(`${server.hostname}/api/hello`, {
165
+ method: "POST",
166
+ headers: { Origin: "https://disallowed.com" },
167
+ });
168
+ expect(res3.headers.get("access-control-allow-origin")).toBeNull();
169
+ });
170
+
171
+ test("should not return CORS headers if Origin header is not present", async () => {
172
+ await setupServer();
173
+
174
+ const response = await fetch(`${server.hostname}/api/hello`); // No Origin header
175
+
176
+ expect(response.headers.get("access-control-allow-origin")).toBeNull();
177
+ });
178
+ });
179
+
180
+ // ---------------------------------------------------------------------------------------------------------------------
181
+
182
+ describe("$cors primitive", () => {
183
+ let alepha: Alepha;
184
+ let server: ServerProvider;
185
+
186
+ afterEach(async () => {
187
+ if (alepha) {
188
+ await alepha.stop();
189
+ }
190
+ });
191
+
192
+ test("should apply path-specific CORS config to matching routes", async () => {
193
+ class AppWithCors {
194
+ // Path-specific CORS for /api/v1/* routes
195
+ apiCors = $cors({
196
+ paths: ["/api/v1/*"],
197
+ origin: "https://api.example.com",
198
+ credentials: true,
199
+ });
200
+
201
+ // $action adds /api prefix, so path "/v1/data" becomes "/api/v1/data"
202
+ apiAction = $action({
203
+ path: "/v1/data",
204
+ method: "POST",
205
+ handler: () => "api",
206
+ });
207
+
208
+ // Path "/public/info" becomes "/api/public/info"
209
+ publicAction = $action({
210
+ path: "/public/info",
211
+ method: "POST",
212
+ handler: () => "public",
213
+ });
214
+ }
215
+
216
+ alepha = Alepha.create()
217
+ .with(AlephaServer)
218
+ .with(AlephaServerCors)
219
+ .with(AppWithCors);
220
+
221
+ // Set global CORS to different origin
222
+ alepha.store.mut(corsOptions, (old) => ({
223
+ ...old,
224
+ origin: "https://global.example.com",
225
+ }));
226
+
227
+ server = alepha.inject(ServerProvider);
228
+ await alepha.start();
229
+
230
+ // API route should use path-specific CORS (path is /api/v1/data)
231
+ const apiResponse = await fetch(`${server.hostname}/api/v1/data`, {
232
+ method: "POST",
233
+ headers: { Origin: "https://api.example.com" },
234
+ });
235
+ expect(apiResponse.headers.get("access-control-allow-origin")).toBe(
236
+ "https://api.example.com",
237
+ );
238
+
239
+ // Public route should use global CORS (api origin not allowed)
240
+ const publicResponse = await fetch(`${server.hostname}/api/public/info`, {
241
+ method: "POST",
242
+ headers: { Origin: "https://api.example.com" },
243
+ });
244
+ expect(
245
+ publicResponse.headers.get("access-control-allow-origin"),
246
+ ).toBeNull();
247
+
248
+ // Public route with global origin should work
249
+ const publicGlobalResponse = await fetch(
250
+ `${server.hostname}/api/public/info`,
251
+ {
252
+ method: "POST",
253
+ headers: { Origin: "https://global.example.com" },
254
+ },
255
+ );
256
+ expect(
257
+ publicGlobalResponse.headers.get("access-control-allow-origin"),
258
+ ).toBe("https://global.example.com");
259
+ });
260
+
261
+ test("should apply different CORS configs to different paths", async () => {
262
+ class MultiCorsApp {
263
+ // $action adds /api prefix, so patterns need /api/admin/* and /api/public/*
264
+ adminCors = $cors({
265
+ paths: ["/api/admin/*"],
266
+ origin: "https://admin.example.com",
267
+ methods: ["GET", "POST"],
268
+ });
269
+
270
+ publicCors = $cors({
271
+ paths: ["/api/public/*"],
272
+ origin: "*",
273
+ methods: ["GET"],
274
+ });
275
+
276
+ adminAction = $action({
277
+ path: "/admin/users",
278
+ method: "POST",
279
+ handler: () => "users",
280
+ });
281
+
282
+ publicAction = $action({
283
+ path: "/public/status",
284
+ method: "GET",
285
+ handler: () => "ok",
286
+ });
287
+ }
288
+
289
+ alepha = Alepha.create()
290
+ .with(AlephaServer)
291
+ .with(AlephaServerCors)
292
+ .with(MultiCorsApp);
293
+
294
+ server = alepha.inject(ServerProvider);
295
+ await alepha.start();
296
+
297
+ // Admin route with admin origin (actual path is /api/admin/users)
298
+ const adminResponse = await fetch(`${server.hostname}/api/admin/users`, {
299
+ method: "POST",
300
+ headers: { Origin: "https://admin.example.com" },
301
+ });
302
+ expect(adminResponse.headers.get("access-control-allow-origin")).toBe(
303
+ "https://admin.example.com",
304
+ );
305
+ expect(adminResponse.headers.get("access-control-allow-methods")).toBe(
306
+ "GET, POST",
307
+ );
308
+
309
+ // Public route with any origin (wildcard) (actual path is /api/public/status)
310
+ const publicResponse = await fetch(`${server.hostname}/api/public/status`, {
311
+ headers: { Origin: "https://any.example.com" },
312
+ });
313
+ expect(publicResponse.headers.get("access-control-allow-origin")).toBe(
314
+ "https://any.example.com",
315
+ );
316
+ expect(publicResponse.headers.get("access-control-allow-methods")).toBe(
317
+ "GET",
318
+ );
319
+ });
320
+
321
+ test("should register CORS configs with provider", async () => {
322
+ class RegistrationApp {
323
+ cors1 = $cors({
324
+ name: "api-cors",
325
+ paths: ["/api/*"],
326
+ origin: "https://api.example.com",
327
+ });
328
+
329
+ cors2 = $cors({
330
+ name: "admin-cors",
331
+ paths: ["/admin/*"],
332
+ origin: "https://admin.example.com",
333
+ });
334
+ }
335
+
336
+ alepha = Alepha.create()
337
+ .with(AlephaServer)
338
+ .with(AlephaServerCors)
339
+ .with(RegistrationApp);
340
+
341
+ const corsProvider = alepha.inject(ServerCorsProvider);
342
+ await alepha.start();
343
+
344
+ expect(corsProvider.registeredConfigs).toHaveLength(2);
345
+ expect(corsProvider.registeredConfigs[0].name).toBe("api-cors");
346
+ expect(corsProvider.registeredConfigs[1].name).toBe("admin-cors");
347
+ });
348
+
349
+ test("should merge path-specific config with global defaults", async () => {
350
+ class PartialConfigApp {
351
+ // Only override origin, use defaults for methods/headers
352
+ // $action creates route at /api/data, so use /api/* pattern
353
+ apiCors = $cors({
354
+ paths: ["/api/*"],
355
+ origin: "https://api.example.com",
356
+ // methods, headers, credentials should come from global defaults
357
+ });
358
+
359
+ // $action with path "/data" creates route at "/api/data"
360
+ apiAction = $action({
361
+ path: "/data",
362
+ method: "POST",
363
+ handler: () => "test",
364
+ });
365
+ }
366
+
367
+ alepha = Alepha.create()
368
+ .with(AlephaServer)
369
+ .with(AlephaServerCors)
370
+ .with(PartialConfigApp);
371
+
372
+ server = alepha.inject(ServerProvider);
373
+ await alepha.start();
374
+
375
+ const response = await fetch(`${server.hostname}/api/data`, {
376
+ method: "POST",
377
+ headers: { Origin: "https://api.example.com" },
378
+ });
379
+
380
+ // Path-specific origin
381
+ expect(response.headers.get("access-control-allow-origin")).toBe(
382
+ "https://api.example.com",
383
+ );
384
+ // Default methods
385
+ expect(response.headers.get("access-control-allow-methods")).toBe(
386
+ "GET, POST, PUT, PATCH, DELETE, OPTIONS",
387
+ );
388
+ // Default headers
389
+ expect(response.headers.get("access-control-allow-headers")).toBe(
390
+ "Content-Type, Authorization",
391
+ );
392
+ // Default credentials
393
+ expect(response.headers.get("access-control-allow-credentials")).toBe(
394
+ "true",
395
+ );
396
+ });
397
+
398
+ test("should apply maxAge to path-specific CORS", async () => {
399
+ class MaxAgeApp {
400
+ apiCors = $cors({
401
+ paths: ["/api/*"],
402
+ origin: "https://api.example.com",
403
+ maxAge: 3600,
404
+ });
405
+
406
+ // $action with path "/data" creates route at "/api/data"
407
+ apiAction = $action({
408
+ path: "/data",
409
+ method: "POST",
410
+ handler: () => "test",
411
+ });
412
+ }
413
+
414
+ alepha = Alepha.create()
415
+ .with(AlephaServer)
416
+ .with(AlephaServerCors)
417
+ .with(MaxAgeApp);
418
+
419
+ server = alepha.inject(ServerProvider);
420
+ await alepha.start();
421
+
422
+ const response = await fetch(`${server.hostname}/api/data`, {
423
+ method: "OPTIONS",
424
+ headers: {
425
+ Origin: "https://api.example.com",
426
+ "Access-Control-Request-Method": "POST",
427
+ },
428
+ });
429
+
430
+ expect(response.headers.get("access-control-max-age")).toBe("3600");
431
+ });
432
+
433
+ test("should handle multiple paths in single $cors primitive", async () => {
434
+ class MultiPathApp {
435
+ // $action creates routes at /api/v1/data and /api/v2/data
436
+ apiCors = $cors({
437
+ paths: ["/api/v1/*", "/api/v2/*"],
438
+ origin: "https://api.example.com",
439
+ });
440
+
441
+ // Route created at /api/v1/data
442
+ action1 = $action({
443
+ path: "/v1/data",
444
+ method: "POST",
445
+ handler: () => "v1",
446
+ });
447
+
448
+ // Route created at /api/v2/data
449
+ action2 = $action({
450
+ path: "/v2/data",
451
+ method: "POST",
452
+ handler: () => "v2",
453
+ });
454
+ }
455
+
456
+ alepha = Alepha.create()
457
+ .with(AlephaServer)
458
+ .with(AlephaServerCors)
459
+ .with(MultiPathApp);
460
+
461
+ server = alepha.inject(ServerProvider);
462
+ await alepha.start();
463
+
464
+ // Both paths should have the same CORS config
465
+ const v1Response = await fetch(`${server.hostname}/api/v1/data`, {
466
+ method: "POST",
467
+ headers: { Origin: "https://api.example.com" },
468
+ });
469
+ expect(v1Response.headers.get("access-control-allow-origin")).toBe(
470
+ "https://api.example.com",
471
+ );
472
+
473
+ const v2Response = await fetch(`${server.hostname}/api/v2/data`, {
474
+ method: "POST",
475
+ headers: { Origin: "https://api.example.com" },
476
+ });
477
+ expect(v2Response.headers.get("access-control-allow-origin")).toBe(
478
+ "https://api.example.com",
479
+ );
480
+ });
481
+ });
@@ -0,0 +1,22 @@
1
+ import { Alepha } from "alepha";
2
+ import { ServerProvider } from "alepha/server";
3
+ import { describe, expect, it } from "vitest";
4
+ import { AlephaServerHealth } from "../index.ts";
5
+
6
+ const alepha = Alepha.create().with(AlephaServerHealth);
7
+
8
+ describe("ServerHealthProvider", () => {
9
+ it("should expose health endpoint with server status", async () => {
10
+ const srv = alepha.inject(ServerProvider);
11
+ const hostname = srv.hostname;
12
+
13
+ const ping = await fetch(`${hostname}/health`);
14
+
15
+ expect(await ping.json()).toEqual({
16
+ message: "OK",
17
+ uptime: expect.any(Number),
18
+ date: expect.any(String),
19
+ ready: true,
20
+ });
21
+ });
22
+ });