better-supabase 0.5.1 → 0.6.1

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 +187 -46
  2. package/dist/access-sql-B0dF-SoF.js +181 -0
  3. package/dist/{actor-DaJjqD5R.d.ts → actor-CQTlc1Hh.d.ts} +1 -1
  4. package/dist/adapter-CHnPkCPd.js +1160 -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 +224 -0
  87. package/dist/blocks/attachments/index.js +234 -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 +259 -0
  97. package/dist/blocks/data-lifecycle/index.js +358 -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-C_A-KEAz.js → doctor-BMqBgM3X.js} +991 -317
  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-4JlOwgWG.js +2 -0
  181. package/dist/cli/gen-DeuDgPxN.js +3100 -0
  182. package/dist/cli/index.d.ts +44 -5
  183. package/dist/cli/index.js +7 -7
  184. package/dist/cli/{init-DMa6M7hV.js → init-C7Xd0Kda.js} +242 -27
  185. package/dist/cli/{introspect-BKlaIu_M.js → introspect-CSnMJ94U.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-Bo_NLT5n.js → run-C8tnlHSb.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-BCtlgDQx.js → version-C_4JwyiM.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-CLqs9-OA.js +130 -0
  209. package/dist/composite-pSfeJNce.d.ts +146 -0
  210. package/dist/config/index.d.ts +6 -4
  211. package/dist/config/index.js +5 -5
  212. package/dist/{config-Bv7gvfzC.d.ts → config-D44Y7PAv.d.ts} +406 -214
  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-CFPX0Qft.d.ts → ended-jLfvw8h-.d.ts} +20 -2
  231. package/dist/{entitlements-BiJZ4t49.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-CdPDPpFs.d.ts +25 -0
  258. package/dist/framework-xjTBoyBB.js +51 -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-BgSHAYLf.js → impersonation-DcqaTBHx.js} +21 -6
  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-Daak8ukG.d.ts +54 -0
  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-Bn6HNKUe.js → resolve-D_IcnvFd.js} +248 -240
  385. package/dist/{impersonation-BmePsuxz.d.ts → resolve-KW8nCeL6.d.ts} +29 -69
  386. package/dist/{resource-mqfJW4YF.js → resource-BsvzCMlX.js} +4 -4
  387. package/dist/{resource-DNRFP7KR.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 -22
  396. package/dist/server/index.js +46 -14
  397. package/dist/{respond-BR1fJWOB.d.ts → server-C6DWVEVG.d.ts} +237 -85
  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 +313 -212
  413. package/dist/sql/index.js +34924 -6609
  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-view-B8SlToQX.d.ts → support-view-33Oi07TT.d.ts} +1 -1
  430. package/dist/{support-wHnK6zp-.js → support-zIa1URaN.js} +32 -11
  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 +315 -41
  449. package/dist/testing/index.js +1046 -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-DOYTYwHP.js → version-CQt77F3T.js} +1 -1
  465. package/dist/view-BeFcRV6G.js +99 -0
  466. package/dist/{view-CbgObAeb.d.ts → view-DbxLNu8L.d.ts} +22 -5
  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 +461 -20
  485. package/schemas/ai-message-v1.json +258 -0
  486. package/schemas/config-v1.json +1074 -140
  487. package/schemas/doctor-report-v1.json +20 -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 +47 -11
  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-CIdSQZad.js +0 -2
  504. package/dist/cli/gen-CjElD1Vw.js +0 -2241
  505. package/dist/cli/read-sets-VQcPgxU9.js +0 -436
  506. package/dist/cli/sql-CVx-1O8G.js +0 -373
  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/index-CWMDdEr4.d.ts +0 -50
  512. package/dist/index-DOESKG27.d.ts +0 -100
  513. package/dist/index-DmXSxbLi.d.ts +0 -62
  514. package/dist/index-Dp2VDwog.d.ts +0 -161
  515. package/dist/jobs/index.d.ts +0 -226
  516. package/dist/jobs/index.js +0 -1007
  517. package/dist/json-schema-m1fiwKgN.js +0 -208
  518. package/dist/kit-events-CTFDfSwb.js +0 -60
  519. package/dist/kit-transport-B82k1djG.d.ts +0 -33
  520. package/dist/kits-CGLLrNPd.js +0 -157
  521. package/dist/mfa-Cu96oJdw.d.ts +0 -30
  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-B1mZ7CgQ.js +0 -660
  530. package/dist/stats-Bqob3WqT.js +0 -592
  531. package/dist/support-CEPwlw2G.d.ts +0 -89
  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 -122
@@ -1,9 +1,8 @@
1
- import { i as tenantClaimPaths, n as claimAt, r as claimsOf } from "./claims-BAf6c7is.js";
2
- import { n as invalidateTables, t as clearOnUserChange } from "./user-change-CHFEUro1.js";
3
- import { n as liveQuery, t as liveCount } from "./live-CdJBOc4f.js";
1
+ import { r as invalidateTables, t as clearOnUserChange } from "./user-change-XzvgafU4.js";
2
+ import { n as sessionUserId, r as specKey, t as claimedTenant } from "./keys-4MnkWTTh.js";
3
+ import { n as liveQuery, t as liveCount } from "./live-CTAZQkwl.js";
4
4
  import { useSession } from "./react/session.js";
5
- import { REALTIME_SUBSCRIBE_STATES } from "@supabase/supabase-js";
6
- import { createContext, createElement, useCallback, useContext, useEffect, useMemo, useRef, useState, useSyncExternalStore } from "react";
5
+ import { createContext, createElement, useContext, useEffect, useMemo, useRef, useState, useSyncExternalStore } from "react";
7
6
  //#region src/react/hooks.ts
8
7
  const ClientContext = createContext(null);
9
8
  const LOADING = {
@@ -66,12 +65,15 @@ function createHooks() {
66
65
  * resubscribes when the topic or the signed-in user changes.
67
66
  *
68
67
  * ```ts
69
- * useBroadcast(customersTopic, orgId ? { orgId } : null, {}, { invalidate: ['customers'] });
68
+ * useBroadcast(customersTopic, organizationId ? { organizationId } : null, {}, { invalidate: ['customers'] });
70
69
  * ```
71
70
  */
72
71
  function useBroadcast(topic, values, handlers, options) {
73
- const { client, queryClient } = useClientContext();
74
- const auth = useAuth();
72
+ const context = useContext(ClientContext);
73
+ const supabase = options?.client ?? context?.client.supabase;
74
+ if (!supabase) throw new Error("better-supabase: useBroadcast needs <BetterSupabaseProvider client={bs}> or { client: supabase }");
75
+ const queryClient = options?.queryClient ?? context?.queryClient;
76
+ const auth = useBroadcastAuth(options?.client === void 0 ? context?.client : void 0, supabase);
75
77
  const [status, setStatus] = useState("closed");
76
78
  const latest = useRef({
77
79
  handlers,
@@ -82,8 +84,9 @@ function useBroadcast(topic, values, handlers, options) {
82
84
  options
83
85
  };
84
86
  const name = values ? topic.topic(values) : null;
85
- const userId = auth.user?.id ?? null;
86
- if (options?.invalidate && !queryClient) throw new Error("better-supabase: useBroadcast({ invalidate }) needs <BetterSupabaseProvider queryClient={...}>");
87
+ const userId = auth.userId;
88
+ const self = options?.self;
89
+ if (options?.invalidate && !queryClient) throw new Error("better-supabase: useBroadcast({ invalidate }) needs <BetterSupabaseProvider queryClient={...}> or { queryClient }");
87
90
  useEffect(() => {
88
91
  if (!name || auth.status === "loading") return;
89
92
  const matched = topic.match(name);
@@ -100,8 +103,8 @@ function useBroadcast(topic, values, handlers, options) {
100
103
  }
101
104
  for (const queryKey of invalidate(message)) queryClient.invalidateQueries({ queryKey });
102
105
  };
103
- const subscription = topic.subscribe(client.supabase, matched, { "*": forward }, {
104
- ...latest.current.options?.self === void 0 ? {} : { self: latest.current.options.self },
106
+ const subscription = topic.subscribe(supabase, matched, { "*": forward }, {
107
+ ...self === void 0 ? {} : { self },
105
108
  onStatus: setStatus,
106
109
  onInvalid: (message, issues) => latest.current.options?.onInvalid?.(message, issues)
107
110
  });
@@ -110,21 +113,61 @@ function useBroadcast(topic, values, handlers, options) {
110
113
  setStatus("closed");
111
114
  };
112
115
  }, [
113
- client,
116
+ supabase,
114
117
  topic,
115
118
  name,
116
119
  userId,
117
120
  auth.status,
118
- queryClient
121
+ queryClient,
122
+ self
119
123
  ]);
120
124
  return status;
121
125
  }
122
- function claimedTenant(auth, meta) {
123
- if (auth.status !== "signed-in") return void 0;
124
- for (const path of tenantClaimPaths(claimsOf(meta).tenant)) {
125
- const value = claimAt(auth.claims, path);
126
- if (value !== void 0) return value;
127
- }
126
+ const NO_AUTH = () => () => void 0;
127
+ /**
128
+ * The user `useBroadcast` subscribes as: the provider's auth snapshot, or
129
+ * for a plain supabase-js client, its auth state.
130
+ */
131
+ function useBroadcastAuth(client, supabase) {
132
+ const snapshot = useSyncExternalStore(client?.auth.subscribe ?? NO_AUTH, client?.auth.current ?? (() => LOADING), () => LOADING);
133
+ const [plain, setPlain] = useState({
134
+ status: "loading",
135
+ userId: null
136
+ });
137
+ useEffect(() => {
138
+ if (client) return;
139
+ const { data } = supabase.auth.onAuthStateChange((_event, session) => {
140
+ setPlain({
141
+ status: session ? "signed-in" : "signed-out",
142
+ userId: session ? sessionUserId(session) : null
143
+ });
144
+ });
145
+ return () => {
146
+ data.subscription.unsubscribe();
147
+ };
148
+ }, [client, supabase]);
149
+ return client ? {
150
+ status: snapshot.status,
151
+ userId: snapshot.user?.id ?? null
152
+ } : plain;
153
+ }
154
+ /**
155
+ * The spec from the render whose key last changed, so effects keep the
156
+ * original values (`bigint`, Temporal) and only rerun on a different query.
157
+ */
158
+ function useHeldSpec(spec) {
159
+ const key = spec ? specKey(spec) : null;
160
+ const [held, setHeld] = useState({
161
+ key,
162
+ spec: spec ?? null
163
+ });
164
+ if (held.key === key) return held;
165
+ const next = {
166
+ key,
167
+ spec: spec ?? null
168
+ };
169
+ setHeld(next);
170
+ return next;
128
171
  }
129
172
  /**
130
173
  * Keeps a query fresh: invalidates every cached query that read a table the
@@ -142,25 +185,30 @@ function useLiveQuery(spec, options = {}) {
142
185
  const auth = useAuth();
143
186
  const [status, setStatus] = useState("closed");
144
187
  if (spec && !queryClient) throw new Error("better-supabase: useLiveQuery needs <BetterSupabaseProvider queryClient={...}>");
145
- const key = spec ? JSON.stringify(spec) : null;
188
+ const held = useHeldSpec(spec);
189
+ const joined = useRef(null);
146
190
  const tenant = options.tenant ?? claimedTenant(auth, client.betterSupabase.meta);
147
191
  const userId = auth.user?.id ?? null;
148
192
  const debounceMs = options.debounceMs;
149
193
  useEffect(() => {
150
- if (!key || !queryClient || auth.status === "loading") return;
151
- const live = liveQuery(client.betterSupabase, client.supabase, JSON.parse(key), {
194
+ if (!held.spec || !queryClient || auth.status === "loading") return;
195
+ const resumed = joined.current === held.key;
196
+ joined.current = held.key;
197
+ const live = liveQuery(client.betterSupabase, client.supabase, held.spec, {
152
198
  onChange: (tables) => void invalidateTables(queryClient, tables),
153
199
  onStatus: setStatus,
154
200
  ...tenant === void 0 ? {} : { tenant },
201
+ ...userId === null ? {} : { user: userId },
155
202
  ...debounceMs === void 0 ? {} : { debounceMs }
156
203
  });
204
+ if (resumed) live.ready.then(() => void invalidateTables(queryClient, live.tables), () => void 0);
157
205
  return () => {
158
206
  live.unsubscribe();
159
207
  };
160
208
  }, [
161
209
  client,
162
210
  queryClient,
163
- key,
211
+ held,
164
212
  tenant,
165
213
  userId,
166
214
  auth.status,
@@ -187,34 +235,53 @@ function useLiveCount(source, options = {}) {
187
235
  const [state, setState] = useState({
188
236
  key: null,
189
237
  count: void 0,
238
+ at: 0,
190
239
  error: void 0
191
240
  });
192
241
  const [status, setStatus] = useState("closed");
193
- const key = spec ? JSON.stringify(spec) : null;
242
+ const held = useHeldSpec(spec);
243
+ const joined = useRef(null);
194
244
  const tenant = options.tenant ?? claimedTenant(auth, client.betterSupabase.meta);
195
245
  const userId = auth.user?.id ?? null;
196
246
  const debounceMs = options.debounceMs;
197
247
  const hasInitial = initial !== void 0;
248
+ const seedAt = seed?.at;
198
249
  useEffect(() => {
199
- if (!key || auth.status === "loading") return;
200
- const live = liveCount(client.betterSupabase, client.supabase, client.db, JSON.parse(key), {
201
- immediate: !hasInitial,
250
+ if (!held.spec || auth.status === "loading") return;
251
+ const key = held.key;
252
+ const previous = joined.current?.key === key ? joined.current : null;
253
+ joined.current = {
254
+ key,
255
+ at: previous?.at ?? seedAt ?? 0
256
+ };
257
+ const since = previous ? previous.at : seedAt;
258
+ const live = liveCount(client.betterSupabase, client.supabase, client.db, held.spec, {
259
+ immediate: !hasInitial && !previous,
260
+ ...since === void 0 ? {} : { since },
202
261
  onCount: (count) => {
262
+ const at = Date.now();
263
+ if (joined.current?.key === key) joined.current = {
264
+ key,
265
+ at
266
+ };
203
267
  setState({
204
268
  key,
205
269
  count,
270
+ at,
206
271
  error: void 0
207
272
  });
208
273
  },
209
274
  onError: (error) => {
210
- setState((previous) => ({
275
+ setState((last) => ({
211
276
  key,
212
- count: previous.key === key ? previous.count : void 0,
277
+ count: last.key === key ? last.count : void 0,
278
+ at: last.key === key ? last.at : 0,
213
279
  error
214
280
  }));
215
281
  },
216
282
  onStatus: setStatus,
217
283
  ...tenant === void 0 ? {} : { tenant },
284
+ ...userId === null ? {} : { user: userId },
218
285
  ...debounceMs === void 0 ? {} : { debounceMs }
219
286
  });
220
287
  return () => {
@@ -222,117 +289,21 @@ function useLiveCount(source, options = {}) {
222
289
  };
223
290
  }, [
224
291
  client,
225
- key,
292
+ held,
226
293
  tenant,
227
294
  userId,
228
295
  auth.status,
229
296
  debounceMs,
230
- hasInitial
297
+ hasInitial,
298
+ seedAt
231
299
  ]);
232
- const fresh = state.key === key;
300
+ const fresh = state.key === held.key;
301
+ const seedNewer = seedAt !== void 0 && seed?.count !== null && seedAt > state.at;
233
302
  return {
234
- count: fresh && state.count !== void 0 ? state.count : initial,
303
+ count: fresh && state.count !== void 0 && !seedNewer ? state.count : initial,
235
304
  status,
236
305
  error: fresh ? state.error : void 0
237
306
  };
238
307
  }
239
308
  //#endregion
240
- //#region src/react/notifications.ts
241
- const unread = (items) => items.filter((item) => typeof item === "object" && item !== null && "readAt" in item && item.readAt === null).length;
242
- /** Joins a private topic and returns the function that leaves it. */
243
- function watchTopic(supabase, topic, watch) {
244
- let closed = false;
245
- let joined = false;
246
- const channel = supabase.channel(topic, { config: { private: true } });
247
- channel.on("broadcast", { event: "*" }, (message) => {
248
- watch.onMessage(message.event, message["payload"]);
249
- });
250
- (async () => {
251
- watch.onStatus("joining");
252
- await supabase.realtime.setAuth();
253
- if (closed) return;
254
- channel.subscribe((state) => {
255
- switch (state) {
256
- case REALTIME_SUBSCRIBE_STATES.SUBSCRIBED:
257
- if (joined) watch.onRejoin();
258
- joined = true;
259
- watch.onStatus("subscribed");
260
- return;
261
- case REALTIME_SUBSCRIBE_STATES.CLOSED:
262
- watch.onStatus("closed");
263
- return;
264
- case REALTIME_SUBSCRIBE_STATES.CHANNEL_ERROR:
265
- case REALTIME_SUBSCRIBE_STATES.TIMED_OUT:
266
- watch.onStatus("error");
267
- return;
268
- default: throw new Error(`Unknown realtime status ${String(state)}`);
269
- }
270
- });
271
- })();
272
- return () => {
273
- closed = true;
274
- supabase.removeChannel(channel);
275
- watch.onStatus("closed");
276
- };
277
- }
278
- /**
279
- * The signed-in user's notifications, kept current: loads them, then loads
280
- * again after each broadcast on `topic` and after the channel rejoins.
281
- *
282
- * ```tsx
283
- * const { items, count } = useNotifications({
284
- * topic: `org:${orgId}:notifications:${userId}`,
285
- * load: () => listNotifications(orgId),
286
- * });
287
- * ```
288
- */
289
- function useNotifications(options) {
290
- const supabase = useSupabase();
291
- const auth = useAuth();
292
- const [items, setItems] = useState(void 0);
293
- const [error, setError] = useState(void 0);
294
- const [status, setStatus] = useState("closed");
295
- const latest = useRef(options);
296
- latest.current = options;
297
- const userId = auth.user?.id ?? null;
298
- const refresh = useCallback(async () => {
299
- const current = latest.current;
300
- try {
301
- const merged = (await Promise.all([current.load, ...current.sources ?? []].map((source) => source()))).flat();
302
- setItems(current.sort ? [...merged].sort(current.sort) : merged);
303
- setError(void 0);
304
- } catch (cause) {
305
- setError(cause);
306
- }
307
- }, []);
308
- const topic = options.topic;
309
- useEffect(() => {
310
- if (auth.status !== "signed-in") return;
311
- refresh();
312
- if (!topic) return;
313
- return watchTopic(supabase, topic, {
314
- onMessage: (event, payload) => {
315
- latest.current.onMessage?.(event, payload);
316
- refresh();
317
- },
318
- onRejoin: () => void refresh(),
319
- onStatus: setStatus
320
- });
321
- }, [
322
- supabase,
323
- topic,
324
- userId,
325
- auth.status,
326
- refresh
327
- ]);
328
- const list = items ?? [];
329
- return {
330
- items,
331
- count: (options.count ?? unread)(list),
332
- status,
333
- error,
334
- refresh
335
- };
336
- }
337
- //#endregion
338
- export { useBroadcast as a, useSupabase as c, useAuth as i, BetterSupabaseProvider as n, useLiveCount as o, createHooks as r, useLiveQuery as s, useNotifications as t };
309
+ export { useBroadcast as a, useLiveQuery as c, useAuth as i, useSupabase as l, ClientContext as n, useBroadcastAuth as o, createHooks as r, useLiveCount as s, BetterSupabaseProvider as t };
@@ -0,0 +1,40 @@
1
+ import { i as toWebHeaders, r as nodeRequestUrl, t as applyWebHeaders } from "./node-headers-C71zNQHe.js";
2
+ import { Readable } from "node:stream";
3
+ import { pipeline } from "node:stream/promises";
4
+ //#region src/node/http.ts
5
+ /**
6
+ * A Node `IncomingMessage` as a Web `Request`. Express, Fastify and Koa
7
+ * pass theirs (`req`, `request.raw`, `ctx.req`). With `body: false` the
8
+ * stream stays unread, for middleware that runs before a body parser.
9
+ */
10
+ function toWebRequest(req, options = {}) {
11
+ const method = req.method ?? "GET";
12
+ const hasBody = (options.body ?? true) && method !== "GET" && method !== "HEAD";
13
+ const controller = new AbortController();
14
+ req.once("close", () => {
15
+ if (!req.complete) controller.abort();
16
+ });
17
+ return new Request(nodeRequestUrl(req, options.trustProxy ?? false), {
18
+ method,
19
+ headers: toWebHeaders(req.headers),
20
+ signal: controller.signal,
21
+ ...hasBody ? {
22
+ body: Readable.toWeb(req),
23
+ duplex: "half"
24
+ } : {}
25
+ });
26
+ }
27
+ /** Writes a Web `Response` to a Node `ServerResponse`, streaming the body. */
28
+ async function sendWebResponse(res, response) {
29
+ res.statusCode = response.status;
30
+ if (response.statusText) res.statusMessage = response.statusText;
31
+ applyWebHeaders(res, response.headers);
32
+ if (!response.body) {
33
+ res.end();
34
+ return;
35
+ }
36
+ const body = response.body;
37
+ await pipeline(Readable.fromWeb(body), res);
38
+ }
39
+ //#endregion
40
+ export { toWebRequest as n, sendWebResponse as t };
@@ -0,0 +1,126 @@
1
+ import { getEnv } from "@supabase/middleware";
2
+ import { fromSupabaseUrl } from "@supabase/server/oauth-protected-resource";
3
+ //#region src/mcp/http.ts
4
+ /** The RFC 9728 well-known prefix. The Supabase Edge Functions gateway never routes it to a function. */
5
+ const WELL_KNOWN = "/.well-known/oauth-protected-resource";
6
+ /** The path suffix `withOAuthProtectedResource` serves, reachable through `/functions/v1/<slug>`. */
7
+ const SUFFIX = "/oauth-protected-resource";
8
+ /** The prefix the Edge Functions gateway strips before the function sees the request. */
9
+ const EDGE_PREFIX = "/functions/v1";
10
+ const ALLOW_HEADERS = "Authorization, Content-Type, Accept, Mcp-Protocol-Version, Mcp-Session-Id, Mcp-Method, Mcp-Name";
11
+ const trim = (value) => value.replace(/\/+$/, "");
12
+ /**
13
+ * Whether the request runs on Supabase Edge Functions, detected as
14
+ * `@supabase/server` 1.9 does, minus its plain-Deno fallback so a Deno Deploy
15
+ * server keeps its own URLs.
16
+ */
17
+ function onEdgeFunctions() {
18
+ return ["SUPABASE_FUNCTION_SLUG", "SB_EXECUTION_ID"].some((key) => Boolean(getEnv(key)));
19
+ }
20
+ /** The public origin: `SUPABASE_PUBLIC_URL`, else the gateway's `X-Forwarded-*` headers. */
21
+ function edgeOrigin(request) {
22
+ const publicUrl = getEnv("SUPABASE_PUBLIC_URL");
23
+ if (publicUrl) return trim(publicUrl);
24
+ const url = new URL(request.url);
25
+ const host = request.headers.get("x-forwarded-host") ?? url.hostname;
26
+ const proto = (request.headers.get("x-forwarded-proto") ?? url.protocol.slice(0, -1)).toLowerCase();
27
+ const port = host.includes(":") ? "" : request.headers.get("x-forwarded-port") ?? url.port;
28
+ return `${proto}://${host}${port && !(proto === "https" && port === "443" || proto === "http" && port === "80") ? `:${port}` : ""}`;
29
+ }
30
+ function stripMetadata(pathname) {
31
+ if (pathname.startsWith(WELL_KNOWN)) return pathname.slice(37);
32
+ if (pathname.endsWith(SUFFIX)) return pathname.slice(0, -25);
33
+ return pathname;
34
+ }
35
+ function edgePath(request) {
36
+ const slug = getEnv("SUPABASE_FUNCTION_SLUG");
37
+ if (slug) return `${EDGE_PREFIX}/${slug}`;
38
+ return trim(`${EDGE_PREFIX}${stripMetadata(new URL(request.url).pathname)}`);
39
+ }
40
+ /** A request for the RFC 9728 metadata, at the well-known prefix or the `{resource}/oauth-protected-resource` suffix. */
41
+ function isMetadataRequest(request) {
42
+ const { pathname } = new URL(request.url);
43
+ if (pathname === WELL_KNOWN || pathname.startsWith(`${WELL_KNOWN}/`)) return true;
44
+ return pathname.endsWith(SUFFIX) && request.method !== "POST";
45
+ }
46
+ /**
47
+ * The public URLs of an MCP endpoint. On Supabase Edge Functions they come
48
+ * from the gateway (the request URL is internal there, without
49
+ * `/functions/v1`), and the metadata is advertised at the suffix route.
50
+ */
51
+ function discovery(options, supabaseUrl) {
52
+ const resource = (request) => {
53
+ if (typeof options.resource === "function") return options.resource(request);
54
+ if (options.resource) return options.resource;
55
+ if (onEdgeFunctions()) return `${edgeOrigin(request)}${edgePath(request)}`;
56
+ const url = new URL(request.url);
57
+ return trim(`${url.origin}${stripMetadata(url.pathname)}`);
58
+ };
59
+ return {
60
+ resource,
61
+ metadataUrl: (request) => {
62
+ const target = new URL(resource(request));
63
+ const path = trim(target.pathname);
64
+ return onEdgeFunctions() ? `${target.origin}${path}${SUFFIX}` : `${target.origin}${WELL_KNOWN}${path}`;
65
+ },
66
+ authorizationServers: (request) => {
67
+ if (options.authorizationServers) return options.authorizationServers;
68
+ return onEdgeFunctions() ? [`${edgeOrigin(request)}/auth/v1`] : [fromSupabaseUrl(supabaseUrl())];
69
+ },
70
+ host: (request) => {
71
+ return (onEdgeFunctions() ? request.headers.get("x-forwarded-host") : null) ?? request.headers.get("host");
72
+ }
73
+ };
74
+ }
75
+ /** The `OPTIONS` answer for the metadata route. */
76
+ function metadataPreflight() {
77
+ return new Response(null, {
78
+ status: 204,
79
+ headers: {
80
+ "access-control-allow-origin": "*",
81
+ "access-control-allow-methods": "GET, OPTIONS",
82
+ "access-control-allow-headers": "Content-Type, Mcp-Protocol-Version"
83
+ }
84
+ });
85
+ }
86
+ /** The `OPTIONS` answer for the MCP endpoint. */
87
+ function endpointPreflight(request, allowedOrigins) {
88
+ return withCors(new Response(null, {
89
+ status: 204,
90
+ headers: {
91
+ "access-control-allow-methods": "POST, OPTIONS",
92
+ "access-control-allow-headers": ALLOW_HEADERS,
93
+ "access-control-max-age": "86400"
94
+ }
95
+ }), request, allowedOrigins);
96
+ }
97
+ /**
98
+ * Adds CORS headers to an endpoint response, keeping any the handler set.
99
+ * With `allowedOrigins` a listed origin is echoed; otherwise any origin may
100
+ * call, which is safe because the token travels in a header, not a cookie.
101
+ */
102
+ function withCors(response, request, allowedOrigins) {
103
+ const origin = request.headers.get("origin");
104
+ const allow = allowedOrigins ? origin && allowedOrigins.includes(origin) ? origin : null : "*";
105
+ const apply = (headers) => {
106
+ if (allow && !headers.has("access-control-allow-origin")) {
107
+ headers.set("access-control-allow-origin", allow);
108
+ if (allow !== "*") headers.append("vary", "Origin");
109
+ }
110
+ if (!headers.has("access-control-expose-headers")) headers.set("access-control-expose-headers", "WWW-Authenticate");
111
+ };
112
+ try {
113
+ apply(response.headers);
114
+ return response;
115
+ } catch {
116
+ const headers = new Headers(response.headers);
117
+ apply(headers);
118
+ return new Response(response.body, {
119
+ status: response.status,
120
+ statusText: response.statusText,
121
+ headers
122
+ });
123
+ }
124
+ }
125
+ //#endregion
126
+ export { withCors as a, metadataPreflight as i, endpointPreflight as n, isMetadataRequest as r, discovery as t };
@@ -0,0 +1,41 @@
1
+ //#region src/storage/image-url.ts
2
+ /** Storage's image transformation limits. */
3
+ const MAX_SIDE = 2500;
4
+ const QUALITY = {
5
+ min: 20,
6
+ max: 100
7
+ };
8
+ const clamp = (value, min, max) => Math.min(max, Math.max(min, Math.round(value)));
9
+ /**
10
+ * Turns public Storage object URLs into Supabase image transformation URLs
11
+ * (`/render/image/public`) at a given size. Any other URL (local files,
12
+ * other hosts, signed URLs) comes back as `undefined`: a signed URL's token
13
+ * covers the transform it was signed with, so sign it with `renderUrl()`.
14
+ *
15
+ * ```ts
16
+ * const imageUrl = storageImageUrl({ url: SUPABASE_URL })
17
+ * imageUrl(avatar, { width: 96 }) ?? avatar
18
+ * ```
19
+ */
20
+ function storageImageUrl(options) {
21
+ const storage = `${options.url.replace(/\/+$/, "")}/storage/v1`;
22
+ const publicPrefixes = [`${storage}/object/public/`, `${storage}/render/image/public/`].map((prefix) => ({
23
+ prefix,
24
+ length: new URL(prefix).pathname.length
25
+ }));
26
+ return (src, size) => {
27
+ const prefix = publicPrefixes.find((candidate) => src.startsWith(candidate.prefix));
28
+ if (prefix === void 0) return;
29
+ const source = new URL(src);
30
+ const object = source.pathname.slice(prefix.length);
31
+ const target = new URL(`${storage}/render/image/public/${object}`);
32
+ for (const [key, value] of source.searchParams) target.searchParams.set(key, value);
33
+ target.searchParams.set("width", String(clamp(size.width, 1, MAX_SIDE)));
34
+ if (size.height !== void 0) target.searchParams.set("height", String(clamp(size.height, 1, MAX_SIDE)));
35
+ if (size.quality !== void 0) target.searchParams.set("quality", String(clamp(size.quality, QUALITY.min, QUALITY.max)));
36
+ if (options.resize) target.searchParams.set("resize", options.resize);
37
+ return target.toString();
38
+ };
39
+ }
40
+ //#endregion
41
+ export { storageImageUrl as t };
@@ -15,7 +15,7 @@ function actorAt(outer, id) {
15
15
  const sessionId = outer["session_id"];
16
16
  const readOnly = outer["read_only"];
17
17
  const reason = outer["reason"];
18
- if (kind === "support" || kind === void 0 && sessionId !== void 0) {
18
+ if (kind === "support") {
19
19
  if (typeof sessionId !== "string" || sessionId === "") return INVALID;
20
20
  if (readOnly !== void 0 && typeof readOnly !== "boolean") return INVALID;
21
21
  return {
@@ -37,7 +37,7 @@ function actorAt(outer, id) {
37
37
  ...typeof reason === "string" ? { reason } : {}
38
38
  }
39
39
  };
40
- if (kind !== void 0) return INVALID;
40
+ if (kind !== void 0 || sessionId !== void 0) return INVALID;
41
41
  return {
42
42
  ok: true,
43
43
  actor: {
@@ -48,10 +48,10 @@ function actorAt(outer, id) {
48
48
  };
49
49
  }
50
50
  /**
51
- * Reads only `act` and `client_id`, the way PermDock's `actorOf` does. An
51
+ * Reads only `act` and `client_id`. An
52
52
  * `act` that is not a chain of objects each with a non-empty `sub`, a
53
- * `kind` other than `support` or `impersonation`, or a support level without
54
- * a `session_id` is `{ ok: false }`: the session must not pass as the user
53
+ * `kind` other than `support` or `impersonation`, a support level without
54
+ * a `session_id`, or a `session_id` without `kind` is `{ ok: false }`: the session must not pass as the user
55
55
  * alone.
56
56
  */
57
57
  function actorOf(claims) {
@@ -95,6 +95,21 @@ function actClaim(options) {
95
95
  reason: options.reason
96
96
  };
97
97
  }
98
+ /** The `act` claim that `impersonatorOf` reads back as `impersonator`. */
99
+ function impersonatorClaim(impersonator) {
100
+ const reason = impersonator.reason === void 0 ? {} : { reason: impersonator.reason };
101
+ return impersonator.kind === "support" ? {
102
+ kind: "support",
103
+ sub: impersonator.id,
104
+ session_id: impersonator.sessionId,
105
+ read_only: impersonator.readOnly ?? true,
106
+ ...reason
107
+ } : {
108
+ kind: "impersonation",
109
+ sub: impersonator.id,
110
+ ...reason
111
+ };
112
+ }
98
113
  /**
99
114
  * The admin in `claims.act`: a support session or an impersonated session
100
115
  * (`actorOf` reads the same level, so the two always agree). `undefined`
@@ -130,4 +145,4 @@ function userContext(user, claims) {
130
145
  };
131
146
  }
132
147
  //#endregion
133
- export { delegationOf as a, actorOf as i, impersonatorOf as n, userContext as r, actClaim as t };
148
+ export { actorOf as a, userContext as i, impersonatorClaim as n, delegationOf as o, impersonatorOf as r, actClaim as t };