better-supabase 0.7.1 → 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 (499) 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-iKgjHVPx.js → adapter-CN45ibbV.js} +658 -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-DJk0aeBi.js → doctor-VcDtuusV.js} +316 -221
  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-BHuEQrQK.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-DzR2nyQb.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-59gcepIG.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--yqry7uW.d.ts → composite-CWAJTRBF.d.ts} +6 -6
  216. package/dist/{composite-DXVUibdi.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-BmzgK32X.d.ts → framework-148t1m3C.d.ts} +5 -5
  265. package/dist/{framework-a7aRCIqv.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-Bh0EVSwU.d.ts → server-types-CrAmZ8jv.d.ts} +92 -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-ig_K4PvS.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-C6OfRAIn.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/dist/cli/config-B9HkL8nF.js +0 -2
  481. package/dist/cli/gen-CCMc39Dx.js +0 -3100
  482. package/dist/cli/gen-DRmzPI75.js +0 -2
  483. package/dist/cli/prompts-BTYQGunc.js +0 -2
  484. package/dist/cli/run-BqDPh9UH.js +0 -361
  485. package/dist/config-Dn7F5k9A.js +0 -202
  486. package/dist/history-BZih6SFP.js +0 -64
  487. package/dist/index-BkWT_uBO.d.ts +0 -51
  488. package/dist/index-Bxih3l0u.d.ts +0 -81
  489. package/dist/index-CaxrMD1A.d.ts +0 -1
  490. package/dist/index-DQh4VCc9.d.ts +0 -98
  491. package/dist/keys-4MnkWTTh.js +0 -35
  492. package/dist/messages-DYP0sUTe.d.ts +0 -59
  493. package/dist/modules-dxrVK3ID.js +0 -228
  494. package/dist/path-Cv__-OTj.d.ts +0 -17
  495. package/dist/resource-BsvzCMlX.js +0 -212
  496. package/dist/resource-IPS5xi9q.d.ts +0 -74
  497. package/dist/template-CwO38Do8.d.ts +0 -6
  498. package/dist/verify-DL41hbvY.js +0 -232
  499. 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";
@@ -251,7 +253,7 @@ function serverAudit(betterSupabase, sink) {
251
253
  specversion: "1.0",
252
254
  id: crypto.randomUUID(),
253
255
  source: SERVER_EVENT_SOURCE,
254
- type: `dev.better-supabase.${type}`,
256
+ type: `${DEFAULT_TYPE_PREFIX}.${type}`,
255
257
  subject: `users/${userId}`,
256
258
  time: (/* @__PURE__ */ new Date()).toISOString(),
257
259
  datacontenttype: "application/json",
@@ -268,6 +270,149 @@ function serverAudit(betterSupabase, sink) {
268
270
  } };
269
271
  }
270
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
271
416
  //#region src/server/entries/core.ts
272
417
  const cores = /* @__PURE__ */ new WeakMap();
273
418
  /** Records the core behind `server`, so `serverCore` finds it on copies too. */
@@ -456,6 +601,58 @@ function withTenant(core) {
456
601
  })();
457
602
  }
458
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
459
656
  //#region src/server/request-ids.ts
460
657
  const REQUEST_ID_PATTERN = /^[A-Za-z0-9._:;,@/+=-]{1,128}$/;
461
658
  function requestIdOrUndefined(value) {
@@ -507,6 +704,10 @@ function requestIdPolicy(options = {}) {
507
704
  };
508
705
  }
509
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
510
711
  //#region src/auth/support-cookie.ts
511
712
  /** The cookie that carries the support session id. */
512
713
  const SUPPORT_COOKIE = "bs-support";
@@ -558,21 +759,415 @@ const supportOff = {
558
759
  revoke: notConfigured,
559
760
  current: () => Promise.resolve(void 0),
560
761
  list: notConfigured,
762
+ expire: notConfigured,
763
+ expireRoute: () => () => Promise.resolve(problemResponse(dbError("unexpected", NOT_CONFIGURED))),
561
764
  sessionIdOf: () => void 0,
562
765
  clearCookie: () => clearSupportCookie()
563
766
  };
564
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
565
1167
  //#region src/server/server.ts
566
- /** The header `current_tenant_id()` reads over the Data API. */
567
- const TENANT_HEADER = "x-bs-tenant";
568
1168
  /** The environment as `getEnv` resolves it, one variable at a time. */
569
1169
  const RUNTIME_ENV = new Proxy({}, { get: (_target, key) => typeof key === "string" ? getEnv(key) : void 0 });
570
1170
  const needsPostgres = (method) => dbError("invalid_request", `${method} needs createServer(betterSupabase, { postgres: createPostgres() })`);
571
- const STATELESS = {
572
- persistSession: false,
573
- autoRefreshToken: false,
574
- detectSessionInUrl: false
575
- };
576
1171
  /**
577
1172
  * A framework adapter's server: `server` plus the adapter's own methods,
578
1173
  * without reading the lazy `env` getter. `extra` can't replace a
@@ -586,13 +1181,6 @@ function extendServer(server, extra) {
586
1181
  shareCore(server, extended);
587
1182
  return extended;
588
1183
  }
589
- /** `{ ...base, ...extra }` that keeps lazy getters lazy. */
590
- function withExtra(base, extra) {
591
- return Object.defineProperties({}, {
592
- ...Object.getOwnPropertyDescriptors(base),
593
- ...Object.getOwnPropertyDescriptors(extra)
594
- });
595
- }
596
1184
  /**
597
1185
  * Server-side entry point for APIs, jobs, MCP servers and framework
598
1186
  * adapters. Holds the secrets; `betterSupabase` stays isomorphic.
@@ -601,134 +1189,20 @@ function createServer(betterSupabase, options = {}) {
601
1189
  const credentials = options.credentials === void 0 ? {} : { credentials: credentialProviderOf(options.credentials) };
602
1190
  let loaded;
603
1191
  const env = () => loaded ??= options.env ?? loadEnv(RUNTIME_ENV);
604
- let adminClient;
605
- let anonClient;
606
- 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 {
607
1194
  prefetchJwks({
608
1195
  ...options.auth,
609
1196
  env: env()
610
1197
  });
611
1198
  } catch {}
612
- const secretKey = () => {
613
- const key = env().secretKey;
614
- if (!key) throw new TypeError("admin() needs SUPABASE_SECRET_KEY; it is not set");
615
- return key;
616
- };
617
- const customFetch = options.fetch ? { fetch: options.fetch } : void 0;
618
- const definitionExecutor = betterSupabase.executorOptions();
619
- const urlLengthLimit = options.db?.urlLengthLimit ?? definitionExecutor.urlLengthLimit;
620
- const db = {
621
- ...options.db?.timeout === void 0 ? {} : { timeout: options.db.timeout },
622
- ...options.db?.retry === void 0 ? {} : { retry: options.db.retry },
623
- ...urlLengthLimit === void 0 ? {} : { urlLengthLimit }
624
- };
625
- const dbOptions = Object.keys(db).length > 0 ? { db } : {};
626
- const sharedGlobal = {
627
- ...customFetch ? { global: customFetch } : {},
628
- ...dbOptions
629
- };
630
- /** postgrest-js options a bare `PostgrestClient` takes; `timeout` is the executor's. */
631
- const restOptions = {
632
- ...db.retry === void 0 ? {} : { retry: db.retry },
633
- ...urlLengthLimit === void 0 ? {} : { urlLengthLimit }
634
- };
635
- const executorOptions = {
636
- ...definitionExecutor,
637
- ...urlLengthLimit === void 0 ? {} : { urlLengthLimit },
638
- ...db.timeout === void 0 ? {} : { timeout: db.timeout },
639
- ...db.retry === void 0 ? {} : { retry: db.retry }
640
- };
641
- /** Set when `db` options need an executor built with them. */
642
- const tunedExecutor = options.db !== void 0;
643
- const serviceClient = () => {
644
- adminClient ??= createClient(env().url, secretKey(), {
645
- auth: STATELESS,
646
- ...sharedGlobal
647
- });
648
- return adminClient;
649
- };
650
- const readUrl = () => options.readUrl === false ? void 0 : options.readUrl?.replace(/\/+$/, "") ?? env().readUrl;
651
- const apiKeyClient = () => {
652
- 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");
653
- };
654
- /** Clients for the primary share the service and anon clients; others don't. */
655
- const supabaseAt = (url, auth, headers = {}) => {
656
- const custom = Object.keys(headers).length > 0;
657
- const global = custom ? {
658
- global: {
659
- headers,
660
- ...customFetch
661
- },
662
- ...dbOptions
663
- } : sharedGlobal;
664
- const shared = !custom && url === env().url;
665
- switch (auth.kind) {
666
- case "user": return createClient(url, env().publishableKey, {
667
- accessToken: () => Promise.resolve(auth.token),
668
- ...global
669
- });
670
- case "service": return shared ? serviceClient() : createClient(url, secretKey(), {
671
- auth: STATELESS,
672
- ...global
673
- });
674
- case "anon":
675
- case "invalid":
676
- if (!shared) return createClient(url, env().publishableKey, {
677
- auth: STATELESS,
678
- ...global
679
- });
680
- anonClient ??= createClient(url, env().publishableKey, {
681
- auth: STATELESS,
682
- ...sharedGlobal
683
- });
684
- return anonClient;
685
- case "apiKey": return apiKeyClient();
686
- default: return auth;
687
- }
688
- };
689
- const supabaseFor = (auth, headers = {}) => supabaseAt(env().url, auth, headers);
690
- const restUrls = /* @__PURE__ */ new Map();
691
- const restUrl = (url) => {
692
- let rest = restUrls.get(url);
693
- if (rest === void 0) {
694
- rest = new URL("rest/v1", url.endsWith("/") ? url : `${url}/`).href;
695
- restUrls.set(url, rest);
696
- }
697
- return rest;
698
- };
699
- /**
700
- * The client queries run on. Requests need only PostgREST, so they skip
701
- * building Realtime, Storage and Auth clients per request; the shared
702
- * service and anon clients for the primary are built once anyway.
703
- */
704
- const restAt = (url, auth, headers = {}) => {
705
- let key;
706
- let bearer;
707
- switch (auth.kind) {
708
- case "user":
709
- key = env().publishableKey;
710
- bearer = auth.token;
711
- break;
712
- case "service":
713
- case "anon":
714
- case "invalid":
715
- if (Object.keys(headers).length === 0 && url === env().url) return supabaseAt(url, auth, headers);
716
- key = auth.kind === "service" ? secretKey() : env().publishableKey;
717
- bearer = key;
718
- break;
719
- case "apiKey": return apiKeyClient();
720
- default: return auth;
721
- }
722
- return new PostgrestClient(restUrl(url), {
723
- headers: {
724
- ...headers,
725
- apikey: key,
726
- Authorization: `Bearer ${bearer}`
727
- },
728
- ...customFetch,
729
- ...restOptions
730
- });
731
- };
1199
+ const { executorOptions, tunedExecutor, serviceClient, readUrl, apiKeyClient, supabaseFor, restAt } = createClients({
1200
+ options,
1201
+ env,
1202
+ definitionExecutor: betterSupabase.executorOptions(),
1203
+ lite,
1204
+ createClient
1205
+ });
732
1206
  /** `$client` stays the full Supabase client, built when first read. */
733
1207
  const withLazyClient = (db, client) => Object.defineProperty(db, "$client", {
734
1208
  get: client,
@@ -741,12 +1215,15 @@ function createServer(betterSupabase, options = {}) {
741
1215
  const db = betterSupabase.connect(rest, {
742
1216
  ...authContext(auth),
743
1217
  ...context
744
- }, tunedExecutor ? { executor: postgrestExecutor(rest, executorOptions) } : {});
1218
+ }, auth.kind === "invalid" ? { executor: refusingExecutor(auth.error) } : tunedExecutor ? { executor: postgrestExecutor(rest, executorOptions) } : {});
745
1219
  return withLazyClient(db, () => supabase ??= supabaseFor(auth));
746
1220
  };
747
- const sqlFor = (claims, context, stats, session) => {
1221
+ const sqlFor = (claims, context, stats, session, storage) => {
748
1222
  if (!options.postgres) throw new TypeError("Direct Postgres access needs createServer(betterSupabase, { postgres: createPostgres() })");
749
- 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
+ });
750
1227
  };
751
1228
  /** `ServerOptions.tenant` outside `context()`, where it can't be awaited. */
752
1229
  const syncTenant = (request, auth) => {
@@ -758,7 +1235,7 @@ function createServer(betterSupabase, options = {}) {
758
1235
  const idPolicy = requestIdPolicy(options.requestIds);
759
1236
  if (options.support && !options.postgres) throw new TypeError("Support sessions need createServer(betterSupabase, { postgres: createPostgres(), support })");
760
1237
  const audit = serverAudit(betterSupabase, options.audit);
761
- 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;
762
1239
  /**
763
1240
  * The target's context in a support session. Queries run over direct
764
1241
  * Postgres with the target's claims plus `act`, read-only unless the
@@ -801,17 +1278,32 @@ function createServer(betterSupabase, options = {}) {
801
1278
  };
802
1279
  let db;
803
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
+ };
804
1293
  return {
805
1294
  ...credentials,
806
1295
  ...ids,
807
1296
  auth,
808
1297
  resolution,
809
1298
  support: active,
1299
+ get storage() {
1300
+ return targetStorage();
1301
+ },
810
1302
  get supabase() {
811
1303
  return unavailable();
812
1304
  },
813
1305
  get db() {
814
- db ??= Object.defineProperty(sqlFor(sqlClaims, context, recorder, sessionOptions), "$client", {
1306
+ db ??= Object.defineProperty(sqlFor(sqlClaims, context, recorder, sessionOptions, targetStorage()), "$client", {
815
1307
  get: unavailable,
816
1308
  enumerable: true,
817
1309
  configurable: true
@@ -819,7 +1311,7 @@ function createServer(betterSupabase, options = {}) {
819
1311
  return db;
820
1312
  },
821
1313
  get sql() {
822
- sql ??= sqlFor(sqlClaims, context, recorder, sessionOptions);
1314
+ sql ??= sqlFor(sqlClaims, context, recorder, sessionOptions, targetStorage());
823
1315
  return sql;
824
1316
  },
825
1317
  replica: void 0,
@@ -915,7 +1407,7 @@ function createServer(betterSupabase, options = {}) {
915
1407
  const rest = (sharesClient ? void 0 : supabase) ?? restAt(env().url, auth, headers);
916
1408
  const connected = betterSupabase.connect(rest, context, {
917
1409
  stats: recorder,
918
- ...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) } : {}
919
1411
  });
920
1412
  db = withLazyClient(connected, client);
921
1413
  return db;
@@ -943,7 +1435,7 @@ function createServer(betterSupabase, options = {}) {
943
1435
  const userMetadata = betterSupabase.userMetadataSchema;
944
1436
  const resolution = await resolveAuth(request, {
945
1437
  logger: betterSupabase.events.logger,
946
- ...options.auth,
1438
+ ...lite ? lite.auth() : options.auth,
947
1439
  ...claims ? { claims } : {},
948
1440
  ...userMetadata ? { userMetadata } : {},
949
1441
  env: env(),
@@ -980,6 +1472,7 @@ function createServer(betterSupabase, options = {}) {
980
1472
  return env();
981
1473
  },
982
1474
  events: betterSupabase.events,
1475
+ authorizer: options.authorizer,
983
1476
  resolve,
984
1477
  supabaseFor,
985
1478
  dbFor,
@@ -1127,6 +1620,14 @@ function createServer(betterSupabase, options = {}) {
1127
1620
  function flushEvents(server, waitUntil) {
1128
1621
  if (waitUntil && server.events.pending) waitUntil(server.events.settled());
1129
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
+ }
1130
1631
  /** The 500 for an error a handler threw; the message only when `expose` is set. */
1131
1632
  function unexpectedResponse(cause, options) {
1132
1633
  return problemResponse(dbError("unexpected", options.expose && cause instanceof Error ? cause.message : "Internal server error"), options);
@@ -1187,4 +1688,4 @@ async function resolveToken(server, token) {
1187
1688
  return auth;
1188
1689
  }
1189
1690
  //#endregion
1190
- 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 };