alepha 0.19.0 → 0.19.2

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 (638) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +6 -9
  3. package/dist/api/audits/index.d.ts +378 -346
  4. package/dist/api/audits/index.d.ts.map +1 -1
  5. package/dist/api/files/index.d.ts +216 -184
  6. package/dist/api/files/index.d.ts.map +1 -1
  7. package/dist/api/files/index.js +5 -1
  8. package/dist/api/files/index.js.map +1 -1
  9. package/dist/api/jobs/index.d.ts +528 -496
  10. package/dist/api/jobs/index.d.ts.map +1 -1
  11. package/dist/api/jobs/index.js +3 -3
  12. package/dist/api/jobs/index.js.map +1 -1
  13. package/dist/api/keys/index.d.ts +202 -202
  14. package/dist/api/keys/index.d.ts.map +1 -1
  15. package/dist/api/notifications/index.d.ts +152 -152
  16. package/dist/api/notifications/index.d.ts.map +1 -1
  17. package/dist/api/organizations/index.browser.js +48 -0
  18. package/dist/api/organizations/index.browser.js.map +1 -0
  19. package/dist/api/organizations/index.d.ts +516 -0
  20. package/dist/api/organizations/index.d.ts.map +1 -0
  21. package/dist/api/organizations/index.js +202 -0
  22. package/dist/api/organizations/index.js.map +1 -0
  23. package/dist/api/parameters/index.d.ts +391 -358
  24. package/dist/api/parameters/index.d.ts.map +1 -1
  25. package/dist/api/parameters/index.js +5 -1
  26. package/dist/api/parameters/index.js.map +1 -1
  27. package/dist/api/users/index.browser.js +7 -5
  28. package/dist/api/users/index.browser.js.map +1 -1
  29. package/dist/api/users/index.d.ts +989 -931
  30. package/dist/api/users/index.d.ts.map +1 -1
  31. package/dist/api/users/index.js +292 -146
  32. package/dist/api/users/index.js.map +1 -1
  33. package/dist/api/verifications/index.d.ts +132 -132
  34. package/dist/api/verifications/index.d.ts.map +1 -1
  35. package/dist/api/verifications/index.js +2 -2
  36. package/dist/api/verifications/index.js.map +1 -1
  37. package/dist/batch/index.d.ts +6 -6
  38. package/dist/batch/index.d.ts.map +1 -1
  39. package/dist/billing/index.d.ts +1048 -0
  40. package/dist/billing/index.d.ts.map +1 -0
  41. package/dist/billing/index.js +713 -0
  42. package/dist/billing/index.js.map +1 -0
  43. package/dist/bin/index.js +0 -2
  44. package/dist/bin/index.js.map +1 -1
  45. package/dist/bucket/index.d.ts +10 -10
  46. package/dist/bucket/index.d.ts.map +1 -1
  47. package/dist/bucket/index.js +2 -2
  48. package/dist/bucket/index.js.map +1 -1
  49. package/dist/cache/core/index.d.ts +9 -9
  50. package/dist/cache/core/index.d.ts.map +1 -1
  51. package/dist/cache/core/index.js +2 -2
  52. package/dist/cache/core/index.js.map +1 -1
  53. package/dist/cache/core/index.workerd.js +2 -2
  54. package/dist/cache/core/index.workerd.js.map +1 -1
  55. package/dist/cache/redis/index.d.ts +6 -6
  56. package/dist/cache/redis/index.d.ts.map +1 -1
  57. package/dist/cache/redis/index.js +2 -2
  58. package/dist/cache/redis/index.js.map +1 -1
  59. package/dist/cli/config/index.d.ts +12 -2
  60. package/dist/cli/config/index.d.ts.map +1 -1
  61. package/dist/cli/config/index.js +4 -0
  62. package/dist/cli/config/index.js.map +1 -1
  63. package/dist/cli/core/index.d.ts +183 -139
  64. package/dist/cli/core/index.d.ts.map +1 -1
  65. package/dist/cli/core/index.js +283 -86
  66. package/dist/cli/core/index.js.map +1 -1
  67. package/dist/cli/devtools/index.d.ts +45 -0
  68. package/dist/cli/devtools/index.d.ts.map +1 -0
  69. package/dist/cli/devtools/index.js +170 -0
  70. package/dist/cli/devtools/index.js.map +1 -0
  71. package/dist/cli/platform/index.d.ts +383 -492
  72. package/dist/cli/platform/index.d.ts.map +1 -1
  73. package/dist/cli/platform/index.js +42 -511
  74. package/dist/cli/platform/index.js.map +1 -1
  75. package/dist/cli/vendor/index.d.ts +196 -0
  76. package/dist/cli/vendor/index.d.ts.map +1 -0
  77. package/dist/cli/vendor/index.js +384 -0
  78. package/dist/cli/vendor/index.js.map +1 -0
  79. package/dist/command/index.d.ts +18 -18
  80. package/dist/command/index.d.ts.map +1 -1
  81. package/dist/command/index.js +2 -2
  82. package/dist/command/index.js.map +1 -1
  83. package/dist/core/index.browser.js +4 -4
  84. package/dist/core/index.browser.js.map +1 -1
  85. package/dist/core/index.d.ts +10 -10
  86. package/dist/core/index.d.ts.map +1 -1
  87. package/dist/core/index.js +4 -4
  88. package/dist/core/index.js.map +1 -1
  89. package/dist/core/index.native.js +4 -4
  90. package/dist/core/index.native.js.map +1 -1
  91. package/dist/core/index.workerd.js +4 -4
  92. package/dist/core/index.workerd.js.map +1 -1
  93. package/dist/crypto/index.d.ts +7 -7
  94. package/dist/crypto/index.d.ts.map +1 -1
  95. package/dist/datetime/index.d.ts +4 -4
  96. package/dist/datetime/index.d.ts.map +1 -1
  97. package/dist/email/brevo/index.d.ts +4 -4
  98. package/dist/email/brevo/index.d.ts.map +1 -1
  99. package/dist/email/core/index.d.ts +15 -11
  100. package/dist/email/core/index.d.ts.map +1 -1
  101. package/dist/email/core/index.js +12 -35
  102. package/dist/email/core/index.js.map +1 -1
  103. package/dist/email/smtp/index.d.ts +12 -12
  104. package/dist/email/smtp/index.d.ts.map +1 -1
  105. package/dist/email/smtp/index.js +7 -4
  106. package/dist/email/smtp/index.js.map +1 -1
  107. package/dist/fake/index.d.ts +4 -8
  108. package/dist/fake/index.d.ts.map +1 -1
  109. package/dist/fake/index.js +55 -889
  110. package/dist/fake/index.js.map +1 -1
  111. package/dist/lock/core/index.d.ts +13 -13
  112. package/dist/lock/core/index.d.ts.map +1 -1
  113. package/dist/lock/core/index.js +2 -2
  114. package/dist/lock/core/index.js.map +1 -1
  115. package/dist/lock/redis/index.d.ts +4 -4
  116. package/dist/lock/redis/index.d.ts.map +1 -1
  117. package/dist/logger/index.d.ts +16 -15
  118. package/dist/logger/index.d.ts.map +1 -1
  119. package/dist/logger/index.js +5 -2
  120. package/dist/logger/index.js.map +1 -1
  121. package/dist/mcp/index.d.ts +11 -11
  122. package/dist/mcp/index.d.ts.map +1 -1
  123. package/dist/mcp/index.js +2 -2
  124. package/dist/mcp/index.js.map +1 -1
  125. package/dist/orm/core/index.browser.js +11 -1
  126. package/dist/orm/core/index.browser.js.map +1 -1
  127. package/dist/orm/core/index.bun.js +53 -16
  128. package/dist/orm/core/index.bun.js.map +1 -1
  129. package/dist/orm/core/index.d.ts +95 -51
  130. package/dist/orm/core/index.d.ts.map +1 -1
  131. package/dist/orm/core/index.js +55 -14
  132. package/dist/orm/core/index.js.map +1 -1
  133. package/dist/orm/postgres/index.bun.js +17 -11
  134. package/dist/orm/postgres/index.bun.js.map +1 -1
  135. package/dist/orm/postgres/index.d.ts +21 -15
  136. package/dist/orm/postgres/index.d.ts.map +1 -1
  137. package/dist/orm/postgres/index.js +19 -13
  138. package/dist/orm/postgres/index.js.map +1 -1
  139. package/dist/queue/core/index.d.ts +14 -14
  140. package/dist/queue/core/index.d.ts.map +1 -1
  141. package/dist/queue/core/index.js +2 -2
  142. package/dist/queue/core/index.js.map +1 -1
  143. package/dist/queue/core/index.workerd.js +2 -2
  144. package/dist/queue/core/index.workerd.js.map +1 -1
  145. package/dist/queue/redis/index.d.ts +4 -4
  146. package/dist/queue/redis/index.d.ts.map +1 -1
  147. package/dist/queue/redis/index.js +2 -2
  148. package/dist/queue/redis/index.js.map +1 -1
  149. package/dist/react/auth/index.d.ts +9 -9
  150. package/dist/react/auth/index.d.ts.map +1 -1
  151. package/dist/react/core/index.d.ts +6 -6
  152. package/dist/react/core/index.d.ts.map +1 -1
  153. package/dist/react/core/index.js +5 -4
  154. package/dist/react/core/index.js.map +1 -1
  155. package/dist/react/form/index.d.ts +4 -4
  156. package/dist/react/form/index.d.ts.map +1 -1
  157. package/dist/react/head/index.d.ts +4 -4
  158. package/dist/react/head/index.d.ts.map +1 -1
  159. package/dist/react/i18n/index.d.ts +9 -9
  160. package/dist/react/i18n/index.d.ts.map +1 -1
  161. package/dist/react/intro/index.d.ts +2 -2
  162. package/dist/react/intro/index.d.ts.map +1 -1
  163. package/dist/react/intro/index.js +3 -4
  164. package/dist/react/intro/index.js.map +1 -1
  165. package/dist/react/router/index.browser.js +4 -5
  166. package/dist/react/router/index.browser.js.map +1 -1
  167. package/dist/react/router/index.d.ts +215 -215
  168. package/dist/react/router/index.d.ts.map +1 -1
  169. package/dist/react/router/index.js +6 -7
  170. package/dist/react/router/index.js.map +1 -1
  171. package/dist/react/testing/index.d.ts +2 -2
  172. package/dist/react/testing/index.d.ts.map +1 -1
  173. package/dist/react/testing/index.js +2 -4
  174. package/dist/react/testing/index.js.map +1 -1
  175. package/dist/redis/index.d.ts +19 -19
  176. package/dist/redis/index.d.ts.map +1 -1
  177. package/dist/retry/index.d.ts +4 -4
  178. package/dist/retry/index.d.ts.map +1 -1
  179. package/dist/scheduler/index.d.ts +13 -13
  180. package/dist/scheduler/index.d.ts.map +1 -1
  181. package/dist/scheduler/index.js +2 -2
  182. package/dist/scheduler/index.js.map +1 -1
  183. package/dist/scheduler/index.workerd.js +2 -2
  184. package/dist/scheduler/index.workerd.js.map +1 -1
  185. package/dist/security/index.browser.js +1 -1
  186. package/dist/security/index.browser.js.map +1 -1
  187. package/dist/security/index.d.ts +47 -47
  188. package/dist/security/index.d.ts.map +1 -1
  189. package/dist/security/index.js +9 -12
  190. package/dist/security/index.js.map +1 -1
  191. package/dist/server/auth/index.d.ts +170 -169
  192. package/dist/server/auth/index.d.ts.map +1 -1
  193. package/dist/server/auth/index.js +16 -2
  194. package/dist/server/auth/index.js.map +1 -1
  195. package/dist/server/cookies/index.d.ts +7 -7
  196. package/dist/server/cookies/index.d.ts.map +1 -1
  197. package/dist/server/core/index.d.ts +76 -76
  198. package/dist/server/core/index.d.ts.map +1 -1
  199. package/dist/server/core/index.js +23 -17
  200. package/dist/server/core/index.js.map +1 -1
  201. package/dist/server/cors/index.d.ts +13 -13
  202. package/dist/server/cors/index.d.ts.map +1 -1
  203. package/dist/server/cors/index.js +2 -2
  204. package/dist/server/cors/index.js.map +1 -1
  205. package/dist/server/etag/index.d.ts +9 -9
  206. package/dist/server/etag/index.d.ts.map +1 -1
  207. package/dist/server/health/index.d.ts +20 -20
  208. package/dist/server/health/index.d.ts.map +1 -1
  209. package/dist/server/links/index.browser.js +2 -2
  210. package/dist/server/links/index.browser.js.map +1 -1
  211. package/dist/server/links/index.d.ts +66 -66
  212. package/dist/server/links/index.d.ts.map +1 -1
  213. package/dist/server/links/index.js +4 -4
  214. package/dist/server/links/index.js.map +1 -1
  215. package/dist/server/metrics/index.d.ts +7 -7
  216. package/dist/server/metrics/index.d.ts.map +1 -1
  217. package/dist/server/proxy/index.d.ts +5 -5
  218. package/dist/server/proxy/index.d.ts.map +1 -1
  219. package/dist/server/rate-limit/index.d.ts +12 -12
  220. package/dist/server/rate-limit/index.d.ts.map +1 -1
  221. package/dist/server/rate-limit/index.js +2 -2
  222. package/dist/server/rate-limit/index.js.map +1 -1
  223. package/dist/server/static/index.d.ts +5 -5
  224. package/dist/server/static/index.d.ts.map +1 -1
  225. package/dist/server/swagger/index.d.ts +7 -7
  226. package/dist/server/swagger/index.d.ts.map +1 -1
  227. package/dist/server/swagger/index.js +2 -2
  228. package/dist/server/swagger/index.js.map +1 -1
  229. package/dist/sms/index.d.ts +11 -7
  230. package/dist/sms/index.d.ts.map +1 -1
  231. package/dist/sms/index.js +9 -15
  232. package/dist/sms/index.js.map +1 -1
  233. package/dist/system/index.d.ts +4 -4
  234. package/dist/system/index.d.ts.map +1 -1
  235. package/dist/topic/core/index.d.ts +6 -6
  236. package/dist/topic/core/index.d.ts.map +1 -1
  237. package/dist/topic/redis/index.d.ts +7 -7
  238. package/dist/topic/redis/index.d.ts.map +1 -1
  239. package/dist/topic/redis/index.js +2 -2
  240. package/dist/topic/redis/index.js.map +1 -1
  241. package/dist/websocket/index.d.ts +36 -36
  242. package/dist/websocket/index.d.ts.map +1 -1
  243. package/dist/websocket/index.js +2 -2
  244. package/dist/websocket/index.js.map +1 -1
  245. package/package.json +37 -32
  246. package/src/api/files/{controllers → __tests__}/FileController.spec.ts +189 -143
  247. package/src/api/files/{services → __tests__}/FileService.spec.ts +50 -30
  248. package/src/api/files/controllers/FileController.ts +6 -0
  249. package/src/api/jobs/{services → __tests__}/JobService.spec.ts +1 -1
  250. package/src/api/jobs/providers/JobProvider.ts +3 -3
  251. package/src/api/keys/{services → __tests__}/ApiKeyService.spec.ts +1 -1
  252. package/src/api/organizations/__tests__/OrganizationService.spec.ts +193 -0
  253. package/src/api/organizations/controllers/AdminOrganizationController.ts +103 -0
  254. package/src/api/organizations/entities/organizations.ts +20 -0
  255. package/src/api/organizations/index.browser.ts +10 -0
  256. package/src/api/organizations/index.ts +31 -0
  257. package/src/api/organizations/schemas/createOrganizationSchema.ts +10 -0
  258. package/src/api/organizations/schemas/organizationQuerySchema.ts +10 -0
  259. package/src/api/organizations/schemas/organizationResourceSchema.ts +6 -0
  260. package/src/api/organizations/schemas/updateOrganizationSchema.ts +7 -0
  261. package/src/api/organizations/services/OrganizationService.ts +75 -0
  262. package/src/api/parameters/services/ParameterProvider.ts +6 -1
  263. package/src/api/users/__tests__/$realm.spec.ts +191 -0
  264. package/src/api/users/__tests__/RealmProvider.spec.ts +53 -0
  265. package/src/api/users/__tests__/SessionService.spec.ts +778 -0
  266. package/src/api/users/{jobs → __tests__}/UserJobs.spec.ts +1 -1
  267. package/src/api/users/atoms/realmAuthSettingsAtom.ts +24 -0
  268. package/src/api/users/controllers/RealmController.ts +5 -11
  269. package/src/api/users/entities/users.ts +9 -3
  270. package/src/api/users/index.ts +23 -3
  271. package/src/api/users/primitives/$realm.ts +23 -11
  272. package/src/api/users/providers/RealmProvider.ts +23 -3
  273. package/src/api/users/services/RegistrationService.ts +3 -2
  274. package/src/api/users/services/SessionService.ts +249 -8
  275. package/src/api/users/services/UserService.ts +1 -1
  276. package/src/api/verifications/{jobs → __tests__}/VerificationJobs.spec.ts +4 -2
  277. package/src/api/verifications/parameters/VerificationParameters.ts +2 -2
  278. package/src/billing/__tests__/BillingService.spec.ts +136 -0
  279. package/src/billing/__tests__/PaymentMethodService.spec.ts +78 -0
  280. package/src/billing/controllers/AdminBillingController.ts +149 -0
  281. package/src/billing/controllers/BillingController.ts +108 -0
  282. package/src/billing/entities/paymentIntents.ts +34 -0
  283. package/src/billing/entities/paymentMethods.ts +24 -0
  284. package/src/billing/entities/refunds.ts +22 -0
  285. package/src/billing/errors/BillingError.ts +5 -0
  286. package/src/billing/index.ts +76 -0
  287. package/src/billing/providers/BillingProvider.ts +79 -0
  288. package/src/billing/providers/MemoryBillingProvider.ts +139 -0
  289. package/src/billing/schemas/intentSchemas.ts +60 -0
  290. package/src/billing/schemas/paymentMethodSchemas.ts +13 -0
  291. package/src/billing/schemas/refundSchemas.ts +6 -0
  292. package/src/billing/services/BillingService.ts +325 -0
  293. package/src/billing/services/PaymentMethodService.ts +82 -0
  294. package/src/bin/index.ts +0 -2
  295. package/src/bucket/providers/LocalFileStorageProvider.ts +2 -2
  296. package/src/cache/core/{primitives → __tests__}/$cache.middleware.spec.ts +1 -1
  297. package/src/cache/core/{providers → __tests__}/MemoryCacheProvider.spec.ts +1 -1
  298. package/src/cache/core/primitives/$cache.ts +2 -2
  299. package/src/cache/redis/providers/RedisCacheProvider.ts +2 -2
  300. package/src/cli/config/defineConfig.ts +20 -0
  301. package/src/cli/core/{services → __tests__}/ProjectScaffolder.spec.ts +1 -1
  302. package/src/cli/core/{commands/gen → __tests__}/changelog.spec.ts +1 -1
  303. package/src/cli/core/{commands → __tests__}/init.spec.ts +4 -12
  304. package/src/cli/core/assets.ts +0 -1
  305. package/src/cli/core/atoms/devOptions.ts +0 -5
  306. package/src/cli/core/commands/build.ts +2 -2
  307. package/src/cli/core/commands/dev.ts +165 -30
  308. package/src/cli/core/commands/gen/changelog.ts +2 -2
  309. package/src/cli/core/commands/init.ts +2 -7
  310. package/src/cli/core/commands/verify.ts +0 -1
  311. package/src/cli/core/providers/AppEntryProvider.ts +2 -2
  312. package/src/cli/core/providers/ViteDevServerProvider.ts +53 -46
  313. package/src/cli/core/services/PackageManagerUtils.ts +8 -3
  314. package/src/cli/core/services/ProjectScaffolder.ts +20 -20
  315. package/src/cli/core/tasks/BuildClientTask.ts +8 -0
  316. package/src/cli/core/tasks/BuildServerTask.ts +17 -4
  317. package/src/cli/core/templates/alephaConfigTs.ts +0 -6
  318. package/src/cli/core/templates/webAdminDashboardTsx.ts +17 -0
  319. package/src/cli/core/templates/webAppRouterTs.ts +85 -2
  320. package/src/cli/devtools/atoms/devtoolsOptions.ts +26 -0
  321. package/src/cli/devtools/index.ts +194 -0
  322. package/src/cli/platform/{adapters → __tests__}/CloudflareAdapter.spec.ts +2 -2
  323. package/src/cli/platform/{providers → __tests__}/GitHubSecretStore.spec.ts +1 -1
  324. package/src/cli/platform/{services → __tests__}/NamingService.spec.ts +1 -1
  325. package/src/cli/platform/{providers → __tests__}/PlatformCacheProvider.spec.ts +1 -1
  326. package/src/cli/platform/{services → __tests__}/PlatformInspector.spec.ts +1 -1
  327. package/src/cli/platform/{services → __tests__}/PlatformOrchestrator.spec.ts +3 -3
  328. package/src/cli/platform/{services → __tests__}/SecretFilterService.spec.ts +1 -1
  329. package/src/cli/platform/{commands → __tests__}/SecretsCommand.spec.ts +1 -1
  330. package/src/cli/platform/{adapters → __tests__}/VercelAdapter.spec.ts +2 -2
  331. package/src/cli/platform/atoms/platformOptions.ts +2 -10
  332. package/src/cli/platform/commands/SecretsCommand.ts +2 -2
  333. package/src/cli/platform/commands/platform.ts +2 -11
  334. package/src/cli/platform/index.ts +34 -11
  335. package/src/cli/platform/services/PlatformInspector.ts +2 -2
  336. package/src/cli/platform/services/PlatformOrchestrator.ts +0 -9
  337. package/src/cli/vendor/__tests__/VendorService.spec.ts +407 -0
  338. package/src/cli/vendor/atoms/vendorOptions.ts +41 -0
  339. package/src/cli/vendor/commands/VendorCommand.ts +204 -0
  340. package/src/cli/vendor/index.ts +43 -0
  341. package/src/cli/vendor/services/VendorService.ts +338 -0
  342. package/src/command/{providers → __tests__}/CliProvider.spec.ts +1 -1
  343. package/src/command/{helpers → __tests__}/EnvUtils.spec.ts +1 -1
  344. package/src/command/providers/CliProvider.ts +2 -2
  345. package/src/core/{primitives → __tests__}/$atom.spec.ts +2 -2
  346. package/src/core/{primitives → __tests__}/$memoize.spec.ts +1 -1
  347. package/src/core/{primitives → __tests__}/$mode.spec.ts +1 -1
  348. package/src/core/{primitives → __tests__}/$pipeline.spec.ts +1 -1
  349. package/src/core/{primitives → __tests__}/$scope.spec.ts +2 -2
  350. package/src/core/{providers → __tests__}/KeylessJsonSchemaCodec.spec.ts +1 -1
  351. package/src/core/{providers → __tests__}/SchemaValidator.spec.ts +1 -1
  352. package/src/core/{helpers → __tests__}/jsonSchemaToTypeBox.spec.ts +1 -1
  353. package/src/core/index.shared.ts +1 -1
  354. package/src/core/primitives/{$use.ts → $state.ts} +4 -4
  355. package/src/crypto/{providers → __tests__}/BrowserCryptoProvider.browser.spec.ts +1 -1
  356. package/src/crypto/{providers → __tests__}/CryptoProvider.spec.ts +1 -1
  357. package/src/datetime/{primitives → __tests__}/$debounce.spec.ts +1 -1
  358. package/src/datetime/{primitives → __tests__}/$throttle.spec.ts +1 -1
  359. package/src/datetime/{primitives → __tests__}/$timeout.spec.ts +1 -1
  360. package/src/email/brevo/{providers → __tests__}/BrevoEmailProvider.spec.ts +1 -1
  361. package/src/email/core/{providers → __tests__}/LocalEmailProvider.spec.ts +39 -150
  362. package/src/email/core/providers/LocalEmailProvider.ts +13 -51
  363. package/src/email/smtp/providers/NodemailerEmailProvider.ts +2 -2
  364. package/src/lock/core/{primitives → __tests__}/$lock.middleware.spec.ts +1 -1
  365. package/src/lock/core/primitives/$lock.ts +2 -2
  366. package/src/logger/index.ts +10 -4
  367. package/src/mcp/transports/SseMcpTransport.ts +2 -2
  368. package/src/orm/__tests__/ModelBuilder-tests.ts +53 -0
  369. package/src/orm/__tests__/ModelBuilder.spec.ts +80 -0
  370. package/src/orm/__tests__/organization-tests.ts +200 -0
  371. package/src/orm/__tests__/organization.spec.ts +103 -0
  372. package/src/orm/core/{providers/drivers → __tests__}/BunSqliteProvider.bun.spec.ts +5 -2
  373. package/src/orm/core/constants/PG_SYMBOLS.ts +2 -0
  374. package/src/orm/core/index.shared.ts +1 -0
  375. package/src/orm/core/primitives/$entity.ts +31 -0
  376. package/src/orm/core/providers/DatabaseTypeProvider.ts +11 -0
  377. package/src/orm/core/providers/DrizzleKitProvider.ts +1 -1
  378. package/src/orm/core/providers/drivers/BunSqliteProvider.ts +2 -2
  379. package/src/orm/core/providers/drivers/NodeSqliteProvider.ts +3 -3
  380. package/src/orm/core/services/ModelBuilder.ts +11 -0
  381. package/src/orm/core/services/QueryManager.ts +16 -2
  382. package/src/orm/core/services/Repository.ts +70 -10
  383. package/src/orm/postgres/{providers → __tests__}/BunPostgresProvider.bun.spec.ts +1 -1
  384. package/src/orm/postgres/services/PostgresModelBuilder.ts +9 -1
  385. package/src/queue/core/providers/WorkerProvider.ts +2 -2
  386. package/src/queue/redis/providers/RedisQueueProvider.ts +2 -2
  387. package/src/react/core/{hooks → __tests__}/useAction.browser.spec.tsx +1 -1
  388. package/src/react/core/hooks/useAction.ts +7 -6
  389. package/src/react/head/{providers → __tests__}/BrowserHeadProvider.browser.spec.ts +1 -1
  390. package/src/react/head/{helpers → __tests__}/SeoExpander.spec.ts +1 -1
  391. package/src/react/i18n/{providers → __tests__}/I18nProvider.spec.ts +1 -1
  392. package/src/react/i18n/{hooks → __tests__}/useI18n.browser.spec.tsx +1 -1
  393. package/src/react/intro/components/GettingStartedDevtoolsSlide.tsx +3 -6
  394. package/src/react/router/{providers → __tests__}/ReactBrowserProvider.browser.spec.ts +1 -1
  395. package/src/react/router/providers/ReactBrowserProvider.ts +2 -2
  396. package/src/react/router/providers/ReactPageProvider.ts +2 -2
  397. package/src/react/router/providers/ReactServerProvider.ts +3 -3
  398. package/src/redis/{providers → __tests__}/BunRedisProvider.bun.spec.ts +4 -4
  399. package/src/retry/{primitives → __tests__}/$retry.middleware.spec.ts +1 -1
  400. package/src/router/{TemplatedPathParser.spec.ts → __tests__/TemplatedPathParser.spec.ts} +1 -1
  401. package/src/scheduler/primitives/$scheduler.ts +2 -2
  402. package/src/security/{primitives → __tests__}/$secure-browser.spec.ts +1 -1
  403. package/src/security/{primitives → __tests__}/$secure.spec.ts +1 -1
  404. package/src/security/primitives/$issuer.ts +1 -1
  405. package/src/security/providers/JwtProvider.ts +6 -10
  406. package/src/security/providers/SecurityProvider.ts +6 -11
  407. package/src/security/schemas/userAccountInfoSchema.ts +3 -3
  408. package/src/server/auth/providers/ServerAuthProvider.ts +24 -2
  409. package/src/server/cookies/{services → __tests__}/CookieParser.spec.ts +1 -1
  410. package/src/server/core/{primitives → __tests__}/$circuit.spec.ts +1 -1
  411. package/src/server/core/{providers → __tests__}/NodeHttpServerProvider.spec.ts +1 -1
  412. package/src/server/core/{providers → __tests__}/ServerBodyParserProvider.spec.ts +31 -1
  413. package/src/server/core/{providers → __tests__}/ServerCompressProvider.spec.ts +1 -1
  414. package/src/server/core/{providers → __tests__}/ServerHelmetProvider.spec.ts +4 -1
  415. package/src/server/core/{providers → __tests__}/ServerMultipartProvider.spec.ts +1 -1
  416. package/src/server/core/{services → __tests__}/ServerRequestParser.spec.ts +1 -1
  417. package/src/server/core/primitives/$action.ts +2 -2
  418. package/src/server/core/primitives/$sse.ts +2 -2
  419. package/src/server/core/providers/ServerBodyParserProvider.ts +21 -12
  420. package/src/server/core/providers/ServerCompressProvider.ts +2 -2
  421. package/src/server/core/providers/ServerHelmetProvider.ts +2 -2
  422. package/src/server/core/providers/ServerMultipartProvider.ts +2 -2
  423. package/src/server/core/providers/ServerRouterProvider.ts +1 -5
  424. package/src/server/cors/{primitives → __tests__}/$cors.spec.ts +1 -1
  425. package/src/server/cors/providers/ServerCorsProvider.ts +2 -2
  426. package/src/server/links/{services → __tests__}/BatchCollector.spec.ts +1 -1
  427. package/src/server/links/providers/LinkProvider.ts +2 -2
  428. package/src/server/links/providers/RemotePrimitiveProvider.ts +2 -2
  429. package/src/server/links/providers/ServerLinksProvider.ts +2 -2
  430. package/src/server/rate-limit/{primitives → __tests__}/$rateLimit.spec.ts +1 -1
  431. package/src/server/rate-limit/providers/ServerRateLimitProvider.ts +2 -2
  432. package/src/server/swagger/providers/ServerSwaggerProvider.ts +2 -2
  433. package/src/sms/{providers → __tests__}/LocalSmsProvider.spec.ts +35 -29
  434. package/src/sms/providers/LocalSmsProvider.ts +13 -24
  435. package/src/system/{providers → __tests__}/MemoryFileSystemProvider.spec.ts +1 -1
  436. package/src/system/{providers → __tests__}/MemoryShellProvider.spec.ts +1 -1
  437. package/src/topic/redis/providers/RedisTopicProvider.ts +2 -2
  438. package/src/websocket/{services → __tests__}/RoomManager.spec.ts +1 -1
  439. package/src/websocket/providers/NodeWebSocketServerProvider.ts +2 -2
  440. package/tsconfig.base.json +1 -0
  441. package/assets/devtools-ui/200.html +0 -10
  442. package/assets/devtools-ui/200.html.br +0 -0
  443. package/assets/devtools-ui/404.html +0 -10
  444. package/assets/devtools-ui/404.html.br +0 -0
  445. package/assets/devtools-ui/CNAME +0 -1
  446. package/assets/devtools-ui/asset.CHpVij2M.css +0 -1
  447. package/assets/devtools-ui/asset.CHpVij2M.css.br +0 -0
  448. package/assets/devtools-ui/asset.DJ-i0UDz.css +0 -1
  449. package/assets/devtools-ui/asset.DJ-i0UDz.css.br +0 -0
  450. package/assets/devtools-ui/chunk.1jwpJORo.js +0 -1
  451. package/assets/devtools-ui/chunk.1jwpJORo.js.br +0 -0
  452. package/assets/devtools-ui/chunk.B0r2wfUL.js +0 -1
  453. package/assets/devtools-ui/chunk.B0r2wfUL.js.br +0 -0
  454. package/assets/devtools-ui/chunk.BScN4dVR.js +0 -84
  455. package/assets/devtools-ui/chunk.BScN4dVR.js.br +0 -0
  456. package/assets/devtools-ui/chunk.BispuoY4.js +0 -1
  457. package/assets/devtools-ui/chunk.BispuoY4.js.br +0 -0
  458. package/assets/devtools-ui/chunk.BtrPUUd7.js +0 -2
  459. package/assets/devtools-ui/chunk.BtrPUUd7.js.br +0 -0
  460. package/assets/devtools-ui/chunk.C-KMHgqf.js +0 -1
  461. package/assets/devtools-ui/chunk.C-KMHgqf.js.br +0 -0
  462. package/assets/devtools-ui/chunk.C2zQ3CF6.js +0 -7
  463. package/assets/devtools-ui/chunk.C2zQ3CF6.js.br +0 -0
  464. package/assets/devtools-ui/chunk.C619McpO.js +0 -1
  465. package/assets/devtools-ui/chunk.C619McpO.js.br +0 -0
  466. package/assets/devtools-ui/chunk.C9OsYsVl.js +0 -1
  467. package/assets/devtools-ui/chunk.C9OsYsVl.js.br +0 -3
  468. package/assets/devtools-ui/chunk.CAC_-151.js +0 -1
  469. package/assets/devtools-ui/chunk.CAC_-151.js.br +0 -0
  470. package/assets/devtools-ui/chunk.CCmesWfx.js +0 -1
  471. package/assets/devtools-ui/chunk.CCmesWfx.js.br +0 -0
  472. package/assets/devtools-ui/chunk.CFQDmrcV.js +0 -1
  473. package/assets/devtools-ui/chunk.CFQDmrcV.js.br +0 -0
  474. package/assets/devtools-ui/chunk.CgM71Zau.js +0 -1
  475. package/assets/devtools-ui/chunk.CgM71Zau.js.br +0 -0
  476. package/assets/devtools-ui/chunk.CmHq336a.js +0 -1
  477. package/assets/devtools-ui/chunk.CmHq336a.js.br +0 -0
  478. package/assets/devtools-ui/chunk.CthNMCar.js +0 -1
  479. package/assets/devtools-ui/chunk.CthNMCar.js.br +0 -0
  480. package/assets/devtools-ui/chunk.D2brVJP1.js +0 -1
  481. package/assets/devtools-ui/chunk.D2brVJP1.js.br +0 -0
  482. package/assets/devtools-ui/chunk.DgBKGkiw.js +0 -1
  483. package/assets/devtools-ui/chunk.DgBKGkiw.js.br +0 -0
  484. package/assets/devtools-ui/chunk.NNHHCQsa.js +0 -1
  485. package/assets/devtools-ui/chunk.NNHHCQsa.js.br +0 -0
  486. package/assets/devtools-ui/chunk._CDKKWMo.js +0 -1
  487. package/assets/devtools-ui/chunk._CDKKWMo.js.br +0 -0
  488. package/assets/devtools-ui/entry.B_nOjAod.js +0 -2
  489. package/assets/devtools-ui/entry.B_nOjAod.js.br +0 -0
  490. package/assets/devtools-ui/index.html +0 -10
  491. package/assets/devtools-ui/index.html.br +0 -0
  492. package/dist/devtools/index.browser.js +0 -224
  493. package/dist/devtools/index.browser.js.map +0 -1
  494. package/dist/devtools/index.d.ts +0 -499
  495. package/dist/devtools/index.d.ts.map +0 -1
  496. package/dist/devtools/index.js +0 -782
  497. package/dist/devtools/index.js.map +0 -1
  498. package/dist/mqtt/index.d.ts +0 -164
  499. package/dist/mqtt/index.d.ts.map +0 -1
  500. package/dist/mqtt/index.js +0 -214
  501. package/dist/mqtt/index.js.map +0 -1
  502. package/dist/topic/mqtt/index.d.ts +0 -87
  503. package/dist/topic/mqtt/index.d.ts.map +0 -1
  504. package/dist/topic/mqtt/index.js +0 -88
  505. package/dist/topic/mqtt/index.js.map +0 -1
  506. package/src/api/users/parameters/UserParameters.ts +0 -23
  507. package/src/api/users/services/SessionService.spec.ts +0 -303
  508. package/src/cli/platform/adapters/DockerAdapter.spec.ts +0 -378
  509. package/src/cli/platform/adapters/DockerAdapter.ts +0 -417
  510. package/src/cli/platform/services/DockerComposeGenerator.spec.ts +0 -490
  511. package/src/cli/platform/services/DockerComposeGenerator.ts +0 -353
  512. package/src/cli/platform/services/DockerSshService.spec.ts +0 -47
  513. package/src/cli/platform/services/DockerSshService.ts +0 -61
  514. package/src/devtools/__tests__/DevCollectorProvider.spec.ts +0 -7
  515. package/src/devtools/assets.ts +0 -6
  516. package/src/devtools/entities/logs.ts +0 -21
  517. package/src/devtools/index.browser.ts +0 -11
  518. package/src/devtools/index.shared.ts +0 -15
  519. package/src/devtools/index.ts +0 -39
  520. package/src/devtools/providers/DevToolsMetadataProvider.ts +0 -459
  521. package/src/devtools/providers/DevToolsProvider.ts +0 -280
  522. package/src/devtools/schemas/DevActionMetadata.ts +0 -30
  523. package/src/devtools/schemas/DevAtomMetadata.ts +0 -26
  524. package/src/devtools/schemas/DevBucketMetadata.ts +0 -11
  525. package/src/devtools/schemas/DevCacheMetadata.ts +0 -10
  526. package/src/devtools/schemas/DevEntityMetadata.ts +0 -60
  527. package/src/devtools/schemas/DevEnvMetadata.ts +0 -22
  528. package/src/devtools/schemas/DevMetadata.ts +0 -47
  529. package/src/devtools/schemas/DevModuleMetadata.ts +0 -8
  530. package/src/devtools/schemas/DevPageMetadata.ts +0 -24
  531. package/src/devtools/schemas/DevProviderMetadata.ts +0 -10
  532. package/src/devtools/schemas/DevQueueMetadata.ts +0 -10
  533. package/src/devtools/schemas/DevRealmMetadata.ts +0 -19
  534. package/src/devtools/schemas/DevRouteMetadata.ts +0 -8
  535. package/src/devtools/schemas/DevSchedulerMetadata.ts +0 -11
  536. package/src/devtools/schemas/DevTopicMetadata.ts +0 -11
  537. package/src/mqtt/index.ts +0 -32
  538. package/src/mqtt/providers/MqttClientProvider.ts +0 -63
  539. package/src/mqtt/providers/MqttJsClientProvider.spec.ts +0 -165
  540. package/src/mqtt/providers/MqttJsClientProvider.ts +0 -309
  541. package/src/topic/mqtt/index.ts +0 -30
  542. package/src/topic/mqtt/providers/MqttTopicProvider.spec.ts +0 -160
  543. package/src/topic/mqtt/providers/MqttTopicProvider.ts +0 -146
  544. /package/src/api/audits/{primitives → __tests__}/$audit.spec.ts +0 -0
  545. /package/src/api/audits/{services → __tests__}/AuditService.spec.ts +0 -0
  546. /package/src/api/files/{controllers → __tests__}/AdminFileStatsController.spec.ts +0 -0
  547. /package/src/api/files/{jobs → __tests__}/FileJobs.spec.ts +0 -0
  548. /package/src/api/jobs/{primitives → __tests__}/$job-middleware.spec.ts +0 -0
  549. /package/src/api/parameters/{primitives → __tests__}/$parameter.spec.ts +0 -0
  550. /package/src/api/users/{controllers → __tests__}/AdminIdentityController.spec.ts +0 -0
  551. /package/src/api/users/{controllers → __tests__}/AdminSessionController.spec.ts +0 -0
  552. /package/src/api/users/{controllers → __tests__}/AdminUserController.spec.ts +0 -0
  553. /package/src/api/users/{services → __tests__}/CredentialService.spec.ts +0 -0
  554. /package/src/api/users/{services → __tests__}/RegistrationService.spec.ts +0 -0
  555. /package/src/batch/{primitives → __tests__}/$batch.spec.ts +0 -0
  556. /package/src/batch/{providers → __tests__}/BatchProvider.spec.ts +0 -0
  557. /package/src/bucket/{primitives → __tests__}/$bucket.spec.ts +0 -0
  558. /package/src/bucket/{providers → __tests__}/FileStorageProvider.spec.ts +0 -0
  559. /package/src/bucket/{providers → __tests__}/LocalFileStorageProvider.spec.ts +0 -0
  560. /package/src/bucket/{providers → __tests__}/MemoryFileStorageProvider.spec.ts +0 -0
  561. /package/src/cache/core/{primitives → __tests__}/$cache.spec.ts +0 -0
  562. /package/src/cache/redis/{providers → __tests__}/RedisCacheProvider.spec.ts +0 -0
  563. /package/src/command/{primitives → __tests__}/$command.spec.ts +0 -0
  564. /package/src/command/{helpers → __tests__}/Asker.spec.ts +0 -0
  565. /package/src/command/{helpers → __tests__}/Runner.spec.ts +0 -0
  566. /package/src/core/{primitives → __tests__}/$context.spec.ts +0 -0
  567. /package/src/core/{primitives → __tests__}/$env.spec.ts +0 -0
  568. /package/src/core/{primitives → __tests__}/$hook.spec.ts +0 -0
  569. /package/src/core/{primitives → __tests__}/$inject.spec.ts +0 -0
  570. /package/src/core/{primitives → __tests__}/$module.spec.ts +0 -0
  571. /package/src/core/{providers → __tests__}/CodecManager.spec.ts +0 -0
  572. /package/src/core/{providers → __tests__}/EventManager.spec.ts +0 -0
  573. /package/src/core/{providers → __tests__}/StateManager.spec.ts +0 -0
  574. /package/src/core/{providers → __tests__}/TypeProvider.spec.ts +0 -0
  575. /package/src/datetime/{primitives → __tests__}/$interval.spec.ts +0 -0
  576. /package/src/datetime/{providers → __tests__}/DateTimeProvider.spec.ts +0 -0
  577. /package/src/email/core/{primitives → __tests__}/$email.spec.ts +0 -0
  578. /package/src/fake/{providers → __tests__}/FakeProvider.spec.ts +0 -0
  579. /package/src/lock/core/{providers → __tests__}/MemoryLockProvider.spec.ts +0 -0
  580. /package/src/lock/redis/{providers → __tests__}/RedisLockProvider.spec.ts +0 -0
  581. /package/src/logger/{primitives → __tests__}/$logger.spec.ts +0 -0
  582. /package/src/logger/{services → __tests__}/Logger.spec.ts +0 -0
  583. /package/src/mcp/{primitives → __tests__}/$prompt.spec.ts +0 -0
  584. /package/src/mcp/{primitives → __tests__}/$resource.spec.ts +0 -0
  585. /package/src/mcp/{primitives → __tests__}/$tool.spec.ts +0 -0
  586. /package/src/mcp/{providers → __tests__}/McpServerProvider.spec.ts +0 -0
  587. /package/src/mcp/{helpers → __tests__}/jsonrpc.spec.ts +0 -0
  588. /package/src/orm/core/{helpers → __tests__}/parseQueryString.spec.ts +0 -0
  589. /package/src/queue/core/{primitives → __tests__}/$consumer.spec.ts +0 -0
  590. /package/src/queue/core/{providers → __tests__}/MemoryQueueProvider.spec.ts +0 -0
  591. /package/src/queue/core/{providers → __tests__}/WorkerProvider.spec.ts +0 -0
  592. /package/src/queue/redis/{providers → __tests__}/RedisQueueProvider.spec.ts +0 -0
  593. /package/src/react/form/{hooks → __tests__}/useForm.browser.spec.tsx +0 -0
  594. /package/src/react/head/{hooks → __tests__}/useHead.spec.tsx +0 -0
  595. /package/src/react/i18n/{components → __tests__}/Localize.spec.tsx +0 -0
  596. /package/src/react/router/{primitives → __tests__}/$page.browser.spec.tsx +0 -0
  597. /package/src/react/router/{primitives → __tests__}/$page.middleware.spec.tsx +0 -0
  598. /package/src/react/router/{primitives → __tests__}/$page.spec.tsx +0 -0
  599. /package/src/react/router/{providers → __tests__}/ReactPreloadProvider.spec.ts +0 -0
  600. /package/src/react/router/{providers → __tests__}/ReactServerProvider.spec.tsx +0 -0
  601. /package/src/react/router/{providers → __tests__}/ReactServerTemplateProvider.spec.ts +0 -0
  602. /package/src/retry/{primitives → __tests__}/$retry.spec.ts +0 -0
  603. /package/src/retry/{providers → __tests__}/RetryProvider.spec.ts +0 -0
  604. /package/src/router/{providers → __tests__}/RouterProvider.spec.ts +0 -0
  605. /package/src/security/{primitives → __tests__}/$issuer.spec.ts +0 -0
  606. /package/src/security/{primitives → __tests__}/$permission.spec.ts +0 -0
  607. /package/src/security/{primitives → __tests__}/$role.spec.ts +0 -0
  608. /package/src/security/{primitives → __tests__}/$serviceAccount.spec.ts +0 -0
  609. /package/src/security/{providers → __tests__}/SecurityProvider.spec.ts +0 -0
  610. /package/src/server/cookies/{providers → __tests__}/ServerCookiesProvider.spec.ts +0 -0
  611. /package/src/server/core/{primitives → __tests__}/$action.spec.ts +0 -0
  612. /package/src/server/core/{primitives → __tests__}/$middleware.spec.ts +0 -0
  613. /package/src/server/core/{primitives → __tests__}/$route.spec.ts +0 -0
  614. /package/src/server/core/{primitives → __tests__}/$sse.spec.ts +0 -0
  615. /package/src/server/core/{providers → __tests__}/BunHttpServerProvider.bun.spec.ts +0 -0
  616. /package/src/server/core/{services → __tests__}/HttpClient.spec.ts +0 -0
  617. /package/src/server/core/{providers → __tests__}/ServerLoggerProvider.spec.ts +0 -0
  618. /package/src/server/core/{services → __tests__}/UserAgentParser.spec.ts +0 -0
  619. /package/src/server/cors/{providers → __tests__}/ServerCorsProvider.spec.ts +0 -0
  620. /package/src/server/etag/{providers → __tests__}/ServerEtagProvider.spec.ts +0 -0
  621. /package/src/server/health/{providers → __tests__}/ServerHealthProvider.spec.ts +0 -0
  622. /package/src/server/links/{primitives → __tests__}/$remote.spec.ts +0 -0
  623. /package/src/server/links/{services → __tests__}/BatchEndpoint.spec.ts +0 -0
  624. /package/src/server/links/{providers → __tests__}/LinkProvider.spec.ts +0 -0
  625. /package/src/server/links/{providers → __tests__}/ServerLinksProvider.spec.ts +0 -0
  626. /package/src/server/metrics/{providers → __tests__}/ServerMetricsProvider.spec.ts +0 -0
  627. /package/src/server/proxy/{primitives → __tests__}/$proxy.spec.ts +0 -0
  628. /package/src/server/rate-limit/{providers → __tests__}/ServerRateLimitProvider.spec.ts +0 -0
  629. /package/src/server/static/{primitives → __tests__}/$serve.spec.ts +0 -0
  630. /package/src/server/swagger/{primitives → __tests__}/$swagger.spec.ts +0 -0
  631. /package/src/sms/{primitives → __tests__}/$sms.spec.ts +0 -0
  632. /package/src/sms/{providers → __tests__}/MemorySmsProvider.spec.ts +0 -0
  633. /package/src/system/{services → __tests__}/FileDetector.spec.ts +0 -0
  634. /package/src/system/{providers → __tests__}/NodeFileSystemProvider.spec.ts +0 -0
  635. /package/src/topic/core/{primitives → __tests__}/$subscriber.spec.ts +0 -0
  636. /package/src/topic/core/{providers → __tests__}/MemoryTopicProvider.spec.ts +0 -0
  637. /package/src/topic/redis/{providers → __tests__}/RedisTopicProvider.spec.ts +0 -0
  638. /package/src/websocket/{primitives → __tests__}/$channel.spec.ts +0 -0
@@ -0,0 +1,79 @@
1
+ import type { PaymentIntentEntity } from "../entities/paymentIntents.ts";
2
+
3
+ export interface CreateSessionResult {
4
+ url: string;
5
+ providerRef: string;
6
+ }
7
+
8
+ export interface RefundResult {
9
+ providerRef: string;
10
+ }
11
+
12
+ export interface WebhookEvent {
13
+ providerRef: string;
14
+ status: string;
15
+ raw: unknown;
16
+ }
17
+
18
+ export interface CreatePaymentMethodResult {
19
+ providerRef: string;
20
+ type: string;
21
+ brand?: string;
22
+ last4?: string;
23
+ expMonth?: number;
24
+ expYear?: number;
25
+ }
26
+
27
+ export abstract class BillingProvider {
28
+ /**
29
+ * Create a checkout session with the PSP.
30
+ * Returns a URL to redirect the user to, and the PSP's reference ID.
31
+ */
32
+ abstract createSession(
33
+ intent: PaymentIntentEntity,
34
+ options: { returnUrl: string; authorize?: boolean },
35
+ ): Promise<CreateSessionResult>;
36
+
37
+ /**
38
+ * Capture a previously authorized payment.
39
+ * Amount can differ from the original authorization (partial capture).
40
+ */
41
+ abstract capturePayment(providerRef: string, amount: number): Promise<void>;
42
+
43
+ /**
44
+ * Void/cancel a previously authorized payment before capture.
45
+ */
46
+ abstract voidPayment(providerRef: string): Promise<void>;
47
+
48
+ /**
49
+ * Refund a captured payment (partial or full).
50
+ */
51
+ abstract refundPayment(
52
+ providerRef: string,
53
+ amount: number,
54
+ ): Promise<RefundResult>;
55
+
56
+ /**
57
+ * Parse an incoming PSP webhook request into a normalized event.
58
+ */
59
+ abstract parseWebhook(request: Request): Promise<WebhookEvent>;
60
+
61
+ /**
62
+ * Store a payment method token with the PSP.
63
+ */
64
+ abstract createPaymentMethod(
65
+ userId: string,
66
+ token: string,
67
+ ): Promise<CreatePaymentMethodResult>;
68
+
69
+ /**
70
+ * Delete a stored payment method from the PSP.
71
+ */
72
+ abstract deletePaymentMethod(providerRef: string): Promise<void>;
73
+
74
+ /**
75
+ * Expire/cancel a checkout session on the PSP side.
76
+ * Called during stale session cleanup.
77
+ */
78
+ abstract expireSession(providerRef: string): Promise<void>;
79
+ }
@@ -0,0 +1,139 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import type { PaymentIntentEntity } from "../entities/paymentIntents.ts";
3
+ import type {
4
+ BillingProvider,
5
+ CreatePaymentMethodResult,
6
+ CreateSessionResult,
7
+ RefundResult,
8
+ WebhookEvent,
9
+ } from "./BillingProvider.ts";
10
+
11
+ interface MemoryCharge {
12
+ providerRef: string;
13
+ amount: number;
14
+ status: string;
15
+ }
16
+
17
+ interface MemoryRefund {
18
+ providerRef: string;
19
+ chargeRef: string;
20
+ amount: number;
21
+ }
22
+
23
+ export class MemoryBillingProvider implements BillingProvider {
24
+ protected readonly charges: Map<string, MemoryCharge> = new Map();
25
+ protected readonly refundRecords: Map<string, MemoryRefund> = new Map();
26
+ protected readonly methods: Map<string, CreatePaymentMethodResult> =
27
+ new Map();
28
+ protected readonly expiredSessions: Set<string> = new Set();
29
+
30
+ public async createSession(
31
+ intent: PaymentIntentEntity,
32
+ options: { returnUrl: string; authorize?: boolean },
33
+ ): Promise<CreateSessionResult> {
34
+ const providerRef = `mem_session_${randomUUID()}`;
35
+ const status = options.authorize ? "authorized" : "captured";
36
+ this.charges.set(providerRef, {
37
+ providerRef,
38
+ amount: intent.amount,
39
+ status,
40
+ });
41
+ return {
42
+ url: `/billing/mock-checkout/${intent.id}`,
43
+ providerRef,
44
+ };
45
+ }
46
+
47
+ public async capturePayment(
48
+ providerRef: string,
49
+ amount: number,
50
+ ): Promise<void> {
51
+ const charge = this.charges.get(providerRef);
52
+ if (charge) {
53
+ charge.status = "captured";
54
+ charge.amount = amount;
55
+ }
56
+ }
57
+
58
+ public async voidPayment(providerRef: string): Promise<void> {
59
+ const charge = this.charges.get(providerRef);
60
+ if (charge) {
61
+ charge.status = "voided";
62
+ }
63
+ }
64
+
65
+ public async refundPayment(
66
+ providerRef: string,
67
+ amount: number,
68
+ ): Promise<RefundResult> {
69
+ const refundRef = `mem_refund_${randomUUID()}`;
70
+ this.refundRecords.set(refundRef, {
71
+ providerRef: refundRef,
72
+ chargeRef: providerRef,
73
+ amount,
74
+ });
75
+ return { providerRef: refundRef };
76
+ }
77
+
78
+ public async parseWebhook(request: Request): Promise<WebhookEvent> {
79
+ const body = (await request.json()) as {
80
+ providerRef: string;
81
+ status: string;
82
+ };
83
+ return {
84
+ providerRef: body.providerRef,
85
+ status: body.status,
86
+ raw: body,
87
+ };
88
+ }
89
+
90
+ public async createPaymentMethod(
91
+ userId: string,
92
+ token: string,
93
+ ): Promise<CreatePaymentMethodResult> {
94
+ const providerRef = `mem_pm_${randomUUID()}`;
95
+ const result: CreatePaymentMethodResult = {
96
+ providerRef,
97
+ type: "card",
98
+ brand: "visa",
99
+ last4: "4242",
100
+ expMonth: 12,
101
+ expYear: 2030,
102
+ };
103
+ this.methods.set(providerRef, result);
104
+ return result;
105
+ }
106
+
107
+ public async deletePaymentMethod(providerRef: string): Promise<void> {
108
+ this.methods.delete(providerRef);
109
+ }
110
+
111
+ public async expireSession(providerRef: string): Promise<void> {
112
+ this.expiredSessions.add(providerRef);
113
+ }
114
+
115
+ // --- Test assertion helpers ---
116
+
117
+ public wasCharged(providerRef: string): boolean {
118
+ const charge = this.charges.get(providerRef);
119
+ return charge?.status === "captured";
120
+ }
121
+
122
+ public wasRefunded(providerRef: string): boolean {
123
+ return Array.from(this.refundRecords.values()).some(
124
+ (r) => r.chargeRef === providerRef,
125
+ );
126
+ }
127
+
128
+ public wasExpired(providerRef: string): boolean {
129
+ return this.expiredSessions.has(providerRef);
130
+ }
131
+
132
+ public getCharges(): MemoryCharge[] {
133
+ return Array.from(this.charges.values());
134
+ }
135
+
136
+ public getRefunds(): MemoryRefund[] {
137
+ return Array.from(this.refundRecords.values());
138
+ }
139
+ }
@@ -0,0 +1,60 @@
1
+ import type { Static } from "alepha";
2
+ import { t } from "alepha";
3
+ import { pageQuerySchema } from "alepha/orm";
4
+ import { paymentIntents } from "../entities/paymentIntents.ts";
5
+
6
+ export const createIntentSchema = t.object({
7
+ amount: t.integer({ minimum: 1 }),
8
+ currency: t.text({ size: "short" }),
9
+ metadata: t.optional(t.json()),
10
+ paymentMethodId: t.optional(t.uuid()),
11
+ });
12
+
13
+ export type CreateIntent = Static<typeof createIntentSchema>;
14
+
15
+ export const createCheckoutSchema = t.object({
16
+ intentId: t.uuid(),
17
+ returnUrl: t.text(),
18
+ authorize: t.optional(t.boolean()),
19
+ });
20
+
21
+ export type CreateCheckout = Static<typeof createCheckoutSchema>;
22
+
23
+ export const checkoutResponseSchema = t.object({
24
+ url: t.text(),
25
+ intentId: t.text(),
26
+ });
27
+
28
+ export type CheckoutResponse = Static<typeof checkoutResponseSchema>;
29
+
30
+ export const captureIntentSchema = t.object({
31
+ amount: t.optional(t.integer({ minimum: 1 })),
32
+ });
33
+
34
+ export type CaptureIntent = Static<typeof captureIntentSchema>;
35
+
36
+ export const refundIntentSchema = t.object({
37
+ amount: t.integer({ minimum: 1 }),
38
+ reason: t.optional(t.text()),
39
+ });
40
+
41
+ export type RefundIntent = Static<typeof refundIntentSchema>;
42
+
43
+ export const recordCashSchema = t.object({
44
+ amount: t.integer({ minimum: 1 }),
45
+ currency: t.text({ size: "short" }),
46
+ metadata: t.optional(t.json()),
47
+ });
48
+
49
+ export type RecordCash = Static<typeof recordCashSchema>;
50
+
51
+ export const intentQuerySchema = t.extend(pageQuerySchema, {
52
+ status: t.optional(t.text({ description: "Filter by status" })),
53
+ userId: t.optional(t.uuid({ description: "Filter by user ID" })),
54
+ });
55
+
56
+ export type IntentQuery = Static<typeof intentQuerySchema>;
57
+
58
+ export const intentResourceSchema = paymentIntents.schema;
59
+
60
+ export type IntentResource = Static<typeof intentResourceSchema>;
@@ -0,0 +1,13 @@
1
+ import type { Static } from "alepha";
2
+ import { t } from "alepha";
3
+ import { paymentMethods } from "../entities/paymentMethods.ts";
4
+
5
+ export const addPaymentMethodSchema = t.object({
6
+ token: t.text(),
7
+ });
8
+
9
+ export type AddPaymentMethod = Static<typeof addPaymentMethodSchema>;
10
+
11
+ export const paymentMethodResourceSchema = paymentMethods.schema;
12
+
13
+ export type PaymentMethodResource = Static<typeof paymentMethodResourceSchema>;
@@ -0,0 +1,6 @@
1
+ import type { Static } from "alepha";
2
+ import { refunds } from "../entities/refunds.ts";
3
+
4
+ export const refundResourceSchema = refunds.schema;
5
+
6
+ export type RefundResource = Static<typeof refundResourceSchema>;
@@ -0,0 +1,325 @@
1
+ import { $inject, Alepha } from "alepha";
2
+ import { $job } from "alepha/api/jobs";
3
+ import { DateTimeProvider } from "alepha/datetime";
4
+ import { $logger } from "alepha/logger";
5
+ import { $repository } from "alepha/orm";
6
+ import {
7
+ type PaymentIntentEntity,
8
+ paymentIntents,
9
+ } from "../entities/paymentIntents.ts";
10
+ import { type RefundEntity, refunds } from "../entities/refunds.ts";
11
+ import { BillingError } from "../errors/BillingError.ts";
12
+ import { BillingProvider } from "../providers/BillingProvider.ts";
13
+
14
+ export class BillingService {
15
+ protected readonly alepha = $inject(Alepha);
16
+ protected readonly log = $logger();
17
+ protected readonly dateTime = $inject(DateTimeProvider);
18
+ protected readonly provider = $inject(BillingProvider);
19
+ protected readonly intentRepo = $repository(paymentIntents);
20
+ protected readonly refundRepo = $repository(refunds);
21
+
22
+ /**
23
+ * Expires stale payment intents that have been in "processing" status
24
+ * for more than 30 minutes. Runs every 15 minutes.
25
+ */
26
+ protected readonly expireStaleIntents = $job({
27
+ cron: "*/15 * * * *",
28
+ handler: async () => {
29
+ const cutoff = this.dateTime.now().subtract(30, "minutes").toISOString();
30
+
31
+ const stale = await this.intentRepo.findMany({
32
+ where: { status: { eq: "processing" }, createdAt: { lt: cutoff } },
33
+ });
34
+
35
+ for (const intent of stale) {
36
+ if (intent.providerRef) {
37
+ try {
38
+ await this.provider.expireSession(intent.providerRef);
39
+ } catch (error) {
40
+ this.log.warn(
41
+ `Failed to expire session for intent ${intent.id}`,
42
+ error,
43
+ );
44
+ }
45
+ }
46
+ await this.intentRepo.updateById(intent.id, { status: "expired" });
47
+ this.log.info(`Expired stale intent ${intent.id}`);
48
+ }
49
+ },
50
+ });
51
+
52
+ /**
53
+ * Create a new payment intent in "created" status.
54
+ */
55
+ public async createIntent(
56
+ amount: number,
57
+ currency: string,
58
+ metadata?: unknown,
59
+ options?: { paymentMethodId?: string; userId?: string },
60
+ ): Promise<PaymentIntentEntity> {
61
+ return await this.intentRepo.create({
62
+ amount,
63
+ currency,
64
+ status: "created",
65
+ metadata: metadata as any,
66
+ paymentMethodId: options?.paymentMethodId,
67
+ userId: options?.userId,
68
+ });
69
+ }
70
+
71
+ /**
72
+ * Create a checkout session with the payment provider and
73
+ * transition the intent to "processing".
74
+ */
75
+ public async createSession(
76
+ intentId: string,
77
+ returnUrl: string,
78
+ authorize?: boolean,
79
+ ): Promise<{ url: string; intentId: string }> {
80
+ const intent = await this.getIntent(intentId);
81
+ this.assertStatus(intent, "created", "createSession");
82
+
83
+ const result = await this.provider.createSession(intent, {
84
+ returnUrl,
85
+ authorize,
86
+ });
87
+
88
+ await this.intentRepo.updateById(intent.id, {
89
+ status: "processing",
90
+ providerRef: result.providerRef,
91
+ });
92
+
93
+ return { url: result.url, intentId: intent.id };
94
+ }
95
+
96
+ /**
97
+ * Handle an incoming webhook from the payment provider.
98
+ */
99
+ public async handleWebhook(request: Request): Promise<void> {
100
+ const event = await this.provider.parseWebhook(request);
101
+ const intents = await this.intentRepo.findMany({
102
+ where: { providerRef: { eq: event.providerRef } },
103
+ limit: 1,
104
+ });
105
+
106
+ if (intents.length === 0) {
107
+ this.log.warn(`Webhook for unknown providerRef: ${event.providerRef}`);
108
+ return;
109
+ }
110
+
111
+ const intent = intents[0];
112
+ await this.handleWebhookEvent(intent.id, event.status, event.raw);
113
+ }
114
+
115
+ /**
116
+ * Process a webhook event by updating the intent status and emitting
117
+ * the corresponding billing event.
118
+ */
119
+ public async handleWebhookEvent(
120
+ intentId: string,
121
+ status: string,
122
+ raw?: unknown,
123
+ ): Promise<void> {
124
+ const intent = await this.getIntent(intentId);
125
+
126
+ const eventMap = {
127
+ authorized: "billing:authorized",
128
+ captured: "billing:captured",
129
+ failed: "billing:failed",
130
+ } as const;
131
+
132
+ type WebhookStatus = keyof typeof eventMap;
133
+ if (!(status in eventMap)) {
134
+ this.log.warn(`Unknown webhook status: ${status}`);
135
+ return;
136
+ }
137
+
138
+ const webhookStatus = status as WebhookStatus;
139
+
140
+ await this.intentRepo.updateById(intent.id, {
141
+ status: webhookStatus,
142
+ providerRaw: raw as any,
143
+ });
144
+
145
+ await this.alepha.events.emit(eventMap[webhookStatus], {
146
+ intentId: intent.id,
147
+ amount: intent.amount,
148
+ currency: intent.currency,
149
+ metadata: intent.metadata,
150
+ });
151
+ }
152
+
153
+ /**
154
+ * Capture a previously authorized payment. Optionally specify a different
155
+ * amount for partial capture.
156
+ */
157
+ public async capture(
158
+ intentId: string,
159
+ finalAmount?: number,
160
+ ): Promise<PaymentIntentEntity> {
161
+ const intent = await this.getIntent(intentId);
162
+ this.assertStatus(intent, "authorized", "capture");
163
+
164
+ const amount = finalAmount ?? intent.amount;
165
+ if (intent.providerRef) {
166
+ await this.provider.capturePayment(intent.providerRef, amount);
167
+ }
168
+
169
+ const updated = await this.intentRepo.updateById(intent.id, {
170
+ status: "captured",
171
+ amount,
172
+ });
173
+
174
+ await this.alepha.events.emit("billing:captured", {
175
+ intentId: intent.id,
176
+ amount,
177
+ currency: intent.currency,
178
+ metadata: intent.metadata,
179
+ });
180
+
181
+ return updated;
182
+ }
183
+
184
+ /**
185
+ * Void a previously authorized payment before capture.
186
+ */
187
+ public async void(intentId: string): Promise<PaymentIntentEntity> {
188
+ const intent = await this.getIntent(intentId);
189
+ this.assertStatus(intent, "authorized", "void");
190
+
191
+ if (intent.providerRef) {
192
+ await this.provider.voidPayment(intent.providerRef);
193
+ }
194
+
195
+ const updated = await this.intentRepo.updateById(intent.id, {
196
+ status: "voided",
197
+ });
198
+
199
+ await this.alepha.events.emit("billing:voided", {
200
+ intentId: intent.id,
201
+ amount: intent.amount,
202
+ currency: intent.currency,
203
+ metadata: intent.metadata,
204
+ });
205
+
206
+ return updated;
207
+ }
208
+
209
+ /**
210
+ * Refund a captured payment (partial or full).
211
+ */
212
+ public async refund(
213
+ intentId: string,
214
+ amount: number,
215
+ reason?: string,
216
+ ): Promise<RefundEntity> {
217
+ const intent = await this.getIntent(intentId);
218
+ this.assertStatus(intent, "captured", "refund");
219
+
220
+ let refundProviderRef: string | undefined;
221
+ if (intent.providerRef) {
222
+ const result = await this.provider.refundPayment(
223
+ intent.providerRef,
224
+ amount,
225
+ );
226
+ refundProviderRef = result.providerRef;
227
+ }
228
+
229
+ const refund = await this.refundRepo.create({
230
+ intentId: intent.id,
231
+ organizationId: intent.organizationId,
232
+ amount,
233
+ currency: intent.currency,
234
+ status: "completed",
235
+ reason,
236
+ providerRef: refundProviderRef,
237
+ });
238
+
239
+ await this.intentRepo.updateById(intent.id, { status: "refunded" });
240
+
241
+ await this.alepha.events.emit("billing:refunded", {
242
+ intentId: intent.id,
243
+ refundId: refund.id,
244
+ amount,
245
+ currency: intent.currency,
246
+ metadata: intent.metadata,
247
+ });
248
+
249
+ return refund;
250
+ }
251
+
252
+ /**
253
+ * Record a cash or offline payment directly as captured,
254
+ * bypassing the checkout flow.
255
+ */
256
+ public async recordCashPayment(
257
+ amount: number,
258
+ currency: string,
259
+ metadata?: unknown,
260
+ ): Promise<PaymentIntentEntity> {
261
+ const intent = await this.intentRepo.create({
262
+ amount,
263
+ currency,
264
+ status: "captured",
265
+ metadata: metadata as any,
266
+ });
267
+
268
+ await this.alepha.events.emit("billing:captured", {
269
+ intentId: intent.id,
270
+ amount,
271
+ currency,
272
+ metadata,
273
+ });
274
+
275
+ return intent;
276
+ }
277
+
278
+ /**
279
+ * Cancel a payment intent that has not yet entered processing.
280
+ */
281
+ public async cancel(intentId: string): Promise<PaymentIntentEntity> {
282
+ const intent = await this.getIntent(intentId);
283
+ this.assertStatus(intent, "created", "cancel");
284
+
285
+ return await this.intentRepo.updateById(intent.id, {
286
+ status: "cancelled",
287
+ });
288
+ }
289
+
290
+ /**
291
+ * Get a payment intent by ID. Throws NotFoundError if not found.
292
+ */
293
+ public async getIntent(intentId: string): Promise<PaymentIntentEntity> {
294
+ return await this.intentRepo.getById(intentId);
295
+ }
296
+
297
+ /**
298
+ * Find payment intents with optional filters and pagination.
299
+ */
300
+ public async findIntents(query: {
301
+ status?: string;
302
+ userId?: string;
303
+ sort?: string;
304
+ size?: number;
305
+ page?: number;
306
+ }) {
307
+ const where = this.intentRepo.createQueryWhere();
308
+ if (query.status)
309
+ where.status = { eq: query.status as PaymentIntentEntity["status"] };
310
+ if (query.userId) where.userId = { eq: query.userId };
311
+ return await this.intentRepo.paginate(query, { where }, { count: true });
312
+ }
313
+
314
+ protected assertStatus(
315
+ intent: PaymentIntentEntity,
316
+ expected: PaymentIntentEntity["status"],
317
+ operation: string,
318
+ ): void {
319
+ if (intent.status !== expected) {
320
+ throw new BillingError(
321
+ `Cannot ${operation}: intent ${intent.id} is '${intent.status}', expected '${expected}'`,
322
+ );
323
+ }
324
+ }
325
+ }
@@ -0,0 +1,82 @@
1
+ import { $inject } from "alepha";
2
+ import { $logger } from "alepha/logger";
3
+ import { $repository } from "alepha/orm";
4
+ import {
5
+ type PaymentMethodEntity,
6
+ paymentMethods,
7
+ } from "../entities/paymentMethods.ts";
8
+ import { BillingError } from "../errors/BillingError.ts";
9
+ import { BillingProvider } from "../providers/BillingProvider.ts";
10
+
11
+ export class PaymentMethodService {
12
+ protected readonly log = $logger();
13
+ protected readonly provider = $inject(BillingProvider);
14
+ protected readonly methodRepo = $repository(paymentMethods);
15
+
16
+ public async addPaymentMethod(
17
+ userId: string,
18
+ organizationId: string,
19
+ token: string,
20
+ ): Promise<PaymentMethodEntity> {
21
+ const result = await this.provider.createPaymentMethod(userId, token);
22
+
23
+ const existing = await this.methodRepo.findMany({
24
+ where: { userId: { eq: userId } },
25
+ });
26
+
27
+ return await this.methodRepo.create({
28
+ userId,
29
+ organizationId,
30
+ type: result.type,
31
+ brand: result.brand,
32
+ last4: result.last4,
33
+ expMonth: result.expMonth,
34
+ expYear: result.expYear,
35
+ isDefault: existing.length === 0,
36
+ providerRef: result.providerRef,
37
+ });
38
+ }
39
+
40
+ public async listPaymentMethods(
41
+ userId: string,
42
+ ): Promise<PaymentMethodEntity[]> {
43
+ return await this.methodRepo.findMany({
44
+ where: { userId: { eq: userId } },
45
+ });
46
+ }
47
+
48
+ public async removePaymentMethod(
49
+ methodId: string,
50
+ userId: string,
51
+ ): Promise<void> {
52
+ const method = await this.methodRepo.getById(methodId);
53
+ if (method.userId !== userId) {
54
+ throw new BillingError("Cannot remove another user's payment method");
55
+ }
56
+
57
+ await this.provider.deletePaymentMethod(method.providerRef);
58
+ await this.methodRepo.deleteById(method.id);
59
+ }
60
+
61
+ public async setDefault(
62
+ methodId: string,
63
+ userId: string,
64
+ ): Promise<PaymentMethodEntity> {
65
+ const method = await this.methodRepo.getById(methodId);
66
+ if (method.userId !== userId) {
67
+ throw new BillingError("Cannot modify another user's payment method");
68
+ }
69
+
70
+ const userMethods = await this.methodRepo.findMany({
71
+ where: { userId: { eq: userId } },
72
+ });
73
+
74
+ for (const m of userMethods) {
75
+ if (m.isDefault) {
76
+ await this.methodRepo.updateById(m.id, { isDefault: false });
77
+ }
78
+ }
79
+
80
+ return await this.methodRepo.updateById(method.id, { isDefault: true });
81
+ }
82
+ }