better-supabase 0.7.0 → 0.8.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 (500) hide show
  1. package/README.md +6 -2
  2. package/dist/{access-sql-B0dF-SoF.js → access-sql-CrSbK1q-.js} +1 -1
  3. package/dist/{adapter-B-tL8hqg.js → adapter-CN45ibbV.js} +663 -157
  4. package/dist/{agents-CVHGd7It.d.ts → agents-BY_LQXtQ.d.ts} +4 -4
  5. package/dist/{ai-cache-CBWs1W0k.js → ai-cache-Dfgk8nBT.js} +2 -1
  6. package/dist/{ai-cache-DaDu_G5L.d.ts → ai-cache-DrUMMgp6.d.ts} +4 -4
  7. package/dist/{ai-chat-B24UI962.js → ai-chat-CVLRWbtS.js} +4 -3
  8. package/dist/{ai-chat-7amvXjmQ.d.ts → ai-chat-DXkMy74O.d.ts} +5 -5
  9. package/dist/{ai-files-CSPNswUY.js → ai-files-CioLu5du.js} +5 -4
  10. package/dist/ai-message-DfaP8sis.js +14 -0
  11. package/dist/ai-sdk/agents/index.d.ts +4 -4
  12. package/dist/ai-sdk/batches/index.d.ts +4 -4
  13. package/dist/ai-sdk/batches/index.js +4 -4
  14. package/dist/ai-sdk/cache/index.d.ts +2 -2
  15. package/dist/ai-sdk/cache/index.js +2 -2
  16. package/dist/ai-sdk/chat/index.d.ts +1 -1
  17. package/dist/ai-sdk/chat/index.js +8 -20
  18. package/dist/ai-sdk/embeddings/index.d.ts +2 -2
  19. package/dist/ai-sdk/files/index.d.ts +3 -3
  20. package/dist/ai-sdk/files/index.js +4 -4
  21. package/dist/ai-sdk/index.d.ts +37 -9
  22. package/dist/ai-sdk/index.js +3 -2
  23. package/dist/ai-sdk/mcp/index.d.ts +43 -6
  24. package/dist/ai-sdk/mcp/index.js +36 -7
  25. package/dist/ai-sdk/memory/index.d.ts +2 -2
  26. package/dist/ai-sdk/memory/index.js +1 -1
  27. package/dist/ai-sdk/workflow/index.d.ts +6 -6
  28. package/dist/ai-sdk/workflow/index.js +13 -24
  29. package/dist/{ai-tasks-Cd1HMFvB.d.ts → ai-tasks-BRQ6iQLc.d.ts} +4 -4
  30. package/dist/{announcements-ZRGnScWI.d.ts → announcements-Bouy0Ski.d.ts} +3 -3
  31. package/dist/{announcements-CiyOs-xP.js → announcements-p_BFofiR.js} +1 -1
  32. package/dist/api-Dnf2q-Ht.d.ts +370 -0
  33. package/dist/api-DtHFC037.js +676 -0
  34. package/dist/{api-keys-CIjghYjV.d.ts → api-keys-C8BlF3L2.d.ts} +4 -4
  35. package/dist/arazzo/index.d.ts +255 -0
  36. package/dist/arazzo/index.js +622 -0
  37. package/dist/{assistant-DwdpDH1q.d.ts → assistant-DBlFDZsi.d.ts} +5 -5
  38. package/dist/astro/index.d.ts +7 -7
  39. package/dist/astro/index.js +7 -7
  40. package/dist/asyncapi/index.d.ts +103 -0
  41. package/dist/asyncapi/index.js +569 -0
  42. package/dist/authorizer-ayxUDXXP.js +126 -0
  43. package/dist/authorizer-eiOjo-3l.d.ts +73 -0
  44. package/dist/better-result/index.d.ts +118 -0
  45. package/dist/better-result/index.js +64 -0
  46. package/dist/{bind-l4kAvYSv.js → bind-ButSzrHe.js} +1 -1
  47. package/dist/{bind-Bu_ZNa3W.d.ts → bind-CQ5mPyX1.d.ts} +3 -3
  48. package/dist/{block-events-CrT8r7Fe.js → block-events-DTxU5tfr.js} +18 -3
  49. package/dist/{block-fields-GFkxl4dP.js → block-fields-CroxUuF2.js} +3 -3
  50. package/dist/{block-fields-SJ6fEf3o.d.ts → block-fields-D1pfrcIY.d.ts} +2 -2
  51. package/dist/{block-helpers-CKtbFcRv.d.ts → block-helpers-C0Xj8War.d.ts} +2 -2
  52. package/dist/{block-helpers-DWHxHsEQ.js → block-helpers-Cy3pB96I.js} +41 -9
  53. package/dist/{block-hooks-BmjMyXTa.js → block-hooks-BPNMIlLl.js} +3 -3
  54. package/dist/{block-hooks-plbZ0AbJ.d.ts → block-hooks-DaOVC7SC.d.ts} +3 -3
  55. package/dist/{block-transport-BLr-ZgLc.js → block-transport-bAKh-dGc.js} +28 -2
  56. package/dist/{block-transport-DvaoPuZ9.d.ts → block-transport-inD4fFq-.d.ts} +24 -2
  57. package/dist/blocks/agents/index.d.ts +3 -3
  58. package/dist/blocks/agents/index.js +5 -4
  59. package/dist/blocks/ai-cache/index.d.ts +3 -3
  60. package/dist/blocks/ai-cache/index.js +3 -3
  61. package/dist/blocks/ai-chat/index.d.ts +9 -4
  62. package/dist/blocks/ai-chat/index.js +5 -5
  63. package/dist/blocks/ai-chat/react/index.d.ts +3 -3
  64. package/dist/blocks/ai-chat/react/index.js +5 -5
  65. package/dist/blocks/ai-files/index.d.ts +3 -3
  66. package/dist/blocks/ai-files/index.js +3 -3
  67. package/dist/blocks/ai-providers/index.d.ts +3 -3
  68. package/dist/blocks/ai-providers/index.js +8 -7
  69. package/dist/blocks/ai-tasks/index.d.ts +3 -3
  70. package/dist/blocks/ai-tasks/index.js +7 -6
  71. package/dist/blocks/announcements/index.d.ts +3 -3
  72. package/dist/blocks/announcements/index.js +3 -3
  73. package/dist/blocks/announcements/react/index.d.ts +3 -3
  74. package/dist/blocks/announcements/react/index.js +3 -3
  75. package/dist/blocks/api-keys/index.d.ts +5 -5
  76. package/dist/blocks/api-keys/index.js +8 -8
  77. package/dist/blocks/attachments/index.d.ts +12 -8
  78. package/dist/blocks/attachments/index.js +22 -13
  79. package/dist/blocks/audit/index.d.ts +21 -10
  80. package/dist/blocks/audit/index.js +30 -11
  81. package/dist/blocks/billing/index.d.ts +11 -9
  82. package/dist/blocks/billing/index.js +15 -15
  83. package/dist/blocks/comments/index.d.ts +8 -8
  84. package/dist/blocks/comments/index.js +8 -7
  85. package/dist/blocks/connectors/index.d.ts +3 -3
  86. package/dist/blocks/connectors/index.js +7 -6
  87. package/dist/blocks/data-lifecycle/index.d.ts +12 -8
  88. package/dist/blocks/data-lifecycle/index.js +13 -8
  89. package/dist/blocks/entitlements/index.d.ts +3 -3
  90. package/dist/blocks/entitlements/index.js +1 -1
  91. package/dist/blocks/flags/index.d.ts +4 -4
  92. package/dist/blocks/flags/index.js +4 -3
  93. package/dist/blocks/inbox/index.d.ts +3 -3
  94. package/dist/blocks/inbox/index.js +4 -5
  95. package/dist/blocks/inbox/react/index.d.ts +1 -1
  96. package/dist/blocks/inbox/react/index.js +1 -1
  97. package/dist/blocks/inbox/react/server.d.ts +1 -1
  98. package/dist/blocks/index.d.ts +10 -10
  99. package/dist/blocks/index.js +6 -6
  100. package/dist/blocks/jobs/index.d.ts +48 -32
  101. package/dist/blocks/jobs/index.js +44 -287
  102. package/dist/blocks/knowledge/index.d.ts +3 -3
  103. package/dist/blocks/knowledge/index.js +3 -3
  104. package/dist/blocks/memory/index.d.ts +4 -4
  105. package/dist/blocks/memory/index.js +7 -6
  106. package/dist/blocks/notifications/index.d.ts +11 -9
  107. package/dist/blocks/notifications/index.js +20 -25
  108. package/dist/blocks/notifications/react/index.d.ts +1 -1
  109. package/dist/blocks/notifications/react/index.js +1 -1
  110. package/dist/blocks/onboarding/index.d.ts +3 -3
  111. package/dist/blocks/onboarding/index.js +3 -3
  112. package/dist/blocks/onboarding/react/index.d.ts +2 -2
  113. package/dist/blocks/onboarding/react/index.js +2 -2
  114. package/dist/blocks/onboarding/react/server.d.ts +1 -1
  115. package/dist/blocks/organizations/index.d.ts +9 -9
  116. package/dist/blocks/organizations/index.js +11 -18
  117. package/dist/blocks/outbox/index.d.ts +2 -2
  118. package/dist/blocks/outbox/index.js +16 -25
  119. package/dist/blocks/profiles/index.d.ts +7 -7
  120. package/dist/blocks/profiles/index.js +7 -6
  121. package/dist/blocks/push/index.d.ts +4 -4
  122. package/dist/blocks/push/index.js +3 -3
  123. package/dist/blocks/settings/index.d.ts +4 -4
  124. package/dist/blocks/settings/index.js +7 -6
  125. package/dist/blocks/sso/index.d.ts +5 -5
  126. package/dist/blocks/sso/index.js +6 -5
  127. package/dist/blocks/usage/index.d.ts +3 -3
  128. package/dist/blocks/usage/index.js +5 -4
  129. package/dist/blocks/waitlist/index.d.ts +5 -5
  130. package/dist/blocks/waitlist/index.js +5 -4
  131. package/dist/blocks/webhooks/index.d.ts +22 -13
  132. package/dist/blocks/webhooks/index.js +41 -70
  133. package/dist/blocks/workflow-builder/index.d.ts +4 -4
  134. package/dist/blocks/workflow-builder/index.js +3 -3
  135. package/dist/blocks/workflow-builder/react/index.d.ts +4 -4
  136. package/dist/blocks/workflow-builder/react/index.js +4 -4
  137. package/dist/blocks/workflows/index.d.ts +3 -3
  138. package/dist/blocks/workflows/index.js +3 -3
  139. package/dist/blocks/workflows/react/index.d.ts +3 -3
  140. package/dist/blocks/workflows/react/index.js +3 -3
  141. package/dist/build-hPwk3_X5.js +1296 -0
  142. package/dist/{build-BXIzE6Xv.js → build-meLuYGri.js} +3 -3
  143. package/dist/casing-DdFWEtqr.js +16 -0
  144. package/dist/chat-sdk/index.d.ts +6 -6
  145. package/dist/chat-sdk/index.js +5 -4
  146. package/dist/chat-sdk/react/index.d.ts +1 -1
  147. package/dist/chat-sdk/react/server.d.ts +1 -1
  148. package/dist/{claims-DDBQT6BK.js → claims-0KZVT804.js} +1 -1
  149. package/dist/cli/add-1dc5wM5k.js +69 -0
  150. package/dist/cli/arazzo-1.0-BalU61-_.js +532 -0
  151. package/dist/cli/arazzo-1.1-Bnfasbun.js +705 -0
  152. package/dist/cli/asyncapi-3.0.0-C78dBjR6.js +5593 -0
  153. package/dist/cli/asyncapi-3.1.0-g-7aIfV1.js +5833 -0
  154. package/dist/cli/bin.js +4 -4
  155. package/dist/cli/cache-CIfA-jBV.js +483 -0
  156. package/dist/cli/{codemod-Bl_tQpHn.js → codemod-JVlTQQG2.js} +4 -4
  157. package/dist/cli/{command-CK14fP91.js → command-DV-StG1x.js} +5 -0
  158. package/dist/cli/{config-DU7EJImt.js → config-C2Pz2_4A.js} +7 -4
  159. package/dist/cli/config-DpbF8ML3.js +2 -0
  160. package/dist/cli/{config-NiPxAmUF.js → config-M-WzL9O2.js} +116 -18
  161. package/dist/cli/{db-DOBPt660.js → db-BkcfOlyB.js} +2 -1
  162. package/dist/cli/{diff-SjkO5rNr.js → diff-D1jGdb3Y.js} +1 -1
  163. package/dist/cli/{doctor-CVdnLahA.js → doctor-VcDtuusV.js} +317 -222
  164. package/dist/cli/emit-BHHfwUoT.js +1136 -0
  165. package/dist/cli/{env-qXgyMV6r.js → env-B--LMhEe.js} +13 -10
  166. package/dist/cli/env-vzBG90Um.js +2 -0
  167. package/dist/cli/{env-CJLbUVPB.js → env-zHJtMIBo.js} +11 -3
  168. package/dist/cli/{errors-4v4DTtda.js → errors-CqTLXe2M.js} +18 -2
  169. package/dist/cli/{fastest-levenshtein-CFN-lNDv.js → fastest-levenshtein-CF7BCi9l.js} +1 -1
  170. package/dist/cli/files-BVupXPIC.js +34 -0
  171. package/dist/cli/gen-DmVj3u4L.js +322 -0
  172. package/dist/cli/{init-Cr6arjXU.js → glue-C1UE8gQN.js} +16 -313
  173. package/dist/cli/index.d.ts +59 -31
  174. package/dist/cli/index.js +8 -6
  175. package/dist/cli/init-CVZ3s5kl.js +258 -0
  176. package/dist/cli/{introspect-Bzuv1HHj.js → introspect-BToGNfm-.js} +14 -14
  177. package/dist/cli/{io-DI1mTdSA.js → io-CFzJVJ68.js} +5 -1
  178. package/dist/cli/{keys-BGCnnb-s.js → keys-CJhtIxJ3.js} +4 -4
  179. package/dist/cli/metadata-DSRKCaf-.js +133 -0
  180. package/dist/cli/names-D6LrQnOv.js +6 -0
  181. package/dist/cli/openapi-3.0-t7xwkuRH.js +928 -0
  182. package/dist/cli/openapi-3.1-CVze7tBS.js +870 -0
  183. package/dist/cli/openapi-3.2-CFoMYM01.js +1031 -0
  184. package/dist/cli/{openapi-BlRJ18s3.js → openapi-DWa4Ir1q.js} +8 -14
  185. package/dist/cli/prompts-BdeVmVpg.js +2 -0
  186. package/dist/cli/{prompts-BNcNfAve.js → prompts-DZJB1nTw.js} +6 -6
  187. package/dist/cli/{rolldown-runtime-BPOCksWG.js → rolldown-runtime-CMFfr-1z.js} +3 -1
  188. package/dist/cli/run-DA6_lg3w.js +389 -0
  189. package/dist/cli/run-DuN1MX-7.js +705 -0
  190. package/dist/cli/scaffold-5DenHSxF.js +292 -0
  191. package/dist/cli/scaffold-CwQUMFRb.js +2 -0
  192. package/dist/cli/{seed-DQzqT7LP.js → seed-CzBmrGON.js} +14 -18
  193. package/dist/cli/seed-DOmit9Hq.js +2 -0
  194. package/dist/cli/{skills-QQs4q68J.js → skills-CnO8QFS7.js} +7 -6
  195. package/dist/cli/snapshot-Bstk6ulj.js +287 -0
  196. package/dist/cli/source-args-BYfq6imV.js +31 -0
  197. package/dist/cli/spec-CzosTYm3.js +7438 -0
  198. package/dist/cli/spec-T_0Bcyw7.js +2 -0
  199. package/dist/cli/{sql-B8csQPyn.js → sql-BKOOQAX3.js} +240 -218
  200. package/dist/cli/sql-DJrNDxQm.js +3 -0
  201. package/dist/cli/{style-C0NFdJRL.js → style-CB3vxgh0.js} +3 -3
  202. package/dist/cli/typegen-Demi5-VQ.js +486 -0
  203. package/dist/cli/validate-Ca13ktgz.js +7522 -0
  204. package/dist/cli/{version-Bp4fyubI.js → version-B4k0aUxS.js} +1 -1
  205. package/dist/client/index.d.ts +4 -3
  206. package/dist/client/index.js +60 -3
  207. package/dist/client/native/index.d.ts +3 -3
  208. package/dist/client/native/index.js +3 -3
  209. package/dist/{client-CI0Z2zWX.js → client-wxeTQFtB.js} +36 -3
  210. package/dist/{clone-BfgmLU90.js → clone-dN9XOL1K.js} +9 -1
  211. package/dist/{cloud-event-BnmD5fb9.js → cloud-event-CTh9Sr5w.js} +16 -2
  212. package/dist/{cloud-event-C1JCc1bH.d.ts → cloud-event-Dune0KI7.d.ts} +16 -2
  213. package/dist/{compiler-DY_wkj4R.d.ts → compiler-V1qvcST1.d.ts} +2 -2
  214. package/dist/{compose-BIBNgAnq.js → compose-BHej1acw.js} +3 -3
  215. package/dist/{composite-CpHLEo-G.d.ts → composite-CWAJTRBF.d.ts} +6 -6
  216. package/dist/{composite-C6I8ZyaF.js → composite-zTe0TCqj.js} +4 -4
  217. package/dist/config/index.d.ts +3 -4
  218. package/dist/config/index.js +4 -4
  219. package/dist/config-DlKvtt95.js +540 -0
  220. package/dist/{connector-Dv8kK0MO.d.ts → connector-CySQEFcW.d.ts} +1 -1
  221. package/dist/{connectors-CrpknU0P.d.ts → connectors--PGhmiu0.d.ts} +4 -4
  222. package/dist/{context-BCrWe7ow.d.ts → context-DsV2SueA.d.ts} +11 -2
  223. package/dist/context-nPDvQ-Zl.js +41 -0
  224. package/dist/credentials/index.d.ts +5 -5
  225. package/dist/credentials/index.js +9 -17
  226. package/dist/{cron-DVPUg5k3.js → cron-D25Ukpxy.js} +1 -1
  227. package/dist/cron-route-D2AN9SA1.js +24 -0
  228. package/dist/{csv-DCK-PT1n.js → csv-BZnHA1Py.js} +1 -1
  229. package/dist/{define-B-TVjC25.js → define-CFQcvM20.js} +263 -229
  230. package/dist/{define-CJJkkr1-.d.ts → define-DmcfoNXB.d.ts} +136 -111
  231. package/dist/edge/index.d.ts +66 -13
  232. package/dist/edge/index.js +65 -39
  233. package/dist/elysia/index.d.ts +1 -1
  234. package/dist/elysia/index.js +1 -1
  235. package/dist/{embeddings-C9KGQnXt.d.ts → embeddings-B4vhS-dY.d.ts} +1 -1
  236. package/dist/{ended-XjeGQ5XW.d.ts → ended-CcvcRqEd.d.ts} +7 -1
  237. package/dist/{entitlements-DRl6ZJUm.js → entitlements-BYFf0Cdh.js} +2 -2
  238. package/dist/{entitlements-BKSVGtrG.d.ts → entitlements-Ds8qoYZ-.d.ts} +1 -1
  239. package/dist/env/index.d.ts +1 -1
  240. package/dist/env/index.js +9 -2
  241. package/dist/{errors-B11Duf73.js → errors-2M6CKMP4.js} +5 -0
  242. package/dist/{errors-DLjJHPLK.js → errors-rZ7VIqp6.js} +2 -2
  243. package/dist/{escape-like-ImTK0ps_.d.ts → escape-like-DDWoHzh_.d.ts} +1 -1
  244. package/dist/eve/index.d.ts +5 -5
  245. package/dist/eve/index.js +5 -11
  246. package/dist/{eve-gT2Fpjut.d.ts → eve-CoAIcCkq.d.ts} +2 -2
  247. package/dist/events/index.d.ts +4 -4
  248. package/dist/events/index.js +7 -2
  249. package/dist/{events-DWDhx77e.d.ts → events-D1BOCll8.d.ts} +6 -4
  250. package/dist/{executor-Bq28caBo.js → executor-B-fD7DLt.js} +52 -35
  251. package/dist/executor-B_Hfobee.js +162 -0
  252. package/dist/{executor-BVBFM86G.d.ts → executor-CpxLPCiz.d.ts} +1 -1
  253. package/dist/{executor-CaWigTyR.d.ts → executor-DfEtf0cq.d.ts} +43 -27
  254. package/dist/{executor-DvsBbNBS.d.ts → executor-Drzu3dBK.d.ts} +2 -2
  255. package/dist/{executor-DbvExCFC.d.ts → executor-ngjKL_Pe.d.ts} +2 -2
  256. package/dist/expo/index.d.ts +4 -4
  257. package/dist/expo/index.js +6 -6
  258. package/dist/expo-sqlite/index.d.ts +3 -3
  259. package/dist/expo-sqlite/index.js +2 -2
  260. package/dist/extra-CGQ2_q3S.js +10 -0
  261. package/dist/{field-errors-BFOa7WhB.d.ts → field-errors-DIe9XYWL.d.ts} +17 -7
  262. package/dist/{field-errors-VF1yb8yI.js → field-errors-DZVRWRkf.js} +1 -1
  263. package/dist/format-DTXdu8ya.d.ts +70 -0
  264. package/dist/{framework-KIPvRQJU.d.ts → framework-148t1m3C.d.ts} +5 -5
  265. package/dist/{framework-BDCpJI7o.js → framework-3ey3QmrO.js} +2 -2
  266. package/dist/function-contract-BcZenXMO.d.ts +8 -0
  267. package/dist/{gateway-C1ssRHnf.d.ts → gateway-S9vicgeo.d.ts} +4 -4
  268. package/dist/{guards-BnzDvFrz.js → guards-6F2bCtQR.js} +3 -1
  269. package/dist/h3/index.d.ts +1 -1
  270. package/dist/h3/index.js +1 -1
  271. package/dist/h3/v1/index.d.ts +1 -1
  272. package/dist/h3/v1/index.js +1 -1
  273. package/dist/{message-CaKlqdsX.js → history-GH1HJWQV.js} +65 -13
  274. package/dist/hmac-DCud0myt.js +22 -0
  275. package/dist/hono/index.d.ts +19 -14
  276. package/dist/hono/index.js +21 -16
  277. package/dist/{hooks-1BTCJsiw.js → hooks-Bhza9Hnr.js} +68 -100
  278. package/dist/http-sbmBe5d2.js +25 -0
  279. package/dist/{inbox-i7E1ppo6.d.ts → inbox-Cd1KCEBL.d.ts} +3 -3
  280. package/dist/index-B72Rvv_j.d.ts +89 -0
  281. package/dist/{index-DunNRdnT.d.ts → index-BCHR4Ucl.d.ts} +4 -4
  282. package/dist/{index-CLg87OBW.d.ts → index-BUK7jUzR.d.ts} +6 -0
  283. package/dist/{config-D44Y7PAv.d.ts → index-Ba1SI-uO.d.ts} +625 -278
  284. package/dist/{index-D48jVS-N.d.ts → index-BfxOaOYs.d.ts} +4 -5
  285. package/dist/{index-ClmjK_o-.d.ts → index-CicIyqOe.d.ts} +4 -4
  286. package/dist/{index-ACiNPN4Z.d.ts → index-D69h4QqD.d.ts} +1 -1
  287. package/dist/index-DG2SUXDQ.d.ts +58 -0
  288. package/dist/{index-Bepi-Hgg.d.ts → index-DoNVLHOU.d.ts} +3 -3
  289. package/dist/{index-CdZKQF98.d.ts → index-R274XFlg.d.ts} +1 -1
  290. package/dist/{index-CewnYSpv.d.ts → index-_4R4b01v.d.ts} +8 -18
  291. package/dist/index.d.ts +89 -14
  292. package/dist/index.js +12 -11
  293. package/dist/{json-schema-CvER4kgT.js → json-schema-CT4tvrkA.js} +148 -102
  294. package/dist/{kit-Fm-Fv7q5.js → kit-BhHr9T9v.js} +36 -10
  295. package/dist/{kit-CkNzZUqv.d.ts → kit-W99LCPBS.d.ts} +13 -7
  296. package/dist/{knowledge-BXBbT0Tr.d.ts → knowledge-CAReFpRA.d.ts} +5 -5
  297. package/dist/{knowledge-CDmiMLew.js → knowledge-DnHtb64A.js} +4 -3
  298. package/dist/list/index.d.ts +1 -2
  299. package/dist/{list-query-BRt-zDF7.d.ts → list-query-D3JQeEL7.d.ts} +4 -4
  300. package/dist/mcp/index.d.ts +49 -19
  301. package/dist/mcp/index.js +158 -94
  302. package/dist/mcp/sdk/index.d.ts +38 -6
  303. package/dist/mcp/sdk/index.js +88 -6
  304. package/dist/{message-CfDoR0Y6.d.ts → message-B0fNJgq8.d.ts} +1 -2
  305. package/dist/{messages-B9-5887d.js → messages-CJoHHCWT.js} +4 -205
  306. package/dist/{mfa-Daak8ukG.d.ts → mfa-SZc9YYyb.d.ts} +1 -1
  307. package/dist/model-OgBxvk3N.d.ts +300 -0
  308. package/dist/model-messages-Cxw_Up4f.js +206 -0
  309. package/dist/model-messages-D4GZllOD.d.ts +34 -0
  310. package/dist/modules-DksjZyMW.js +77 -0
  311. package/dist/nestjs/index.d.ts +2 -2
  312. package/dist/nestjs/index.js +1 -1
  313. package/dist/next/index.d.ts +105 -55
  314. package/dist/next/index.js +204 -170
  315. package/dist/node/index.d.ts +2 -2
  316. package/dist/node/index.js +1 -1
  317. package/dist/{onboarding-BZGHYJks.d.ts → onboarding-LZvlK1P4.d.ts} +3 -3
  318. package/dist/openapi/index.d.ts +4 -2
  319. package/dist/openapi/index.js +21 -343
  320. package/dist/optional-peer-D1pi-skw.js +24 -0
  321. package/dist/orpc/index.d.ts +8 -8
  322. package/dist/orpc/index.js +21 -20
  323. package/dist/otel/index.d.ts +3 -3
  324. package/dist/otel/index.js +7 -7
  325. package/dist/{outbox-Cq7pPYvl.d.ts → outbox-DZfAvfzC.d.ts} +6 -6
  326. package/dist/overlay/index.d.ts +233 -0
  327. package/dist/overlay/index.js +554 -0
  328. package/dist/{plugin-FGY8UhYm.d.ts → plugin-CPK2HsbY.d.ts} +42 -3
  329. package/dist/plugins/actor/index.d.ts +1 -1
  330. package/dist/plugins/actor/index.js +1 -1
  331. package/dist/plugins/rules/index.d.ts +2 -2
  332. package/dist/plugins/rules/index.js +1 -1
  333. package/dist/plugins/soft-delete/index.d.ts +3 -3
  334. package/dist/plugins/soft-delete/index.js +9 -2
  335. package/dist/plugins/tenant/index.d.ts +7 -2
  336. package/dist/plugins/tenant/index.js +16 -2
  337. package/dist/plugins/timestamps/index.d.ts +1 -1
  338. package/dist/plugins/timestamps/index.js +8 -1
  339. package/dist/plugins/validation/index.d.ts +2 -2
  340. package/dist/plugins/validation/index.js +4 -4
  341. package/dist/{pool-CAu2nLrL.d.ts → pool-gkhbGp2E.d.ts} +2 -2
  342. package/dist/postgres/index.d.ts +4 -4
  343. package/dist/postgres/index.js +2 -1
  344. package/dist/{postgrest-BLVdEnfe.d.ts → postgrest-BUqLag2Q.d.ts} +1 -1
  345. package/dist/powersync/index.d.ts +5 -5
  346. package/dist/powersync/index.js +4 -4
  347. package/dist/powersync/react/index.d.ts +3 -3
  348. package/dist/powersync/react/index.js +1 -1
  349. package/dist/{problem-BreOl8b8.js → problem-CJvFeGu7.js} +13 -2
  350. package/dist/{problem-DD8LZFjc.d.ts → problem-TvGdxO1t.d.ts} +7 -1
  351. package/dist/{provider-Di3sRutW.js → provider-DxRTex4x.js} +1 -1
  352. package/dist/{provider-D-UEMvSD.d.ts → provider-ib9wzUDz.d.ts} +2 -2
  353. package/dist/query/index.d.ts +2 -2
  354. package/dist/query/index.js +1 -1
  355. package/dist/{query-BQ-NaZon.js → query-Ctz-qKRx.js} +1 -1
  356. package/dist/rate-limit-Bw7HgmFj.js +260 -0
  357. package/dist/react/index.d.ts +9 -9
  358. package/dist/react/index.js +4 -4
  359. package/dist/react/native/index.d.ts +1 -1
  360. package/dist/react/native/index.js +2 -2
  361. package/dist/react/server.d.ts +10 -10
  362. package/dist/react/server.js +3 -3
  363. package/dist/react/session.d.ts +2 -2
  364. package/dist/{react-F80mF4-t.js → react-Bmpo59D7.js} +4 -4
  365. package/dist/react-router/index.d.ts +6 -6
  366. package/dist/react-router/index.js +9 -11
  367. package/dist/{read-set-DuKWC9Mj.js → read-set-DAeWhqPf.js} +2 -2
  368. package/dist/realtime/index.d.ts +3 -3
  369. package/dist/realtime/index.js +30 -36
  370. package/dist/{refusal-DhSU2Vvr.d.ts → refusal-CFI8-5nf.d.ts} +4 -1
  371. package/dist/{refusal-CeJWxmkH.js → refusal-K78A1Vmq.js} +5 -5
  372. package/dist/{resolve-tJZY3FEa.js → resolve-Bvgf3ut_.js} +131 -42
  373. package/dist/{resolve-ChTYeTEl.d.ts → resolve-MxXVWyhd.d.ts} +12 -8
  374. package/dist/resource--vTrBe6I.d.ts +103 -0
  375. package/dist/resource-BqNqlYg9.js +91 -0
  376. package/dist/resource-DA811u_4.js +463 -0
  377. package/dist/resource-execute-rbKvuCsY.d.ts +12 -0
  378. package/dist/resource-schemas-BJ518zFH.js +79 -0
  379. package/dist/resource-types-CqB6GWGT.d.ts +141 -0
  380. package/dist/resources-BVYPnuLo.js +56 -0
  381. package/dist/resources-DZSk8tXJ.d.ts +7 -0
  382. package/dist/{respond-DprrgyXX.d.ts → respond-Cw-zanCm.d.ts} +3 -3
  383. package/dist/{respond-BUgsXNgk.js → respond-volM3ByS.js} +4 -4
  384. package/dist/{result-D7y2fT87.d.ts → result-BchM1XZn.d.ts} +7 -1
  385. package/dist/{result-DzUbqgdW.js → result-DEqHCMKP.js} +1 -1
  386. package/dist/server/index.d.ts +81 -19
  387. package/dist/server/index.js +16 -14
  388. package/dist/{server-ZSJ9rCcV.d.ts → server-types-CrAmZ8jv.d.ts} +110 -36
  389. package/dist/{shared-CxWmcyqB.js → shared-DHjhfRdV.js} +2 -15
  390. package/dist/shared-DTneRoxi.js +14 -0
  391. package/dist/{sign-in-Cb1mwv6X.js → sign-in-D_yoP0PF.js} +1 -1
  392. package/dist/signatures-BRS_p3WD.d.ts +34 -0
  393. package/dist/signatures-DsWv_bYR.js +103 -0
  394. package/dist/{signers-4y62_VIi.d.ts → signers-cpdmZYrv.d.ts} +1 -1
  395. package/dist/solid/index.d.ts +9 -18
  396. package/dist/solid/index.js +2 -2
  397. package/dist/solid-start/index.d.ts +6 -6
  398. package/dist/solid-start/index.js +7 -7
  399. package/dist/spec/index.d.ts +134 -0
  400. package/dist/spec/index.js +353 -0
  401. package/dist/{spec-pins-C89s6DyW.d.ts → spec-pins-CwzDY25w.d.ts} +18 -1
  402. package/dist/{spec-pins--j6mTok4.js → spec-pins-DsLfUH7l.js} +14 -1
  403. package/dist/sql/index.d.ts +145 -119
  404. package/dist/sql/index.js +19921 -19798
  405. package/dist/{executor-De1Of3m3.js → sql-CwuqaQ4Y.js} +34 -169
  406. package/dist/ssr/index.d.ts +4 -4
  407. package/dist/ssr/index.js +3 -2
  408. package/dist/{standard-BK0cqJ7y.js → standard-DkzZUneg.js} +2 -2
  409. package/dist/{standard-CYsm7xpT.d.ts → standard-lmkbOtPB.d.ts} +1 -1
  410. package/dist/{stats-D_AD9GGu.js → stats-DhU78Ctf.js} +8 -4
  411. package/dist/storage/index.d.ts +4 -6
  412. package/dist/storage/index.js +16 -17
  413. package/dist/{bucket-Cl46E3jS.d.ts → storage-api-CB7Zl1Ci.d.ts} +243 -8
  414. package/dist/{store-CGjgWu5n.d.ts → store-DsIYEBnv.d.ts} +1 -1
  415. package/dist/streams/index.d.ts +4 -4
  416. package/dist/streams/index.js +5 -4
  417. package/dist/streams/redis/index.d.ts +1 -1
  418. package/dist/streams/redis/index.js +5 -11
  419. package/dist/{stripe-BMj5LtsT.js → stripe-v-Y2lmop.js} +2 -8
  420. package/dist/supabase-mcp-C6tMoEjn.d.ts +43 -0
  421. package/dist/supabase-mcp-Cpn5A4i-.js +28 -0
  422. package/dist/{support-DWwzVf-O.js → support-D1pFFouF.js} +71 -35
  423. package/dist/{support-view-CVOJJLpc.d.ts → support-view-scqMgtOo.d.ts} +1 -1
  424. package/dist/svelte/index.d.ts +8 -17
  425. package/dist/svelte/index.js +2 -2
  426. package/dist/sveltekit/index.d.ts +7 -7
  427. package/dist/sveltekit/index.js +10 -12
  428. package/dist/table-schema-htM_SbCW.js +286 -0
  429. package/dist/{tags-Cx-LnIQP.d.ts → tags-BO9LjtWG.d.ts} +1 -1
  430. package/dist/tanstack-db/index.d.ts +2 -2
  431. package/dist/tanstack-db/supabase/index.d.ts +52 -0
  432. package/dist/tanstack-db/supabase/index.js +97 -0
  433. package/dist/tanstack-start/index.d.ts +6 -6
  434. package/dist/tanstack-start/index.js +8 -12
  435. package/dist/{tee-CoEppCER.js → tee-Cb98Vn3b.js} +1 -1
  436. package/dist/{template--jDkl3UP.js → template-lPVh-EwW.js} +11 -2
  437. package/dist/{temporal-required-BVvW7SYJ.js → temporal-required-BtynQtM-.js} +1 -1
  438. package/dist/{tenant-BxNFk9bx.d.ts → tenant-CM368LXb.d.ts} +2 -2
  439. package/dist/testing/index.d.ts +249 -118
  440. package/dist/testing/index.js +1418 -870
  441. package/dist/ttl-cache-XzZ-Q2eX.js +29 -0
  442. package/dist/types-BRTSpOIh.js +5 -0
  443. package/dist/{types-C05bxW-W.d.ts → types-Bb_4-vdW.d.ts} +4 -4
  444. package/dist/{types-AYOvcyep.d.ts → types-CD6yCDx3.d.ts} +5 -5
  445. package/dist/{types-6rocye-y.d.ts → types-CbOUc5IH.d.ts} +4 -4
  446. package/dist/{types-6BdhkmZe.d.ts → types-CoE5Zwy4.d.ts} +8 -0
  447. package/dist/{types-DGs5L0VN.d.ts → types-DSJ3-m9X.d.ts} +4 -4
  448. package/dist/{queue-CLJurhdy.d.ts → types-D__3EN0q.d.ts} +17 -19
  449. package/dist/{usage-CrvrL2vw.d.ts → usage-D0NNUFfr.d.ts} +3 -3
  450. package/dist/{vault-wlbBhqm7.d.ts → vault-BpmApxxW.d.ts} +3 -3
  451. package/dist/vercel-connect/index.d.ts +1 -1
  452. package/dist/vercel-connect/index.js +5 -11
  453. package/dist/{verify-DPuWngD4.d.ts → verify-C91Wyp40.d.ts} +5 -35
  454. package/dist/verify-CJbYfADA.js +124 -0
  455. package/dist/{version--AolB5ej.js → version-Cq8gfDbd.js} +1 -1
  456. package/dist/{view-BeFcRV6G.js → view-D5ryq3gz.js} +1 -1
  457. package/dist/{view-CF7ihnkg.d.ts → view-TpXEUcVN.d.ts} +3 -3
  458. package/dist/vue/index.d.ts +9 -18
  459. package/dist/vue/index.js +2 -2
  460. package/dist/{watch-Xuxrvxq-.js → watch-BcvtAHOd.js} +2 -2
  461. package/dist/{watch-DI34G86j.d.ts → watch-COzRWvVN.d.ts} +23 -9
  462. package/dist/{wire-DtZQ4sdE.js → wire-Df3EWkG8.js} +2 -2
  463. package/dist/{workflow-builder-DJ1oHn8g.js → workflow-builder-CHqHpAVt.js} +6 -5
  464. package/dist/workflow-sdk/builder/index.d.ts +3 -3
  465. package/dist/workflow-sdk/index.d.ts +1 -1
  466. package/dist/workflow-sdk/world/index.d.ts +23 -17
  467. package/dist/workflow-sdk/world/index.js +59 -76
  468. package/dist/{workflow-sdk-B3yLD6Br.d.ts → workflow-sdk-DTZyrvNo.d.ts} +3 -3
  469. package/dist/{workflow-sdk-world-D-prir6O.js → workflow-sdk-world-CMV1ahFW.js} +528 -526
  470. package/dist/{workflows-B0j9WKPu.d.ts → workflows-CcpCBfIe.d.ts} +3 -3
  471. package/dist/{workflows-wu1WWBn7.js → workflows-IvxzG2cl.js} +5 -4
  472. package/package.json +54 -3
  473. package/schemas/config-v1.json +243 -0
  474. package/schemas/doctor-report-v1.json +4 -1
  475. package/schemas/spec-manifest-v1.json +95 -0
  476. package/skills/better-supabase/SKILL.md +8 -4
  477. package/skills/better-supabase/references/troubleshooting.md +20 -20
  478. package/skills/better-supabase-api/references/expo.md +6 -3
  479. package/skills/better-supabase-api/references/powersync.md +2 -1
  480. package/skills/better-supabase-auth/SKILL.md +8 -4
  481. package/dist/cli/config-B9HkL8nF.js +0 -2
  482. package/dist/cli/gen-AIf4MREI.js +0 -3100
  483. package/dist/cli/gen-DSrahEdX.js +0 -2
  484. package/dist/cli/prompts-BTYQGunc.js +0 -2
  485. package/dist/cli/run-BO052mki.js +0 -361
  486. package/dist/config-Dn7F5k9A.js +0 -202
  487. package/dist/history-BZih6SFP.js +0 -64
  488. package/dist/index-BkWT_uBO.d.ts +0 -51
  489. package/dist/index-Bxih3l0u.d.ts +0 -81
  490. package/dist/index-CaxrMD1A.d.ts +0 -1
  491. package/dist/index-DQh4VCc9.d.ts +0 -98
  492. package/dist/keys-4MnkWTTh.js +0 -35
  493. package/dist/messages-DYP0sUTe.d.ts +0 -59
  494. package/dist/modules-dxrVK3ID.js +0 -228
  495. package/dist/path-Cv__-OTj.d.ts +0 -17
  496. package/dist/resource-BsvzCMlX.js +0 -212
  497. package/dist/resource-IPS5xi9q.d.ts +0 -74
  498. package/dist/template-CwO38Do8.d.ts +0 -6
  499. package/dist/verify-DL41hbvY.js +0 -232
  500. package/dist/cli/{read-sets-CETOSFx4.js → read-sets-DjJrm8Wj.js} +1 -1
@@ -1,16 +1,18 @@
1
- import { c as mapDbError, n as dbError, o as isDbError, r as dbErrorOf } from "./errors-B11Duf73.js";
2
- import { t as temporal } from "./temporal-required-BVvW7SYJ.js";
3
- import { a as ok, r as err, t as AsyncResult } from "./result-DzUbqgdW.js";
4
- import { a as postgrestExecutor, n as StatsRecorder } from "./stats-D_AD9GGu.js";
5
- import { a as problemResponse } from "./problem-BreOl8b8.js";
1
+ import { c as mapDbError, n as dbError, o as isDbError, r as dbErrorOf } from "./errors-2M6CKMP4.js";
2
+ import { t as temporal } from "./temporal-required-BtynQtM-.js";
3
+ import { a as ok, r as err, s as toDbError, t as AsyncResult } from "./result-DEqHCMKP.js";
4
+ import { n as isRecord } from "./guards-6F2bCtQR.js";
5
+ import { a as postgrestExecutor, n as StatsRecorder } from "./stats-DhU78Ctf.js";
6
+ import { o as problemResponse } from "./problem-CJvFeGu7.js";
6
7
  import { loadEnv } from "./env/index.js";
7
8
  import { a as actorOf, i as userContext, n as impersonatorClaim, t as actClaim } from "./impersonation-DcqaTBHx.js";
8
- import { t as fromPgError } from "./executor-De1Of3m3.js";
9
- import { n as forwardBlockEvents } from "./cloud-event-BnmD5fb9.js";
9
+ import { t as fromPgError } from "./executor-B_Hfobee.js";
10
+ import { i as forwardBlockEvents, t as DEFAULT_TYPE_PREFIX } from "./cloud-event-CTh9Sr5w.js";
10
11
  import { a as replicaState, i as primaryCookieWrite, o as routedExecutor, r as pinnedUntil, s as withPrimaryPin } from "./replicas-CwrYp5Zj.js";
11
- import { c as AUTH_CACHE_HEADERS, d as clearSessionAtScopes, f as parseCookies, h as sessionCookieName, i as resolveAuth, m as serializeCookie, r as prefetchJwks, t as authContext } from "./resolve-tJZY3FEa.js";
12
- import { t as credentialProviderOf } from "./provider-Di3sRutW.js";
13
- import { a as respond, n as defaultPrefetchJwks, r as guard, t as defaultExpose } from "./respond-BUgsXNgk.js";
12
+ import { t as authContext } from "./context-nPDvQ-Zl.js";
13
+ import { d as parseCookies, m as sessionCookieName, n as prefetchJwks, p as serializeCookie, r as resolveAuth, s as AUTH_CACHE_HEADERS, u as clearSessionAtScopes } from "./resolve-Bvgf3ut_.js";
14
+ import { t as credentialProviderOf } from "./provider-DxRTex4x.js";
15
+ import { a as respond, n as defaultPrefetchJwks, r as guard, t as defaultExpose } from "./respond-volM3ByS.js";
14
16
  import { createClient } from "@supabase/supabase-js";
15
17
  import { defineMiddleware, getEnv, pipeline, seedContext } from "@supabase/middleware";
16
18
  import { PostgrestClient } from "@supabase/postgrest-js";
@@ -203,6 +205,11 @@ function suspendAccount(service, sql, userId, options) {
203
205
  if (suspended) {
204
206
  const refused = await ban(client, userId, options.duration ?? FOREVER);
205
207
  if (refused) return err(refused);
208
+ if (options.endSessions !== true) return ok({
209
+ userId,
210
+ suspended,
211
+ ended: 0
212
+ });
206
213
  }
207
214
  let ended;
208
215
  try {
@@ -246,7 +253,7 @@ function serverAudit(betterSupabase, sink) {
246
253
  specversion: "1.0",
247
254
  id: crypto.randomUUID(),
248
255
  source: SERVER_EVENT_SOURCE,
249
- type: `dev.better-supabase.${type}`,
256
+ type: `${DEFAULT_TYPE_PREFIX}.${type}`,
250
257
  subject: `users/${userId}`,
251
258
  time: (/* @__PURE__ */ new Date()).toISOString(),
252
259
  datacontenttype: "application/json",
@@ -263,6 +270,149 @@ function serverAudit(betterSupabase, sink) {
263
270
  } };
264
271
  }
265
272
  //#endregion
273
+ //#region src/server/clients.ts
274
+ const STATELESS = {
275
+ persistSession: false,
276
+ autoRefreshToken: false,
277
+ detectSessionInUrl: false
278
+ };
279
+ /** The Supabase and PostgREST clients of one server: shared service and anon clients, per-request user clients. */
280
+ function createClients(input) {
281
+ const { options, env, definitionExecutor, lite, createClient } = input;
282
+ let adminClient;
283
+ let anonClient;
284
+ const secretKey = () => {
285
+ const key = env().secretKey;
286
+ if (!key) throw new TypeError("admin() needs SUPABASE_SECRET_KEY; it is not set");
287
+ return key;
288
+ };
289
+ const customFetch = options.fetch ? { fetch: options.fetch } : void 0;
290
+ const urlLengthLimit = options.db?.urlLengthLimit ?? definitionExecutor.urlLengthLimit;
291
+ const db = {
292
+ ...options.db?.timeout === void 0 ? {} : { timeout: options.db.timeout },
293
+ ...options.db?.retry === void 0 ? {} : { retry: options.db.retry },
294
+ ...urlLengthLimit === void 0 ? {} : { urlLengthLimit }
295
+ };
296
+ const dbOptions = Object.keys(db).length > 0 ? { db } : {};
297
+ const sharedGlobal = {
298
+ ...customFetch ? { global: customFetch } : {},
299
+ ...dbOptions
300
+ };
301
+ /** postgrest-js options a bare `PostgrestClient` takes; `timeout` is the executor's. */
302
+ const restOptions = {
303
+ ...db.retry === void 0 ? {} : { retry: db.retry },
304
+ ...urlLengthLimit === void 0 ? {} : { urlLengthLimit }
305
+ };
306
+ const rpcUnavailable = lite?.rpcUnavailable;
307
+ const executorOptions = {
308
+ ...definitionExecutor,
309
+ ...urlLengthLimit === void 0 ? {} : { urlLengthLimit },
310
+ ...db.timeout === void 0 ? {} : { timeout: db.timeout },
311
+ ...db.retry === void 0 ? {} : { retry: db.retry },
312
+ ...rpcUnavailable === void 0 ? {} : { rpcUnavailable }
313
+ };
314
+ /** Set when `db` options or the backend need an executor built with them. */
315
+ const tunedExecutor = options.db !== void 0 || rpcUnavailable !== void 0;
316
+ const serviceClient = () => {
317
+ adminClient ??= createClient(env().url, secretKey(), {
318
+ auth: STATELESS,
319
+ ...sharedGlobal
320
+ });
321
+ return adminClient;
322
+ };
323
+ const readUrl = () => options.readUrl === false ? void 0 : options.readUrl?.replace(/\/+$/, "") ?? env().readUrl;
324
+ const apiKeyClient = () => {
325
+ throw new TypeError("ctx.supabase and ctx.db.$client are not available for an API key: ctx.db and ctx.sql run over direct Postgres with the key's claims");
326
+ };
327
+ /** Clients for the primary share the service and anon clients; others don't. */
328
+ const supabaseAt = (url, auth, headers = {}) => {
329
+ const custom = Object.keys(headers).length > 0;
330
+ const global = custom ? {
331
+ global: {
332
+ headers,
333
+ ...customFetch
334
+ },
335
+ ...dbOptions
336
+ } : sharedGlobal;
337
+ const shared = !custom && url === env().url;
338
+ switch (auth.kind) {
339
+ case "user": return createClient(url, env().publishableKey, {
340
+ accessToken: () => Promise.resolve(auth.token),
341
+ ...global
342
+ });
343
+ case "service": return shared ? serviceClient() : createClient(url, secretKey(), {
344
+ auth: STATELESS,
345
+ ...global
346
+ });
347
+ case "anon":
348
+ case "invalid":
349
+ if (!shared) return createClient(url, env().publishableKey, {
350
+ auth: STATELESS,
351
+ ...global
352
+ });
353
+ anonClient ??= createClient(url, env().publishableKey, {
354
+ auth: STATELESS,
355
+ ...sharedGlobal
356
+ });
357
+ return anonClient;
358
+ case "apiKey": return apiKeyClient();
359
+ default: return auth;
360
+ }
361
+ };
362
+ const supabaseFor = (auth, headers = {}) => supabaseAt(env().url, auth, headers);
363
+ const restUrls = /* @__PURE__ */ new Map();
364
+ const restUrl = (url) => {
365
+ let rest = restUrls.get(url);
366
+ if (rest === void 0) {
367
+ rest = new URL("rest/v1", url.endsWith("/") ? url : `${url}/`).href;
368
+ restUrls.set(url, rest);
369
+ }
370
+ return rest;
371
+ };
372
+ /**
373
+ * The client queries run on. Requests need only PostgREST, so they skip
374
+ * building Realtime, Storage and Auth clients per request; the shared
375
+ * service and anon clients for the primary are built once anyway.
376
+ */
377
+ const restAt = (url, auth, headers = {}) => {
378
+ let key;
379
+ let bearer;
380
+ switch (auth.kind) {
381
+ case "user":
382
+ key = env().publishableKey;
383
+ bearer = auth.token;
384
+ break;
385
+ case "service":
386
+ case "anon":
387
+ case "invalid":
388
+ if (Object.keys(headers).length === 0 && url === env().url) return supabaseAt(url, auth, headers);
389
+ key = auth.kind === "service" ? secretKey() : env().publishableKey;
390
+ bearer = key;
391
+ break;
392
+ case "apiKey": return apiKeyClient();
393
+ default: return auth;
394
+ }
395
+ return new PostgrestClient(restUrl(url), {
396
+ headers: {
397
+ ...headers,
398
+ apikey: key,
399
+ Authorization: `Bearer ${bearer}`
400
+ },
401
+ ...customFetch,
402
+ ...restOptions
403
+ });
404
+ };
405
+ return {
406
+ executorOptions,
407
+ tunedExecutor,
408
+ serviceClient,
409
+ readUrl,
410
+ apiKeyClient,
411
+ supabaseFor,
412
+ restAt
413
+ };
414
+ }
415
+ //#endregion
266
416
  //#region src/server/entries/core.ts
267
417
  const cores = /* @__PURE__ */ new WeakMap();
268
418
  /** Records the core behind `server`, so `serverCore` finds it on copies too. */
@@ -451,6 +601,58 @@ function withTenant(core) {
451
601
  })();
452
602
  }
453
603
  //#endregion
604
+ //#region src/server/lite.ts
605
+ /** Lite's default driver, the one `lite init` scaffolds. */
606
+ const DEFAULT_LITE_DRIVER = "sqlite-postgres";
607
+ /** Whether the driver stores data in SQLite, where Lite has no database functions. */
608
+ function isSqliteDriver(driver) {
609
+ switch (driver) {
610
+ case "sqlite-postgres":
611
+ case "sqlite": return true;
612
+ case "pglite":
613
+ case "postgres": return false;
614
+ default: return driver;
615
+ }
616
+ }
617
+ function liteRpcUnavailable(driver) {
618
+ return `rpc() is not available on Supabase Lite with the ${driver} driver. Set [db] driver = "pglite" or "postgres" in supabase/config.toml, or call an HTTP endpoint instead.`;
619
+ }
620
+ /** What `backend: "lite"` changes in `createServer`; `undefined` for Supabase. */
621
+ function liteBackend(options, env) {
622
+ if (options.backend !== "lite") return void 0;
623
+ const driver = options.liteDriver ?? DEFAULT_LITE_DRIVER;
624
+ if (options.postgres && driver !== "postgres") throw new TypeError(`Supabase Lite with the ${driver} driver has no Postgres connection for ctx.sql. Remove the postgres option, or run Lite with [db] driver = "postgres".`);
625
+ return {
626
+ auth() {
627
+ if (options.auth?.jwtSecret !== void 0) return options.auth;
628
+ const jwtSecret = env().jwtSecret;
629
+ if (jwtSecret === void 0) throw new TypeError("backend: \"lite\" needs SUPABASE_JWT_SECRET, the auth.jwt_secret Supabase Lite signs user tokens with");
630
+ return {
631
+ ...options.auth,
632
+ jwtSecret
633
+ };
634
+ },
635
+ rpcUnavailable: isSqliteDriver(driver) ? liteRpcUnavailable(driver) : void 0
636
+ };
637
+ }
638
+ //#endregion
639
+ //#region src/server/refusing-executor.ts
640
+ /**
641
+ * An executor for credentials that did not verify: every query, function
642
+ * call and batch answers `error`, so a handler that skips the route guard
643
+ * gets a 401 `Result` and never queries as anon.
644
+ */
645
+ function refusingExecutor(error) {
646
+ const refuse = () => err(error);
647
+ return {
648
+ name: "refused",
649
+ functionSources: true,
650
+ execute: () => Promise.resolve(refuse()),
651
+ rpc: () => Promise.resolve(refuse()),
652
+ batch: (ops) => Promise.resolve(ops.map(() => refuse()))
653
+ };
654
+ }
655
+ //#endregion
454
656
  //#region src/server/request-ids.ts
455
657
  const REQUEST_ID_PATTERN = /^[A-Za-z0-9._:;,@/+=-]{1,128}$/;
456
658
  function requestIdOrUndefined(value) {
@@ -502,6 +704,10 @@ function requestIdPolicy(options = {}) {
502
704
  };
503
705
  }
504
706
  //#endregion
707
+ //#region src/server/server-types.ts
708
+ /** The header `current_tenant_id()` reads over the Data API. */
709
+ const TENANT_HEADER = "x-bs-tenant";
710
+ //#endregion
505
711
  //#region src/auth/support-cookie.ts
506
712
  /** The cookie that carries the support session id. */
507
713
  const SUPPORT_COOKIE = "bs-support";
@@ -553,21 +759,415 @@ const supportOff = {
553
759
  revoke: notConfigured,
554
760
  current: () => Promise.resolve(void 0),
555
761
  list: notConfigured,
762
+ expire: notConfigured,
763
+ expireRoute: () => () => Promise.resolve(problemResponse(dbError("unexpected", NOT_CONFIGURED))),
556
764
  sessionIdOf: () => void 0,
557
765
  clearCookie: () => clearSupportCookie()
558
766
  };
559
767
  //#endregion
768
+ //#region src/server/support-storage.ts
769
+ const VISIBLE_OBJECT = "select exists (select 1 from storage.objects o where o.bucket_id = $1 and o.name = $2) as visible";
770
+ const VISIBLE_OBJECTS = `select n.path from unnest($2::text[]) as n(path)
771
+ where exists (select 1 from storage.objects o where o.bucket_id = $1 and o.name = n.path)`;
772
+ const OBJECT_INFO = "select to_jsonb(o) as object from storage.objects o where o.bucket_id = $1 and o.name = $2";
773
+ const SEARCH = `select s.name, s.id::text as id, s.updated_at, s.created_at, s.last_accessed_at, s.metadata
774
+ from storage.search($1::text, $2::text, $3::int, $4::int, $5::int, $6::text, $7::text, $8::text) s`;
775
+ const SEARCH_V2 = `select s.key, s.name, s.id::text as id, s.updated_at, s.created_at, s.last_accessed_at, s.metadata
776
+ from storage.search_v2($1::text, $2::text, $3::int, $4::int, $5::text, $6::text, $7::text, $8::text) s`;
777
+ const HIDDEN_URL = "Either the object does not exist or you do not have access to it";
778
+ const LIST_SORT_COLUMNS = /* @__PURE__ */ new Set([
779
+ "name",
780
+ "updated_at",
781
+ "created_at",
782
+ "last_accessed_at"
783
+ ]);
784
+ const LIST_V2_SORT_COLUMNS = /* @__PURE__ */ new Set([
785
+ "name",
786
+ "updated_at",
787
+ "created_at"
788
+ ]);
789
+ const FLAT_SORT_COLUMNS = /* @__PURE__ */ new Set(["updated_at", "created_at"]);
790
+ const SORT_ORDERS = /* @__PURE__ */ new Set(["asc", "desc"]);
791
+ const CURSOR_PARTS = {
792
+ l: "startAfter",
793
+ o: "sortOrder",
794
+ c: "sortColumn",
795
+ a: "sortColumnAfter"
796
+ };
797
+ const isCursorKey = (key) => Object.hasOwn(CURSOR_PARTS, key);
798
+ /** The path storage-js sends for an upload: no leading or trailing `/`, and no empty folders. */
799
+ function normalizePath(path) {
800
+ return path.replaceAll(/^\/|\/$/g, "").replaceAll(/\/+/g, "/");
801
+ }
802
+ /** `undefined` for an empty string, which storage-api treats as absent. */
803
+ const filled = (value) => value === "" ? void 0 : value;
804
+ /** `LIKE` escaping as storage-api applies it. */
805
+ function escapeLike(text) {
806
+ return text.replaceAll("\\", "\\\\").replaceAll(/([%_])/g, "\\$1");
807
+ }
808
+ function iso(value) {
809
+ if (value instanceof Date) return value.toISOString();
810
+ if (typeof value !== "string") return value;
811
+ const time = Date.parse(value);
812
+ return Number.isNaN(time) ? value : new Date(time).toISOString();
813
+ }
814
+ /** storage-api's continuation token: `key:value` lines, base64 encoded. */
815
+ function encodeCursor(cursor) {
816
+ const text = Object.entries(CURSOR_PARTS).flatMap(([key, part]) => cursor[part] ? [`${key}:${cursor[part]}`] : []).join("\n");
817
+ let binary = "";
818
+ for (const byte of new TextEncoder().encode(text)) binary += String.fromCodePoint(byte);
819
+ return btoa(binary);
820
+ }
821
+ function decodeCursor(token) {
822
+ let text;
823
+ try {
824
+ text = new TextDecoder().decode(Uint8Array.from(atob(token), (char) => char.codePointAt(0) ?? 0));
825
+ } catch {
826
+ return;
827
+ }
828
+ const cursor = {
829
+ startAfter: "",
830
+ sortOrder: "asc"
831
+ };
832
+ for (const part of text.split("\n")) {
833
+ const match = /^(\S):(.*)/.exec(part);
834
+ const key = match?.[1];
835
+ if (!key || !isCursorKey(key)) return void 0;
836
+ cursor[CURSOR_PARTS[key]] = match[2] ?? "";
837
+ }
838
+ return cursor;
839
+ }
840
+ const apiError = (status, message, code) => ({
841
+ name: "StorageApiError",
842
+ message,
843
+ status,
844
+ statusCode: String(status),
845
+ code
846
+ });
847
+ const failed = (error) => ({
848
+ data: null,
849
+ error
850
+ });
851
+ /** Storage answers a hidden object like a missing one: HTTP 400 with `statusCode` 404. */
852
+ const NOT_FOUND = {
853
+ name: "StorageApiError",
854
+ message: "Object not found",
855
+ status: 400,
856
+ statusCode: "404",
857
+ code: "NoSuchKey"
858
+ };
859
+ const invalid = (message) => apiError(400, message, "InvalidRequest");
860
+ /** A database failure as a Storage `error` that `fromStorageError` passes through unchanged. */
861
+ function sqlFailure(cause) {
862
+ const raw = fromPgError(cause);
863
+ return {
864
+ name: "DbError",
865
+ ...raw ? mapDbError(raw) : toDbError(cause)
866
+ };
867
+ }
868
+ async function settled(run) {
869
+ try {
870
+ return await run();
871
+ } catch (cause) {
872
+ return failed(sqlFailure(cause));
873
+ }
874
+ }
875
+ function listProblem(options) {
876
+ const { limit, offset, sortBy } = options;
877
+ if (limit !== void 0 && (!Number.isInteger(limit) || limit < 1)) return "body/limit must be an integer of at least 1";
878
+ if (offset !== void 0 && (!Number.isInteger(offset) || offset < 0)) return "body/offset must be an integer of at least 0";
879
+ if (sortBy?.column !== void 0 && !LIST_SORT_COLUMNS.has(sortBy.column)) return "body/sortBy/column must be name, updated_at, created_at or last_accessed_at";
880
+ if (sortBy?.order !== void 0 && !SORT_ORDERS.has(sortBy.order)) return "body/sortBy/order must be asc or desc";
881
+ }
882
+ function listV2Problem(options) {
883
+ const { limit, sortBy } = options;
884
+ if (limit !== void 0 && (!Number.isInteger(limit) || limit < 1)) return "body/limit must be an integer of at least 1";
885
+ if (sortBy !== void 0 && !LIST_V2_SORT_COLUMNS.has(sortBy.column)) return "body/sortBy/column must be name, updated_at or created_at";
886
+ if (sortBy?.order !== void 0 && !SORT_ORDERS.has(sortBy.order)) return "body/sortBy/order must be asc or desc";
887
+ }
888
+ /** The query storage-api runs for a `list-v2` page without a delimiter. */
889
+ function flatPage(bucket, prefix, maxKeys, cursor, column, order) {
890
+ const values = [bucket, maxKeys];
891
+ const conditions = ["bucket_id = $1"];
892
+ const sortColumn = column && FLAT_SORT_COLUMNS.has(column) ? column : void 0;
893
+ const sortOrder = order && SORT_ORDERS.has(order) ? order : "asc";
894
+ const operator = sortOrder === "asc" ? ">" : "<";
895
+ const param = () => `$${String(values.length)}`;
896
+ if (prefix) {
897
+ values.push(`${escapeLike(prefix)}%`);
898
+ conditions.push(`name like ${param()}`);
899
+ }
900
+ const startAfter = cursor?.startAfter;
901
+ if (startAfter && sortColumn && cursor.sortColumnAfter) {
902
+ values.push(cursor.sortColumnAfter);
903
+ const afterParam = param();
904
+ values.push(startAfter);
905
+ conditions.push(`row(date_trunc('milliseconds', ${sortColumn}), name collate "C") ${operator} row(coalesce(nullif(${afterParam}, '')::timestamptz, 'epoch'::timestamptz), ${param()})`);
906
+ } else if (startAfter) {
907
+ values.push(startAfter);
908
+ conditions.push(`name collate "C" ${operator} ${param()}`);
909
+ }
910
+ return {
911
+ text: `select id::text as id, name, metadata, updated_at, created_at, last_accessed_at
912
+ from storage.objects
913
+ where ${conditions.join(" and ")}
914
+ order by ${sortColumn ? `${sortColumn} ${sortOrder}, ` : ""}name collate "C" ${sortOrder}
915
+ limit $2::int`,
916
+ values
917
+ };
918
+ }
919
+ /** Groups the entries below the next delimiter into folders, as storage-api does. */
920
+ function delimited(entries, prefix) {
921
+ const grouped = [];
922
+ let previous = "";
923
+ for (const entry of entries) {
924
+ const name = String(entry["name"]);
925
+ const index = name.replace(prefix, "").indexOf("/");
926
+ if (index < 0) {
927
+ grouped.push(entry);
928
+ continue;
929
+ }
930
+ const folder = name.slice(0, prefix.length + index + 1);
931
+ if (folder === previous) continue;
932
+ previous = folder;
933
+ grouped.push({
934
+ id: null,
935
+ name: folder
936
+ });
937
+ }
938
+ return grouped;
939
+ }
940
+ const text = (value) => typeof value === "string" ? value : void 0;
941
+ const metadataOf = (value) => isRecord(value) ? value : null;
942
+ function listEntryOf(row) {
943
+ return {
944
+ name: String(row["name"]),
945
+ id: text(row["id"]) ?? null,
946
+ updated_at: text(iso(row["updated_at"])) ?? null,
947
+ created_at: text(iso(row["created_at"])) ?? null,
948
+ last_accessed_at: text(iso(row["last_accessed_at"])) ?? null,
949
+ metadata: metadataOf(row["metadata"])
950
+ };
951
+ }
952
+ function folderOf(row) {
953
+ const name = String(row["name"]);
954
+ const key = text(row["key"]);
955
+ return {
956
+ name: name.endsWith("/") ? name : `${name}/`,
957
+ ...key === void 0 ? {} : { key }
958
+ };
959
+ }
960
+ function objectOf(row) {
961
+ const key = text(row["key"]);
962
+ const lastAccessed = text(iso(row["last_accessed_at"]));
963
+ return {
964
+ name: String(row["name"]),
965
+ ...key === void 0 ? {} : { key },
966
+ id: text(row["id"]) ?? "",
967
+ updated_at: text(iso(row["updated_at"])) ?? "",
968
+ created_at: text(iso(row["created_at"])) ?? "",
969
+ ...lastAccessed === void 0 ? {} : { last_accessed_at: lastAccessed },
970
+ metadata: metadataOf(row["metadata"])
971
+ };
972
+ }
973
+ function infoOf(row) {
974
+ const metadata = isRecord(row["metadata"]) ? row["metadata"] : {};
975
+ const size = metadata["size"];
976
+ const contentType = text(metadata["mimetype"]);
977
+ const cacheControl = text(metadata["cacheControl"]);
978
+ const etag = text(metadata["eTag"]);
979
+ const lastModified = text(iso(row["updated_at"]));
980
+ const userMetadata = row["user_metadata"];
981
+ const archivedAt = row["archived_at"];
982
+ const deleteMarker = row["is_delete_marker"];
983
+ const versioned = row["is_versioned"];
984
+ return {
985
+ id: text(row["id"]) ?? "",
986
+ name: text(row["name"]) ?? "",
987
+ version: text(row["version"]) ?? "",
988
+ bucketId: text(row["bucket_id"]) ?? "",
989
+ createdAt: text(iso(row["created_at"])) ?? "",
990
+ ...typeof size === "number" ? { size } : {},
991
+ ...contentType === void 0 ? {} : { contentType },
992
+ ...cacheControl === void 0 ? {} : { cacheControl },
993
+ ...etag === void 0 ? {} : { etag },
994
+ ...lastModified === void 0 ? {} : { lastModified },
995
+ ...isRecord(userMetadata) ? { metadata: userMetadata } : {},
996
+ ...archivedAt === void 0 ? {} : { archivedAt: text(iso(archivedAt)) ?? null },
997
+ ...typeof deleteMarker === "boolean" ? { isDeleteMarker: deleteMarker } : {},
998
+ ...typeof versioned === "boolean" ? { isVersioned: versioned } : {}
999
+ };
1000
+ }
1001
+ /**
1002
+ * Storage for a support session, with the same `from(bucket)` file API as
1003
+ * `supabase.storage`, so `bucket.connect()` and the blocks take it.
1004
+ *
1005
+ * Storage policies read `auth.uid()` from the request's token, and there is
1006
+ * no token for the target, so reads go through Postgres as the target.
1007
+ * `exists`, `info`, `list` and `listV2` run entirely there: the listings
1008
+ * call the invoker-rights `storage.search` functions storage-api calls, so
1009
+ * RLS filters each page as it would for the target's own request.
1010
+ * `download` and the signed URLs first check there that the target may see
1011
+ * the object, then the service client serves it. A hidden object answers
1012
+ * like a missing one. `getPublicUrl` is built without a check, as it is
1013
+ * built without a request.
1014
+ *
1015
+ * Writes resolve to a `403` error: `SUPPORT_READ_ONLY` in a read-only
1016
+ * session and `SUPPORT_STORAGE_WRITES` in a writable one. The service client
1017
+ * would store the object with no owner, and Storage never sees the session's
1018
+ * `act` claim, so the write could be neither attributed to the target nor
1019
+ * audited as the admin's.
1020
+ */
1021
+ function supportStorage(options) {
1022
+ const refusal = options.readOnly ?? true ? apiError(403, "The support session is read-only", "SUPPORT_READ_ONLY") : apiError(403, "Storage writes are not available in a support session", "SUPPORT_STORAGE_WRITES");
1023
+ const refuse = () => Promise.resolve(failed(refusal));
1024
+ const rows = (query, values) => options.sql.queryRaw(query, values);
1025
+ return { from(bucket) {
1026
+ const admin = () => options.admin.from(bucket);
1027
+ const visible = async (path) => {
1028
+ const [row] = await rows(VISIBLE_OBJECT, [bucket, path]);
1029
+ return row?.["visible"] === true;
1030
+ };
1031
+ const checked = (path, read) => settled(async () => {
1032
+ const name = normalizePath(path);
1033
+ if (!await visible(name)) return failed(NOT_FOUND);
1034
+ return read(name);
1035
+ });
1036
+ const list = (path, listOptions = {}) => settled(async () => {
1037
+ const problem = listProblem(listOptions);
1038
+ if (problem) return failed(invalid(problem));
1039
+ let prefix = path ?? "";
1040
+ if (prefix.length > 0 && !prefix.endsWith("/")) prefix = `${prefix}/`;
1041
+ const column = listOptions.sortBy?.column ?? "name";
1042
+ const escape = column !== "name";
1043
+ const safePrefix = escape ? escapeLike(prefix) : prefix;
1044
+ const search = listOptions.search ?? "";
1045
+ const safeSearch = escape ? escapeLike(search) : search;
1046
+ return {
1047
+ data: (await rows(SEARCH, [
1048
+ safePrefix,
1049
+ bucket,
1050
+ listOptions.limit ?? 100,
1051
+ (safePrefix + safeSearch).split("/").length,
1052
+ listOptions.offset ?? 0,
1053
+ safeSearch,
1054
+ column,
1055
+ listOptions.sortBy?.order ?? "asc"
1056
+ ])).map(listEntryOf),
1057
+ error: null
1058
+ };
1059
+ });
1060
+ const listV2 = (listOptions = {}) => settled(async () => {
1061
+ const problem = listV2Problem(listOptions);
1062
+ if (problem) return failed(invalid(problem));
1063
+ const limit = Math.min(listOptions.limit ?? 1e3, 1e3);
1064
+ const prefix = listOptions.prefix ?? "";
1065
+ const cursor = listOptions.cursor ? decodeCursor(listOptions.cursor) : void 0;
1066
+ if (listOptions.cursor && !cursor) return failed(apiError(400, "Invalid continuation token", "InvalidParameter"));
1067
+ const sortOrder = filled(cursor?.sortOrder) ?? listOptions.sortBy?.order;
1068
+ const sortColumn = filled(cursor?.sortColumn) ?? listOptions.sortBy?.column;
1069
+ let found;
1070
+ if (listOptions.with_delimiter) found = await rows(SEARCH_V2, [
1071
+ prefix,
1072
+ bucket,
1073
+ limit + 1,
1074
+ prefix ? prefix.split("/").length : 1,
1075
+ cursor?.startAfter ?? "",
1076
+ sortOrder ?? "asc",
1077
+ sortColumn ?? "name",
1078
+ filled(cursor?.sortColumnAfter) ?? null
1079
+ ]);
1080
+ else {
1081
+ const page = flatPage(bucket, listOptions.prefix, limit + 1, cursor, sortColumn, sortOrder);
1082
+ found = await rows(page.text, page.values);
1083
+ }
1084
+ const entries = listOptions.with_delimiter ? delimited(found, prefix) : found;
1085
+ const hasNext = entries.length > limit;
1086
+ const count = hasNext ? limit : entries.length;
1087
+ const folders = [];
1088
+ const objects = [];
1089
+ for (const entry of entries.slice(0, count)) if (entry["id"] === null || entry["id"] === void 0) folders.push(folderOf(entry));
1090
+ else objects.push(objectOf(entry));
1091
+ const last = entries[count - 1];
1092
+ const after = last && sortColumn && sortColumn !== "name" ? iso(last[sortColumn]) : void 0;
1093
+ const nextCursor = hasNext && last ? encodeCursor({
1094
+ startAfter: String(last["name"]),
1095
+ ...sortOrder ? { sortOrder } : {},
1096
+ ...sortColumn ? { sortColumn } : {},
1097
+ ...typeof after === "string" ? { sortColumnAfter: new Date(after).toISOString() } : {}
1098
+ }) : void 0;
1099
+ return {
1100
+ data: {
1101
+ hasNext,
1102
+ ...nextCursor === void 0 ? {} : { nextCursor },
1103
+ folders,
1104
+ objects
1105
+ },
1106
+ error: null
1107
+ };
1108
+ });
1109
+ return {
1110
+ exists: (path) => settled(async () => ({
1111
+ data: await visible(normalizePath(path)),
1112
+ error: null
1113
+ })).then((reply) => reply.error === null ? reply : {
1114
+ data: false,
1115
+ error: reply.error
1116
+ }),
1117
+ info: (path, infoOptions) => settled(async () => {
1118
+ const versionId = infoOptions?.versionId;
1119
+ const name = normalizePath(path);
1120
+ const [row] = await rows(versionId === void 0 ? OBJECT_INFO : `${OBJECT_INFO} and o.version = $3`, versionId === void 0 ? [bucket, name] : [
1121
+ bucket,
1122
+ name,
1123
+ versionId
1124
+ ]);
1125
+ const object = row?.["object"];
1126
+ return isRecord(object) ? {
1127
+ data: infoOf(object),
1128
+ error: null
1129
+ } : failed(NOT_FOUND);
1130
+ }),
1131
+ download: (path, downloadOptions, parameters) => checked(path, (name) => admin().download(name, downloadOptions, parameters)),
1132
+ createSignedUrl: (path, expiresIn, urlOptions) => checked(path, (name) => admin().createSignedUrl(name, expiresIn, urlOptions)),
1133
+ createSignedUrls: (paths, expiresIn, urlOptions) => settled(async () => {
1134
+ const names = paths.map(normalizePath);
1135
+ const seen = new Set((await rows(VISIBLE_OBJECTS, [bucket, names])).map((row) => String(row["path"])));
1136
+ const shown = [...new Set(names.filter((name) => seen.has(name)))];
1137
+ const signed = /* @__PURE__ */ new Map();
1138
+ if (shown.length > 0) {
1139
+ const reply = await admin().createSignedUrls(shown, expiresIn, urlOptions);
1140
+ if (reply.error) return failed(reply.error);
1141
+ for (const entry of reply.data) if (entry.path !== null) signed.set(entry.path, entry);
1142
+ }
1143
+ return {
1144
+ data: names.map((name) => signed.get(name) ?? {
1145
+ error: HIDDEN_URL,
1146
+ path: name,
1147
+ signedUrl: null
1148
+ }),
1149
+ error: null
1150
+ };
1151
+ }),
1152
+ getPublicUrl: (path, urlOptions) => admin().getPublicUrl(path, urlOptions),
1153
+ list,
1154
+ listV2,
1155
+ upload: refuse,
1156
+ update: refuse,
1157
+ createSignedUploadUrl: refuse,
1158
+ uploadToSignedUrl: refuse,
1159
+ remove: refuse,
1160
+ copy: refuse,
1161
+ move: refuse,
1162
+ purgeCache: refuse
1163
+ };
1164
+ } };
1165
+ }
1166
+ //#endregion
560
1167
  //#region src/server/server.ts
561
- /** The header `current_tenant_id()` reads over the Data API. */
562
- const TENANT_HEADER = "x-bs-tenant";
563
1168
  /** The environment as `getEnv` resolves it, one variable at a time. */
564
1169
  const RUNTIME_ENV = new Proxy({}, { get: (_target, key) => typeof key === "string" ? getEnv(key) : void 0 });
565
1170
  const needsPostgres = (method) => dbError("invalid_request", `${method} needs createServer(betterSupabase, { postgres: createPostgres() })`);
566
- const STATELESS = {
567
- persistSession: false,
568
- autoRefreshToken: false,
569
- detectSessionInUrl: false
570
- };
571
1171
  /**
572
1172
  * A framework adapter's server: `server` plus the adapter's own methods,
573
1173
  * without reading the lazy `env` getter. `extra` can't replace a
@@ -581,13 +1181,6 @@ function extendServer(server, extra) {
581
1181
  shareCore(server, extended);
582
1182
  return extended;
583
1183
  }
584
- /** `{ ...base, ...extra }` that keeps lazy getters lazy. */
585
- function withExtra(base, extra) {
586
- return Object.defineProperties({}, {
587
- ...Object.getOwnPropertyDescriptors(base),
588
- ...Object.getOwnPropertyDescriptors(extra)
589
- });
590
- }
591
1184
  /**
592
1185
  * Server-side entry point for APIs, jobs, MCP servers and framework
593
1186
  * adapters. Holds the secrets; `betterSupabase` stays isomorphic.
@@ -596,134 +1189,20 @@ function createServer(betterSupabase, options = {}) {
596
1189
  const credentials = options.credentials === void 0 ? {} : { credentials: credentialProviderOf(options.credentials) };
597
1190
  let loaded;
598
1191
  const env = () => loaded ??= options.env ?? loadEnv(RUNTIME_ENV);
599
- let adminClient;
600
- let anonClient;
601
- if ((options.prefetchJwks ?? defaultPrefetchJwks()) && options.auth?.jwks === void 0) try {
1192
+ const lite = liteBackend(options, env);
1193
+ if (lite === void 0 && (options.prefetchJwks ?? defaultPrefetchJwks()) && options.auth?.jwks === void 0) try {
602
1194
  prefetchJwks({
603
1195
  ...options.auth,
604
1196
  env: env()
605
1197
  });
606
1198
  } catch {}
607
- const secretKey = () => {
608
- const key = env().secretKey;
609
- if (!key) throw new TypeError("admin() needs SUPABASE_SECRET_KEY; it is not set");
610
- return key;
611
- };
612
- const customFetch = options.fetch ? { fetch: options.fetch } : void 0;
613
- const definitionExecutor = betterSupabase.executorOptions();
614
- const urlLengthLimit = options.db?.urlLengthLimit ?? definitionExecutor.urlLengthLimit;
615
- const db = {
616
- ...options.db?.timeout === void 0 ? {} : { timeout: options.db.timeout },
617
- ...options.db?.retry === void 0 ? {} : { retry: options.db.retry },
618
- ...urlLengthLimit === void 0 ? {} : { urlLengthLimit }
619
- };
620
- const dbOptions = Object.keys(db).length > 0 ? { db } : {};
621
- const sharedGlobal = {
622
- ...customFetch ? { global: customFetch } : {},
623
- ...dbOptions
624
- };
625
- /** postgrest-js options a bare `PostgrestClient` takes; `timeout` is the executor's. */
626
- const restOptions = {
627
- ...db.retry === void 0 ? {} : { retry: db.retry },
628
- ...urlLengthLimit === void 0 ? {} : { urlLengthLimit }
629
- };
630
- const executorOptions = {
631
- ...definitionExecutor,
632
- ...urlLengthLimit === void 0 ? {} : { urlLengthLimit },
633
- ...db.timeout === void 0 ? {} : { timeout: db.timeout },
634
- ...db.retry === void 0 ? {} : { retry: db.retry }
635
- };
636
- /** Set when `db` options need an executor built with them. */
637
- const tunedExecutor = options.db !== void 0;
638
- const serviceClient = () => {
639
- adminClient ??= createClient(env().url, secretKey(), {
640
- auth: STATELESS,
641
- ...sharedGlobal
642
- });
643
- return adminClient;
644
- };
645
- const readUrl = () => options.readUrl === false ? void 0 : options.readUrl?.replace(/\/+$/, "") ?? env().readUrl;
646
- const apiKeyClient = () => {
647
- throw new TypeError("ctx.supabase and ctx.db.$client are not available for an API key: ctx.db and ctx.sql run over direct Postgres with the key's claims");
648
- };
649
- /** Clients for the primary share the service and anon clients; others don't. */
650
- const supabaseAt = (url, auth, headers = {}) => {
651
- const custom = Object.keys(headers).length > 0;
652
- const global = custom ? {
653
- global: {
654
- headers,
655
- ...customFetch
656
- },
657
- ...dbOptions
658
- } : sharedGlobal;
659
- const shared = !custom && url === env().url;
660
- switch (auth.kind) {
661
- case "user": return createClient(url, env().publishableKey, {
662
- accessToken: () => Promise.resolve(auth.token),
663
- ...global
664
- });
665
- case "service": return shared ? serviceClient() : createClient(url, secretKey(), {
666
- auth: STATELESS,
667
- ...global
668
- });
669
- case "anon":
670
- case "invalid":
671
- if (!shared) return createClient(url, env().publishableKey, {
672
- auth: STATELESS,
673
- ...global
674
- });
675
- anonClient ??= createClient(url, env().publishableKey, {
676
- auth: STATELESS,
677
- ...sharedGlobal
678
- });
679
- return anonClient;
680
- case "apiKey": return apiKeyClient();
681
- default: return auth;
682
- }
683
- };
684
- const supabaseFor = (auth, headers = {}) => supabaseAt(env().url, auth, headers);
685
- const restUrls = /* @__PURE__ */ new Map();
686
- const restUrl = (url) => {
687
- let rest = restUrls.get(url);
688
- if (rest === void 0) {
689
- rest = new URL("rest/v1", url.endsWith("/") ? url : `${url}/`).href;
690
- restUrls.set(url, rest);
691
- }
692
- return rest;
693
- };
694
- /**
695
- * The client queries run on. Requests need only PostgREST, so they skip
696
- * building Realtime, Storage and Auth clients per request; the shared
697
- * service and anon clients for the primary are built once anyway.
698
- */
699
- const restAt = (url, auth, headers = {}) => {
700
- let key;
701
- let bearer;
702
- switch (auth.kind) {
703
- case "user":
704
- key = env().publishableKey;
705
- bearer = auth.token;
706
- break;
707
- case "service":
708
- case "anon":
709
- case "invalid":
710
- if (Object.keys(headers).length === 0 && url === env().url) return supabaseAt(url, auth, headers);
711
- key = auth.kind === "service" ? secretKey() : env().publishableKey;
712
- bearer = key;
713
- break;
714
- case "apiKey": return apiKeyClient();
715
- default: return auth;
716
- }
717
- return new PostgrestClient(restUrl(url), {
718
- headers: {
719
- ...headers,
720
- apikey: key,
721
- Authorization: `Bearer ${bearer}`
722
- },
723
- ...customFetch,
724
- ...restOptions
725
- });
726
- };
1199
+ const { executorOptions, tunedExecutor, serviceClient, readUrl, apiKeyClient, supabaseFor, restAt } = createClients({
1200
+ options,
1201
+ env,
1202
+ definitionExecutor: betterSupabase.executorOptions(),
1203
+ lite,
1204
+ createClient
1205
+ });
727
1206
  /** `$client` stays the full Supabase client, built when first read. */
728
1207
  const withLazyClient = (db, client) => Object.defineProperty(db, "$client", {
729
1208
  get: client,
@@ -736,12 +1215,15 @@ function createServer(betterSupabase, options = {}) {
736
1215
  const db = betterSupabase.connect(rest, {
737
1216
  ...authContext(auth),
738
1217
  ...context
739
- }, tunedExecutor ? { executor: postgrestExecutor(rest, executorOptions) } : {});
1218
+ }, auth.kind === "invalid" ? { executor: refusingExecutor(auth.error) } : tunedExecutor ? { executor: postgrestExecutor(rest, executorOptions) } : {});
740
1219
  return withLazyClient(db, () => supabase ??= supabaseFor(auth));
741
1220
  };
742
- const sqlFor = (claims, context, stats, session) => {
1221
+ const sqlFor = (claims, context, stats, session, storage) => {
743
1222
  if (!options.postgres) throw new TypeError("Direct Postgres access needs createServer(betterSupabase, { postgres: createPostgres() })");
744
- return betterSupabase.connect(session ? options.postgres.executorFor(claims, session) : options.postgres.executorFor(claims), context, stats ? { stats } : {});
1223
+ return betterSupabase.connect(session ? options.postgres.executorFor(claims, session) : options.postgres.executorFor(claims), context, {
1224
+ ...stats ? { stats } : {},
1225
+ ...storage ? { storage } : {}
1226
+ });
745
1227
  };
746
1228
  /** `ServerOptions.tenant` outside `context()`, where it can't be awaited. */
747
1229
  const syncTenant = (request, auth) => {
@@ -753,7 +1235,7 @@ function createServer(betterSupabase, options = {}) {
753
1235
  const idPolicy = requestIdPolicy(options.requestIds);
754
1236
  if (options.support && !options.postgres) throw new TypeError("Support sessions need createServer(betterSupabase, { postgres: createPostgres(), support })");
755
1237
  const audit = serverAudit(betterSupabase, options.audit);
756
- const support = options.support ? options.support.create(betterSupabase.events, options.auth?.claims ?? betterSupabase.claimsSchema) : supportOff;
1238
+ const support = options.support ? options.support.create(betterSupabase.events, options.auth?.claims ?? betterSupabase.claimsSchema, betterSupabase.temporal) : supportOff;
757
1239
  /**
758
1240
  * The target's context in a support session. Queries run over direct
759
1241
  * Postgres with the target's claims plus `act`, read-only unless the
@@ -796,17 +1278,32 @@ function createServer(betterSupabase, options = {}) {
796
1278
  };
797
1279
  let db;
798
1280
  let sql;
1281
+ let storage;
1282
+ const targetStorage = () => {
1283
+ const postgres = options.postgres;
1284
+ if (!postgres) throw new TypeError("Support sessions need createServer(betterSupabase, { postgres: createPostgres(), support })");
1285
+ let asTarget;
1286
+ storage ??= supportStorage({
1287
+ admin: { from: (bucket) => serviceClient().storage.from(bucket) },
1288
+ sql: { queryRaw: (text, params) => (asTarget ??= postgres.asUser(sqlClaims, sessionOptions)).queryRaw(text, params) },
1289
+ readOnly: session.readOnly
1290
+ });
1291
+ return storage;
1292
+ };
799
1293
  return {
800
1294
  ...credentials,
801
1295
  ...ids,
802
1296
  auth,
803
1297
  resolution,
804
1298
  support: active,
1299
+ get storage() {
1300
+ return targetStorage();
1301
+ },
805
1302
  get supabase() {
806
1303
  return unavailable();
807
1304
  },
808
1305
  get db() {
809
- db ??= Object.defineProperty(sqlFor(sqlClaims, context, recorder, sessionOptions), "$client", {
1306
+ db ??= Object.defineProperty(sqlFor(sqlClaims, context, recorder, sessionOptions, targetStorage()), "$client", {
810
1307
  get: unavailable,
811
1308
  enumerable: true,
812
1309
  configurable: true
@@ -814,7 +1311,7 @@ function createServer(betterSupabase, options = {}) {
814
1311
  return db;
815
1312
  },
816
1313
  get sql() {
817
- sql ??= sqlFor(sqlClaims, context, recorder, sessionOptions);
1314
+ sql ??= sqlFor(sqlClaims, context, recorder, sessionOptions, targetStorage());
818
1315
  return sql;
819
1316
  },
820
1317
  replica: void 0,
@@ -910,7 +1407,7 @@ function createServer(betterSupabase, options = {}) {
910
1407
  const rest = (sharesClient ? void 0 : supabase) ?? restAt(env().url, auth, headers);
911
1408
  const connected = betterSupabase.connect(rest, context, {
912
1409
  stats: recorder,
913
- ...url && replica ? { executor: routedExecutor(postgrestExecutor(rest, executorOptions), postgrestExecutor(restAt(url, auth, headers), executorOptions), replica) } : tunedExecutor ? { executor: postgrestExecutor(rest, executorOptions) } : {}
1410
+ ...auth.kind === "invalid" ? { executor: refusingExecutor(auth.error) } : url && replica ? { executor: routedExecutor(postgrestExecutor(rest, executorOptions), postgrestExecutor(restAt(url, auth, headers), executorOptions), replica) } : tunedExecutor ? { executor: postgrestExecutor(rest, executorOptions) } : {}
914
1411
  });
915
1412
  db = withLazyClient(connected, client);
916
1413
  return db;
@@ -938,7 +1435,7 @@ function createServer(betterSupabase, options = {}) {
938
1435
  const userMetadata = betterSupabase.userMetadataSchema;
939
1436
  const resolution = await resolveAuth(request, {
940
1437
  logger: betterSupabase.events.logger,
941
- ...options.auth,
1438
+ ...lite ? lite.auth() : options.auth,
942
1439
  ...claims ? { claims } : {},
943
1440
  ...userMetadata ? { userMetadata } : {},
944
1441
  env: env(),
@@ -975,6 +1472,7 @@ function createServer(betterSupabase, options = {}) {
975
1472
  return env();
976
1473
  },
977
1474
  events: betterSupabase.events,
1475
+ authorizer: options.authorizer,
978
1476
  resolve,
979
1477
  supabaseFor,
980
1478
  dbFor,
@@ -1122,6 +1620,14 @@ function createServer(betterSupabase, options = {}) {
1122
1620
  function flushEvents(server, waitUntil) {
1123
1621
  if (waitUntil && server.events.pending) waitUntil(server.events.settled());
1124
1622
  }
1623
+ /** Runs `run`, then hands pending event sink sends to `waitUntil` even when it throws. */
1624
+ async function withFlush(server, waitUntil, run) {
1625
+ try {
1626
+ return await run();
1627
+ } finally {
1628
+ flushEvents(server, waitUntil);
1629
+ }
1630
+ }
1125
1631
  /** The 500 for an error a handler threw; the message only when `expose` is set. */
1126
1632
  function unexpectedResponse(cause, options) {
1127
1633
  return problemResponse(dbError("unexpected", options.expose && cause instanceof Error ? cause.message : "Internal server error"), options);
@@ -1182,4 +1688,4 @@ async function resolveToken(server, token) {
1182
1688
  return auth;
1183
1689
  }
1184
1690
  //#endregion
1185
- export { serverCore as C, suspendAccount as D, lastSignIns as E, deleteAccount as O, withServerContext as S, endSessions as T, withSession as _, unexpectedResponse as a, shouldCheckSession as b, extendServer as c, clearSupportCookie as d, supportCookie as f, withSupport as g, withTenant as h, resolveToken as i, withExtra as l, supportCookieValue as m, flushEvents as n, TENANT_HEADER as o, supportCookieMaxAge as p, handle as r, createServer as s, bearerRequest as t, SUPPORT_COOKIE as u, isPrefetch as v, SERVER_EVENT_SOURCE as w, shouldRefresh as x, refreshFor as y };
1691
+ export { withServerContext as C, lastSignIns as D, endSessions as E, suspendAccount as O, shouldRefresh as S, SERVER_EVENT_SOURCE as T, withSupport as _, unexpectedResponse as a, refreshFor as b, extendServer as c, clearSupportCookie as d, supportCookie as f, withTenant as g, TENANT_HEADER as h, resolveToken as i, deleteAccount as k, supportStorage as l, supportCookieValue as m, flushEvents as n, withFlush as o, supportCookieMaxAge as p, handle as r, createServer as s, bearerRequest as t, SUPPORT_COOKIE as u, withSession as v, serverCore as w, shouldCheckSession as x, isPrefetch as y };