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
package/src/bin/index.ts CHANGED
@@ -1,5 +1,4 @@
1
1
  #!/usr/bin/env node
2
- import "tsx";
3
2
  import { Alepha, run } from "alepha";
4
3
  import { AlephaCli, version } from "alepha/cli";
5
4
 
@@ -0,0 +1,194 @@
1
+ import { Alepha } from "alepha";
2
+ import { FileSystemProvider } from "alepha/file";
3
+ import { expect } from "vitest";
4
+ import {
5
+ $bucket,
6
+ FileNotFoundError,
7
+ type FileStorageProvider,
8
+ } from "../index.ts";
9
+
10
+ export const TEST_IMAGES_BUCKET = "test-images";
11
+ export const TEST_DOCUMENTS_BUCKET = "test-documents";
12
+ export class TestApp {
13
+ images = $bucket({ name: TEST_IMAGES_BUCKET });
14
+ documents = $bucket({ name: TEST_DOCUMENTS_BUCKET });
15
+ }
16
+
17
+ const BUCKET_NAME = TEST_IMAGES_BUCKET;
18
+
19
+ // Helper to create file system instance
20
+ const getFileSystem = () => Alepha.create().inject(FileSystemProvider);
21
+
22
+ export const testUploadAndExistence = async (
23
+ provider: FileStorageProvider,
24
+ ): Promise<string> => {
25
+ const content = "This is a test image.";
26
+ const file = getFileSystem().createFile({
27
+ text: content,
28
+ name: "test.jpg",
29
+ type: "image/jpeg",
30
+ });
31
+
32
+ const fileId = await provider.upload(BUCKET_NAME, file);
33
+
34
+ expect(fileId).toBeTypeOf("string");
35
+ expect(fileId.length).toBeGreaterThan(0);
36
+
37
+ // Verify the file physically exists
38
+ const fileExists = await provider.exists(BUCKET_NAME, fileId);
39
+ expect(fileExists).toBe(true);
40
+
41
+ return fileId;
42
+ };
43
+
44
+ export const testDownloadAndMetadata = async (
45
+ provider: FileStorageProvider,
46
+ ): Promise<string> => {
47
+ const content = "<h1>Hello Alepha</h1>";
48
+ const originalFile = getFileSystem().createFile({
49
+ text: content,
50
+ name: "index.html",
51
+ type: "text/html",
52
+ });
53
+
54
+ const fileId = await provider.upload(BUCKET_NAME, originalFile);
55
+ const downloadedFile = await provider.download(BUCKET_NAME, fileId);
56
+
57
+ // Check metadata
58
+ expect(downloadedFile.type).toBe("text/html");
59
+ expect(downloadedFile.size).toBe(content.length);
60
+
61
+ // Check content
62
+ const downloadedContent = await downloadedFile.text();
63
+ expect(downloadedContent).toBe(content);
64
+
65
+ return fileId;
66
+ };
67
+
68
+ export const testFileExistence = async (
69
+ provider: FileStorageProvider,
70
+ ): Promise<string> => {
71
+ const file = getFileSystem().createFile({
72
+ text: "exists",
73
+ name: "exists.txt",
74
+ });
75
+ const fileId = await provider.upload(BUCKET_NAME, file);
76
+ const fileExists = await provider.exists(BUCKET_NAME, fileId);
77
+ expect(fileExists).toBe(true);
78
+ return fileId;
79
+ };
80
+
81
+ export const testNonExistentFile = async (provider: FileStorageProvider) => {
82
+ const fileExists = await provider.exists(BUCKET_NAME, "non-existent-file-id");
83
+ expect(fileExists).toBe(false);
84
+ };
85
+
86
+ export const testDeleteNonExistentFile = async (
87
+ provider: FileStorageProvider,
88
+ ) => {
89
+ const file = getFileSystem().createFile({
90
+ text: "exists",
91
+ name: "exists.txt",
92
+ });
93
+ const fileId = await provider.upload(BUCKET_NAME, file);
94
+ const fileExists = await provider.exists(BUCKET_NAME, fileId);
95
+ expect(fileExists).toBe(true);
96
+ await provider.delete(BUCKET_NAME, fileId);
97
+ const fileExists2 = await provider.exists(BUCKET_NAME, fileId);
98
+ expect(fileExists2).toBe(false);
99
+ };
100
+
101
+ export const testDeleteFile = async (provider: FileStorageProvider) => {
102
+ const file = getFileSystem().createFile({
103
+ text: "to be deleted",
104
+ name: "delete_me.txt",
105
+ });
106
+ const fileId = await provider.upload(BUCKET_NAME, file);
107
+
108
+ // Verify it exists before deleting
109
+ expect(await provider.exists(BUCKET_NAME, fileId)).toBe(true);
110
+
111
+ await provider.delete(BUCKET_NAME, fileId);
112
+
113
+ // Verify it no longer exists after deletion
114
+ expect(await provider.exists(BUCKET_NAME, fileId)).toBe(false);
115
+ };
116
+
117
+ export const testNonExistentFileError = async (
118
+ provider: FileStorageProvider,
119
+ ) => {
120
+ await expect(
121
+ provider.download(BUCKET_NAME, "i-do-not-exist"),
122
+ ).rejects.toThrow(FileNotFoundError);
123
+ };
124
+
125
+ export const testUploadIntoBuckets = async (
126
+ provider: FileStorageProvider,
127
+ ): Promise<{ docId: string; imgId: string }> => {
128
+ const fs = getFileSystem();
129
+ const docFile = fs.createFile({ text: "report", name: "report.pdf" });
130
+ const imgFile = fs.createFile({ text: "logo", name: "logo.png" });
131
+
132
+ const docId = await provider.upload(TEST_DOCUMENTS_BUCKET, docFile);
133
+ const imgId = await provider.upload(TEST_IMAGES_BUCKET, imgFile);
134
+
135
+ expect(await provider.exists(TEST_DOCUMENTS_BUCKET, docId)).toBe(true);
136
+ expect(await provider.exists(TEST_IMAGES_BUCKET, imgId)).toBe(true);
137
+
138
+ // Ensure files are in separate directories and not mixed up
139
+ expect(await provider.exists(TEST_DOCUMENTS_BUCKET, imgId)).toBe(false);
140
+ expect(await provider.exists(TEST_IMAGES_BUCKET, docId)).toBe(false);
141
+
142
+ return { docId, imgId };
143
+ };
144
+
145
+ export const testFileStream = async (
146
+ provider: FileStorageProvider,
147
+ ): Promise<string> => {
148
+ const content = "Streaming content test.";
149
+ const file = getFileSystem().createFile({
150
+ text: content,
151
+ name: "stream.txt",
152
+ type: "text/plain",
153
+ });
154
+
155
+ const fileId = await provider.upload(BUCKET_NAME, file);
156
+ const stream = await provider.download(BUCKET_NAME, fileId);
157
+
158
+ expect(stream.type).toBe("text/plain");
159
+
160
+ const streamContent = await stream.text();
161
+ expect(streamContent).toBe(content);
162
+
163
+ return fileId;
164
+ };
165
+
166
+ export const testEmptyFiles = async (provider: FileStorageProvider) => {
167
+ const emptyFile = getFileSystem().createFile({
168
+ text: "",
169
+ name: "empty.txt",
170
+ type: "text/plain",
171
+ });
172
+
173
+ const fileId = await provider.upload(BUCKET_NAME, emptyFile);
174
+ const downloadedFile = await provider.download(BUCKET_NAME, fileId);
175
+
176
+ expect(downloadedFile.type).toBe("text/plain");
177
+ expect(downloadedFile.size).toBe(0);
178
+ expect(await downloadedFile.text()).toBe("");
179
+ };
180
+
181
+ export const testCustomFileId = async (provider: FileStorageProvider) => {
182
+ const file = getFileSystem().createFile({
183
+ text: "custom id",
184
+ name: "custom.txt",
185
+ });
186
+ const customFileId = "custom-file-id";
187
+
188
+ const uploadedFileId = await provider.upload(BUCKET_NAME, file, customFileId);
189
+
190
+ expect(uploadedFileId).toBe(customFileId);
191
+
192
+ const fileExists = await provider.exists(BUCKET_NAME, customFileId);
193
+ expect(fileExists).toBe(true);
194
+ };
@@ -0,0 +1,104 @@
1
+ import { Alepha } from "alepha";
2
+ import { describe, test } from "vitest";
3
+ import { InvalidFileError } from "../errors/InvalidFileError.ts";
4
+ import {
5
+ $bucket,
6
+ AlephaBucket,
7
+ FileStorageProvider,
8
+ MemoryFileStorageProvider,
9
+ } from "../index.ts";
10
+
11
+ class TestApp {
12
+ images = $bucket({
13
+ maxSize: 1, // MB
14
+ mimeTypes: ["image/png", "image/jpeg"],
15
+ });
16
+ }
17
+
18
+ const alepha = Alepha.create().with(AlephaBucket).with(TestApp);
19
+
20
+ describe("$bucket", () => {
21
+ test("should reject mimeTypes", async ({ expect }) => {
22
+ const app = alepha.inject(TestApp);
23
+ const file = new File(["test content"], "test.txt", { type: "text/plain" });
24
+
25
+ await expect(app.images.upload(file)).rejects.toThrow(InvalidFileError);
26
+ });
27
+
28
+ test("should reject file size", async ({ expect }) => {
29
+ const app = alepha.inject(TestApp);
30
+ const largeFile = new File(["a".repeat(2 * 1024 * 1024)], "large.png", {
31
+ type: "image/png",
32
+ });
33
+
34
+ await expect(() => app.images.upload(largeFile)).rejects.toThrow(
35
+ InvalidFileError,
36
+ );
37
+ });
38
+
39
+ test("should upload and download files", async ({ expect }) => {
40
+ const app = alepha.inject(TestApp);
41
+ const file = new File(["test content"], "test.png", { type: "image/png" });
42
+
43
+ const fileId = await app.images.upload(file);
44
+ expect(fileId).toBeDefined();
45
+
46
+ const downloadedFile = await app.images.download(fileId);
47
+ // Name is now the fileId, type is determined from extension
48
+ expect(downloadedFile.type).toBe("image/png");
49
+ expect(downloadedFile.size).toBe(file.size);
50
+ });
51
+
52
+ test("should call events on upload and delete", async ({ expect }) => {
53
+ const app = alepha.inject(TestApp);
54
+ const file = new File(["test content"], "test.png");
55
+
56
+ let uploadEventCalled = false;
57
+ let deleteEventCalled = false;
58
+
59
+ alepha.events.on("bucket:file:uploaded", ({ id, file, options }) => {
60
+ expect(id).toBeDefined();
61
+ expect(file.name).toBe("test.png");
62
+ expect(file.type).toBe("image/png");
63
+ expect(file.size).toBe(file.size);
64
+ expect(options).toEqual({
65
+ maxSize: 2,
66
+ mimeTypes: ["image/png", "image/jpeg"],
67
+ });
68
+ uploadEventCalled = true;
69
+ });
70
+
71
+ alepha.events.on("bucket:file:deleted", ({ id }) => {
72
+ expect(id).toBeDefined();
73
+ deleteEventCalled = true;
74
+ });
75
+
76
+ const fileId = await app.images.upload(file, { maxSize: 2 });
77
+ expect(uploadEventCalled).toBe(true);
78
+
79
+ await app.images.delete(fileId);
80
+ expect(deleteEventCalled).toBe(true);
81
+ });
82
+
83
+ test("should use many providers", async ({ expect }) => {
84
+ class MySecondMemoryProvider extends MemoryFileStorageProvider {}
85
+ class AnotherApp {
86
+ gn = $bucket({
87
+ provider: MySecondMemoryProvider,
88
+ });
89
+ }
90
+
91
+ const alepha = Alepha.create().with(AlephaBucket).with(AnotherApp);
92
+ await alepha.start();
93
+
94
+ const app = alepha.inject(AnotherApp);
95
+ const file = new File(["test content"], "test.png", { type: "image/png" });
96
+ const fileId = await app.gn.upload(file);
97
+ await expect(
98
+ alepha.inject(FileStorageProvider).exists(app.gn.name, fileId),
99
+ ).resolves.toBe(false);
100
+ await expect(
101
+ alepha.inject(MySecondMemoryProvider).exists(app.gn.name, fileId),
102
+ ).resolves.toBe(true);
103
+ });
104
+ });
@@ -0,0 +1,13 @@
1
+ import { Alepha } from "alepha";
2
+ import { describe, test } from "vitest";
3
+ import { AlephaBucket } from "../index.ts";
4
+ import { FileStorageProvider } from "../providers/FileStorageProvider.ts";
5
+ import { MemoryFileStorageProvider } from "../providers/MemoryFileStorageProvider.ts";
6
+
7
+ describe("FileStorageProvider", () => {
8
+ test("create default provider", async ({ expect }) => {
9
+ const alepha = Alepha.create().with(AlephaBucket);
10
+ const fileStorageProvider = alepha.inject(FileStorageProvider);
11
+ expect(fileStorageProvider).toBeInstanceOf(MemoryFileStorageProvider);
12
+ });
13
+ });
@@ -0,0 +1,77 @@
1
+ import { Alepha } from "alepha";
2
+ import { describe, test } from "vitest";
3
+ import {
4
+ TestApp,
5
+ testCustomFileId,
6
+ testDeleteFile,
7
+ testDeleteNonExistentFile,
8
+ testDownloadAndMetadata,
9
+ testEmptyFiles,
10
+ testFileExistence,
11
+ testFileStream,
12
+ testNonExistentFile,
13
+ testNonExistentFileError,
14
+ testUploadAndExistence,
15
+ testUploadIntoBuckets,
16
+ } from "../__tests__/shared.ts";
17
+ import {
18
+ AlephaBucket,
19
+ FileStorageProvider,
20
+ LocalFileStorageProvider,
21
+ } from "../index.ts";
22
+
23
+ const alepha = Alepha.create()
24
+ .with({
25
+ provide: FileStorageProvider,
26
+ use: LocalFileStorageProvider,
27
+ })
28
+ .with(AlephaBucket)
29
+ .with(TestApp);
30
+
31
+ const provider = alepha.inject(LocalFileStorageProvider);
32
+
33
+ describe("LocalFileStorageProvider", () => {
34
+ test("should upload a file and return a fileId", async () => {
35
+ await testUploadAndExistence(provider);
36
+ });
37
+
38
+ test("should download a file and restore its metadata", async () => {
39
+ await testDownloadAndMetadata(provider);
40
+ });
41
+
42
+ test("exists() should return false for a non-existent file", async () => {
43
+ await testNonExistentFile(provider);
44
+ });
45
+
46
+ test("exists() should return true for an existing file", async () => {
47
+ await testFileExistence(provider);
48
+ });
49
+
50
+ test("should delete a file", async () => {
51
+ await testDeleteFile(provider);
52
+ });
53
+
54
+ test("delete() should not throw for a non-existent file", async () => {
55
+ await testDeleteNonExistentFile(provider);
56
+ });
57
+
58
+ test("download() should throw FileNotFoundError for a non-existent file", async () => {
59
+ await testNonExistentFileError(provider);
60
+ });
61
+
62
+ test("should handle uploading to different buckets", async () => {
63
+ await testUploadIntoBuckets(provider);
64
+ });
65
+
66
+ test("should handle empty files correctly", async () => {
67
+ await testEmptyFiles(provider);
68
+ });
69
+
70
+ test("should be able to upload with a specific fileId", async () => {
71
+ await testCustomFileId(provider);
72
+ });
73
+
74
+ test("should be able to upload, stream with metadata", async () => {
75
+ await testFileStream(provider);
76
+ });
77
+ });
@@ -0,0 +1,82 @@
1
+ import { Alepha } from "alepha";
2
+ import { beforeEach, describe, test } from "vitest";
3
+ import {
4
+ TestApp,
5
+ testCustomFileId,
6
+ testDeleteFile,
7
+ testDeleteNonExistentFile,
8
+ testDownloadAndMetadata,
9
+ testEmptyFiles,
10
+ testFileExistence,
11
+ testFileStream,
12
+ testNonExistentFile,
13
+ testNonExistentFileError,
14
+ testUploadAndExistence,
15
+ testUploadIntoBuckets,
16
+ } from "../__tests__/shared.ts";
17
+ import {
18
+ AlephaBucket,
19
+ FileStorageProvider,
20
+ MemoryFileStorageProvider,
21
+ } from "../index.ts";
22
+
23
+ let alepha: Alepha;
24
+ let provider: MemoryFileStorageProvider;
25
+
26
+ beforeEach(() => {
27
+ alepha = Alepha.create()
28
+ .with({
29
+ provide: FileStorageProvider,
30
+ use: MemoryFileStorageProvider,
31
+ })
32
+ .with(AlephaBucket)
33
+ .with(TestApp);
34
+
35
+ provider = alepha.inject(MemoryFileStorageProvider);
36
+ });
37
+
38
+ describe("MemoryFileStorageProvider", () => {
39
+ test("should upload a file and return a fileId", async () => {
40
+ await testUploadAndExistence(provider);
41
+ });
42
+
43
+ test("should download a file and restore its metadata", async () => {
44
+ await testDownloadAndMetadata(provider);
45
+ });
46
+
47
+ test("exists() should return false for a non-existent file", async () => {
48
+ await testNonExistentFile(provider);
49
+ });
50
+
51
+ test("exists() should return true for an existing file", async () => {
52
+ await testFileExistence(provider);
53
+ });
54
+
55
+ test("should delete a file", async () => {
56
+ await testDeleteFile(provider);
57
+ });
58
+
59
+ test("delete() should not throw for a non-existent file", async () => {
60
+ await testDeleteNonExistentFile(provider);
61
+ });
62
+
63
+ test("download() should throw FileNotFoundError for a non-existent file", async () => {
64
+ await testNonExistentFileError(provider);
65
+ });
66
+
67
+ test("should handle uploading to different buckets", async () => {
68
+ await testUploadIntoBuckets(provider);
69
+ });
70
+
71
+ test("should handle empty files correctly", async () => {
72
+ await testEmptyFiles(provider);
73
+ });
74
+
75
+ test("should be able to upload with a specific fileId", async () => {
76
+ await testCustomFileId(provider);
77
+ });
78
+
79
+ test("should be able to upload, stream with metadata", async () => {
80
+ await testFileStream(provider);
81
+ });
82
+ });