better-supabase 0.5.0 → 0.6.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 (536) hide show
  1. package/README.md +299 -41
  2. package/dist/access-sql-B0dF-SoF.js +181 -0
  3. package/dist/actor-CQTlc1Hh.d.ts +43 -0
  4. package/dist/adapter-Bc1o3zyy.js +1106 -0
  5. package/dist/agents-CVHGd7It.d.ts +94 -0
  6. package/dist/ai-cache-CBWs1W0k.js +80 -0
  7. package/dist/ai-cache-DaDu_G5L.d.ts +64 -0
  8. package/dist/ai-chat-7amvXjmQ.d.ts +590 -0
  9. package/dist/ai-chat-B24UI962.js +743 -0
  10. package/dist/ai-files-CSPNswUY.js +319 -0
  11. package/dist/ai-sdk/agents/index.d.ts +74 -0
  12. package/dist/ai-sdk/agents/index.js +159 -0
  13. package/dist/ai-sdk/batches/index.d.ts +74 -0
  14. package/dist/ai-sdk/batches/index.js +180 -0
  15. package/dist/ai-sdk/cache/index.d.ts +38 -0
  16. package/dist/ai-sdk/cache/index.js +127 -0
  17. package/dist/ai-sdk/chat/index.d.ts +2 -0
  18. package/dist/ai-sdk/chat/index.js +246 -0
  19. package/dist/ai-sdk/embeddings/index.d.ts +3 -0
  20. package/dist/ai-sdk/embeddings/index.js +2 -0
  21. package/dist/ai-sdk/files/index.d.ts +61 -0
  22. package/dist/ai-sdk/files/index.js +111 -0
  23. package/dist/ai-sdk/index.d.ts +145 -0
  24. package/dist/ai-sdk/index.js +174 -0
  25. package/dist/ai-sdk/mcp/index.d.ts +102 -0
  26. package/dist/ai-sdk/mcp/index.js +362 -0
  27. package/dist/ai-sdk/memory/index.d.ts +67 -0
  28. package/dist/ai-sdk/memory/index.js +175 -0
  29. package/dist/ai-sdk/react/index.d.ts +2 -0
  30. package/dist/ai-sdk/react/index.js +3 -0
  31. package/dist/ai-sdk/react/server.d.ts +6 -0
  32. package/dist/ai-sdk/react/server.js +7 -0
  33. package/dist/ai-sdk/workflow/index.d.ts +249 -0
  34. package/dist/ai-sdk/workflow/index.js +575 -0
  35. package/dist/ai-sdk/workflow/react/index.d.ts +20 -0
  36. package/dist/ai-sdk/workflow/react/index.js +66 -0
  37. package/dist/ai-sdk/workflow/react/server.d.ts +10 -0
  38. package/dist/ai-sdk/workflow/react/server.js +12 -0
  39. package/dist/ai-tasks-Cd1HMFvB.d.ts +131 -0
  40. package/dist/announcements-CiyOs-xP.js +107 -0
  41. package/dist/announcements-ZRGnScWI.d.ts +72 -0
  42. package/dist/api-keys-rCGtKaZA.d.ts +156 -0
  43. package/dist/assistant-DwdpDH1q.d.ts +147 -0
  44. package/dist/astro/index.d.ts +86 -0
  45. package/dist/astro/index.js +93 -0
  46. package/dist/attributes-5dYul0u0.js +13 -0
  47. package/dist/auth-link-BjFPqwLz.d.ts +97 -0
  48. package/dist/auth-link-DrDX9KOT.js +114 -0
  49. package/dist/authorization-BFCqamMs.d.ts +172 -0
  50. package/dist/before-route-CnR0C0Jr.js +30 -0
  51. package/dist/bind-Bu_ZNa3W.d.ts +62 -0
  52. package/dist/bind-l4kAvYSv.js +97 -0
  53. package/dist/block-events-CrT8r7Fe.js +76 -0
  54. package/dist/block-fields-GFkxl4dP.js +49 -0
  55. package/dist/block-fields-SJ6fEf3o.d.ts +31 -0
  56. package/dist/block-helpers-CKtbFcRv.d.ts +37 -0
  57. package/dist/block-helpers-DWHxHsEQ.js +190 -0
  58. package/dist/block-hooks-BmjMyXTa.js +114 -0
  59. package/dist/block-hooks-plbZ0AbJ.d.ts +107 -0
  60. package/dist/{kit-transport-DJlHQUBU.js → block-transport-BLr-ZgLc.js} +11 -7
  61. package/dist/block-transport-DvaoPuZ9.d.ts +48 -0
  62. package/dist/blocks/agents/index.d.ts +3 -0
  63. package/dist/blocks/agents/index.js +123 -0
  64. package/dist/blocks/ai-cache/index.d.ts +3 -0
  65. package/dist/blocks/ai-cache/index.js +3 -0
  66. package/dist/blocks/ai-chat/index.d.ts +31 -0
  67. package/dist/blocks/ai-chat/index.js +5 -0
  68. package/dist/blocks/ai-chat/react/index.d.ts +77 -0
  69. package/dist/blocks/ai-chat/react/index.js +387 -0
  70. package/dist/blocks/ai-chat/react/server.d.ts +16 -0
  71. package/dist/blocks/ai-chat/react/server.js +14 -0
  72. package/dist/blocks/ai-files/index.d.ts +14 -0
  73. package/dist/blocks/ai-files/index.js +3 -0
  74. package/dist/blocks/ai-providers/index.d.ts +7 -0
  75. package/dist/blocks/ai-providers/index.js +211 -0
  76. package/dist/blocks/ai-tasks/index.d.ts +3 -0
  77. package/dist/blocks/ai-tasks/index.js +203 -0
  78. package/dist/blocks/announcements/index.d.ts +3 -0
  79. package/dist/blocks/announcements/index.js +3 -0
  80. package/dist/blocks/announcements/react/index.d.ts +31 -0
  81. package/dist/blocks/announcements/react/index.js +86 -0
  82. package/dist/blocks/announcements/react/server.d.ts +6 -0
  83. package/dist/blocks/announcements/react/server.js +7 -0
  84. package/dist/blocks/api-keys/index.d.ts +35 -0
  85. package/dist/blocks/api-keys/index.js +334 -0
  86. package/dist/blocks/attachments/index.d.ts +210 -0
  87. package/dist/blocks/attachments/index.js +222 -0
  88. package/dist/blocks/audit/index.d.ts +366 -0
  89. package/dist/blocks/audit/index.js +714 -0
  90. package/dist/blocks/billing/index.d.ts +265 -0
  91. package/dist/blocks/billing/index.js +400 -0
  92. package/dist/blocks/comments/index.d.ts +200 -0
  93. package/dist/blocks/comments/index.js +207 -0
  94. package/dist/blocks/connectors/index.d.ts +3 -0
  95. package/dist/blocks/connectors/index.js +164 -0
  96. package/dist/blocks/data-lifecycle/index.d.ts +251 -0
  97. package/dist/blocks/data-lifecycle/index.js +353 -0
  98. package/dist/blocks/entitlements/index.d.ts +14 -0
  99. package/dist/blocks/entitlements/index.js +25 -0
  100. package/dist/blocks/flags/index.d.ts +226 -0
  101. package/dist/blocks/flags/index.js +282 -0
  102. package/dist/blocks/inbox/index.d.ts +6 -0
  103. package/dist/blocks/inbox/index.js +499 -0
  104. package/dist/blocks/inbox/react/index.d.ts +2 -0
  105. package/dist/blocks/inbox/react/index.js +225 -0
  106. package/dist/blocks/inbox/react/server.d.ts +10 -0
  107. package/dist/blocks/inbox/react/server.js +12 -0
  108. package/dist/blocks/index.d.ts +65 -0
  109. package/dist/blocks/index.js +77 -0
  110. package/dist/blocks/jobs/index.d.ts +297 -0
  111. package/dist/blocks/jobs/index.js +1051 -0
  112. package/dist/blocks/knowledge/index.d.ts +3 -0
  113. package/dist/blocks/knowledge/index.js +3 -0
  114. package/dist/blocks/memory/index.d.ts +8 -0
  115. package/dist/blocks/memory/index.js +289 -0
  116. package/dist/blocks/notifications/index.d.ts +297 -0
  117. package/dist/blocks/notifications/index.js +425 -0
  118. package/dist/blocks/notifications/react/index.d.ts +44 -0
  119. package/dist/blocks/notifications/react/index.js +67 -0
  120. package/dist/blocks/notifications/react/server.d.ts +6 -0
  121. package/dist/blocks/notifications/react/server.js +7 -0
  122. package/dist/blocks/onboarding/index.d.ts +3 -0
  123. package/dist/blocks/onboarding/index.js +64 -0
  124. package/dist/blocks/onboarding/react/index.d.ts +28 -0
  125. package/dist/blocks/onboarding/react/index.js +78 -0
  126. package/dist/blocks/onboarding/react/server.d.ts +7 -0
  127. package/dist/blocks/onboarding/react/server.js +7 -0
  128. package/dist/blocks/organizations/index.d.ts +241 -0
  129. package/dist/blocks/organizations/index.js +400 -0
  130. package/dist/blocks/outbox/index.d.ts +3 -0
  131. package/dist/blocks/outbox/index.js +266 -0
  132. package/dist/blocks/profiles/index.d.ts +40 -0
  133. package/dist/blocks/profiles/index.js +28 -0
  134. package/dist/blocks/push/index.d.ts +185 -0
  135. package/dist/blocks/push/index.js +258 -0
  136. package/dist/blocks/settings/index.d.ts +89 -0
  137. package/dist/blocks/settings/index.js +104 -0
  138. package/dist/blocks/sso/index.d.ts +198 -0
  139. package/dist/blocks/sso/index.js +1297 -0
  140. package/dist/blocks/usage/index.d.ts +4 -0
  141. package/dist/blocks/usage/index.js +233 -0
  142. package/dist/blocks/waitlist/index.d.ts +117 -0
  143. package/dist/blocks/waitlist/index.js +132 -0
  144. package/dist/blocks/webhooks/index.d.ts +304 -0
  145. package/dist/{webhooks → blocks/webhooks}/index.js +468 -148
  146. package/dist/blocks/workflow-builder/index.d.ts +21 -0
  147. package/dist/blocks/workflow-builder/index.js +5 -0
  148. package/dist/blocks/workflow-builder/react/index.d.ts +47 -0
  149. package/dist/blocks/workflow-builder/react/index.js +119 -0
  150. package/dist/blocks/workflow-builder/react/server.d.ts +8 -0
  151. package/dist/blocks/workflow-builder/react/server.js +11 -0
  152. package/dist/blocks/workflows/index.d.ts +3 -0
  153. package/dist/blocks/workflows/index.js +3 -0
  154. package/dist/blocks/workflows/react/index.d.ts +47 -0
  155. package/dist/blocks/workflows/react/index.js +137 -0
  156. package/dist/blocks/workflows/react/server.d.ts +8 -0
  157. package/dist/blocks/workflows/react/server.js +11 -0
  158. package/dist/{index-SaTsEfGP.d.ts → bucket-Cl46E3jS.d.ts} +134 -91
  159. package/dist/{simplify-_0oUKqCd.js → build-BXIzE6Xv.js} +222 -124
  160. package/dist/{channel-FQW-CnGR.d.ts → channel-_2Mx1Oyu.d.ts} +2 -2
  161. package/dist/channels-CkgQ_X60.js +114 -0
  162. package/dist/chat-sdk/index.d.ts +303 -0
  163. package/dist/chat-sdk/index.js +733 -0
  164. package/dist/chat-sdk/react/index.d.ts +2 -0
  165. package/dist/chat-sdk/react/index.js +3 -0
  166. package/dist/chat-sdk/react/server.d.ts +3 -0
  167. package/dist/chat-sdk/react/server.js +2 -0
  168. package/dist/claims-DDBQT6BK.js +61 -0
  169. package/dist/{claims-BAf6c7is.js → claims-PqzCxaTD.js} +39 -2
  170. package/dist/cli/bin.js +1 -1
  171. package/dist/cli/{codemod-DqV7612m.js → codemod-Bl_tQpHn.js} +105 -2
  172. package/dist/cli/config-B9HkL8nF.js +2 -0
  173. package/dist/cli/config-DU7EJImt.js +49 -0
  174. package/dist/cli/config-NiPxAmUF.js +1077 -0
  175. package/dist/cli/{dist-xn4wlboc.js → dist-DRAVaE6w.js} +111 -1
  176. package/dist/cli/{doctor-L7Z8mYTx.js → doctor-B4JOm_ox.js} +992 -316
  177. package/dist/cli/{env-DmKv_G4A.js → env-CJLbUVPB.js} +1 -1
  178. package/dist/cli/{env-jIFUADLY.js → env-qXgyMV6r.js} +2 -2
  179. package/dist/cli/fresh-import-BeYf9I3x.js +40 -0
  180. package/dist/cli/gen-BGLb_zou.js +3100 -0
  181. package/dist/cli/gen-DAH8FM2W.js +2 -0
  182. package/dist/cli/index.d.ts +44 -5
  183. package/dist/cli/index.js +7 -7
  184. package/dist/cli/{init-Saf5-R9T.js → init-BIIwclPg.js} +242 -27
  185. package/dist/cli/{introspect--H7oGmcd.js → introspect-DNUTuNvb.js} +5 -5
  186. package/dist/cli/{io-k41_z-jT.js → io-DI1mTdSA.js} +12 -3
  187. package/dist/cli/{keys-ByKHnvP9.js → keys-BGCnnb-s.js} +8 -6
  188. package/dist/cli/{ohash-D7bG_EOb.js → ohash-BjQY1cBb.js} +1 -1
  189. package/dist/cli/{openapi-Cp5Fyta-.js → openapi-BlRJ18s3.js} +2 -2
  190. package/dist/cli/{project-B_GeXyHh.js → project-DZRaBaY7.js} +11 -6
  191. package/dist/cli/read-sets-CETOSFx4.js +223 -0
  192. package/dist/cli/{run-BKR2W_79.js → run-DNWxHynX.js} +33 -23
  193. package/dist/cli/{seed-CUlqWh-8.js → seed-DQzqT7LP.js} +8 -6
  194. package/dist/cli/{skills-LJJIhLFR.js → skills-QQs4q68J.js} +3 -2
  195. package/dist/cli/sql-D0GUtUPp.js +536 -0
  196. package/dist/cli/{config-CPVpXP5I.js → supabase-toml-B-bIukQF.js} +72 -942
  197. package/dist/cli/typegen-version-DeFbtzYI.js +8 -0
  198. package/dist/cli/{version-BDJuO0UR.js → version-hr88OZG0.js} +1 -1
  199. package/dist/client/index.d.ts +3 -2
  200. package/dist/client/index.js +11 -71
  201. package/dist/client/native/index.d.ts +228 -0
  202. package/dist/client/native/index.js +361 -0
  203. package/dist/client-CI0Z2zWX.js +277 -0
  204. package/dist/cloud-event-BnmD5fb9.js +46 -0
  205. package/dist/cloud-event-C1JCc1bH.d.ts +50 -0
  206. package/dist/{compiler-BXH_aZ7N.d.ts → compiler-DY_wkj4R.d.ts} +2 -2
  207. package/dist/compose-BIBNgAnq.js +53 -0
  208. package/dist/composite-Bt1YK3Ke.d.ts +146 -0
  209. package/dist/composite-DhE66P5u.js +130 -0
  210. package/dist/config/index.d.ts +6 -4
  211. package/dist/config/index.js +5 -5
  212. package/dist/{config-T_ejwyd3.d.ts → config-D44Y7PAv.d.ts} +406 -205
  213. package/dist/{config-DreERlKo.js → config-Dn7F5k9A.js} +62 -14
  214. package/dist/connector-Dv8kK0MO.d.ts +107 -0
  215. package/dist/connectors-hkLCwyEz.d.ts +120 -0
  216. package/dist/context-BCrWe7ow.d.ts +237 -0
  217. package/dist/credentials/index.d.ts +31 -0
  218. package/dist/credentials/index.js +168 -0
  219. package/dist/cron-DVPUg5k3.js +145 -0
  220. package/dist/csv-CPAzEmB6.js +25 -0
  221. package/dist/db-exception-CnWcYPxL.js +15 -0
  222. package/dist/{define-cNKzqwL_.js → define-B-TVjC25.js} +784 -227
  223. package/dist/{define-Bp_BZa5h.d.ts → define-CJJkkr1-.d.ts} +353 -61
  224. package/dist/edge/index.d.ts +69 -11
  225. package/dist/edge/index.js +191 -75
  226. package/dist/elysia/index.d.ts +59 -0
  227. package/dist/elysia/index.js +62 -0
  228. package/dist/embeddings-4ZvFzjsU.js +127 -0
  229. package/dist/embeddings-C9KGQnXt.d.ts +68 -0
  230. package/dist/{refresh-BTrQ_ZTp.d.ts → ended-jLfvw8h-.d.ts} +20 -2
  231. package/dist/{entitlements-DUxU4oHe.d.ts → entitlements-DHrY2UDZ.d.ts} +16 -7
  232. package/dist/entitlements-DRl6ZJUm.js +24 -0
  233. package/dist/envelope-DqnYGRw7.js +47 -0
  234. package/dist/{errors-DtwXa6b8.js → errors-B11Duf73.js} +82 -13
  235. package/dist/errors-DLjJHPLK.js +44 -0
  236. package/dist/escape-like-DHfx6jRr.js +7 -0
  237. package/dist/escape-like-ImTK0ps_.d.ts +15 -0
  238. package/dist/eve/index.d.ts +220 -0
  239. package/dist/eve/index.js +504 -0
  240. package/dist/eve-gT2Fpjut.d.ts +151 -0
  241. package/dist/events/index.d.ts +4 -3
  242. package/dist/events/index.js +9 -50
  243. package/dist/events-DWDhx77e.d.ts +549 -0
  244. package/dist/executor-Bq28caBo.js +718 -0
  245. package/dist/executor-C-R4pucm.js +83 -0
  246. package/dist/executor-CaWigTyR.d.ts +148 -0
  247. package/dist/executor-D14tGopJ.d.ts +36 -0
  248. package/dist/{executor-Cghdstwu.d.ts → executor-DbvExCFC.d.ts} +7 -1
  249. package/dist/{sql-Coh6n4cC.js → executor-De1Of3m3.js} +210 -11
  250. package/dist/executor-DvsBbNBS.d.ts +261 -0
  251. package/dist/expo/index.d.ts +79 -0
  252. package/dist/expo/index.js +129 -0
  253. package/dist/expo-sqlite/index.d.ts +58 -0
  254. package/dist/expo-sqlite/index.js +104 -0
  255. package/dist/field-errors-BFOa7WhB.d.ts +99 -0
  256. package/dist/field-errors-VF1yb8yI.js +13 -0
  257. package/dist/framework-CONDyPYx.js +51 -0
  258. package/dist/framework-DuVb4Xa8.d.ts +25 -0
  259. package/dist/gateway-C1ssRHnf.d.ts +130 -0
  260. package/dist/graph-BGyLLFLX.js +265 -0
  261. package/dist/h3/index.d.ts +59 -0
  262. package/dist/h3/index.js +55 -0
  263. package/dist/h3/v1/index.d.ts +63 -0
  264. package/dist/h3/v1/index.js +49 -0
  265. package/dist/history-BZih6SFP.js +64 -0
  266. package/dist/hono/index.d.ts +56 -7
  267. package/dist/hono/index.js +97 -45
  268. package/dist/{react-C_s7kiNz.js → hooks-1BTCJsiw.js} +104 -133
  269. package/dist/http-Cv4T29xh.js +40 -0
  270. package/dist/http-DdYadv-o.js +126 -0
  271. package/dist/image-url-pIVlO6R1.js +41 -0
  272. package/dist/impersonation-DcqaTBHx.js +148 -0
  273. package/dist/inbox-i7E1ppo6.d.ts +384 -0
  274. package/dist/index-ACiNPN4Z.d.ts +74 -0
  275. package/dist/{index-DgILJRXj.d.ts → index-Bepi-Hgg.d.ts} +91 -28
  276. package/dist/index-BkWT_uBO.d.ts +51 -0
  277. package/dist/index-BpFYMsi0.d.ts +53 -0
  278. package/dist/{index-C7f8cOBM.d.ts → index-Bxih3l0u.d.ts} +2 -2
  279. package/dist/index-CaxrMD1A.d.ts +1 -0
  280. package/dist/index-ClmjK_o-.d.ts +55 -0
  281. package/dist/index-CtuakVRc.d.ts +267 -0
  282. package/dist/index-D48jVS-N.d.ts +246 -0
  283. package/dist/index-DDrYaUcq.d.ts +138 -0
  284. package/dist/index-DQh4VCc9.d.ts +98 -0
  285. package/dist/{live-D9W2M5aO.d.ts → index-DunNRdnT.d.ts} +136 -38
  286. package/dist/index.d.ts +65 -18
  287. package/dist/index.js +42 -14
  288. package/dist/invalidate-BBqhpxyB.d.ts +19 -0
  289. package/dist/json-CEnpTHlZ.js +16 -0
  290. package/dist/json-schema-CvER4kgT.js +502 -0
  291. package/dist/keys-4MnkWTTh.js +35 -0
  292. package/dist/kit-B5tid-q5.d.ts +60 -0
  293. package/dist/kit-Fm-Fv7q5.js +78 -0
  294. package/dist/knowledge-BXBbT0Tr.d.ts +176 -0
  295. package/dist/knowledge-CDmiMLew.js +255 -0
  296. package/dist/lint/index.d.ts +1 -1
  297. package/dist/lint/index.js +37 -0
  298. package/dist/list/index.d.ts +3 -2
  299. package/dist/list/index.js +1 -444
  300. package/dist/{index-fag8VJZ2.d.ts → list-query-BRt-zDF7.d.ts} +20 -12
  301. package/dist/list-query-gl808ac1.js +459 -0
  302. package/dist/{live-CdJBOc4f.js → live-CTAZQkwl.js} +99 -14
  303. package/dist/logger-DWVYUmwi.d.ts +18 -0
  304. package/dist/mcp/index.d.ts +38 -11
  305. package/dist/mcp/index.js +82 -46
  306. package/dist/mcp/sdk/index.d.ts +105 -0
  307. package/dist/mcp/sdk/index.js +126 -0
  308. package/dist/message-CaKlqdsX.js +219 -0
  309. package/dist/message-CfDoR0Y6.d.ts +94 -0
  310. package/dist/messages-B9-5887d.js +715 -0
  311. package/dist/messages-DYP0sUTe.d.ts +59 -0
  312. package/dist/{mfa-CusDgPaD.d.ts → mfa-Daak8ukG.d.ts} +8 -2
  313. package/dist/modules-DpPwzC7E.d.ts +192 -0
  314. package/dist/modules-dxrVK3ID.js +228 -0
  315. package/dist/nestjs/index.d.ts +68 -0
  316. package/dist/nestjs/index.js +164 -0
  317. package/dist/next/client/index.d.ts +35 -0
  318. package/dist/next/client/index.js +36 -0
  319. package/dist/next/image/index.js +3 -24
  320. package/dist/next/index.d.ts +150 -51
  321. package/dist/next/index.js +261 -107
  322. package/dist/node/index.d.ts +4 -0
  323. package/dist/node/index.js +210 -0
  324. package/dist/node-headers-AO06VhqH.d.ts +24 -0
  325. package/dist/node-headers-C71zNQHe.js +55 -0
  326. package/dist/nuxt/index.d.ts +60 -0
  327. package/dist/nuxt/index.js +64 -0
  328. package/dist/onboarding-BZGHYJks.d.ts +62 -0
  329. package/dist/openapi/index.d.ts +1 -1
  330. package/dist/openapi/index.js +3 -3
  331. package/dist/orpc/index.d.ts +70 -11
  332. package/dist/orpc/index.js +73 -24
  333. package/dist/otel/index.d.ts +7 -7
  334. package/dist/otel/index.js +87 -57
  335. package/dist/outbox-Cq7pPYvl.d.ts +161 -0
  336. package/dist/{plugin-o144f322.d.ts → plugin-FGY8UhYm.d.ts} +30 -10
  337. package/dist/plugin-tfXW1-qO.js +45 -0
  338. package/dist/plugins/actor/index.d.ts +2 -2
  339. package/dist/plugins/actor/index.js +3 -3
  340. package/dist/plugins/rules/index.d.ts +11 -4
  341. package/dist/plugins/rules/index.js +40 -13
  342. package/dist/plugins/soft-delete/index.d.ts +5 -4
  343. package/dist/plugins/soft-delete/index.js +10 -5
  344. package/dist/plugins/tenant/index.d.ts +2 -2
  345. package/dist/plugins/tenant/index.js +18 -11
  346. package/dist/plugins/timestamps/index.d.ts +5 -3
  347. package/dist/plugins/timestamps/index.js +6 -4
  348. package/dist/plugins/validation/index.d.ts +2 -2
  349. package/dist/plugins/validation/index.js +10 -6
  350. package/dist/{pool-C9voM4Kw.d.ts → pool-CAu2nLrL.d.ts} +2 -2
  351. package/dist/postgres/index.d.ts +4 -4
  352. package/dist/postgres/index.js +1 -2
  353. package/dist/{postgrest-CruYKAvV.d.ts → postgrest-BLVdEnfe.d.ts} +13 -3
  354. package/dist/powersync/index.d.ts +43 -0
  355. package/dist/powersync/index.js +199 -0
  356. package/dist/powersync/react/index.d.ts +87 -0
  357. package/dist/powersync/react/index.js +108 -0
  358. package/dist/{problem-BW1KhzSG.js → problem-BreOl8b8.js} +14 -3
  359. package/dist/{problem-Blxe8S31.d.ts → problem-DD8LZFjc.d.ts} +21 -3
  360. package/dist/provider-BH5UWZJ6.d.ts +113 -0
  361. package/dist/provider-Di3sRutW.js +57 -0
  362. package/dist/query/index.d.ts +4 -2
  363. package/dist/query/index.js +4 -3
  364. package/dist/{query-CCbo44lG.js → query-BQ-NaZon.js} +141 -24
  365. package/dist/{queue-BYUCjr59.d.ts → queue-CLJurhdy.d.ts} +258 -83
  366. package/dist/react/index.d.ts +11 -7
  367. package/dist/react/index.js +7 -3
  368. package/dist/react/native/index.d.ts +116 -0
  369. package/dist/react/native/index.js +130 -0
  370. package/dist/react/server.d.ts +28 -10
  371. package/dist/react/server.js +22 -5
  372. package/dist/react/session.d.ts +2 -2
  373. package/dist/react-4ZqkP8da.js +79 -0
  374. package/dist/react-F80mF4-t.js +409 -0
  375. package/dist/react-router/index.d.ts +83 -0
  376. package/dist/react-router/index.js +89 -0
  377. package/dist/react-topic-seAWjL3_.js +38 -0
  378. package/dist/{read-set-DQFt1N_Y.js → read-set-DuKWC9Mj.js} +67 -25
  379. package/dist/realtime/index.d.ts +4 -5
  380. package/dist/realtime/index.js +144 -82
  381. package/dist/refusal-CeJWxmkH.js +61 -0
  382. package/dist/refusal-D1rgbzNq.d.ts +15 -0
  383. package/dist/replicas-CwrYp5Zj.js +94 -0
  384. package/dist/{view-Bq64ki8-.js → resolve-D_IcnvFd.js} +239 -289
  385. package/dist/{resolve-C15TJq77.d.ts → resolve-KW8nCeL6.d.ts} +29 -45
  386. package/dist/{resource-CRxxwkQq.js → resource-BsvzCMlX.js} +4 -4
  387. package/dist/{resource-D8iqWMr-.d.ts → resource-D6Uc7Sk7.d.ts} +5 -5
  388. package/dist/respond-BUgsXNgk.js +91 -0
  389. package/dist/respond-DoBijysA.d.ts +93 -0
  390. package/dist/result-D7y2fT87.d.ts +282 -0
  391. package/dist/{result-BKiliPY7.js → result-DzUbqgdW.js} +27 -2
  392. package/dist/run-state-CPo-1X2B.d.ts +12 -0
  393. package/dist/run-state-CgBKzYMW.js +13 -0
  394. package/dist/search-CUWCRYKL.js +9 -0
  395. package/dist/server/index.d.ts +143 -21
  396. package/dist/server/index.js +46 -14
  397. package/dist/{respond-D2OQl62-.d.ts → server-CeVeeXwz.d.ts} +225 -80
  398. package/dist/session-ChiXDZdZ.d.ts +72 -0
  399. package/dist/shared-CBxosKK3.js +75 -0
  400. package/dist/{shared-D1dRUrAg.js → shared-CxWmcyqB.js} +2 -1
  401. package/dist/shared-DDSjEGDR.d.ts +11 -0
  402. package/dist/sign-in-BCV5S2WZ.d.ts +49 -0
  403. package/dist/sign-in-Cb1mwv6X.js +86 -0
  404. package/dist/{signers-Cc6r98SW.d.ts → signers-4y62_VIi.d.ts} +13 -9
  405. package/dist/simplify-DDO0j0LI.js +83 -0
  406. package/dist/solid/index.d.ts +131 -0
  407. package/dist/solid/index.js +344 -0
  408. package/dist/solid-start/index.d.ts +75 -0
  409. package/dist/solid-start/index.js +58 -0
  410. package/dist/{spec-pins-C3oc-Tdp.js → spec-pins--j6mTok4.js} +8 -1
  411. package/dist/{spec-pins-CqorWDnO.d.ts → spec-pins-C89s6DyW.d.ts} +7 -0
  412. package/dist/sql/index.d.ts +330 -194
  413. package/dist/sql/index.js +34901 -6489
  414. package/dist/ssr/index.d.ts +6 -5
  415. package/dist/ssr/index.js +3 -3
  416. package/dist/{standard-D7r6dMUu.js → standard-BK0cqJ7y.js} +4 -3
  417. package/dist/{standard-J4YgMOLm.d.ts → standard-CYsm7xpT.d.ts} +1 -1
  418. package/dist/stats-D_AD9GGu.js +1123 -0
  419. package/dist/storage/index.d.ts +5 -5
  420. package/dist/storage/index.js +1027 -368
  421. package/dist/store-BdH5ruDx.js +66 -0
  422. package/dist/store-CGjgWu5n.d.ts +68 -0
  423. package/dist/streams/index.d.ts +76 -0
  424. package/dist/streams/index.js +77 -0
  425. package/dist/streams/redis/index.d.ts +52 -0
  426. package/dist/streams/redis/index.js +185 -0
  427. package/dist/stripe-BMj5LtsT.js +38 -0
  428. package/dist/stripe-D04h-QBT.d.ts +136 -0
  429. package/dist/{support-Dk6vdmEw.js → support-BivNqSpK.js} +35 -12
  430. package/dist/{support-view-Da5peKFg.d.ts → support-view-33Oi07TT.d.ts} +1 -1
  431. package/dist/svelte/index.d.ts +114 -0
  432. package/dist/svelte/index.js +344 -0
  433. package/dist/sveltekit/index.d.ts +116 -0
  434. package/dist/sveltekit/index.js +106 -0
  435. package/dist/tags-B99_U9Pp.js +39 -0
  436. package/dist/tags-Cx-LnIQP.d.ts +30 -0
  437. package/dist/tanstack-db/index.d.ts +71 -0
  438. package/dist/tanstack-db/index.js +72 -0
  439. package/dist/tanstack-start/index.d.ts +75 -0
  440. package/dist/tanstack-start/index.js +95 -0
  441. package/dist/tee-CoEppCER.js +101 -0
  442. package/dist/{template-TxrGI5jR.js → template--jDkl3UP.js} +34 -13
  443. package/dist/template-CwO38Do8.d.ts +6 -0
  444. package/dist/temporal-BJGitm-h.js +79 -0
  445. package/dist/{temporal-required-CAt4Dc9Z.js → temporal-required-BVvW7SYJ.js} +3 -2
  446. package/dist/tenant-I1TEZ_BX.js +27 -0
  447. package/dist/tenant-icPeuUBN.d.ts +17 -0
  448. package/dist/testing/index.d.ts +343 -37
  449. package/dist/testing/index.js +1186 -79
  450. package/dist/timing-CyTQPubY.js +92 -0
  451. package/dist/ttl-Hr34gRu8.js +12 -0
  452. package/dist/{types-Dnf_wRDz.d.ts → types-6BdhkmZe.d.ts} +111 -45
  453. package/dist/types-BI-0Sl2v.d.ts +359 -0
  454. package/dist/types-C05bxW-W.d.ts +220 -0
  455. package/dist/types-DGs5L0VN.d.ts +192 -0
  456. package/dist/types-TaiEeBGA.d.ts +156 -0
  457. package/dist/usage-CrvrL2vw.d.ts +177 -0
  458. package/dist/user-change-XzvgafU4.js +130 -0
  459. package/dist/vault-CSO7ss5C.d.ts +50 -0
  460. package/dist/vercel-connect/index.d.ts +47 -0
  461. package/dist/vercel-connect/index.js +119 -0
  462. package/dist/{verify-Ce49ETPz.js → verify-DL41hbvY.js} +85 -13
  463. package/dist/verify-DPuWngD4.d.ts +172 -0
  464. package/dist/{version-DM_Roffb.js → version-Bvv6aLjZ.js} +1 -1
  465. package/dist/view-BeFcRV6G.js +99 -0
  466. package/dist/{view-BEf0diC5.d.ts → view-DbxLNu8L.d.ts} +35 -32
  467. package/dist/vue/index.d.ts +141 -0
  468. package/dist/vue/index.js +362 -0
  469. package/dist/watch-DI34G86j.d.ts +60 -0
  470. package/dist/watch-Xuxrvxq-.js +122 -0
  471. package/dist/{wire-D2dT86vi.js → wire-DtZQ4sdE.js} +15 -5
  472. package/dist/workflow-builder-DJ1oHn8g.js +398 -0
  473. package/dist/workflow-sdk/builder/index.d.ts +85 -0
  474. package/dist/workflow-sdk/builder/index.js +250 -0
  475. package/dist/workflow-sdk/index.d.ts +14 -0
  476. package/dist/workflow-sdk/index.js +3 -0
  477. package/dist/workflow-sdk/world/index.d.ts +107 -0
  478. package/dist/workflow-sdk/world/index.js +702 -0
  479. package/dist/workflow-sdk-B3yLD6Br.d.ts +98 -0
  480. package/dist/workflow-sdk-C2WJ_G2O.js +173 -0
  481. package/dist/workflow-sdk-world-D-prir6O.js +1397 -0
  482. package/dist/workflows-B0j9WKPu.d.ts +185 -0
  483. package/dist/workflows-wu1WWBn7.js +216 -0
  484. package/package.json +470 -29
  485. package/schemas/ai-message-v1.json +258 -0
  486. package/schemas/config-v1.json +1074 -140
  487. package/schemas/doctor-report-v1.json +21 -1
  488. package/schemas/snapshot-v2.json +8 -0
  489. package/skills/better-supabase/SKILL.md +41 -12
  490. package/skills/better-supabase/references/frontend.md +96 -0
  491. package/skills/better-supabase/references/plugins.md +10 -6
  492. package/skills/better-supabase/references/troubleshooting.md +2 -1
  493. package/skills/better-supabase-api/SKILL.md +76 -22
  494. package/skills/better-supabase-api/references/adapters.md +207 -0
  495. package/skills/better-supabase-api/references/ai.md +125 -0
  496. package/skills/better-supabase-api/references/expo.md +65 -0
  497. package/skills/better-supabase-api/references/powersync.md +35 -0
  498. package/skills/better-supabase-api/references/streams-credentials.md +105 -0
  499. package/skills/better-supabase-auth/SKILL.md +62 -18
  500. package/skills/better-supabase-auth/references/authorization-providers.md +51 -0
  501. package/skills/better-supabase-testing/SKILL.md +3 -1
  502. package/dist/cli/config-dtoekM0v.js +0 -2
  503. package/dist/cli/gen-BJc9vdyu.js +0 -2
  504. package/dist/cli/gen-C2osRcr5.js +0 -2204
  505. package/dist/cli/read-sets-BfMQcKy8.js +0 -289
  506. package/dist/cli/sql-DzPbfngx.js +0 -348
  507. package/dist/entitlements-CTEBm7IB.js +0 -20
  508. package/dist/events-aIO7vsIk.d.ts +0 -230
  509. package/dist/executor-BunPOO-k.d.ts +0 -402
  510. package/dist/executor-XycESQPH.js +0 -94
  511. package/dist/impersonation-VfaGc4Q_.js +0 -41
  512. package/dist/index-BGdgBPdf.d.ts +0 -161
  513. package/dist/index-DOESKG27.d.ts +0 -100
  514. package/dist/index-DmXSxbLi.d.ts +0 -62
  515. package/dist/index-Dxn2a5cw.d.ts +0 -50
  516. package/dist/jobs/index.d.ts +0 -226
  517. package/dist/jobs/index.js +0 -1007
  518. package/dist/json-schema-m1fiwKgN.js +0 -208
  519. package/dist/kit-events-CTFDfSwb.js +0 -60
  520. package/dist/kit-transport-B82k1djG.d.ts +0 -33
  521. package/dist/kits-CGLLrNPd.js +0 -157
  522. package/dist/notifications/index.d.ts +0 -162
  523. package/dist/notifications/index.js +0 -264
  524. package/dist/orgs/index.d.ts +0 -132
  525. package/dist/orgs/index.js +0 -245
  526. package/dist/permdock-sql-C2Inc6Xc.d.ts +0 -29
  527. package/dist/permdock-sql-DgOfeixi.js +0 -51
  528. package/dist/plugin-DwARMuQp.js +0 -59
  529. package/dist/server-Csx2sRjg.js +0 -655
  530. package/dist/stats-Bqob3WqT.js +0 -592
  531. package/dist/support-DT-OhSxD.d.ts +0 -88
  532. package/dist/template-mbvlysOo.d.ts +0 -6
  533. package/dist/temporal-CVlIV2DZ.js +0 -40
  534. package/dist/user-change-CHFEUro1.js +0 -49
  535. package/dist/webhooks/index.d.ts +0 -285
  536. package/skills/better-supabase-auth/references/permdock.md +0 -100
@@ -0,0 +1,251 @@
1
+ /// <reference lib="esnext.temporal" />
2
+ import { t as AsyncResult, w as ErrorMapper } from "../../result-D7y2fT87.js";
3
+ import { i as sqlTransport, r as rpcTransport, t as BlockTransport } from "../../block-transport-DvaoPuZ9.js";
4
+ import { a as CredentialSubject, i as CredentialRef, r as CredentialProvider } from "../../provider-BH5UWZJ6.js";
5
+ import { r as BlockTemporalOptions } from "../../block-helpers-CKtbFcRv.js";
6
+ import { m as JobHandler } from "../../queue-CLJurhdy.js";
7
+ import { r as EventSink } from "../../cloud-event-C1JCc1bH.js";
8
+ //#region src/blocks/data-lifecycle/data-lifecycle.d.ts
9
+ interface StorageReply<T> {
10
+ readonly data: T | null;
11
+ readonly error: unknown;
12
+ }
13
+ /** An entry of `storage.from(bucket).list(prefix)`; folders have no `id`. */
14
+ interface StorageEntry {
15
+ readonly name: string;
16
+ readonly id: string | null;
17
+ }
18
+ /** The `supabase.storage.from(bucket)` methods the lifecycle blocks use. */
19
+ interface LifecycleBucket {
20
+ upload(path: string, body: Blob, options?: {
21
+ contentType?: string;
22
+ upsert?: boolean;
23
+ }): PromiseLike<StorageReply<unknown>>;
24
+ createSignedUrl(path: string, expiresIn: number, options?: {
25
+ download?: string | boolean;
26
+ }): PromiseLike<StorageReply<{
27
+ readonly signedUrl: string;
28
+ }>>;
29
+ list(path?: string, options?: {
30
+ limit?: number;
31
+ offset?: number;
32
+ }): PromiseLike<StorageReply<readonly StorageEntry[]>>;
33
+ remove(paths: string[]): PromiseLike<StorageReply<unknown>>;
34
+ }
35
+ /** `supabase.storage`, typed structurally. */
36
+ interface LifecycleStorage {
37
+ from(bucket: string): LifecycleBucket;
38
+ }
39
+ type DataExportStatus = "pending" | "running" | "ready" | "failed";
40
+ interface DataExport {
41
+ readonly id: string;
42
+ readonly subject: "user" | "organization";
43
+ readonly userId: string | undefined;
44
+ readonly organizationId: string | undefined;
45
+ readonly status: DataExportStatus;
46
+ readonly bucket: string;
47
+ /** Object paths, one file per table: `{id}/{schema.table}.ndjson` (or `.csv`). */
48
+ readonly files: readonly string[];
49
+ readonly error: string | undefined;
50
+ readonly requestedBy: string | undefined;
51
+ readonly requestedAt: Temporal.Instant;
52
+ readonly completedAt: Temporal.Instant | undefined;
53
+ /** After this the files are no longer served. */
54
+ readonly expiresAt: Temporal.Instant | undefined;
55
+ }
56
+ interface OrganizationDeletion {
57
+ readonly organizationId: string;
58
+ readonly requestedBy: string | undefined;
59
+ readonly requestedAt: Temporal.Instant;
60
+ readonly purgeAfter: Temporal.Instant;
61
+ readonly cancelledAt: Temporal.Instant | undefined;
62
+ readonly purgedAt: Temporal.Instant | undefined;
63
+ }
64
+ interface DataExportDownload {
65
+ readonly export: DataExport;
66
+ /** One signed URL per file, keyed by the table it holds. */
67
+ readonly files: readonly {
68
+ readonly table: string;
69
+ readonly url: string;
70
+ }[];
71
+ }
72
+ interface DataLifecycleOptions extends BlockTemporalOptions {
73
+ /** The caller's transport (`rpcTransport(supabase)`). */
74
+ readonly transport: BlockTransport;
75
+ /** The caller's `supabase.storage`, for `download`. */
76
+ readonly storage?: LifecycleStorage;
77
+ /** The module schema (`sql.modules.data-lifecycle.schema`), default `better_supabase`. */
78
+ readonly schema?: string;
79
+ readonly mappers?: readonly ErrorMapper[];
80
+ /** Lifetime of a signed download URL in seconds. Default 300. */
81
+ readonly downloadTtl?: number;
82
+ }
83
+ interface DataLifecycle {
84
+ /** Exports the caller's data, or a tenant's with `organizationId` (needs `organization.export`). */
85
+ requestExport(options?: {
86
+ readonly organizationId?: string;
87
+ }): AsyncResult<DataExport>;
88
+ /** The caller's exports, or a tenant's, newest first. */
89
+ exports(organizationId?: string): AsyncResult<readonly DataExport[]>;
90
+ /** Signed URLs for a ready export's files. */
91
+ download(exportId: string): AsyncResult<DataExportDownload>;
92
+ /**
93
+ * Disables the tenant and schedules its purge after `grace` (an
94
+ * interval such as `30 days` or a `Temporal.Duration`; default the
95
+ * module's `grace` option). Needs `organization.delete`.
96
+ */
97
+ requestOrganizationDeletion(organizationId: string, options?: {
98
+ readonly grace?: Temporal.Duration | string;
99
+ }): AsyncResult<OrganizationDeletion>;
100
+ /** The requester or an owner cancels; `undefined` when nothing is pending. */
101
+ cancelOrganizationDeletion(organizationId: string): AsyncResult<OrganizationDeletion | undefined>;
102
+ /** The pending deletion, for members of the organization. */
103
+ organizationDeletion(organizationId: string): AsyncResult<OrganizationDeletion | undefined>;
104
+ }
105
+ /** Exports and organization deletion as the caller. */
106
+ export declare function createDataLifecycle(options: DataLifecycleOptions): DataLifecycle;
107
+ interface DataExporterOptions extends BlockTemporalOptions {
108
+ /** A service-role transport: the export functions are granted to `service_role` only. */
109
+ readonly transport: BlockTransport;
110
+ /** A service-role `supabase.storage`, to write the files. */
111
+ readonly storage: LifecycleStorage;
112
+ readonly schema?: string;
113
+ /** Rows read per call. Default 1000. */
114
+ readonly pageSize?: number;
115
+ /** The outbox `typePrefix`. Default `dev.better-supabase`. */
116
+ readonly typePrefix?: string;
117
+ /**
118
+ * `ndjson` (default) writes one JSON object per line; `csv` writes RFC
119
+ * 4180 CSV with a header row, nested values as JSON and formula-looking
120
+ * text prefixed with `'`, for people who open exports in a spreadsheet.
121
+ */
122
+ readonly format?: "ndjson" | "csv";
123
+ readonly concurrency?: number;
124
+ }
125
+ /** The payload `job` expects. */
126
+ interface DataExportJob {
127
+ readonly exportId: string;
128
+ }
129
+ interface DataExporter {
130
+ /**
131
+ * Writes one NDJSON file per table, then marks the export ready (which
132
+ * emits `data_export.completed`). A failure marks it failed and returns the error.
133
+ */
134
+ run(exportId: string, signal?: AbortSignal): AsyncResult<DataExport>;
135
+ /** A jobs handler: `queue.work('data-exports', exporter.job)`. */
136
+ readonly job: JobHandler<DataExportJob>;
137
+ /** An outbox sink that runs each `data_export.requested` export. */
138
+ sink(): EventSink;
139
+ }
140
+ /** Runs requested exports with a service-role client. */
141
+ export declare function createDataExporter(options: DataExporterOptions): DataExporter;
142
+ interface OrganizationPurgerOptions extends BlockTemporalOptions {
143
+ /** A service-role transport: `purge_organization()` is granted to `service_role` only. */
144
+ readonly transport: BlockTransport;
145
+ /** A service-role `supabase.storage`, to remove each bucket's organization prefix. */
146
+ readonly storage?: LifecycleStorage;
147
+ /**
148
+ * Buckets to clear: a name, for a bucket whose paths start with the
149
+ * organization id (`attachments`), or `{ bucket, path }` with a path
150
+ * template such as `orgs/{organizationId}/files`, or a function that
151
+ * returns the prefixes, for buckets laid out another way.
152
+ */
153
+ readonly buckets?: readonly PurgeBucket[];
154
+ /** `createBilling(...)`, to cancel the subscription first. */
155
+ readonly billing?: {
156
+ cancelSubscription(organizationId: string): AsyncResult<unknown>;
157
+ };
158
+ /**
159
+ * Revokes the `credential_ref`s in the rows the purge deletes (provider
160
+ * keys, connector servers and grants, workflow credentials) before it
161
+ * deletes them. Only refs that carry the organization as their `tenant`
162
+ * are revoked; the rest are returned in `credentials.unrevoked`.
163
+ */
164
+ readonly credentials?: CredentialProvider;
165
+ /**
166
+ * Also run the `sql.modules.data-lifecycle.options.anonymize` rules in
167
+ * `job`, after the due purges. Default false.
168
+ */
169
+ readonly anonymize?: boolean;
170
+ readonly schema?: string;
171
+ }
172
+ /** A bucket the purger clears, and where the organization's objects are. */
173
+ type PurgeBucket = string | {
174
+ readonly bucket: string;
175
+ /** A prefix template with `{organizationId}`, or the prefixes for an id. */
176
+ readonly path: string | ((organizationId: string) => string | readonly string[]);
177
+ };
178
+ /** A `credential_ref` the purge deleted without revoking it. */
179
+ interface UnrevokedCredential {
180
+ /** `schema.table`. */
181
+ readonly table: string;
182
+ readonly column: string;
183
+ readonly ref: CredentialRef;
184
+ readonly subject: CredentialSubject;
185
+ /**
186
+ * `foreign`: the ref doesn't carry the organization as its tenant, so it
187
+ * may name a credential that someone else still uses; `no_provider`: the
188
+ * purger has no `credentials`; `not_revocable`: the provider can't revoke it.
189
+ */
190
+ readonly reason: "foreign" | "no_provider" | "not_revocable";
191
+ }
192
+ interface OrganizationPurge {
193
+ readonly organizationId: string;
194
+ /** Rows deleted per table. */
195
+ readonly deleted: Readonly<Record<string, number>>;
196
+ /** Objects removed per bucket. */
197
+ readonly removed: Readonly<Record<string, number>>;
198
+ readonly credentials: {
199
+ /** Refs revoked through `credentials`. */
200
+ readonly revoked: number;
201
+ /** Refs in the purged rows the provider still holds, for the app to handle. */
202
+ readonly unrevoked: readonly UnrevokedCredential[];
203
+ };
204
+ }
205
+ interface OrganizationPurger {
206
+ /**
207
+ * Checks that the deletion is due, cancels billing, revokes the
208
+ * organization's credentials, removes the Storage prefixes, then deletes
209
+ * the rows.
210
+ */
211
+ purge(organizationId: string): AsyncResult<OrganizationPurge>;
212
+ /** Purges every deletion past its grace period, oldest first; stops at the first error. */
213
+ purgeDue(options?: {
214
+ readonly limit?: number;
215
+ }): AsyncResult<readonly OrganizationPurge[]>;
216
+ /** A jobs handler for a cron queue: purges what is due. */
217
+ readonly job: JobHandler<{
218
+ readonly limit?: number;
219
+ }>;
220
+ /**
221
+ * Removes the files of exports past their `expiresAt` from Storage, then
222
+ * their rows; returns how many exports it removed. Needs `storage`.
223
+ */
224
+ purgeExports(options?: {
225
+ readonly limit?: number;
226
+ }): AsyncResult<number>;
227
+ /**
228
+ * Applies the `options.anonymize` rules to the rows whose time is up, at
229
+ * most `limit` (1000) per rule; returns the rows anonymized per table.
230
+ */
231
+ anonymizeDue(options?: {
232
+ readonly limit?: number;
233
+ }): AsyncResult<Readonly<Record<string, number>>>;
234
+ }
235
+ /** Purges organizations whose deletion grace period is over. */
236
+ export declare function createOrganizationPurger(options: OrganizationPurgerOptions): OrganizationPurger;
237
+ //#endregion
238
+ //#region src/sql/modules/data-lifecycle.d.ts
239
+ /** An app table in `options.tables`: its user and tenant columns. */
240
+ interface LifecycleTable {
241
+ /** The column holding the user id, for user exports. */
242
+ readonly user?: string;
243
+ /** The tenant column, for organization exports and the purge. */
244
+ readonly tenant?: string;
245
+ /** Delete its tenant rows in the purge. Default true. */
246
+ readonly purge?: boolean;
247
+ readonly omit?: readonly string[];
248
+ readonly export?: boolean;
249
+ }
250
+ //#endregion
251
+ export { type BlockTransport, type DataExport, type DataExportDownload, type DataExportJob, type DataExportStatus, type DataExporter, type DataExporterOptions, type DataLifecycle, type DataLifecycleOptions, type LifecycleBucket, type LifecycleStorage, type LifecycleTable, type OrganizationDeletion, type OrganizationPurge, type OrganizationPurger, type OrganizationPurgerOptions, type PurgeBucket, type StorageEntry, type UnrevokedCredential, rpcTransport, sqlTransport };
@@ -0,0 +1,353 @@
1
+ import { n as dbError } from "../../errors-B11Duf73.js";
2
+ import { a as ok, r as err, t as AsyncResult } from "../../result-DzUbqgdW.js";
3
+ import { n as credentialRefInTenant } from "../../provider-Di3sRutW.js";
4
+ import { n as rpcTransport, r as sqlTransport } from "../../block-transport-BLr-ZgLc.js";
5
+ import { D as stringsOf, O as textOf, c as errorText, d as isRecord, h as optionalText, i as blockCall, k as toInstant, m as optionalInstant, n as applyTemporal, x as recordsOf, y as recordOf } from "../../block-helpers-DWHxHsEQ.js";
6
+ import { t as toCsv } from "../../csv-CPAzEmB6.js";
7
+ import { t as fromStorageError } from "../../errors-DLjJHPLK.js";
8
+ //#region src/blocks/data-lifecycle/data-lifecycle.ts
9
+ const EXPORT_STATUSES = [
10
+ "pending",
11
+ "running",
12
+ "ready",
13
+ "failed"
14
+ ];
15
+ function exportOf(value) {
16
+ const row = recordOf(value, "data_exports");
17
+ const status = EXPORT_STATUSES.find((candidate) => candidate === row["status"]);
18
+ if (status === void 0) throw new TypeError(`Unknown export status ${JSON.stringify(row["status"])}`);
19
+ return {
20
+ id: textOf(row["id"]),
21
+ subject: row["subject"] === "organization" ? "organization" : "user",
22
+ userId: optionalText(row["user_id"]),
23
+ organizationId: optionalText(row["organization_id"]),
24
+ status,
25
+ bucket: textOf(row["bucket"]),
26
+ files: stringsOf(row["files"]),
27
+ error: optionalText(row["error"]),
28
+ requestedBy: optionalText(row["requested_by"]),
29
+ requestedAt: toInstant(textOf(row["requested_at"])),
30
+ completedAt: optionalInstant(row["completed_at"]),
31
+ expiresAt: optionalInstant(row["expires_at"])
32
+ };
33
+ }
34
+ function deletionOf(value) {
35
+ const row = recordOf(value, "organization_deletions");
36
+ return {
37
+ organizationId: textOf(row["organization_id"]),
38
+ requestedBy: optionalText(row["requested_by"]),
39
+ requestedAt: toInstant(textOf(row["requested_at"])),
40
+ purgeAfter: toInstant(textOf(row["purge_after"])),
41
+ cancelledAt: optionalInstant(row["cancelled_at"]),
42
+ purgedAt: optionalInstant(row["purged_at"])
43
+ };
44
+ }
45
+ const optionalDeletion = (value) => isRecord(value) ? deletionOf(value) : void 0;
46
+ function stored(reply) {
47
+ return AsyncResult.from(async () => {
48
+ try {
49
+ const { data, error } = await reply;
50
+ if (error) return err(fromStorageError(error, "storage.objects"));
51
+ if (data === null || data === void 0) return err(dbError("network", "Storage returned no data"));
52
+ return ok(data);
53
+ } catch (cause) {
54
+ return err(fromStorageError(cause, "storage.objects"));
55
+ }
56
+ });
57
+ }
58
+ /** The table a file holds: `{id}/public.projects.ndjson` gives `public.projects`. */
59
+ const tableOf = (path) => path.slice(path.lastIndexOf("/") + 1).replace(/\.(ndjson|csv)$/, "");
60
+ /** Exports and organization deletion as the caller. */
61
+ function createDataLifecycle(options) {
62
+ applyTemporal(options);
63
+ const call = blockCall(options.transport, options.schema, options.mappers);
64
+ const ttl = options.downloadTtl ?? 300;
65
+ return {
66
+ requestExport: (request = {}) => call("request_data_export", request.organizationId === void 0 ? { subject: "user" } : {
67
+ subject: "organization",
68
+ tenant: request.organizationId
69
+ }, exportOf),
70
+ exports: (organizationId) => call("list_data_exports", { tenant: organizationId }, (value) => recordsOf(value, "list_data_exports").map(exportOf)),
71
+ download: (exportId) => call("get_data_export", { id: exportId }, (value) => value).andThen(async (value) => {
72
+ if (!isRecord(value)) return err(dbError("not_found", "No export you can see has this id", { hint: "DATA_EXPORT_NOT_FOUND" }));
73
+ const found = exportOf(value);
74
+ if (found.status !== "ready") return err(dbError("invalid_request", "The export is not ready", { hint: "DATA_EXPORT_NOT_READY" }));
75
+ if (!options.storage) return err(dbError("invalid_request", "Pass storage to createDataLifecycle to download exports"));
76
+ const bucket = options.storage.from(found.bucket);
77
+ const files = [];
78
+ for (const path of found.files) {
79
+ const signed = await stored(bucket.createSignedUrl(path, ttl, { download: true }));
80
+ if (!signed.ok) return signed;
81
+ files.push({
82
+ table: tableOf(path),
83
+ url: signed.data.signedUrl
84
+ });
85
+ }
86
+ return ok({
87
+ export: found,
88
+ files
89
+ });
90
+ }),
91
+ requestOrganizationDeletion: (organizationId, request = {}) => call("request_organization_deletion", {
92
+ tenant: organizationId,
93
+ grace: request.grace === void 0 ? void 0 : String(request.grace)
94
+ }, deletionOf),
95
+ cancelOrganizationDeletion: (organizationId) => call("cancel_organization_deletion", { tenant: organizationId }, optionalDeletion),
96
+ organizationDeletion: (organizationId) => call("organization_deletion", { tenant: organizationId }, optionalDeletion)
97
+ };
98
+ }
99
+ /** Runs requested exports with a service-role client. */
100
+ function createDataExporter(options) {
101
+ applyTemporal(options);
102
+ const call = blockCall(options.transport, options.schema);
103
+ const pageSize = options.pageSize ?? 1e3;
104
+ const concurrency = options.concurrency ?? 4;
105
+ if (!Number.isInteger(concurrency) || concurrency < 1) throw new TypeError("createDataExporter: concurrency must be a whole number above zero");
106
+ const prefix = `${options.typePrefix ?? "dev.better-supabase"}.`;
107
+ const write = async (claimed, tables, signal) => {
108
+ const bucket = options.storage.from(claimed.bucket);
109
+ const csv = options.format === "csv";
110
+ const exportTable = async (table) => {
111
+ const lines = [];
112
+ const records = [];
113
+ let after;
114
+ do {
115
+ signal?.throwIfAborted();
116
+ const page = await call("data_export_rows", {
117
+ id: claimed.id,
118
+ table_name: table,
119
+ after,
120
+ page_size: pageSize
121
+ }, (value) => recordOf(value, "data_export_rows"));
122
+ if (!page.ok) return page;
123
+ const rows = Array.isArray(page.data["rows"]) ? page.data["rows"] : [];
124
+ for (const row of rows) if (csv) records.push(isRecord(row) ? row : { value: row });
125
+ else lines.push(JSON.stringify(row));
126
+ after = optionalText(page.data["after"]);
127
+ } while (after !== void 0);
128
+ const path = `${claimed.id}/${table}.${csv ? "csv" : "ndjson"}`;
129
+ const contentType = csv ? "text/csv" : "application/x-ndjson";
130
+ const body = new Blob(csv ? records.length === 0 ? [] : [toCsv(records)] : lines.length === 0 ? [] : [`${lines.join("\n")}\n`], { type: contentType });
131
+ const uploaded = await stored(bucket.upload(path, body, {
132
+ contentType,
133
+ upsert: true
134
+ }));
135
+ return uploaded.ok ? ok(path) : uploaded;
136
+ };
137
+ const files = [];
138
+ let failed;
139
+ let next = 0;
140
+ let stopped = false;
141
+ const worker = async () => {
142
+ while (!stopped && failed === void 0 && next < tables.length) {
143
+ const index = next;
144
+ next += 1;
145
+ let written;
146
+ try {
147
+ written = await exportTable(tables[index]);
148
+ } catch (cause) {
149
+ stopped = true;
150
+ throw cause;
151
+ }
152
+ if (!written.ok) {
153
+ failed ??= written;
154
+ return;
155
+ }
156
+ files[index] = written.data;
157
+ }
158
+ };
159
+ await Promise.all(Array.from({ length: Math.min(concurrency, tables.length) }, worker));
160
+ return failed ?? ok(files);
161
+ };
162
+ const run = (exportId, signal) => call("claim_data_export", { id: exportId }, (value) => value).andThen(async (value) => {
163
+ if (!isRecord(value)) return err(dbError("not_found", "No pending export has this id", { hint: "DATA_EXPORT_NOT_FOUND" }));
164
+ const claimed = exportOf(value);
165
+ let written;
166
+ try {
167
+ written = await write(claimed, stringsOf(value["tables"]), signal);
168
+ } catch (cause) {
169
+ written = err(dbError(signal?.aborted ? "aborted" : "raised", errorText(cause), { hint: "DATA_EXPORT_FAILED" }));
170
+ }
171
+ if (!written.ok) {
172
+ await call("fail_data_export", {
173
+ id: claimed.id,
174
+ error: written.error.message
175
+ }, () => void 0);
176
+ return written;
177
+ }
178
+ return call("complete_data_export", {
179
+ id: claimed.id,
180
+ files: written.data
181
+ }, exportOf);
182
+ });
183
+ return {
184
+ run,
185
+ job: async (payload, _job, signal) => {
186
+ await run(payload.exportId, signal).orThrow();
187
+ },
188
+ sink: () => ({ async send(events) {
189
+ for (const event of events) {
190
+ if ((event.type.startsWith(prefix) ? event.type.slice(prefix.length) : event.type) !== "data_export.requested" || !isRecord(event.data)) continue;
191
+ const id = optionalText(event.data["exportId"]);
192
+ if (id !== void 0) await run(id).orThrow();
193
+ }
194
+ } })
195
+ };
196
+ }
197
+ /** The prefixes an entry of `buckets` clears for an organization. */
198
+ function bucketPrefixes(entry, organizationId) {
199
+ if (typeof entry === "string") return ok({
200
+ bucket: entry,
201
+ prefixes: [organizationId]
202
+ });
203
+ const paths = typeof entry.path === "function" ? entry.path(organizationId) : entry.path.replaceAll("{organizationId}", organizationId);
204
+ const prefixes = (typeof paths === "string" ? [paths] : [...paths]).map((path) => path.replace(/\/+$/, ""));
205
+ const unsafe = prefixes.find((prefix) => !prefix.includes(organizationId));
206
+ if (unsafe !== void 0) return err(dbError("invalid_request", `buckets.${entry.bucket}: the prefix "${unsafe}" doesn't contain the organization id, so it could clear other tenants' objects`));
207
+ return ok({
208
+ bucket: entry.bucket,
209
+ prefixes
210
+ });
211
+ }
212
+ const REMOVE_BATCH = 1e3;
213
+ async function removePrefix(bucket, prefix) {
214
+ const files = [];
215
+ const folders = [prefix];
216
+ while (folders.length > 0) {
217
+ const folder = folders.pop() ?? prefix;
218
+ for (let offset = 0;; offset += REMOVE_BATCH) {
219
+ const page = await stored(bucket.list(folder, {
220
+ limit: REMOVE_BATCH,
221
+ offset
222
+ }));
223
+ if (!page.ok) return page;
224
+ for (const entry of page.data) {
225
+ const path = `${folder}/${entry.name}`;
226
+ if (entry.id === null) folders.push(path);
227
+ else files.push(path);
228
+ }
229
+ if (page.data.length < REMOVE_BATCH) break;
230
+ }
231
+ }
232
+ for (let start = 0; start < files.length; start += REMOVE_BATCH) {
233
+ const removed = await stored(bucket.remove(files.slice(start, start + REMOVE_BATCH)));
234
+ if (!removed.ok) return removed;
235
+ }
236
+ return ok(files.length);
237
+ }
238
+ function purgeCredentialOf(value) {
239
+ if (!isRecord(value)) return void 0;
240
+ const ref = value["ref"];
241
+ if (!isRecord(ref) || typeof ref["provider"] !== "string") return void 0;
242
+ const userId = optionalText(value["user_id"]);
243
+ return {
244
+ table: textOf(value["table"]),
245
+ column: textOf(value["column"]),
246
+ ref,
247
+ subject: userId === void 0 ? { type: "app" } : {
248
+ type: "user",
249
+ id: userId
250
+ },
251
+ inTenant: value["in_tenant"] === true
252
+ };
253
+ }
254
+ /** Purges organizations whose deletion grace period is over. */
255
+ function createOrganizationPurger(options) {
256
+ applyTemporal(options);
257
+ const call = blockCall(options.transport, options.schema);
258
+ const revokeCredentials = (organizationId, rows) => AsyncResult.from(async () => {
259
+ let revoked = 0;
260
+ const unrevoked = [];
261
+ const keep = (row, reason) => {
262
+ unrevoked.push({
263
+ table: row.table,
264
+ column: row.column,
265
+ ref: row.ref,
266
+ subject: row.subject,
267
+ reason
268
+ });
269
+ };
270
+ for (const row of rows) if (!row.inTenant || !credentialRefInTenant(row.ref, organizationId)) keep(row, "foreign");
271
+ else if (options.credentials === void 0) keep(row, "no_provider");
272
+ else if (options.credentials.capabilities(row.ref).revoke) {
273
+ const result = await options.credentials.revoke(row.ref, { subject: row.subject });
274
+ if (!result.ok) return result;
275
+ revoked += 1;
276
+ } else keep(row, "not_revocable");
277
+ return ok({
278
+ revoked,
279
+ unrevoked
280
+ });
281
+ });
282
+ const purge = (organizationId) => AsyncResult.from(async () => {
283
+ const refs = await call("organization_credential_refs", { tenant: organizationId }, (value) => Array.isArray(value) ? value.flatMap((row) => {
284
+ const parsed = purgeCredentialOf(row);
285
+ return parsed ? [parsed] : [];
286
+ }) : []);
287
+ if (!refs.ok) return refs;
288
+ if (options.billing) {
289
+ const cancelled = await options.billing.cancelSubscription(organizationId);
290
+ if (!cancelled.ok) return cancelled;
291
+ }
292
+ const credentials = await revokeCredentials(organizationId, refs.data);
293
+ if (!credentials.ok) return credentials;
294
+ const removed = {};
295
+ for (const entry of options.buckets ?? []) {
296
+ if (!options.storage) return err(dbError("invalid_request", "Pass storage to clear buckets"));
297
+ const target = bucketPrefixes(entry, organizationId);
298
+ if (!target.ok) return target;
299
+ const { bucket, prefixes } = target.data;
300
+ for (const prefix of prefixes) {
301
+ const count = await removePrefix(options.storage.from(bucket), prefix);
302
+ if (!count.ok) return count;
303
+ removed[bucket] = (removed[bucket] ?? 0) + count.data;
304
+ }
305
+ }
306
+ return call("purge_organization", { tenant: organizationId }, (value) => {
307
+ const row = recordOf(value, "purge_organization");
308
+ const deleted = isRecord(row["deleted"]) ? row["deleted"] : {};
309
+ return {
310
+ organizationId: textOf(row["organizationId"]),
311
+ deleted: Object.fromEntries(Object.entries(deleted).map(([table, count]) => [table, Number(count)])),
312
+ removed,
313
+ credentials: credentials.data
314
+ };
315
+ });
316
+ });
317
+ const purgeDue = (due = {}) => call("due_organization_deletions", { max_rows: due.limit }, (value) => recordsOf(value, "due_organization_deletions").map(deletionOf)).andThen(async (deletions) => {
318
+ const purged = [];
319
+ for (const deletion of deletions) {
320
+ const result = await purge(deletion.organizationId);
321
+ if (!result.ok) return result;
322
+ purged.push(result.data);
323
+ }
324
+ return ok(purged);
325
+ });
326
+ const purgeExports = (expired = {}) => call("expired_data_exports", { max_rows: expired.limit ?? 100 }, (value) => recordsOf(value, "expired_data_exports").map((row) => ({
327
+ id: textOf(row["id"]),
328
+ bucket: textOf(row["bucket"]),
329
+ files: Array.isArray(row["files"]) ? row["files"].filter((file) => typeof file === "string") : []
330
+ }))).andThen(async (exports) => {
331
+ if (exports.length === 0) return ok(0);
332
+ const storage = options.storage;
333
+ if (!storage) return err(dbError("invalid_request", "Pass storage to remove export files"));
334
+ for (const entry of exports) for (let start = 0; start < entry.files.length; start += REMOVE_BATCH) {
335
+ const removed = await stored(storage.from(entry.bucket).remove(entry.files.slice(start, start + REMOVE_BATCH)));
336
+ if (!removed.ok) return removed;
337
+ }
338
+ return call("forget_data_exports", { ids: exports.map((entry) => entry.id) }, (value) => Number(value ?? 0));
339
+ });
340
+ const anonymizeDue = (due = {}) => call("anonymize_due", { max_rows: due.limit }, (value) => Object.fromEntries(Object.entries(isRecord(value) ? value : {}).map(([table, count]) => [table, Number(count)])));
341
+ return {
342
+ purgeExports,
343
+ purge,
344
+ purgeDue,
345
+ anonymizeDue,
346
+ job: async (payload) => {
347
+ await purgeDue(payload).orThrow();
348
+ if (options.anonymize) await anonymizeDue().orThrow();
349
+ }
350
+ };
351
+ }
352
+ //#endregion
353
+ export { createDataExporter, createDataLifecycle, createOrganizationPurger, rpcTransport, sqlTransport };
@@ -0,0 +1,14 @@
1
+ import { t as AsyncResult } from "../../result-D7y2fT87.js";
2
+ import { t as SqlClient } from "../../executor-DbvExCFC.js";
3
+ import { i as hasEntitlement, n as EntitlementKey, t as EntitlementClaimOptions } from "../../entitlements-DHrY2UDZ.js";
4
+ //#region src/blocks/entitlements/entitlements.d.ts
5
+ /** The Stripe event sent when a customer's active entitlements change. */
6
+ export declare const ENTITLEMENTS_UPDATED = "entitlements.active_entitlement_summary.updated";
7
+ /**
8
+ * Users whose `memberships` claim carries the entitlements of the Stripe
9
+ * customer in an `entitlements.active_entitlement_summary.updated` event, so
10
+ * a job can invalidate their sessions. Empty for other payloads.
11
+ */
12
+ export declare function entitlementMembers(sql: SqlClient, payload: unknown): AsyncResult<readonly string[]>;
13
+ //#endregion
14
+ export { type EntitlementClaimOptions, type EntitlementKey, hasEntitlement };
@@ -0,0 +1,25 @@
1
+ import { n as entitlementMembers, t as ENTITLEMENTS_UPDATED } from "../../entitlements-DRl6ZJUm.js";
2
+ //#region src/auth/entitlements.ts
3
+ /**
4
+ * Whether the session's plan-features claim grants `key` in `tenantId`.
5
+ * `claim` is `config.claims.features` (default `features`), the claim
6
+ * `better_supabase.feature_claims()` fills, or `{ claim, keys }` when
7
+ * `entitlements.claim.keys` writes short codes. The claim is as fresh as the
8
+ * token: enforce it in RLS with `better_supabase.has_entitlement()`, and
9
+ * refresh the session after checkout. A tenant left out by
10
+ * `entitlements.claim.maxTenants` reads as not granted.
11
+ */
12
+ function hasEntitlement(session, tenantId, key, claim = "features") {
13
+ if (session.kind !== "user") return false;
14
+ const options = typeof claim === "string" ? { claim } : claim;
15
+ const claims = session.claims;
16
+ if (!isRecord(claims)) return false;
17
+ const features = claims[options.claim ?? "features"];
18
+ if (!isRecord(features) || !Object.hasOwn(features, tenantId)) return false;
19
+ const keys = features[tenantId];
20
+ const code = options.keys?.[key] ?? key;
21
+ return Array.isArray(keys) && keys.includes(code);
22
+ }
23
+ const isRecord = (value) => typeof value === "object" && value !== null;
24
+ //#endregion
25
+ export { ENTITLEMENTS_UPDATED, entitlementMembers, hasEntitlement };