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,459 @@
1
+ //#region src/list/list-query.ts
2
+ /** Facet value meaning "not set": filters with `is null`. */
3
+ const UNSET = "__unset__";
4
+ const RESERVED = /* @__PURE__ */ new Set([
5
+ "q",
6
+ "sort",
7
+ "page",
8
+ "after",
9
+ "size"
10
+ ]);
11
+ function first(value) {
12
+ return typeof value === "string" ? value : value?.[0];
13
+ }
14
+ function all(value) {
15
+ return (typeof value === "string" ? [value] : [...value ?? []]).flatMap((entry) => entry.split(",")).map((entry) => entry.trim()).filter(Boolean);
16
+ }
17
+ const isParamValue = (value) => value === void 0 || typeof value === "string" || Array.isArray(value) && value.every((entry) => typeof entry === "string");
18
+ function isSearchParams(value) {
19
+ return value instanceof URLSearchParams || !("facets" in value && typeof value.facets === "object") && Object.values(value).every(isParamValue);
20
+ }
21
+ function readRecord(input) {
22
+ if (!(input instanceof URLSearchParams)) return input;
23
+ const out = {};
24
+ for (const [key, value] of input) (out[key] ??= []).push(value);
25
+ return out;
26
+ }
27
+ function toInt(raw) {
28
+ if (typeof raw === "number") return raw;
29
+ if (typeof raw !== "string" || !/^\d+$/.test(raw)) return NaN;
30
+ return Number(raw);
31
+ }
32
+ /**
33
+ * A reusable list endpoint for one table: search, facets, sorts and
34
+ * pagination, validated from URL params or typed input, with URL parsers,
35
+ * OpenAPI parameters and a JSON Schema derived from the same definition.
36
+ *
37
+ * ```ts
38
+ * export const customerList = defineListQuery(betterSupabase, 'customers', {
39
+ * search: ['name', 'kvk'],
40
+ * facets: { status: 'status' },
41
+ * sorts: { name: { name: 'asc' }, newest: [{ createdAt: 'desc' }, { id: 'asc' }] },
42
+ * defaultSort: 'newest',
43
+ * });
44
+ * ```
45
+ */
46
+ function defineListQuery(betterSupabase, table, config) {
47
+ const meta = betterSupabase.meta.tables[table];
48
+ if (!meta) throw new TypeError(`defineListQuery: unknown table "${table}"`);
49
+ const pageSize = config.pageSize ?? 50;
50
+ const maxPageSize = config.maxPageSize ?? 200;
51
+ const maxSearch = config.maxSearchLength ?? 200;
52
+ const facetLimit = config.facetLimit ?? 100;
53
+ const cursor = config.pagination === "cursor";
54
+ const sortKeys = Object.keys(config.sorts);
55
+ const facetEntries = Object.entries(config.facets ?? {});
56
+ for (const [key, column] of facetEntries) {
57
+ if (RESERVED.has(key)) throw new TypeError(`defineListQuery: facet key "${key}" is reserved`);
58
+ if (!meta.columns[column]) throw new TypeError(`defineListQuery: unknown column "${table}.${column}"`);
59
+ }
60
+ if (!sortKeys.includes(config.defaultSort)) throw new TypeError(`defineListQuery: defaultSort "${config.defaultSort}" is not in sorts`);
61
+ const facets = facetEntries.map(([key, column]) => {
62
+ const columnMeta = meta.columns[column];
63
+ return {
64
+ key,
65
+ column,
66
+ nullable: columnMeta.nullable,
67
+ ...columnMeta.enum ? { values: columnMeta.enum } : {}
68
+ };
69
+ });
70
+ const defaults = {
71
+ sort: config.defaultSort,
72
+ page: 1,
73
+ size: pageSize,
74
+ facets: {}
75
+ };
76
+ function normalize(raw) {
77
+ const issues = [];
78
+ let q;
79
+ if (raw.q !== void 0 && raw.q !== null) {
80
+ if (typeof raw.q !== "string") issues.push({
81
+ message: "Must be text",
82
+ path: ["q"]
83
+ });
84
+ else if (raw.q.trim().length > maxSearch) issues.push({
85
+ message: `At most ${String(maxSearch)} characters`,
86
+ path: ["q"]
87
+ });
88
+ else if (raw.q.trim()) q = raw.q.trim();
89
+ }
90
+ let sort = config.defaultSort;
91
+ if (raw.sort !== void 0 && raw.sort !== "") {
92
+ if (typeof raw.sort === "string" && sortKeys.includes(raw.sort)) sort = raw.sort;
93
+ else issues.push({
94
+ message: `Must be one of: ${sortKeys.join(", ")}`,
95
+ path: ["sort"]
96
+ });
97
+ }
98
+ const page = raw.page === void 0 || raw.page === "" ? 1 : toInt(raw.page);
99
+ if (page === void 0 || !Number.isInteger(page) || page < 1) issues.push({
100
+ message: "Must be a whole number of at least 1",
101
+ path: ["page"]
102
+ });
103
+ else if (cursor && page !== 1) issues.push({
104
+ message: "This list pages with `after`, not `page`",
105
+ path: ["page"]
106
+ });
107
+ let after;
108
+ if (raw.after !== void 0 && raw.after !== "") {
109
+ if (cursor && typeof raw.after === "string") after = raw.after;
110
+ else issues.push({
111
+ message: cursor ? "Must be text" : "This list pages with `page`, not `after`",
112
+ path: ["after"]
113
+ });
114
+ }
115
+ const size = raw.size === void 0 || raw.size === "" ? pageSize : toInt(raw.size);
116
+ if (size === void 0 || !Number.isInteger(size) || size < 1 || size > maxPageSize) issues.push({
117
+ message: `Must be a whole number from 1 to ${String(maxPageSize)}`,
118
+ path: ["size"]
119
+ });
120
+ const facetValues = {};
121
+ for (const facet of facets) {
122
+ const values = raw.facets[facet.key];
123
+ if (!values || values.length === 0) continue;
124
+ for (const value of values) if (!(value === "__unset__" ? facet.nullable : !facet.values || facet.values.includes(value))) issues.push({
125
+ message: value === "__unset__" ? "This filter cannot be empty" : `Must be one of: ${(facet.values ?? []).join(", ")}`,
126
+ path: ["facets", facet.key]
127
+ });
128
+ facetValues[facet.key] = [...new Set(values)];
129
+ }
130
+ if (issues.length > 0) return {
131
+ ok: false,
132
+ issues
133
+ };
134
+ return {
135
+ ok: true,
136
+ value: {
137
+ ...q ? { q } : {},
138
+ sort,
139
+ page: page ?? 1,
140
+ ...after ? { after } : {},
141
+ size: size ?? pageSize,
142
+ facets: facetValues
143
+ }
144
+ };
145
+ }
146
+ function parse(input) {
147
+ if (input === void 0 || input === null) return {
148
+ ok: true,
149
+ value: defaults
150
+ };
151
+ if (typeof input !== "object") return {
152
+ ok: false,
153
+ issues: [{ message: "Expected an object or URL parameters" }]
154
+ };
155
+ if (isSearchParams(input)) {
156
+ const record = readRecord(input);
157
+ const facetValues = {};
158
+ for (const facet of facets) facetValues[facet.key] = all(record[facet.key]);
159
+ return normalize({
160
+ q: first(record["q"]),
161
+ sort: first(record["sort"]),
162
+ page: first(record["page"]),
163
+ after: first(record["after"]),
164
+ size: first(record["size"]),
165
+ facets: facetValues
166
+ });
167
+ }
168
+ const typed = input;
169
+ const rawFacets = typed.facets ?? {};
170
+ for (const [key, value] of Object.entries(rawFacets)) if (!Array.isArray(value) || value.some((entry) => typeof entry !== "string")) return {
171
+ ok: false,
172
+ issues: [{
173
+ message: "Must be a list of values",
174
+ path: ["facets", key]
175
+ }]
176
+ };
177
+ return normalize({
178
+ q: typed.q,
179
+ sort: typed.sort,
180
+ page: typed.page,
181
+ after: typed.after,
182
+ size: typed.size,
183
+ facets: rawFacets
184
+ });
185
+ }
186
+ function searchWhere(query) {
187
+ if (!query.q || !config.search) return void 0;
188
+ if (Array.isArray(config.search)) {
189
+ const columns = config.search;
190
+ if (columns.length === 0) return void 0;
191
+ return { OR: columns.map((column) => ({ [column]: { contains: query.q } })) };
192
+ }
193
+ const fts = config.search;
194
+ return { [fts.fts]: { search: fts.config ? {
195
+ query: query.q,
196
+ config: fts.config
197
+ } : query.q } };
198
+ }
199
+ function facetWhere(facet, values) {
200
+ if (!values || values.length === 0) return void 0;
201
+ const unset = values.includes(UNSET);
202
+ const set = values.filter((value) => value !== UNSET);
203
+ if (unset && set.length === 0) return { [facet.column]: null };
204
+ if (!unset) return { [facet.column]: { in: set } };
205
+ return { OR: [{ [facet.column]: { in: set } }, { [facet.column]: null }] };
206
+ }
207
+ function and(parts) {
208
+ const present = parts.filter((part) => part !== void 0);
209
+ if (present.length === 0) return void 0;
210
+ return present.length === 1 ? present[0] : { AND: present };
211
+ }
212
+ function where(query) {
213
+ return and([searchWhere(query), ...facets.map((facet) => facetWhere(facet, query.facets[facet.key]))]);
214
+ }
215
+ function args(query) {
216
+ const filter = where(query);
217
+ const paging = cursor ? { after: query.after ?? null } : {
218
+ page: query.page,
219
+ count: config.count ?? "planned"
220
+ };
221
+ return {
222
+ ...filter ? { where: filter } : {},
223
+ orderBy: config.sorts[query.sort],
224
+ size: query.size,
225
+ ...paging
226
+ };
227
+ }
228
+ /** Rows per value of one facet, from its grouped aggregate. */
229
+ function countsOf(facet, groups) {
230
+ const counts = {};
231
+ for (const value of facet.values ?? []) counts[value] = 0;
232
+ for (const group of groups) {
233
+ const raw = group[facet.column];
234
+ const key = raw === null || raw === void 0 ? UNSET : String(raw);
235
+ counts[key] = (counts[key] ?? 0) + Number(group["_count"] ?? 0);
236
+ }
237
+ return counts;
238
+ }
239
+ const listParser = {
240
+ parse: (value) => {
241
+ const values = all(value);
242
+ return values.length > 0 ? values : null;
243
+ },
244
+ serialize: (values) => values.join(",")
245
+ };
246
+ const intParser = {
247
+ parse: (value) => /^\d+$/.test(value) ? Number(value) : null,
248
+ serialize: String
249
+ };
250
+ const parsers = {
251
+ q: {
252
+ parse: (value) => value.trim() || null,
253
+ serialize: (value) => value
254
+ },
255
+ sort: {
256
+ parse: (value) => sortKeys.includes(value) ? value : null,
257
+ serialize: (value) => value
258
+ },
259
+ page: intParser,
260
+ after: {
261
+ parse: (value) => value || null,
262
+ serialize: (value) => value
263
+ },
264
+ size: intParser,
265
+ ...Object.fromEntries(facets.map((facet) => [facet.key, listParser]))
266
+ };
267
+ const facetSchema = (facet) => ({
268
+ type: "array",
269
+ items: {
270
+ type: "string",
271
+ ...facet.values ? { enum: [...facet.values, ...facet.nullable ? [UNSET] : []] } : {}
272
+ },
273
+ uniqueItems: true
274
+ });
275
+ const searchDescription = config.search ? Array.isArray(config.search) ? `Case-insensitive search in ${config.search.join(", ")}.` : "Full-text search (web search syntax)." : void 0;
276
+ const openapi = [
277
+ ...searchDescription ? [{
278
+ name: "q",
279
+ in: "query",
280
+ required: false,
281
+ description: searchDescription,
282
+ schema: {
283
+ type: "string",
284
+ maxLength: maxSearch
285
+ }
286
+ }] : [],
287
+ {
288
+ name: "sort",
289
+ in: "query",
290
+ required: false,
291
+ description: `Ordering. Default \`${config.defaultSort}\`.`,
292
+ schema: {
293
+ type: "string",
294
+ enum: sortKeys,
295
+ default: config.defaultSort
296
+ }
297
+ },
298
+ cursor ? {
299
+ name: "after",
300
+ in: "query",
301
+ required: false,
302
+ description: "`nextCursor` of the previous page. Leave it out for the first page.",
303
+ schema: { type: "string" }
304
+ } : {
305
+ name: "page",
306
+ in: "query",
307
+ required: false,
308
+ description: "1-based page number.",
309
+ schema: {
310
+ type: "integer",
311
+ minimum: 1,
312
+ default: 1
313
+ }
314
+ },
315
+ {
316
+ name: "size",
317
+ in: "query",
318
+ required: false,
319
+ description: "Page size.",
320
+ schema: {
321
+ type: "integer",
322
+ minimum: 1,
323
+ maximum: maxPageSize,
324
+ default: pageSize
325
+ }
326
+ },
327
+ ...facets.map((facet) => ({
328
+ name: facet.key,
329
+ in: "query",
330
+ required: false,
331
+ description: `Filter on ${facet.column}. Comma-separated; any value matches.${facet.nullable ? ` \`${UNSET}\` matches empty.` : ""}`,
332
+ schema: facetSchema(facet),
333
+ style: "form",
334
+ explode: false
335
+ }))
336
+ ];
337
+ const jsonSchema = {
338
+ type: "object",
339
+ additionalProperties: false,
340
+ properties: {
341
+ ...searchDescription ? { q: {
342
+ type: "string",
343
+ maxLength: maxSearch,
344
+ description: searchDescription
345
+ } } : {},
346
+ sort: {
347
+ type: "string",
348
+ enum: sortKeys,
349
+ default: config.defaultSort
350
+ },
351
+ ...cursor ? { after: { type: "string" } } : { page: {
352
+ type: "integer",
353
+ minimum: 1,
354
+ default: 1
355
+ } },
356
+ size: {
357
+ type: "integer",
358
+ minimum: 1,
359
+ maximum: maxPageSize,
360
+ default: pageSize
361
+ },
362
+ ...facets.length > 0 ? { facets: {
363
+ type: "object",
364
+ additionalProperties: false,
365
+ properties: Object.fromEntries(facets.map((facet) => [facet.key, facetSchema(facet)]))
366
+ } } : {}
367
+ }
368
+ };
369
+ return {
370
+ table,
371
+ pagination: config.pagination ?? "offset",
372
+ defaults,
373
+ facets,
374
+ parse,
375
+ schema: { "~standard": {
376
+ version: 1,
377
+ vendor: "better-supabase",
378
+ validate(value) {
379
+ const result = parse(value);
380
+ return result.ok ? { value: result.value } : { issues: result.issues };
381
+ }
382
+ } },
383
+ toSearchParams(query) {
384
+ const params = new URLSearchParams();
385
+ if (query.q) params.set("q", query.q);
386
+ if (query.sort && query.sort !== config.defaultSort) params.set("sort", query.sort);
387
+ if (query.page && query.page !== 1) params.set("page", String(query.page));
388
+ if (query.after) params.set("after", query.after);
389
+ if (query.size !== void 0 && query.size > 0 && query.size !== pageSize) params.set("size", String(query.size));
390
+ for (const facet of facets) {
391
+ const values = query.facets?.[facet.key];
392
+ if (values && values.length > 0) params.set(facet.key, values.join(","));
393
+ }
394
+ return params;
395
+ },
396
+ parsers,
397
+ nuqs: (createParser) => Object.fromEntries(Object.entries(parsers).map(([key, spec]) => [key, createParser(spec)])),
398
+ args,
399
+ run(db, query, extra) {
400
+ const base = args(query);
401
+ const { where: extraWhere, count, select: _select, include: _include, ...options } = extra ?? {};
402
+ const combined = and([extraWhere, base["where"]]);
403
+ const repository = db[table];
404
+ const page = repository.paginate({
405
+ ...extra,
406
+ ...base,
407
+ ...cursor ? {} : { count: count ?? base["count"] },
408
+ ...combined ? { where: combined } : {}
409
+ });
410
+ if (!config.facetCounts) return page;
411
+ if (facets.length === 0) return page.map((data) => ({
412
+ ...data,
413
+ facetCounts: {},
414
+ facetCountsTruncated: []
415
+ }));
416
+ const search = searchWhere(query);
417
+ const counted = facets.map((facet) => {
418
+ const filter = and([
419
+ extraWhere,
420
+ search,
421
+ ...facets.map((other) => other === facet ? void 0 : facetWhere(other, query.facets[other.key]))
422
+ ]);
423
+ return repository.aggregate({
424
+ ...options,
425
+ ...filter ? { where: filter } : {},
426
+ groupBy: [facet.column],
427
+ _count: true,
428
+ orderBy: [{ _count: "desc" }, { [facet.column]: "asc" }],
429
+ limit: facetLimit + 1
430
+ });
431
+ });
432
+ return page.andThen(async (data) => {
433
+ const results = await Promise.all(counted);
434
+ const facetCounts = {};
435
+ const truncated = [];
436
+ for (const [index, facet] of facets.entries()) {
437
+ const result = results[index];
438
+ if (!result.ok) return result;
439
+ const rows = result.data;
440
+ if (rows.length > facetLimit) truncated.push(facet.key);
441
+ facetCounts[facet.key] = countsOf(facet, rows.slice(0, facetLimit));
442
+ }
443
+ return {
444
+ ok: true,
445
+ data: {
446
+ ...data,
447
+ facetCounts,
448
+ facetCountsTruncated: truncated
449
+ },
450
+ error: null
451
+ };
452
+ });
453
+ },
454
+ openapi,
455
+ jsonSchema
456
+ };
457
+ }
458
+ //#endregion
459
+ export { defineListQuery as n, UNSET as t };
@@ -1,16 +1,43 @@
1
1
  import { REALTIME_SUBSCRIBE_STATES } from "@supabase/supabase-js";
2
+ //#region src/realtime/auth.ts
3
+ /**
4
+ * Hands the client's access token to Realtime before a private join,
5
+ * unless the app set one itself with `realtime.setAuth(token)`. A bare
6
+ * `setAuth()` replaces such a token with the session's, so a client that
7
+ * joins with a token minted for Realtime (a service or agent token) keeps it.
8
+ * realtime-js versions without the manual-token check always refresh.
9
+ */
10
+ async function refreshRealtimeAuth(client) {
11
+ if (manualToken(client.realtime)) return;
12
+ await client.realtime.setAuth();
13
+ }
14
+ /** Whether realtime-js says the token came from `setAuth(token)`. */
15
+ function manualToken(realtime) {
16
+ if (!("_isManualToken" in realtime)) return false;
17
+ const check = realtime._isManualToken;
18
+ return typeof check === "function" && check.call(realtime) === true;
19
+ }
20
+ //#endregion
2
21
  //#region src/realtime/live.ts
3
- /** Topic a `realtime-tables` trigger broadcasts on: `bs:t:<schema>.<table>[:<tenant>]`. */
4
- function liveTopic(meta, table, tenant) {
22
+ /**
23
+ * Topic a `realtime-tables` trigger broadcasts on:
24
+ * `bs:t:<schema>.<table>[:<tenant>]`, or `bs:t:<schema>.<table>:u:<user>`
25
+ * for a `realtime.users` table.
26
+ */
27
+ function liveTopic(meta, table, tenant, user) {
5
28
  const found = meta.tables[table];
6
29
  if (!found) throw new TypeError(`better-supabase: unknown table "${table}"`);
7
30
  const base = `bs:t:${found.schema}.${found.name}`;
31
+ if (meta.realtime?.[table]?.user) {
32
+ if (user === void 0) throw new TypeError(`better-supabase: "${table}" broadcasts per user; pass \`user\` to watch it`);
33
+ return `${base}:u:${user}`;
34
+ }
8
35
  if (!meta.realtime?.[table]?.tenant) return base;
9
36
  if (tenant === void 0) throw new TypeError(`better-supabase: "${table}" broadcasts per tenant; pass \`tenant\` to watch it`);
10
37
  return `${base}:${tenant}`;
11
38
  }
12
39
  const channels = /* @__PURE__ */ new WeakMap();
13
- function join(client, topic, listener) {
40
+ function join(client, topic, listener, onStatus) {
14
41
  let byTopic = channels.get(client);
15
42
  if (!byTopic) {
16
43
  byTopic = /* @__PURE__ */ new Map();
@@ -20,17 +47,26 @@ function join(client, topic, listener) {
20
47
  if (!shared) {
21
48
  const channel = client.channel(topic, { config: { private: true } });
22
49
  const listeners = /* @__PURE__ */ new Set();
50
+ const statuses = /* @__PURE__ */ new Set();
23
51
  channel.on("broadcast", { event: "change" }, () => {
24
52
  for (const notify of listeners) notify();
25
53
  });
26
54
  let joined = false;
55
+ const evict = () => {
56
+ if (byTopic.get(topic) !== entry) return;
57
+ byTopic.delete(topic);
58
+ client.removeChannel(channel);
59
+ };
27
60
  const ready = (async () => {
28
- await client.realtime.setAuth();
61
+ await refreshRealtimeAuth(client);
29
62
  await new Promise((resolve, reject) => {
30
63
  channel.subscribe((status, error) => {
31
64
  switch (status) {
32
65
  case REALTIME_SUBSCRIBE_STATES.SUBSCRIBED:
33
- if (joined) for (const notify of listeners) notify();
66
+ if (joined) {
67
+ for (const notify of listeners) notify();
68
+ for (const notify of statuses) notify("subscribed");
69
+ }
34
70
  joined = true;
35
71
  resolve();
36
72
  return;
@@ -38,24 +74,31 @@ function join(client, topic, listener) {
38
74
  resolve();
39
75
  return;
40
76
  case REALTIME_SUBSCRIBE_STATES.CHANNEL_ERROR:
41
- case REALTIME_SUBSCRIBE_STATES.TIMED_OUT:
42
- reject(error ?? /* @__PURE__ */ new Error(`Realtime ${status.toLowerCase()} on ${topic}`));
77
+ case REALTIME_SUBSCRIBE_STATES.TIMED_OUT: {
78
+ const failure = error ?? /* @__PURE__ */ new Error(`Realtime ${status.toLowerCase()} on ${topic}`);
79
+ if (joined) for (const notify of statuses) notify("error", failure);
80
+ reject(failure);
81
+ if (!joined) evict();
43
82
  return;
83
+ }
44
84
  default: reject(/* @__PURE__ */ new Error(`Unknown realtime status ${String(status)}`));
45
85
  }
46
86
  });
47
87
  });
48
88
  })();
49
89
  ready.catch(() => void 0);
50
- shared = {
90
+ const entry = {
51
91
  channel,
52
92
  listeners,
93
+ statuses,
53
94
  ready
54
95
  };
55
- byTopic.set(topic, shared);
96
+ shared = entry;
97
+ byTopic.set(topic, entry);
56
98
  }
57
99
  const current = shared;
58
100
  current.listeners.add(listener);
101
+ if (onStatus) current.statuses.add(onStatus);
59
102
  let left = false;
60
103
  return {
61
104
  ready: current.ready,
@@ -63,6 +106,7 @@ function join(client, topic, listener) {
63
106
  if (left) return;
64
107
  left = true;
65
108
  current.listeners.delete(listener);
109
+ if (onStatus) current.statuses.delete(onStatus);
66
110
  if (current.listeners.size > 0) return;
67
111
  await new Promise((resolve) => {
68
112
  setTimeout(resolve, 0);
@@ -98,24 +142,60 @@ function liveQuery(betterSupabase, client, spec, options) {
98
142
  changed.clear();
99
143
  options.onChange(batch);
100
144
  };
101
- const memberships = tables.map((table) => join(client, liveTopic(betterSupabase.meta, table, options.tenant), () => {
145
+ const onTableChange = (table) => () => {
102
146
  changed.add(table);
103
147
  if (timer !== void 0) clearTimeout(timer);
104
148
  timer = setTimeout(flush, debounceMs);
149
+ };
150
+ const failed = /* @__PURE__ */ new Set();
151
+ const onChannelStatus = (topic) => (status, error) => {
152
+ if (closed) return;
153
+ if (status === "error") failed.add(topic);
154
+ else failed.delete(topic);
155
+ if (status === "error") options.onStatus?.("error", error);
156
+ else if (failed.size === 0) options.onStatus?.("subscribed");
157
+ };
158
+ const topics = tables.map((table) => ({
159
+ table,
160
+ topic: liveTopic(betterSupabase.meta, table, options.tenant, options.user)
105
161
  }));
106
- options.onStatus?.(tables.length === 0 ? "closed" : "joining");
107
- const ready = Promise.all(memberships.map((member) => member.ready)).then(() => {
162
+ const joinAll = () => topics.map(({ table, topic }) => join(client, topic, onTableChange(table), onChannelStatus(topic)));
163
+ let memberships = joinAll();
164
+ let retryTimer;
165
+ let delay = 1e3;
166
+ const settle = (attempt) => Promise.all(attempt.map((member) => member.ready)).then(() => {
108
167
  if (!closed && tables.length > 0) options.onStatus?.("subscribed");
109
168
  }, (cause) => {
110
169
  const error = cause instanceof Error ? cause : new Error(String(cause));
111
- options.onStatus?.("error", error);
170
+ if (!closed) {
171
+ options.onStatus?.("error", error);
172
+ if (options.retry !== false) scheduleRetry(attempt);
173
+ }
112
174
  throw error;
113
175
  });
176
+ const scheduleRetry = (attempt) => {
177
+ retryTimer = setTimeout(() => {
178
+ retryTimer = void 0;
179
+ if (closed || attempt !== memberships) return;
180
+ Promise.all(attempt.map((member) => member.leave()));
181
+ memberships = joinAll();
182
+ options.onStatus?.("joining");
183
+ settle(memberships).then(() => {
184
+ if (closed) return;
185
+ for (const table of tables) changed.add(table);
186
+ flush();
187
+ }, () => void 0);
188
+ }, delay);
189
+ delay = Math.min(delay * 2, 3e4);
190
+ };
191
+ options.onStatus?.(tables.length === 0 ? "closed" : "joining");
192
+ const ready = settle(memberships);
114
193
  ready.catch(() => void 0);
115
194
  const unsubscribe = async () => {
116
195
  if (closed) return;
117
196
  closed = true;
118
197
  if (timer !== void 0) clearTimeout(timer);
198
+ if (retryTimer !== void 0) clearTimeout(retryTimer);
119
199
  await Promise.all(memberships.map((member) => member.leave()));
120
200
  options.onStatus?.("closed");
121
201
  };
@@ -153,10 +233,15 @@ function liveCount(betterSupabase, client, db, spec, options) {
153
233
  const live = liveQuery(betterSupabase, client, spec, {
154
234
  onChange: refetch,
155
235
  ...options.tenant === void 0 ? {} : { tenant: options.tenant },
236
+ ...options.user === void 0 ? {} : { user: options.user },
156
237
  ...options.debounceMs === void 0 ? {} : { debounceMs: options.debounceMs },
157
238
  ...options.onStatus ? { onStatus: options.onStatus } : {}
158
239
  });
159
240
  if (options.immediate ?? true) refetch();
241
+ const since = options.since;
242
+ if (since !== void 0) live.ready.then(() => {
243
+ if (!closed && Date.now() - since > 1e3) refetch();
244
+ }, () => void 0);
160
245
  const unsubscribe = async () => {
161
246
  closed = true;
162
247
  await live.unsubscribe();
@@ -169,4 +254,4 @@ function liveCount(betterSupabase, client, db, spec, options) {
169
254
  };
170
255
  }
171
256
  //#endregion
172
- export { liveQuery as n, liveTopic as r, liveCount as t };
257
+ export { refreshRealtimeAuth as i, liveQuery as n, liveTopic as r, liveCount as t };
@@ -0,0 +1,18 @@
1
+ //#region src/core/logger.d.ts
2
+ type LogFields = Readonly<Record<string, unknown>>;
3
+ /**
4
+ * Where better-supabase reports problems it swallows on purpose: event
5
+ * handlers, `afterMutation` hooks, sinks and cache adapters that throw.
6
+ * Structured loggers (pino, consola, OpenTelemetry logs) fit directly.
7
+ */
8
+ interface Logger {
9
+ debug(message: string, fields?: LogFields): void;
10
+ info(message: string, fields?: LogFields): void;
11
+ warn(message: string, fields?: LogFields): void;
12
+ error(message: string, fields?: LogFields): void;
13
+ }
14
+ /** The default: `console`, with a `better-supabase:` prefix. */
15
+ declare const consoleLogger: Logger;
16
+ declare const silentLogger: Logger;
17
+ //#endregion
18
+ export { silentLogger as i, Logger as n, consoleLogger as r, LogFields as t };