alepha 0.21.1 → 0.22.0

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 (481) hide show
  1. package/README.md +0 -1
  2. package/dist/api/audits/index.browser.js.map +1 -1
  3. package/dist/api/audits/index.d.ts +393 -403
  4. package/dist/api/audits/index.d.ts.map +1 -1
  5. package/dist/api/audits/index.js +25 -56
  6. package/dist/api/audits/index.js.map +1 -1
  7. package/dist/api/files/index.browser.js +31 -1
  8. package/dist/api/files/index.browser.js.map +1 -1
  9. package/dist/api/files/index.d.ts +353 -207
  10. package/dist/api/files/index.d.ts.map +1 -1
  11. package/dist/api/files/index.js +211 -45
  12. package/dist/api/files/index.js.map +1 -1
  13. package/dist/api/jobs/index.browser.js +2 -2
  14. package/dist/api/jobs/index.browser.js.map +1 -1
  15. package/dist/api/jobs/index.d.ts +289 -292
  16. package/dist/api/jobs/index.d.ts.map +1 -1
  17. package/dist/api/jobs/index.js +39 -33
  18. package/dist/api/jobs/index.js.map +1 -1
  19. package/dist/api/keys/index.d.ts +211 -216
  20. package/dist/api/keys/index.d.ts.map +1 -1
  21. package/dist/api/keys/index.js.map +1 -1
  22. package/dist/api/notifications/index.browser.js.map +1 -1
  23. package/dist/api/notifications/index.d.ts +188 -195
  24. package/dist/api/notifications/index.d.ts.map +1 -1
  25. package/dist/api/notifications/index.js.map +1 -1
  26. package/dist/api/oauth/index.d.ts +71 -76
  27. package/dist/api/oauth/index.d.ts.map +1 -1
  28. package/dist/api/oauth/index.js.map +1 -1
  29. package/dist/api/organizations/index.browser.js.map +1 -1
  30. package/dist/api/organizations/index.d.ts +104 -109
  31. package/dist/api/organizations/index.d.ts.map +1 -1
  32. package/dist/api/organizations/index.js.map +1 -1
  33. package/dist/api/parameters/index.browser.js +43 -16
  34. package/dist/api/parameters/index.browser.js.map +1 -1
  35. package/dist/api/parameters/index.d.ts +488 -344
  36. package/dist/api/parameters/index.d.ts.map +1 -1
  37. package/dist/api/parameters/index.js +175 -35
  38. package/dist/api/parameters/index.js.map +1 -1
  39. package/dist/api/payments/index.d.ts +396 -402
  40. package/dist/api/payments/index.d.ts.map +1 -1
  41. package/dist/api/payments/index.js.map +1 -1
  42. package/dist/api/subscriptions/index.d.ts +644 -652
  43. package/dist/api/subscriptions/index.d.ts.map +1 -1
  44. package/dist/api/subscriptions/index.js +1 -1
  45. package/dist/api/subscriptions/index.js.map +1 -1
  46. package/dist/api/users/index.browser.js +7 -0
  47. package/dist/api/users/index.browser.js.map +1 -1
  48. package/dist/api/users/index.d.ts +1072 -1005
  49. package/dist/api/users/index.d.ts.map +1 -1
  50. package/dist/api/users/index.js +311 -87
  51. package/dist/api/users/index.js.map +1 -1
  52. package/dist/api/verifications/index.browser.js +1 -0
  53. package/dist/api/verifications/index.browser.js.map +1 -1
  54. package/dist/api/verifications/index.d.ts +144 -133
  55. package/dist/api/verifications/index.d.ts.map +1 -1
  56. package/dist/api/verifications/index.js +5 -1
  57. package/dist/api/verifications/index.js.map +1 -1
  58. package/dist/background/index.d.ts +95 -0
  59. package/dist/background/index.d.ts.map +1 -0
  60. package/dist/background/index.js +121 -0
  61. package/dist/background/index.js.map +1 -0
  62. package/dist/background/index.workerd.js +110 -0
  63. package/dist/background/index.workerd.js.map +1 -0
  64. package/dist/batch/index.d.ts +5 -7
  65. package/dist/batch/index.d.ts.map +1 -1
  66. package/dist/batch/index.js.map +1 -1
  67. package/dist/bin/index.js.map +1 -1
  68. package/dist/bucket/index.d.ts +76 -54
  69. package/dist/bucket/index.d.ts.map +1 -1
  70. package/dist/bucket/index.js +58 -11
  71. package/dist/bucket/index.js.map +1 -1
  72. package/dist/bucket/index.workerd.js +200 -5
  73. package/dist/bucket/index.workerd.js.map +1 -1
  74. package/dist/cache/core/index.d.ts +7 -10
  75. package/dist/cache/core/index.d.ts.map +1 -1
  76. package/dist/cache/core/index.js.map +1 -1
  77. package/dist/cache/core/index.workerd.js.map +1 -1
  78. package/dist/cache/database/index.d.ts +22 -26
  79. package/dist/cache/database/index.d.ts.map +1 -1
  80. package/dist/cache/database/index.js.map +1 -1
  81. package/dist/cache/redis/index.d.ts +4 -7
  82. package/dist/cache/redis/index.d.ts.map +1 -1
  83. package/dist/cache/redis/index.js.map +1 -1
  84. package/dist/captcha/index.d.ts +3 -6
  85. package/dist/captcha/index.d.ts.map +1 -1
  86. package/dist/captcha/index.js.map +1 -1
  87. package/dist/cli/config/index.d.ts.map +1 -1
  88. package/dist/cli/config/index.js.map +1 -1
  89. package/dist/cli/core/index.d.ts +460 -188
  90. package/dist/cli/core/index.d.ts.map +1 -1
  91. package/dist/cli/core/index.js +411 -551
  92. package/dist/cli/core/index.js.map +1 -1
  93. package/dist/cli/devtools/index.d.ts +3 -5
  94. package/dist/cli/devtools/index.d.ts.map +1 -1
  95. package/dist/cli/devtools/index.js.map +1 -1
  96. package/dist/cli/i18n/index.d.ts +8 -12
  97. package/dist/cli/i18n/index.d.ts.map +1 -1
  98. package/dist/cli/i18n/index.js.map +1 -1
  99. package/dist/cli/platform/index.d.ts +127 -1382
  100. package/dist/cli/platform/index.d.ts.map +1 -1
  101. package/dist/cli/platform/index.js +188 -2493
  102. package/dist/cli/platform/index.js.map +1 -1
  103. package/dist/cli/platform-lib/index.d.ts +1446 -0
  104. package/dist/cli/platform-lib/index.d.ts.map +1 -0
  105. package/dist/cli/platform-lib/index.js +2597 -0
  106. package/dist/cli/platform-lib/index.js.map +1 -0
  107. package/dist/cli/vendor/index.d.ts +17 -21
  108. package/dist/cli/vendor/index.d.ts.map +1 -1
  109. package/dist/cli/vendor/index.js.map +1 -1
  110. package/dist/command/index.d.ts +21 -20
  111. package/dist/command/index.d.ts.map +1 -1
  112. package/dist/command/index.js +39 -10
  113. package/dist/command/index.js.map +1 -1
  114. package/dist/container/core/index.d.ts +236 -0
  115. package/dist/container/core/index.d.ts.map +1 -0
  116. package/dist/container/core/index.js +231 -0
  117. package/dist/container/core/index.js.map +1 -0
  118. package/dist/container/core/index.workerd.js +192 -0
  119. package/dist/container/core/index.workerd.js.map +1 -0
  120. package/dist/core/index.browser.js +27 -1
  121. package/dist/core/index.browser.js.map +1 -1
  122. package/dist/core/index.d.ts +48 -24
  123. package/dist/core/index.d.ts.map +1 -1
  124. package/dist/core/index.js +27 -1
  125. package/dist/core/index.js.map +1 -1
  126. package/dist/core/index.native.js +27 -1
  127. package/dist/core/index.native.js.map +1 -1
  128. package/dist/core/index.workerd.js +27 -1
  129. package/dist/core/index.workerd.js.map +1 -1
  130. package/dist/crypto/index.browser.js.map +1 -1
  131. package/dist/crypto/index.d.ts +5 -8
  132. package/dist/crypto/index.d.ts.map +1 -1
  133. package/dist/crypto/index.js.map +1 -1
  134. package/dist/datetime/index.d.ts +3 -4
  135. package/dist/datetime/index.d.ts.map +1 -1
  136. package/dist/datetime/index.js.map +1 -1
  137. package/dist/email/brevo/index.d.ts +2 -4
  138. package/dist/email/brevo/index.d.ts.map +1 -1
  139. package/dist/email/brevo/index.js.map +1 -1
  140. package/dist/email/cloudflare/index.d.ts +103 -0
  141. package/dist/email/cloudflare/index.d.ts.map +1 -0
  142. package/dist/email/cloudflare/index.js +153 -0
  143. package/dist/email/cloudflare/index.js.map +1 -0
  144. package/dist/email/core/index.d.ts +6 -9
  145. package/dist/email/core/index.d.ts.map +1 -1
  146. package/dist/email/core/index.js.map +1 -1
  147. package/dist/email/core/index.workerd.js.map +1 -1
  148. package/dist/email/smtp/index.d.ts +10 -13
  149. package/dist/email/smtp/index.d.ts.map +1 -1
  150. package/dist/email/smtp/index.js +107 -32
  151. package/dist/email/smtp/index.js.map +1 -1
  152. package/dist/fake/index.d.ts +1 -2
  153. package/dist/fake/index.d.ts.map +1 -1
  154. package/dist/fake/index.js.map +1 -1
  155. package/dist/lock/core/index.d.ts +9 -14
  156. package/dist/lock/core/index.d.ts.map +1 -1
  157. package/dist/lock/core/index.js.map +1 -1
  158. package/dist/lock/redis/index.d.ts +2 -4
  159. package/dist/lock/redis/index.d.ts.map +1 -1
  160. package/dist/lock/redis/index.js.map +1 -1
  161. package/dist/logger/index.d.ts +105 -76
  162. package/dist/logger/index.d.ts.map +1 -1
  163. package/dist/logger/index.js +196 -174
  164. package/dist/logger/index.js.map +1 -1
  165. package/dist/mcp/index.d.ts +16 -20
  166. package/dist/mcp/index.d.ts.map +1 -1
  167. package/dist/mcp/index.js.map +1 -1
  168. package/dist/orm/core/index.browser.js.map +1 -1
  169. package/dist/orm/core/index.bun.js +21 -3
  170. package/dist/orm/core/index.bun.js.map +1 -1
  171. package/dist/orm/core/index.d.ts +76 -62
  172. package/dist/orm/core/index.d.ts.map +1 -1
  173. package/dist/orm/core/index.js +22 -4
  174. package/dist/orm/core/index.js.map +1 -1
  175. package/dist/orm/postgres/index.bun.js.map +1 -1
  176. package/dist/orm/postgres/index.d.ts +28 -20
  177. package/dist/orm/postgres/index.d.ts.map +1 -1
  178. package/dist/orm/postgres/index.js.map +1 -1
  179. package/dist/queue/core/index.d.ts +12 -15
  180. package/dist/queue/core/index.d.ts.map +1 -1
  181. package/dist/queue/core/index.js.map +1 -1
  182. package/dist/queue/core/index.workerd.js.map +1 -1
  183. package/dist/queue/redis/index.d.ts +3 -5
  184. package/dist/queue/redis/index.d.ts.map +1 -1
  185. package/dist/queue/redis/index.js.map +1 -1
  186. package/dist/react/auth/index.browser.js +9 -2
  187. package/dist/react/auth/index.browser.js.map +1 -1
  188. package/dist/react/auth/index.d.ts +14 -9
  189. package/dist/react/auth/index.d.ts.map +1 -1
  190. package/dist/react/auth/index.js +9 -2
  191. package/dist/react/auth/index.js.map +1 -1
  192. package/dist/react/core/index.d.ts +7 -8
  193. package/dist/react/core/index.d.ts.map +1 -1
  194. package/dist/react/core/index.js +6 -3
  195. package/dist/react/core/index.js.map +1 -1
  196. package/dist/react/form/index.d.ts +38 -5
  197. package/dist/react/form/index.d.ts.map +1 -1
  198. package/dist/react/form/index.js +91 -3
  199. package/dist/react/form/index.js.map +1 -1
  200. package/dist/react/head/index.browser.js.map +1 -1
  201. package/dist/react/head/index.d.ts +2 -4
  202. package/dist/react/head/index.d.ts.map +1 -1
  203. package/dist/react/head/index.js.map +1 -1
  204. package/dist/react/i18n/index.d.ts +47 -11
  205. package/dist/react/i18n/index.d.ts.map +1 -1
  206. package/dist/react/i18n/index.js +33 -1
  207. package/dist/react/i18n/index.js.map +1 -1
  208. package/dist/react/intro/index.d.ts +1 -2
  209. package/dist/react/intro/index.d.ts.map +1 -1
  210. package/dist/react/intro/index.js +2 -2
  211. package/dist/react/intro/index.js.map +1 -1
  212. package/dist/react/router/index.browser.js +66 -20
  213. package/dist/react/router/index.browser.js.map +1 -1
  214. package/dist/react/router/index.d.ts +327 -222
  215. package/dist/react/router/index.d.ts.map +1 -1
  216. package/dist/react/router/index.js +66 -30
  217. package/dist/react/router/index.js.map +1 -1
  218. package/dist/react/testing/index.d.ts +1 -2
  219. package/dist/react/testing/index.d.ts.map +1 -1
  220. package/dist/react/testing/index.js +16 -17
  221. package/dist/react/testing/index.js.map +1 -1
  222. package/dist/react/ui/index.d.ts +20 -25
  223. package/dist/react/ui/index.d.ts.map +1 -1
  224. package/dist/react/ui/index.js.map +1 -1
  225. package/dist/redis/index.bun.js.map +1 -1
  226. package/dist/redis/index.d.ts +17 -19
  227. package/dist/redis/index.d.ts.map +1 -1
  228. package/dist/redis/index.js.map +1 -1
  229. package/dist/retry/index.d.ts +2 -4
  230. package/dist/retry/index.d.ts.map +1 -1
  231. package/dist/retry/index.js.map +1 -1
  232. package/dist/router/index.d.ts.map +1 -1
  233. package/dist/router/index.js.map +1 -1
  234. package/dist/scheduler/index.d.ts +10 -13
  235. package/dist/scheduler/index.d.ts.map +1 -1
  236. package/dist/scheduler/index.js.map +1 -1
  237. package/dist/scheduler/index.workerd.js.map +1 -1
  238. package/dist/security/index.browser.js.map +1 -1
  239. package/dist/security/index.d.ts +45 -48
  240. package/dist/security/index.d.ts.map +1 -1
  241. package/dist/security/index.js.map +1 -1
  242. package/dist/server/auth/index.browser.js.map +1 -1
  243. package/dist/server/auth/index.d.ts +167 -172
  244. package/dist/server/auth/index.d.ts.map +1 -1
  245. package/dist/server/auth/index.js +4 -8
  246. package/dist/server/auth/index.js.map +1 -1
  247. package/dist/server/cookies/index.browser.js.map +1 -1
  248. package/dist/server/cookies/index.d.ts +5 -7
  249. package/dist/server/cookies/index.d.ts.map +1 -1
  250. package/dist/server/cookies/index.js.map +1 -1
  251. package/dist/server/core/index.browser.js.map +1 -1
  252. package/dist/server/core/index.d.ts +88 -73
  253. package/dist/server/core/index.d.ts.map +1 -1
  254. package/dist/server/core/index.js +19 -0
  255. package/dist/server/core/index.js.map +1 -1
  256. package/dist/server/cors/index.d.ts +11 -14
  257. package/dist/server/cors/index.d.ts.map +1 -1
  258. package/dist/server/cors/index.js.map +1 -1
  259. package/dist/server/etag/index.d.ts +6 -9
  260. package/dist/server/etag/index.d.ts.map +1 -1
  261. package/dist/server/etag/index.js.map +1 -1
  262. package/dist/server/health/index.d.ts +18 -21
  263. package/dist/server/health/index.d.ts.map +1 -1
  264. package/dist/server/health/index.js.map +1 -1
  265. package/dist/server/links/index.browser.js +2 -0
  266. package/dist/server/links/index.browser.js.map +1 -1
  267. package/dist/server/links/index.d.ts +63 -67
  268. package/dist/server/links/index.d.ts.map +1 -1
  269. package/dist/server/links/index.js +2 -0
  270. package/dist/server/links/index.js.map +1 -1
  271. package/dist/server/metrics/index.d.ts +5 -7
  272. package/dist/server/metrics/index.d.ts.map +1 -1
  273. package/dist/server/metrics/index.js.map +1 -1
  274. package/dist/server/proxy/index.d.ts +3 -5
  275. package/dist/server/proxy/index.d.ts.map +1 -1
  276. package/dist/server/proxy/index.js.map +1 -1
  277. package/dist/server/rate-limit/index.d.ts +10 -13
  278. package/dist/server/rate-limit/index.d.ts.map +1 -1
  279. package/dist/server/rate-limit/index.js.map +1 -1
  280. package/dist/server/static/index.d.ts +3 -5
  281. package/dist/server/static/index.d.ts.map +1 -1
  282. package/dist/server/static/index.js.map +1 -1
  283. package/dist/server/swagger/index.d.ts +5 -8
  284. package/dist/server/swagger/index.d.ts.map +1 -1
  285. package/dist/server/swagger/index.js.map +1 -1
  286. package/dist/sms/index.d.ts +3 -5
  287. package/dist/sms/index.d.ts.map +1 -1
  288. package/dist/sms/index.js.map +1 -1
  289. package/dist/system/index.browser.js.map +1 -1
  290. package/dist/system/index.d.ts +2 -4
  291. package/dist/system/index.d.ts.map +1 -1
  292. package/dist/system/index.js.map +1 -1
  293. package/dist/system/index.workerd.js.map +1 -1
  294. package/dist/topic/core/index.d.ts +4 -6
  295. package/dist/topic/core/index.d.ts.map +1 -1
  296. package/dist/topic/core/index.js.map +1 -1
  297. package/dist/topic/redis/index.d.ts +5 -8
  298. package/dist/topic/redis/index.d.ts.map +1 -1
  299. package/dist/topic/redis/index.js.map +1 -1
  300. package/package.json +57 -12
  301. package/src/api/audits/__tests__/AuditService.spec.ts +18 -110
  302. package/src/api/audits/controllers/AdminAuditController.ts +14 -0
  303. package/src/api/audits/services/AuditService.ts +21 -88
  304. package/src/api/files/__tests__/FileService.spec.ts +207 -2
  305. package/src/api/files/controllers/FileController.ts +41 -1
  306. package/src/api/files/index.ts +3 -0
  307. package/src/api/files/providers/FileAccessProvider.ts +23 -1
  308. package/src/api/files/schemas/fileCreatorSummarySchema.ts +22 -0
  309. package/src/api/files/schemas/fileResourceSchema.ts +10 -1
  310. package/src/api/files/services/FileService.ts +175 -75
  311. package/src/api/jobs/__tests__/$job.spec.ts +24 -1
  312. package/src/api/jobs/index.ts +4 -3
  313. package/src/api/jobs/primitives/$job.ts +7 -3
  314. package/src/api/jobs/providers/DirectJobDispatcher.ts +17 -36
  315. package/src/api/jobs/providers/JobProvider.ts +53 -24
  316. package/src/api/jobs/schemas/jobConfigAtom.ts +1 -1
  317. package/src/api/jobs/schemas/jobExecutionResourceSchema.ts +4 -1
  318. package/src/api/keys/schemas/adminApiKeyResourceSchema.ts +3 -1
  319. package/src/api/parameters/__tests__/$parameter.spec.ts +19 -2
  320. package/src/api/parameters/audits/ParameterAudits.ts +17 -0
  321. package/src/api/parameters/controllers/AdminParameterController.ts +95 -19
  322. package/src/api/parameters/index.ts +3 -0
  323. package/src/api/parameters/schemas/activateParameterBodySchema.ts +3 -3
  324. package/src/api/parameters/schemas/createParameterVersionBodySchema.ts +3 -2
  325. package/src/api/parameters/schemas/parameterCreatorSummarySchema.ts +25 -0
  326. package/src/api/parameters/schemas/parameterResponseSchema.ts +5 -0
  327. package/src/api/parameters/schemas/rollbackParameterBodySchema.ts +4 -2
  328. package/src/api/parameters/services/ParameterProvider.ts +69 -6
  329. package/src/api/subscriptions/jobs/SubscriptionJobs.ts +1 -1
  330. package/src/api/users/__tests__/AdminSessionController.spec.ts +37 -0
  331. package/src/api/users/audits/SessionAudits.ts +33 -0
  332. package/src/api/users/audits/UserAudits.ts +19 -43
  333. package/src/api/users/controllers/AdminUserController.ts +66 -1
  334. package/src/api/users/entities/sessions.ts +6 -0
  335. package/src/api/users/entities/users.ts +2 -0
  336. package/src/api/users/index.ts +9 -1
  337. package/src/api/users/primitives/$realm.ts +3 -0
  338. package/src/api/users/schemas/sessionResourceSchema.ts +16 -0
  339. package/src/api/users/schemas/updateUserSchema.ts +1 -8
  340. package/src/api/users/schemas/userQuerySchema.ts +7 -0
  341. package/src/api/users/services/CredentialService.ts +52 -32
  342. package/src/api/users/services/IdentityService.ts +2 -1
  343. package/src/api/users/services/RegistrationService.ts +2 -1
  344. package/src/api/users/services/SessionCrudService.ts +19 -2
  345. package/src/api/users/services/SessionService.ts +39 -19
  346. package/src/api/users/services/UserService.ts +106 -8
  347. package/src/api/verifications/entities/verifications.ts +8 -0
  348. package/src/api/verifications/services/VerificationService.ts +14 -0
  349. package/src/background/__tests__/BackgroundTaskProvider.spec.ts +96 -0
  350. package/src/background/index.ts +37 -0
  351. package/src/background/index.workerd.ts +28 -0
  352. package/src/background/providers/BackgroundTaskProvider.ts +70 -0
  353. package/src/background/providers/WorkerdBackgroundTaskProvider.ts +43 -0
  354. package/src/bucket/__tests__/$bucket.spec.ts +18 -0
  355. package/src/bucket/__tests__/LocalFileStorageProvider.spec.ts +5 -0
  356. package/src/bucket/__tests__/MemoryFileStorageProvider.spec.ts +5 -0
  357. package/src/bucket/__tests__/NodeS3BucketProvider.spec.ts +23 -4
  358. package/src/bucket/__tests__/shared.ts +30 -0
  359. package/src/bucket/index.ts +5 -5
  360. package/src/bucket/index.workerd.ts +11 -4
  361. package/src/bucket/primitives/$bucket.ts +27 -0
  362. package/src/bucket/providers/FileStorageProvider.ts +13 -0
  363. package/src/bucket/providers/LocalFileStorageProvider.ts +17 -1
  364. package/src/bucket/providers/MemoryFileStorageProvider.ts +7 -0
  365. package/src/bucket/providers/{CloudflareR2Provider.ts → R2FileStorageProvider.ts} +10 -1
  366. package/src/bucket/providers/{NodeS3BucketProvider.ts → S3FileStorageProvider.ts} +27 -5
  367. package/src/cli/core/__tests__/BuildDockerTask.spec.ts +49 -1
  368. package/src/cli/core/__tests__/init.spec.ts +0 -219
  369. package/src/cli/core/atoms/buildOptions.ts +15 -0
  370. package/src/cli/core/commands/__tests__/BuildCommand.spec.ts +43 -0
  371. package/src/cli/core/commands/build.ts +122 -32
  372. package/src/cli/core/commands/init.ts +0 -12
  373. package/src/cli/core/commands/pack.ts +133 -0
  374. package/src/cli/core/index.ts +3 -0
  375. package/src/cli/core/providers/ViteDevServerProvider.ts +40 -16
  376. package/src/cli/core/services/PackageManagerUtils.ts +0 -16
  377. package/src/cli/core/services/ProjectScaffolder.ts +29 -291
  378. package/src/cli/core/tasks/BuildAssetsTask.ts +3 -0
  379. package/src/cli/core/tasks/BuildClientTask.ts +3 -0
  380. package/src/cli/core/tasks/BuildCloudflareTask.ts +453 -13
  381. package/src/cli/core/tasks/BuildCompressTask.ts +3 -0
  382. package/src/cli/core/tasks/BuildDockerTask.ts +43 -2
  383. package/src/cli/core/tasks/BuildPrerenderTask.ts +3 -0
  384. package/src/cli/core/tasks/BuildPwaTask.ts +3 -0
  385. package/src/cli/core/tasks/BuildServerTask.ts +3 -0
  386. package/src/cli/core/tasks/BuildTask.ts +42 -0
  387. package/src/cli/core/templates/apiIndexTs.ts +1 -22
  388. package/src/cli/core/templates/mainCss.ts +0 -1
  389. package/src/cli/core/templates/webAppRouterTs.ts +0 -99
  390. package/src/cli/core/templates/webIndexTs.ts +1 -22
  391. package/src/cli/platform/__tests__/SecretsCommand.spec.ts +5 -3
  392. package/src/cli/platform/commands/SecretsCommand.ts +8 -6
  393. package/src/cli/platform/commands/platform.ts +265 -122
  394. package/src/cli/platform/index.ts +25 -53
  395. package/src/cli/{platform → platform-lib}/__tests__/CloudflareAdapter.spec.ts +426 -169
  396. package/src/cli/{platform → platform-lib}/__tests__/NamingService.spec.ts +81 -36
  397. package/src/cli/{platform → platform-lib}/__tests__/PlatformInspector.spec.ts +4 -48
  398. package/src/cli/{platform → platform-lib}/__tests__/VercelAdapter.spec.ts +56 -85
  399. package/src/cli/{platform → platform-lib}/adapters/CloudflareAdapter.ts +412 -199
  400. package/src/cli/{platform → platform-lib}/adapters/PlatformAdapter.ts +68 -33
  401. package/src/cli/{platform → platform-lib}/adapters/VercelAdapter.ts +11 -25
  402. package/src/cli/{platform → platform-lib}/atoms/platformOptions.ts +34 -6
  403. package/src/cli/platform-lib/index.ts +67 -0
  404. package/src/cli/platform-lib/services/NamingService.ts +136 -0
  405. package/src/cli/platform-lib/services/PlatformInspector.ts +153 -0
  406. package/src/cli/{platform → platform-lib}/services/PlatformOrchestrator.ts +80 -127
  407. package/src/cli/{platform → platform-lib}/services/WranglerApi.ts +4 -2
  408. package/src/command/__tests__/Runner.spec.ts +20 -0
  409. package/src/command/helpers/EnvUtils.ts +19 -3
  410. package/src/command/helpers/Runner.ts +12 -2
  411. package/src/command/providers/CliProvider.ts +34 -1
  412. package/src/container/core/__tests__/$container.spec.ts +83 -0
  413. package/src/container/core/index.ts +50 -0
  414. package/src/container/core/index.workerd.ts +53 -0
  415. package/src/container/core/interfaces/ContainerOptions.ts +69 -0
  416. package/src/container/core/primitives/$container.ts +100 -0
  417. package/src/container/core/providers/CloudflareContainerProvider.ts +70 -0
  418. package/src/container/core/providers/ContainerProvider.ts +92 -0
  419. package/src/container/core/providers/MockContainerProvider.ts +62 -0
  420. package/src/container/core/providers/NodeContainerProvider.ts +53 -0
  421. package/src/core/Alepha.ts +49 -1
  422. package/src/core/__tests__/$env.spec.ts +42 -0
  423. package/src/core/__tests__/dump.spec.ts +47 -0
  424. package/src/email/cloudflare/__tests__/CloudflareEmailProvider.spec.ts +182 -0
  425. package/src/email/cloudflare/index.ts +35 -0
  426. package/src/email/cloudflare/providers/CloudflareEmailProvider.ts +205 -0
  427. package/src/logger/__tests__/Logger.spec.ts +55 -0
  428. package/src/logger/index.ts +13 -0
  429. package/src/logger/services/Logger.ts +31 -1
  430. package/src/orm/__tests__/orm-showcase-tests.ts +27 -0
  431. package/src/orm/__tests__/orm-showcase.spec.ts +12 -0
  432. package/src/orm/core/interfaces/PgQuery.ts +4 -1
  433. package/src/orm/core/services/Repository.ts +38 -13
  434. package/src/react/auth/hooks/useAuth.ts +10 -5
  435. package/src/react/core/__tests__/useQuery.browser.spec.tsx +25 -0
  436. package/src/react/core/hooks/useAction.ts +14 -3
  437. package/src/react/core/hooks/useQuery.ts +24 -4
  438. package/src/react/form/hooks/useFormQuerySync.ts +0 -0
  439. package/src/react/form/index.ts +1 -0
  440. package/src/react/form/services/FormModel.ts +18 -2
  441. package/src/react/i18n/components/Translate.tsx +47 -0
  442. package/src/react/i18n/index.ts +2 -0
  443. package/src/react/intro/components/GettingStartedAdminSlide.tsx +2 -2
  444. package/src/react/router/__tests__/$page.spec.tsx +3 -2
  445. package/src/react/router/__tests__/page-can.spec.ts +18 -13
  446. package/src/react/router/hooks/useQueryParams.ts +114 -14
  447. package/src/react/router/primitives/$page.ts +85 -4
  448. package/src/react/router/providers/ReactBrowserProvider.ts +12 -3
  449. package/src/react/router/providers/ReactBrowserRouterProvider.ts +3 -7
  450. package/src/react/router/providers/ReactServerProvider.ts +4 -13
  451. package/src/react/ui/services/SchemaControl.ts +3 -4
  452. package/src/server/core/providers/ServerMultipartProvider.ts +19 -0
  453. package/src/server/links/providers/LinkProvider.ts +10 -0
  454. package/src/cli/core/templates/componentsJsonTs.ts +0 -39
  455. package/src/cli/core/templates/saasAdminLayoutTsx.ts +0 -77
  456. package/src/cli/core/templates/saasAdminPagesTsx.ts +0 -26
  457. package/src/cli/core/templates/saasAuthLayoutTsx.ts +0 -22
  458. package/src/cli/core/templates/saasAuthPagesTsx.ts +0 -62
  459. package/src/cli/core/templates/saasRealmProviderTs.ts +0 -52
  460. package/src/cli/platform/hooks/PlatformHook.ts +0 -51
  461. package/src/cli/platform/services/NamingService.ts +0 -55
  462. package/src/cli/platform/services/PlatformInspector.ts +0 -140
  463. package/src/orm/REFACTORING.md +0 -330
  464. /package/dist/orm/core/{chunk-o8xxKEmq.js → chunk-B4FMCO8f.js} +0 -0
  465. /package/dist/react/testing/{chunk-6Ep1yQYe.js → chunk-BpyX8vjI.js} +0 -0
  466. /package/src/cli/{platform → platform-lib}/__tests__/GitHubSecretStore.spec.ts +0 -0
  467. /package/src/cli/{platform → platform-lib}/__tests__/PlatformCacheProvider.spec.ts +0 -0
  468. /package/src/cli/{platform → platform-lib}/__tests__/PlatformOrchestrator.spec.ts +0 -0
  469. /package/src/cli/{platform → platform-lib}/__tests__/SecretFilterService.spec.ts +0 -0
  470. /package/src/cli/{platform → platform-lib}/__tests__/detectResources.spec.ts +0 -0
  471. /package/src/cli/{platform → platform-lib}/providers/GitHubSecretStore.ts +0 -0
  472. /package/src/cli/{platform → platform-lib}/providers/MemorySecretStore.ts +0 -0
  473. /package/src/cli/{platform → platform-lib}/providers/PlatformCacheProvider.ts +0 -0
  474. /package/src/cli/{platform → platform-lib}/providers/SecretStoreProvider.ts +0 -0
  475. /package/src/cli/{platform → platform-lib}/schemas/cloudflare.ts +0 -0
  476. /package/src/cli/{platform → platform-lib}/schemas/platform.ts +0 -0
  477. /package/src/cli/{platform → platform-lib}/schemas/vercel.ts +0 -0
  478. /package/src/cli/{platform → platform-lib}/services/CloudflareApi.ts +0 -0
  479. /package/src/cli/{platform → platform-lib}/services/SecretFilterService.ts +0 -0
  480. /package/src/cli/{platform → platform-lib}/services/VercelApi.ts +0 -0
  481. /package/src/cli/{platform → platform-lib}/services/VercelCli.ts +0 -0
@@ -1,37 +1,32 @@
1
- import * as _$alepha from "alepha";
2
1
  import { Alepha, FileLike, Static, TNull, TObject, TOptional, TSchema, TUnion } from "alepha";
3
2
  import { BucketPrimitive } from "alepha/bucket";
4
3
  import { UserAccountToken } from "alepha/security";
5
- import * as _$alepha_server0 from "alepha/server";
6
4
  import { Ok } from "alepha/server";
7
5
  import { DateTime, DateTimeProvider, DurationLike } from "alepha/datetime";
8
- import * as _$alepha_logger0 from "alepha/logger";
9
- import * as _$alepha_orm0 from "alepha/orm";
10
- import { Page } from "alepha/orm";
11
- import * as _$alepha_scheduler0 from "alepha/scheduler";
12
- import * as _$typebox from "typebox";
6
+ import { Page, RepositoryProvider } from "alepha/orm";
7
+ import { FileSystemProvider } from "alepha/system";
13
8
  import { BuildExtraConfigColumns, SQL } from "drizzle-orm";
14
9
  import { PgColumnBuilderBase, PgSequenceOptions, PgTableExtraConfigValue, UpdateDeleteAction } from "drizzle-orm/pg-core";
15
10
  //#region ../../src/api/files/entities/files.d.ts
16
- declare const files: _$alepha_orm0.EntityPrimitive<_$typebox.TObject<{
17
- id: _$alepha_orm0.PgAttr<_$alepha_orm0.PgAttr<_$typebox.TString, typeof _$alepha_orm0.PG_PRIMARY_KEY>, typeof _$alepha_orm0.PG_DEFAULT>;
18
- version: _$alepha_orm0.PgAttr<_$alepha_orm0.PgAttr<_$typebox.TInteger, typeof _$alepha_orm0.PG_VERSION>, typeof _$alepha_orm0.PG_DEFAULT>;
19
- createdAt: _$alepha_orm0.PgAttr<_$alepha_orm0.PgAttr<_$typebox.TString, typeof _$alepha_orm0.PG_CREATED_AT>, typeof _$alepha_orm0.PG_DEFAULT>;
20
- updatedAt: _$alepha_orm0.PgAttr<_$alepha_orm0.PgAttr<_$typebox.TString, typeof _$alepha_orm0.PG_UPDATED_AT>, typeof _$alepha_orm0.PG_DEFAULT>;
21
- organizationId: _$alepha_orm0.PgAttr<_$typebox.TString, typeof _$alepha_orm0.PG_ORGANIZATION>;
22
- blobId: _$typebox.TString;
23
- creator: _$typebox.TOptional<_$typebox.TString>;
24
- creatorRealm: _$typebox.TOptional<_$typebox.TString>;
25
- creatorName: _$typebox.TOptional<_$typebox.TString>;
26
- bucket: _$typebox.TString;
27
- expirationDate: _$typebox.TOptional<_$typebox.TString>;
11
+ declare const files: import("alepha/orm").EntityPrimitive<import("typebox").TObject<{
12
+ id: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("typebox").TString, typeof import("alepha/orm").PG_PRIMARY_KEY>, typeof import("alepha/orm").PG_DEFAULT>;
13
+ version: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("typebox").TInteger, typeof import("alepha/orm").PG_VERSION>, typeof import("alepha/orm").PG_DEFAULT>;
14
+ createdAt: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("typebox").TString, typeof import("alepha/orm").PG_CREATED_AT>, typeof import("alepha/orm").PG_DEFAULT>;
15
+ updatedAt: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("typebox").TString, typeof import("alepha/orm").PG_UPDATED_AT>, typeof import("alepha/orm").PG_DEFAULT>;
16
+ organizationId: import("alepha/orm").PgAttr<import("typebox").TString, typeof import("alepha/orm").PG_ORGANIZATION>;
17
+ blobId: import("typebox").TString;
18
+ creator: import("typebox").TOptional<import("typebox").TString>;
19
+ creatorRealm: import("typebox").TOptional<import("typebox").TString>;
20
+ creatorName: import("typebox").TOptional<import("typebox").TString>;
21
+ bucket: import("typebox").TString;
22
+ expirationDate: import("typebox").TOptional<import("typebox").TString>;
28
23
  /**
29
24
  * Display name. Mutable via `FileService.updateFile` — can be renamed
30
25
  * by callers (e.g. an Archive UI letting users rename uploaded blobs).
31
26
  * Initialized to the uploader's filename at upload time. Use
32
27
  * `originalName` if you need the as-uploaded filename after a rename.
33
28
  */
34
- name: _$typebox.TString;
29
+ name: import("typebox").TString;
35
30
  /**
36
31
  * Immutable record of the uploader's filename at upload time. Set once
37
32
  * by `FileService.uploadFile` and the `bucket:file:uploaded` hook;
@@ -39,37 +34,37 @@ declare const files: _$alepha_orm0.EntityPrimitive<_$typebox.TObject<{
39
34
  * headers (Content-Disposition), audit trails, and any UI that wants
40
35
  * to show "originally uploaded as X" alongside a renamed file.
41
36
  */
42
- originalName: _$typebox.TOptional<_$typebox.TString>;
43
- size: _$typebox.TNumber;
44
- mimeType: _$typebox.TString;
37
+ originalName: import("typebox").TOptional<import("typebox").TString>;
38
+ size: import("typebox").TNumber;
39
+ mimeType: import("typebox").TString;
45
40
  /**
46
41
  * Free-form taxonomy. Normalized server-side (trim/lowercase/dedupe is
47
42
  * caller's responsibility for now). Use with `FileQuery.tags` to
48
43
  * filter via array-contains.
49
44
  */
50
- tags: _$typebox.TOptional<_$typebox.TArray<_$typebox.TString>>;
45
+ tags: import("typebox").TOptional<import("typebox").TArray<import("typebox").TString>>;
51
46
  /**
52
47
  * SHA-256 hex digest of the file content (64 lowercase hex chars).
53
48
  * Computed at upload time by `FileService.calculateChecksum`. Stable
54
49
  * — never recomputed after upload. Use for integrity verification,
55
50
  * content-based dedup, or downstream virus-scan correlation.
56
51
  */
57
- checksum: _$typebox.TOptional<_$typebox.TString>;
52
+ checksum: import("typebox").TOptional<import("typebox").TString>;
58
53
  }>>;
59
54
  type FileEntity = Static<typeof files.schema>;
60
55
  //#endregion
61
56
  //#region ../../src/api/files/schemas/fileQuerySchema.d.ts
62
- declare const fileQuerySchema: _$typebox.TObject<{
63
- page: _$typebox.TOptional<_$typebox.TInteger>;
64
- size: _$typebox.TOptional<_$typebox.TInteger>;
65
- sort: _$typebox.TOptional<_$typebox.TString>;
66
- bucket: _$typebox.TOptional<_$typebox.TString>;
67
- tags: _$typebox.TOptional<_$typebox.TArray<_$typebox.TString>>;
68
- name: _$typebox.TOptional<_$typebox.TString>;
69
- mimeType: _$typebox.TOptional<_$typebox.TString>;
70
- creator: _$typebox.TOptional<_$typebox.TString>;
71
- createdAfter: _$typebox.TOptional<_$typebox.TString>;
72
- createdBefore: _$typebox.TOptional<_$typebox.TString>;
57
+ declare const fileQuerySchema: import("typebox").TObject<{
58
+ page: import("typebox").TOptional<import("typebox").TInteger>;
59
+ size: import("typebox").TOptional<import("typebox").TInteger>;
60
+ sort: import("typebox").TOptional<import("typebox").TString>;
61
+ bucket: import("typebox").TOptional<import("typebox").TString>;
62
+ tags: import("typebox").TOptional<import("typebox").TArray<import("typebox").TString>>;
63
+ name: import("typebox").TOptional<import("typebox").TString>;
64
+ mimeType: import("typebox").TOptional<import("typebox").TString>;
65
+ creator: import("typebox").TOptional<import("typebox").TString>;
66
+ createdAfter: import("typebox").TOptional<import("typebox").TString>;
67
+ createdBefore: import("typebox").TOptional<import("typebox").TString>;
73
68
  }>;
74
69
  type FileQuery = Static<typeof fileQuerySchema>;
75
70
  //#endregion
@@ -364,8 +359,8 @@ type PgAttr<T extends TSchema, TAttr extends PgSymbolKeys> = T & { [K in TAttr]:
364
359
  * - `d1://BINDING_NAME` — Cloudflare D1
365
360
  * - `hyperdrive://BINDING_NAME` — Cloudflare Hyperdrive
366
361
  */
367
- declare const databaseEnvSchema: _$typebox.TObject<{
368
- DATABASE_URL: _$typebox.TOptional<_$typebox.TString>;
362
+ declare const databaseEnvSchema: import("typebox").TObject<{
363
+ DATABASE_URL: import("typebox").TOptional<import("typebox").TString>;
369
364
  /**
370
365
  * Enable or disable push-based schema synchronization (drizzle-kit push).
371
366
  *
@@ -373,55 +368,62 @@ declare const databaseEnvSchema: _$typebox.TObject<{
373
368
  * Set to `false` in development to skip automatic schema sync
374
369
  * (e.g. when managing migrations manually).
375
370
  */
376
- DATABASE_SYNC: _$typebox.TOptional<_$typebox.TBoolean>;
371
+ DATABASE_SYNC: import("typebox").TOptional<import("typebox").TBoolean>;
377
372
  }>;
378
373
  declare module "alepha" {
379
374
  interface Env extends Partial<Static<typeof databaseEnvSchema>> {}
380
375
  } //# sourceMappingURL=databaseEnvSchema.d.ts.map
381
376
  //#endregion
382
377
  //#region ../../src/api/files/schemas/fileResourceSchema.d.ts
383
- declare const fileResourceSchema: _$typebox.TObject<{
384
- id: PgAttr<PgAttr<_$typebox.TString, typeof PG_PRIMARY_KEY>, typeof PG_DEFAULT>;
385
- version: PgAttr<PgAttr<_$typebox.TInteger, typeof PG_VERSION>, typeof PG_DEFAULT>;
386
- createdAt: PgAttr<PgAttr<_$typebox.TString, typeof PG_CREATED_AT>, typeof PG_DEFAULT>;
387
- updatedAt: PgAttr<PgAttr<_$typebox.TString, typeof PG_UPDATED_AT>, typeof PG_DEFAULT>;
388
- organizationId: PgAttr<_$typebox.TString, typeof PG_ORGANIZATION>;
389
- blobId: _$typebox.TString;
390
- creator: _$typebox.TOptional<_$typebox.TString>;
391
- creatorRealm: _$typebox.TOptional<_$typebox.TString>;
392
- creatorName: _$typebox.TOptional<_$typebox.TString>;
393
- bucket: _$typebox.TString;
394
- expirationDate: _$typebox.TOptional<_$typebox.TString>;
395
- name: _$typebox.TString;
396
- originalName: _$typebox.TOptional<_$typebox.TString>;
397
- size: _$typebox.TNumber;
398
- mimeType: _$typebox.TString;
399
- tags: _$typebox.TOptional<_$typebox.TArray<_$typebox.TString>>;
400
- checksum: _$typebox.TOptional<_$typebox.TString>;
378
+ declare const fileResourceSchema: import("typebox").TObject<{
379
+ id: PgAttr<PgAttr<import("typebox").TString, typeof PG_PRIMARY_KEY>, typeof PG_DEFAULT>;
380
+ version: PgAttr<PgAttr<import("typebox").TInteger, typeof PG_VERSION>, typeof PG_DEFAULT>;
381
+ createdAt: PgAttr<PgAttr<import("typebox").TString, typeof PG_CREATED_AT>, typeof PG_DEFAULT>;
382
+ updatedAt: PgAttr<PgAttr<import("typebox").TString, typeof PG_UPDATED_AT>, typeof PG_DEFAULT>;
383
+ organizationId: PgAttr<import("typebox").TString, typeof PG_ORGANIZATION>;
384
+ blobId: import("typebox").TString;
385
+ creator: import("typebox").TOptional<import("typebox").TString>;
386
+ creatorRealm: import("typebox").TOptional<import("typebox").TString>;
387
+ creatorName: import("typebox").TOptional<import("typebox").TString>;
388
+ bucket: import("typebox").TString;
389
+ expirationDate: import("typebox").TOptional<import("typebox").TString>;
390
+ name: import("typebox").TString;
391
+ originalName: import("typebox").TOptional<import("typebox").TString>;
392
+ size: import("typebox").TNumber;
393
+ mimeType: import("typebox").TString;
394
+ tags: import("typebox").TOptional<import("typebox").TArray<import("typebox").TString>>;
395
+ checksum: import("typebox").TOptional<import("typebox").TString>;
396
+ user: import("typebox").TOptional<import("typebox").TObject<{
397
+ id: import("typebox").TString;
398
+ email: import("typebox").TOptional<import("typebox").TString>;
399
+ username: import("typebox").TOptional<import("typebox").TString>;
400
+ firstName: import("typebox").TOptional<import("typebox").TString>;
401
+ lastName: import("typebox").TOptional<import("typebox").TString>;
402
+ }>>;
401
403
  }>;
402
404
  type FileResource = Static<typeof fileResourceSchema>;
403
405
  //#endregion
404
406
  //#region ../../src/api/files/schemas/storageStatsSchema.d.ts
405
- declare const bucketStatsSchema: _$typebox.TObject<{
406
- bucket: _$typebox.TString;
407
- totalSize: _$typebox.TNumber;
408
- fileCount: _$typebox.TNumber;
407
+ declare const bucketStatsSchema: import("typebox").TObject<{
408
+ bucket: import("typebox").TString;
409
+ totalSize: import("typebox").TNumber;
410
+ fileCount: import("typebox").TNumber;
409
411
  }>;
410
- declare const mimeTypeStatsSchema: _$typebox.TObject<{
411
- mimeType: _$typebox.TString;
412
- fileCount: _$typebox.TNumber;
412
+ declare const mimeTypeStatsSchema: import("typebox").TObject<{
413
+ mimeType: import("typebox").TString;
414
+ fileCount: import("typebox").TNumber;
413
415
  }>;
414
- declare const storageStatsSchema: _$typebox.TObject<{
415
- totalSize: _$typebox.TNumber;
416
- totalFiles: _$typebox.TNumber;
417
- byBucket: _$typebox.TArray<_$typebox.TObject<{
418
- bucket: _$typebox.TString;
419
- totalSize: _$typebox.TNumber;
420
- fileCount: _$typebox.TNumber;
416
+ declare const storageStatsSchema: import("typebox").TObject<{
417
+ totalSize: import("typebox").TNumber;
418
+ totalFiles: import("typebox").TNumber;
419
+ byBucket: import("typebox").TArray<import("typebox").TObject<{
420
+ bucket: import("typebox").TString;
421
+ totalSize: import("typebox").TNumber;
422
+ fileCount: import("typebox").TNumber;
421
423
  }>>;
422
- byMimeType: _$typebox.TArray<_$typebox.TObject<{
423
- mimeType: _$typebox.TString;
424
- fileCount: _$typebox.TNumber;
424
+ byMimeType: import("typebox").TArray<import("typebox").TObject<{
425
+ mimeType: import("typebox").TString;
426
+ fileCount: import("typebox").TNumber;
425
427
  }>>;
426
428
  }>;
427
429
  type BucketStats = Static<typeof bucketStatsSchema>;
@@ -431,38 +433,74 @@ type StorageStats = Static<typeof storageStatsSchema>;
431
433
  //#region ../../src/api/files/services/FileService.d.ts
432
434
  declare class FileService {
433
435
  protected readonly alepha: Alepha;
434
- protected readonly log: _$alepha_logger0.Logger;
436
+ protected readonly log: import("alepha/logger").Logger;
435
437
  protected readonly dateTimeProvider: DateTimeProvider;
438
+ protected readonly repositoryProvider: RepositoryProvider;
439
+ protected readonly fileSystem: FileSystemProvider;
436
440
  protected readonly defaultBucket: BucketPrimitive;
437
- readonly fileRepository: _$alepha_orm0.Repository<_$typebox.TObject<{
438
- id: _$alepha_orm0.PgAttr<_$alepha_orm0.PgAttr<_$typebox.TString, typeof _$alepha_orm0.PG_PRIMARY_KEY>, typeof _$alepha_orm0.PG_DEFAULT>;
439
- version: _$alepha_orm0.PgAttr<_$alepha_orm0.PgAttr<_$typebox.TInteger, typeof _$alepha_orm0.PG_VERSION>, typeof _$alepha_orm0.PG_DEFAULT>;
440
- createdAt: _$alepha_orm0.PgAttr<_$alepha_orm0.PgAttr<_$typebox.TString, typeof _$alepha_orm0.PG_CREATED_AT>, typeof _$alepha_orm0.PG_DEFAULT>;
441
- updatedAt: _$alepha_orm0.PgAttr<_$alepha_orm0.PgAttr<_$typebox.TString, typeof _$alepha_orm0.PG_UPDATED_AT>, typeof _$alepha_orm0.PG_DEFAULT>;
442
- organizationId: _$alepha_orm0.PgAttr<_$typebox.TString, typeof _$alepha_orm0.PG_ORGANIZATION>;
443
- blobId: _$typebox.TString;
444
- creator: _$typebox.TOptional<_$typebox.TString>;
445
- creatorRealm: _$typebox.TOptional<_$typebox.TString>;
446
- creatorName: _$typebox.TOptional<_$typebox.TString>;
447
- bucket: _$typebox.TString;
448
- expirationDate: _$typebox.TOptional<_$typebox.TString>;
449
- name: _$typebox.TString;
450
- originalName: _$typebox.TOptional<_$typebox.TString>;
451
- size: _$typebox.TNumber;
452
- mimeType: _$typebox.TString;
453
- tags: _$typebox.TOptional<_$typebox.TArray<_$typebox.TString>>;
454
- checksum: _$typebox.TOptional<_$typebox.TString>;
441
+ readonly fileRepository: import("alepha/orm").Repository<import("typebox").TObject<{
442
+ id: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("typebox").TString, typeof import("alepha/orm").PG_PRIMARY_KEY>, typeof import("alepha/orm").PG_DEFAULT>;
443
+ version: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("typebox").TInteger, typeof import("alepha/orm").PG_VERSION>, typeof import("alepha/orm").PG_DEFAULT>;
444
+ createdAt: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("typebox").TString, typeof import("alepha/orm").PG_CREATED_AT>, typeof import("alepha/orm").PG_DEFAULT>;
445
+ updatedAt: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("typebox").TString, typeof import("alepha/orm").PG_UPDATED_AT>, typeof import("alepha/orm").PG_DEFAULT>;
446
+ organizationId: import("alepha/orm").PgAttr<import("typebox").TString, typeof import("alepha/orm").PG_ORGANIZATION>;
447
+ blobId: import("typebox").TString;
448
+ creator: import("typebox").TOptional<import("typebox").TString>;
449
+ creatorRealm: import("typebox").TOptional<import("typebox").TString>;
450
+ creatorName: import("typebox").TOptional<import("typebox").TString>;
451
+ bucket: import("typebox").TString;
452
+ expirationDate: import("typebox").TOptional<import("typebox").TString>;
453
+ name: import("typebox").TString;
454
+ originalName: import("typebox").TOptional<import("typebox").TString>;
455
+ size: import("typebox").TNumber;
456
+ mimeType: import("typebox").TString;
457
+ tags: import("typebox").TOptional<import("typebox").TArray<import("typebox").TString>>;
458
+ checksum: import("typebox").TOptional<import("typebox").TString>;
455
459
  }>>;
456
- protected onUploadFile: _$alepha.HookPrimitive<"bucket:file:uploaded">;
457
- protected onDeleteBucketFile: _$alepha.HookPrimitive<"bucket:file:deleted">;
460
+ /**
461
+ * Best-effort left join embedding the uploader on every file row, so the
462
+ * admin UI can render `user.email` instead of the bare `creator` UUID.
463
+ * Joins `files.creator` → `users.id`. Only applied when the `users` table is
464
+ * actually registered in the app (see `findFiles`) — the files module stays
465
+ * usable standalone, without `alepha/api/users`. Targets the default `users`
466
+ * table, so creators in non-default realms come back unmatched (`user`
467
+ * undefined), which the UI handles by falling back to `creatorName`.
468
+ *
469
+ * The `users` entity is resolved from the repository registry at runtime
470
+ * rather than imported: the users module already depends on the files module
471
+ * (avatars), so a compile-time import here would form a circular dependency.
472
+ */
473
+ protected resolveCreatorJoin(): {
474
+ user: {
475
+ join: import("alepha/orm").EntityPrimitive<import("typebox").TObject<import("typebox").TProperties>>;
476
+ on: ["creator", {
477
+ name: string;
478
+ }];
479
+ };
480
+ } | undefined;
481
+ protected onUploadFile: import("alepha").HookPrimitive<"bucket:file:uploaded">;
482
+ protected onDeleteBucketFile: import("alepha").HookPrimitive<"bucket:file:deleted">;
458
483
  /**
459
484
  * Calculates SHA-256 checksum of a file.
460
485
  *
486
+ * Reads the whole file into memory. Callers that already hold the bytes
487
+ * should use {@link hashBuffer} instead to avoid re-reading — re-reading a
488
+ * one-shot stream either yields the wrong hash or drains a stream another
489
+ * step still needs.
490
+ *
461
491
  * @param file - The file to calculate checksum for
462
492
  * @returns Hexadecimal string representation of the SHA-256 hash
463
493
  * @protected
464
494
  */
465
495
  protected calculateChecksum(file: FileLike): Promise<string>;
496
+ /**
497
+ * Calculates the SHA-256 checksum of an already-read body.
498
+ *
499
+ * @param data - The file bytes
500
+ * @returns Hexadecimal string representation of the SHA-256 hash
501
+ * @protected
502
+ */
503
+ protected hashBuffer(data: ArrayBuffer): string;
466
504
  /**
467
505
  * Gets a bucket primitive by name.
468
506
  *
@@ -514,14 +552,35 @@ declare class FileService {
514
552
  tags?: string[];
515
553
  }): Promise<FileEntity>;
516
554
  /**
517
- * Streams a file from storage by its database ID.
555
+ * Persists the metadata row for an already-uploaded blob, deleting the
556
+ * blob if the insert fails. Uploads are not atomic: the blob is written to
557
+ * storage first (the row needs the returned `blobId`), so a failed insert
558
+ * would otherwise leak the blob — an orphaned blob with no DB row. This
559
+ * compensates by removing the blob, favouring the recoverable failure
560
+ * (a missing blob) over the worse one (a row pointing at nothing).
518
561
  *
519
- * @param id - The database ID (UUID) of the file to stream
562
+ * Best-effort: cleanup runs with `skipHook` so it neither re-emits
563
+ * `bucket:file:deleted` nor touches the (non-existent) DB row, and a failed
564
+ * cleanup is logged rather than thrown. The original write error is always
565
+ * rethrown so callers still see the real failure.
566
+ *
567
+ * @param bucket - The bucket the blob was uploaded to
568
+ * @param blobId - The id returned by `bucket.upload`
569
+ * @param insert - Thunk performing the metadata insert
570
+ * @returns The created file entity
571
+ */
572
+ protected persistBlobMetadata(bucket: BucketPrimitive, blobId: string, insert: () => Promise<FileEntity>): Promise<FileEntity>;
573
+ /**
574
+ * Streams a file from storage by its database ID, or directly from an
575
+ * already-loaded `FileEntity` to avoid a duplicate DB roundtrip when the
576
+ * caller has already fetched the row (e.g. after an access check).
577
+ *
578
+ * @param id - The database ID (UUID) of the file, or the entity itself
520
579
  * @returns The file object ready for streaming/downloading
521
580
  * @throws {NotFoundError} If the file doesn't exist in the database
522
581
  * @throws {FileNotFoundError} If the file exists in database but not in storage
523
582
  */
524
- streamFile(id: string): Promise<FileLike>;
583
+ streamFile(id: string | FileEntity): Promise<FileLike>;
525
584
  /**
526
585
  * Updates file metadata (name, tags, expiration date).
527
586
  * Does not modify the actual file content in storage.
@@ -567,6 +626,12 @@ declare class FileService {
567
626
  /**
568
627
  * Gets storage statistics including total size, file count, and breakdowns by bucket and MIME type.
569
628
  *
629
+ * Aggregated in SQL (`SUM`/`COUNT` + `GROUP BY`) rather than by loading
630
+ * every row into memory — the table can hold millions of files, and this
631
+ * endpoint must stay O(groups), not O(rows). Totals are derived from the
632
+ * per-bucket groups (every row has exactly one bucket), so no extra query
633
+ * is needed.
634
+ *
570
635
  * @returns Storage statistics with aggregated data
571
636
  */
572
637
  getStorageStats(): Promise<StorageStats>;
@@ -594,18 +659,18 @@ declare class AdminFileStatsController {
594
659
  * Returns aggregated data including total size, file count,
595
660
  * and breakdowns by bucket and MIME type.
596
661
  */
597
- readonly getFileStats: _$alepha_server0.ActionPrimitiveFn<{
598
- response: _$typebox.TObject<{
599
- totalSize: _$typebox.TNumber;
600
- totalFiles: _$typebox.TNumber;
601
- byBucket: _$typebox.TArray<_$typebox.TObject<{
602
- bucket: _$typebox.TString;
603
- totalSize: _$typebox.TNumber;
604
- fileCount: _$typebox.TNumber;
662
+ readonly getFileStats: import("alepha/server").ActionPrimitiveFn<{
663
+ response: import("typebox").TObject<{
664
+ totalSize: import("typebox").TNumber;
665
+ totalFiles: import("typebox").TNumber;
666
+ byBucket: import("typebox").TArray<import("typebox").TObject<{
667
+ bucket: import("typebox").TString;
668
+ totalSize: import("typebox").TNumber;
669
+ fileCount: import("typebox").TNumber;
605
670
  }>>;
606
- byMimeType: _$typebox.TArray<_$typebox.TObject<{
607
- mimeType: _$typebox.TString;
608
- fileCount: _$typebox.TNumber;
671
+ byMimeType: import("typebox").TArray<import("typebox").TObject<{
672
+ mimeType: import("typebox").TString;
673
+ fileCount: import("typebox").TNumber;
609
674
  }>>;
610
675
  }>;
611
676
  }>;
@@ -642,6 +707,25 @@ declare class FileAccessProvider {
642
707
  * implementation is strict: only the uploader passes.
643
708
  */
644
709
  assertReadable(file: FileEntity, user: UserAccountToken | undefined): Promise<void>;
710
+ /**
711
+ * Throws when `file` may not be served through the anonymous
712
+ * `/public/files/:id` route. The default is deny-all: nothing is public
713
+ * unless this method is overridden. Throws `NotFoundError` (not 403) so the
714
+ * endpoint doesn't leak the existence of private file ids.
715
+ *
716
+ * Typical override matches on bucket name:
717
+ *
718
+ * ```ts
719
+ * class MyAccess extends FileAccessProvider {
720
+ * async assertPublic(file) {
721
+ * if (file.bucket === "avatars") return;
722
+ * if (file.bucket === "campaign-icons") return;
723
+ * return super.assertPublic(file);
724
+ * }
725
+ * }
726
+ * ```
727
+ */
728
+ assertPublic(file: FileEntity): Promise<void>;
645
729
  }
646
730
  //#endregion
647
731
  //#region ../../src/api/files/controllers/FileController.d.ts
@@ -658,63 +742,70 @@ declare class FileController {
658
742
  * GET /files - Lists files with optional filtering and pagination.
659
743
  * Supports filtering by bucket and tags.
660
744
  */
661
- readonly findFiles: _$alepha_server0.ActionPrimitiveFn<{
662
- query: _$typebox.TObject<{
663
- page: _$typebox.TOptional<_$typebox.TInteger>;
664
- size: _$typebox.TOptional<_$typebox.TInteger>;
665
- sort: _$typebox.TOptional<_$typebox.TString>;
666
- bucket: _$typebox.TOptional<_$typebox.TString>;
667
- tags: _$typebox.TOptional<_$typebox.TArray<_$typebox.TString>>;
668
- name: _$typebox.TOptional<_$typebox.TString>;
669
- mimeType: _$typebox.TOptional<_$typebox.TString>;
670
- creator: _$typebox.TOptional<_$typebox.TString>;
671
- createdAfter: _$typebox.TOptional<_$typebox.TString>;
672
- createdBefore: _$typebox.TOptional<_$typebox.TString>;
745
+ readonly findFiles: import("alepha/server").ActionPrimitiveFn<{
746
+ query: import("typebox").TObject<{
747
+ page: import("typebox").TOptional<import("typebox").TInteger>;
748
+ size: import("typebox").TOptional<import("typebox").TInteger>;
749
+ sort: import("typebox").TOptional<import("typebox").TString>;
750
+ bucket: import("typebox").TOptional<import("typebox").TString>;
751
+ tags: import("typebox").TOptional<import("typebox").TArray<import("typebox").TString>>;
752
+ name: import("typebox").TOptional<import("typebox").TString>;
753
+ mimeType: import("typebox").TOptional<import("typebox").TString>;
754
+ creator: import("typebox").TOptional<import("typebox").TString>;
755
+ createdAfter: import("typebox").TOptional<import("typebox").TString>;
756
+ createdBefore: import("typebox").TOptional<import("typebox").TString>;
673
757
  }>;
674
- response: _$alepha.TPage<_$typebox.TObject<{
675
- id: PgAttr<PgAttr<_$typebox.TString, typeof PG_PRIMARY_KEY>, typeof PG_DEFAULT>;
676
- version: PgAttr<PgAttr<_$typebox.TInteger, typeof PG_VERSION>, typeof PG_DEFAULT>;
677
- createdAt: PgAttr<PgAttr<_$typebox.TString, typeof PG_CREATED_AT>, typeof PG_DEFAULT>;
678
- updatedAt: PgAttr<PgAttr<_$typebox.TString, typeof PG_UPDATED_AT>, typeof PG_DEFAULT>;
679
- organizationId: PgAttr<_$typebox.TString, typeof PG_ORGANIZATION>;
680
- blobId: _$typebox.TString;
681
- creator: _$typebox.TOptional<_$typebox.TString>;
682
- creatorRealm: _$typebox.TOptional<_$typebox.TString>;
683
- creatorName: _$typebox.TOptional<_$typebox.TString>;
684
- bucket: _$typebox.TString;
685
- expirationDate: _$typebox.TOptional<_$typebox.TString>;
686
- name: _$typebox.TString;
687
- originalName: _$typebox.TOptional<_$typebox.TString>;
688
- size: _$typebox.TNumber;
689
- mimeType: _$typebox.TString;
690
- tags: _$typebox.TOptional<_$typebox.TArray<_$typebox.TString>>;
691
- checksum: _$typebox.TOptional<_$typebox.TString>;
758
+ response: import("alepha").TPage<import("typebox").TObject<{
759
+ id: PgAttr<PgAttr<import("typebox").TString, typeof PG_PRIMARY_KEY>, typeof PG_DEFAULT>;
760
+ version: PgAttr<PgAttr<import("typebox").TInteger, typeof PG_VERSION>, typeof PG_DEFAULT>;
761
+ createdAt: PgAttr<PgAttr<import("typebox").TString, typeof PG_CREATED_AT>, typeof PG_DEFAULT>;
762
+ updatedAt: PgAttr<PgAttr<import("typebox").TString, typeof PG_UPDATED_AT>, typeof PG_DEFAULT>;
763
+ organizationId: PgAttr<import("typebox").TString, typeof PG_ORGANIZATION>;
764
+ blobId: import("typebox").TString;
765
+ creator: import("typebox").TOptional<import("typebox").TString>;
766
+ creatorRealm: import("typebox").TOptional<import("typebox").TString>;
767
+ creatorName: import("typebox").TOptional<import("typebox").TString>;
768
+ bucket: import("typebox").TString;
769
+ expirationDate: import("typebox").TOptional<import("typebox").TString>;
770
+ name: import("typebox").TString;
771
+ originalName: import("typebox").TOptional<import("typebox").TString>;
772
+ size: import("typebox").TNumber;
773
+ mimeType: import("typebox").TString;
774
+ tags: import("typebox").TOptional<import("typebox").TArray<import("typebox").TString>>;
775
+ checksum: import("typebox").TOptional<import("typebox").TString>;
776
+ user: import("typebox").TOptional<import("typebox").TObject<{
777
+ id: import("typebox").TString;
778
+ email: import("typebox").TOptional<import("typebox").TString>;
779
+ username: import("typebox").TOptional<import("typebox").TString>;
780
+ firstName: import("typebox").TOptional<import("typebox").TString>;
781
+ lastName: import("typebox").TOptional<import("typebox").TString>;
782
+ }>>;
692
783
  }>>;
693
784
  }>;
694
785
  /**
695
786
  * DELETE /files/:id - Deletes a file from both storage and database.
696
787
  * Removes the file from the bucket and cleans up the database record.
697
788
  */
698
- readonly deleteFile: _$alepha_server0.ActionPrimitiveFn<{
699
- params: _$typebox.TObject<{
700
- id: _$typebox.TString;
789
+ readonly deleteFile: import("alepha/server").ActionPrimitiveFn<{
790
+ params: import("typebox").TObject<{
791
+ id: import("typebox").TString;
701
792
  }>;
702
- response: _$typebox.TObject<{
703
- ok: _$typebox.TBoolean;
704
- id: _$typebox.TOptional<_$typebox.TUnion<[_$typebox.TString, _$typebox.TInteger]>>;
705
- count: _$typebox.TOptional<_$typebox.TNumber>;
793
+ response: import("typebox").TObject<{
794
+ ok: import("typebox").TBoolean;
795
+ id: import("typebox").TOptional<import("typebox").TUnion<[import("typebox").TString, import("typebox").TInteger]>>;
796
+ count: import("typebox").TOptional<import("typebox").TNumber>;
706
797
  }>;
707
798
  }>;
708
799
  /**
709
800
  * POST /files/delete - Delete many files in one request, batching the
710
801
  * underlying bucket calls per bucket (R2/S3 batch where supported).
711
802
  */
712
- readonly deleteFiles: _$alepha_server0.ActionPrimitiveFn<{
713
- body: _$typebox.TObject<{
714
- ids: _$typebox.TArray<_$typebox.TString>;
803
+ readonly deleteFiles: import("alepha/server").ActionPrimitiveFn<{
804
+ body: import("typebox").TObject<{
805
+ ids: import("typebox").TArray<import("typebox").TString>;
715
806
  }>;
716
- response: _$typebox.TObject<{
717
- deleted: _$typebox.TArray<_$typebox.TString>;
807
+ response: import("typebox").TObject<{
808
+ deleted: import("typebox").TArray<import("typebox").TString>;
718
809
  }>;
719
810
  }>;
720
811
  /**
@@ -722,65 +813,79 @@ declare class FileController {
722
813
  * Creates a database record with metadata and calculates checksum.
723
814
  * Optionally specify bucket and expiration date.
724
815
  */
725
- readonly uploadFile: _$alepha_server0.ActionPrimitiveFn<{
726
- body: _$typebox.TObject<{
727
- file: _$alepha.TFile;
816
+ readonly uploadFile: import("alepha/server").ActionPrimitiveFn<{
817
+ body: import("typebox").TObject<{
818
+ file: import("alepha").TFile;
728
819
  }>;
729
- query: _$typebox.TObject<{
730
- expirationDate: _$typebox.TOptional<_$typebox.TString>;
731
- bucket: _$typebox.TOptional<_$typebox.TString>;
820
+ query: import("typebox").TObject<{
821
+ expirationDate: import("typebox").TOptional<import("typebox").TString>;
822
+ bucket: import("typebox").TOptional<import("typebox").TString>;
732
823
  }>;
733
- response: _$typebox.TObject<{
734
- id: PgAttr<PgAttr<_$typebox.TString, typeof PG_PRIMARY_KEY>, typeof PG_DEFAULT>;
735
- version: PgAttr<PgAttr<_$typebox.TInteger, typeof PG_VERSION>, typeof PG_DEFAULT>;
736
- createdAt: PgAttr<PgAttr<_$typebox.TString, typeof PG_CREATED_AT>, typeof PG_DEFAULT>;
737
- updatedAt: PgAttr<PgAttr<_$typebox.TString, typeof PG_UPDATED_AT>, typeof PG_DEFAULT>;
738
- organizationId: PgAttr<_$typebox.TString, typeof PG_ORGANIZATION>;
739
- blobId: _$typebox.TString;
740
- creator: _$typebox.TOptional<_$typebox.TString>;
741
- creatorRealm: _$typebox.TOptional<_$typebox.TString>;
742
- creatorName: _$typebox.TOptional<_$typebox.TString>;
743
- bucket: _$typebox.TString;
744
- expirationDate: _$typebox.TOptional<_$typebox.TString>;
745
- name: _$typebox.TString;
746
- originalName: _$typebox.TOptional<_$typebox.TString>;
747
- size: _$typebox.TNumber;
748
- mimeType: _$typebox.TString;
749
- tags: _$typebox.TOptional<_$typebox.TArray<_$typebox.TString>>;
750
- checksum: _$typebox.TOptional<_$typebox.TString>;
824
+ response: import("typebox").TObject<{
825
+ id: PgAttr<PgAttr<import("typebox").TString, typeof PG_PRIMARY_KEY>, typeof PG_DEFAULT>;
826
+ version: PgAttr<PgAttr<import("typebox").TInteger, typeof PG_VERSION>, typeof PG_DEFAULT>;
827
+ createdAt: PgAttr<PgAttr<import("typebox").TString, typeof PG_CREATED_AT>, typeof PG_DEFAULT>;
828
+ updatedAt: PgAttr<PgAttr<import("typebox").TString, typeof PG_UPDATED_AT>, typeof PG_DEFAULT>;
829
+ organizationId: PgAttr<import("typebox").TString, typeof PG_ORGANIZATION>;
830
+ blobId: import("typebox").TString;
831
+ creator: import("typebox").TOptional<import("typebox").TString>;
832
+ creatorRealm: import("typebox").TOptional<import("typebox").TString>;
833
+ creatorName: import("typebox").TOptional<import("typebox").TString>;
834
+ bucket: import("typebox").TString;
835
+ expirationDate: import("typebox").TOptional<import("typebox").TString>;
836
+ name: import("typebox").TString;
837
+ originalName: import("typebox").TOptional<import("typebox").TString>;
838
+ size: import("typebox").TNumber;
839
+ mimeType: import("typebox").TString;
840
+ tags: import("typebox").TOptional<import("typebox").TArray<import("typebox").TString>>;
841
+ checksum: import("typebox").TOptional<import("typebox").TString>;
842
+ user: import("typebox").TOptional<import("typebox").TObject<{
843
+ id: import("typebox").TString;
844
+ email: import("typebox").TOptional<import("typebox").TString>;
845
+ username: import("typebox").TOptional<import("typebox").TString>;
846
+ firstName: import("typebox").TOptional<import("typebox").TString>;
847
+ lastName: import("typebox").TOptional<import("typebox").TString>;
848
+ }>>;
751
849
  }>;
752
850
  }>;
753
851
  /**
754
852
  * PATCH /files/:id - Updates file metadata.
755
853
  * Allows updating name, tags, and expiration date without modifying file content.
756
854
  */
757
- readonly updateFile: _$alepha_server0.ActionPrimitiveFn<{
758
- params: _$typebox.TObject<{
759
- id: _$typebox.TString;
855
+ readonly updateFile: import("alepha/server").ActionPrimitiveFn<{
856
+ params: import("typebox").TObject<{
857
+ id: import("typebox").TString;
760
858
  }>;
761
- body: _$typebox.TObject<{
762
- name: _$typebox.TOptional<_$typebox.TString>;
763
- tags: _$typebox.TOptional<_$typebox.TArray<_$typebox.TString>>;
764
- expirationDate: _$typebox.TOptional<_$typebox.TString>;
859
+ body: import("typebox").TObject<{
860
+ name: import("typebox").TOptional<import("typebox").TString>;
861
+ tags: import("typebox").TOptional<import("typebox").TArray<import("typebox").TString>>;
862
+ expirationDate: import("typebox").TOptional<import("typebox").TString>;
765
863
  }>;
766
- response: _$typebox.TObject<{
767
- id: PgAttr<PgAttr<_$typebox.TString, typeof PG_PRIMARY_KEY>, typeof PG_DEFAULT>;
768
- version: PgAttr<PgAttr<_$typebox.TInteger, typeof PG_VERSION>, typeof PG_DEFAULT>;
769
- createdAt: PgAttr<PgAttr<_$typebox.TString, typeof PG_CREATED_AT>, typeof PG_DEFAULT>;
770
- updatedAt: PgAttr<PgAttr<_$typebox.TString, typeof PG_UPDATED_AT>, typeof PG_DEFAULT>;
771
- organizationId: PgAttr<_$typebox.TString, typeof PG_ORGANIZATION>;
772
- blobId: _$typebox.TString;
773
- creator: _$typebox.TOptional<_$typebox.TString>;
774
- creatorRealm: _$typebox.TOptional<_$typebox.TString>;
775
- creatorName: _$typebox.TOptional<_$typebox.TString>;
776
- bucket: _$typebox.TString;
777
- expirationDate: _$typebox.TOptional<_$typebox.TString>;
778
- name: _$typebox.TString;
779
- originalName: _$typebox.TOptional<_$typebox.TString>;
780
- size: _$typebox.TNumber;
781
- mimeType: _$typebox.TString;
782
- tags: _$typebox.TOptional<_$typebox.TArray<_$typebox.TString>>;
783
- checksum: _$typebox.TOptional<_$typebox.TString>;
864
+ response: import("typebox").TObject<{
865
+ id: PgAttr<PgAttr<import("typebox").TString, typeof PG_PRIMARY_KEY>, typeof PG_DEFAULT>;
866
+ version: PgAttr<PgAttr<import("typebox").TInteger, typeof PG_VERSION>, typeof PG_DEFAULT>;
867
+ createdAt: PgAttr<PgAttr<import("typebox").TString, typeof PG_CREATED_AT>, typeof PG_DEFAULT>;
868
+ updatedAt: PgAttr<PgAttr<import("typebox").TString, typeof PG_UPDATED_AT>, typeof PG_DEFAULT>;
869
+ organizationId: PgAttr<import("typebox").TString, typeof PG_ORGANIZATION>;
870
+ blobId: import("typebox").TString;
871
+ creator: import("typebox").TOptional<import("typebox").TString>;
872
+ creatorRealm: import("typebox").TOptional<import("typebox").TString>;
873
+ creatorName: import("typebox").TOptional<import("typebox").TString>;
874
+ bucket: import("typebox").TString;
875
+ expirationDate: import("typebox").TOptional<import("typebox").TString>;
876
+ name: import("typebox").TString;
877
+ originalName: import("typebox").TOptional<import("typebox").TString>;
878
+ size: import("typebox").TNumber;
879
+ mimeType: import("typebox").TString;
880
+ tags: import("typebox").TOptional<import("typebox").TArray<import("typebox").TString>>;
881
+ checksum: import("typebox").TOptional<import("typebox").TString>;
882
+ user: import("typebox").TOptional<import("typebox").TObject<{
883
+ id: import("typebox").TString;
884
+ email: import("typebox").TOptional<import("typebox").TString>;
885
+ username: import("typebox").TOptional<import("typebox").TString>;
886
+ firstName: import("typebox").TOptional<import("typebox").TString>;
887
+ lastName: import("typebox").TOptional<import("typebox").TString>;
888
+ }>>;
784
889
  }>;
785
890
  }>;
786
891
  /**
@@ -794,20 +899,61 @@ declare class FileController {
794
899
  * Cache-Control is `private` because the per-user authorization decision
795
900
  * cannot be cached by shared proxies/CDNs. Client-side ETag still works.
796
901
  */
797
- readonly streamFile: _$alepha_server0.ActionPrimitiveFn<{
798
- params: _$typebox.TObject<{
799
- id: _$typebox.TString;
902
+ readonly streamFile: import("alepha/server").ActionPrimitiveFn<{
903
+ params: import("typebox").TObject<{
904
+ id: import("typebox").TString;
800
905
  }>;
801
- response: _$alepha.TFile;
906
+ response: import("alepha").TFile;
907
+ }>;
908
+ /**
909
+ * GET /public/files/:id - Anonymous, edge-cacheable download.
910
+ *
911
+ * Authorization is delegated to `FileAccessProvider.assertPublic`. The
912
+ * default policy is deny-all (throws `NotFoundError`), so consuming apps
913
+ * must override the provider to opt files in — typically by bucket name
914
+ * (avatars, campaign icons, etc.).
915
+ *
916
+ * Cache-Control is `public, immutable, max-age=1y` so Cloudflare's edge
917
+ * cache and any intermediary proxy can serve subsequent hits without
918
+ * touching the Worker. The split URL prefix (vs `/files/:id`) is what
919
+ * makes this safe: edge cache is URL-keyed, so public and private files
920
+ * live in separate cache lanes.
921
+ */
922
+ readonly streamPublicFile: import("alepha/server").ActionPrimitiveFn<{
923
+ params: import("typebox").TObject<{
924
+ id: import("typebox").TString;
925
+ }>;
926
+ response: import("alepha").TFile;
802
927
  }>;
803
928
  }
804
929
  //#endregion
805
930
  //#region ../../src/api/files/jobs/FileJobs.d.ts
806
931
  declare class FileJobs {
807
932
  protected readonly fileService: FileService;
808
- readonly purgeFiles: _$alepha_scheduler0.SchedulerPrimitive;
933
+ readonly purgeFiles: import("alepha/scheduler").SchedulerPrimitive;
809
934
  }
810
935
  //#endregion
936
+ //#region ../../src/api/files/schemas/fileCreatorSummarySchema.d.ts
937
+ /**
938
+ * Slim view of a file's uploader, embedded by the admin listing via a
939
+ * best-effort left join (`files.creator` → `users.id`) so the UI can render
940
+ * a human-readable identifier instead of a bare UUID.
941
+ *
942
+ * Optional end-to-end: the join only runs when the `users` entity is
943
+ * registered in the running app (see `FileService.findFiles`), and even then
944
+ * a file whose creator was deleted — or who lives in a non-default realm —
945
+ * comes back with `user` undefined. Callers must fall back to `creatorName`
946
+ * or the raw `creator` id.
947
+ */
948
+ declare const fileCreatorSummarySchema: import("typebox").TObject<{
949
+ id: import("typebox").TString;
950
+ email: import("typebox").TOptional<import("typebox").TString>;
951
+ username: import("typebox").TOptional<import("typebox").TString>;
952
+ firstName: import("typebox").TOptional<import("typebox").TString>;
953
+ lastName: import("typebox").TOptional<import("typebox").TString>;
954
+ }>;
955
+ type FileCreatorSummary = Static<typeof fileCreatorSummarySchema>;
956
+ //#endregion
811
957
  //#region ../../src/api/files/index.d.ts
812
958
  declare module "alepha/bucket" {
813
959
  interface BucketFileOptions {
@@ -842,7 +988,7 @@ declare module "alepha/bucket" {
842
988
  *
843
989
  * @module alepha.api.files
844
990
  */
845
- declare const AlephaApiFiles: _$alepha.Service<_$alepha.Module>;
991
+ declare const AlephaApiFiles: import("alepha").Service<import("alepha").Module>;
846
992
  //#endregion
847
- export { AdminFileStatsController, AlephaApiFiles, BucketStats, FileAccessProvider, FileController, FileEntity, FileJobs, FileService, MimeTypeStats, StorageStats, bucketStatsSchema, files, mimeTypeStatsSchema, storageStatsSchema };
993
+ export { AdminFileStatsController, AlephaApiFiles, BucketStats, FileAccessProvider, FileController, FileCreatorSummary, FileEntity, FileJobs, FileQuery, FileResource, FileService, MimeTypeStats, StorageStats, bucketStatsSchema, fileCreatorSummarySchema, fileQuerySchema, fileResourceSchema, files, mimeTypeStatsSchema, storageStatsSchema };
848
994
  //# sourceMappingURL=index.d.ts.map