better-supabase 0.5.1 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (536) hide show
  1. package/README.md +187 -46
  2. package/dist/access-sql-B0dF-SoF.js +181 -0
  3. package/dist/{actor-DaJjqD5R.d.ts → actor-CQTlc1Hh.d.ts} +1 -1
  4. package/dist/adapter-Bc1o3zyy.js +1106 -0
  5. package/dist/agents-CVHGd7It.d.ts +94 -0
  6. package/dist/ai-cache-CBWs1W0k.js +80 -0
  7. package/dist/ai-cache-DaDu_G5L.d.ts +64 -0
  8. package/dist/ai-chat-7amvXjmQ.d.ts +590 -0
  9. package/dist/ai-chat-B24UI962.js +743 -0
  10. package/dist/ai-files-CSPNswUY.js +319 -0
  11. package/dist/ai-sdk/agents/index.d.ts +74 -0
  12. package/dist/ai-sdk/agents/index.js +159 -0
  13. package/dist/ai-sdk/batches/index.d.ts +74 -0
  14. package/dist/ai-sdk/batches/index.js +180 -0
  15. package/dist/ai-sdk/cache/index.d.ts +38 -0
  16. package/dist/ai-sdk/cache/index.js +127 -0
  17. package/dist/ai-sdk/chat/index.d.ts +2 -0
  18. package/dist/ai-sdk/chat/index.js +246 -0
  19. package/dist/ai-sdk/embeddings/index.d.ts +3 -0
  20. package/dist/ai-sdk/embeddings/index.js +2 -0
  21. package/dist/ai-sdk/files/index.d.ts +61 -0
  22. package/dist/ai-sdk/files/index.js +111 -0
  23. package/dist/ai-sdk/index.d.ts +145 -0
  24. package/dist/ai-sdk/index.js +174 -0
  25. package/dist/ai-sdk/mcp/index.d.ts +102 -0
  26. package/dist/ai-sdk/mcp/index.js +362 -0
  27. package/dist/ai-sdk/memory/index.d.ts +67 -0
  28. package/dist/ai-sdk/memory/index.js +175 -0
  29. package/dist/ai-sdk/react/index.d.ts +2 -0
  30. package/dist/ai-sdk/react/index.js +3 -0
  31. package/dist/ai-sdk/react/server.d.ts +6 -0
  32. package/dist/ai-sdk/react/server.js +7 -0
  33. package/dist/ai-sdk/workflow/index.d.ts +249 -0
  34. package/dist/ai-sdk/workflow/index.js +575 -0
  35. package/dist/ai-sdk/workflow/react/index.d.ts +20 -0
  36. package/dist/ai-sdk/workflow/react/index.js +66 -0
  37. package/dist/ai-sdk/workflow/react/server.d.ts +10 -0
  38. package/dist/ai-sdk/workflow/react/server.js +12 -0
  39. package/dist/ai-tasks-Cd1HMFvB.d.ts +131 -0
  40. package/dist/announcements-CiyOs-xP.js +107 -0
  41. package/dist/announcements-ZRGnScWI.d.ts +72 -0
  42. package/dist/api-keys-rCGtKaZA.d.ts +156 -0
  43. package/dist/assistant-DwdpDH1q.d.ts +147 -0
  44. package/dist/astro/index.d.ts +86 -0
  45. package/dist/astro/index.js +93 -0
  46. package/dist/attributes-5dYul0u0.js +13 -0
  47. package/dist/auth-link-BjFPqwLz.d.ts +97 -0
  48. package/dist/auth-link-DrDX9KOT.js +114 -0
  49. package/dist/authorization-BFCqamMs.d.ts +172 -0
  50. package/dist/before-route-CnR0C0Jr.js +30 -0
  51. package/dist/bind-Bu_ZNa3W.d.ts +62 -0
  52. package/dist/bind-l4kAvYSv.js +97 -0
  53. package/dist/block-events-CrT8r7Fe.js +76 -0
  54. package/dist/block-fields-GFkxl4dP.js +49 -0
  55. package/dist/block-fields-SJ6fEf3o.d.ts +31 -0
  56. package/dist/block-helpers-CKtbFcRv.d.ts +37 -0
  57. package/dist/block-helpers-DWHxHsEQ.js +190 -0
  58. package/dist/block-hooks-BmjMyXTa.js +114 -0
  59. package/dist/block-hooks-plbZ0AbJ.d.ts +107 -0
  60. package/dist/{kit-transport-DJlHQUBU.js → block-transport-BLr-ZgLc.js} +11 -7
  61. package/dist/block-transport-DvaoPuZ9.d.ts +48 -0
  62. package/dist/blocks/agents/index.d.ts +3 -0
  63. package/dist/blocks/agents/index.js +123 -0
  64. package/dist/blocks/ai-cache/index.d.ts +3 -0
  65. package/dist/blocks/ai-cache/index.js +3 -0
  66. package/dist/blocks/ai-chat/index.d.ts +31 -0
  67. package/dist/blocks/ai-chat/index.js +5 -0
  68. package/dist/blocks/ai-chat/react/index.d.ts +77 -0
  69. package/dist/blocks/ai-chat/react/index.js +387 -0
  70. package/dist/blocks/ai-chat/react/server.d.ts +16 -0
  71. package/dist/blocks/ai-chat/react/server.js +14 -0
  72. package/dist/blocks/ai-files/index.d.ts +14 -0
  73. package/dist/blocks/ai-files/index.js +3 -0
  74. package/dist/blocks/ai-providers/index.d.ts +7 -0
  75. package/dist/blocks/ai-providers/index.js +211 -0
  76. package/dist/blocks/ai-tasks/index.d.ts +3 -0
  77. package/dist/blocks/ai-tasks/index.js +203 -0
  78. package/dist/blocks/announcements/index.d.ts +3 -0
  79. package/dist/blocks/announcements/index.js +3 -0
  80. package/dist/blocks/announcements/react/index.d.ts +31 -0
  81. package/dist/blocks/announcements/react/index.js +86 -0
  82. package/dist/blocks/announcements/react/server.d.ts +6 -0
  83. package/dist/blocks/announcements/react/server.js +7 -0
  84. package/dist/blocks/api-keys/index.d.ts +35 -0
  85. package/dist/blocks/api-keys/index.js +334 -0
  86. package/dist/blocks/attachments/index.d.ts +210 -0
  87. package/dist/blocks/attachments/index.js +222 -0
  88. package/dist/blocks/audit/index.d.ts +366 -0
  89. package/dist/blocks/audit/index.js +714 -0
  90. package/dist/blocks/billing/index.d.ts +265 -0
  91. package/dist/blocks/billing/index.js +400 -0
  92. package/dist/blocks/comments/index.d.ts +200 -0
  93. package/dist/blocks/comments/index.js +207 -0
  94. package/dist/blocks/connectors/index.d.ts +3 -0
  95. package/dist/blocks/connectors/index.js +164 -0
  96. package/dist/blocks/data-lifecycle/index.d.ts +251 -0
  97. package/dist/blocks/data-lifecycle/index.js +353 -0
  98. package/dist/blocks/entitlements/index.d.ts +14 -0
  99. package/dist/blocks/entitlements/index.js +25 -0
  100. package/dist/blocks/flags/index.d.ts +226 -0
  101. package/dist/blocks/flags/index.js +282 -0
  102. package/dist/blocks/inbox/index.d.ts +6 -0
  103. package/dist/blocks/inbox/index.js +499 -0
  104. package/dist/blocks/inbox/react/index.d.ts +2 -0
  105. package/dist/blocks/inbox/react/index.js +225 -0
  106. package/dist/blocks/inbox/react/server.d.ts +10 -0
  107. package/dist/blocks/inbox/react/server.js +12 -0
  108. package/dist/blocks/index.d.ts +65 -0
  109. package/dist/blocks/index.js +77 -0
  110. package/dist/blocks/jobs/index.d.ts +297 -0
  111. package/dist/blocks/jobs/index.js +1051 -0
  112. package/dist/blocks/knowledge/index.d.ts +3 -0
  113. package/dist/blocks/knowledge/index.js +3 -0
  114. package/dist/blocks/memory/index.d.ts +8 -0
  115. package/dist/blocks/memory/index.js +289 -0
  116. package/dist/blocks/notifications/index.d.ts +297 -0
  117. package/dist/blocks/notifications/index.js +425 -0
  118. package/dist/blocks/notifications/react/index.d.ts +44 -0
  119. package/dist/blocks/notifications/react/index.js +67 -0
  120. package/dist/blocks/notifications/react/server.d.ts +6 -0
  121. package/dist/blocks/notifications/react/server.js +7 -0
  122. package/dist/blocks/onboarding/index.d.ts +3 -0
  123. package/dist/blocks/onboarding/index.js +64 -0
  124. package/dist/blocks/onboarding/react/index.d.ts +28 -0
  125. package/dist/blocks/onboarding/react/index.js +78 -0
  126. package/dist/blocks/onboarding/react/server.d.ts +7 -0
  127. package/dist/blocks/onboarding/react/server.js +7 -0
  128. package/dist/blocks/organizations/index.d.ts +241 -0
  129. package/dist/blocks/organizations/index.js +400 -0
  130. package/dist/blocks/outbox/index.d.ts +3 -0
  131. package/dist/blocks/outbox/index.js +266 -0
  132. package/dist/blocks/profiles/index.d.ts +40 -0
  133. package/dist/blocks/profiles/index.js +28 -0
  134. package/dist/blocks/push/index.d.ts +185 -0
  135. package/dist/blocks/push/index.js +258 -0
  136. package/dist/blocks/settings/index.d.ts +89 -0
  137. package/dist/blocks/settings/index.js +104 -0
  138. package/dist/blocks/sso/index.d.ts +198 -0
  139. package/dist/blocks/sso/index.js +1297 -0
  140. package/dist/blocks/usage/index.d.ts +4 -0
  141. package/dist/blocks/usage/index.js +233 -0
  142. package/dist/blocks/waitlist/index.d.ts +117 -0
  143. package/dist/blocks/waitlist/index.js +132 -0
  144. package/dist/blocks/webhooks/index.d.ts +304 -0
  145. package/dist/{webhooks → blocks/webhooks}/index.js +468 -148
  146. package/dist/blocks/workflow-builder/index.d.ts +21 -0
  147. package/dist/blocks/workflow-builder/index.js +5 -0
  148. package/dist/blocks/workflow-builder/react/index.d.ts +47 -0
  149. package/dist/blocks/workflow-builder/react/index.js +119 -0
  150. package/dist/blocks/workflow-builder/react/server.d.ts +8 -0
  151. package/dist/blocks/workflow-builder/react/server.js +11 -0
  152. package/dist/blocks/workflows/index.d.ts +3 -0
  153. package/dist/blocks/workflows/index.js +3 -0
  154. package/dist/blocks/workflows/react/index.d.ts +47 -0
  155. package/dist/blocks/workflows/react/index.js +137 -0
  156. package/dist/blocks/workflows/react/server.d.ts +8 -0
  157. package/dist/blocks/workflows/react/server.js +11 -0
  158. package/dist/{index-SaTsEfGP.d.ts → bucket-Cl46E3jS.d.ts} +134 -91
  159. package/dist/{simplify-_0oUKqCd.js → build-BXIzE6Xv.js} +222 -124
  160. package/dist/{channel-FQW-CnGR.d.ts → channel-_2Mx1Oyu.d.ts} +2 -2
  161. package/dist/channels-CkgQ_X60.js +114 -0
  162. package/dist/chat-sdk/index.d.ts +303 -0
  163. package/dist/chat-sdk/index.js +733 -0
  164. package/dist/chat-sdk/react/index.d.ts +2 -0
  165. package/dist/chat-sdk/react/index.js +3 -0
  166. package/dist/chat-sdk/react/server.d.ts +3 -0
  167. package/dist/chat-sdk/react/server.js +2 -0
  168. package/dist/claims-DDBQT6BK.js +61 -0
  169. package/dist/{claims-BAf6c7is.js → claims-PqzCxaTD.js} +39 -2
  170. package/dist/cli/bin.js +1 -1
  171. package/dist/cli/{codemod-DqV7612m.js → codemod-Bl_tQpHn.js} +105 -2
  172. package/dist/cli/config-B9HkL8nF.js +2 -0
  173. package/dist/cli/config-DU7EJImt.js +49 -0
  174. package/dist/cli/config-NiPxAmUF.js +1077 -0
  175. package/dist/cli/{dist-xn4wlboc.js → dist-DRAVaE6w.js} +111 -1
  176. package/dist/cli/{doctor-C_A-KEAz.js → doctor-B4JOm_ox.js} +991 -317
  177. package/dist/cli/{env-DmKv_G4A.js → env-CJLbUVPB.js} +1 -1
  178. package/dist/cli/{env-jIFUADLY.js → env-qXgyMV6r.js} +2 -2
  179. package/dist/cli/fresh-import-BeYf9I3x.js +40 -0
  180. package/dist/cli/gen-BGLb_zou.js +3100 -0
  181. package/dist/cli/gen-DAH8FM2W.js +2 -0
  182. package/dist/cli/index.d.ts +44 -5
  183. package/dist/cli/index.js +7 -7
  184. package/dist/cli/{init-DMa6M7hV.js → init-BIIwclPg.js} +242 -27
  185. package/dist/cli/{introspect-BKlaIu_M.js → introspect-DNUTuNvb.js} +5 -5
  186. package/dist/cli/{io-k41_z-jT.js → io-DI1mTdSA.js} +12 -3
  187. package/dist/cli/{keys-ByKHnvP9.js → keys-BGCnnb-s.js} +8 -6
  188. package/dist/cli/{ohash-D7bG_EOb.js → ohash-BjQY1cBb.js} +1 -1
  189. package/dist/cli/{openapi-Cp5Fyta-.js → openapi-BlRJ18s3.js} +2 -2
  190. package/dist/cli/{project-B_GeXyHh.js → project-DZRaBaY7.js} +11 -6
  191. package/dist/cli/read-sets-CETOSFx4.js +223 -0
  192. package/dist/cli/{run-Bo_NLT5n.js → run-DNWxHynX.js} +33 -23
  193. package/dist/cli/{seed-CUlqWh-8.js → seed-DQzqT7LP.js} +8 -6
  194. package/dist/cli/{skills-LJJIhLFR.js → skills-QQs4q68J.js} +3 -2
  195. package/dist/cli/sql-D0GUtUPp.js +536 -0
  196. package/dist/cli/{config-CPVpXP5I.js → supabase-toml-B-bIukQF.js} +72 -942
  197. package/dist/cli/typegen-version-DeFbtzYI.js +8 -0
  198. package/dist/cli/{version-BCtlgDQx.js → version-hr88OZG0.js} +1 -1
  199. package/dist/client/index.d.ts +3 -2
  200. package/dist/client/index.js +11 -71
  201. package/dist/client/native/index.d.ts +228 -0
  202. package/dist/client/native/index.js +361 -0
  203. package/dist/client-CI0Z2zWX.js +277 -0
  204. package/dist/cloud-event-BnmD5fb9.js +46 -0
  205. package/dist/cloud-event-C1JCc1bH.d.ts +50 -0
  206. package/dist/{compiler-BXH_aZ7N.d.ts → compiler-DY_wkj4R.d.ts} +2 -2
  207. package/dist/compose-BIBNgAnq.js +53 -0
  208. package/dist/composite-Bt1YK3Ke.d.ts +146 -0
  209. package/dist/composite-DhE66P5u.js +130 -0
  210. package/dist/config/index.d.ts +6 -4
  211. package/dist/config/index.js +5 -5
  212. package/dist/{config-Bv7gvfzC.d.ts → config-D44Y7PAv.d.ts} +406 -214
  213. package/dist/{config-DreERlKo.js → config-Dn7F5k9A.js} +62 -14
  214. package/dist/connector-Dv8kK0MO.d.ts +107 -0
  215. package/dist/connectors-hkLCwyEz.d.ts +120 -0
  216. package/dist/context-BCrWe7ow.d.ts +237 -0
  217. package/dist/credentials/index.d.ts +31 -0
  218. package/dist/credentials/index.js +168 -0
  219. package/dist/cron-DVPUg5k3.js +145 -0
  220. package/dist/csv-CPAzEmB6.js +25 -0
  221. package/dist/db-exception-CnWcYPxL.js +15 -0
  222. package/dist/{define-cNKzqwL_.js → define-B-TVjC25.js} +784 -227
  223. package/dist/{define-Bp_BZa5h.d.ts → define-CJJkkr1-.d.ts} +353 -61
  224. package/dist/edge/index.d.ts +69 -11
  225. package/dist/edge/index.js +191 -75
  226. package/dist/elysia/index.d.ts +59 -0
  227. package/dist/elysia/index.js +62 -0
  228. package/dist/embeddings-4ZvFzjsU.js +127 -0
  229. package/dist/embeddings-C9KGQnXt.d.ts +68 -0
  230. package/dist/{refresh-CFPX0Qft.d.ts → ended-jLfvw8h-.d.ts} +20 -2
  231. package/dist/{entitlements-BiJZ4t49.d.ts → entitlements-DHrY2UDZ.d.ts} +16 -7
  232. package/dist/entitlements-DRl6ZJUm.js +24 -0
  233. package/dist/envelope-DqnYGRw7.js +47 -0
  234. package/dist/{errors-DtwXa6b8.js → errors-B11Duf73.js} +82 -13
  235. package/dist/errors-DLjJHPLK.js +44 -0
  236. package/dist/escape-like-DHfx6jRr.js +7 -0
  237. package/dist/escape-like-ImTK0ps_.d.ts +15 -0
  238. package/dist/eve/index.d.ts +220 -0
  239. package/dist/eve/index.js +504 -0
  240. package/dist/eve-gT2Fpjut.d.ts +151 -0
  241. package/dist/events/index.d.ts +4 -3
  242. package/dist/events/index.js +9 -50
  243. package/dist/events-DWDhx77e.d.ts +549 -0
  244. package/dist/executor-Bq28caBo.js +718 -0
  245. package/dist/executor-C-R4pucm.js +83 -0
  246. package/dist/executor-CaWigTyR.d.ts +148 -0
  247. package/dist/executor-D14tGopJ.d.ts +36 -0
  248. package/dist/{executor-Cghdstwu.d.ts → executor-DbvExCFC.d.ts} +7 -1
  249. package/dist/{sql-Coh6n4cC.js → executor-De1Of3m3.js} +210 -11
  250. package/dist/executor-DvsBbNBS.d.ts +261 -0
  251. package/dist/expo/index.d.ts +79 -0
  252. package/dist/expo/index.js +129 -0
  253. package/dist/expo-sqlite/index.d.ts +58 -0
  254. package/dist/expo-sqlite/index.js +104 -0
  255. package/dist/field-errors-BFOa7WhB.d.ts +99 -0
  256. package/dist/field-errors-VF1yb8yI.js +13 -0
  257. package/dist/framework-CONDyPYx.js +51 -0
  258. package/dist/framework-DuVb4Xa8.d.ts +25 -0
  259. package/dist/gateway-C1ssRHnf.d.ts +130 -0
  260. package/dist/graph-BGyLLFLX.js +265 -0
  261. package/dist/h3/index.d.ts +59 -0
  262. package/dist/h3/index.js +55 -0
  263. package/dist/h3/v1/index.d.ts +63 -0
  264. package/dist/h3/v1/index.js +49 -0
  265. package/dist/history-BZih6SFP.js +64 -0
  266. package/dist/hono/index.d.ts +56 -7
  267. package/dist/hono/index.js +97 -45
  268. package/dist/{react-C_s7kiNz.js → hooks-1BTCJsiw.js} +104 -133
  269. package/dist/http-Cv4T29xh.js +40 -0
  270. package/dist/http-DdYadv-o.js +126 -0
  271. package/dist/image-url-pIVlO6R1.js +41 -0
  272. package/dist/{impersonation-BgSHAYLf.js → impersonation-DcqaTBHx.js} +21 -6
  273. package/dist/inbox-i7E1ppo6.d.ts +384 -0
  274. package/dist/index-ACiNPN4Z.d.ts +74 -0
  275. package/dist/{index-DgILJRXj.d.ts → index-Bepi-Hgg.d.ts} +91 -28
  276. package/dist/index-BkWT_uBO.d.ts +51 -0
  277. package/dist/index-BpFYMsi0.d.ts +53 -0
  278. package/dist/{index-C7f8cOBM.d.ts → index-Bxih3l0u.d.ts} +2 -2
  279. package/dist/index-CaxrMD1A.d.ts +1 -0
  280. package/dist/index-ClmjK_o-.d.ts +55 -0
  281. package/dist/index-CtuakVRc.d.ts +267 -0
  282. package/dist/index-D48jVS-N.d.ts +246 -0
  283. package/dist/index-DDrYaUcq.d.ts +138 -0
  284. package/dist/index-DQh4VCc9.d.ts +98 -0
  285. package/dist/{live-D9W2M5aO.d.ts → index-DunNRdnT.d.ts} +136 -38
  286. package/dist/index.d.ts +65 -18
  287. package/dist/index.js +42 -14
  288. package/dist/invalidate-BBqhpxyB.d.ts +19 -0
  289. package/dist/json-CEnpTHlZ.js +16 -0
  290. package/dist/json-schema-CvER4kgT.js +502 -0
  291. package/dist/keys-4MnkWTTh.js +35 -0
  292. package/dist/kit-B5tid-q5.d.ts +60 -0
  293. package/dist/kit-Fm-Fv7q5.js +78 -0
  294. package/dist/knowledge-BXBbT0Tr.d.ts +176 -0
  295. package/dist/knowledge-CDmiMLew.js +255 -0
  296. package/dist/lint/index.d.ts +1 -1
  297. package/dist/lint/index.js +37 -0
  298. package/dist/list/index.d.ts +3 -2
  299. package/dist/list/index.js +1 -444
  300. package/dist/{index-fag8VJZ2.d.ts → list-query-BRt-zDF7.d.ts} +20 -12
  301. package/dist/list-query-gl808ac1.js +459 -0
  302. package/dist/{live-CdJBOc4f.js → live-CTAZQkwl.js} +99 -14
  303. package/dist/logger-DWVYUmwi.d.ts +18 -0
  304. package/dist/mcp/index.d.ts +38 -11
  305. package/dist/mcp/index.js +82 -46
  306. package/dist/mcp/sdk/index.d.ts +105 -0
  307. package/dist/mcp/sdk/index.js +126 -0
  308. package/dist/message-CaKlqdsX.js +219 -0
  309. package/dist/message-CfDoR0Y6.d.ts +94 -0
  310. package/dist/messages-B9-5887d.js +715 -0
  311. package/dist/messages-DYP0sUTe.d.ts +59 -0
  312. package/dist/mfa-Daak8ukG.d.ts +54 -0
  313. package/dist/modules-DpPwzC7E.d.ts +192 -0
  314. package/dist/modules-dxrVK3ID.js +228 -0
  315. package/dist/nestjs/index.d.ts +68 -0
  316. package/dist/nestjs/index.js +164 -0
  317. package/dist/next/client/index.d.ts +35 -0
  318. package/dist/next/client/index.js +36 -0
  319. package/dist/next/image/index.js +3 -24
  320. package/dist/next/index.d.ts +150 -51
  321. package/dist/next/index.js +261 -107
  322. package/dist/node/index.d.ts +4 -0
  323. package/dist/node/index.js +210 -0
  324. package/dist/node-headers-AO06VhqH.d.ts +24 -0
  325. package/dist/node-headers-C71zNQHe.js +55 -0
  326. package/dist/nuxt/index.d.ts +60 -0
  327. package/dist/nuxt/index.js +64 -0
  328. package/dist/onboarding-BZGHYJks.d.ts +62 -0
  329. package/dist/openapi/index.d.ts +1 -1
  330. package/dist/openapi/index.js +3 -3
  331. package/dist/orpc/index.d.ts +70 -11
  332. package/dist/orpc/index.js +73 -24
  333. package/dist/otel/index.d.ts +7 -7
  334. package/dist/otel/index.js +87 -57
  335. package/dist/outbox-Cq7pPYvl.d.ts +161 -0
  336. package/dist/{plugin-o144f322.d.ts → plugin-FGY8UhYm.d.ts} +30 -10
  337. package/dist/plugin-tfXW1-qO.js +45 -0
  338. package/dist/plugins/actor/index.d.ts +2 -2
  339. package/dist/plugins/actor/index.js +3 -3
  340. package/dist/plugins/rules/index.d.ts +11 -4
  341. package/dist/plugins/rules/index.js +40 -13
  342. package/dist/plugins/soft-delete/index.d.ts +5 -4
  343. package/dist/plugins/soft-delete/index.js +10 -5
  344. package/dist/plugins/tenant/index.d.ts +2 -2
  345. package/dist/plugins/tenant/index.js +18 -11
  346. package/dist/plugins/timestamps/index.d.ts +5 -3
  347. package/dist/plugins/timestamps/index.js +6 -4
  348. package/dist/plugins/validation/index.d.ts +2 -2
  349. package/dist/plugins/validation/index.js +10 -6
  350. package/dist/{pool-C9voM4Kw.d.ts → pool-CAu2nLrL.d.ts} +2 -2
  351. package/dist/postgres/index.d.ts +4 -4
  352. package/dist/postgres/index.js +1 -2
  353. package/dist/{postgrest-CruYKAvV.d.ts → postgrest-BLVdEnfe.d.ts} +13 -3
  354. package/dist/powersync/index.d.ts +43 -0
  355. package/dist/powersync/index.js +199 -0
  356. package/dist/powersync/react/index.d.ts +87 -0
  357. package/dist/powersync/react/index.js +108 -0
  358. package/dist/{problem-BW1KhzSG.js → problem-BreOl8b8.js} +14 -3
  359. package/dist/{problem-Blxe8S31.d.ts → problem-DD8LZFjc.d.ts} +21 -3
  360. package/dist/provider-BH5UWZJ6.d.ts +113 -0
  361. package/dist/provider-Di3sRutW.js +57 -0
  362. package/dist/query/index.d.ts +4 -2
  363. package/dist/query/index.js +4 -3
  364. package/dist/{query-CCbo44lG.js → query-BQ-NaZon.js} +141 -24
  365. package/dist/{queue-BYUCjr59.d.ts → queue-CLJurhdy.d.ts} +258 -83
  366. package/dist/react/index.d.ts +11 -7
  367. package/dist/react/index.js +7 -3
  368. package/dist/react/native/index.d.ts +116 -0
  369. package/dist/react/native/index.js +130 -0
  370. package/dist/react/server.d.ts +28 -10
  371. package/dist/react/server.js +22 -5
  372. package/dist/react/session.d.ts +2 -2
  373. package/dist/react-4ZqkP8da.js +79 -0
  374. package/dist/react-F80mF4-t.js +409 -0
  375. package/dist/react-router/index.d.ts +83 -0
  376. package/dist/react-router/index.js +89 -0
  377. package/dist/react-topic-seAWjL3_.js +38 -0
  378. package/dist/{read-set-DQFt1N_Y.js → read-set-DuKWC9Mj.js} +67 -25
  379. package/dist/realtime/index.d.ts +4 -5
  380. package/dist/realtime/index.js +144 -82
  381. package/dist/refusal-CeJWxmkH.js +61 -0
  382. package/dist/refusal-D1rgbzNq.d.ts +15 -0
  383. package/dist/replicas-CwrYp5Zj.js +94 -0
  384. package/dist/{view-Bn6HNKUe.js → resolve-D_IcnvFd.js} +248 -240
  385. package/dist/{impersonation-BmePsuxz.d.ts → resolve-KW8nCeL6.d.ts} +29 -69
  386. package/dist/{resource-mqfJW4YF.js → resource-BsvzCMlX.js} +4 -4
  387. package/dist/{resource-DNRFP7KR.d.ts → resource-D6Uc7Sk7.d.ts} +5 -5
  388. package/dist/respond-BUgsXNgk.js +91 -0
  389. package/dist/respond-DoBijysA.d.ts +93 -0
  390. package/dist/result-D7y2fT87.d.ts +282 -0
  391. package/dist/{result-BKiliPY7.js → result-DzUbqgdW.js} +27 -2
  392. package/dist/run-state-CPo-1X2B.d.ts +12 -0
  393. package/dist/run-state-CgBKzYMW.js +13 -0
  394. package/dist/search-CUWCRYKL.js +9 -0
  395. package/dist/server/index.d.ts +143 -22
  396. package/dist/server/index.js +46 -14
  397. package/dist/{respond-BR1fJWOB.d.ts → server-CeVeeXwz.d.ts} +224 -85
  398. package/dist/session-ChiXDZdZ.d.ts +72 -0
  399. package/dist/shared-CBxosKK3.js +75 -0
  400. package/dist/{shared-D1dRUrAg.js → shared-CxWmcyqB.js} +2 -1
  401. package/dist/shared-DDSjEGDR.d.ts +11 -0
  402. package/dist/sign-in-BCV5S2WZ.d.ts +49 -0
  403. package/dist/sign-in-Cb1mwv6X.js +86 -0
  404. package/dist/{signers-Cc6r98SW.d.ts → signers-4y62_VIi.d.ts} +13 -9
  405. package/dist/simplify-DDO0j0LI.js +83 -0
  406. package/dist/solid/index.d.ts +131 -0
  407. package/dist/solid/index.js +344 -0
  408. package/dist/solid-start/index.d.ts +75 -0
  409. package/dist/solid-start/index.js +58 -0
  410. package/dist/{spec-pins-C3oc-Tdp.js → spec-pins--j6mTok4.js} +8 -1
  411. package/dist/{spec-pins-CqorWDnO.d.ts → spec-pins-C89s6DyW.d.ts} +7 -0
  412. package/dist/sql/index.d.ts +313 -212
  413. package/dist/sql/index.js +34872 -6579
  414. package/dist/ssr/index.d.ts +6 -5
  415. package/dist/ssr/index.js +3 -3
  416. package/dist/{standard-D7r6dMUu.js → standard-BK0cqJ7y.js} +4 -3
  417. package/dist/{standard-J4YgMOLm.d.ts → standard-CYsm7xpT.d.ts} +1 -1
  418. package/dist/stats-D_AD9GGu.js +1123 -0
  419. package/dist/storage/index.d.ts +5 -5
  420. package/dist/storage/index.js +1027 -368
  421. package/dist/store-BdH5ruDx.js +66 -0
  422. package/dist/store-CGjgWu5n.d.ts +68 -0
  423. package/dist/streams/index.d.ts +76 -0
  424. package/dist/streams/index.js +77 -0
  425. package/dist/streams/redis/index.d.ts +52 -0
  426. package/dist/streams/redis/index.js +185 -0
  427. package/dist/stripe-BMj5LtsT.js +38 -0
  428. package/dist/stripe-D04h-QBT.d.ts +136 -0
  429. package/dist/{support-wHnK6zp-.js → support-BivNqSpK.js} +32 -11
  430. package/dist/{support-view-B8SlToQX.d.ts → support-view-33Oi07TT.d.ts} +1 -1
  431. package/dist/svelte/index.d.ts +114 -0
  432. package/dist/svelte/index.js +344 -0
  433. package/dist/sveltekit/index.d.ts +116 -0
  434. package/dist/sveltekit/index.js +106 -0
  435. package/dist/tags-B99_U9Pp.js +39 -0
  436. package/dist/tags-Cx-LnIQP.d.ts +30 -0
  437. package/dist/tanstack-db/index.d.ts +71 -0
  438. package/dist/tanstack-db/index.js +72 -0
  439. package/dist/tanstack-start/index.d.ts +75 -0
  440. package/dist/tanstack-start/index.js +95 -0
  441. package/dist/tee-CoEppCER.js +101 -0
  442. package/dist/{template-TxrGI5jR.js → template--jDkl3UP.js} +34 -13
  443. package/dist/template-CwO38Do8.d.ts +6 -0
  444. package/dist/temporal-BJGitm-h.js +79 -0
  445. package/dist/{temporal-required-CAt4Dc9Z.js → temporal-required-BVvW7SYJ.js} +3 -2
  446. package/dist/tenant-I1TEZ_BX.js +27 -0
  447. package/dist/tenant-icPeuUBN.d.ts +17 -0
  448. package/dist/testing/index.d.ts +315 -41
  449. package/dist/testing/index.js +1046 -79
  450. package/dist/timing-CyTQPubY.js +92 -0
  451. package/dist/ttl-Hr34gRu8.js +12 -0
  452. package/dist/{types-Dnf_wRDz.d.ts → types-6BdhkmZe.d.ts} +111 -45
  453. package/dist/types-BI-0Sl2v.d.ts +359 -0
  454. package/dist/types-C05bxW-W.d.ts +220 -0
  455. package/dist/types-DGs5L0VN.d.ts +192 -0
  456. package/dist/types-TaiEeBGA.d.ts +156 -0
  457. package/dist/usage-CrvrL2vw.d.ts +177 -0
  458. package/dist/user-change-XzvgafU4.js +130 -0
  459. package/dist/vault-CSO7ss5C.d.ts +50 -0
  460. package/dist/vercel-connect/index.d.ts +47 -0
  461. package/dist/vercel-connect/index.js +119 -0
  462. package/dist/{verify-Ce49ETPz.js → verify-DL41hbvY.js} +85 -13
  463. package/dist/verify-DPuWngD4.d.ts +172 -0
  464. package/dist/{version-DOYTYwHP.js → version-Bvv6aLjZ.js} +1 -1
  465. package/dist/view-BeFcRV6G.js +99 -0
  466. package/dist/{view-CbgObAeb.d.ts → view-DbxLNu8L.d.ts} +22 -5
  467. package/dist/vue/index.d.ts +141 -0
  468. package/dist/vue/index.js +362 -0
  469. package/dist/watch-DI34G86j.d.ts +60 -0
  470. package/dist/watch-Xuxrvxq-.js +122 -0
  471. package/dist/{wire-D2dT86vi.js → wire-DtZQ4sdE.js} +15 -5
  472. package/dist/workflow-builder-DJ1oHn8g.js +398 -0
  473. package/dist/workflow-sdk/builder/index.d.ts +85 -0
  474. package/dist/workflow-sdk/builder/index.js +250 -0
  475. package/dist/workflow-sdk/index.d.ts +14 -0
  476. package/dist/workflow-sdk/index.js +3 -0
  477. package/dist/workflow-sdk/world/index.d.ts +107 -0
  478. package/dist/workflow-sdk/world/index.js +702 -0
  479. package/dist/workflow-sdk-B3yLD6Br.d.ts +98 -0
  480. package/dist/workflow-sdk-C2WJ_G2O.js +173 -0
  481. package/dist/workflow-sdk-world-D-prir6O.js +1397 -0
  482. package/dist/workflows-B0j9WKPu.d.ts +185 -0
  483. package/dist/workflows-wu1WWBn7.js +216 -0
  484. package/package.json +461 -20
  485. package/schemas/ai-message-v1.json +258 -0
  486. package/schemas/config-v1.json +1074 -140
  487. package/schemas/doctor-report-v1.json +20 -1
  488. package/schemas/snapshot-v2.json +8 -0
  489. package/skills/better-supabase/SKILL.md +41 -12
  490. package/skills/better-supabase/references/frontend.md +96 -0
  491. package/skills/better-supabase/references/plugins.md +10 -6
  492. package/skills/better-supabase/references/troubleshooting.md +2 -1
  493. package/skills/better-supabase-api/SKILL.md +76 -22
  494. package/skills/better-supabase-api/references/adapters.md +207 -0
  495. package/skills/better-supabase-api/references/ai.md +125 -0
  496. package/skills/better-supabase-api/references/expo.md +65 -0
  497. package/skills/better-supabase-api/references/powersync.md +35 -0
  498. package/skills/better-supabase-api/references/streams-credentials.md +105 -0
  499. package/skills/better-supabase-auth/SKILL.md +47 -11
  500. package/skills/better-supabase-auth/references/authorization-providers.md +51 -0
  501. package/skills/better-supabase-testing/SKILL.md +3 -1
  502. package/dist/cli/config-dtoekM0v.js +0 -2
  503. package/dist/cli/gen-CIdSQZad.js +0 -2
  504. package/dist/cli/gen-CjElD1Vw.js +0 -2241
  505. package/dist/cli/read-sets-VQcPgxU9.js +0 -436
  506. package/dist/cli/sql-CVx-1O8G.js +0 -373
  507. package/dist/entitlements-CTEBm7IB.js +0 -20
  508. package/dist/events-aIO7vsIk.d.ts +0 -230
  509. package/dist/executor-BunPOO-k.d.ts +0 -402
  510. package/dist/executor-XycESQPH.js +0 -94
  511. package/dist/index-CWMDdEr4.d.ts +0 -50
  512. package/dist/index-DOESKG27.d.ts +0 -100
  513. package/dist/index-DmXSxbLi.d.ts +0 -62
  514. package/dist/index-Dp2VDwog.d.ts +0 -161
  515. package/dist/jobs/index.d.ts +0 -226
  516. package/dist/jobs/index.js +0 -1007
  517. package/dist/json-schema-m1fiwKgN.js +0 -208
  518. package/dist/kit-events-CTFDfSwb.js +0 -60
  519. package/dist/kit-transport-B82k1djG.d.ts +0 -33
  520. package/dist/kits-CGLLrNPd.js +0 -157
  521. package/dist/mfa-Cu96oJdw.d.ts +0 -30
  522. package/dist/notifications/index.d.ts +0 -162
  523. package/dist/notifications/index.js +0 -264
  524. package/dist/orgs/index.d.ts +0 -132
  525. package/dist/orgs/index.js +0 -245
  526. package/dist/permdock-sql-C2Inc6Xc.d.ts +0 -29
  527. package/dist/permdock-sql-DgOfeixi.js +0 -51
  528. package/dist/plugin-DwARMuQp.js +0 -59
  529. package/dist/server-B1mZ7CgQ.js +0 -660
  530. package/dist/stats-Bqob3WqT.js +0 -592
  531. package/dist/support-CEPwlw2G.d.ts +0 -89
  532. package/dist/template-mbvlysOo.d.ts +0 -6
  533. package/dist/temporal-CVlIV2DZ.js +0 -40
  534. package/dist/user-change-CHFEUro1.js +0 -49
  535. package/dist/webhooks/index.d.ts +0 -285
  536. package/skills/better-supabase-auth/references/permdock.md +0 -122
@@ -0,0 +1,1123 @@
1
+ import { c as mapDbError, n as dbError, u as withMaxAffected } from "./errors-B11Duf73.js";
2
+ import { n as invalidRequest } from "./build-BXIzE6Xv.js";
3
+ import { t as lookupOf } from "./lookup-BaP5bI27.js";
4
+ import { d as temporalText } from "./temporal-BJGitm-h.js";
5
+ import { t as dateText } from "./wire-DtZQ4sdE.js";
6
+ import { a as ok, r as err, s as toDbError } from "./result-DzUbqgdW.js";
7
+ import { n as simplifyOrFalse } from "./simplify-DDO0j0LI.js";
8
+ //#region src/compile/postgrest.ts
9
+ /** `false` only for a version string whose major is known to be below 13. */
10
+ function supportsMaxAffected(version) {
11
+ if (version === void 0) return true;
12
+ const major = /^v?(\d+)/i.exec(version)?.[1];
13
+ return major === void 0 || Number(major) >= 13;
14
+ }
15
+ function scalar(value) {
16
+ if (typeof value === "string") return value;
17
+ if (typeof value === "number" || typeof value === "boolean") return String(value);
18
+ const temporalValue = temporalText(value);
19
+ if (temporalValue !== void 0) return temporalValue;
20
+ if (value instanceof Date) return dateText(value);
21
+ if (typeof value === "bigint") return String(value);
22
+ if (value === null) return "null";
23
+ return JSON.stringify(value);
24
+ }
25
+ /** Double-quotes a value for PostgREST lists and logic trees. */
26
+ function quote(value) {
27
+ return `"${scalar(value).replaceAll("\\", "\\\\").replaceAll("\"", "\\\"")}"`;
28
+ }
29
+ /**
30
+ * Values PostgREST reads the same with or without quotes in an `in` list:
31
+ * uuids, numbers, ISO dates and times, enum values, slugs and emails.
32
+ * `null` stays quoted, so it keeps meaning the string.
33
+ */
34
+ const BARE = /^[\w.:+@-]+$/;
35
+ /** An `in` list element; quoted only when it needs to be, as supabase-js does. */
36
+ function listItem(value) {
37
+ const text = scalar(value);
38
+ return BARE.test(text) && text.toLowerCase() !== "null" ? text : quote(text);
39
+ }
40
+ const BRACES = /[{}]/;
41
+ function list(values, open, close) {
42
+ return `${open}${values.map(quote).join(",")}${close}`;
43
+ }
44
+ /** The filter target: the column, or `column->a->>b` for a json path. */
45
+ function target(condition) {
46
+ const { column, path } = condition;
47
+ if (!path || path.length === 0) return column;
48
+ const last = path.length - 1;
49
+ return `${column}${path.map((key, index) => `${index === last ? "->>" : "->"}${key}`).join("")}`;
50
+ }
51
+ const REGEX_SPECIAL = /[\\^$.|?*+()[\]{}]/;
52
+ /**
53
+ * A LIKE pattern as an anchored POSIX regex. PostgREST reads every `*` in a
54
+ * like value as `%`, so a pattern with a literal `*` goes as `match`.
55
+ */
56
+ function likeToRegex(pattern) {
57
+ let regex = "^";
58
+ for (let index = 0; index < pattern.length; index += 1) {
59
+ const char = pattern.charAt(index);
60
+ if (char === "\\" && index + 1 < pattern.length) {
61
+ index += 1;
62
+ const next = pattern.charAt(index);
63
+ regex += REGEX_SPECIAL.test(next) ? `\\${next}` : next;
64
+ } else if (char === "%") regex += ".*";
65
+ else if (char === "_") regex += ".";
66
+ else regex += REGEX_SPECIAL.test(char) ? `\\${char}` : char;
67
+ }
68
+ return `${regex}$`;
69
+ }
70
+ function isBoolLike(value) {
71
+ return value === null || typeof value === "boolean";
72
+ }
73
+ function operatorAndValue(condition, inLogic) {
74
+ const { op, value } = condition;
75
+ const plain = (text) => inLogic ? quote(text) : scalar(text);
76
+ switch (op) {
77
+ case "eq":
78
+ case "neq":
79
+ case "gt":
80
+ case "gte":
81
+ case "lt":
82
+ case "lte":
83
+ case "match":
84
+ case "imatch": return {
85
+ operator: op,
86
+ value: plain(value)
87
+ };
88
+ case "like":
89
+ case "ilike": {
90
+ const text = scalar(value);
91
+ if (!text.includes("*")) return {
92
+ operator: op,
93
+ value: plain(text)
94
+ };
95
+ return {
96
+ operator: op === "like" ? "match" : "imatch",
97
+ value: plain(likeToRegex(text))
98
+ };
99
+ }
100
+ case "in":
101
+ if (!Array.isArray(value)) invalidRequest("\"in\" needs an array");
102
+ return {
103
+ operator: "in",
104
+ value: `(${value.map(listItem).join(",")})`
105
+ };
106
+ case "is":
107
+ if (!isBoolLike(value)) invalidRequest("\"is\" needs null, true or false");
108
+ return {
109
+ operator: "is",
110
+ value: String(value)
111
+ };
112
+ case "contains":
113
+ case "containedBy":
114
+ case "overlaps": {
115
+ const operator = op === "contains" ? "cs" : op === "containedBy" ? "cd" : "ov";
116
+ if (Array.isArray(value) && !condition.json) {
117
+ const literal = list(value, "{", "}");
118
+ return {
119
+ operator,
120
+ value: inLogic && BRACES.test(literal.slice(1, -1)) ? quote(literal) : literal
121
+ };
122
+ }
123
+ const json = JSON.stringify(value);
124
+ return {
125
+ operator,
126
+ value: inLogic ? quote(json) : json
127
+ };
128
+ }
129
+ case "fts": return {
130
+ operator: condition.config ? `wfts(${condition.config})` : "wfts",
131
+ value: plain(value)
132
+ };
133
+ default: return op;
134
+ }
135
+ }
136
+ var PostgrestCompiler = class {
137
+ filters = [];
138
+ orders = [];
139
+ limits = [];
140
+ #counter = 0;
141
+ nextAlias() {
142
+ this.#counter += 1;
143
+ return `_bs${this.#counter}`;
144
+ }
145
+ /** Compiles a condition at `path` where top-level items are ANDed. */
146
+ andContext(condition, path, embeds) {
147
+ switch (condition.kind) {
148
+ case "and":
149
+ for (const item of condition.items) this.andContext(item, path, embeds);
150
+ return;
151
+ case "column": {
152
+ const { operator, value } = operatorAndValue(condition, false);
153
+ this.filters.push({
154
+ kind: "filter",
155
+ path: path ? `${path}.${target(condition)}` : target(condition),
156
+ operator,
157
+ value
158
+ });
159
+ return;
160
+ }
161
+ case "not": {
162
+ const inner = condition.item;
163
+ if (inner.kind === "column") {
164
+ const { operator, value } = operatorAndValue(inner, false);
165
+ this.filters.push({
166
+ kind: "filter",
167
+ path: path ? `${path}.${target(inner)}` : target(inner),
168
+ operator: `not.${operator}`,
169
+ value
170
+ });
171
+ return;
172
+ }
173
+ if (inner.kind === "relation") {
174
+ this.relationAnd(negateRelation(inner), path, embeds);
175
+ return;
176
+ }
177
+ if (inner.kind === "not") {
178
+ this.andContext(inner.item, path, embeds);
179
+ return;
180
+ }
181
+ this.filters.push({
182
+ kind: "or",
183
+ expression: this.logic(condition, embeds),
184
+ referencedTable: path
185
+ });
186
+ return;
187
+ }
188
+ case "or":
189
+ this.filters.push({
190
+ kind: "or",
191
+ expression: this.logic(condition, embeds).replace(/^or\(/, "").replace(/\)$/, ""),
192
+ referencedTable: path
193
+ });
194
+ return;
195
+ case "relation":
196
+ this.relationAnd(condition, path, embeds);
197
+ return;
198
+ default: return condition;
199
+ }
200
+ }
201
+ relationAnd(condition, path, embeds) {
202
+ if (condition.quantifier === "every" && !condition.where) return;
203
+ const alias = this.nextAlias();
204
+ const aliasPath = path ? `${path}.${alias}` : alias;
205
+ const node = filterEmbed(alias, condition, condition.quantifier === "some");
206
+ this.withPath(node.children, aliasPath);
207
+ embeds.push(node);
208
+ const where = condition.quantifier === "every" && condition.where ? {
209
+ kind: "not",
210
+ item: condition.where
211
+ } : condition.where;
212
+ if (where) this.andContext(where, aliasPath, node.children);
213
+ if (condition.quantifier !== "some") this.filters.push({
214
+ kind: "filter",
215
+ path: aliasPath,
216
+ operator: "is",
217
+ value: "null"
218
+ });
219
+ }
220
+ /** Compiles a condition into a PostgREST logic-tree term. */
221
+ logic(condition, embeds) {
222
+ switch (condition.kind) {
223
+ case "and":
224
+ case "or": return `${condition.kind}(${condition.items.map((item) => this.logic(item, embeds)).join(",")})`;
225
+ case "not": {
226
+ const inner = condition.item;
227
+ if (inner.kind === "column") {
228
+ const { operator, value } = operatorAndValue(inner, true);
229
+ return `${target(inner)}.not.${operator}.${value}`;
230
+ }
231
+ if (inner.kind === "relation") return this.logic(negateRelation(inner), embeds);
232
+ if (inner.kind === "not") return this.logic(inner.item, embeds);
233
+ return `not.${this.logic(inner, embeds)}`;
234
+ }
235
+ case "column": {
236
+ const { operator, value } = operatorAndValue(condition, true);
237
+ return `${target(condition)}.${operator}.${value}`;
238
+ }
239
+ case "relation": {
240
+ if (condition.quantifier === "every" && !condition.where) invalidRequest("every({}) must be simplified before compiling");
241
+ const alias = this.nextAlias();
242
+ const node = filterEmbed(alias, condition, false);
243
+ const nodePath = this.pathOf(alias, embeds);
244
+ this.withPath(node.children, nodePath);
245
+ embeds.push(node);
246
+ const where = condition.quantifier === "every" && condition.where ? {
247
+ kind: "not",
248
+ item: condition.where
249
+ } : condition.where;
250
+ if (where) this.andContext(where, nodePath, node.children);
251
+ return condition.quantifier === "some" ? `${alias}.not.is.null` : `${alias}.is.null`;
252
+ }
253
+ default: return condition;
254
+ }
255
+ }
256
+ #paths;
257
+ withPath(embeds, path) {
258
+ (this.#paths ??= /* @__PURE__ */ new WeakMap()).set(embeds, path);
259
+ return embeds;
260
+ }
261
+ pathOf(alias, embeds) {
262
+ const parent = this.#paths?.get(embeds);
263
+ return parent ? `${parent}.${alias}` : alias;
264
+ }
265
+ include(include, path, embeds) {
266
+ const aliasPath = path ? `${path}.${include.alias}` : include.alias;
267
+ const node = {
268
+ alias: include.alias,
269
+ target: include.target,
270
+ relation: include.relation,
271
+ inner: include.required,
272
+ columns: include.selection.columns,
273
+ children: this.withPath([], aliasPath),
274
+ ...include.count === void 0 ? {} : { count: true },
275
+ ...include.selection.aggregate ? { measures: include.selection.aggregate.measures } : {}
276
+ };
277
+ embeds.push(node);
278
+ for (const child of include.selection.includes) this.include(child, aliasPath, node.children);
279
+ const where = simplifyOrFalse(include.where);
280
+ if (where.never) {
281
+ const [first] = include.target.primaryKey;
282
+ const column = first ? include.target.columns[first]?.db : void 0;
283
+ if (!column) invalidRequest(`Cannot filter "${include.alias}" to nothing`);
284
+ this.filters.push({
285
+ kind: "filter",
286
+ path: `${aliasPath}.${column}`,
287
+ operator: "is",
288
+ value: "null"
289
+ }, {
290
+ kind: "filter",
291
+ path: `${aliasPath}.${column}`,
292
+ operator: "not.is",
293
+ value: "null"
294
+ });
295
+ } else if (where.condition) this.andContext(where.condition, aliasPath, node.children);
296
+ for (const term of include.orderBy) this.order(term, aliasPath);
297
+ if (include.limit !== void 0) this.limits.push({
298
+ count: include.limit,
299
+ referencedTable: aliasPath
300
+ });
301
+ }
302
+ /**
303
+ * Sorts the root rows by a column of a to-one embed, `order=alias(column)`.
304
+ * Reuses the include of that relation, or adds an empty embed for it.
305
+ */
306
+ relationOrder(term, embeds) {
307
+ const { relation } = term;
308
+ if (!relation) return;
309
+ let alias = embeds.find((node) => node.relation.foreignKey === relation.relation.foreignKey && node.target === relation.target && node.count === void 0 && node.measures === void 0 && node.alias === relation.name)?.alias;
310
+ if (alias === void 0) {
311
+ alias = this.nextAlias();
312
+ embeds.push({
313
+ alias,
314
+ target: relation.target,
315
+ relation: relation.relation,
316
+ inner: false,
317
+ columns: [],
318
+ children: []
319
+ });
320
+ }
321
+ this.order({
322
+ ...term,
323
+ column: `${alias}(${term.column})`
324
+ }, void 0);
325
+ }
326
+ order(term, referencedTable) {
327
+ this.orders.push({
328
+ column: term.column,
329
+ ascending: term.direction === "asc",
330
+ nullsFirst: term.nulls === void 0 ? void 0 : term.nulls === "first",
331
+ referencedTable
332
+ });
333
+ }
334
+ };
335
+ function negateRelation(condition) {
336
+ switch (condition.quantifier) {
337
+ case "some": return {
338
+ ...condition,
339
+ quantifier: "none"
340
+ };
341
+ case "none": return {
342
+ ...condition,
343
+ quantifier: "some"
344
+ };
345
+ case "every": return {
346
+ ...condition,
347
+ quantifier: "some",
348
+ where: condition.where ? {
349
+ kind: "not",
350
+ item: condition.where
351
+ } : void 0
352
+ };
353
+ default: return condition.quantifier;
354
+ }
355
+ }
356
+ function filterEmbed(alias, condition, inner) {
357
+ return {
358
+ alias,
359
+ target: condition.target,
360
+ relation: condition.relation,
361
+ inner,
362
+ columns: [],
363
+ children: []
364
+ };
365
+ }
366
+ const columnTexts = /* @__PURE__ */ new WeakMap();
367
+ /** The rendered column list, cached per (shared, immutable) column array. */
368
+ function columnText(columns) {
369
+ let text = columnTexts.get(columns);
370
+ if (text === void 0) {
371
+ text = columns.map(({ alias, column, cast }) => {
372
+ const source = cast ? `${column}::${cast}` : column;
373
+ return alias === column ? source : `${alias}:${source}`;
374
+ }).join(",");
375
+ columnTexts.set(columns, text);
376
+ }
377
+ return text;
378
+ }
379
+ function columnList(columns) {
380
+ return columns.length > 0 ? [columnText(columns)] : [];
381
+ }
382
+ /** `key:column.sum()::text`, PostgREST's aggregate syntax (PostgREST 12+). */
383
+ function measureList(measures) {
384
+ return measures.map(({ key, column, fn, cast }) => `${key}:${column}.${fn}()${cast ? `::${cast}` : ""}`);
385
+ }
386
+ function aggregateList(aggregate) {
387
+ return [...aggregate.count ? ["_count:count()"] : [], ...measureList(aggregate.measures)];
388
+ }
389
+ function renderEmbeds(embeds) {
390
+ return embeds.map((node) => {
391
+ const hint = `${node.target.name}!${node.relation.foreignKey}${node.inner ? "!inner" : ""}`;
392
+ if (node.count) return `${node.alias}:${hint}(count)`;
393
+ if (node.measures) return `${node.alias}:${hint}(${measureList(node.measures).join(",")})`;
394
+ const inside = [...columnList(node.columns), ...renderEmbeds(node.children)];
395
+ return `${node.alias}:${hint}(${inside.join(",")})`;
396
+ });
397
+ }
398
+ function renderSelect(selection, embeds) {
399
+ if (!selection.aggregate && embeds.length === 0) return selection.columns.length > 0 ? columnText(selection.columns) : "*";
400
+ const parts = [
401
+ ...columnList(selection.columns),
402
+ ...selection.aggregate ? aggregateList(selection.aggregate) : [],
403
+ ...renderEmbeds(embeds)
404
+ ];
405
+ return parts.length > 0 ? parts.join(",") : "*";
406
+ }
407
+ /**
408
+ * PostgREST orders by columns only. `order=count` still sorts groups by
409
+ * their row count: Postgres reads `customers.count` as `count(customers)`
410
+ * when the table has no `count` column. Measures have no such spelling.
411
+ */
412
+ function aggregateOrder(compiler, term, table) {
413
+ if (term.aggregate !== "count") invalidRequest(`PostgREST can't sort "${table.key}" by _${term.aggregate}; sort by _count or a groupBy column, or use the postgres adapter`, table.key);
414
+ if (Object.values(table.columns).some((column) => column.db === "count")) invalidRequest(`PostgREST can't sort "${table.key}" by _count because the table has a column named "count"; sort by a groupBy column or use the postgres adapter`, table.key);
415
+ compiler.order({
416
+ ...term,
417
+ column: "count"
418
+ }, void 0);
419
+ }
420
+ function applyWhere(compiler, condition, embeds) {
421
+ const where = simplifyOrFalse(condition);
422
+ if (where.never) return false;
423
+ if (where.condition) compiler.andContext(where.condition, void 0, embeds);
424
+ return true;
425
+ }
426
+ /** Compiles an operation into a PostgREST plan. */
427
+ function compilePostgrest(op, options = {}) {
428
+ const maxAffected = op.kind === "update" || op.kind === "delete" ? op.maxAffected : void 0;
429
+ if (maxAffected !== void 0) {
430
+ if (!Number.isInteger(maxAffected) || maxAffected < 0) invalidRequest(`"maxAffected" must be a non-negative integer, got ${maxAffected}`, op.table.key);
431
+ if (!supportsMaxAffected(options.postgrestVersion)) invalidRequest(`"maxAffected" needs PostgREST 13 or later; postgrestVersion is "${options.postgrestVersion}"`, op.table.key);
432
+ }
433
+ const compiler = new PostgrestCompiler();
434
+ const embeds = compiler.withPath([], void 0);
435
+ const selection = op.kind === "select" ? op.selection : op.kind === "insert" ? op.returning : op.returning;
436
+ if (selection) for (const include of selection.includes) compiler.include(include, void 0, embeds);
437
+ let matches = true;
438
+ if (op.kind === "select" || op.kind === "update" || op.kind === "delete") {
439
+ const before = embeds.length;
440
+ matches = applyWhere(compiler, op.where, embeds);
441
+ if (op.kind !== "select" && embeds.length > before) invalidRequest(`Relation filters are not supported in ${op.kind} on PostgREST; filter by key instead`, op.table.key);
442
+ }
443
+ let range;
444
+ if (op.kind === "select") {
445
+ for (const term of op.orderBy) if (term.relation) compiler.relationOrder(term, embeds);
446
+ else if (term.aggregate) aggregateOrder(compiler, term, op.table);
447
+ else compiler.order(term, void 0);
448
+ if (op.offset !== void 0) {
449
+ const from = op.offset;
450
+ range = {
451
+ from,
452
+ to: op.limit === void 0 ? Number.MAX_SAFE_INTEGER : from + op.limit - 1
453
+ };
454
+ } else if (op.limit !== void 0) compiler.limits.push({
455
+ count: op.limit,
456
+ referencedTable: void 0
457
+ });
458
+ }
459
+ return {
460
+ select: selection ? renderSelect(selection, embeds) : void 0,
461
+ filters: compiler.filters,
462
+ orders: compiler.orders,
463
+ limits: compiler.limits,
464
+ range,
465
+ never: !matches,
466
+ ...maxAffected === void 0 ? {} : { maxAffected }
467
+ };
468
+ }
469
+ //#endregion
470
+ //#region src/core/in-chunks.ts
471
+ /** The length of the query string supabase-js sends for `plan`. */
472
+ function queryLength(plan) {
473
+ let length = plan.select === void 0 ? 0 : 8 + encoded(plan.select);
474
+ for (const filter of plan.filters) length += filter.kind === "filter" ? encoded(filter.path) + 2 + encoded(`${filter.operator}.${filter.value}`) : 4 + encoded(`(${filter.expression})`) + (filter.referencedTable ? encoded(filter.referencedTable) + 1 : 0);
475
+ for (const order of plan.orders) length += 24 + encoded(order.column);
476
+ return length;
477
+ }
478
+ function encoded(text) {
479
+ return encodeURIComponent(text).length;
480
+ }
481
+ function topLevel(where) {
482
+ if (!where) return [];
483
+ return where.kind === "and" ? where.items : [where];
484
+ }
485
+ function isInList(condition) {
486
+ return condition.kind === "column" && condition.op === "in" && condition.path === void 0 && Array.isArray(condition.value);
487
+ }
488
+ /** Column types whose order JavaScript reproduces without the database's collation. */
489
+ const SORTABLE = /* @__PURE__ */ new Set([
490
+ "int2",
491
+ "int4",
492
+ "int8",
493
+ "float4",
494
+ "float8",
495
+ "numeric",
496
+ "uuid",
497
+ "date",
498
+ "timestamp",
499
+ "timestamptz",
500
+ "bool"
501
+ ]);
502
+ const TIME = /* @__PURE__ */ new Set([
503
+ "date",
504
+ "timestamp",
505
+ "timestamptz"
506
+ ]);
507
+ const NUMERIC = /* @__PURE__ */ new Set([
508
+ "int2",
509
+ "int4",
510
+ "float4",
511
+ "float8",
512
+ "numeric"
513
+ ]);
514
+ const INTEGER = /^-?\d+$/;
515
+ function sortKind(type) {
516
+ if (type === "int8") return "bigint";
517
+ if (NUMERIC.has(type)) return "number";
518
+ return TIME.has(type) ? "time" : "text";
519
+ }
520
+ /** The `invalid_request` for a request whose URL is over the limit. */
521
+ function tooLong(op, length, max, why) {
522
+ return dbError("invalid_request", `The request for "${op.table.key}" is ${length} characters, over the ${max} the URL takes, and ${why}`, {
523
+ table: op.table.key,
524
+ hint: "Split the in list or paginate, pass a shorter list to a search function, or raise `urlLengthLimit` when every proxy in front of PostgREST accepts longer URLs."
525
+ });
526
+ }
527
+ /**
528
+ * Splits a read whose query string is over `max` into reads that each fit,
529
+ * along its longest top-level `in` list. Only reads without a limit, offset,
530
+ * count or single row qualify, since chunks can't share those; their rows are
531
+ * disjoint, and an order is re-applied in memory on columns that sort the
532
+ * same in JavaScript.
533
+ */
534
+ function chunkRead(op, plan, max) {
535
+ const length = queryLength(plan);
536
+ if (op.limit !== void 0 || op.offset !== void 0 || op.count !== void 0 || op.head || op.single !== void 0 || op.source !== void 0) return tooLong(op, length, max, "a read with a limit, offset, count or single row can't be split");
537
+ const items = topLevel(op.where);
538
+ let longest;
539
+ for (const condition of items) {
540
+ if (!isInList(condition)) continue;
541
+ const seen = /* @__PURE__ */ new Set();
542
+ const values = [];
543
+ const texts = [];
544
+ const sizes = [];
545
+ let total = 0;
546
+ let largest = 0;
547
+ for (const value of condition.value) {
548
+ const text = listItem(value);
549
+ if (seen.has(text)) continue;
550
+ seen.add(text);
551
+ const size = encoded(text) + 3;
552
+ values.push(value);
553
+ texts.push(text);
554
+ sizes.push(size);
555
+ total += size;
556
+ if (size > largest) largest = size;
557
+ }
558
+ if (!longest || total > longest.total) longest = {
559
+ condition,
560
+ values,
561
+ texts,
562
+ sizes,
563
+ total,
564
+ largest
565
+ };
566
+ }
567
+ if (!longest) return tooLong(op, length, max, "it has no top-level in list to split");
568
+ const listLength = encoded(`(${longest.condition.value.map(listItem).join(",")})`);
569
+ const { byDb } = lookupOf(op.table);
570
+ const hidden = [];
571
+ const aliases = new Map(op.selection.columns.map((c) => [c.column, c.alias]));
572
+ for (const term of op.orderBy) {
573
+ if (term.relation || aliases.has(term.column)) continue;
574
+ const alias = `_bs_order${hidden.length}`;
575
+ const exact = byDb.get(term.column)?.[1].type === "int8";
576
+ hidden.push({
577
+ alias,
578
+ column: term.column,
579
+ ...exact ? { cast: "text" } : {}
580
+ });
581
+ aliases.set(term.column, alias);
582
+ }
583
+ const hiddenText = (column) => `${column.alias}:${column.column}${column.cast ? `::${column.cast}` : ""}`;
584
+ const extra = hidden.reduce((sum, column) => sum + encoded(`,${hiddenText(column)}`), 0);
585
+ const budget = max - (length - listLength) - extra - encoded("()");
586
+ if (budget < longest.largest) return tooLong(op, length, max, "the rest of the request leaves no room for its in list");
587
+ let sort;
588
+ if (op.orderBy.length > 0) {
589
+ const keys = [];
590
+ for (const term of op.orderBy) {
591
+ const type = byDb.get(term.column)?.[1].type ?? "";
592
+ const alias = aliases.get(term.column);
593
+ if (term.relation || alias === void 0 || !SORTABLE.has(type) && !term.implicit) return tooLong(op, length, max, `its order on "${term.column}" can't be re-applied after splitting it; order by number, uuid, date or time columns`);
594
+ const desc = term.direction === "desc";
595
+ keys.push({
596
+ alias,
597
+ desc,
598
+ nullsFirst: (term.nulls ?? (desc ? "first" : "last")) === "first",
599
+ kind: sortKind(type)
600
+ });
601
+ }
602
+ sort = (rows) => {
603
+ const decorated = rows.map((row) => ({
604
+ row,
605
+ values: keys.map((key) => sortValue(row[key.alias], key.kind))
606
+ }));
607
+ decorated.sort((left, right) => {
608
+ for (const [index, key] of keys.entries()) {
609
+ const a = left.values[index];
610
+ const b = right.values[index];
611
+ if (a === b) continue;
612
+ if (a === void 0) return key.nullsFirst ? -1 : 1;
613
+ if (b === void 0) return key.nullsFirst ? 1 : -1;
614
+ const order = a < b ? -1 : a > b ? 1 : 0;
615
+ if (order !== 0) return key.desc ? -order : order;
616
+ }
617
+ return 0;
618
+ });
619
+ return decorated.map(({ row }) => {
620
+ for (const column of hidden) delete row[column.alias];
621
+ return row;
622
+ });
623
+ };
624
+ }
625
+ const chunks = [];
626
+ let current = {
627
+ values: [],
628
+ texts: []
629
+ };
630
+ let used = 0;
631
+ const list = longest;
632
+ list.values.forEach((value, index) => {
633
+ const size = list.sizes[index] ?? 0;
634
+ if (current.values.length > 0 && used + size > budget) {
635
+ chunks.push(current);
636
+ current = {
637
+ values: [],
638
+ texts: []
639
+ };
640
+ used = 0;
641
+ }
642
+ current.values.push(value);
643
+ current.texts.push(list.texts[index] ?? "");
644
+ used += size;
645
+ });
646
+ if (current.values.length > 0) chunks.push(current);
647
+ const full = `(${list.condition.value.map(listItem).join(",")})`;
648
+ const at = plan.filters.findIndex((filter) => filter.kind === "filter" && filter.operator === "in" && filter.path === list.condition.column && filter.value === full);
649
+ const select = plan.select === void 0 || hidden.length === 0 ? plan.select : `${plan.select},${hidden.map(hiddenText).join(",")}`;
650
+ const plans = at === -1 ? void 0 : chunks.map((chunk) => ({
651
+ ...plan,
652
+ select,
653
+ filters: plan.filters.map((filter, index) => index === at && filter.kind === "filter" ? {
654
+ ...filter,
655
+ value: `(${chunk.texts.join(",")})`
656
+ } : filter)
657
+ }));
658
+ return {
659
+ ops: chunks.map(({ values }) => {
660
+ const where = items.map((item) => item === list.condition ? {
661
+ ...list.condition,
662
+ value: values
663
+ } : item);
664
+ return {
665
+ ...op,
666
+ ...hidden.length > 0 && { selection: {
667
+ ...op.selection,
668
+ columns: [...op.selection.columns, ...hidden]
669
+ } },
670
+ where: where.length === 1 ? where[0] : {
671
+ kind: "and",
672
+ items: where
673
+ }
674
+ };
675
+ }),
676
+ plans,
677
+ sort
678
+ };
679
+ }
680
+ /**
681
+ * A comparable value, or `undefined` for SQL null. Times compare by
682
+ * instant, which text can't do across offsets, with the microseconds
683
+ * `Date.parse` drops appended.
684
+ */
685
+ function sortValue(value, kind) {
686
+ if (value === null || value === void 0) return void 0;
687
+ if (kind === "number") return Number(value);
688
+ if (kind === "bigint") {
689
+ if (typeof value === "bigint") return value;
690
+ if (typeof value === "number" && Number.isInteger(value)) return BigInt(value);
691
+ if (typeof value === "string" && INTEGER.test(value)) return BigInt(value);
692
+ return Number(value);
693
+ }
694
+ const text = String(value);
695
+ if (kind === "text") return text;
696
+ const instant = Date.parse(text);
697
+ if (Number.isNaN(instant)) return text;
698
+ const micros = (/\.(\d+)/.exec(text)?.[1] ?? "").slice(3, 6).padEnd(3, "0");
699
+ return `${String(instant + 864e13).padStart(17, "0")}${micros}`;
700
+ }
701
+ //#endregion
702
+ //#region src/core/timeout.ts
703
+ const NO_DEADLINE = (signal) => ({
704
+ signal,
705
+ timedOut: () => false,
706
+ clear: () => {}
707
+ });
708
+ /**
709
+ * Either signal aborting aborts the result. Uses `AbortSignal.any` where the
710
+ * runtime has it; Hermes and older runtimes get the same behaviour by hand.
711
+ */
712
+ function anySignal(signals) {
713
+ if (typeof AbortSignal.any === "function") return {
714
+ signal: AbortSignal.any([...signals]),
715
+ detach: () => {}
716
+ };
717
+ const controller = new AbortController();
718
+ const abort = () => {
719
+ controller.abort();
720
+ };
721
+ for (const signal of signals) if (signal.aborted) {
722
+ abort();
723
+ return {
724
+ signal: controller.signal,
725
+ detach: () => {}
726
+ };
727
+ }
728
+ for (const signal of signals) signal.addEventListener("abort", abort);
729
+ return {
730
+ signal: controller.signal,
731
+ detach: () => {
732
+ for (const signal of signals) signal.removeEventListener("abort", abort);
733
+ }
734
+ };
735
+ }
736
+ /** `true` for a timeout the executors and the repository accept. */
737
+ function isTimeout(value) {
738
+ return typeof value === "number" && Number.isFinite(value) && value > 0;
739
+ }
740
+ /**
741
+ * `signal` combined with a `timeoutMs` timer. Without a timeout it returns
742
+ * the signal unchanged, so calls without one allocate nothing.
743
+ */
744
+ function deadline(signal, timeoutMs) {
745
+ if (timeoutMs === void 0) return NO_DEADLINE(signal);
746
+ const timer = new AbortController();
747
+ const handle = setTimeout(() => {
748
+ timer.abort();
749
+ }, timeoutMs);
750
+ const combined = signal ? anySignal([signal, timer.signal]) : {
751
+ signal: timer.signal,
752
+ detach: () => {}
753
+ };
754
+ return {
755
+ signal: combined.signal,
756
+ timedOut: () => timer.signal.aborted && !(signal?.aborted ?? false),
757
+ clear: () => {
758
+ clearTimeout(handle);
759
+ combined.detach();
760
+ }
761
+ };
762
+ }
763
+ const NO_TUNING = Object.freeze({});
764
+ /** `invalid_request` text for a bad `timeout` or `retry`, else `undefined`. */
765
+ function invalidTuning(tuning) {
766
+ if (tuning.timeout !== void 0 && !isTimeout(tuning.timeout)) return `"timeout" must be a positive number of milliseconds, got ${String(tuning.timeout)}`;
767
+ if (tuning.retry !== void 0 && typeof tuning.retry !== "boolean") return `"retry" must be a boolean, got ${String(tuning.retry)}`;
768
+ }
769
+ /** `timeout` and `retry` from a call's arguments, or why they are invalid. */
770
+ function tuningOf(args) {
771
+ const timeout = args?.["timeout"];
772
+ const retry = args?.["retry"];
773
+ if (timeout === void 0 && retry === void 0) return NO_TUNING;
774
+ const invalid = invalidTuning({
775
+ timeout,
776
+ retry
777
+ });
778
+ if (invalid) return { invalid };
779
+ return {
780
+ ...isTimeout(timeout) ? { timeout } : {},
781
+ ...typeof retry === "boolean" ? { retry } : {}
782
+ };
783
+ }
784
+ //#endregion
785
+ //#region src/core/postgrest-executor.ts
786
+ function scope(client, schema) {
787
+ const loose = client;
788
+ if (schema === "public" || !loose.schema) return loose;
789
+ let schemas = scopedClients.get(client);
790
+ if (!schemas) {
791
+ schemas = /* @__PURE__ */ new Map();
792
+ scopedClients.set(client, schemas);
793
+ }
794
+ let scoped = schemas.get(schema);
795
+ if (!scoped) {
796
+ scoped = loose.schema(schema);
797
+ schemas.set(schema, scoped);
798
+ }
799
+ return scoped;
800
+ }
801
+ /** `schema()` builds a new client on every call; one per client and schema is enough. */
802
+ const scopedClients = /* @__PURE__ */ new WeakMap();
803
+ function fromTable(client, schema, table) {
804
+ return scope(client, schema).from(table);
805
+ }
806
+ /** A POST to the function: arguments such as query vectors are too long for a URL. */
807
+ function fromFunction(client, source, options) {
808
+ const scoped = scope(client, source.schema);
809
+ if (!scoped.rpc) throw new TypeError(`better-supabase: the client has no rpc(), needed to read from ${source.name}`);
810
+ return scoped.rpc(source.name, source.args, options);
811
+ }
812
+ function applyFilters(builder, plan) {
813
+ let query = builder;
814
+ for (const filter of plan.filters) query = filter.kind === "filter" ? query.filter(filter.path, filter.operator, filter.value) : query.or(filter.expression, filter.referencedTable ? { referencedTable: filter.referencedTable } : {});
815
+ return query;
816
+ }
817
+ function applyOrderAndLimits(builder, plan) {
818
+ let query = builder;
819
+ for (const order of plan.orders) {
820
+ const options = { ascending: order.ascending };
821
+ if (order.nullsFirst !== void 0) options.nullsFirst = order.nullsFirst;
822
+ if (order.referencedTable) options.referencedTable = order.referencedTable;
823
+ query = query.order(order.column, options);
824
+ }
825
+ for (const limit of plan.limits) query = query.limit(limit.count, limit.referencedTable ? { referencedTable: limit.referencedTable } : {});
826
+ if (plan.range) query = query.range(plan.range.from, plan.range.to);
827
+ return query;
828
+ }
829
+ /** A mutation without `returning` reports its row count, `exact` unless the op says otherwise. */
830
+ function countOf(op, plan) {
831
+ return plan.select === void 0 ? { count: op.count ?? "exact" } : {};
832
+ }
833
+ function bounded(query, op, plan) {
834
+ if (plan.maxAffected === void 0) return query;
835
+ if (!query.maxAffected) invalidRequest("\"maxAffected\" needs @supabase/postgrest-js 2 or later", op.table.key);
836
+ return query.maxAffected(plan.maxAffected);
837
+ }
838
+ function build(client, op, plan) {
839
+ const base = fromTable(client, op.table.schema, op.table.name);
840
+ switch (op.kind) {
841
+ case "select": {
842
+ const options = {};
843
+ if (op.count) options.count = op.count;
844
+ if (op.head) options.head = true;
845
+ let query = applyOrderAndLimits(applyFilters(op.source ? fromFunction(client, op.source, options).select(plan.select) : base.select(plan.select, options), plan), plan);
846
+ if (op.single === "one") query = query.single();
847
+ if (op.single === "maybe") query = query.maybeSingle();
848
+ return query;
849
+ }
850
+ case "insert": {
851
+ const rows = op.rows.length === 1 ? op.rows[0] : op.rows;
852
+ const count = countOf(op, plan);
853
+ let query = op.onConflict ? base.upsert(rows, {
854
+ onConflict: op.onConflict.columns.join(","),
855
+ ignoreDuplicates: op.onConflict.action === "ignore",
856
+ defaultToNull: op.defaultToNull,
857
+ ...count
858
+ }) : base.insert(rows, {
859
+ defaultToNull: op.defaultToNull,
860
+ ...count
861
+ });
862
+ if (plan.select !== void 0) query = query.select(plan.select);
863
+ return query;
864
+ }
865
+ case "update": {
866
+ let query = applyFilters(base.update(op.set, countOf(op, plan)), plan);
867
+ if (plan.select !== void 0) query = query.select(plan.select);
868
+ return bounded(query, op, plan);
869
+ }
870
+ case "delete": {
871
+ let query = applyFilters(base.delete(countOf(op, plan)), plan);
872
+ if (plan.select !== void 0) query = query.select(plan.select);
873
+ return bounded(query, op, plan);
874
+ }
875
+ default: return op;
876
+ }
877
+ }
878
+ function rowsOf(data) {
879
+ if (data === null || data === void 0) return [];
880
+ if (Array.isArray(data)) return data;
881
+ return [data];
882
+ }
883
+ const ONLY_ROWS = /there are only (\d+) rows/;
884
+ /**
885
+ * PostgREST answers a counted read whose offset is past the last row with
886
+ * 416 (`PGRST103`); the SQL executor returns no rows and the total.
887
+ */
888
+ function pastLastRow(op, error) {
889
+ if (op.kind !== "select" || !op.count || error.code !== "PGRST103") return;
890
+ const match = ONLY_ROWS.exec(error.details ?? "");
891
+ return match ? Number(match[1]) : void 0;
892
+ }
893
+ const aborted = () => dbError("aborted", "The request was aborted");
894
+ function tune(builder, signal, retry) {
895
+ let query = builder;
896
+ if (signal) query = query.abortSignal(signal);
897
+ if (retry !== void 0 && query.retry) query = query.retry(retry);
898
+ return query;
899
+ }
900
+ const timedOut = (ms) => dbError("timeout", `The request timed out after ${ms} ms`);
901
+ const DEFAULT_URL_LENGTH_LIMIT = 6e3;
902
+ /** `urlLengthLimit` on a bare `PostgrestClient`, or on supabase-js's `rest` client. */
903
+ function clientUrlLengthLimit(client) {
904
+ const loose = client;
905
+ const limit = loose.urlLengthLimit ?? loose.rest?.urlLengthLimit;
906
+ return typeof limit === "number" && limit > 0 ? limit : void 0;
907
+ }
908
+ /** The query-string budget for one read: the option, else the lower of 6000 and the client's limit. */
909
+ function resolveUrlLengthLimit(client, options) {
910
+ const explicit = options.urlLengthLimit;
911
+ if (explicit !== void 0) return explicit;
912
+ const fromClient = clientUrlLengthLimit(client);
913
+ return fromClient === void 0 ? DEFAULT_URL_LENGTH_LIMIT : Math.min(fromClient, DEFAULT_URL_LENGTH_LIMIT);
914
+ }
915
+ /** Chunks of a split read in flight at once. */
916
+ const CHUNK_CONCURRENCY = 4;
917
+ /** Executes IR operations through a supabase-js client. */
918
+ function postgrestExecutor(client, options = {}) {
919
+ const urlLengthLimit = resolveUrlLengthLimit(client, options);
920
+ const compileOptions = options.postgrestVersion === void 0 ? {} : { postgrestVersion: options.postgrestVersion };
921
+ const timeout = isTimeout(options.timeout) ? options.timeout : void 0;
922
+ const execute = async (op, context) => {
923
+ let plan;
924
+ try {
925
+ plan = compilePostgrest(op, compileOptions);
926
+ } catch (cause) {
927
+ return err(toDbError(cause));
928
+ }
929
+ if (plan.never) return ok({
930
+ rows: [],
931
+ count: 0
932
+ });
933
+ if (context.signal?.aborted) return err(aborted());
934
+ const length = queryLength(plan);
935
+ if (op.kind !== "select" && length > urlLengthLimit) return err(tooLong(op, length, urlLengthLimit, "a write can't be split into several requests"));
936
+ if (op.kind === "select" && length > urlLengthLimit) {
937
+ const chunked = chunkRead(op, plan, urlLengthLimit);
938
+ if (!("ops" in chunked)) return err(chunked);
939
+ const results = [];
940
+ let next = 0;
941
+ const lane = async () => {
942
+ while (next < chunked.ops.length) {
943
+ const index = next++;
944
+ const chunk = chunked.ops[index];
945
+ const chunkPlan = chunked.plans?.[index];
946
+ const result = await (chunkPlan ? run(chunk, chunkPlan, context) : send(chunk, context));
947
+ results[index] = result;
948
+ if (!result.ok) next = chunked.ops.length;
949
+ }
950
+ };
951
+ await Promise.all(Array.from({ length: Math.min(CHUNK_CONCURRENCY, chunked.ops.length) }, lane));
952
+ const rows = [];
953
+ for (const result of results) {
954
+ if (!result.ok) return result;
955
+ for (const row of result.data.rows) rows.push(row);
956
+ }
957
+ return ok({
958
+ rows: chunked.sort ? chunked.sort(rows) : rows,
959
+ count: null
960
+ });
961
+ }
962
+ return run(op, plan, context);
963
+ };
964
+ const send = (op, context) => {
965
+ let plan;
966
+ try {
967
+ plan = compilePostgrest(op, compileOptions);
968
+ } catch (cause) {
969
+ return Promise.resolve(err(toDbError(cause)));
970
+ }
971
+ return plan.never ? Promise.resolve(ok({
972
+ rows: [],
973
+ count: 0
974
+ })) : run(op, plan, context);
975
+ };
976
+ const run = async (op, plan, context) => {
977
+ let query;
978
+ try {
979
+ query = build(client, op, plan);
980
+ } catch (cause) {
981
+ return err(toDbError(cause));
982
+ }
983
+ const limit = deadline(context.signal, timeout);
984
+ try {
985
+ query = tune(query, limit.signal, context.retry ?? options.retry);
986
+ const response = await query;
987
+ if (response.error) {
988
+ if (limit.timedOut() && timeout !== void 0) return err(timedOut(timeout));
989
+ if (limit.signal?.aborted) return err(aborted());
990
+ const total = pastLastRow(op, response.error);
991
+ if (total !== void 0) return ok({
992
+ rows: [],
993
+ count: total
994
+ });
995
+ return err(withMaxAffected(mapDbError(response.error, context.errorMappers), plan.maxAffected));
996
+ }
997
+ return ok({
998
+ rows: rowsOf(response.data),
999
+ count: response.count ?? null
1000
+ });
1001
+ } finally {
1002
+ limit.clear();
1003
+ }
1004
+ };
1005
+ return {
1006
+ name: "postgrest",
1007
+ functionSources: true,
1008
+ execute,
1009
+ async rpc(name, args, context) {
1010
+ const scoped = scope(client, context.schema);
1011
+ if (!scoped.rpc) return err(toDbError(/* @__PURE__ */ new Error("The client does not support rpc()")));
1012
+ if (context.signal?.aborted) return err(aborted());
1013
+ const built = context.get ? scoped.rpc(name, queryArgs(args), { get: true }) : scoped.rpc(name, args);
1014
+ const limit = deadline(context.signal, timeout);
1015
+ try {
1016
+ const response = await tune(built, limit.signal, context.retry ?? options.retry);
1017
+ if (response.error) {
1018
+ if (limit.timedOut() && timeout !== void 0) return err(timedOut(timeout));
1019
+ if (limit.signal?.aborted) return err(aborted());
1020
+ return err(mapDbError(response.error, context.errorMappers));
1021
+ }
1022
+ return ok(response.data);
1023
+ } finally {
1024
+ limit.clear();
1025
+ }
1026
+ }
1027
+ };
1028
+ }
1029
+ /**
1030
+ * GET arguments travel in the query string, where supabase-js would print an
1031
+ * object as `[object Object]`; json and jsonb parameters take it as JSON.
1032
+ */
1033
+ function queryArgs(args) {
1034
+ return Object.fromEntries(Object.entries(args).map(([key, value]) => [key, typeof value === "object" && value !== null && !Array.isArray(value) ? JSON.stringify(value) : value]));
1035
+ }
1036
+ /** The compiled plan for an operation; useful for debugging and tests. */
1037
+ function explainPostgrest(op, options) {
1038
+ return compilePostgrest(op, options);
1039
+ }
1040
+ //#endregion
1041
+ //#region src/core/stats.ts
1042
+ const EMPTY_STATS = {
1043
+ calls: 0,
1044
+ waves: 0,
1045
+ tables: [],
1046
+ ms: 0
1047
+ };
1048
+ /**
1049
+ * Counts calls and waves. A recorder with a `parent` also reports to it, so
1050
+ * a request-wide recorder sees every scope's calls.
1051
+ */
1052
+ var StatsRecorder = class {
1053
+ #parent;
1054
+ #now;
1055
+ #tables = /* @__PURE__ */ new Set();
1056
+ #calls = 0;
1057
+ #waves = 0;
1058
+ #inFlight = 0;
1059
+ #first;
1060
+ #last;
1061
+ constructor(parent, now = () => performance.now()) {
1062
+ this.#parent = parent;
1063
+ this.#now = now;
1064
+ }
1065
+ /** Records a call to `table`; the returned function ends it. */
1066
+ begin(table) {
1067
+ const end = this.#parent?.begin(table);
1068
+ const started = this.#now();
1069
+ if (this.#inFlight === 0) this.#waves += 1;
1070
+ this.#inFlight += 1;
1071
+ this.#calls += 1;
1072
+ this.#tables.add(table);
1073
+ this.#first ??= started;
1074
+ let ended = false;
1075
+ return () => {
1076
+ if (ended) return;
1077
+ ended = true;
1078
+ this.#inFlight -= 1;
1079
+ this.#last = Math.max(this.#last ?? 0, this.#now());
1080
+ end?.();
1081
+ };
1082
+ }
1083
+ /** The totals so far. */
1084
+ snapshot() {
1085
+ return {
1086
+ calls: this.#calls,
1087
+ waves: this.#waves,
1088
+ tables: [...this.#tables],
1089
+ ms: this.#first === void 0 || this.#last === void 0 ? 0 : Math.round((this.#last - this.#first) * 100) / 100
1090
+ };
1091
+ }
1092
+ };
1093
+ /** Wraps an executor so every call is recorded. */
1094
+ function recordStats(executor, recorder) {
1095
+ const wrapped = {
1096
+ name: executor.name,
1097
+ async execute(op, context) {
1098
+ const end = recorder.begin(op.table.key);
1099
+ try {
1100
+ return await executor.execute(op, context);
1101
+ } finally {
1102
+ end();
1103
+ }
1104
+ }
1105
+ };
1106
+ if (executor.rpc) {
1107
+ const rpc = executor.rpc.bind(executor);
1108
+ return {
1109
+ ...wrapped,
1110
+ async rpc(name, args, context) {
1111
+ const end = recorder.begin(`${name}()`);
1112
+ try {
1113
+ return await rpc(name, args, context);
1114
+ } finally {
1115
+ end();
1116
+ }
1117
+ }
1118
+ };
1119
+ }
1120
+ return wrapped;
1121
+ }
1122
+ //#endregion
1123
+ export { postgrestExecutor as a, invalidTuning as c, explainPostgrest as i, tuningOf as l, StatsRecorder as n, NO_TUNING as o, recordStats as r, deadline as s, EMPTY_STATS as t, compilePostgrest as u };