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,714 @@
1
+ import { t as DbException } from "../../db-exception-CnWcYPxL.js";
2
+ import { n as dbError } from "../../errors-B11Duf73.js";
3
+ import { t as temporal } from "../../temporal-required-BVvW7SYJ.js";
4
+ import { a as ok, r as err, t as AsyncResult } from "../../result-DzUbqgdW.js";
5
+ import { t as SPEC_PINS } from "../../spec-pins--j6mTok4.js";
6
+ import { r as sqlIdent } from "../../template--jDkl3UP.js";
7
+ import { n as rpcTransport, r as sqlTransport } from "../../block-transport-BLr-ZgLc.js";
8
+ import { C as run, D as stringsOf, O as textOf, d as isRecord, g as pageOf, h as optionalText, i as blockCall, m as optionalInstant, n as applyTemporal, u as instantArg, w as seconds } from "../../block-helpers-DWHxHsEQ.js";
9
+ import { n as defineListQuery } from "../../list-query-gl808ac1.js";
10
+ import { t as toCsv } from "../../csv-CPAzEmB6.js";
11
+ //#region src/blocks/audit/audit.ts
12
+ const RETENTION_MANY = /* @__PURE__ */ new WeakMap();
13
+ /**
14
+ * Deletes audit entries past their retention and returns how many. Without
15
+ * `retention` it is one `purge_audit_log` call (which honours an
16
+ * `audit_retention` SQL hook); with it, each tenant is purged with its own
17
+ * interval. Run it from a schedule until it returns 0.
18
+ */
19
+ function purgeAuditLog(sql, options = {}) {
20
+ applyTemporal(options);
21
+ const olderThan = seconds(options.olderThan ?? "1 year");
22
+ const batch = options.batch ?? 1e4;
23
+ const purge = async (params, call) => {
24
+ const [row] = await sql.queryRaw(`select better_supabase.purge_audit_log(${call}) as n`, params);
25
+ return Number(row?.n ?? 0);
26
+ };
27
+ const { retention } = options;
28
+ if (!retention) return run(() => purge([olderThan, batch], "$1::interval, $2"));
29
+ return run(async () => {
30
+ const tenants = await sql.queryRaw("select tenant::text from better_supabase.audit_events_tenants($1::interval) as tenant", ["1 day"]);
31
+ const many = RETENTION_MANY.get(retention);
32
+ const ids = tenants.flatMap(({ tenant }) => tenant === null ? [] : [tenant]);
33
+ const known = many && ids.length > 0 ? await many(ids) : void 0;
34
+ let purged = 0;
35
+ for (const { tenant } of tenants) {
36
+ const days = known ? tenant === null ? void 0 : known.get(tenant) : await retention(tenant);
37
+ const keep = days === void 0 ? olderThan : `${days} days`;
38
+ purged += await purge([
39
+ keep,
40
+ batch,
41
+ tenant
42
+ ], "$1::interval, $2, $3, true");
43
+ }
44
+ return purged;
45
+ });
46
+ }
47
+ /**
48
+ * A `retention` callback for `purgeAuditLog` that reads each tenant's days
49
+ * from a column (a plan's `audit_retention_days`, say). `purgeAuditLog` reads
50
+ * every tenant's days in one query; a direct call reads one tenant.
51
+ */
52
+ function setAuditRetention(sql, source) {
53
+ const [schema, name] = source.table.includes(".") ? source.table.split(".", 2) : ["public", source.table];
54
+ const key = sqlIdent(source.key ?? "id");
55
+ const from = `${sqlIdent(source.column)}::integer as days from ${sqlIdent(schema)}.${sqlIdent(name)}`;
56
+ const kept = (days) => typeof days === "number" && days > 0 ? days : void 0;
57
+ const retention = async (tenant) => {
58
+ if (tenant === null) return;
59
+ const [row] = await sql.queryRaw(`select ${from} where ${key}::text = $1`, [tenant]);
60
+ return kept(row?.days);
61
+ };
62
+ RETENTION_MANY.set(retention, async (tenants) => {
63
+ const rows = await sql.queryRaw(`select ${key}::text as tenant, ${from} where ${key}::text = any($1::text[])`, [tenants]);
64
+ const days = /* @__PURE__ */ new Map();
65
+ for (const row of rows) {
66
+ const value = kept(row.days);
67
+ if (value !== void 0) days.set(row.tenant, value);
68
+ }
69
+ return days;
70
+ });
71
+ return retention;
72
+ }
73
+ const COLUMNS = [
74
+ "id",
75
+ "occurred_at",
76
+ "op",
77
+ "table_name",
78
+ "record_id",
79
+ "changed",
80
+ "actor_id",
81
+ "actor_role",
82
+ "organization_id",
83
+ "event_type",
84
+ "category",
85
+ "outcome",
86
+ "source",
87
+ "target_type",
88
+ "metadata"
89
+ ];
90
+ function entryOf$1(row) {
91
+ const text = (key) => optionalText(row[key]);
92
+ const pick = (key, value) => value === void 0 ? {} : { [key]: value };
93
+ const metadata = row["metadata"];
94
+ return {
95
+ id: textOf(row["id"]),
96
+ occurredAt: optionalInstant(row["occurred_at"]) ?? temporal().Instant.fromEpochMilliseconds(0),
97
+ op: textOf(row["op"]),
98
+ ...pick("table", text("table_name")),
99
+ ...pick("record", text("record_id")),
100
+ ...pick("changed", row["changed"] === null || row["changed"] === void 0 ? void 0 : stringsOf(row["changed"])),
101
+ ...pick("actor", text("actor_id")),
102
+ ...pick("actorRole", text("actor_role")),
103
+ ...pick("organizationId", text("organization_id")),
104
+ ...pick("eventType", text("event_type")),
105
+ ...pick("category", text("category")),
106
+ ...pick("outcome", text("outcome")),
107
+ ...pick("source", text("source")),
108
+ ...pick("targetType", text("target_type")),
109
+ ...pick("metadata", typeof metadata === "object" && metadata !== null && !Array.isArray(metadata) ? metadata : void 0)
110
+ };
111
+ }
112
+ const ENTITY_ACTIVITY = {
113
+ insert: [1, "Create"],
114
+ update: [3, "Update"],
115
+ delete: [4, "Delete"]
116
+ };
117
+ const API_ACTIVITY = [
118
+ [
119
+ /(^|[._])(create|created|add|added|insert|inserted)$/,
120
+ 1,
121
+ "Create"
122
+ ],
123
+ [
124
+ /(^|[._])(read|viewed|view|get|list|exported|export)$/,
125
+ 2,
126
+ "Read"
127
+ ],
128
+ [
129
+ /(^|[._])(update|updated|change|changed|rename|renamed)$/,
130
+ 3,
131
+ "Update"
132
+ ],
133
+ [
134
+ /(^|[._])(delete|deleted|remove|removed|revoke|revoked)$/,
135
+ 4,
136
+ "Delete"
137
+ ]
138
+ ];
139
+ function status(outcome) {
140
+ switch (outcome) {
141
+ case void 0:
142
+ case "success":
143
+ case "succeeded": return {
144
+ status_id: 1,
145
+ status: "Success"
146
+ };
147
+ case "failure":
148
+ case "failed":
149
+ case "denied": return {
150
+ status_id: 2,
151
+ status: "Failure"
152
+ };
153
+ default: return {
154
+ status_id: 99,
155
+ status: outcome
156
+ };
157
+ }
158
+ }
159
+ /**
160
+ * One entry as an OCSF event (`SPEC_PINS.ocsf`). Row changes are Entity
161
+ * Management (3004); semantic events are API Activity (6003), with the
162
+ * activity read from the event type's last segment (`deal.created` is Create).
163
+ */
164
+ function toOcsf(entry, product) {
165
+ const metadata = {
166
+ version: SPEC_PINS.ocsf,
167
+ product,
168
+ uid: entry.id,
169
+ log_name: "audit_events",
170
+ ...entry.organizationId ? { tenant_uid: entry.organizationId } : {}
171
+ };
172
+ const actor = { user: {
173
+ uid: entry.actor ?? "system",
174
+ ...entry.actorRole ? { type: entry.actorRole } : {}
175
+ } };
176
+ const base = {
177
+ severity_id: 1,
178
+ severity: "Informational",
179
+ time: entry.occurredAt.epochMilliseconds,
180
+ ...status(entry.outcome),
181
+ metadata,
182
+ actor
183
+ };
184
+ const known = ENTITY_ACTIVITY[entry.op];
185
+ if (entry.op !== "event" && known) {
186
+ const [activity, name] = known;
187
+ return {
188
+ class_uid: 3004,
189
+ class_name: "Entity Management",
190
+ category_uid: 3,
191
+ category_name: "Identity & Access Management",
192
+ activity_id: activity,
193
+ activity_name: name,
194
+ type_uid: 300400 + activity,
195
+ ...base,
196
+ entity: {
197
+ uid: entry.record ?? "",
198
+ type: entry.table ?? "row"
199
+ },
200
+ ...entry.changed ? { unmapped: { changed: entry.changed } } : {}
201
+ };
202
+ }
203
+ const operation = entry.eventType ?? entry.op;
204
+ const match = API_ACTIVITY.find(([pattern]) => pattern.test(operation));
205
+ const [activity, name] = match ? [match[1], match[2]] : [99, operation];
206
+ return {
207
+ class_uid: 6003,
208
+ class_name: "API Activity",
209
+ category_uid: 6,
210
+ category_name: "Application Activity",
211
+ activity_id: activity,
212
+ activity_name: name,
213
+ type_uid: 600300 + activity,
214
+ ...base,
215
+ api: { operation },
216
+ src_endpoint: { name: entry.source ?? "database" },
217
+ ...entry.record || entry.targetType ? { resources: [{
218
+ uid: entry.record ?? "",
219
+ type: entry.targetType ?? entry.table ?? "resource"
220
+ }] } : {},
221
+ ...entry.metadata || entry.category ? { unmapped: {
222
+ ...entry.category ? { category: entry.category } : {},
223
+ ...entry.metadata ? { metadata: entry.metadata } : {}
224
+ } } : {}
225
+ };
226
+ }
227
+ /**
228
+ * Streams one tenant's audit entries as newline-delimited JSON, in id
229
+ * order, one keyset query per batch. Run it with a member's claims (the
230
+ * `readPolicy` filters) or as the service role. It reads the managed
231
+ * module's column names; for an adopted log, the version 3 columns or CSV,
232
+ * use `createAuditLog().export()`, which reads `list_audit_events`.
233
+ */
234
+ function exportAuditLog(sql, options) {
235
+ applyTemporal(options);
236
+ const format = options.format ?? "ndjson";
237
+ if (format === "ocsf" && !options.product) throw new TypeError("exportAuditLog: the ocsf format needs product");
238
+ const batch = options.batch ?? 1e3;
239
+ const [schema, name] = (options.table ?? "better_supabase.audit_events").split(".", 2);
240
+ const text = `select ${COLUMNS.map((column) => sqlIdent(column)).join(", ")}
241
+ from ${sqlIdent(schema)}.${sqlIdent(name)}
242
+ where organization_id::text = $1
243
+ and ($2::timestamptz is null or occurred_at >= $2)
244
+ and ($3::timestamptz is null or occurred_at < $3)
245
+ and id > $4
246
+ order by id
247
+ limit $5`;
248
+ const encoder = new TextEncoder();
249
+ let after = "0";
250
+ let done = false;
251
+ return new ReadableStream({ async pull(controller) {
252
+ if (done) return;
253
+ const rows = await sql.queryRaw(text, [
254
+ options.organizationId,
255
+ instantArg(options.from) ?? null,
256
+ instantArg(options.to) ?? null,
257
+ after,
258
+ batch
259
+ ]);
260
+ const lines = rows.map((row) => {
261
+ const entry = entryOf$1(row);
262
+ return JSON.stringify(format === "ocsf" ? toOcsf(entry, options.product) : entry);
263
+ });
264
+ if (lines.length > 0) {
265
+ controller.enqueue(encoder.encode(`${lines.join("\n")}\n`));
266
+ after = textOf(rows.at(-1)["id"]);
267
+ }
268
+ if (rows.length < batch) {
269
+ done = true;
270
+ controller.close();
271
+ }
272
+ } });
273
+ }
274
+ const FACETS = [
275
+ [
276
+ "table",
277
+ "table_name",
278
+ "tableName"
279
+ ],
280
+ [
281
+ "record",
282
+ "record_id",
283
+ "recordId"
284
+ ],
285
+ [
286
+ "op",
287
+ "op",
288
+ "op"
289
+ ],
290
+ [
291
+ "actor",
292
+ "actor_id",
293
+ "actorId"
294
+ ],
295
+ [
296
+ "event",
297
+ "event_type",
298
+ "eventType"
299
+ ],
300
+ [
301
+ "category",
302
+ "category",
303
+ "category"
304
+ ],
305
+ [
306
+ "outcome",
307
+ "outcome",
308
+ "outcome"
309
+ ],
310
+ [
311
+ "target",
312
+ "target_type",
313
+ "targetType"
314
+ ]
315
+ ];
316
+ /**
317
+ * A cursor-paged list over the audit table through the Data API or
318
+ * `ctx.sql` (generate types for the module's schema to get it in your
319
+ * models; facets follow the managed column names). `createAuditLog().list()`
320
+ * reads `list_audit_events` instead, with an adopted log's columns mapped.
321
+ * Filtered by actor,
322
+ * table, record, event type, category, outcome and target, newest first.
323
+ * The `readPolicy` and the `restricted` table decide what a member sees.
324
+ */
325
+ function auditListQuery(betterSupabase, table, options = {}) {
326
+ const meta = betterSupabase.meta.tables[table];
327
+ if (!meta) throw new TypeError(`auditListQuery: unknown table "${table}"`);
328
+ const camel = meta.columns["occurredAt"] !== void 0;
329
+ const col = (snake, camelName) => camel ? camelName : snake;
330
+ const facets = Object.fromEntries(FACETS.map(([key, snake, camelName]) => [key, col(snake, camelName)]).filter(([, column]) => meta.columns[column] !== void 0));
331
+ const occurredAt = col("occurred_at", "occurredAt");
332
+ const config = {
333
+ facets,
334
+ sorts: {
335
+ newest: [{ [occurredAt]: "desc" }, { id: "desc" }],
336
+ oldest: [{ [occurredAt]: "asc" }, { id: "asc" }]
337
+ },
338
+ defaultSort: "newest",
339
+ pagination: "cursor",
340
+ ...options.pageSize === void 0 ? {} : { pageSize: options.pageSize },
341
+ ...options.maxPageSize === void 0 ? {} : { maxPageSize: options.maxPageSize }
342
+ };
343
+ const list = defineListQuery(betterSupabase, table, config);
344
+ return Object.assign(list, { between(from, to) {
345
+ const range = {
346
+ ...from ? { gte: from.toString() } : {},
347
+ ...to ? { lt: to.toString() } : {}
348
+ };
349
+ return Object.keys(range).length === 0 ? {} : { [occurredAt]: range };
350
+ } });
351
+ }
352
+ //#endregion
353
+ //#region src/blocks/audit/csv.ts
354
+ const DEFAULT_COLUMNS = [
355
+ "id",
356
+ "occurredAt",
357
+ "op",
358
+ "eventType",
359
+ "category",
360
+ "outcome",
361
+ "actorId",
362
+ "actorLabel",
363
+ "actorRole",
364
+ "actorKind",
365
+ "tenant",
366
+ "tenantLabel",
367
+ "table",
368
+ "record",
369
+ "targetType",
370
+ "targetLabel",
371
+ "summary",
372
+ "changed",
373
+ "source",
374
+ "requestId",
375
+ "correlationId",
376
+ "impersonatedBy",
377
+ "metadata"
378
+ ];
379
+ const keyOf = (column) => typeof column === "string" ? column : column.key;
380
+ /** Whether the columns read restricted details. */
381
+ const revealsDetails = (columns) => (columns ?? []).some((column) => keyOf(column).startsWith("restricted."));
382
+ function defaultRow(record, keys, details) {
383
+ const row = {
384
+ ...record,
385
+ occurredAt: record.occurredAt.toString(),
386
+ changed: record.changed?.join(" ")
387
+ };
388
+ for (const key of keys) {
389
+ const [scope, ...rest] = key.split(".");
390
+ const name = rest.join(".");
391
+ if (scope === "columns" && name !== "") row[key] = record.columns?.[name];
392
+ if (scope === "restricted" && name !== "") row[key] = new Map(Object.entries(details ?? {})).get(name);
393
+ }
394
+ return row;
395
+ }
396
+ /** One cell per line, escaped like the rows. */
397
+ const lines = (values) => values.map((value) => {
398
+ const csv = toCsv([{ value }], { columns: ["value"] });
399
+ return csv.slice(csv.indexOf("\r\n") + 2);
400
+ }).join("");
401
+ /** A page of CSV, with the preamble and header row on the first. */
402
+ function csvPage(entries, options, details, first) {
403
+ const columns = options.columns ?? DEFAULT_COLUMNS;
404
+ const keys = columns.map(keyOf);
405
+ const rows = entries.map((record) => {
406
+ const found = details?.get(record.id);
407
+ const row = defaultRow(record, keys, found);
408
+ return options.formatRow ? options.formatRow(row, record, found) : row;
409
+ });
410
+ const csv = toCsv(rows, { columns: keys });
411
+ const body = csv.slice(csv.indexOf("\r\n") + 2);
412
+ if (!first) return body;
413
+ const header = toCsv([], { columns: columns.map((column) => typeof column === "string" ? column : column.label) });
414
+ return `${lines(options.preamble ?? [])}${header}${body}`;
415
+ }
416
+ //#endregion
417
+ //#region src/blocks/audit/sink.ts
418
+ const textIn = (value) => typeof value === "string" && value !== "" ? value : void 0;
419
+ const defaultCategory = (eventType) => eventType.startsWith("account.") || eventType.startsWith("support.") ? "security" : void 0;
420
+ /**
421
+ * The audit entry for one CloudEvent: its type without the prefix, its
422
+ * subject as the record, the tenant from the `tenant` or `partitionkey`
423
+ * extension (or `data.organizationId`), and the data as metadata. The
424
+ * idempotency key is the event's source and id, so a redelivery records once.
425
+ */
426
+ function auditEventOf(event, options = {}) {
427
+ const prefix = `${options.typePrefix ?? "dev.better-supabase"}.`;
428
+ const data = isRecord(event.data) ? event.data : void 0;
429
+ const organizationId = textIn(event["tenant"]) ?? textIn(event["partitionkey"]) ?? textIn(data?.["organizationId"]);
430
+ const actorId = textIn(data?.["actorId"]);
431
+ const metadata = data ?? (event.data === void 0 ? void 0 : { data: event.data });
432
+ const eventType = event.type.startsWith(prefix) ? event.type.slice(prefix.length) : event.type;
433
+ const category = (options.category ?? defaultCategory)(eventType);
434
+ return {
435
+ eventType,
436
+ idempotencyKey: `${event.source}#${event.id}`,
437
+ ...category === void 0 ? {} : { category },
438
+ ...event.subject === void 0 ? {} : { record: event.subject },
439
+ ...organizationId === void 0 ? {} : { organizationId },
440
+ ...actorId === void 0 ? {} : { actorId },
441
+ ...metadata === void 0 ? {} : { metadata }
442
+ };
443
+ }
444
+ /**
445
+ * An `EventSink` that records each CloudEvent in the audit log. `send`
446
+ * throws when an entry fails, so an outbox relay retries the batch; the
447
+ * idempotency key keeps the entries already written from repeating.
448
+ */
449
+ function auditSink(record, options = {}) {
450
+ return { async send(events) {
451
+ let failure;
452
+ for (const event of events) {
453
+ const result = await record(auditEventOf(event, options));
454
+ if (!result.ok) failure ??= new DbException(result.error);
455
+ }
456
+ if (failure !== void 0) throw failure;
457
+ } };
458
+ }
459
+ //#endregion
460
+ //#region src/blocks/audit/client.ts
461
+ const TEXT_KEYS = [
462
+ "op",
463
+ "table",
464
+ "record",
465
+ "actorId",
466
+ "actorRole",
467
+ "actorKind",
468
+ "actorLabel",
469
+ "tenant",
470
+ "tenantLabel",
471
+ "impersonatedBy",
472
+ "impersonationReason",
473
+ "supportSession",
474
+ "eventType",
475
+ "category",
476
+ "outcome",
477
+ "source",
478
+ "targetType",
479
+ "targetLabel",
480
+ "summary",
481
+ "requestId",
482
+ "correlationId",
483
+ "scope"
484
+ ];
485
+ function recordOfEntry(value) {
486
+ const row = isRecord(value) ? value : {};
487
+ const text = {};
488
+ for (const key of TEXT_KEYS) {
489
+ const found = optionalText(row[key]);
490
+ if (found !== void 0) text[key] = found;
491
+ }
492
+ const json = (key) => {
493
+ const found = row[key];
494
+ return isRecord(found) ? found : void 0;
495
+ };
496
+ const old = json("old");
497
+ const next = json("new");
498
+ const metadata = json("metadata");
499
+ const columns = json("columns");
500
+ return {
501
+ id: textOf(row["id"]),
502
+ occurredAt: optionalInstant(row["occurredAt"]) ?? temporal().Instant.fromEpochMilliseconds(0),
503
+ ...text,
504
+ ...Array.isArray(row["changed"]) ? { changed: stringsOf(row["changed"]) } : {},
505
+ ...old === void 0 ? {} : { old },
506
+ ...next === void 0 ? {} : { new: next },
507
+ ...metadata === void 0 ? {} : { metadata },
508
+ ...columns === void 0 ? {} : { columns }
509
+ };
510
+ }
511
+ /** The record in `exportAuditLog`'s `AuditEntry` shape, for `toOcsf`. */
512
+ function entryOf(record) {
513
+ return {
514
+ id: record.id,
515
+ occurredAt: record.occurredAt,
516
+ op: record.op ?? "event",
517
+ ...record.table === void 0 ? {} : { table: record.table },
518
+ ...record.record === void 0 ? {} : { record: record.record },
519
+ ...record.changed === void 0 ? {} : { changed: record.changed },
520
+ ...record.actorId === void 0 ? {} : { actor: record.actorId },
521
+ ...record.actorRole === void 0 ? {} : { actorRole: record.actorRole },
522
+ ...record.tenant === void 0 ? {} : { organizationId: record.tenant },
523
+ ...record.eventType === void 0 ? {} : { eventType: record.eventType },
524
+ ...record.category === void 0 ? {} : { category: record.category },
525
+ ...record.outcome === void 0 ? {} : { outcome: record.outcome },
526
+ ...record.source === void 0 ? {} : { source: record.source },
527
+ ...record.targetType === void 0 ? {} : { targetType: record.targetType },
528
+ ...record.metadata === void 0 ? {} : { metadata: record.metadata }
529
+ };
530
+ }
531
+ const many = (value) => value === void 0 ? void 0 : typeof value === "string" ? [value] : value;
532
+ /** `reveal_audit_entry`'s details, or one of `reveal_audit_entries`'. */
533
+ function detailsOf(value, entryId) {
534
+ const row = isRecord(value) ? value : {};
535
+ const json = (key) => {
536
+ const found = row[key];
537
+ return isRecord(found) ? { [key]: found } : {};
538
+ };
539
+ const text = (key) => {
540
+ const found = optionalText(row[key]);
541
+ return found === void 0 ? {} : { [key]: found };
542
+ };
543
+ return {
544
+ entry: textOf(row["entry"] ?? entryId),
545
+ ...json("old"),
546
+ ...json("new"),
547
+ ...json("metadata"),
548
+ ...text("ip"),
549
+ ...text("userAgent"),
550
+ ...text("sessionId"),
551
+ ...row["changes"] === void 0 || row["changes"] === null ? {} : { changes: row["changes"] }
552
+ };
553
+ }
554
+ /**
555
+ * The audit log over the `audit` module's functions, as the caller: the
556
+ * read policy decides what `list` and `export` return, and column mappings
557
+ * of an adopted log are already applied.
558
+ */
559
+ function createAuditLog(options) {
560
+ applyTemporal(options);
561
+ const call = blockCall(options.transport, options.schema, options.mappers);
562
+ const list = (list = {}) => {
563
+ const limit = list.limit ?? 50;
564
+ const filters = {
565
+ for_tenants: many(list.organizationId),
566
+ for_event_types: many(list.eventType),
567
+ for_actors: many(list.actorId),
568
+ for_target_types: many(list.targetType),
569
+ for_records: many(list.record),
570
+ for_categories: many(list.category),
571
+ for_outcomes: many(list.outcome),
572
+ for_sources: many(list.source),
573
+ for_actor_kinds: many(list.actorKind),
574
+ for_correlation_ids: many(list.correlationId),
575
+ search: list.search,
576
+ since: instantArg(list.since),
577
+ until: instantArg(list.until)
578
+ };
579
+ const { cursor } = pageOf(list);
580
+ const page = call("list_audit_events", {
581
+ ...filters,
582
+ cursor_at: instantArg(cursor?.occurredAt),
583
+ cursor_id: cursor?.id,
584
+ max_items: limit,
585
+ ascending: list.order === "asc",
586
+ skip: list.offset
587
+ }, (value) => {
588
+ const entries = (Array.isArray(value) ? value : []).map((entry) => recordOfEntry(entry));
589
+ const last = entries.at(-1);
590
+ return {
591
+ entries,
592
+ next: last === void 0 || entries.length < Math.min(limit, 1e3) ? void 0 : {
593
+ occurredAt: last.occurredAt,
594
+ id: last.id
595
+ }
596
+ };
597
+ });
598
+ if (list.count !== true) return page;
599
+ return page.andThen((data) => call("count_audit_events", filters, (value) => ({
600
+ ...data,
601
+ total: Number(value)
602
+ })));
603
+ };
604
+ const revealPage = (entries) => call("reveal_audit_entries", { entries: entries.map((entry) => entry.id) }, (value) => new Map((Array.isArray(value) ? value : []).map((row) => {
605
+ const details = detailsOf(row, "");
606
+ return [details.entry, details];
607
+ })));
608
+ const exportStream = (exporting = {}) => {
609
+ const format = exporting.format ?? "ndjson";
610
+ const product = exporting.product;
611
+ if (format === "ocsf" && !product) throw new TypeError("createAuditLog().export: the ocsf format needs product");
612
+ const encoder = new TextEncoder();
613
+ let before;
614
+ const { offset: start, columns, preamble, formatRow, ...filters } = exporting;
615
+ const csv = {
616
+ ...columns === void 0 ? {} : { columns },
617
+ ...preamble === void 0 ? {} : { preamble },
618
+ ...formatRow === void 0 ? {} : { formatRow }
619
+ };
620
+ const reveals = format === "csv" && revealsDetails(columns);
621
+ let offset = start;
622
+ let header = format === "csv";
623
+ let done = false;
624
+ return new ReadableStream({ async pull(controller) {
625
+ if (done) return;
626
+ const page = await list({
627
+ ...filters,
628
+ ...before ? { cursor: before } : {},
629
+ ...offset === void 0 ? {} : { offset },
630
+ limit: exporting.batch ?? 500
631
+ });
632
+ offset = void 0;
633
+ if (!page.ok) {
634
+ done = true;
635
+ controller.error(new Error(page.error.message));
636
+ return;
637
+ }
638
+ const { entries, next } = page.data;
639
+ let text = "";
640
+ if (format === "csv") {
641
+ let details;
642
+ if (reveals && entries.length > 0) {
643
+ const revealed = await revealPage(entries);
644
+ if (!revealed.ok) {
645
+ done = true;
646
+ controller.error(new Error(revealed.error.message));
647
+ return;
648
+ }
649
+ details = revealed.data;
650
+ }
651
+ text = csvPage(entries, csv, details, header);
652
+ header = false;
653
+ } else if (entries.length > 0) text = `${entries.map((entry) => JSON.stringify(format === "ocsf" && product ? toOcsf(entryOf(entry), product) : entry)).join("\n")}\n`;
654
+ if (text.length > 0) controller.enqueue(encoder.encode(text));
655
+ before = next;
656
+ if (next === void 0) {
657
+ done = true;
658
+ controller.close();
659
+ }
660
+ } });
661
+ };
662
+ const record = (event) => call("audit_event", {
663
+ event_type: event.eventType,
664
+ category: event.category,
665
+ outcome: event.outcome,
666
+ source: event.source,
667
+ target_type: event.targetType,
668
+ record_id: event.record,
669
+ tenant: event.organizationId,
670
+ metadata: event.metadata,
671
+ idempotency_key: event.idempotencyKey,
672
+ restricted: event.restricted,
673
+ actor_id: event.actorId,
674
+ summary: event.summary,
675
+ target_label: event.targetLabel,
676
+ correlation_id: event.correlationId,
677
+ actor_kind: event.actorKind,
678
+ actor_label: event.actorLabel,
679
+ ip: event.ip,
680
+ user_agent: event.userAgent,
681
+ session_id: event.sessionId,
682
+ request_id: event.requestId,
683
+ scope: event.scope
684
+ }, textOf);
685
+ return {
686
+ record,
687
+ sink: (sinkOptions) => auditSink(record, sinkOptions),
688
+ list,
689
+ reveal: (entryId) => call("reveal_audit_entry", { entry: entryId }, (value) => detailsOf(value, entryId)),
690
+ export: exportStream,
691
+ exportToStorage: (target) => AsyncResult.from(async () => {
692
+ const contentType = (target.format ?? "ndjson") === "csv" ? "text/csv" : "application/x-ndjson";
693
+ let body;
694
+ try {
695
+ body = new Blob([await new Response(exportStream(target)).arrayBuffer()], { type: contentType });
696
+ } catch (cause) {
697
+ return err(dbError("raised", cause instanceof Error ? cause.message : String(cause), { hint: "AUDIT_EXPORT_FAILED" }));
698
+ }
699
+ const bucket = target.storage.from(target.bucket);
700
+ if ((await bucket.upload(target.path, body, {
701
+ contentType,
702
+ upsert: true
703
+ })).error) return err(dbError("raised", "The export could not be stored", { hint: "AUDIT_EXPORT_FAILED" }));
704
+ let url;
705
+ if (target.signedUrlTtl !== void 0 && bucket.createSignedUrl) url = (await bucket.createSignedUrl(target.path, target.signedUrlTtl, { download: true })).data?.signedUrl;
706
+ return ok({
707
+ path: target.path,
708
+ url
709
+ });
710
+ })
711
+ };
712
+ }
713
+ //#endregion
714
+ export { auditEventOf, auditListQuery, auditSink, createAuditLog, exportAuditLog, purgeAuditLog, rpcTransport, setAuditRetention, sqlTransport, toOcsf };