alepha 0.14.2 → 0.14.4

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 (405) hide show
  1. package/README.md +1 -1
  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 +706 -785
  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 +58 -137
  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 +29 -108
  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 +504 -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 +277 -351
  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 +787 -852
  35. package/dist/api/users/index.d.ts.map +1 -1
  36. package/dist/api/users/index.js +827 -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 +128 -128
  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/bin/index.d.ts +1 -2
  45. package/dist/bin/index.js +0 -1
  46. package/dist/bin/index.js.map +1 -1
  47. package/dist/cli/index.d.ts +252 -131
  48. package/dist/cli/index.d.ts.map +1 -1
  49. package/dist/cli/index.js +595 -395
  50. package/dist/cli/index.js.map +1 -1
  51. package/dist/command/index.d.ts +46 -11
  52. package/dist/command/index.d.ts.map +1 -1
  53. package/dist/command/index.js +99 -19
  54. package/dist/command/index.js.map +1 -1
  55. package/dist/core/index.browser.js +40 -22
  56. package/dist/core/index.browser.js.map +1 -1
  57. package/dist/core/index.d.ts +45 -1
  58. package/dist/core/index.d.ts.map +1 -1
  59. package/dist/core/index.js +40 -22
  60. package/dist/core/index.js.map +1 -1
  61. package/dist/core/index.native.js +40 -22
  62. package/dist/core/index.native.js.map +1 -1
  63. package/dist/fake/index.js +195 -168
  64. package/dist/fake/index.js.map +1 -1
  65. package/dist/file/index.d.ts +8 -0
  66. package/dist/file/index.d.ts.map +1 -1
  67. package/dist/file/index.js +3 -0
  68. package/dist/file/index.js.map +1 -1
  69. package/dist/logger/index.d.ts +1 -1
  70. package/dist/logger/index.d.ts.map +1 -1
  71. package/dist/logger/index.js +12 -2
  72. package/dist/logger/index.js.map +1 -1
  73. package/dist/mcp/index.js +1 -1
  74. package/dist/mcp/index.js.map +1 -1
  75. package/dist/orm/index.d.ts +59 -195
  76. package/dist/orm/index.d.ts.map +1 -1
  77. package/dist/orm/index.js +201 -430
  78. package/dist/orm/index.js.map +1 -1
  79. package/dist/security/index.d.ts +1 -1
  80. package/dist/security/index.d.ts.map +1 -1
  81. package/dist/security/index.js +1 -1
  82. package/dist/security/index.js.map +1 -1
  83. package/dist/server/auth/index.d.ts +171 -155
  84. package/dist/server/auth/index.d.ts.map +1 -1
  85. package/dist/server/auth/index.js +0 -1
  86. package/dist/server/auth/index.js.map +1 -1
  87. package/dist/server/cache/index.d.ts +12 -0
  88. package/dist/server/cache/index.d.ts.map +1 -1
  89. package/dist/server/cache/index.js +55 -2
  90. package/dist/server/cache/index.js.map +1 -1
  91. package/dist/server/compress/index.d.ts +6 -0
  92. package/dist/server/compress/index.d.ts.map +1 -1
  93. package/dist/server/compress/index.js +38 -1
  94. package/dist/server/compress/index.js.map +1 -1
  95. package/dist/server/core/index.browser.js +2 -2
  96. package/dist/server/core/index.browser.js.map +1 -1
  97. package/dist/server/core/index.d.ts +10 -10
  98. package/dist/server/core/index.d.ts.map +1 -1
  99. package/dist/server/core/index.js +7 -4
  100. package/dist/server/core/index.js.map +1 -1
  101. package/dist/server/links/index.browser.js +22 -6
  102. package/dist/server/links/index.browser.js.map +1 -1
  103. package/dist/server/links/index.d.ts +46 -44
  104. package/dist/server/links/index.d.ts.map +1 -1
  105. package/dist/server/links/index.js +24 -41
  106. package/dist/server/links/index.js.map +1 -1
  107. package/dist/server/static/index.d.ts.map +1 -1
  108. package/dist/server/static/index.js +4 -0
  109. package/dist/server/static/index.js.map +1 -1
  110. package/dist/server/swagger/index.d.ts +2 -1
  111. package/dist/server/swagger/index.d.ts.map +1 -1
  112. package/dist/server/swagger/index.js +9 -5
  113. package/dist/server/swagger/index.js.map +1 -1
  114. package/dist/vite/index.d.ts +101 -106
  115. package/dist/vite/index.d.ts.map +1 -1
  116. package/dist/vite/index.js +574 -503
  117. package/dist/vite/index.js.map +1 -1
  118. package/dist/websocket/index.d.ts +7 -7
  119. package/package.json +7 -7
  120. package/src/api/audits/controllers/{AuditController.ts → AdminAuditController.ts} +5 -6
  121. package/src/api/audits/entities/audits.ts +5 -5
  122. package/src/api/audits/index.browser.ts +1 -1
  123. package/src/api/audits/index.ts +3 -3
  124. package/src/api/audits/primitives/$audit.spec.ts +276 -0
  125. package/src/api/audits/services/AuditService.spec.ts +495 -0
  126. package/src/api/files/__tests__/$bucket.spec.ts +91 -0
  127. package/src/api/files/controllers/AdminFileStatsController.spec.ts +166 -0
  128. package/src/api/files/controllers/{StorageStatsController.ts → AdminFileStatsController.ts} +2 -2
  129. package/src/api/files/controllers/FileController.spec.ts +558 -0
  130. package/src/api/files/controllers/FileController.ts +4 -5
  131. package/src/api/files/entities/files.ts +5 -5
  132. package/src/api/files/index.browser.ts +1 -1
  133. package/src/api/files/index.ts +4 -4
  134. package/src/api/files/jobs/FileJobs.spec.ts +52 -0
  135. package/src/api/files/services/FileService.spec.ts +109 -0
  136. package/src/api/jobs/__tests__/JobController.spec.ts +343 -0
  137. package/src/api/jobs/controllers/{JobController.ts → AdminJobController.ts} +2 -2
  138. package/src/api/jobs/entities/jobExecutions.ts +5 -5
  139. package/src/api/jobs/index.ts +3 -3
  140. package/src/api/jobs/primitives/$job.spec.ts +476 -0
  141. package/src/api/notifications/controllers/{NotificationController.ts → AdminNotificationController.ts} +4 -5
  142. package/src/api/notifications/entities/notifications.ts +5 -5
  143. package/src/api/notifications/index.browser.ts +1 -1
  144. package/src/api/notifications/index.ts +4 -4
  145. package/src/api/parameters/controllers/{ConfigController.ts → AdminConfigController.ts} +46 -107
  146. package/src/api/parameters/entities/parameters.ts +7 -17
  147. package/src/api/parameters/index.ts +3 -3
  148. package/src/api/parameters/primitives/$config.spec.ts +356 -0
  149. package/src/api/parameters/schemas/activateConfigBodySchema.ts +12 -0
  150. package/src/api/parameters/schemas/checkScheduledResponseSchema.ts +8 -0
  151. package/src/api/parameters/schemas/configCurrentResponseSchema.ts +13 -0
  152. package/src/api/parameters/schemas/configHistoryResponseSchema.ts +9 -0
  153. package/src/api/parameters/schemas/configNameParamSchema.ts +10 -0
  154. package/src/api/parameters/schemas/configNamesResponseSchema.ts +8 -0
  155. package/src/api/parameters/schemas/configTreeNodeSchema.ts +13 -0
  156. package/src/api/parameters/schemas/configVersionParamSchema.ts +9 -0
  157. package/src/api/parameters/schemas/configVersionResponseSchema.ts +9 -0
  158. package/src/api/parameters/schemas/configsByStatusResponseSchema.ts +9 -0
  159. package/src/api/parameters/schemas/createConfigVersionBodySchema.ts +24 -0
  160. package/src/api/parameters/schemas/index.ts +15 -0
  161. package/src/api/parameters/schemas/parameterResponseSchema.ts +26 -0
  162. package/src/api/parameters/schemas/parameterStatusSchema.ts +13 -0
  163. package/src/api/parameters/schemas/rollbackConfigBodySchema.ts +15 -0
  164. package/src/api/parameters/schemas/statusParamSchema.ts +9 -0
  165. package/src/api/users/__tests__/EmailVerification.spec.ts +369 -0
  166. package/src/api/users/__tests__/PasswordReset.spec.ts +550 -0
  167. package/src/api/users/controllers/AdminIdentityController.spec.ts +365 -0
  168. package/src/api/users/controllers/{IdentityController.ts → AdminIdentityController.ts} +3 -4
  169. package/src/api/users/controllers/AdminSessionController.spec.ts +274 -0
  170. package/src/api/users/controllers/{SessionController.ts → AdminSessionController.ts} +3 -4
  171. package/src/api/users/controllers/AdminUserController.spec.ts +372 -0
  172. package/src/api/users/controllers/AdminUserController.ts +116 -0
  173. package/src/api/users/controllers/UserController.ts +4 -107
  174. package/src/api/users/controllers/UserRealmController.ts +3 -0
  175. package/src/api/users/entities/identities.ts +6 -6
  176. package/src/api/users/entities/sessions.ts +6 -6
  177. package/src/api/users/entities/users.ts +9 -9
  178. package/src/api/users/index.ts +9 -6
  179. package/src/api/users/primitives/$userRealm.ts +13 -8
  180. package/src/api/users/services/CredentialService.spec.ts +509 -0
  181. package/src/api/users/services/CredentialService.ts +46 -0
  182. package/src/api/users/services/IdentityService.ts +15 -0
  183. package/src/api/users/services/RegistrationService.spec.ts +630 -0
  184. package/src/api/users/services/RegistrationService.ts +18 -0
  185. package/src/api/users/services/SessionService.spec.ts +301 -0
  186. package/src/api/users/services/SessionService.ts +110 -1
  187. package/src/api/users/services/UserService.ts +67 -2
  188. package/src/api/verifications/__tests__/CodeVerification.spec.ts +318 -0
  189. package/src/api/verifications/__tests__/LinkVerification.spec.ts +279 -0
  190. package/src/api/verifications/entities/verifications.ts +6 -6
  191. package/src/api/verifications/jobs/VerificationJobs.spec.ts +50 -0
  192. package/src/batch/__tests__/startup-buffering.spec.ts +458 -0
  193. package/src/batch/primitives/$batch.spec.ts +766 -0
  194. package/src/batch/providers/BatchProvider.spec.ts +786 -0
  195. package/src/bin/index.ts +0 -1
  196. package/src/bucket/__tests__/shared.ts +194 -0
  197. package/src/bucket/primitives/$bucket.spec.ts +104 -0
  198. package/src/bucket/providers/FileStorageProvider.spec.ts +13 -0
  199. package/src/bucket/providers/LocalFileStorageProvider.spec.ts +77 -0
  200. package/src/bucket/providers/MemoryFileStorageProvider.spec.ts +82 -0
  201. package/src/cache/core/__tests__/shared.ts +377 -0
  202. package/src/cache/core/primitives/$cache.spec.ts +111 -0
  203. package/src/cache/redis/__tests__/cache-redis.spec.ts +70 -0
  204. package/src/cli/apps/AlephaCli.ts +25 -6
  205. package/src/cli/atoms/buildOptions.ts +88 -0
  206. package/src/cli/commands/build.ts +32 -69
  207. package/src/cli/commands/db.ts +0 -4
  208. package/src/cli/commands/dev.ts +34 -10
  209. package/src/cli/commands/gen/changelog.spec.ts +315 -0
  210. package/src/cli/commands/{changelog.ts → gen/changelog.ts} +9 -9
  211. package/src/cli/commands/gen/env.ts +53 -0
  212. package/src/cli/commands/gen/openapi.ts +71 -0
  213. package/src/cli/commands/gen/resource.ts +15 -0
  214. package/src/cli/commands/gen.ts +24 -0
  215. package/src/cli/commands/init.ts +2 -1
  216. package/src/cli/commands/root.ts +12 -3
  217. package/src/cli/commands/test.ts +0 -1
  218. package/src/cli/commands/typecheck.ts +5 -0
  219. package/src/cli/commands/verify.ts +1 -1
  220. package/src/cli/defineConfig.ts +49 -7
  221. package/src/cli/index.ts +2 -2
  222. package/src/cli/services/AlephaCliUtils.ts +105 -55
  223. package/src/cli/services/GitMessageParser.ts +1 -1
  224. package/src/command/helpers/Asker.spec.ts +127 -0
  225. package/src/command/helpers/Runner.spec.ts +126 -0
  226. package/src/command/helpers/Runner.ts +1 -1
  227. package/src/command/primitives/$command.spec.ts +1588 -0
  228. package/src/command/primitives/$command.ts +0 -6
  229. package/src/command/providers/CliProvider.ts +75 -27
  230. package/src/core/Alepha.ts +87 -0
  231. package/src/core/__tests__/Alepha-emit.spec.ts +22 -0
  232. package/src/core/__tests__/Alepha-graph.spec.ts +93 -0
  233. package/src/core/__tests__/Alepha-has.spec.ts +41 -0
  234. package/src/core/__tests__/Alepha-inject.spec.ts +93 -0
  235. package/src/core/__tests__/Alepha-register.spec.ts +81 -0
  236. package/src/core/__tests__/Alepha-start.spec.ts +176 -0
  237. package/src/core/__tests__/Alepha-with.spec.ts +14 -0
  238. package/src/core/__tests__/TypeBox-usecases.spec.ts +35 -0
  239. package/src/core/__tests__/TypeBoxLocale.spec.ts +15 -0
  240. package/src/core/__tests__/descriptor.spec.ts +34 -0
  241. package/src/core/__tests__/fixtures/A.ts +5 -0
  242. package/src/core/__tests__/pagination.spec.ts +77 -0
  243. package/src/core/helpers/jsonSchemaToTypeBox.ts +2 -2
  244. package/src/core/primitives/$atom.spec.ts +43 -0
  245. package/src/core/primitives/$hook.spec.ts +130 -0
  246. package/src/core/primitives/$inject.spec.ts +175 -0
  247. package/src/core/primitives/$module.spec.ts +115 -0
  248. package/src/core/providers/CodecManager.spec.ts +740 -0
  249. package/src/core/providers/EventManager.spec.ts +762 -0
  250. package/src/core/providers/EventManager.ts +4 -0
  251. package/src/core/providers/StateManager.spec.ts +365 -0
  252. package/src/core/providers/TypeProvider.spec.ts +1607 -0
  253. package/src/core/providers/TypeProvider.ts +20 -26
  254. package/src/datetime/primitives/$interval.spec.ts +103 -0
  255. package/src/datetime/providers/DateTimeProvider.spec.ts +86 -0
  256. package/src/email/primitives/$email.spec.ts +175 -0
  257. package/src/email/providers/LocalEmailProvider.spec.ts +341 -0
  258. package/src/fake/__tests__/keyName.example.ts +40 -0
  259. package/src/fake/__tests__/keyName.spec.ts +152 -0
  260. package/src/fake/__tests__/module.example.ts +32 -0
  261. package/src/fake/providers/FakeProvider.spec.ts +438 -0
  262. package/src/file/providers/FileSystemProvider.ts +8 -0
  263. package/src/file/providers/NodeFileSystemProvider.spec.ts +418 -0
  264. package/src/file/providers/NodeFileSystemProvider.ts +5 -0
  265. package/src/file/services/FileDetector.spec.ts +591 -0
  266. package/src/lock/core/__tests__/shared.ts +190 -0
  267. package/src/lock/core/providers/MemoryLockProvider.spec.ts +25 -0
  268. package/src/lock/redis/providers/RedisLockProvider.spec.ts +25 -0
  269. package/src/logger/__tests__/SimpleFormatterProvider.spec.ts +109 -0
  270. package/src/logger/index.ts +15 -3
  271. package/src/logger/primitives/$logger.spec.ts +108 -0
  272. package/src/logger/services/Logger.spec.ts +295 -0
  273. package/src/mcp/__tests__/errors.spec.ts +175 -0
  274. package/src/mcp/__tests__/integration.spec.ts +450 -0
  275. package/src/mcp/helpers/jsonrpc.spec.ts +380 -0
  276. package/src/mcp/primitives/$prompt.spec.ts +468 -0
  277. package/src/mcp/primitives/$resource.spec.ts +390 -0
  278. package/src/mcp/primitives/$tool.spec.ts +406 -0
  279. package/src/mcp/providers/McpServerProvider.spec.ts +797 -0
  280. package/src/mcp/transports/StdioMcpTransport.ts +1 -1
  281. package/src/orm/__tests__/$repository-crud.spec.ts +276 -0
  282. package/src/orm/__tests__/$repository-hooks.spec.ts +325 -0
  283. package/src/orm/__tests__/$repository-orderBy.spec.ts +128 -0
  284. package/src/orm/__tests__/$repository-pagination-sort.spec.ts +149 -0
  285. package/src/orm/__tests__/$repository-save.spec.ts +37 -0
  286. package/src/orm/__tests__/ModelBuilder-integration.spec.ts +490 -0
  287. package/src/orm/__tests__/ModelBuilder-types.spec.ts +186 -0
  288. package/src/orm/__tests__/PostgresProvider.spec.ts +46 -0
  289. package/src/orm/__tests__/delete-returning.spec.ts +256 -0
  290. package/src/orm/__tests__/deletedAt.spec.ts +80 -0
  291. package/src/orm/__tests__/enums.spec.ts +315 -0
  292. package/src/orm/__tests__/execute.spec.ts +72 -0
  293. package/src/orm/__tests__/fixtures/bigEntitySchema.ts +65 -0
  294. package/src/orm/__tests__/fixtures/userEntitySchema.ts +27 -0
  295. package/src/orm/__tests__/joins.spec.ts +1114 -0
  296. package/src/orm/__tests__/page.spec.ts +287 -0
  297. package/src/orm/__tests__/primaryKey.spec.ts +87 -0
  298. package/src/orm/__tests__/query-date-encoding.spec.ts +402 -0
  299. package/src/orm/__tests__/ref-auto-onDelete.spec.ts +156 -0
  300. package/src/orm/__tests__/references.spec.ts +102 -0
  301. package/src/orm/__tests__/security.spec.ts +710 -0
  302. package/src/orm/__tests__/sqlite.spec.ts +111 -0
  303. package/src/orm/__tests__/string-operators.spec.ts +429 -0
  304. package/src/orm/__tests__/timestamps.spec.ts +388 -0
  305. package/src/orm/__tests__/validation.spec.ts +183 -0
  306. package/src/orm/__tests__/version.spec.ts +64 -0
  307. package/src/orm/helpers/parseQueryString.spec.ts +196 -0
  308. package/src/orm/index.ts +2 -8
  309. package/src/orm/primitives/$repository.spec.ts +137 -0
  310. package/src/orm/primitives/$sequence.spec.ts +29 -0
  311. package/src/orm/primitives/$transaction.spec.ts +82 -0
  312. package/src/orm/providers/drivers/BunPostgresProvider.ts +3 -3
  313. package/src/orm/providers/drivers/BunSqliteProvider.ts +1 -1
  314. package/src/orm/providers/drivers/CloudflareD1Provider.ts +1 -1
  315. package/src/orm/providers/drivers/DatabaseProvider.ts +1 -1
  316. package/src/orm/providers/drivers/NodePostgresProvider.ts +3 -3
  317. package/src/orm/providers/drivers/NodeSqliteProvider.ts +1 -1
  318. package/src/orm/providers/drivers/PglitePostgresProvider.ts +2 -2
  319. package/src/orm/services/ModelBuilder.spec.ts +575 -0
  320. package/src/orm/services/Repository.spec.ts +137 -0
  321. package/src/queue/core/__tests__/shared.ts +143 -0
  322. package/src/queue/core/providers/MemoryQueueProvider.spec.ts +23 -0
  323. package/src/queue/core/providers/WorkerProvider.spec.ts +394 -0
  324. package/src/queue/redis/providers/RedisQueueProvider.spec.ts +23 -0
  325. package/src/redis/__tests__/redis.spec.ts +58 -0
  326. package/src/retry/primitives/$retry.spec.ts +234 -0
  327. package/src/retry/providers/RetryProvider.spec.ts +438 -0
  328. package/src/router/__tests__/match.spec.ts +252 -0
  329. package/src/router/providers/RouterProvider.spec.ts +197 -0
  330. package/src/scheduler/__tests__/$scheduler-cron.spec.ts +25 -0
  331. package/src/scheduler/__tests__/$scheduler-interval.spec.ts +25 -0
  332. package/src/scheduler/__tests__/shared.ts +77 -0
  333. package/src/security/__tests__/bug-1-wildcard-after-start.spec.ts +229 -0
  334. package/src/security/__tests__/bug-2-password-validation.spec.ts +245 -0
  335. package/src/security/__tests__/bug-3-regex-vulnerability.spec.ts +407 -0
  336. package/src/security/__tests__/bug-4-oauth2-validation.spec.ts +439 -0
  337. package/src/security/__tests__/multi-layer-permissions.spec.ts +522 -0
  338. package/src/security/primitives/$permission.spec.ts +30 -0
  339. package/src/security/primitives/$permission.ts +2 -2
  340. package/src/security/primitives/$realm.spec.ts +101 -0
  341. package/src/security/primitives/$role.spec.ts +52 -0
  342. package/src/security/primitives/$serviceAccount.spec.ts +61 -0
  343. package/src/security/providers/SecurityProvider.spec.ts +350 -0
  344. package/src/server/auth/providers/ServerAuthProvider.ts +0 -2
  345. package/src/server/cache/providers/ServerCacheProvider.spec.ts +1125 -0
  346. package/src/server/cache/providers/ServerCacheProvider.ts +94 -9
  347. package/src/server/compress/providers/ServerCompressProvider.spec.ts +31 -0
  348. package/src/server/compress/providers/ServerCompressProvider.ts +63 -2
  349. package/src/server/cookies/providers/ServerCookiesProvider.spec.ts +253 -0
  350. package/src/server/core/__tests__/ServerRouterProvider-getRoutes.spec.ts +334 -0
  351. package/src/server/core/__tests__/ServerRouterProvider-requestId.spec.ts +129 -0
  352. package/src/server/core/helpers/ServerReply.ts +2 -2
  353. package/src/server/core/primitives/$action.spec.ts +191 -0
  354. package/src/server/core/primitives/$route.spec.ts +65 -0
  355. package/src/server/core/providers/ServerBodyParserProvider.spec.ts +93 -0
  356. package/src/server/core/providers/ServerLoggerProvider.spec.ts +100 -0
  357. package/src/server/core/providers/ServerProvider.ts +14 -2
  358. package/src/server/core/services/HttpClient.spec.ts +123 -0
  359. package/src/server/core/services/UserAgentParser.spec.ts +111 -0
  360. package/src/server/cors/providers/ServerCorsProvider.spec.ts +481 -0
  361. package/src/server/health/providers/ServerHealthProvider.spec.ts +22 -0
  362. package/src/server/helmet/providers/ServerHelmetProvider.spec.ts +105 -0
  363. package/src/server/links/__tests__/$action.spec.ts +238 -0
  364. package/src/server/links/__tests__/fixtures/CrudApp.ts +122 -0
  365. package/src/server/links/__tests__/requestId.spec.ts +120 -0
  366. package/src/server/links/primitives/$remote.spec.ts +228 -0
  367. package/src/server/links/providers/LinkProvider.spec.ts +54 -0
  368. package/src/server/links/providers/LinkProvider.ts +49 -3
  369. package/src/server/links/providers/ServerLinksProvider.ts +1 -53
  370. package/src/server/links/schemas/apiLinksResponseSchema.ts +7 -0
  371. package/src/server/metrics/providers/ServerMetricsProvider.spec.ts +25 -0
  372. package/src/server/multipart/providers/ServerMultipartProvider.spec.ts +528 -0
  373. package/src/server/proxy/primitives/$proxy.spec.ts +87 -0
  374. package/src/server/rate-limit/__tests__/ActionRateLimit.spec.ts +211 -0
  375. package/src/server/rate-limit/providers/ServerRateLimitProvider.spec.ts +344 -0
  376. package/src/server/security/__tests__/BasicAuth.spec.ts +684 -0
  377. package/src/server/security/__tests__/ServerSecurityProvider-realm.spec.ts +388 -0
  378. package/src/server/security/providers/ServerSecurityProvider.spec.ts +123 -0
  379. package/src/server/static/primitives/$serve.spec.ts +193 -0
  380. package/src/server/static/providers/ServerStaticProvider.ts +10 -0
  381. package/src/server/swagger/__tests__/ui.spec.ts +52 -0
  382. package/src/server/swagger/primitives/$swagger.spec.ts +193 -0
  383. package/src/server/swagger/providers/ServerSwaggerProvider.ts +19 -12
  384. package/src/sms/primitives/$sms.spec.ts +165 -0
  385. package/src/sms/providers/LocalSmsProvider.spec.ts +224 -0
  386. package/src/sms/providers/MemorySmsProvider.spec.ts +193 -0
  387. package/src/thread/primitives/$thread.spec.ts +186 -0
  388. package/src/topic/core/__tests__/shared.ts +144 -0
  389. package/src/topic/core/providers/MemoryTopicProvider.spec.ts +23 -0
  390. package/src/topic/redis/providers/RedisTopicProvider.spec.ts +23 -0
  391. package/src/vite/helpers/importViteReact.ts +13 -0
  392. package/src/vite/index.ts +1 -21
  393. package/src/vite/plugins/viteAlephaDev.ts +32 -5
  394. package/src/vite/plugins/viteAlephaSsrPreload.ts +222 -0
  395. package/src/vite/tasks/buildClient.ts +11 -0
  396. package/src/vite/tasks/buildServer.ts +47 -3
  397. package/src/vite/tasks/devServer.ts +69 -0
  398. package/src/vite/tasks/index.ts +2 -1
  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/assets/viteConfigTs.ts +0 -14
  403. package/src/cli/commands/run.ts +0 -24
  404. package/src/vite/plugins/viteAlepha.ts +0 -37
  405. package/src/vite/plugins/viteAlephaBuild.ts +0 -281
@@ -0,0 +1,143 @@
1
+ import { $inject, Alepha, type Service, t } from "alepha";
2
+ import {
3
+ $consumer,
4
+ $queue,
5
+ MemoryQueueProvider,
6
+ QueueProvider,
7
+ WorkerProvider,
8
+ } from "alepha/queue";
9
+ import { expect } from "vitest";
10
+
11
+ export const payloadSchema = t.object({
12
+ id: t.text(),
13
+ count: t.integer(),
14
+ });
15
+
16
+ export const queueList: Record<string, string[]> = {};
17
+ export class SharedQueueProvider extends MemoryQueueProvider {
18
+ queueList = queueList;
19
+ }
20
+
21
+ export const testQueueBasic = async (provider: Service<QueueProvider>) => {
22
+ class TestQueue {
23
+ q = $queue({
24
+ name: "test",
25
+ schema: payloadSchema,
26
+ });
27
+ }
28
+
29
+ class TestConsumer {
30
+ stack: string[] = [];
31
+ test = $inject(TestQueue);
32
+ s = $consumer({
33
+ queue: this.test.q,
34
+ handler: async (m) => {
35
+ this.stack.push(m.payload.id + m.payload.count);
36
+ },
37
+ });
38
+ }
39
+
40
+ const createApp = async <T extends object>(
41
+ testClass: Service<T>,
42
+ ): Promise<{ app: Alepha; test: T }> => {
43
+ const app = Alepha.create({
44
+ env: {
45
+ QUEUE_WORKER_INTERVAL: 10,
46
+ },
47
+ });
48
+
49
+ app.with({
50
+ provide: QueueProvider,
51
+ use: provider,
52
+ });
53
+
54
+ const test = app.inject(testClass);
55
+
56
+ await app.start();
57
+
58
+ return { app, test };
59
+ };
60
+
61
+ const { app: app1, test: test1 } = await createApp(TestQueue);
62
+ const { app: app2, test: test2 } = await createApp(TestQueue);
63
+ const { app: app3, test: test3 } = await createApp(TestConsumer);
64
+
65
+ await test1.q.push({ id: "1", count: 2 });
66
+ await test2.q.push({ id: "2", count: 3 });
67
+
68
+ await expect
69
+ .poll(() => expect(test3.stack).toEqual(["12", "23"]))
70
+ .toBeTruthy();
71
+
72
+ await app1.stop();
73
+ await app2.stop();
74
+ await app3.stop();
75
+ };
76
+
77
+ export const testQueueHasConsumer = async (
78
+ provider: Service<QueueProvider>,
79
+ ) => {
80
+ let count = 0;
81
+ class A {
82
+ q = $queue({
83
+ schema: t.object({ n: t.integer() }),
84
+ handler: async ({ payload }) => {
85
+ count += payload.n;
86
+ },
87
+ });
88
+ }
89
+ const app = Alepha.create()
90
+ .with({
91
+ provide: QueueProvider,
92
+ use: provider,
93
+ })
94
+ .with(A);
95
+
96
+ await app.start();
97
+ expect(count).toBe(0);
98
+
99
+ await app.inject(A).q.push({ n: 123 });
100
+ await expect.poll(() => expect(count).toBe(123)).toBeTruthy();
101
+ };
102
+
103
+ export const testQueueKillWorkerSleep = async (
104
+ provider: Service<QueueProvider>,
105
+ ) => {
106
+ let count = 0;
107
+ class A {
108
+ q = $queue({
109
+ schema: t.object({}),
110
+ });
111
+ c = $consumer({
112
+ queue: this.q,
113
+ handler: async () => {},
114
+ });
115
+ }
116
+
117
+ const app = Alepha.create({
118
+ env: {
119
+ QUEUE_WORKER_INTERVAL: 10000,
120
+ },
121
+ })
122
+ .with({
123
+ provide: QueueProvider,
124
+ use: provider,
125
+ })
126
+ .with({
127
+ provide: WorkerProvider,
128
+ use: class FakeQueueDescriptorProvider extends WorkerProvider {
129
+ async stopWorkers() {
130
+ await super.stopWorkers();
131
+ count += 123;
132
+ }
133
+ },
134
+ })
135
+ .with(A);
136
+
137
+ expect(count).toBe(0);
138
+ await app.start();
139
+ expect(count).toBe(0);
140
+
141
+ await app.stop();
142
+ expect(count).toBe(123);
143
+ };
@@ -0,0 +1,23 @@
1
+ import { describe, test } from "vitest";
2
+ import {
3
+ SharedQueueProvider,
4
+ testQueueBasic,
5
+ testQueueHasConsumer,
6
+ testQueueKillWorkerSleep,
7
+ } from "../__tests__/shared.ts";
8
+
9
+ describe("MemoryQueueProvider", () => {
10
+ const Provider = SharedQueueProvider;
11
+
12
+ test("should push and pop with consumer", async () => {
13
+ await testQueueBasic(Provider);
14
+ });
15
+
16
+ test("should push and pop with handler", async () => {
17
+ await testQueueHasConsumer(Provider);
18
+ });
19
+
20
+ test("should wake up workers on push", async () => {
21
+ await testQueueKillWorkerSleep(Provider);
22
+ });
23
+ });
@@ -0,0 +1,394 @@
1
+ import { Alepha, t } from "alepha";
2
+ import { $logger } from "alepha/logger";
3
+ import { describe, expect, test, vi } from "vitest";
4
+ import {
5
+ $consumer,
6
+ $queue,
7
+ MemoryQueueProvider,
8
+ QueueProvider,
9
+ WorkerProvider,
10
+ } from "../index.ts";
11
+
12
+ const payloadSchema = t.object({
13
+ id: t.text(),
14
+ count: t.integer(),
15
+ });
16
+
17
+ class TestWorkerProvider extends WorkerProvider {
18
+ public readonly log = $logger();
19
+ public workersRunning = 0;
20
+ public workerIntervals: Record<number, number> = {};
21
+ public abortController = new AbortController();
22
+ public waitForNextMessage(n: number): Promise<void> {
23
+ return super.waitForNextMessage(n);
24
+ }
25
+ }
26
+
27
+ describe("WorkerProvider", () => {
28
+ const createTestApp = async (
29
+ options: {
30
+ workerConcurrency?: number;
31
+ workerInterval?: number;
32
+ workerMaxInterval?: number;
33
+ } = {},
34
+ ) => {
35
+ const app = Alepha.create({
36
+ env: {
37
+ QUEUE_WORKER_CONCURRENCY: options.workerConcurrency ?? 1,
38
+ QUEUE_WORKER_INTERVAL: options.workerInterval ?? 10,
39
+ QUEUE_WORKER_MAX_INTERVAL: options.workerMaxInterval ?? 1000,
40
+ },
41
+ });
42
+
43
+ app.with({
44
+ provide: WorkerProvider,
45
+ use: TestWorkerProvider,
46
+ });
47
+
48
+ app.with({
49
+ provide: QueueProvider,
50
+ use: MemoryQueueProvider,
51
+ });
52
+
53
+ return app;
54
+ };
55
+
56
+ describe("Worker Lifecycle", () => {
57
+ test("should start workers when consumers are present", async () => {
58
+ class TestService {
59
+ queue = $queue({
60
+ name: "test",
61
+ schema: payloadSchema,
62
+ handler: async () => {
63
+ // Just a dummy handler for this test
64
+ },
65
+ });
66
+ }
67
+
68
+ const app = await createTestApp();
69
+ app.with(TestService);
70
+
71
+ const workerProvider = app.inject(TestWorkerProvider);
72
+ const logSpy = vi.spyOn(workerProvider.log, "debug");
73
+
74
+ await app.start();
75
+
76
+ expect(logSpy).toHaveBeenCalledWith("Starting worker n-0");
77
+ expect(workerProvider.workersRunning).toBe(1);
78
+
79
+ await app.stop();
80
+ expect(workerProvider.workersRunning).toBe(0);
81
+ });
82
+
83
+ test("should start multiple workers with concurrency", async () => {
84
+ class TestService {
85
+ queue = $queue({
86
+ name: "test",
87
+ schema: payloadSchema,
88
+ handler: async () => {},
89
+ });
90
+ }
91
+
92
+ const app = await createTestApp({ workerConcurrency: 3 });
93
+ app.with(TestService);
94
+
95
+ const workerProvider = app.inject(TestWorkerProvider);
96
+ const logSpy = vi.spyOn(workerProvider.log, "debug");
97
+
98
+ await app.start();
99
+
100
+ expect(logSpy).toHaveBeenCalledWith("Starting worker n-0");
101
+ expect(logSpy).toHaveBeenCalledWith("Starting worker n-1");
102
+ expect(logSpy).toHaveBeenCalledWith("Starting worker n-2");
103
+ expect(workerProvider.workersRunning).toBe(3);
104
+
105
+ await app.stop();
106
+ expect(workerProvider.workersRunning).toBe(0);
107
+ });
108
+
109
+ test("should not start workers when no consumers", async () => {
110
+ const app = await createTestApp();
111
+
112
+ const workerProvider = app.inject(TestWorkerProvider);
113
+ const logSpy = vi.spyOn(workerProvider.log, "debug");
114
+
115
+ await app.start();
116
+
117
+ expect(logSpy).not.toHaveBeenCalledWith(
118
+ expect.stringMatching(/Starting worker/),
119
+ );
120
+ expect(workerProvider.workersRunning).toBe(0);
121
+
122
+ await app.stop();
123
+ });
124
+ });
125
+
126
+ describe("WakeUp Functionality", () => {
127
+ test("should wake up workers and start missing ones", async () => {
128
+ class TestService {
129
+ queue = $queue({
130
+ name: "test",
131
+ schema: payloadSchema,
132
+ handler: async () => {},
133
+ });
134
+ }
135
+
136
+ const app = await createTestApp({ workerConcurrency: 2 });
137
+ app.with(TestService);
138
+
139
+ const workerProvider = app.inject(TestWorkerProvider);
140
+ const debugSpy = vi.spyOn(workerProvider.log, "debug");
141
+
142
+ await app.start();
143
+ expect(workerProvider.workersRunning).toBe(2);
144
+
145
+ // Simulate worker crash by manually decrementing counter
146
+ workerProvider.workersRunning = 1;
147
+
148
+ // Call wakeUp - should detect missing worker and restart it
149
+ workerProvider.wakeUp();
150
+
151
+ expect(debugSpy).toHaveBeenCalledWith("Waking up workers...");
152
+ expect(workerProvider.workersRunning).toBe(2);
153
+
154
+ await app.stop();
155
+ });
156
+
157
+ test("should create new AbortController on wakeUp", async () => {
158
+ class TestService {
159
+ queue = $queue({
160
+ name: "test",
161
+ schema: payloadSchema,
162
+ handler: async () => {},
163
+ });
164
+ }
165
+
166
+ const app = await createTestApp();
167
+ app.with(TestService);
168
+
169
+ const workerProvider = app.inject(TestWorkerProvider);
170
+
171
+ await app.start();
172
+
173
+ const oldController = workerProvider.abortController;
174
+ expect(oldController.signal.aborted).toBe(false);
175
+
176
+ workerProvider.wakeUp();
177
+
178
+ const newController = workerProvider.abortController;
179
+ expect(oldController.signal.aborted).toBe(true);
180
+ expect(newController.signal.aborted).toBe(false);
181
+ expect(newController).not.toBe(oldController);
182
+
183
+ await app.stop();
184
+ });
185
+ });
186
+
187
+ describe("Message Processing", () => {
188
+ test("should process messages correctly", async () => {
189
+ const messages: any[] = [];
190
+
191
+ class TestService {
192
+ queue = $queue({
193
+ schema: payloadSchema,
194
+ handler: async ({ payload }) => {
195
+ messages.push(payload);
196
+ },
197
+ });
198
+ }
199
+
200
+ const app = await createTestApp({ workerInterval: 5 });
201
+ app.with(TestService);
202
+
203
+ await app.start();
204
+
205
+ const testService = app.inject(TestService);
206
+ await testService.queue.push({ id: "msg1", count: 5 });
207
+ await testService.queue.push({ id: "msg2", count: 10 });
208
+
209
+ await expect
210
+ .poll(() => messages.length === 2, { timeout: 1000 })
211
+ .toBeTruthy();
212
+ expect(messages).toEqual([
213
+ { id: "msg1", count: 5 },
214
+ { id: "msg2", count: 10 },
215
+ ]);
216
+
217
+ await app.stop();
218
+ });
219
+
220
+ test("should handle message processing errors gracefully", async () => {
221
+ class TestService {
222
+ queue = $queue({
223
+ name: "test",
224
+ schema: payloadSchema,
225
+ handler: async ({ payload }) => {
226
+ if (payload.id === "error") {
227
+ throw new Error("Processing error");
228
+ }
229
+ },
230
+ });
231
+ }
232
+
233
+ const app = await createTestApp();
234
+ app.with(TestService);
235
+
236
+ const workerProvider = app.inject(TestWorkerProvider);
237
+ const errorSpy = vi.spyOn(workerProvider.log, "error");
238
+
239
+ await app.start();
240
+
241
+ const testService = app.inject(TestService);
242
+ await testService.queue.push({ id: "error", count: 1 });
243
+
244
+ await expect
245
+ .poll(() => errorSpy.mock.calls.length > 0, { timeout: 500 })
246
+ .toBeTruthy();
247
+
248
+ // Worker should still be running after processing error
249
+ expect(workerProvider.workersRunning).toBe(1);
250
+
251
+ await app.stop();
252
+ });
253
+
254
+ test("should handle consumer with queue descriptor", async () => {
255
+ const messages: any[] = [];
256
+
257
+ class TestService {
258
+ queue = $queue({
259
+ name: "test",
260
+ schema: payloadSchema,
261
+ });
262
+
263
+ consumer = $consumer({
264
+ queue: this.queue,
265
+ handler: async ({ payload }) => {
266
+ messages.push(payload);
267
+ },
268
+ });
269
+ }
270
+
271
+ const app = await createTestApp();
272
+ app.with(TestService);
273
+
274
+ await app.start();
275
+
276
+ const testService = app.inject(TestService);
277
+ await testService.queue.push({ id: "consumer-test", count: 15 });
278
+
279
+ await expect
280
+ .poll(() => messages.length === 1, { timeout: 500 })
281
+ .toBeTruthy();
282
+ expect(messages).toEqual([{ id: "consumer-test", count: 15 }]);
283
+
284
+ await app.stop();
285
+ });
286
+ });
287
+
288
+ describe("Edge Cases", () => {
289
+ test("should handle malformed JSON messages", async () => {
290
+ class TestService {
291
+ queue = $queue({
292
+ name: "test",
293
+ schema: payloadSchema,
294
+ handler: async () => {},
295
+ });
296
+ }
297
+
298
+ const app = await createTestApp();
299
+ app.with(TestService);
300
+
301
+ const workerProvider = app.inject(TestWorkerProvider);
302
+ const queueProvider = app.inject(QueueProvider);
303
+ const errorSpy = vi.spyOn(workerProvider.log, "error");
304
+
305
+ await app.start();
306
+
307
+ // Push malformed JSON directly to the queue
308
+ await queueProvider.push("test", "invalid-json");
309
+
310
+ await expect
311
+ .poll(() => errorSpy.mock.calls.length > 0, { timeout: 500 })
312
+ .toBeTruthy();
313
+
314
+ expect(errorSpy).toHaveBeenCalledWith(
315
+ "Failed to process message",
316
+ expect.any(Error),
317
+ );
318
+
319
+ // Worker should still be running
320
+ expect(workerProvider.workersRunning).toBe(1);
321
+
322
+ await app.stop();
323
+ });
324
+
325
+ test("should handle schema validation errors", async () => {
326
+ class TestService {
327
+ queue = $queue({
328
+ name: "test",
329
+ schema: payloadSchema,
330
+ handler: async () => {},
331
+ });
332
+ }
333
+
334
+ const app = await createTestApp();
335
+ app.with(TestService);
336
+
337
+ const workerProvider = app.inject(TestWorkerProvider);
338
+ const queueProvider = app.inject(QueueProvider);
339
+ const errorSpy = vi.spyOn(workerProvider.log, "error");
340
+
341
+ await app.start();
342
+
343
+ // Push message with invalid schema
344
+ await queueProvider.push(
345
+ "test",
346
+ JSON.stringify({
347
+ payload: { id: 123, count: "invalid" }, // id should be string, count should be number
348
+ }),
349
+ );
350
+
351
+ await expect
352
+ .poll(() => errorSpy.mock.calls.length > 0, { timeout: 500 })
353
+ .toBeTruthy();
354
+
355
+ expect(errorSpy).toHaveBeenCalledWith(
356
+ "Failed to process message",
357
+ expect.any(Error),
358
+ );
359
+
360
+ // Worker should still be running
361
+ expect(workerProvider.workersRunning).toBe(1);
362
+
363
+ await app.stop();
364
+ });
365
+
366
+ test("should handle abort signal during wait", async () => {
367
+ class TestService {
368
+ queue = $queue({
369
+ name: "test",
370
+ schema: payloadSchema,
371
+ handler: async () => {},
372
+ });
373
+ }
374
+
375
+ const app = await createTestApp({ workerInterval: 5000 });
376
+ app.with(TestService);
377
+
378
+ const workerProvider = app.inject(TestWorkerProvider);
379
+ const warnSpy = vi.spyOn(workerProvider.log, "warn");
380
+
381
+ await app.start();
382
+
383
+ // Abort the controller to simulate abort during wait
384
+ workerProvider.abortController.abort();
385
+
386
+ // This should detect the abort and return early
387
+ await workerProvider.waitForNextMessage(0);
388
+
389
+ expect(warnSpy).toHaveBeenCalledWith("Worker n-0 aborted.");
390
+
391
+ await app.stop();
392
+ });
393
+ });
394
+ });
@@ -0,0 +1,23 @@
1
+ import { describe, test } from "vitest";
2
+ import {
3
+ testQueueBasic,
4
+ testQueueHasConsumer,
5
+ testQueueKillWorkerSleep,
6
+ } from "../../core/__tests__/shared.ts";
7
+ import { RedisQueueProvider } from "../index.ts";
8
+
9
+ describe("RedisQueueProvider", () => {
10
+ const Provider = RedisQueueProvider;
11
+
12
+ test("should push and pop with consumer", async () => {
13
+ await testQueueBasic(Provider);
14
+ });
15
+
16
+ test("should push and pop with handler", async () => {
17
+ await testQueueHasConsumer(Provider);
18
+ });
19
+
20
+ test("should wake up workers on push", async () => {
21
+ await testQueueKillWorkerSleep(Provider);
22
+ });
23
+ });
@@ -0,0 +1,58 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { Alepha } from "alepha";
3
+ import { describe, it } from "vitest";
4
+ import {
5
+ AlephaRedis,
6
+ RedisProvider,
7
+ RedisSubscriberProvider,
8
+ } from "../index.ts";
9
+
10
+ const alepha = Alepha.create().with(AlephaRedis);
11
+ const redis = alepha.inject(RedisProvider);
12
+ const sub = alepha.inject(RedisSubscriberProvider);
13
+
14
+ describe("Redis", () => {
15
+ it("should set and get values", async ({ expect }) => {
16
+ const uuid = randomUUID();
17
+ await redis.set("test", uuid);
18
+ const value = await redis.get("test");
19
+ expect(value?.toString()).toBe(uuid);
20
+ });
21
+
22
+ it("should support pub/sub messaging", async ({ expect }) => {
23
+ const stack: string[] = [];
24
+ await sub.subscribe("test", (message: string) => {
25
+ stack.push(message);
26
+ });
27
+ await redis.publish("test", "hello");
28
+ await expect.poll(() => stack.length).toBe(1);
29
+ expect(stack).toEqual(["hello"]);
30
+ });
31
+
32
+ it("should handle buffer values correctly", async ({ expect }) => {
33
+ const uuid = randomUUID().replace(/-/g, "");
34
+ await redis.set("test:string", uuid);
35
+ await redis.set("test:buffer", Buffer.from(uuid, "hex"));
36
+
37
+ const buf1 = await redis.get("test:string");
38
+ expect(buf1).toBeInstanceOf(Buffer);
39
+ expect(buf1?.byteLength).toBe(32);
40
+ expect(buf1?.toString("utf-8")).toBe(uuid);
41
+
42
+ const buf2 = await redis.get("test:buffer");
43
+ expect(buf2).toBeInstanceOf(Buffer);
44
+ expect(buf2?.byteLength).toBe(16);
45
+ expect(buf2?.toString("hex")).toBe(uuid);
46
+ });
47
+
48
+ it("should properly clean up connections on stop", async () => {
49
+ const alepha = Alepha.create().with(AlephaRedis);
50
+ const redis = alepha.inject(RedisProvider);
51
+ const sub = alepha.inject(RedisSubscriberProvider);
52
+ await alepha.start();
53
+ await sub.subscribe("test", (_message: string) => {});
54
+ await redis.publish("test:a", "a");
55
+ await redis.lpush("test:b", "b");
56
+ await alepha.stop();
57
+ });
58
+ });