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
@@ -1,9 +1,11 @@
1
- import { r as builderFor, s as tableMeta } from "./simplify-_0oUKqCd.js";
1
+ import { n as dbError } from "./errors-B11Duf73.js";
2
+ import { i as tableMeta, t as builderFor } from "./build-BXIzE6Xv.js";
2
3
  import { n as touchedTables } from "./tables-Cb-3_VWc.js";
3
4
  //#region src/core/spec.ts
4
5
  const READ_METHODS = [
5
6
  "findMany",
6
7
  "findFirst",
8
+ "findOnly",
7
9
  "findUnique",
8
10
  "findById",
9
11
  "count",
@@ -121,13 +123,29 @@ const PARAM = /^[a-z_][a-z0-9_]*$/i;
121
123
  const TYPE = /^(?:[a-z_][a-z0-9_]*\.)?[a-z_][a-z0-9_]*(?:\[\])?$/;
122
124
  /** `jsonb_build_object` takes at most 100 arguments. */
123
125
  const MAX_ENTRIES = 50;
124
- /** Placeholders are `NUL bs:<name> NUL`: no real parameter value holds a NUL. */
126
+ /**
127
+ * Placeholders are `NUL bs:<name> NUL`: no real parameter value holds a NUL.
128
+ * Auth placeholders start with `@`, which no parameter name can.
129
+ */
125
130
  const NUL = "\0";
126
- const SENTINEL = new RegExp(`${NUL}bs:([a-z_][a-z0-9_]*)${NUL}`, "gi");
127
- const EXACT = new RegExp(`^${NUL}bs:([a-z_][a-z0-9_]*)${NUL}$`, "i");
131
+ const SENTINEL = new RegExp(`${NUL}bs:(@?[a-z_][a-z0-9_]*)${NUL}`, "gi");
132
+ const EXACT = new RegExp(`^${NUL}bs:(@?[a-z_][a-z0-9_]*)${NUL}$`, "i");
128
133
  function sentinel(name) {
129
134
  return `${NUL}bs:${name}${NUL}`;
130
135
  }
136
+ const AUTH = { uid: sentinel("@uid") };
137
+ function tagged(name, array) {
138
+ if (!name.startsWith("@")) return {
139
+ kind: "param",
140
+ name,
141
+ array
142
+ };
143
+ return name === "@uid" ? {
144
+ kind: "auth",
145
+ name: "uid",
146
+ array
147
+ } : void 0;
148
+ }
131
149
  /**
132
150
  * Registers reads that run as one round trip:
133
151
  *
@@ -155,7 +173,7 @@ function defineReadSet(betterSupabase, name, options, build) {
155
173
  if (!TYPE.test(type)) throw new TypeError(`better-supabase: read set "${name}" parameter "${key}" has an invalid type "${type}"`);
156
174
  placeholders[key] = type.endsWith("[]") ? [sentinel(key)] : sentinel(key);
157
175
  }
158
- const specs = build(betterSupabase.spec, placeholders);
176
+ const specs = build(betterSupabase.spec, placeholders, AUTH);
159
177
  const entries = Object.entries(specs);
160
178
  if (entries.length === 0 || entries.length > MAX_ENTRIES) throw new TypeError(`better-supabase: read set "${name}" needs between 1 and ${MAX_ENTRIES} reads`);
161
179
  for (const [key, spec] of entries) if (!isQuerySpec(spec)) throw new TypeError(`better-supabase: read set "${name}" entry "${key}" is not a spec from betterSupabase.spec`);
@@ -176,14 +194,16 @@ function defineReadSet(betterSupabase, name, options, build) {
176
194
  * that only those plugins add never reach it.
177
195
  */
178
196
  function warnUnscopedReads(betterSupabase, name, specs) {
179
- const scoping = betterSupabase.plugins.filter((plugin) => plugin.transformQuery !== void 0 && plugin.name !== "rules").map((plugin) => plugin.name);
180
- if (scoping.length === 0) return;
197
+ const filtering = betterSupabase.plugins.filter((plugin) => plugin.transformQuery !== void 0 && plugin.scopes?.length !== 0);
198
+ if (filtering.length === 0) return;
181
199
  const { meta } = betterSupabase;
182
- const tables = [...new Set(Object.values(specs).flatMap((spec) => specTables(meta, spec)))].filter((key) => {
200
+ const filters = (plugin, key) => {
183
201
  const flags = meta.tables[key]?.flags;
184
- return flags?.tenant !== void 0 || flags?.softDelete !== void 0;
185
- });
202
+ return plugin.scopes === void 0 || plugin.scopes.some((flag) => flags?.[flag] !== void 0);
203
+ };
204
+ const tables = [...new Set(Object.values(specs).flatMap((spec) => specTables(meta, spec)))].filter((key) => filtering.some((plugin) => filters(plugin, key)));
186
205
  if (tables.length === 0) return;
206
+ const scoping = filtering.filter((plugin) => tables.some((key) => filters(plugin, key))).map((plugin) => plugin.name);
187
207
  betterSupabase.events.logger.warn(`read set "${name}" reads ${tables.join(", ")}, which ${scoping.join(", ")} scope at runtime; its generated function only sees those filters when the specs spell them out (or RLS enforces them)`, {
188
208
  readSet: name,
189
209
  tables,
@@ -193,19 +213,16 @@ function warnUnscopedReads(betterSupabase, name, specs) {
193
213
  function isReadSet(value) {
194
214
  return typeof value === "object" && value !== null && value.kind === "read-set" && typeof value.name === "string";
195
215
  }
196
- /** A parameter a string or array carries, if it is exactly a placeholder. */
216
+ /** The placeholder a string or array carries, if it is exactly one. */
197
217
  function placeholderOf(value) {
198
218
  if (typeof value === "string") {
199
219
  const match = EXACT.exec(value);
200
- return match ? {
201
- name: match[1],
202
- array: false
203
- } : void 0;
220
+ return match ? tagged(match[1], false) : void 0;
204
221
  }
205
222
  if (Array.isArray(value) && value.length === 1) {
206
223
  const inner = placeholderOf(value[0]);
207
224
  return inner && !inner.array ? {
208
- name: inner.name,
225
+ ...inner,
209
226
  array: true
210
227
  } : inner;
211
228
  }
@@ -216,7 +233,8 @@ function splitPlaceholders(value) {
216
233
  let last = 0;
217
234
  for (const match of value.matchAll(SENTINEL)) {
218
235
  if (match.index > last) parts.push({ text: value.slice(last, match.index) });
219
- parts.push({ param: match[1] });
236
+ const placeholder = tagged(match[1], false);
237
+ parts.push(placeholder ?? { text: match[0] });
220
238
  last = match.index + match[0].length;
221
239
  }
222
240
  if (last < value.length) parts.push({ text: value.slice(last) });
@@ -232,6 +250,16 @@ function containsPlaceholder(value) {
232
250
  if (typeof value === "object" && value !== null) return Object.values(value).some(containsPlaceholder);
233
251
  return false;
234
252
  }
253
+ /** Whether the set's specs read the caller's identity. */
254
+ function readSetUsesAuth(set) {
255
+ return Object.values(set.specs).some((spec) => usesAuth(spec.args));
256
+ }
257
+ function usesAuth(value) {
258
+ if (typeof value === "string") return [...value.matchAll(SENTINEL)].some((match) => match[1].startsWith("@"));
259
+ if (Array.isArray(value)) return value.some(usesAuth);
260
+ if (typeof value === "object" && value !== null) return Object.values(value).some(usesAuth);
261
+ return false;
262
+ }
235
263
  /** Missing or wrongly typed parameters, as messages. */
236
264
  function checkParams(set, values) {
237
265
  const problems = [];
@@ -242,14 +270,25 @@ function checkParams(set, values) {
242
270
  }
243
271
  return problems;
244
272
  }
245
- /** The specs with every placeholder replaced by its value. */
246
- function bindParams(set, values) {
273
+ /**
274
+ * The specs with every placeholder replaced by its value; `auth.uid` takes
275
+ * the `sub` claim, which must be verified. `noCaller` is set when the set
276
+ * reads `auth.uid` and there is no `sub`: the specs then match no user, and
277
+ * only the function, which reads `auth.uid()` itself, can run the set.
278
+ */
279
+ function bindParams(set, values, context) {
280
+ const sub = context.claims?.["sub"];
281
+ const uid = typeof sub === "string" && sub !== "" ? sub : null;
282
+ const valueOf = (placeholder) => placeholder.kind === "auth" ? uid : values?.[placeholder.name];
247
283
  const bind = (value) => {
248
284
  const placeholder = placeholderOf(value);
249
- if (placeholder) return values[placeholder.name];
285
+ if (placeholder) {
286
+ const bound = valueOf(placeholder);
287
+ return placeholder.kind === "auth" && placeholder.array ? [bound] : bound;
288
+ }
250
289
  if (typeof value === "string") {
251
290
  if (!hasPlaceholder(value)) return value;
252
- return splitPlaceholders(value).map((part) => "text" in part ? part.text : String(values[part.param] ?? "")).join("");
291
+ return splitPlaceholders(value).map((part) => "text" in part ? part.text : String(valueOf(part) ?? "")).join("");
253
292
  }
254
293
  if (Array.isArray(value)) return value.map(bind);
255
294
  if (typeof value === "object" && value !== null) {
@@ -258,10 +297,13 @@ function bindParams(set, values) {
258
297
  }
259
298
  return value;
260
299
  };
261
- return Object.fromEntries(Object.entries(set.specs).map(([key, spec]) => [key, {
262
- ...spec,
263
- args: spec.args.map(bind)
264
- }]));
300
+ return {
301
+ specs: Object.fromEntries(Object.entries(set.specs).map(([key, spec]) => [key, {
302
+ ...spec,
303
+ args: spec.args.map(bind)
304
+ }])),
305
+ noCaller: uid === null && readSetUsesAuth(set) ? dbError("invalid_request", `db.$many(${set.name}): the read set reads auth.uid, but this connection has no user claims. Connect with the user's verified claims ({ claims: { sub } }), or call it over PostgREST, where the function reads auth.uid().`) : void 0
306
+ };
265
307
  }
266
308
  /** App keys of every table the set reads. */
267
309
  function readSetTables(set, meta) {
@@ -1,5 +1,4 @@
1
- import { S as PermdockTopicPolicy } from "../types-Dnf_wRDz.js";
2
- import { n as PermdockCatalog } from "../permdock-sql-C2Inc6Xc.js";
3
- import { n as TemplateValues, t as TemplateParams } from "../template-mbvlysOo.js";
4
- import { C as defineTopic, S as TriggerOptions, _ as TopicEvent, a as LiveSource, b as TopicOptions, c as liveQuery, d as RealtimeClient, f as RowChange, g as Topic, h as SubscriptionStatus, i as LiveQueryOptions, l as liveTopic, m as Subscription, n as LiveCountOptions, o as LiveSubscription, p as SubscribeOptions, r as LiveCountSeed, s as liveCount, t as CountRunner, u as EventSchemas, v as TopicHandlers, w as rowChange, x as TopicPayload, y as TopicMessage } from "../live-D9W2M5aO.js";
5
- export { type CountRunner, type EventSchemas, type LiveCountOptions, type LiveCountSeed, type LiveQueryOptions, type LiveSource, type LiveSubscription, type PermdockCatalog, type PermdockTopicPolicy, type RealtimeClient, type RowChange, type SubscribeOptions, type Subscription, type SubscriptionStatus, type TemplateParams, type TemplateValues, type Topic, type TopicEvent, type TopicHandlers, type TopicMessage, type TopicOptions, type TopicPayload, type TriggerOptions, defineTopic, liveCount, liveQuery, liveTopic, rowChange };
1
+ import { n as AccessPolicySql, r as AccessTopicPolicy } from "../types-6BdhkmZe.js";
2
+ import { n as TemplateValues, t as TemplateParams } from "../template-CwO38Do8.js";
3
+ import { A as TopicSubscription, C as TopicEvent, D as TopicPayload, E as TopicOptions, F as rowChange, M as TriggerOptions, N as TriggerValue, O as TopicSqlOptions, P as defineTopic, S as Topic, T as TopicMessage, _ as RealtimeClient, a as LiveSource, b as Subscription, c as liveQuery, d as PresenceInput, f as PresenceMember, g as PresenceSubscription, h as PresenceSchema, i as LiveQueryOptions, j as TriggerLookup, k as TopicSubscribeOptions, l as liveTopic, m as PresenceOutput, n as LiveCountOptions, o as LiveSubscription, p as PresenceOptions, r as LiveCountSeed, s as liveCount, t as CountRunner, u as EventSchemas, v as RowChange, w as TopicHandlers, x as SubscriptionStatus, y as SubscribeOptions } from "../index-DunNRdnT.js";
4
+ export { type AccessPolicySql, type AccessTopicPolicy, type CountRunner, type EventSchemas, type LiveCountOptions, type LiveCountSeed, type LiveQueryOptions, type LiveSource, type LiveSubscription, type PresenceInput, type PresenceMember, type PresenceOptions, type PresenceOutput, type PresenceSchema, type PresenceSubscription, type RealtimeClient, type RowChange, type SubscribeOptions, type Subscription, type SubscriptionStatus, type TemplateParams, type TemplateValues, type Topic, type TopicEvent, type TopicHandlers, type TopicMessage, type TopicOptions, type TopicPayload, type TopicSqlOptions, type TopicSubscribeOptions, type TopicSubscription, type TriggerLookup, type TriggerOptions, type TriggerValue, defineTopic, liveCount, liveQuery, liveTopic, rowChange };
@@ -1,11 +1,12 @@
1
- import { n as dbError } from "../errors-DtwXa6b8.js";
2
- import { i as ok, n as err, t as AsyncResult } from "../result-BKiliPY7.js";
3
- import { i as tenantClaimPaths } from "../claims-BAf6c7is.js";
4
- import { n as liveQuery, r as liveTopic, t as liveCount } from "../live-CdJBOc4f.js";
5
- import { i as sqlString, n as slug, r as sqlIdent, t as parseTemplate } from "../template-TxrGI5jR.js";
6
- import { c as toApp } from "../shared-D1dRUrAg.js";
7
- import { n as permdockCheck } from "../permdock-sql-DgOfeixi.js";
8
- import { REALTIME_SUBSCRIBE_STATES } from "@supabase/supabase-js";
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 { a as tenantClaimPaths } from "../claims-PqzCxaTD.js";
4
+ import { i as refreshRealtimeAuth, n as liveQuery, r as liveTopic, t as liveCount } from "../live-CTAZQkwl.js";
5
+ import { i as sqlString, n as slug, r as sqlIdent, t as parseTemplate } from "../template--jDkl3UP.js";
6
+ import { c as toApp } from "../shared-CxWmcyqB.js";
7
+ import { t as joinTopic } from "../channels-CkgQ_X60.js";
8
+ import { o as resolveProviderSql, r as accessCheck } from "../access-sql-B0dF-SoF.js";
9
+ import "@supabase/supabase-js";
9
10
  //#region src/realtime/topic.ts
10
11
  const VALUE = /^[\w.@+=-]+$/;
11
12
  function validateValue(_name, value) {
@@ -43,15 +44,38 @@ function sendError(status, message) {
43
44
  if (status === 429 || status >= 500 || status === 0) return dbError("network", message, status ? { status } : {});
44
45
  return dbError("invalid_request", message, { status });
45
46
  }
47
+ function columnSql(meta, column, where) {
48
+ const db = meta.columns[column]?.db;
49
+ if (!db) throw new TypeError(`defineTopic: no column for ${where} on "${meta.key}" ("${column}")`);
50
+ return sqlIdent(db);
51
+ }
52
+ /** A trigger value as SQL on `rec`, with one subquery per lookup. */
53
+ function triggerValueSql(tables, meta, value, where, depth = 0) {
54
+ if (typeof value === "string") return `rec.${columnSql(meta, value, where)}`;
55
+ const joined = tables[value.from];
56
+ if (!joined) throw new TypeError(`defineTopic: unknown table "${value.from}" for ${where}`);
57
+ const key = value.key ?? (joined.primaryKey.length === 1 ? joined.primaryKey[0] : void 0);
58
+ if (key === void 0) throw new TypeError(`defineTopic: "${value.from}" has no single-column primary key; name its key for ${where}`);
59
+ const alias = `j${String(depth)}`;
60
+ const via = triggerValueSql(tables, meta, value.via, where, depth + 1);
61
+ return `(select ${alias}.${columnSql(joined, value.select, where)} from ${sqlIdent(joined.schema)}.${sqlIdent(joined.name)} ${alias} where ${alias}.${columnSql(joined, key, where)} = ${via} limit 1)`;
62
+ }
63
+ /** The event name: one for every operation, one per operation, or the operation. */
64
+ function eventSql(event) {
65
+ if (event === void 0) return "tg_op";
66
+ if (typeof event === "string") return sqlString(event);
67
+ const cases = Object.entries(event).filter((entry) => entry[1] !== void 0).map(([operation, name]) => ` when ${sqlString(operation.toUpperCase())} then ${sqlString(name)}`);
68
+ return cases.length === 0 ? "tg_op" : `case tg_op${cases.join("")} else tg_op end`;
69
+ }
46
70
  /**
47
71
  * A typed Realtime broadcast topic: names from a template, RLS policies for
48
72
  * private channels, row-change triggers, and disposable subscriptions.
49
73
  *
50
74
  * ```ts
51
- * export const notifications = defineTopic('org:{orgId}:notifications:{userId}', {
75
+ * export const notifications = defineTopic('organization:{organizationId}:notifications:{userId}', {
52
76
  * events: { created: v.object({ id: v.string(), title: v.string() }) },
53
77
  * });
54
- * using sub = notifications.subscribe(supabase, { orgId, userId }, { created: (n) => toast(n.title) });
78
+ * using sub = notifications.subscribe(supabase, { organizationId, userId }, { created: (n) => toast(n.title) });
55
79
  * ```
56
80
  */
57
81
  function defineTopic(template, options = {}) {
@@ -60,25 +84,29 @@ function defineTopic(template, options = {}) {
60
84
  const name = slug(options.name ?? literal) || "topic";
61
85
  const isPrivate = options.private ?? true;
62
86
  const schemas = options.events ?? {};
87
+ const hasPresence = options.presence !== void 0 && options.presence !== false;
88
+ const presenceSchema = typeof options.presence === "object" ? options.presence : void 0;
63
89
  const segment = (param, kind) => {
64
90
  const index = parsed.segmentOf(param);
65
91
  if (index === void 0) throw new TypeError(`defineTopic: the ${kind} check needs {${param}} as a whole segment in "${template}"`);
66
92
  return index;
67
93
  };
68
94
  const checks = [];
69
- const permdock = options.permdock;
70
- const tenantParam = options.tenant === false ? void 0 : options.tenant?.param ?? "orgId";
71
- const permdockChecks = (() => {
72
- if (!permdock) return void 0;
95
+ const access = options.access;
96
+ const tenantParam = options.tenant === false ? void 0 : options.tenant?.param ?? "organizationId";
97
+ const accessChecksFor = (functions) => {
98
+ if (!access) return void 0;
73
99
  const where = `defineTopic(${template})`;
74
- const id = permdock.scope === "global" ? void 0 : `split_part((select realtime.topic()), ':', ${String(permdock.segment ?? segment(tenantParam ?? "orgId", "PermDock"))})`;
75
- const receive = permdockCheck(where, permdock, permdock.receive, id, options.catalog);
100
+ const target = resolveProviderSql(where, access, functions);
101
+ const id = access.scope === "platform" ? void 0 : `split_part((select realtime.topic()), ':', ${String(access.segment ?? segment(tenantParam ?? "organizationId", "access"))})`;
102
+ const receive = accessCheck(where, target, access.receive, id);
76
103
  return {
77
104
  receive,
78
- send: permdock.send === void 0 ? receive : permdockCheck(where, permdock, permdock.send, id, options.catalog)
105
+ send: access.send === void 0 ? receive : accessCheck(where, target, access.send, id)
79
106
  };
80
- })();
81
- if (!permdock && tenantParam && (options.tenant || parsed.params.includes(tenantParam))) {
107
+ };
108
+ const fixedChecks = access?.sql === "provider" ? void 0 : accessChecksFor();
109
+ if (!access && tenantParam && (options.tenant || parsed.params.includes(tenantParam))) {
82
110
  const tenant = options.tenant === false ? {} : options.tenant ?? {};
83
111
  const expression = tenant.sql ?? claimSql(tenant.claim ?? tenantClaimPaths());
84
112
  checks.push(`split_part((select realtime.topic()), ':', ${String(segment(tenantParam, "tenant"))}) = (${expression})`);
@@ -91,10 +119,12 @@ function defineTopic(template, options = {}) {
91
119
  name,
92
120
  params: parsed.params,
93
121
  private: isPrivate,
122
+ presence: hasPresence,
94
123
  topic: topicOf,
95
124
  match: (topic) => parsed.match(topic),
96
- sql() {
97
- const extensions = options.presence ? "('broadcast', 'presence')" : "('broadcast')";
125
+ sql(sqlOptions) {
126
+ const accessChecks = access?.sql === "provider" ? accessChecksFor(sqlOptions?.functions) : fixedChecks;
127
+ const extensions = hasPresence ? "('broadcast', 'presence')" : "('broadcast')";
98
128
  const condition = (extra) => [
99
129
  `(select realtime.topic()) ~ ${sqlString(parsed.sqlPattern)}`,
100
130
  `realtime.messages.extension in ${extensions}`,
@@ -106,13 +136,13 @@ function defineTopic(template, options = {}) {
106
136
  "receive",
107
137
  "select",
108
138
  "using",
109
- condition(permdockChecks?.receive)
139
+ condition(accessChecks?.receive)
110
140
  ]];
111
- if (options.send || options.presence || permdock?.send !== void 0) policies.push([
141
+ if (options.send || hasPresence || access?.send !== void 0) policies.push([
112
142
  "send",
113
143
  "insert",
114
144
  "with check",
115
- condition(permdockChecks?.send)
145
+ condition(accessChecks?.send)
116
146
  ]);
117
147
  for (const [suffix, command, clause, check] of policies) {
118
148
  const policy = sqlIdent(`bs_topic_${name}_${suffix}`);
@@ -124,13 +154,13 @@ function defineTopic(template, options = {}) {
124
154
  const meta = betterSupabase.meta.tables[table];
125
155
  if (!meta) throw new TypeError(`defineTopic: unknown table "${table}"`);
126
156
  const values = trigger.values;
157
+ const tables = betterSupabase.meta.tables;
127
158
  const parts = template.split(/(\{[^}]+\})/).filter(Boolean).map((part) => {
128
159
  const param = /^\{(.+)\}$/.exec(part)?.[1];
129
160
  if (param === void 0) return sqlString(part);
130
- const column = values[param];
131
- const db = column === void 0 ? void 0 : meta.columns[column]?.db;
132
- if (!db) throw new TypeError(`defineTopic: no column for {${param}} on "${table}"`);
133
- return `rec.${sqlIdent(db)}::text`;
161
+ const value = values[param];
162
+ if (value === void 0) throw new TypeError(`defineTopic: no column for {${param}} on "${table}"`);
163
+ return `${triggerValueSql(tables, meta, value, `{${param}}`)}::text`;
134
164
  });
135
165
  const schema = trigger.functionSchema ?? "better_supabase";
136
166
  const fn = `${sqlIdent(schema)}.${sqlIdent(`bs_broadcast_${name}_${slug(meta.name)}`)}`;
@@ -141,6 +171,18 @@ function defineTopic(template, options = {}) {
141
171
  "update",
142
172
  "delete"
143
173
  ]).join(" or ");
174
+ const event = eventSql(trigger.event);
175
+ const payload = trigger.payload;
176
+ const send = payload ? [
177
+ " perform realtime.send(",
178
+ ` jsonb_build_object(${Object.entries(payload).map(([key, value]) => `${sqlString(key)}, ${typeof value === "object" && "sql" in value ? `(${value.sql.replaceAll("{row}", "rec")})` : triggerValueSql(tables, meta, value, `payload.${key}`)}`).join(", ")}),`,
179
+ ` ${event}, topic, ${String(isPrivate)}`,
180
+ " );"
181
+ ] : [
182
+ " perform realtime.broadcast_changes(",
183
+ ` topic, ${event}, tg_op, tg_table_name, tg_table_schema, new, old`,
184
+ " );"
185
+ ];
144
186
  return [
145
187
  `-- better-supabase: broadcast ${meta.name} changes to ${template}`,
146
188
  `create schema if not exists ${sqlIdent(schema)};`,
@@ -152,12 +194,14 @@ function defineTopic(template, options = {}) {
152
194
  "as $$",
153
195
  "declare",
154
196
  " rec record;",
197
+ " topic text;",
155
198
  "begin",
156
199
  " if tg_op = 'DELETE' then rec := old; else rec := new; end if;",
157
- " perform realtime.broadcast_changes(",
158
- ` ${parts.join(" || ")},`,
159
- " tg_op, tg_op, tg_table_name, tg_table_schema, new, old",
160
- " );",
200
+ ` topic := ${parts.join(" || ")};`,
201
+ " if topic is null then",
202
+ " return null;",
203
+ " end if;",
204
+ ...send,
161
205
  " return null;",
162
206
  "end;",
163
207
  "$$;",
@@ -169,68 +213,86 @@ function defineTopic(template, options = {}) {
169
213
  ""
170
214
  ].join("\n");
171
215
  },
172
- subscribe(client, values, handlers, subscribeOptions = {}) {
216
+ subscribe(client, values, handlers, given) {
173
217
  const topic = topicOf(values);
174
- const channel = client.channel(topic, { config: {
175
- private: isPrivate,
176
- broadcast: { self: subscribeOptions.self ?? false }
177
- } });
178
218
  const table = handlers;
179
- channel.on("broadcast", { event: "*" }, (raw) => {
180
- const message = {
181
- event: raw.event,
182
- payload: raw["payload"],
183
- topic
184
- };
185
- const handler = table[message.event] ?? table["*"];
186
- if (!handler) return;
187
- validate(schemas[message.event], message.payload).then((checked) => {
188
- if (checked.ok) handler(checked.value, message);
189
- else subscribeOptions.onInvalid?.(message, checked.issues);
219
+ const subscribeOptions = given ?? {};
220
+ let members = [];
221
+ let syncs = 0;
222
+ const sync = async (state) => {
223
+ const run = ++syncs;
224
+ const checked = await Promise.all(Object.entries(state).flatMap(([key, metas]) => metas.map(async ({ presence_ref: _ref, ...meta }) => ({
225
+ key,
226
+ meta,
227
+ checked: await validate(presenceSchema, meta)
228
+ }))));
229
+ if (run !== syncs) return;
230
+ const valid = [];
231
+ for (const each of checked) if (each.checked.ok) valid.push({
232
+ key: each.key,
233
+ state: each.checked.value
190
234
  });
191
- });
192
- let closed = false;
193
- subscribeOptions.onStatus?.("joining");
194
- const ready = (async () => {
195
- if (isPrivate) await client.realtime.setAuth();
196
- if (closed) return;
197
- await new Promise((resolve, reject) => {
198
- channel.subscribe((status, error) => {
199
- switch (status) {
200
- case REALTIME_SUBSCRIBE_STATES.SUBSCRIBED:
201
- subscribeOptions.onStatus?.("subscribed");
202
- resolve();
203
- return;
204
- case REALTIME_SUBSCRIBE_STATES.CLOSED:
205
- subscribeOptions.onStatus?.("closed");
206
- resolve();
207
- return;
208
- case REALTIME_SUBSCRIBE_STATES.CHANNEL_ERROR:
209
- case REALTIME_SUBSCRIBE_STATES.TIMED_OUT: {
210
- const failure = error ?? /* @__PURE__ */ new Error(`Realtime ${status.toLowerCase()} on ${topic}`);
211
- subscribeOptions.onStatus?.("error", failure);
212
- reject(failure);
213
- return;
214
- }
215
- default: reject(/* @__PURE__ */ new Error(`Unknown realtime status ${String(status)}`));
216
- }
235
+ else subscribeOptions.onInvalid?.({
236
+ event: "presence",
237
+ payload: each.meta,
238
+ topic
239
+ }, each.checked.issues);
240
+ members = valid;
241
+ subscribeOptions.onPresence?.(valid);
242
+ };
243
+ const subscriber = {
244
+ onStatus: subscribeOptions.onStatus,
245
+ receive: (message) => {
246
+ const handler = table[message.event] ?? table["*"];
247
+ if (!handler) return;
248
+ validate(schemas[message.event], message.payload).then((checked) => {
249
+ if (checked.ok) handler(checked.value, message);
250
+ else subscribeOptions.onInvalid?.(message, checked.issues);
217
251
  });
218
- });
219
- })();
220
- ready.catch(() => void 0);
252
+ },
253
+ ...hasPresence ? { sync: (state) => void sync(state) } : {}
254
+ };
255
+ const { shared, leave } = joinTopic(client, topic, isPrivate, subscribeOptions.self ?? false, hasPresence, subscriber);
256
+ let closed = false;
221
257
  const unsubscribe = async () => {
222
258
  if (closed) return;
223
259
  closed = true;
224
- await client.removeChannel(channel);
260
+ await leave();
225
261
  };
226
- return {
262
+ const presenceCall = (action, run) => AsyncResult.from(async () => {
263
+ if (closed) return err(dbError("invalid_request", `Presence ${action} after unsubscribe on ${topic}`));
264
+ try {
265
+ await shared.ready;
266
+ } catch (cause) {
267
+ return err(dbError("network", `Presence ${action} on ${topic}: the join failed`, { details: cause instanceof Error ? cause.message : String(cause) }));
268
+ }
269
+ const answer = await run();
270
+ return answer === "ok" ? ok(void 0) : err(dbError("network", `Presence ${action} ${answer} on ${topic}`));
271
+ });
272
+ const subscription = {
227
273
  topic,
228
- channel,
229
- ready,
274
+ channel: shared.channel,
275
+ ready: shared.ready,
230
276
  unsubscribe,
231
277
  [Symbol.dispose]: () => void unsubscribe(),
232
278
  [Symbol.asyncDispose]: unsubscribe
233
279
  };
280
+ return hasPresence ? {
281
+ ...subscription,
282
+ track: (state) => AsyncResult.from(async () => {
283
+ const checked = await validate(presenceSchema, state);
284
+ if (!checked.ok) return err(dbError("validation", `Invalid presence state for ${topic}`, { issues: checked.issues }));
285
+ return presenceCall("track", async () => {
286
+ shared.tracker = subscriber;
287
+ return shared.channel.track(checked.value);
288
+ });
289
+ }),
290
+ untrack: () => presenceCall("untrack", async () => {
291
+ if (shared.tracker === subscriber) shared.tracker = void 0;
292
+ return shared.channel.untrack();
293
+ }),
294
+ members: () => members
295
+ } : subscription;
234
296
  },
235
297
  send(client, values, event, payload) {
236
298
  return AsyncResult.from(async () => {
@@ -238,7 +300,7 @@ function defineTopic(template, options = {}) {
238
300
  const checked = await validate(schemas[event], payload);
239
301
  if (!checked.ok) return err(dbError("validation", `Invalid payload for ${event}`, { issues: checked.issues }));
240
302
  const open = client.getChannels().some((existing) => existing.topic === `realtime:${topic}`);
241
- if (isPrivate && !open) await client.realtime.setAuth();
303
+ if (isPrivate && !open) await refreshRealtimeAuth(client);
242
304
  const channel = client.channel(topic, { config: { private: isPrivate } });
243
305
  try {
244
306
  const response = await channel.httpSend(event, checked.value);
@@ -0,0 +1,61 @@
1
+ import { r as dbErrorOf } from "./errors-B11Duf73.js";
2
+ import { a as problemResponse } from "./problem-BreOl8b8.js";
3
+ import { t as defaultExpose } from "./respond-BUgsXNgk.js";
4
+ import { i as requireCaller } from "./kit-Fm-Fv7q5.js";
5
+ //#region src/server/refusal.ts
6
+ function isAalRefusal(error) {
7
+ return error.kind === "forbidden" && "required" in error && error.required === "aal2";
8
+ }
9
+ /** The page a refused caller is sent to, with `?next=`, when one is configured. */
10
+ function refusalTarget(error, request, redirects) {
11
+ const page = error.kind === "unauthorized" ? redirects.signIn : isAalRefusal(error) ? redirects.mfa : void 0;
12
+ if (page === void 0) return void 0;
13
+ const url = new URL(request.url);
14
+ const target = new URL(page, url);
15
+ if (target.pathname === url.pathname) return void 0;
16
+ target.searchParams.set("next", `${url.pathname}${url.search}`);
17
+ return target;
18
+ }
19
+ /** A refusal as a redirect to `signIn` or `mfa`, else Problem Details. */
20
+ function refusalResponse(error, request, redirects, expose) {
21
+ const target = refusalTarget(error, request, redirects);
22
+ if (target) return new Response(null, {
23
+ status: 303,
24
+ headers: { location: target.href }
25
+ });
26
+ return problemResponse(error, {
27
+ instance: new URL(request.url).pathname,
28
+ expose
29
+ });
30
+ }
31
+ /** The refusal for a caller `options` refuses, or `undefined` to let it through. */
32
+ async function routeRefusal(locals, request, options) {
33
+ const caller = await requireCaller(locals.bs.auth, options, locals.tenant);
34
+ if (!("kind" in caller)) return void 0;
35
+ return refusalResponse(caller, request, options, options.expose ?? defaultExpose());
36
+ }
37
+ /**
38
+ * An `onError` mapper: a thrown `DbException` (or an error caused by a
39
+ * `DbError`) becomes Problem Details; anything else is `undefined`, so the
40
+ * framework's own handling stays.
41
+ */
42
+ function errorResponse(cause, request, options = {}) {
43
+ const found = dbErrorOf(cause);
44
+ if (!found) return void 0;
45
+ return problemResponse(found, {
46
+ instance: new URL(request.url).pathname,
47
+ expose: options.expose ?? defaultExpose()
48
+ });
49
+ }
50
+ /** Reads the guard's view of a request's contributions; throws without `withBetterSupabase`. */
51
+ function guardedLocals(contributions) {
52
+ const bs = "bs" in contributions ? contributions.bs : void 0;
53
+ if (typeof bs !== "object" || bs === null || !("auth" in bs)) throw new Error("better-supabase: the route guard needs withBetterSupabase(server) in the entries");
54
+ const tenant = "tenant" in contributions ? contributions.tenant : void 0;
55
+ return {
56
+ bs,
57
+ tenant: typeof tenant === "string" ? tenant : void 0
58
+ };
59
+ }
60
+ //#endregion
61
+ export { routeRefusal as a, refusalTarget as i, guardedLocals as n, refusalResponse as r, errorResponse as t };
@@ -0,0 +1,15 @@
1
+ import { s as BlockRequireOptions } from "./kit-B5tid-q5.js";
2
+ //#region src/server/refusal.d.ts
3
+ /** Where refused callers go instead of a Problem Details response. */
4
+ interface RefusalRedirects {
5
+ /** Sign-in page for callers without a session; gets `?next=<path>`. */
6
+ readonly signIn?: string;
7
+ /** Second-factor page for users below the route's `aal`; gets `?next=<path>`. */
8
+ readonly mfa?: string;
9
+ }
10
+ interface RouteGuardOptions<C = unknown, P = unknown> extends BlockRequireOptions<C, P>, RefusalRedirects {
11
+ /** Include internal error messages in Problem Details. Defaults to development only. */
12
+ readonly expose?: boolean;
13
+ }
14
+ //#endregion
15
+ export { RouteGuardOptions as n, RefusalRedirects as t };