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,558 @@
1
+ import { Alepha } from "alepha";
2
+ import { $bucket } from "alepha/bucket";
3
+ import { DateTimeProvider } from "alepha/datetime";
4
+ import { FileSystemProvider } from "alepha/file";
5
+ import { describe, expect, it } from "vitest";
6
+ import { FileController, FileService } from "../index.ts";
7
+
8
+ describe("FileController", () => {
9
+ class App {
10
+ images = $bucket({});
11
+ documents = $bucket({ name: "documents" });
12
+ }
13
+
14
+ let createFile: (
15
+ textOrOpts: string | { text: string; name?: string; type?: string },
16
+ opts?: { name?: string; type?: string },
17
+ ) => any;
18
+
19
+ const setup = async () => {
20
+ const alepha = Alepha.create();
21
+ const app = alepha.inject(App);
22
+ const ctrl = alepha.inject(FileController);
23
+ const service = alepha.inject(FileService);
24
+ const dtp = alepha.inject(DateTimeProvider);
25
+ const fs = alepha.inject(FileSystemProvider);
26
+ await alepha.start();
27
+ createFile = (
28
+ textOrOpts: string | { text: string; name?: string; type?: string },
29
+ opts?: { name?: string; type?: string },
30
+ ) => {
31
+ if (typeof textOrOpts === "string") {
32
+ return fs.createFile({ text: textOrOpts, ...(opts || {}) });
33
+ }
34
+ return fs.createFile(textOrOpts);
35
+ };
36
+ return { alepha, app, ctrl, service, dtp, fs };
37
+ };
38
+
39
+ describe("findFiles", () => {
40
+ it("should return files from specific bucket", async () => {
41
+ const { app, ctrl } = await setup();
42
+ await app.images.upload(createFile("test"));
43
+ const files = await ctrl.findFiles({
44
+ query: { bucket: app.images.name },
45
+ });
46
+ expect(files.content.length).toEqual(1);
47
+ });
48
+
49
+ it("should return empty list when no files exist", async () => {
50
+ const { ctrl } = await setup();
51
+ const files = await ctrl.findFiles();
52
+ expect(files.content).toEqual([]);
53
+ expect(files.page.totalElements).toBe(0);
54
+ });
55
+
56
+ it("should return files from all buckets when no bucket filter", async () => {
57
+ const { app, ctrl } = await setup();
58
+ await app.images.upload(createFile("image.png"));
59
+ await app.documents.upload(createFile("doc.pdf"));
60
+
61
+ const files = await ctrl.findFiles({ query: {} });
62
+ expect(files.content.length).toEqual(2);
63
+ });
64
+
65
+ it("should filter files by bucket", async () => {
66
+ const { app, ctrl } = await setup();
67
+ await app.images.upload(createFile("image.png"));
68
+ await app.documents.upload(createFile("doc.pdf"));
69
+
70
+ const imagesFiles = await ctrl.findFiles({
71
+ query: { bucket: app.images.name },
72
+ });
73
+ expect(imagesFiles.content.length).toEqual(1);
74
+ expect(imagesFiles.content[0].bucket).toBe(app.images.name);
75
+
76
+ const docsFiles = await ctrl.findFiles({
77
+ query: { bucket: app.documents.name },
78
+ });
79
+ expect(docsFiles.content.length).toEqual(1);
80
+ expect(docsFiles.content[0].bucket).toBe(app.documents.name);
81
+ });
82
+
83
+ it("should filter files by tags", async () => {
84
+ const { service, ctrl } = await setup();
85
+ await service.uploadFile(createFile("file1.txt"), {
86
+ tags: ["important", "work"],
87
+ });
88
+ await service.uploadFile(createFile("file2.txt"), { tags: ["personal"] });
89
+ await service.uploadFile(createFile("file3.txt"), {
90
+ tags: ["important", "personal"],
91
+ });
92
+
93
+ const importantFiles = await ctrl.findFiles.run({
94
+ query: { tags: ["important"] },
95
+ });
96
+ expect(importantFiles.content.length).toEqual(2);
97
+ });
98
+
99
+ it("should support pagination", async () => {
100
+ const { app, ctrl } = await setup();
101
+ await app.images.upload(createFile("file1.txt"));
102
+ await app.images.upload(createFile("file2.txt"));
103
+ await app.images.upload(createFile("file3.txt"));
104
+
105
+ const page1 = await ctrl.findFiles({
106
+ query: { bucket: app.images.name, size: 2, page: 0 },
107
+ });
108
+
109
+ expect(page1.content.length).toEqual(2);
110
+ expect(page1.page.totalElements).toBe(3);
111
+
112
+ const page2 = await ctrl.findFiles({
113
+ query: { bucket: app.images.name, size: 2, page: 1 },
114
+ });
115
+ expect(page2.content.length).toEqual(1);
116
+ expect(page2.page.totalElements).toBe(3);
117
+ });
118
+
119
+ it("should return files sorted by creation date descending by default", async () => {
120
+ const { app, ctrl } = await setup();
121
+ const file1 = await app.images.upload(createFile("first.txt"));
122
+ const file2 = await app.images.upload(createFile("second.txt"));
123
+ const file3 = await app.images.upload(createFile("third.txt"));
124
+
125
+ const files = await ctrl.findFiles({
126
+ query: { bucket: app.images.name },
127
+ });
128
+
129
+ expect(files.content[0].blobId).toBe(file3);
130
+ expect(files.content[1].blobId).toBe(file2);
131
+ expect(files.content[2].blobId).toBe(file1);
132
+ });
133
+ });
134
+
135
+ describe("uploadFile", () => {
136
+ it("should upload file to default bucket", async () => {
137
+ const { ctrl } = await setup();
138
+ const file = createFile("Hello, World!", {
139
+ name: "test.txt",
140
+ type: "text/plain",
141
+ });
142
+
143
+ const result = await ctrl.uploadFile({
144
+ body: { file },
145
+ query: {},
146
+ });
147
+
148
+ expect(result.name).toBe("test.txt");
149
+ expect(result.mimeType).toBe("text/plain");
150
+ expect(result.size).toBeGreaterThan(0);
151
+ expect(result.blobId).toBeDefined();
152
+ });
153
+
154
+ it("should calculate and store file checksum", async () => {
155
+ const { ctrl } = await setup();
156
+ const file = createFile("Hello, World!", {
157
+ name: "test.txt",
158
+ type: "text/plain",
159
+ });
160
+
161
+ const result = await ctrl.uploadFile({
162
+ body: { file },
163
+ query: {},
164
+ });
165
+
166
+ expect(result.checksum).toBeDefined();
167
+ expect(result.checksum).toMatch(/^[a-f0-9]{64}$/); // SHA-256 hex format
168
+ });
169
+
170
+ it("should upload file to specific bucket", async () => {
171
+ const { app, ctrl } = await setup();
172
+ const file = createFile("Document content", {
173
+ name: "doc.pdf",
174
+ type: "application/pdf",
175
+ });
176
+
177
+ const result = await ctrl.uploadFile({
178
+ body: { file },
179
+ query: { bucket: app.documents.name },
180
+ });
181
+
182
+ expect(result.bucket).toBe(app.documents.name);
183
+ expect(result.name).toBe("doc.pdf");
184
+ });
185
+
186
+ it("should upload file with expiration date", async () => {
187
+ const { ctrl, dtp } = await setup();
188
+ const file = createFile("Temporary file", { name: "temp.txt" });
189
+ const expirationDate = dtp.now().add(1, "hour").toISOString();
190
+
191
+ const result = await ctrl.uploadFile({
192
+ body: { file },
193
+ query: { expirationDate },
194
+ });
195
+
196
+ expect(result.expirationDate).toEqual(expirationDate);
197
+ });
198
+
199
+ it("should capture user information when provided", async () => {
200
+ const { ctrl, service } = await setup();
201
+ const file = createFile("User file", { name: "user.txt" });
202
+
203
+ const result = await service.uploadFile(file, {
204
+ user: {
205
+ id: "123e4567-e89b-12d3-a456-426614174000",
206
+ realm: "test-realm",
207
+ name: "Test User",
208
+ },
209
+ });
210
+
211
+ expect(result.creator).toBe("123e4567-e89b-12d3-a456-426614174000");
212
+ expect(result.creatorRealm).toBe("test-realm");
213
+ expect(result.creatorName).toBe("Test User");
214
+ });
215
+ });
216
+
217
+ describe("streamFile", () => {
218
+ it("should stream uploaded file", async () => {
219
+ const { ctrl } = await setup();
220
+ const originalContent = "Hello, World!";
221
+ const file = createFile(originalContent, {
222
+ name: "test.txt",
223
+ type: "text/plain",
224
+ });
225
+
226
+ const uploaded = await ctrl.uploadFile({
227
+ body: { file },
228
+ query: {},
229
+ });
230
+
231
+ const streamed = await ctrl.streamFile({ params: { id: uploaded.id } });
232
+
233
+ expect(streamed.name).toBe("test.txt");
234
+ expect(streamed.type).toBe("text/plain");
235
+ expect(await streamed.text()).toBe(originalContent);
236
+ });
237
+
238
+ it("should throw NotFoundError for non-existent file", async () => {
239
+ const { ctrl } = await setup();
240
+
241
+ await expect(
242
+ ctrl.streamFile({
243
+ params: { id: "00000000-0000-0000-0000-000000000000" },
244
+ }),
245
+ ).rejects.toThrow();
246
+ });
247
+ });
248
+
249
+ describe("deleteFile", () => {
250
+ it("should delete existing file", async () => {
251
+ const { ctrl } = await setup();
252
+ const file = createFile("To be deleted", { name: "delete-me.txt" });
253
+
254
+ const uploaded = await ctrl.uploadFile({
255
+ body: { file },
256
+ query: {},
257
+ });
258
+
259
+ const result = await ctrl.deleteFile({
260
+ params: { id: uploaded.id },
261
+ });
262
+
263
+ expect(result.ok).toBe(true);
264
+ expect(result.id).toBe(uploaded.id);
265
+
266
+ // Verify file is actually deleted
267
+ await expect(
268
+ ctrl.streamFile({ params: { id: uploaded.id } }),
269
+ ).rejects.toThrow();
270
+ });
271
+
272
+ it("should throw NotFoundError when deleting non-existent file", async () => {
273
+ const { ctrl } = await setup();
274
+
275
+ await expect(
276
+ ctrl.deleteFile({
277
+ params: { id: "00000000-0000-0000-0000-000000000000" },
278
+ }),
279
+ ).rejects.toThrow();
280
+ });
281
+ });
282
+
283
+ describe("updateFile", () => {
284
+ it("should update file name", async () => {
285
+ const { ctrl } = await setup();
286
+ const file = createFile("test content", { name: "original.txt" });
287
+
288
+ const uploaded = await ctrl.uploadFile({
289
+ body: { file },
290
+ query: {},
291
+ });
292
+
293
+ const updated = await ctrl.updateFile({
294
+ params: { id: uploaded.id },
295
+ body: { name: "renamed.txt" },
296
+ });
297
+
298
+ expect(updated.name).toBe("renamed.txt");
299
+ expect(updated.id).toBe(uploaded.id);
300
+ });
301
+
302
+ it("should update file tags", async () => {
303
+ const { ctrl } = await setup();
304
+ const file = createFile("test content", { name: "test.txt" });
305
+
306
+ const uploaded = await ctrl.uploadFile({
307
+ body: { file },
308
+ query: {},
309
+ });
310
+
311
+ const updated = await ctrl.updateFile({
312
+ params: { id: uploaded.id },
313
+ body: { tags: ["important", "work"] },
314
+ });
315
+
316
+ expect(updated.tags).toEqual(["important", "work"]);
317
+ });
318
+
319
+ it("should update file expiration date", async () => {
320
+ const { ctrl, dtp } = await setup();
321
+ const file = createFile("test content", { name: "test.txt" });
322
+
323
+ const uploaded = await ctrl.uploadFile({
324
+ body: { file },
325
+ query: {},
326
+ });
327
+
328
+ const newExpiration = dtp.now().add(2, "days").toISOString();
329
+
330
+ const updated = await ctrl.updateFile({
331
+ params: { id: uploaded.id },
332
+ body: { expirationDate: newExpiration },
333
+ });
334
+
335
+ expect(updated.expirationDate).toBe(newExpiration);
336
+ });
337
+
338
+ it("should update multiple fields at once", async () => {
339
+ const { ctrl, dtp } = await setup();
340
+ const file = createFile("test content", { name: "original.txt" });
341
+
342
+ const uploaded = await ctrl.uploadFile({
343
+ body: { file },
344
+ query: {},
345
+ });
346
+
347
+ const newExpiration = dtp.now().add(3, "days").toISOString();
348
+
349
+ const updated = await ctrl.updateFile({
350
+ params: { id: uploaded.id },
351
+ body: {
352
+ name: "updated.txt",
353
+ tags: ["tag1", "tag2"],
354
+ expirationDate: newExpiration,
355
+ },
356
+ });
357
+
358
+ expect(updated.name).toBe("updated.txt");
359
+ expect(updated.tags).toEqual(["tag1", "tag2"]);
360
+ expect(updated.expirationDate).toBe(newExpiration);
361
+ });
362
+
363
+ it("should throw error when updating non-existent file", async () => {
364
+ const { ctrl } = await setup();
365
+
366
+ await expect(
367
+ ctrl.updateFile({
368
+ params: { id: "00000000-0000-0000-0000-000000000000" },
369
+ body: { name: "new-name.txt" },
370
+ }),
371
+ ).rejects.toThrow();
372
+ });
373
+ });
374
+
375
+ describe("enhanced search filtering", () => {
376
+ it("should filter by file name (partial match)", async () => {
377
+ const { service, ctrl } = await setup();
378
+ await service.uploadFile(
379
+ createFile("content", { name: "report-2024.pdf" }),
380
+ );
381
+ await service.uploadFile(
382
+ createFile("content", { name: "invoice-march.pdf" }),
383
+ );
384
+ await service.uploadFile(
385
+ createFile("content", { name: "report-2025.pdf" }),
386
+ );
387
+
388
+ const results = await ctrl.findFiles({ query: { name: "report" } });
389
+ expect(results.content.length).toBe(2);
390
+ expect(results.content.every((f) => f.name.includes("report"))).toBe(
391
+ true,
392
+ );
393
+ });
394
+
395
+ it("should filter by MIME type", async () => {
396
+ const { service, ctrl } = await setup();
397
+ await service.uploadFile(
398
+ createFile("content", { name: "file1.pdf", type: "application/pdf" }),
399
+ );
400
+ await service.uploadFile(
401
+ createFile("content", { name: "file2.txt", type: "text/plain" }),
402
+ );
403
+ await service.uploadFile(
404
+ createFile("content", { name: "file3.pdf", type: "application/pdf" }),
405
+ );
406
+
407
+ const results = await ctrl.findFiles({
408
+ query: { mimeType: "application/pdf" },
409
+ });
410
+ expect(results.content.length).toBe(2);
411
+ expect(
412
+ results.content.every((f) => f.mimeType === "application/pdf"),
413
+ ).toBe(true);
414
+ });
415
+
416
+ it("should filter by creator", async () => {
417
+ const { service, ctrl } = await setup();
418
+ const user1Id = "123e4567-e89b-12d3-a456-426614174000";
419
+ const user2Id = "223e4567-e89b-12d3-a456-426614174000";
420
+
421
+ await service.uploadFile(createFile("content", { name: "file1.txt" }), {
422
+ user: { id: user1Id, realm: "test", name: "User 1" },
423
+ });
424
+ await service.uploadFile(createFile("content", { name: "file2.txt" }), {
425
+ user: { id: user2Id, realm: "test", name: "User 2" },
426
+ });
427
+ await service.uploadFile(createFile("content", { name: "file3.txt" }), {
428
+ user: { id: user1Id, realm: "test", name: "User 1" },
429
+ });
430
+
431
+ const results = await ctrl.findFiles({ query: { creator: user1Id } });
432
+ expect(results.content.length).toBe(2);
433
+ expect(results.content.every((f) => f.creator === user1Id)).toBe(true);
434
+ });
435
+
436
+ it("should filter by date range", async () => {
437
+ const { service, ctrl, dtp } = await setup();
438
+
439
+ const startTime = dtp.nowISOString();
440
+
441
+ // ensure time difference
442
+ await new Promise((resolve) => setTimeout(resolve, 1));
443
+
444
+ await service.uploadFile(createFile("content", { name: "file1.txt" }));
445
+ await service.uploadFile(createFile("content", { name: "file2.txt" }));
446
+ await service.uploadFile(createFile("content", { name: "file3.txt" }));
447
+
448
+ // Filter for files created after start time (should get all 3)
449
+ const results = await ctrl.findFiles({
450
+ query: { createdAfter: startTime },
451
+ });
452
+
453
+ expect(results.content.length).toBe(3);
454
+
455
+ // Filter for files created before a future date (should get all 3)
456
+ const futureTime = dtp.now().add(1, "hour").toISOString();
457
+ const results2 = await ctrl.findFiles({
458
+ query: { createdBefore: futureTime },
459
+ });
460
+
461
+ expect(results2.content.length).toBe(3);
462
+ });
463
+
464
+ it("should combine multiple filters", async () => {
465
+ const { service, ctrl } = await setup();
466
+ const userId = "123e4567-e89b-12d3-a456-426614174000";
467
+
468
+ await service.uploadFile(
469
+ createFile("content", { name: "report.pdf", type: "application/pdf" }),
470
+ {
471
+ user: { id: userId, realm: "test", name: "User" },
472
+ tags: ["important"],
473
+ },
474
+ );
475
+ await service.uploadFile(
476
+ createFile("content", { name: "invoice.pdf", type: "application/pdf" }),
477
+ { tags: ["important"] },
478
+ );
479
+ await service.uploadFile(
480
+ createFile("content", { name: "report.txt", type: "text/plain" }),
481
+ { user: { id: userId, realm: "test", name: "User" } },
482
+ );
483
+
484
+ const results = await ctrl.findFiles({
485
+ query: {
486
+ name: "report",
487
+ mimeType: "application/pdf",
488
+ creator: userId,
489
+ tags: ["important"],
490
+ },
491
+ });
492
+
493
+ expect(results.content.length).toBe(1);
494
+ expect(results.content[0].name).toBe("report.pdf");
495
+ });
496
+ });
497
+
498
+ describe("integration scenarios", () => {
499
+ it("should handle complete file lifecycle", async () => {
500
+ const { ctrl } = await setup();
501
+
502
+ // Upload
503
+ const file = createFile("Lifecycle test", { name: "lifecycle.txt" });
504
+ const uploaded = await ctrl.uploadFile({
505
+ body: { file },
506
+ query: {},
507
+ });
508
+
509
+ // List
510
+ const listResult = await ctrl.findFiles({ query: {} });
511
+ expect(listResult.content).toContainEqual(
512
+ expect.objectContaining({ id: uploaded.id }),
513
+ );
514
+
515
+ // Stream
516
+ const streamed = await ctrl.streamFile({
517
+ params: { id: uploaded.id },
518
+ });
519
+ expect(await streamed.text()).toBe("Lifecycle test");
520
+
521
+ // Delete
522
+ await ctrl.deleteFile({ params: { id: uploaded.id } });
523
+
524
+ // Verify deletion
525
+ const finalList = await ctrl.findFiles({ query: {} });
526
+ expect(
527
+ finalList.content.find((f) => f.id === uploaded.id),
528
+ ).toBeUndefined();
529
+ });
530
+
531
+ it("should handle multiple files with different properties", async () => {
532
+ const { ctrl, dtp, service } = await setup();
533
+
534
+ // Upload various files
535
+ await ctrl.uploadFile({
536
+ body: { file: createFile("File 1", { name: "file1.txt" }) },
537
+ query: {},
538
+ });
539
+
540
+ await service.uploadFile(createFile("File 2", { name: "file2.txt" }), {
541
+ tags: ["important"],
542
+ });
543
+
544
+ await ctrl.uploadFile({
545
+ body: { file: createFile("File 3", { name: "file3.txt" }) },
546
+ query: { expirationDate: dtp.now().add(1, "hour").toISOString() },
547
+ });
548
+
549
+ const allFiles = await ctrl.findFiles({ query: {} });
550
+ expect(allFiles.content.length).toBe(3);
551
+
552
+ const taggedFiles = await ctrl.findFiles({
553
+ query: { tags: ["important"] },
554
+ });
555
+ expect(taggedFiles.content.length).toBe(1);
556
+ });
557
+ });
558
+ });
@@ -1,5 +1,4 @@
1
1
  import { $inject, t } from "alepha";
2
- import { pg } from "alepha/orm";
3
2
  import { $action, okSchema } from "alepha/server";
4
3
  import { fileQuerySchema } from "../schemas/fileQuerySchema.ts";
5
4
  import { fileResourceSchema } from "../schemas/fileResourceSchema.ts";
@@ -20,11 +19,11 @@ export class FileController {
20
19
  */
21
20
  public readonly findFiles = $action({
22
21
  path: this.url,
23
- group: this.group,
22
+ group: `admin:${this.group}`,
24
23
  description: "List files with filtering and pagination",
25
24
  schema: {
26
25
  query: fileQuerySchema,
27
- response: pg.page(fileResourceSchema),
26
+ response: t.page(fileResourceSchema),
28
27
  },
29
28
  handler: ({ query }) => this.fileService.findFiles(query),
30
29
  });
@@ -36,7 +35,7 @@ export class FileController {
36
35
  public readonly deleteFile = $action({
37
36
  method: "DELETE",
38
37
  path: `${this.url}/:id`,
39
- group: this.group,
38
+ group: `admin:${this.group}`,
40
39
  description: "Delete a file",
41
40
  schema: {
42
41
  params: t.object({
@@ -80,7 +79,7 @@ export class FileController {
80
79
  public readonly updateFile = $action({
81
80
  method: "PATCH",
82
81
  path: `${this.url}/:id`,
83
- group: this.group,
82
+ group: `admin:${this.group}`,
84
83
  description: "Update file metadata",
85
84
  schema: {
86
85
  params: t.object({
@@ -1,13 +1,13 @@
1
1
  import { type Static, t } from "alepha";
2
- import { $entity, pg } from "alepha/orm";
2
+ import { $entity, db } from "alepha/orm";
3
3
 
4
4
  export const files = $entity({
5
5
  name: "files",
6
6
  schema: t.object({
7
- id: pg.primaryKey(t.uuid()),
8
- version: pg.version(),
9
- createdAt: pg.createdAt(),
10
- updatedAt: pg.updatedAt(),
7
+ id: db.primaryKey(t.uuid()),
8
+ version: db.version(),
9
+ createdAt: db.createdAt(),
10
+ updatedAt: db.updatedAt(),
11
11
  blobId: t.text(),
12
12
  creator: t.optional(t.uuid()),
13
13
  creatorRealm: t.optional(t.string()),
@@ -2,8 +2,8 @@ import { $module } from "alepha";
2
2
 
3
3
  // ---------------------------------------------------------------------------------------------------------------------
4
4
 
5
+ export type * from "./controllers/AdminFileStatsController.ts";
5
6
  export type * from "./controllers/FileController.ts";
6
- export type * from "./controllers/StorageStatsController.ts";
7
7
  export * from "./entities/files.ts";
8
8
  export * from "./schemas/fileQuerySchema.ts";
9
9
  export * from "./schemas/fileResourceSchema.ts";
@@ -4,15 +4,15 @@ import type { DurationLike } from "alepha/datetime";
4
4
  import type { UserAccountToken } from "alepha/security";
5
5
  import { AlephaServerCache } from "alepha/server/cache";
6
6
  import { AlephaServerMultipart } from "alepha/server/multipart";
7
+ import { AdminFileStatsController } from "./controllers/AdminFileStatsController.ts";
7
8
  import { FileController } from "./controllers/FileController.ts";
8
- import { StorageStatsController } from "./controllers/StorageStatsController.ts";
9
9
  import { FileJobs } from "./jobs/FileJobs.ts";
10
10
  import { FileService } from "./services/FileService.ts";
11
11
 
12
12
  // ---------------------------------------------------------------------------------------------------------------------
13
13
 
14
+ export * from "./controllers/AdminFileStatsController.ts";
14
15
  export * from "./controllers/FileController.ts";
15
- export * from "./controllers/StorageStatsController.ts";
16
16
  export * from "./entities/files.ts";
17
17
  export * from "./jobs/FileJobs.ts";
18
18
  export * from "./schemas/storageStatsSchema.ts";
@@ -58,14 +58,14 @@ declare module "alepha/bucket" {
58
58
  */
59
59
  export const AlephaApiFiles = $module({
60
60
  name: "alepha.api.files",
61
- services: [FileController, StorageStatsController, FileJobs, FileService],
61
+ services: [FileController, AdminFileStatsController, FileJobs, FileService],
62
62
  register: (alepha) => {
63
63
  alepha
64
64
  .with(AlephaBucket)
65
65
  .with(AlephaServerCache)
66
66
  .with(AlephaServerMultipart)
67
67
  .with(FileController)
68
- .with(StorageStatsController)
68
+ .with(AdminFileStatsController)
69
69
  .with(FileJobs);
70
70
  },
71
71
  });