better-supabase 0.5.0 → 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 +299 -41
  2. package/dist/access-sql-B0dF-SoF.js +181 -0
  3. package/dist/actor-CQTlc1Hh.d.ts +43 -0
  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-L7Z8mYTx.js → doctor-B4JOm_ox.js} +992 -316
  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-Saf5-R9T.js → init-BIIwclPg.js} +242 -27
  185. package/dist/cli/{introspect--H7oGmcd.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-BKR2W_79.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-BDJuO0UR.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-T_ejwyd3.d.ts → config-D44Y7PAv.d.ts} +406 -205
  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-BTrQ_ZTp.d.ts → ended-jLfvw8h-.d.ts} +20 -2
  231. package/dist/{entitlements-DUxU4oHe.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-DcqaTBHx.js +148 -0
  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-CusDgPaD.d.ts → mfa-Daak8ukG.d.ts} +8 -2
  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-Bq64ki8-.js → resolve-D_IcnvFd.js} +239 -289
  385. package/dist/{resolve-C15TJq77.d.ts → resolve-KW8nCeL6.d.ts} +29 -45
  386. package/dist/{resource-CRxxwkQq.js → resource-BsvzCMlX.js} +4 -4
  387. package/dist/{resource-D8iqWMr-.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 -21
  396. package/dist/server/index.js +46 -14
  397. package/dist/{respond-D2OQl62-.d.ts → server-CeVeeXwz.d.ts} +225 -80
  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 +330 -194
  413. package/dist/sql/index.js +34901 -6489
  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-Dk6vdmEw.js → support-BivNqSpK.js} +35 -12
  430. package/dist/{support-view-Da5peKFg.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 +343 -37
  449. package/dist/testing/index.js +1186 -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-DM_Roffb.js → version-Bvv6aLjZ.js} +1 -1
  465. package/dist/view-BeFcRV6G.js +99 -0
  466. package/dist/{view-BEf0diC5.d.ts → view-DbxLNu8L.d.ts} +35 -32
  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 +470 -29
  485. package/schemas/ai-message-v1.json +258 -0
  486. package/schemas/config-v1.json +1074 -140
  487. package/schemas/doctor-report-v1.json +21 -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 +62 -18
  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-BJc9vdyu.js +0 -2
  504. package/dist/cli/gen-C2osRcr5.js +0 -2204
  505. package/dist/cli/read-sets-BfMQcKy8.js +0 -289
  506. package/dist/cli/sql-DzPbfngx.js +0 -348
  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/impersonation-VfaGc4Q_.js +0 -41
  512. package/dist/index-BGdgBPdf.d.ts +0 -161
  513. package/dist/index-DOESKG27.d.ts +0 -100
  514. package/dist/index-DmXSxbLi.d.ts +0 -62
  515. package/dist/index-Dxn2a5cw.d.ts +0 -50
  516. package/dist/jobs/index.d.ts +0 -226
  517. package/dist/jobs/index.js +0 -1007
  518. package/dist/json-schema-m1fiwKgN.js +0 -208
  519. package/dist/kit-events-CTFDfSwb.js +0 -60
  520. package/dist/kit-transport-B82k1djG.d.ts +0 -33
  521. package/dist/kits-CGLLrNPd.js +0 -157
  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-Csx2sRjg.js +0 -655
  530. package/dist/stats-Bqob3WqT.js +0 -592
  531. package/dist/support-DT-OhSxD.d.ts +0 -88
  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 -100
@@ -0,0 +1,536 @@
1
+ import { r as defineCliCommand } from "./command-CK14fP91.js";
2
+ import { i as writeIfChanged, r as sameText, t as display } from "./io-DI1mTdSA.js";
3
+ import { i as plain, r as painter } from "./style-C0NFdJRL.js";
4
+ import { a as entitlementsMode, n as accessProviderMode, o as moduleKeyProblems, s as providerLabel, t as compiledReadSets } from "./read-sets-CETOSFx4.js";
5
+ import { t as importFresh } from "./fresh-import-BeYf9I3x.js";
6
+ import { c as migrationCommand, d as schemaPaths, n as declarativeSchemasDir, u as readSupabaseToml } from "./supabase-toml-B-bIukQF.js";
7
+ import { t as fileDiff } from "./diff-SjkO5rNr.js";
8
+ import { dirname, join, relative, resolve, sep } from "node:path";
9
+ import { existsSync } from "node:fs";
10
+ import { readFile, readdir, rm } from "node:fs/promises";
11
+ import { SQL_MODULES, adoptedColumnProblems, auditRegistrations, contractSignature, customContracts, declaredTables, extensionSchema, moduleBody, moduleFilePaths, moduleFileVersion, moduleLayout, modulePermissionKeys, moduleSchemaExtensions, moduleTopics, policyGrants, renderModules, resolveModules, sameModuleFile, upgradePlan } from "better-supabase/sql";
12
+ //#region src/cli/topic-policies.ts
13
+ const isTopic = (value) => typeof value === "object" && value !== null && "template" in value && typeof value.template === "string" && "sql" in value && typeof value.sql === "function" && "triggerSql" in value;
14
+ const literalParts = (template) => template.replaceAll(/\{[^}]+\}/g, "{}");
15
+ const owns = (owned, template) => owned.endsWith("*") ? template.startsWith(owned.slice(0, -1)) : literalParts(owned) === literalParts(template);
16
+ const receivesOnly = (sql) => !sql.includes(" for insert ") && !sql.includes("'presence'");
17
+ /** The file `realtime.policies` writes, or `undefined` when it isn't set. */
18
+ async function topicPolicyFile(config, owned = []) {
19
+ const policies = config.realtime.policies;
20
+ if (policies === void 0) return void 0;
21
+ const topics = [];
22
+ for (const entry of policies.from) {
23
+ const loaded = await importFresh(resolve(config.root, entry));
24
+ const found = Object.values(loaded).filter(isTopic);
25
+ if (found.length === 0) throw new Error(`${entry} exports no topic (defineTopic)`);
26
+ for (const topic of found) if (!topics.includes(topic)) topics.push(topic);
27
+ }
28
+ topics.sort((a, b) => a.template < b.template ? -1 : a.template > b.template ? 1 : 0);
29
+ const functions = config.authorization?.functions;
30
+ const sqlOf = (topic) => topic.sql(functions === void 0 ? void 0 : { functions });
31
+ const skipped = [];
32
+ const written = topics.filter((topic) => {
33
+ const owner = owned.find((entry) => owns(entry.topic, topic.template));
34
+ if (owner === void 0 || !receivesOnly(sqlOf(topic))) return true;
35
+ skipped.push(`-- Skipped topic ${topic.template}: the ${owner.module} module writes its receive policy.`);
36
+ return false;
37
+ });
38
+ const header = [
39
+ "-- better-supabase: realtime topic policies",
40
+ `-- Written by \`better-supabase sql sync\` from ${policies.from.join(", ")}; edit the topics, not this file.`,
41
+ ...skipped
42
+ ].join("\n");
43
+ return {
44
+ path: policies.output,
45
+ contents: `${header}\n\n${written.map(sqlOf).join("\n")}`
46
+ };
47
+ }
48
+ //#endregion
49
+ //#region src/cli/commands/sql.ts
50
+ const SQL_ARGS = {
51
+ action: {
52
+ type: "positional",
53
+ required: false,
54
+ description: "list (modules and whether they are installed), add <module...>, sync, upgrade, data (a migration with the rows a schema diff skips) or print <module>"
55
+ },
56
+ check: {
57
+ type: "boolean",
58
+ description: "With sync: fail when a file is stale. With upgrade: fail when a module is behind"
59
+ },
60
+ "tests-dir": {
61
+ type: "string",
62
+ description: "Where the pgtap module goes. Defaults to sql.testsDir",
63
+ valueHint: "dir"
64
+ },
65
+ "dry-run": {
66
+ type: "boolean",
67
+ description: "Show what would be written"
68
+ },
69
+ force: {
70
+ type: "boolean",
71
+ description: "Write tenant even though the authorization provider's hook owns the memberships claim"
72
+ }
73
+ };
74
+ const USAGE = "Run `better-supabase sql --help` for the actions.";
75
+ /** Modules that fill the `memberships` claim, which a provider's hook may own. */
76
+ const MEMBERSHIP_CLAIM_MODULES = /* @__PURE__ */ new Set(["tenant"]);
77
+ /** Whether the provider's access token hook writes the `memberships` claim itself. */
78
+ const providerOwnsMemberships = (config) => config.authorization?.tokenHook?.ownedClaims.includes("memberships") ?? false;
79
+ /**
80
+ * The provider's memberships for the `entitlements` module. When `names`
81
+ * resolve to that module, an invalid mode (no provider, a scope it lacks,
82
+ * an unknown id type) throws instead of falling back to the tenant module.
83
+ * Without `names` (`sql list`) it only describes the modules, so it doesn't.
84
+ */
85
+ function entitlementsProviderFor(config, names) {
86
+ const mode = entitlementsMode(config);
87
+ switch (mode.kind) {
88
+ case "tenant": return;
89
+ case "provider": return mode.provider;
90
+ case "invalid":
91
+ if (names === void 0 || !resolveModules(names, {}).some((module) => module.name === "entitlements")) return void 0;
92
+ throw new TypeError(mode.problem);
93
+ default: return mode;
94
+ }
95
+ }
96
+ /**
97
+ * The provider for the `access` module's `provider` model. When `names`
98
+ * resolve to `access`, an invalid mode throws, and so does a module
99
+ * permission key the provider doesn't mark `sqlComplete: true`. `sql list`
100
+ * (no `names`) doesn't render, so it doesn't throw.
101
+ */
102
+ function accessProviderFor(config, names) {
103
+ const mode = accessProviderMode(config);
104
+ const renders = names !== void 0 && resolveModules(names, {}).some((module) => module.name === "access");
105
+ switch (mode.kind) {
106
+ case "off": return;
107
+ case "provider": {
108
+ if (!renders || !config.authorization) return mode.access;
109
+ const problems = moduleKeyProblems(config.authorization, modulePermissionKeys(config.sql.modules, names));
110
+ if (problems.length > 0) throw new TypeError(problems.map((problem) => problem.message).join("\n"));
111
+ return mode.access;
112
+ }
113
+ case "invalid":
114
+ if (!renders) return void 0;
115
+ throw new TypeError(mode.problem);
116
+ default: return mode;
117
+ }
118
+ }
119
+ /** The provider's permission keys, for `api-keys` scopes. */
120
+ const permissionKeysFor = (config) => config.authorization?.permissions?.map((permission) => permission.key);
121
+ async function layout(config, args, names) {
122
+ return {
123
+ ...moduleLayout(config, args["tests-dir"], [], entitlementsProviderFor(config, names), accessProviderFor(config, names), permissionKeysFor(config)),
124
+ schemasDir: declarativeSchemasDir(await readSupabaseToml(config.root))
125
+ };
126
+ }
127
+ /** The declarative schema files, then the migrations oldest first. */
128
+ async function schemaTexts(config) {
129
+ const toml = await readSupabaseToml(config.root);
130
+ const migrations = resolve(config.root, migrationsDir(config));
131
+ const paths = [...(await schemaPaths(config.root, toml)).files, ...existsSync(migrations) ? (await readdir(migrations)).filter((name) => name.endsWith(".sql")).toSorted().map((name) => join(migrations, name)) : []];
132
+ return Promise.all(paths.map(async (path) => ({ text: await readFile(resolve(config.root, path), "utf8") })));
133
+ }
134
+ async function declarativeTexts(config) {
135
+ const { files } = await schemaPaths(config.root, await readSupabaseToml(config.root));
136
+ if (files.length === 0) return schemaTexts(config);
137
+ return Promise.all(files.map(async (path) => ({ text: await readFile(resolve(config.root, path), "utf8") })));
138
+ }
139
+ /**
140
+ * The `better_supabase.audit(...)` calls in the declarative schemas, then
141
+ * the migrations oldest first, so a later call or `unaudit` wins.
142
+ */
143
+ async function auditedTables(config) {
144
+ return auditRegistrations(await schemaTexts(config));
145
+ }
146
+ /**
147
+ * The layout, with `config.readSets` compiled when `names` includes
148
+ * `read-sets` and the audited tables when it includes `audit`.
149
+ */
150
+ async function layoutFor(config, args, names) {
151
+ const entitlementsProvider = entitlementsProviderFor(config, names);
152
+ const resolved = new Set(resolveModules(names, { ...entitlementsProvider ? { entitlementsProvider } : {} }).map((module) => module.name));
153
+ const adopted = adoptedColumnProblems(config.sql.modules, await declarativeTexts(config), config.schemas);
154
+ if (adopted.length > 0) throw new TypeError(adopted.join("\n"));
155
+ return {
156
+ ...moduleLayout(config, args["tests-dir"], resolved.has("read-sets") ? await compiledReadSets(config) : [], entitlementsProvider, accessProviderFor(config, names), permissionKeysFor(config)),
157
+ schemasDir: declarativeSchemasDir(await readSupabaseToml(config.root)),
158
+ ...resolved.has("audit") ? { auditedTables: await auditedTables(config) } : {},
159
+ ...resolved.has("vector-search") ? vectorSchemaOf(await schemaTexts(config)) : {},
160
+ ...resolved.has("grants") && config.sql.modules["grants"]?.options?.["fromPolicies"] === true ? { policyGrants: policyGrants(await declarativeTexts(config), config.schemas) } : {},
161
+ ...resolved.has("sessions") && config.sql.modules["sessions"]?.options?.["policies"] === true ? { declaredTables: declaredTables(await declarativeTexts(config), config.schemas) } : {}
162
+ };
163
+ }
164
+ function vectorSchemaOf(sources) {
165
+ const schema = extensionSchema(sources, "vector");
166
+ return schema === void 0 ? {} : { vectorSchema: schema };
167
+ }
168
+ const MODULE_TEST_MARKER = /^-- @bs-module-test ([a-z0-9-]+)$/m;
169
+ /**
170
+ * Test files a SQL module wrote for an earlier layout (a table that is no
171
+ * longer audited), for the modules in `names`.
172
+ */
173
+ async function staleModuleTests(config, names, sqlLayout, files) {
174
+ const dir = (sqlLayout.testsDir ?? "supabase/tests").replace(/\/$/, "");
175
+ const entries = await readdir(resolve(config.root, dir)).catch(() => []);
176
+ const current = new Set(files.map((file) => file.path));
177
+ const modules = new Set(resolveModules(names, sqlLayout).map((module) => module.name));
178
+ const stale = [];
179
+ for (const name of entries.toSorted()) {
180
+ const path = `${dir}/${name}`;
181
+ if (!name.endsWith(".test.sql") || current.has(path)) continue;
182
+ const text = await readFile(resolve(config.root, path), "utf8");
183
+ const module = MODULE_TEST_MARKER.exec(text)?.[1];
184
+ if (module !== void 0 && modules.has(module)) stale.push(path);
185
+ }
186
+ return stale;
187
+ }
188
+ /**
189
+ * The migrations folder next to the `config.toml` found walking up from
190
+ * `sql.dir`, relative to the root; `supabase/migrations` without one. The
191
+ * walk stops where `sql.dir` and the root meet, so a `sql.dir` outside the
192
+ * project (a shared stack in a monorepo) finds that stack's folder.
193
+ */
194
+ function migrationsDir(config) {
195
+ const root = resolve(config.root);
196
+ let dir = resolve(root, config.sql.dir);
197
+ let stop = root;
198
+ while (dir !== stop && !dir.startsWith(stop + sep) && dirname(stop) !== stop) stop = dirname(stop);
199
+ for (;;) {
200
+ if (existsSync(join(dir, "config.toml"))) return relative(root, join(dir, "migrations")).replaceAll("\\", "/");
201
+ if (dir === stop || dirname(dir) === dir) break;
202
+ dir = dirname(dir);
203
+ }
204
+ return "supabase/migrations";
205
+ }
206
+ /** `YYYYMMDDHHMMSS` in UTC, the Supabase CLI's migration prefix. */
207
+ const migrationStamp = (now) => now.toISOString().replaceAll(/[-:T]/g, "").slice(0, 14);
208
+ /**
209
+ * A stamp for `now`, or one second after the newest migration when that one
210
+ * has the same stamp or a later one: the Supabase CLI keys migrations by
211
+ * stamp, and the data has to run after the schema.
212
+ */
213
+ function stampAfter(migrations, now) {
214
+ const newest = migrations.map((name) => /^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(?!\d)/.exec(name)).filter((match) => match !== null).map((match) => Date.UTC(Number(match[1]), Number(match[2]) - 1, Number(match[3]), Number(match[4]), Number(match[5]), Number(match[6]))).reduce((max, time) => Math.max(max, time), Number.NEGATIVE_INFINITY);
215
+ const at = Math.floor(now.getTime() / 1e3) * 1e3;
216
+ return migrationStamp(new Date(Math.max(at, newest + 1e3)));
217
+ }
218
+ async function write(config, args, names, sqlLayout, only) {
219
+ const lines = [];
220
+ const dryRun = args["dry-run"] === true;
221
+ let data = false;
222
+ const files = renderModules(names, sqlLayout).filter((file) => only === void 0 || only.includes(file.module));
223
+ for (const path of await staleModuleTests(config, only ?? names, sqlLayout, files)) {
224
+ const shown = display(config.root, path);
225
+ if (dryRun) {
226
+ lines.push(`Would remove ${shown}`);
227
+ continue;
228
+ }
229
+ await rm(resolve(config.root, path));
230
+ lines.push(`Removed ${shown}`);
231
+ }
232
+ for (const file of files) {
233
+ const path = resolve(config.root, file.path);
234
+ const shown = display(config.root, file.path);
235
+ if (dryRun) {
236
+ lines.push(`Would write ${shown} (${file.module})`);
237
+ continue;
238
+ }
239
+ const wrote = await writeIfChanged(path, file.contents);
240
+ if (wrote && file.kind === "data") data = true;
241
+ lines.push(`${wrote ? "Wrote" : "Unchanged"} ${shown} (${file.module})`);
242
+ }
243
+ lines.push(...await writeExtensionsMigration(config, files, dryRun));
244
+ if (data) lines.push("", DATA_NEXT);
245
+ return lines;
246
+ }
247
+ const EXTENSIONS_SUFFIX = "_better_supabase_extensions.sql";
248
+ const MIGRATION_EXTENSION = /^\s*create\s+extension\s+(?:if\s+not\s+exists\s+)?"?([a-z_][a-z0-9_]*)"?/gim;
249
+ async function unmigratedExtensions(config, files) {
250
+ const dir = migrationsDir(config);
251
+ const existing = await readdir(resolve(config.root, dir)).catch(() => []);
252
+ const created = /* @__PURE__ */ new Set();
253
+ for (const name of existing) {
254
+ if (!name.endsWith(".sql") || name.endsWith(DATA_SUFFIX)) continue;
255
+ const text = await readFile(resolve(config.root, dir, name), "utf8");
256
+ for (const match of text.matchAll(MIGRATION_EXTENSION)) created.add(match[1].toLowerCase());
257
+ }
258
+ return {
259
+ dir,
260
+ existing,
261
+ missing: moduleSchemaExtensions(files).filter((extension) => !created.has(extension.name))
262
+ };
263
+ }
264
+ async function writeExtensionsMigration(config, files, dryRun) {
265
+ const { dir, existing, missing } = await unmigratedExtensions(config, files);
266
+ if (missing.length === 0) return [];
267
+ const path = `${dir}/${stampAfter(existing, /* @__PURE__ */ new Date(Date.now() - 1e3))}${EXTENSIONS_SUFFIX}`;
268
+ if (dryRun) return [`Would write ${path}`];
269
+ await writeIfChanged(resolve(config.root, path), `-- better-supabase sql: the extensions of ${missing.map((extension) => extension.name).join(", ")}, created before the schema migration that needs them.\n\n${missing.map((extension) => extension.statement).join("\n")}\n`);
270
+ return [`Wrote ${path}`, "It creates the extensions the module schemas need, so create the schema migration after it."];
271
+ }
272
+ const DATA_NEXT = "The better-supabase-data files hold rows and settings a schema diff skips: after the schema migration, run `better-supabase sql data`.";
273
+ const DATA_SUFFIX = "_better_supabase_module_data.sql";
274
+ /**
275
+ * Writes the data files of `sql.modules` into one migration, meant to run after
276
+ * the schema migration that creates their tables. Every statement is
277
+ * idempotent, so the migration carries all of them, not only the changes.
278
+ */
279
+ async function dataMigration(config, args) {
280
+ if (config.sql.moduleNames.length === 0) return {
281
+ code: 0,
282
+ output: "sql.modules is empty; nothing to write."
283
+ };
284
+ const rendered = renderModules(config.sql.moduleNames, await layoutFor(config, args, config.sql.moduleNames));
285
+ const { missing } = await unmigratedExtensions(config, rendered);
286
+ if (missing.length > 0) return {
287
+ code: 1,
288
+ error: [`No migration before the data migration creates ${missing.map((extension) => extension.name).join(", ")}, and the schema migration needs ${missing.length === 1 ? "it" : "them"} while it applies.`, "Run `better-supabase sql sync` to write the extensions migration, then create the schema migration again after it."].join("\n")
289
+ };
290
+ const files = rendered.filter((file) => file.kind === "data");
291
+ const contents = `-- better-supabase sql data: the rows and settings of ${files.map((file) => file.module).join(", ")}, which a schema diff skips.\n\n${files.map((file) => file.contents.trim()).join("\n\n")}\n`;
292
+ const dir = migrationsDir(config);
293
+ const existing = await readdir(resolve(config.root, dir)).catch(() => []);
294
+ const latest = existing.toSorted().findLast((name) => name.endsWith(DATA_SUFFIX));
295
+ if (latest !== void 0 && await readFile(resolve(config.root, dir, latest), "utf8") === contents) return {
296
+ code: 0,
297
+ output: `${dir}/${latest} already has these rows; nothing to write.`
298
+ };
299
+ const path = `${dir}/${stampAfter(existing, /* @__PURE__ */ new Date())}${DATA_SUFFIX}`;
300
+ if (args["dry-run"] === true) return {
301
+ code: 0,
302
+ output: `Would write ${path}`
303
+ };
304
+ await writeIfChanged(resolve(config.root, path), contents);
305
+ return {
306
+ code: 0,
307
+ output: `Wrote ${path}`
308
+ };
309
+ }
310
+ /** A note when migra's `schema_paths` is set and misses module files, which `supabase db diff` would then skip. */
311
+ async function unlistedModuleFiles(config, names, sqlLayout) {
312
+ const toml = await readSupabaseToml(config.root);
313
+ const order = await schemaPaths(config.root, toml);
314
+ if (!order.configured) return [];
315
+ const supabase = `${toml?.dir ?? "supabase"}/`;
316
+ const unlisted = new Set(order.unlisted);
317
+ const listed = new Set(order.files.filter((path) => !unlisted.has(path)));
318
+ const dir = `${config.sql.dir.replace(/\/$/, "")}/`;
319
+ const missing = renderModules(names, sqlLayout).filter((file) => file.kind !== "data").map((file) => file.path).filter((path) => path.startsWith(dir) && !listed.has(path));
320
+ if (missing.length === 0) return [];
321
+ return [
322
+ "",
323
+ `${toml?.path ?? "supabase/config.toml"} sets [db.migrations] schema_paths, and no entry matches these files, so \`supabase db diff\` skips them.`,
324
+ "Add them before the schemas that call their functions:",
325
+ ...missing.map((path) => ` "./${path.startsWith(supabase) ? path.slice(supabase.length) : path}",`),
326
+ "Or switch to pg-delta, which orders the files by dependency: add [experimental.pgdelta] with enabled = true and remove schema_paths (doctor BS316)."
327
+ ];
328
+ }
329
+ /**
330
+ * Rewrites the module files of modules behind the current version, and writes
331
+ * their upgrade steps (renames, backfills) as a migration that runs before
332
+ * the one the schema diff creates.
333
+ */
334
+ async function upgrade(config, args, paint) {
335
+ if (config.sql.moduleNames.length === 0) return {
336
+ code: 0,
337
+ output: "sql.modules is empty; nothing to upgrade."
338
+ };
339
+ const sqlLayout = await layoutFor(config, args, config.sql.moduleNames);
340
+ const files = renderModules(config.sql.moduleNames, sqlLayout);
341
+ const installed = [];
342
+ const stale = [];
343
+ const diffs = [];
344
+ for (const file of files) {
345
+ if (file.kind === "data") continue;
346
+ if (file.kind === "test" && SQL_MODULES[file.module]?.target !== "test") continue;
347
+ const current = await readFile(resolve(config.root, file.path), "utf8").catch(() => void 0);
348
+ if (current === void 0) continue;
349
+ installed.push({
350
+ module: file.module,
351
+ version: moduleFileVersion(current)?.version ?? 1
352
+ });
353
+ if (!sameModuleFile(current, file.contents)) {
354
+ stale.push(file);
355
+ diffs.push(fileDiff(display(config.root, file.path), current, file.contents, paint));
356
+ }
357
+ }
358
+ const plan = upgradePlan(installed, sqlLayout);
359
+ const behind = plan.map((entry) => `${entry.module} is at version ${String(entry.from)}; the current version is ${String(entry.to)}`);
360
+ if (args.check === true) {
361
+ if (plan.length === 0 && stale.length === 0) return {
362
+ code: 0,
363
+ output: "SQL modules are at their current versions."
364
+ };
365
+ return {
366
+ code: 1,
367
+ output: diffs.join("\n\n"),
368
+ error: [
369
+ ...behind,
370
+ ...stale.length > 0 ? [`Out of date: ${stale.map((file) => display(config.root, file.path)).join(", ")}.`] : [],
371
+ "Run `better-supabase sql upgrade`."
372
+ ].join("\n")
373
+ };
374
+ }
375
+ if (plan.length === 0 && stale.length === 0) return {
376
+ code: 0,
377
+ output: "SQL modules are at their current versions."
378
+ };
379
+ const lines = [];
380
+ const steps = plan.flatMap((entry) => entry.steps.filter((step) => step.sql !== "").map((step) => `-- ${entry.module}: version ${String(step.from)} to ${String(step.from + 1)}. ${step.description}\n${step.sql}`));
381
+ const dryRun = args["dry-run"] === true;
382
+ if (steps.length > 0) {
383
+ const path = `${migrationsDir(config)}/${migrationStamp(/* @__PURE__ */ new Date())}_better_supabase_block_upgrade.sql`;
384
+ const contents = `-- better-supabase sql upgrade: steps that run before the schema diff.\n\n${steps.join("\n\n")}\n`;
385
+ if (dryRun) lines.push(`Would write ${path}`);
386
+ else {
387
+ await writeIfChanged(resolve(config.root, path), contents);
388
+ lines.push(`Wrote ${path}`);
389
+ }
390
+ }
391
+ for (const entry of plan) lines.push(`${entry.module}: version ${String(entry.from)} to ${String(entry.to)}`, ...entry.steps.map((step) => ` ${step.description}`));
392
+ lines.push(...await write(config, args, config.sql.moduleNames, sqlLayout), "", `Then create a migration: ${migrationCommand(await readSupabaseToml(config.root), "better_supabase_module")}`);
393
+ return {
394
+ code: 0,
395
+ output: lines.join("\n")
396
+ };
397
+ }
398
+ async function runSql(config, args, paint = plain) {
399
+ const [action, ...names] = args._;
400
+ switch (action) {
401
+ case "list": {
402
+ const sqlLayout = await layout(config, args);
403
+ const files = moduleFilePaths(Object.keys(SQL_MODULES), sqlLayout);
404
+ return {
405
+ code: 0,
406
+ output: `${Object.values(SQL_MODULES).map((module) => {
407
+ const path = files.get(module.name);
408
+ const installed = path !== void 0 && existsSync(resolve(config.root, path));
409
+ const tracked = config.sql.moduleNames.includes(module.name);
410
+ const mark = path === void 0 ? "◇" : installed ? tracked ? "●" : "○" : " ";
411
+ const requires = sqlLayout.entitlementsProvider && module.providerRequires ? module.providerRequires : module.requires;
412
+ const needs = requires.length > 0 ? ` (needs ${requires.join(", ")})` : "";
413
+ const integrates = module.integrates ?? [];
414
+ const works = integrates.includes("*") ? " (works with every installed module)" : integrates.length > 0 ? ` (works with ${integrates.join(", ")})` : "";
415
+ return `${mark} ${module.name.padEnd(15)} ${module.description}${needs}${works}`;
416
+ }).join("\n")}\n\n● installed and in sql.modules ○ installed, not in sql.modules ◇ custom mode (the app implements it)`
417
+ };
418
+ }
419
+ case "add": {
420
+ if (names.length === 0) return {
421
+ code: 2,
422
+ error: `Name at least one module.\n${USAGE}`
423
+ };
424
+ const unknown = names.filter((name) => !(name in SQL_MODULES));
425
+ if (unknown.length > 0) return {
426
+ code: 2,
427
+ error: `Unknown module ${unknown.join(", ")}. Available: ${Object.keys(SQL_MODULES).join(", ")}`
428
+ };
429
+ const owner = config.authorization && providerOwnsMemberships(config) ? providerLabel(config.authorization) : void 0;
430
+ const hookModules = names.filter((name) => MEMBERSHIP_CLAIM_MODULES.has(name));
431
+ if (owner && hookModules.length > 0 && args.force !== true) return {
432
+ code: 1,
433
+ error: [
434
+ `The access token hook of ${owner} writes the memberships claim.`,
435
+ `${hookModules.join(" and ")} would add a second source for it. Use the provider's hook instead,`,
436
+ "or pass --force to write the modules anyway."
437
+ ].join("\n")
438
+ };
439
+ const listed = [...config.sql.moduleNames, ...names.filter((name) => !config.sql.moduleNames.includes(name))];
440
+ const sqlLayout = await layoutFor(config, args, listed);
441
+ const lines = await write(config, args, listed, sqlLayout, resolveModules(names, sqlLayout).map((module) => module.name));
442
+ const pulledIn = resolveModules(names, sqlLayout).map((module) => module.name).filter((name) => MEMBERSHIP_CLAIM_MODULES.has(name) && !names.includes(name));
443
+ if (owner && pulledIn.length > 0) lines.push("", `${pulledIn.join(" and ")} came along as a dependency: its memberships table backs has_organization_role() and has_entitlement().`, `The hook of ${owner} still writes the memberships claim, so don't call better_supabase.membership_claims from a hook.`, "Make better_supabase.memberships one of the provider's membership sources if both should agree.");
444
+ const untracked = resolveModules(names, sqlLayout).map((module) => module.name).filter((name) => !config.sql.moduleNames.includes(name));
445
+ if (untracked.length > 0) lines.push("", `Add them to your config so \`sql sync --check\` keeps them current:`, ` sql: { modules: [${[...config.sql.moduleNames, ...untracked].map((name) => `'${name}'`).join(", ")}] }`);
446
+ if (args["dry-run"] !== true) lines.push(...await unlistedModuleFiles(config, names, sqlLayout));
447
+ lines.push("", `Then create a migration: ${migrationCommand(await readSupabaseToml(config.root), "better_supabase_module")}`);
448
+ return {
449
+ code: 0,
450
+ output: lines.join("\n")
451
+ };
452
+ }
453
+ case "sync": {
454
+ const topics = await topicPolicyFile(config, config.sql.moduleNames.length === 0 ? [] : moduleTopics(config.sql.moduleNames, await layoutFor(config, args, config.sql.moduleNames)));
455
+ if (config.sql.moduleNames.length === 0 && topics === void 0) return {
456
+ code: 0,
457
+ output: "sql.modules is empty; nothing to sync."
458
+ };
459
+ if (args.check !== true) {
460
+ const lines = config.sql.moduleNames.length === 0 ? [] : await write(config, args, config.sql.moduleNames, await layoutFor(config, args, config.sql.moduleNames));
461
+ if (topics !== void 0) {
462
+ const shown = display(config.root, topics.path);
463
+ if (args["dry-run"] === true) lines.push(`Would write ${shown} (topics)`);
464
+ else {
465
+ const wrote = await writeIfChanged(resolve(config.root, topics.path), topics.contents);
466
+ lines.push(`${wrote ? "Wrote" : "Unchanged"} ${shown} (topics)`);
467
+ }
468
+ }
469
+ return {
470
+ code: 0,
471
+ output: lines.join("\n")
472
+ };
473
+ }
474
+ const sqlLayout = await layoutFor(config, args, config.sql.moduleNames);
475
+ const files = [...renderModules(config.sql.moduleNames, sqlLayout), ...topics === void 0 ? [] : [{
476
+ ...topics,
477
+ topics: true
478
+ }]];
479
+ const stale = (await staleModuleTests(config, config.sql.moduleNames, sqlLayout, renderModules(config.sql.moduleNames, sqlLayout))).map((path) => display(config.root, path));
480
+ const diffs = stale.map((path) => `${path} is no longer written; \`sql sync\` removes it.`);
481
+ for (const file of files) {
482
+ const current = await readFile(resolve(config.root, file.path), "utf8").catch(() => void 0);
483
+ if (file.topics ? !sameText(current, file.contents) : !sameModuleFile(current, file.contents)) {
484
+ const shown = display(config.root, file.path);
485
+ stale.push(shown);
486
+ diffs.push(fileDiff(shown, current, file.contents, paint));
487
+ }
488
+ }
489
+ return stale.length === 0 ? {
490
+ code: 0,
491
+ output: "SQL module files are up to date."
492
+ } : {
493
+ code: 1,
494
+ output: diffs.join("\n\n"),
495
+ error: `Out of date: ${stale.join(", ")}. Run \`better-supabase sql sync\`.`
496
+ };
497
+ }
498
+ case "upgrade": return upgrade(config, args, paint);
499
+ case "data": return dataMigration(config, args);
500
+ case "print": {
501
+ const [name] = names;
502
+ const module = name ? SQL_MODULES[name] : void 0;
503
+ if (!module) return {
504
+ code: 2,
505
+ error: `Name one module: ${Object.keys(SQL_MODULES).join(", ")}`
506
+ };
507
+ const body = moduleBody(module.name, await layout(config, args, [module.name]));
508
+ if (body === void 0) return {
509
+ code: 0,
510
+ output: `-- sql.modules.${module.name} is in custom mode: the app writes these functions.\n${customContracts([module.name], await layout(config, args, [module.name])).flatMap((contract) => contract.functions.map((fn) => `-- ${contract.schema}.${fn.name}(${contractSignature(fn, contract.idType)}) returns ${fn.returns.replaceAll("{id}", contract.idType)}`)).join("\n")}`
511
+ };
512
+ return {
513
+ code: 0,
514
+ output: body
515
+ };
516
+ }
517
+ case void 0: return {
518
+ code: 2,
519
+ error: `Name an action.\n${USAGE}`
520
+ };
521
+ default: return {
522
+ code: 2,
523
+ error: `Unknown sql action "${action}".\n${USAGE}`
524
+ };
525
+ }
526
+ }
527
+ const sqlCommand = defineCliCommand({
528
+ meta: {
529
+ name: "sql",
530
+ description: "Lists, adds, syncs, upgrades and prints SQL modules, and writes their data migration"
531
+ },
532
+ args: SQL_ARGS,
533
+ run: (args, { config, io }) => runSql(config, args, painter(io.color))
534
+ });
535
+ //#endregion
536
+ export { sqlCommand };