alepha 0.21.2 → 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 (463) 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 +313 -208
  10. package/dist/api/files/index.d.ts.map +1 -1
  11. package/dist/api/files/index.js +152 -42
  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 +1073 -1006
  49. package/dist/api/users/index.d.ts.map +1 -1
  50. package/dist/api/users/index.js +283 -61
  51. package/dist/api/users/index.js.map +1 -1
  52. package/dist/api/verifications/index.browser.js.map +1 -1
  53. package/dist/api/verifications/index.d.ts +134 -140
  54. package/dist/api/verifications/index.d.ts.map +1 -1
  55. package/dist/api/verifications/index.js.map +1 -1
  56. package/dist/background/index.d.ts +95 -0
  57. package/dist/background/index.d.ts.map +1 -0
  58. package/dist/background/index.js +121 -0
  59. package/dist/background/index.js.map +1 -0
  60. package/dist/background/index.workerd.js +110 -0
  61. package/dist/background/index.workerd.js.map +1 -0
  62. package/dist/batch/index.d.ts +5 -7
  63. package/dist/batch/index.d.ts.map +1 -1
  64. package/dist/batch/index.js.map +1 -1
  65. package/dist/bin/index.js.map +1 -1
  66. package/dist/bucket/index.d.ts +76 -54
  67. package/dist/bucket/index.d.ts.map +1 -1
  68. package/dist/bucket/index.js +58 -11
  69. package/dist/bucket/index.js.map +1 -1
  70. package/dist/bucket/index.workerd.js +200 -5
  71. package/dist/bucket/index.workerd.js.map +1 -1
  72. package/dist/cache/core/index.d.ts +7 -10
  73. package/dist/cache/core/index.d.ts.map +1 -1
  74. package/dist/cache/core/index.js.map +1 -1
  75. package/dist/cache/core/index.workerd.js.map +1 -1
  76. package/dist/cache/database/index.d.ts +22 -26
  77. package/dist/cache/database/index.d.ts.map +1 -1
  78. package/dist/cache/database/index.js.map +1 -1
  79. package/dist/cache/redis/index.d.ts +4 -7
  80. package/dist/cache/redis/index.d.ts.map +1 -1
  81. package/dist/cache/redis/index.js.map +1 -1
  82. package/dist/captcha/index.d.ts +3 -6
  83. package/dist/captcha/index.d.ts.map +1 -1
  84. package/dist/captcha/index.js.map +1 -1
  85. package/dist/cli/config/index.d.ts.map +1 -1
  86. package/dist/cli/config/index.js.map +1 -1
  87. package/dist/cli/core/index.d.ts +417 -214
  88. package/dist/cli/core/index.d.ts.map +1 -1
  89. package/dist/cli/core/index.js +325 -563
  90. package/dist/cli/core/index.js.map +1 -1
  91. package/dist/cli/devtools/index.d.ts +3 -5
  92. package/dist/cli/devtools/index.d.ts.map +1 -1
  93. package/dist/cli/devtools/index.js.map +1 -1
  94. package/dist/cli/i18n/index.d.ts +8 -12
  95. package/dist/cli/i18n/index.d.ts.map +1 -1
  96. package/dist/cli/i18n/index.js.map +1 -1
  97. package/dist/cli/platform/index.d.ts +126 -1342
  98. package/dist/cli/platform/index.d.ts.map +1 -1
  99. package/dist/cli/platform/index.js +136 -2374
  100. package/dist/cli/platform/index.js.map +1 -1
  101. package/dist/cli/platform-lib/index.d.ts +1446 -0
  102. package/dist/cli/platform-lib/index.d.ts.map +1 -0
  103. package/dist/cli/platform-lib/index.js +2597 -0
  104. package/dist/cli/platform-lib/index.js.map +1 -0
  105. package/dist/cli/vendor/index.d.ts +17 -21
  106. package/dist/cli/vendor/index.d.ts.map +1 -1
  107. package/dist/cli/vendor/index.js.map +1 -1
  108. package/dist/command/index.d.ts +21 -20
  109. package/dist/command/index.d.ts.map +1 -1
  110. package/dist/command/index.js +39 -10
  111. package/dist/command/index.js.map +1 -1
  112. package/dist/{containers → container}/core/index.d.ts +13 -15
  113. package/dist/container/core/index.d.ts.map +1 -0
  114. package/dist/{containers → container}/core/index.js +23 -14
  115. package/dist/container/core/index.js.map +1 -0
  116. package/dist/{containers → container}/core/index.workerd.js +37 -22
  117. package/dist/container/core/index.workerd.js.map +1 -0
  118. package/dist/core/index.browser.js +27 -1
  119. package/dist/core/index.browser.js.map +1 -1
  120. package/dist/core/index.d.ts +48 -24
  121. package/dist/core/index.d.ts.map +1 -1
  122. package/dist/core/index.js +27 -1
  123. package/dist/core/index.js.map +1 -1
  124. package/dist/core/index.native.js +27 -1
  125. package/dist/core/index.native.js.map +1 -1
  126. package/dist/core/index.workerd.js +27 -1
  127. package/dist/core/index.workerd.js.map +1 -1
  128. package/dist/crypto/index.browser.js.map +1 -1
  129. package/dist/crypto/index.d.ts +5 -8
  130. package/dist/crypto/index.d.ts.map +1 -1
  131. package/dist/crypto/index.js.map +1 -1
  132. package/dist/datetime/index.d.ts +3 -4
  133. package/dist/datetime/index.d.ts.map +1 -1
  134. package/dist/datetime/index.js.map +1 -1
  135. package/dist/email/brevo/index.d.ts +2 -4
  136. package/dist/email/brevo/index.d.ts.map +1 -1
  137. package/dist/email/brevo/index.js.map +1 -1
  138. package/dist/email/cloudflare/index.d.ts +20 -7
  139. package/dist/email/cloudflare/index.d.ts.map +1 -1
  140. package/dist/email/cloudflare/index.js +46 -9
  141. package/dist/email/cloudflare/index.js.map +1 -1
  142. package/dist/email/core/index.d.ts +6 -9
  143. package/dist/email/core/index.d.ts.map +1 -1
  144. package/dist/email/core/index.js.map +1 -1
  145. package/dist/email/core/index.workerd.js.map +1 -1
  146. package/dist/email/smtp/index.d.ts +10 -13
  147. package/dist/email/smtp/index.d.ts.map +1 -1
  148. package/dist/email/smtp/index.js +107 -32
  149. package/dist/email/smtp/index.js.map +1 -1
  150. package/dist/fake/index.d.ts +1 -2
  151. package/dist/fake/index.d.ts.map +1 -1
  152. package/dist/fake/index.js.map +1 -1
  153. package/dist/lock/core/index.d.ts +9 -14
  154. package/dist/lock/core/index.d.ts.map +1 -1
  155. package/dist/lock/core/index.js.map +1 -1
  156. package/dist/lock/redis/index.d.ts +2 -4
  157. package/dist/lock/redis/index.d.ts.map +1 -1
  158. package/dist/lock/redis/index.js.map +1 -1
  159. package/dist/logger/index.d.ts +105 -76
  160. package/dist/logger/index.d.ts.map +1 -1
  161. package/dist/logger/index.js +196 -174
  162. package/dist/logger/index.js.map +1 -1
  163. package/dist/mcp/index.d.ts +16 -20
  164. package/dist/mcp/index.d.ts.map +1 -1
  165. package/dist/mcp/index.js.map +1 -1
  166. package/dist/orm/core/index.browser.js.map +1 -1
  167. package/dist/orm/core/index.bun.js +19 -1
  168. package/dist/orm/core/index.bun.js.map +1 -1
  169. package/dist/orm/core/index.d.ts +76 -62
  170. package/dist/orm/core/index.d.ts.map +1 -1
  171. package/dist/orm/core/index.js +20 -2
  172. package/dist/orm/core/index.js.map +1 -1
  173. package/dist/orm/postgres/index.bun.js.map +1 -1
  174. package/dist/orm/postgres/index.d.ts +28 -20
  175. package/dist/orm/postgres/index.d.ts.map +1 -1
  176. package/dist/orm/postgres/index.js.map +1 -1
  177. package/dist/queue/core/index.d.ts +12 -15
  178. package/dist/queue/core/index.d.ts.map +1 -1
  179. package/dist/queue/core/index.js.map +1 -1
  180. package/dist/queue/core/index.workerd.js.map +1 -1
  181. package/dist/queue/redis/index.d.ts +3 -5
  182. package/dist/queue/redis/index.d.ts.map +1 -1
  183. package/dist/queue/redis/index.js.map +1 -1
  184. package/dist/react/auth/index.browser.js +9 -2
  185. package/dist/react/auth/index.browser.js.map +1 -1
  186. package/dist/react/auth/index.d.ts +14 -9
  187. package/dist/react/auth/index.d.ts.map +1 -1
  188. package/dist/react/auth/index.js +9 -2
  189. package/dist/react/auth/index.js.map +1 -1
  190. package/dist/react/core/index.d.ts +7 -8
  191. package/dist/react/core/index.d.ts.map +1 -1
  192. package/dist/react/core/index.js +6 -3
  193. package/dist/react/core/index.js.map +1 -1
  194. package/dist/react/form/index.d.ts +2 -4
  195. package/dist/react/form/index.d.ts.map +1 -1
  196. package/dist/react/form/index.js.map +1 -1
  197. package/dist/react/head/index.browser.js.map +1 -1
  198. package/dist/react/head/index.d.ts +2 -4
  199. package/dist/react/head/index.d.ts.map +1 -1
  200. package/dist/react/head/index.js.map +1 -1
  201. package/dist/react/i18n/index.d.ts +47 -11
  202. package/dist/react/i18n/index.d.ts.map +1 -1
  203. package/dist/react/i18n/index.js +33 -1
  204. package/dist/react/i18n/index.js.map +1 -1
  205. package/dist/react/intro/index.d.ts +1 -2
  206. package/dist/react/intro/index.d.ts.map +1 -1
  207. package/dist/react/intro/index.js +2 -2
  208. package/dist/react/intro/index.js.map +1 -1
  209. package/dist/react/router/index.browser.js +65 -19
  210. package/dist/react/router/index.browser.js.map +1 -1
  211. package/dist/react/router/index.d.ts +327 -222
  212. package/dist/react/router/index.d.ts.map +1 -1
  213. package/dist/react/router/index.js +65 -29
  214. package/dist/react/router/index.js.map +1 -1
  215. package/dist/react/testing/index.d.ts +1 -2
  216. package/dist/react/testing/index.d.ts.map +1 -1
  217. package/dist/react/testing/index.js +16 -17
  218. package/dist/react/testing/index.js.map +1 -1
  219. package/dist/react/ui/index.d.ts +20 -25
  220. package/dist/react/ui/index.d.ts.map +1 -1
  221. package/dist/react/ui/index.js.map +1 -1
  222. package/dist/redis/index.bun.js.map +1 -1
  223. package/dist/redis/index.d.ts +17 -19
  224. package/dist/redis/index.d.ts.map +1 -1
  225. package/dist/redis/index.js.map +1 -1
  226. package/dist/retry/index.d.ts +2 -4
  227. package/dist/retry/index.d.ts.map +1 -1
  228. package/dist/retry/index.js.map +1 -1
  229. package/dist/router/index.d.ts.map +1 -1
  230. package/dist/router/index.js.map +1 -1
  231. package/dist/scheduler/index.d.ts +10 -13
  232. package/dist/scheduler/index.d.ts.map +1 -1
  233. package/dist/scheduler/index.js.map +1 -1
  234. package/dist/scheduler/index.workerd.js.map +1 -1
  235. package/dist/security/index.browser.js.map +1 -1
  236. package/dist/security/index.d.ts +45 -48
  237. package/dist/security/index.d.ts.map +1 -1
  238. package/dist/security/index.js.map +1 -1
  239. package/dist/server/auth/index.browser.js.map +1 -1
  240. package/dist/server/auth/index.d.ts +167 -172
  241. package/dist/server/auth/index.d.ts.map +1 -1
  242. package/dist/server/auth/index.js +4 -8
  243. package/dist/server/auth/index.js.map +1 -1
  244. package/dist/server/cookies/index.browser.js.map +1 -1
  245. package/dist/server/cookies/index.d.ts +5 -7
  246. package/dist/server/cookies/index.d.ts.map +1 -1
  247. package/dist/server/cookies/index.js.map +1 -1
  248. package/dist/server/core/index.browser.js.map +1 -1
  249. package/dist/server/core/index.d.ts +88 -73
  250. package/dist/server/core/index.d.ts.map +1 -1
  251. package/dist/server/core/index.js +19 -0
  252. package/dist/server/core/index.js.map +1 -1
  253. package/dist/server/cors/index.d.ts +11 -14
  254. package/dist/server/cors/index.d.ts.map +1 -1
  255. package/dist/server/cors/index.js.map +1 -1
  256. package/dist/server/etag/index.d.ts +6 -9
  257. package/dist/server/etag/index.d.ts.map +1 -1
  258. package/dist/server/etag/index.js.map +1 -1
  259. package/dist/server/health/index.d.ts +18 -21
  260. package/dist/server/health/index.d.ts.map +1 -1
  261. package/dist/server/health/index.js.map +1 -1
  262. package/dist/server/links/index.browser.js +2 -0
  263. package/dist/server/links/index.browser.js.map +1 -1
  264. package/dist/server/links/index.d.ts +63 -67
  265. package/dist/server/links/index.d.ts.map +1 -1
  266. package/dist/server/links/index.js +2 -0
  267. package/dist/server/links/index.js.map +1 -1
  268. package/dist/server/metrics/index.d.ts +5 -7
  269. package/dist/server/metrics/index.d.ts.map +1 -1
  270. package/dist/server/metrics/index.js.map +1 -1
  271. package/dist/server/proxy/index.d.ts +3 -5
  272. package/dist/server/proxy/index.d.ts.map +1 -1
  273. package/dist/server/proxy/index.js.map +1 -1
  274. package/dist/server/rate-limit/index.d.ts +10 -13
  275. package/dist/server/rate-limit/index.d.ts.map +1 -1
  276. package/dist/server/rate-limit/index.js.map +1 -1
  277. package/dist/server/static/index.d.ts +3 -5
  278. package/dist/server/static/index.d.ts.map +1 -1
  279. package/dist/server/static/index.js.map +1 -1
  280. package/dist/server/swagger/index.d.ts +5 -8
  281. package/dist/server/swagger/index.d.ts.map +1 -1
  282. package/dist/server/swagger/index.js.map +1 -1
  283. package/dist/sms/index.d.ts +3 -5
  284. package/dist/sms/index.d.ts.map +1 -1
  285. package/dist/sms/index.js.map +1 -1
  286. package/dist/system/index.browser.js.map +1 -1
  287. package/dist/system/index.d.ts +2 -4
  288. package/dist/system/index.d.ts.map +1 -1
  289. package/dist/system/index.js.map +1 -1
  290. package/dist/system/index.workerd.js.map +1 -1
  291. package/dist/topic/core/index.d.ts +4 -6
  292. package/dist/topic/core/index.d.ts.map +1 -1
  293. package/dist/topic/core/index.js.map +1 -1
  294. package/dist/topic/redis/index.d.ts +5 -8
  295. package/dist/topic/redis/index.d.ts.map +1 -1
  296. package/dist/topic/redis/index.js.map +1 -1
  297. package/package.json +45 -22
  298. package/src/api/audits/__tests__/AuditService.spec.ts +18 -110
  299. package/src/api/audits/controllers/AdminAuditController.ts +14 -0
  300. package/src/api/audits/services/AuditService.ts +21 -88
  301. package/src/api/files/__tests__/FileService.spec.ts +207 -2
  302. package/src/api/files/index.ts +3 -0
  303. package/src/api/files/schemas/fileCreatorSummarySchema.ts +22 -0
  304. package/src/api/files/schemas/fileResourceSchema.ts +10 -1
  305. package/src/api/files/services/FileService.ts +170 -72
  306. package/src/api/jobs/__tests__/$job.spec.ts +24 -1
  307. package/src/api/jobs/index.ts +4 -3
  308. package/src/api/jobs/primitives/$job.ts +7 -3
  309. package/src/api/jobs/providers/DirectJobDispatcher.ts +17 -36
  310. package/src/api/jobs/providers/JobProvider.ts +53 -24
  311. package/src/api/jobs/schemas/jobConfigAtom.ts +1 -1
  312. package/src/api/jobs/schemas/jobExecutionResourceSchema.ts +4 -1
  313. package/src/api/keys/schemas/adminApiKeyResourceSchema.ts +3 -1
  314. package/src/api/parameters/__tests__/$parameter.spec.ts +19 -2
  315. package/src/api/parameters/audits/ParameterAudits.ts +17 -0
  316. package/src/api/parameters/controllers/AdminParameterController.ts +95 -19
  317. package/src/api/parameters/index.ts +3 -0
  318. package/src/api/parameters/schemas/activateParameterBodySchema.ts +3 -3
  319. package/src/api/parameters/schemas/createParameterVersionBodySchema.ts +3 -2
  320. package/src/api/parameters/schemas/parameterCreatorSummarySchema.ts +25 -0
  321. package/src/api/parameters/schemas/parameterResponseSchema.ts +5 -0
  322. package/src/api/parameters/schemas/rollbackParameterBodySchema.ts +4 -2
  323. package/src/api/parameters/services/ParameterProvider.ts +69 -6
  324. package/src/api/subscriptions/jobs/SubscriptionJobs.ts +1 -1
  325. package/src/api/users/__tests__/AdminSessionController.spec.ts +37 -0
  326. package/src/api/users/audits/SessionAudits.ts +33 -0
  327. package/src/api/users/audits/UserAudits.ts +19 -43
  328. package/src/api/users/controllers/AdminUserController.ts +66 -1
  329. package/src/api/users/entities/sessions.ts +6 -0
  330. package/src/api/users/entities/users.ts +2 -0
  331. package/src/api/users/index.ts +9 -1
  332. package/src/api/users/primitives/$realm.ts +3 -0
  333. package/src/api/users/schemas/sessionResourceSchema.ts +16 -0
  334. package/src/api/users/schemas/updateUserSchema.ts +1 -8
  335. package/src/api/users/schemas/userQuerySchema.ts +7 -0
  336. package/src/api/users/services/CredentialService.ts +15 -6
  337. package/src/api/users/services/IdentityService.ts +2 -1
  338. package/src/api/users/services/RegistrationService.ts +2 -1
  339. package/src/api/users/services/SessionCrudService.ts +19 -2
  340. package/src/api/users/services/SessionService.ts +39 -19
  341. package/src/api/users/services/UserService.ts +106 -8
  342. package/src/background/__tests__/BackgroundTaskProvider.spec.ts +96 -0
  343. package/src/background/index.ts +37 -0
  344. package/src/background/index.workerd.ts +28 -0
  345. package/src/background/providers/BackgroundTaskProvider.ts +70 -0
  346. package/src/background/providers/WorkerdBackgroundTaskProvider.ts +43 -0
  347. package/src/bucket/__tests__/$bucket.spec.ts +18 -0
  348. package/src/bucket/__tests__/LocalFileStorageProvider.spec.ts +5 -0
  349. package/src/bucket/__tests__/MemoryFileStorageProvider.spec.ts +5 -0
  350. package/src/bucket/__tests__/NodeS3BucketProvider.spec.ts +23 -4
  351. package/src/bucket/__tests__/shared.ts +30 -0
  352. package/src/bucket/index.ts +5 -5
  353. package/src/bucket/index.workerd.ts +11 -4
  354. package/src/bucket/primitives/$bucket.ts +27 -0
  355. package/src/bucket/providers/FileStorageProvider.ts +13 -0
  356. package/src/bucket/providers/LocalFileStorageProvider.ts +17 -1
  357. package/src/bucket/providers/MemoryFileStorageProvider.ts +7 -0
  358. package/src/bucket/providers/{CloudflareR2Provider.ts → R2FileStorageProvider.ts} +10 -1
  359. package/src/bucket/providers/{NodeS3BucketProvider.ts → S3FileStorageProvider.ts} +27 -5
  360. package/src/cli/core/__tests__/BuildDockerTask.spec.ts +25 -1
  361. package/src/cli/core/__tests__/init.spec.ts +0 -219
  362. package/src/cli/core/commands/__tests__/BuildCommand.spec.ts +43 -0
  363. package/src/cli/core/commands/build.ts +108 -30
  364. package/src/cli/core/commands/init.ts +0 -12
  365. package/src/cli/core/commands/pack.ts +133 -0
  366. package/src/cli/core/index.ts +3 -0
  367. package/src/cli/core/providers/ViteDevServerProvider.ts +40 -16
  368. package/src/cli/core/services/PackageManagerUtils.ts +0 -16
  369. package/src/cli/core/services/ProjectScaffolder.ts +29 -291
  370. package/src/cli/core/tasks/BuildCloudflareTask.ts +353 -47
  371. package/src/cli/core/tasks/BuildDockerTask.ts +33 -3
  372. package/src/cli/core/tasks/BuildTask.ts +34 -0
  373. package/src/cli/core/templates/apiIndexTs.ts +1 -22
  374. package/src/cli/core/templates/mainCss.ts +0 -1
  375. package/src/cli/core/templates/webAppRouterTs.ts +0 -99
  376. package/src/cli/core/templates/webIndexTs.ts +1 -22
  377. package/src/cli/platform/__tests__/SecretsCommand.spec.ts +5 -3
  378. package/src/cli/platform/commands/SecretsCommand.ts +8 -6
  379. package/src/cli/platform/commands/platform.ts +192 -46
  380. package/src/cli/platform/index.ts +12 -52
  381. package/src/cli/{platform → platform-lib}/__tests__/CloudflareAdapter.spec.ts +426 -169
  382. package/src/cli/{platform → platform-lib}/__tests__/NamingService.spec.ts +91 -4
  383. package/src/cli/{platform → platform-lib}/__tests__/VercelAdapter.spec.ts +56 -85
  384. package/src/cli/{platform → platform-lib}/adapters/CloudflareAdapter.ts +402 -165
  385. package/src/cli/{platform → platform-lib}/adapters/PlatformAdapter.ts +62 -35
  386. package/src/cli/{platform → platform-lib}/adapters/VercelAdapter.ts +6 -10
  387. package/src/cli/{platform → platform-lib}/atoms/platformOptions.ts +34 -1
  388. package/src/cli/platform-lib/index.ts +67 -0
  389. package/src/cli/platform-lib/services/NamingService.ts +136 -0
  390. package/src/cli/{platform → platform-lib}/services/PlatformInspector.ts +60 -13
  391. package/src/cli/{platform → platform-lib}/services/PlatformOrchestrator.ts +54 -43
  392. package/src/cli/{platform → platform-lib}/services/WranglerApi.ts +4 -2
  393. package/src/command/__tests__/Runner.spec.ts +20 -0
  394. package/src/command/helpers/EnvUtils.ts +19 -3
  395. package/src/command/helpers/Runner.ts +12 -2
  396. package/src/command/providers/CliProvider.ts +34 -1
  397. package/src/{containers → container}/core/__tests__/$container.spec.ts +5 -5
  398. package/src/{containers → container}/core/index.ts +4 -4
  399. package/src/{containers → container}/core/index.workerd.ts +19 -3
  400. package/src/{containers → container}/core/primitives/$container.ts +1 -1
  401. package/src/{containers → container}/core/providers/CloudflareContainerProvider.ts +17 -19
  402. package/src/{containers → container}/core/providers/ContainerProvider.ts +16 -2
  403. package/src/{containers → container}/core/providers/MockContainerProvider.ts +1 -1
  404. package/src/core/Alepha.ts +49 -1
  405. package/src/core/__tests__/$env.spec.ts +42 -0
  406. package/src/core/__tests__/dump.spec.ts +47 -0
  407. package/src/email/cloudflare/__tests__/CloudflareEmailProvider.spec.ts +42 -10
  408. package/src/email/cloudflare/index.ts +14 -5
  409. package/src/email/cloudflare/providers/CloudflareEmailProvider.ts +54 -9
  410. package/src/logger/__tests__/Logger.spec.ts +55 -0
  411. package/src/logger/index.ts +13 -0
  412. package/src/logger/services/Logger.ts +31 -1
  413. package/src/orm/__tests__/orm-showcase-tests.ts +27 -0
  414. package/src/orm/__tests__/orm-showcase.spec.ts +12 -0
  415. package/src/orm/core/interfaces/PgQuery.ts +4 -1
  416. package/src/orm/core/services/Repository.ts +27 -11
  417. package/src/react/auth/hooks/useAuth.ts +10 -5
  418. package/src/react/core/__tests__/useQuery.browser.spec.tsx +25 -0
  419. package/src/react/core/hooks/useAction.ts +14 -3
  420. package/src/react/core/hooks/useQuery.ts +24 -4
  421. package/src/react/i18n/components/Translate.tsx +47 -0
  422. package/src/react/i18n/index.ts +2 -0
  423. package/src/react/intro/components/GettingStartedAdminSlide.tsx +2 -2
  424. package/src/react/router/__tests__/$page.spec.tsx +3 -2
  425. package/src/react/router/__tests__/page-can.spec.ts +18 -13
  426. package/src/react/router/hooks/useQueryParams.ts +114 -14
  427. package/src/react/router/primitives/$page.ts +85 -4
  428. package/src/react/router/providers/ReactBrowserRouterProvider.ts +3 -7
  429. package/src/react/router/providers/ReactServerProvider.ts +4 -13
  430. package/src/react/ui/services/SchemaControl.ts +3 -4
  431. package/src/server/core/providers/ServerMultipartProvider.ts +19 -0
  432. package/src/server/links/providers/LinkProvider.ts +10 -0
  433. package/dist/containers/core/index.d.ts.map +0 -1
  434. package/dist/containers/core/index.js.map +0 -1
  435. package/dist/containers/core/index.workerd.js.map +0 -1
  436. package/src/cli/core/templates/componentsJsonTs.ts +0 -39
  437. package/src/cli/core/templates/saasAdminLayoutTsx.ts +0 -77
  438. package/src/cli/core/templates/saasAdminPagesTsx.ts +0 -26
  439. package/src/cli/core/templates/saasAuthLayoutTsx.ts +0 -22
  440. package/src/cli/core/templates/saasAuthPagesTsx.ts +0 -62
  441. package/src/cli/core/templates/saasRealmProviderTs.ts +0 -52
  442. package/src/cli/platform/services/NamingService.ts +0 -54
  443. /package/dist/orm/core/{chunk-o8xxKEmq.js → chunk-B4FMCO8f.js} +0 -0
  444. /package/dist/react/testing/{chunk-6Ep1yQYe.js → chunk-BpyX8vjI.js} +0 -0
  445. /package/src/cli/{platform → platform-lib}/__tests__/GitHubSecretStore.spec.ts +0 -0
  446. /package/src/cli/{platform → platform-lib}/__tests__/PlatformCacheProvider.spec.ts +0 -0
  447. /package/src/cli/{platform → platform-lib}/__tests__/PlatformInspector.spec.ts +0 -0
  448. /package/src/cli/{platform → platform-lib}/__tests__/PlatformOrchestrator.spec.ts +0 -0
  449. /package/src/cli/{platform → platform-lib}/__tests__/SecretFilterService.spec.ts +0 -0
  450. /package/src/cli/{platform → platform-lib}/__tests__/detectResources.spec.ts +0 -0
  451. /package/src/cli/{platform → platform-lib}/providers/GitHubSecretStore.ts +0 -0
  452. /package/src/cli/{platform → platform-lib}/providers/MemorySecretStore.ts +0 -0
  453. /package/src/cli/{platform → platform-lib}/providers/PlatformCacheProvider.ts +0 -0
  454. /package/src/cli/{platform → platform-lib}/providers/SecretStoreProvider.ts +0 -0
  455. /package/src/cli/{platform → platform-lib}/schemas/cloudflare.ts +0 -0
  456. /package/src/cli/{platform → platform-lib}/schemas/platform.ts +0 -0
  457. /package/src/cli/{platform → platform-lib}/schemas/vercel.ts +0 -0
  458. /package/src/cli/{platform → platform-lib}/services/CloudflareApi.ts +0 -0
  459. /package/src/cli/{platform → platform-lib}/services/SecretFilterService.ts +0 -0
  460. /package/src/cli/{platform → platform-lib}/services/VercelApi.ts +0 -0
  461. /package/src/cli/{platform → platform-lib}/services/VercelCli.ts +0 -0
  462. /package/src/{containers → container}/core/interfaces/ContainerOptions.ts +0 -0
  463. /package/src/{containers → container}/core/providers/NodeContainerProvider.ts +0 -0
@@ -56,6 +56,20 @@ export class AuditService {
56
56
  return Array.from(this.auditTypes.values());
57
57
  }
58
58
 
59
+ /**
60
+ * Distinct action names across all registered audit types, sorted.
61
+ *
62
+ * Sourced from the `$audit` type registry. Audit types register lazily —
63
+ * when their holder (e.g. `SessionAudits`, `ParameterAudits`) is first
64
+ * injected — so the admin filter only lists actions for audit domains that
65
+ * are actually in use, which is the intended behaviour.
66
+ */
67
+ public getDistinctActions(): string[] {
68
+ return [
69
+ ...new Set(this.getRegisteredTypes().flatMap((type) => type.actions)),
70
+ ].sort();
71
+ }
72
+
59
73
  /**
60
74
  * Get current request context if available.
61
75
  */
@@ -108,11 +122,16 @@ export class AuditService {
108
122
  userId: data.userId ?? contextData.userId,
109
123
  });
110
124
 
125
+ const success = data.success ?? true;
111
126
  const entry = await this.repo.create({
112
127
  ...contextData,
113
128
  ...data,
114
- severity: data.severity ?? "info",
115
- success: data.success ?? true,
129
+ // Outcome drives severity: a failed audit (success:false) defaults to
130
+ // `warning`, otherwise `info`. Explicit `severity` always wins. This is
131
+ // the single place the OK/Failed → severity rule lives, so holders and
132
+ // `$audit` primitives don't repeat it.
133
+ severity: data.severity ?? (success ? "info" : "warning"),
134
+ success,
116
135
  });
117
136
 
118
137
  this.log.debug("Audit entry created", {
@@ -135,92 +154,6 @@ export class AuditService {
135
154
  return this.create({ type, action, ...options });
136
155
  }
137
156
 
138
- /**
139
- * Record an authentication event.
140
- */
141
- public async recordAuth(
142
- action:
143
- | "login"
144
- | "logout"
145
- | "login_failed"
146
- | "token_refresh"
147
- | "mfa_setup"
148
- | "mfa_verify",
149
- options: Omit<CreateAudit, "type" | "action"> = {},
150
- ): Promise<AuditEntity> {
151
- return this.create({
152
- type: "auth",
153
- action,
154
- severity: action === "login_failed" ? "warning" : "info",
155
- ...options,
156
- });
157
- }
158
-
159
- /**
160
- * Record a user management event.
161
- */
162
- public async recordUser(
163
- action:
164
- | "create"
165
- | "update"
166
- | "delete"
167
- | "enable"
168
- | "disable"
169
- | "role_change",
170
- options: Omit<CreateAudit, "type" | "action"> = {},
171
- ): Promise<AuditEntity> {
172
- return this.create({
173
- type: "user",
174
- action,
175
- resourceType: "user",
176
- ...options,
177
- });
178
- }
179
-
180
- /**
181
- * Record a data access event.
182
- */
183
- public async recordAccess(
184
- action: "view" | "export" | "download",
185
- options: Omit<CreateAudit, "type" | "action"> = {},
186
- ): Promise<AuditEntity> {
187
- return this.create({ type: "access", action, ...options });
188
- }
189
-
190
- /**
191
- * Record a security event.
192
- */
193
- public async recordSecurity(
194
- action:
195
- | "permission_denied"
196
- | "suspicious_activity"
197
- | "rate_limited"
198
- | "blocked",
199
- options: Omit<CreateAudit, "type" | "action"> = {},
200
- ): Promise<AuditEntity> {
201
- return this.create({
202
- type: "security",
203
- action,
204
- severity: "warning",
205
- ...options,
206
- });
207
- }
208
-
209
- /**
210
- * Record a system event.
211
- */
212
- public async recordSystem(
213
- action: "startup" | "shutdown" | "config_change" | "maintenance" | "error",
214
- options: Omit<CreateAudit, "type" | "action"> = {},
215
- ): Promise<AuditEntity> {
216
- return this.create({
217
- type: "system",
218
- action,
219
- severity: action === "error" ? "critical" : "info",
220
- ...options,
221
- });
222
- }
223
-
224
157
  /**
225
158
  * Find audit entries with filtering and pagination.
226
159
  */
@@ -1,4 +1,5 @@
1
- import { randomUUID } from "node:crypto";
1
+ import { createHash, randomUUID } from "node:crypto";
2
+ import { Readable } from "node:stream";
2
3
  import { Alepha, type Service } from "alepha";
3
4
  import {
4
5
  $bucket,
@@ -6,11 +7,13 @@ import {
6
7
  LocalFileStorageProvider,
7
8
  MemoryFileStorageProvider,
8
9
  } from "alepha/bucket";
10
+ import { $repository } from "alepha/orm";
9
11
  import { AlephaOrmPostgres } from "alepha/orm/postgres";
10
12
  import type { UserAccountToken } from "alepha/security";
11
13
  import { FileSystemProvider } from "alepha/system";
12
14
  import { describe, expect, it } from "vitest";
13
- import { AlephaApiFiles, FileController } from "../index.ts";
15
+ import { users } from "../../users/entities/users.ts";
16
+ import { AlephaApiFiles, FileController, FileService } from "../index.ts";
14
17
 
15
18
  const adminUser: UserAccountToken = {
16
19
  id: "00000000-0000-0000-0000-000000000001",
@@ -128,4 +131,206 @@ describe("FileService", () => {
128
131
  it("should handle basic file operations with local storage", async () => {
129
132
  await testFileServiceOperations(LocalFileStorageProvider);
130
133
  });
134
+
135
+ it("removes the orphaned blob when uploadFile's metadata write fails", async () => {
136
+ const alepha = Alepha.create()
137
+ .with(AlephaOrmPostgres)
138
+ .with({ provide: FileStorageProvider, use: MemoryFileStorageProvider })
139
+ .with(AlephaApiFiles);
140
+
141
+ class Assets {
142
+ images = $bucket({ name: randomUUID() });
143
+ }
144
+
145
+ const assets = alepha.inject(Assets);
146
+ const service = alepha.inject(FileService);
147
+ const fs = alepha.inject(FileSystemProvider);
148
+
149
+ await alepha.start();
150
+
151
+ // An invalid UUID the `creator` column rejects, forcing the metadata
152
+ // insert to fail *after* the blob has already been written to storage.
153
+ const brokenUser = {
154
+ id: "not-a-valid-uuid",
155
+ name: "Broken",
156
+ } as UserAccountToken;
157
+
158
+ await expect(
159
+ service.uploadFile(
160
+ fs.createFile({
161
+ text: "orphan",
162
+ name: "orphan.txt",
163
+ type: "text/plain",
164
+ }),
165
+ { bucket: assets.images.name, user: brokenUser },
166
+ ),
167
+ ).rejects.toThrow();
168
+
169
+ // The blob must not be left behind in the bucket.
170
+ expect(await assets.images.list()).toEqual([]);
171
+ });
172
+
173
+ it("removes the orphaned blob when the upload hook's metadata write fails", async () => {
174
+ const alepha = Alepha.create()
175
+ .with(AlephaOrmPostgres)
176
+ .with({ provide: FileStorageProvider, use: MemoryFileStorageProvider })
177
+ .with(AlephaApiFiles);
178
+
179
+ class Assets {
180
+ images = $bucket({ name: randomUUID() });
181
+ }
182
+
183
+ const assets = alepha.inject(Assets);
184
+ const fs = alepha.inject(FileSystemProvider);
185
+
186
+ await alepha.start();
187
+
188
+ const brokenUser = {
189
+ id: "not-a-valid-uuid",
190
+ name: "Broken",
191
+ } as UserAccountToken;
192
+
193
+ // Direct bucket.upload (persist defaults to true) drives the
194
+ // `bucket:file:uploaded` hook, whose metadata insert fails on the
195
+ // invalid creator UUID after the blob is stored.
196
+ await expect(
197
+ assets.images.upload(
198
+ fs.createFile({
199
+ text: "orphan",
200
+ name: "orphan.txt",
201
+ type: "text/plain",
202
+ }),
203
+ { user: brokenUser },
204
+ ),
205
+ ).rejects.toThrow();
206
+
207
+ expect(await assets.images.list()).toEqual([]);
208
+ });
209
+
210
+ it("uploadFile reads a stream-backed file once (no empty blob, real size)", async () => {
211
+ const alepha = Alepha.create()
212
+ .with(AlephaOrmPostgres)
213
+ .with({ provide: FileStorageProvider, use: MemoryFileStorageProvider })
214
+ .with(AlephaApiFiles);
215
+
216
+ class Assets {
217
+ images = $bucket({ name: randomUUID() });
218
+ }
219
+
220
+ const assets = alepha.inject(Assets);
221
+ const service = alepha.inject(FileService);
222
+ const fs = alepha.inject(FileSystemProvider);
223
+
224
+ await alepha.start();
225
+
226
+ const content = "streamed upload content";
227
+
228
+ // A one-shot stream: it can only be read once. The old code drained it
229
+ // for the checksum before bucket.upload re-read it, storing an empty blob.
230
+ const file = fs.createFile({
231
+ stream: Readable.from(Buffer.from(content)),
232
+ name: "stream.txt",
233
+ type: "text/plain",
234
+ });
235
+
236
+ const entity = await service.uploadFile(file, {
237
+ bucket: assets.images.name,
238
+ });
239
+
240
+ // Content must survive (not an empty blob), size must be the real length.
241
+ expect(entity.size).toBe(content.length);
242
+ expect(entity.checksum).toBe(
243
+ createHash("sha256").update(content).digest("hex"),
244
+ );
245
+
246
+ const back = await service.streamFile(entity);
247
+ expect(await back.text()).toBe(content);
248
+ });
249
+
250
+ it("upload hook reads a stream-backed file once (real size + checksum)", async () => {
251
+ const alepha = Alepha.create()
252
+ .with(AlephaOrmPostgres)
253
+ .with({ provide: FileStorageProvider, use: MemoryFileStorageProvider })
254
+ .with(AlephaApiFiles);
255
+
256
+ class Assets {
257
+ images = $bucket({ name: randomUUID() });
258
+ }
259
+
260
+ const assets = alepha.inject(Assets);
261
+ const ctrl = alepha.inject(FileController);
262
+ const fs = alepha.inject(FileSystemProvider);
263
+
264
+ await alepha.start();
265
+
266
+ const content = "streamed hook content";
267
+
268
+ // Direct bucket.upload (persist defaults to true) → the bucket:file:uploaded
269
+ // hook persists the row. The hook runs *after* the provider read the stream,
270
+ // so without materializing first it would checksum an already-drained
271
+ // (empty) stream and record size 0.
272
+ await assets.images.upload(
273
+ fs.createFile({
274
+ stream: Readable.from(Buffer.from(content)),
275
+ name: "hook.txt",
276
+ type: "text/plain",
277
+ }),
278
+ { user: adminUser },
279
+ );
280
+
281
+ const files = await ctrl.findFiles.run({}, asAdmin);
282
+ expect(files.content).toHaveLength(1);
283
+
284
+ const entity = files.content[0];
285
+ expect(entity.size).toBe(content.length);
286
+ expect(entity.checksum).toBe(
287
+ createHash("sha256").update(content).digest("hex"),
288
+ );
289
+ });
290
+
291
+ it("embeds the uploader summary when a users repository is registered", async () => {
292
+ // Registering a users repository is what flips the best-effort join on
293
+ // (and creates the `users` table). Without it, the prior tests confirm
294
+ // findFiles still works and simply leaves `user` undefined.
295
+ class TestUsers {
296
+ repo = $repository(users);
297
+ }
298
+
299
+ const alepha = Alepha.create()
300
+ .with(AlephaOrmPostgres)
301
+ .with({ provide: FileStorageProvider, use: MemoryFileStorageProvider })
302
+ .with(AlephaApiFiles);
303
+
304
+ const testUsers = alepha.inject(TestUsers);
305
+ const ctrl = alepha.inject(FileController);
306
+ const fs = alepha.inject(FileSystemProvider);
307
+
308
+ await alepha.start();
309
+
310
+ await testUsers.repo.create({
311
+ id: adminUser.id,
312
+ email: "uploader@example.com",
313
+ username: "uploader",
314
+ });
315
+
316
+ await ctrl.uploadFile.run(
317
+ {
318
+ body: {
319
+ file: fs.createFile({
320
+ text: "joined",
321
+ name: "joined.txt",
322
+ type: "text/plain",
323
+ }),
324
+ },
325
+ },
326
+ asAdmin,
327
+ );
328
+
329
+ const files = await ctrl.findFiles.run({}, asAdmin);
330
+
331
+ expect(files.content).toHaveLength(1);
332
+ expect(files.content[0].creator).toBe(adminUser.id);
333
+ expect(files.content[0].user?.email).toBe("uploader@example.com");
334
+ expect(files.content[0].user?.username).toBe("uploader");
335
+ });
131
336
  });
@@ -16,6 +16,9 @@ export * from "./controllers/FileController.ts";
16
16
  export * from "./entities/files.ts";
17
17
  export * from "./jobs/FileJobs.ts";
18
18
  export * from "./providers/FileAccessProvider.ts";
19
+ export * from "./schemas/fileCreatorSummarySchema.ts";
20
+ export * from "./schemas/fileQuerySchema.ts";
21
+ export * from "./schemas/fileResourceSchema.ts";
19
22
  export * from "./schemas/storageStatsSchema.ts";
20
23
  export * from "./services/FileService.ts";
21
24
 
@@ -0,0 +1,22 @@
1
+ import { type Static, t } from "alepha";
2
+
3
+ /**
4
+ * Slim view of a file's uploader, embedded by the admin listing via a
5
+ * best-effort left join (`files.creator` → `users.id`) so the UI can render
6
+ * a human-readable identifier instead of a bare UUID.
7
+ *
8
+ * Optional end-to-end: the join only runs when the `users` entity is
9
+ * registered in the running app (see `FileService.findFiles`), and even then
10
+ * a file whose creator was deleted — or who lives in a non-default realm —
11
+ * comes back with `user` undefined. Callers must fall back to `creatorName`
12
+ * or the raw `creator` id.
13
+ */
14
+ export const fileCreatorSummarySchema = t.object({
15
+ id: t.uuid(),
16
+ email: t.optional(t.string({ format: "email" })),
17
+ username: t.optional(t.shortText({ minLength: 3, maxLength: 30 })),
18
+ firstName: t.optional(t.string()),
19
+ lastName: t.optional(t.string()),
20
+ });
21
+
22
+ export type FileCreatorSummary = Static<typeof fileCreatorSummarySchema>;
@@ -1,9 +1,18 @@
1
1
  import { type Static, t } from "alepha";
2
2
  import { files } from "../entities/files.ts";
3
+ import { fileCreatorSummarySchema } from "./fileCreatorSummarySchema.ts";
3
4
 
4
5
  export const fileResourceSchema = t.extend(
5
6
  files.schema,
6
- {},
7
+ {
8
+ /**
9
+ * Uploader summary, embedded by the admin listing via a best-effort
10
+ * left join. Optional — see `fileCreatorSummarySchema`. Distinct from
11
+ * the denormalized `creatorName`, which is set only on direct uploads
12
+ * and never carries an email.
13
+ */
14
+ user: t.optional(fileCreatorSummarySchema),
15
+ },
7
16
  {
8
17
  title: "FileResource",
9
18
  description: "A file resource representing a file stored in the system.",