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
@@ -1,289 +0,0 @@
1
- import { i as importModule } from "./config-CPVpXP5I.js";
2
- import { resolve } from "node:path";
3
- import { existsSync } from "node:fs";
4
- import { readFile } from "node:fs/promises";
5
- import { KIT_ID_TYPES, compileReadSets, kitIdType } from "better-supabase/sql";
6
- import { isReadSet } from "better-supabase";
7
- //#region src/cli/permdock.ts
8
- const PERMDOCK_CONFIGS = [
9
- "permdock.config.ts",
10
- "permdock.config.mts",
11
- "permdock.config.js",
12
- "permdock.config.mjs"
13
- ];
14
- /** The PermDock config file in `root`, if there is one. */
15
- function permdockConfig(root) {
16
- return PERMDOCK_CONFIGS.find((file) => existsSync(resolve(root, file)));
17
- }
18
- const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
19
- const isString = (value) => typeof value === "string";
20
- const strings = (value) => Array.isArray(value) ? value.filter(isString) : [];
21
- const column = (value) => isRecord(value) && isString(value["column"]) ? { column: value["column"] } : void 0;
22
- function manifestValue(value, accept) {
23
- if (!isRecord(value)) return void 0;
24
- if (isString(value["column"])) return { column: value["column"] };
25
- return accept(value["value"]) ? { value: value["value"] } : void 0;
26
- }
27
- const roleValue = (value) => isString(value) || Array.isArray(value) && value.every(isString);
28
- function membership(value) {
29
- if (!isRecord(value) || !isString(value["table"])) return void 0;
30
- const user = column(value["user"]);
31
- const id = column(value["id"]);
32
- const scope = manifestValue(value["scope"], isString);
33
- if (!user || !id || !scope) return void 0;
34
- const role = manifestValue(value["role"], roleValue);
35
- const expiresAt = column(value["expiresAt"]);
36
- return {
37
- table: value["table"],
38
- user,
39
- scope,
40
- id,
41
- ...role ? { role } : {},
42
- ...expiresAt ? { expiresAt } : {},
43
- columns: strings(value["columns"])
44
- };
45
- }
46
- /** Reads a parsed manifest; throws with the reason when it isn't version 1. */
47
- function parseManifest(json) {
48
- if (!isRecord(json)) throw new TypeError("not a JSON object");
49
- if (json["version"] !== 1) throw new TypeError(`version ${String(json["version"])} is not supported (this release reads version 1)`);
50
- const hook = json["hook"];
51
- const rls = json["rls"];
52
- if (isRecord(rls) && rls["mode"] !== "jwt" && rls["mode"] !== "database") throw new TypeError(`rls.mode ${JSON.stringify(rls["mode"])} is not supported (this release reads "jwt" and "database")`);
53
- const budget = isRecord(json["budget"]) ? json["budget"]["bytes"] : void 0;
54
- return {
55
- version: 1,
56
- ...typeof budget === "number" ? { budget } : {},
57
- ...isRecord(hook) && isString(hook["schema"]) && isString(hook["function"]) ? { hook: {
58
- schema: hook["schema"],
59
- function: hook["function"]
60
- } } : {},
61
- ...isString(json["tenantClaim"]) ? { tenantClaim: json["tenantClaim"] } : {},
62
- claims: (Array.isArray(json["claims"]) ? json["claims"] : []).flatMap((claim) => isRecord(claim) && isString(claim["name"]) && isString(claim["source"]) ? [{
63
- name: claim["name"],
64
- source: claim["source"]
65
- }] : []),
66
- memberships: (Array.isArray(json["memberships"]) ? json["memberships"] : []).flatMap((entry) => {
67
- const parsed = membership(entry);
68
- return parsed ? [parsed] : [];
69
- }),
70
- ...isRecord(rls) && isString(rls["schema"]) ? { rls: {
71
- schema: rls["schema"],
72
- mode: rls["mode"] === "jwt" ? "jwt" : "database",
73
- ...isString(rls["tenantClaim"]) ? { tenantClaim: rls["tenantClaim"] } : {},
74
- scopes: (Array.isArray(rls["scopes"]) ? rls["scopes"] : []).flatMap((scope) => isRecord(scope) && isString(scope["name"]) ? [{
75
- name: scope["name"],
76
- ...isString(scope["type"]) ? { type: scope["type"] } : {},
77
- ...isString(scope["within"]) ? { within: scope["within"] } : {}
78
- }] : []),
79
- helpers: (Array.isArray(rls["helpers"]) ? rls["helpers"] : []).flatMap((helper) => isRecord(helper) && isString(helper["name"]) && isString(helper["args"]) && isString(helper["returns"]) ? [{
80
- name: helper["name"],
81
- args: helper["args"],
82
- returns: helper["returns"],
83
- execute: strings(helper["execute"])
84
- }] : [])
85
- } } : {},
86
- decidingColumns: strings(json["decidingColumns"])
87
- };
88
- }
89
- /**
90
- * The keys of a parsed `permissions.catalog.json`, each with its scope and
91
- * its `rowConditions` flag when it is a boolean. A non-boolean flag is
92
- * dropped, so `permdockKeyStatus` reads the key as unknown. Throws unless
93
- * the catalog is version 1.
94
- */
95
- function parseCatalog(json) {
96
- if (!isRecord(json) || !Array.isArray(json["permissions"])) throw new TypeError("has no permissions array");
97
- if (json["version"] !== 1) throw new TypeError(`version ${String(json["version"])} is not supported (this release reads version 1)`);
98
- return { permissions: json["permissions"].flatMap((permission) => {
99
- if (!isRecord(permission) || !isString(permission["key"])) return [];
100
- const flag = permission["rowConditions"];
101
- const scope = permission["scope"];
102
- return [{
103
- key: permission["key"],
104
- ...typeof flag === "boolean" ? { rowConditions: flag } : {},
105
- ...isString(scope) ? { scope } : {}
106
- }];
107
- }) };
108
- }
109
- async function readJson(root, path) {
110
- const absolute = resolve(root, path);
111
- if (!existsSync(absolute)) return { missing: true };
112
- try {
113
- return { json: JSON.parse(await readFile(absolute, "utf8")) };
114
- } catch (cause) {
115
- return { problem: `${path}: ${cause instanceof Error ? cause.message : String(cause)}` };
116
- }
117
- }
118
- /**
119
- * Reads PermDock's JSON outputs: the manifest `permdock supabase inspect
120
- * --out` writes and the catalog `permdock catalog` writes. Nothing is
121
- * imported from PermDock. Returns `undefined` when the project has neither a
122
- * PermDock config nor a manifest.
123
- */
124
- async function readPermdock(root, paths) {
125
- const config = permdockConfig(root);
126
- const problems = [];
127
- const manifestFile = await readJson(root, paths.manifest);
128
- let manifest;
129
- if ("json" in manifestFile) try {
130
- manifest = parseManifest(manifestFile.json);
131
- } catch (cause) {
132
- problems.push(`${paths.manifest}: ${cause instanceof Error ? cause.message : String(cause)}`);
133
- }
134
- else if ("problem" in manifestFile) problems.push(manifestFile.problem);
135
- if (!config && !manifest && "missing" in manifestFile) return void 0;
136
- const catalogFile = await readJson(root, paths.catalog);
137
- let catalog;
138
- if ("json" in catalogFile) try {
139
- catalog = parseCatalog(catalogFile.json);
140
- } catch (cause) {
141
- problems.push(`${paths.catalog}: ${cause instanceof Error ? cause.message : String(cause)}`);
142
- }
143
- else if ("problem" in catalogFile) problems.push(catalogFile.problem);
144
- return {
145
- ...config ? { config } : {},
146
- manifestPath: paths.manifest,
147
- ...manifest ? { manifest } : {},
148
- catalogPath: paths.catalog,
149
- ...catalog ? { catalog } : {},
150
- problems
151
- };
152
- }
153
- /** How findings name the PermDock project: its config file or its manifest. */
154
- const permdockSource = (project) => project.config ?? project.manifestPath;
155
- const HOOK_MARKER = /^--\s*permdock:hook\s+v(\d+)([^\n]*)$/m;
156
- const GRANTS_MARKER = /^--\s*permdock:grants\s+v(\d+)([^\n]*)$/m;
157
- function markerFields(rest) {
158
- const fields = /* @__PURE__ */ new Map();
159
- for (const match of rest.matchAll(/(\w+)=(\S*)/g)) fields.set(match[1], match[2]);
160
- return fields;
161
- }
162
- /** The `-- permdock:hook v1 schema=... tenant=... budget=... claims=...` line PermDock's hook file starts with. */
163
- function parseHookMarker(sql) {
164
- const match = HOOK_MARKER.exec(sql);
165
- if (!match) return void 0;
166
- const fields = markerFields(match[2]);
167
- const budget = Number(fields.get("budget"));
168
- const schema = fields.get("schema");
169
- const tenantClaim = fields.get("tenant");
170
- return {
171
- version: Number(match[1]),
172
- ...schema ? { schema } : {},
173
- ...tenantClaim ? { tenantClaim } : {},
174
- ...Number.isFinite(budget) && fields.has("budget") ? { budget } : {},
175
- claims: (fields.get("claims") ?? "").split(",").filter(Boolean)
176
- };
177
- }
178
- /** The `-- permdock:grants v1 schema=...` line of the migration `--grants-out` writes. */
179
- function parseGrantsMarker(sql) {
180
- const match = GRANTS_MARKER.exec(sql);
181
- if (!match) return void 0;
182
- const schema = markerFields(match[2]).get("schema");
183
- return {
184
- version: Number(match[1]),
185
- ...schema ? { schema } : {}
186
- };
187
- }
188
- /**
189
- * PermDock mode, when the project uses PermDock and `entitlements.permdock`
190
- * is not `false`. The scope is `entitlements.permdock.scope`, which must be
191
- * one of the manifest's `rls.scopes`, else the one scope without `within`.
192
- * No root scope, or more than one, is invalid rather than a guess. A
193
- * PermDock project without a readable manifest or without its `rls` block
194
- * is invalid too, so the module never falls back to `tenant` on its own.
195
- */
196
- function entitlementsMode(config, project) {
197
- const setting = config.entitlements.permdock;
198
- if (setting === false || !project) return { kind: "tenant" };
199
- const optOut = "or set entitlements.permdock: false to keep the tenant module's memberships.";
200
- if (!project.manifest) {
201
- const problem = project.problems.find((entry) => entry.startsWith(project.manifestPath));
202
- return {
203
- kind: "invalid",
204
- problem: problem ? `Could not read PermDock's manifest: ${problem}. Run \`permdock supabase inspect --out\` with a current PermDock, ${optOut}` : `${permdockSource(project)} is a PermDock project, but there is no ${project.manifestPath}. Run \`permdock supabase inspect --out\`, ${optOut}`
205
- };
206
- }
207
- const rls = project.manifest.rls;
208
- if (!rls) return {
209
- kind: "invalid",
210
- problem: `${project.manifestPath} has no rls block, so the entitlements module can't find PermDock's membership helpers. Run \`permdock rls generate\`, then \`permdock supabase inspect --out\`, ${optOut}`
211
- };
212
- const names = rls.scopes.map((scope) => scope.name).join(", ") || "none";
213
- let scope;
214
- if (setting.scope === void 0) {
215
- const roots = rls.scopes.filter((entry) => entry.within === void 0);
216
- if (roots.length !== 1) return {
217
- kind: "invalid",
218
- problem: `${project.manifestPath} has no single root scope (${roots.map((entry) => entry.name).join(", ") || "none"}), so the entitlements module can't tell which scope tenants are. Set entitlements.permdock: { scope } to one of ${names}.`
219
- };
220
- scope = roots[0].name;
221
- } else {
222
- scope = setting.scope;
223
- if (!rls.scopes.some((entry) => entry.name === scope)) return {
224
- kind: "invalid",
225
- problem: `entitlements.permdock.scope is "${scope}", but ${project.manifestPath} has the scopes ${names}. Set entitlements.permdock: { scope } to one of them, or remove it to use the root scope.`
226
- };
227
- }
228
- const declared = rls.scopes.find((entry) => entry.name === scope)?.type;
229
- if (declared === void 0) return {
230
- kind: "invalid",
231
- problem: `${project.manifestPath} gives scope "${scope}" no type, so the entitlements module can't tell its id type. Run \`permdock supabase inspect --out\` with a current PermDock.`
232
- };
233
- const type = kitIdType(declared);
234
- if (type === void 0) return {
235
- kind: "invalid",
236
- problem: `${project.manifestPath} gives scope "${scope}" the type ${declared}, but the entitlements module renders only ${KIT_ID_TYPES.join(", ").replace(/, (?=[^,]*$)/, " or ")} ids.`
237
- };
238
- return {
239
- kind: "permdock",
240
- permdock: {
241
- schema: rls.schema,
242
- scope,
243
- idType: type,
244
- memberships: project.manifest.memberships.map((source) => ({
245
- table: source.table,
246
- userColumn: source.user.column,
247
- scope: source.scope,
248
- idColumn: source.id.column
249
- }))
250
- }
251
- };
252
- }
253
- /**
254
- * The helpers the `entitlements` module calls for the chosen scope:
255
- * `member_<scope>_ids` from `has_entitlement` as `authenticated`, and
256
- * `member_<scope>_ids_for` from `feature_claims`, which PermDock's hook runs
257
- * as `supabase_auth_admin`.
258
- */
259
- const entitlementRequirements = (permdock) => [{
260
- kind: "member",
261
- helper: `${permdock.schema}.member_${permdock.scope}_ids`,
262
- caller: "has_entitlement",
263
- role: "authenticated"
264
- }, {
265
- kind: "member-for",
266
- helper: `${permdock.schema}.member_${permdock.scope}_ids_for`,
267
- caller: "feature_claims",
268
- role: "supabase_auth_admin"
269
- }];
270
- //#endregion
271
- //#region src/cli/read-sets.ts
272
- /** Every read set exported by the modules in `config.readSets`. */
273
- async function loadReadSets(config) {
274
- const sets = [];
275
- for (const entry of config.readSets) {
276
- const loaded = await importModule(resolve(config.root, entry));
277
- const found = Object.values(loaded).filter(isReadSet);
278
- if (found.length === 0) throw new Error(`${entry} exports no read set (defineReadSet)`);
279
- for (const set of found) if (!sets.includes(set)) sets.push(set);
280
- }
281
- return sets;
282
- }
283
- /** The compiled functions for `config.readSets`; empty when none are configured. */
284
- async function compiledReadSets(config) {
285
- if (config.readSets.length === 0) return [];
286
- return compileReadSets(await loadReadSets(config));
287
- }
288
- //#endregion
289
- export { parseHookMarker as a, parseGrantsMarker as i, entitlementRequirements as n, permdockSource as o, entitlementsMode as r, readPermdock as s, compiledReadSets as t };
@@ -1,348 +0,0 @@
1
- import { r as defineCliCommand } from "./command-CK14fP91.js";
2
- import { r as writeIfChanged, t as display } from "./io-k41_z-jT.js";
3
- import { i as plain, r as painter } from "./style-C0NFdJRL.js";
4
- import { f as readSupabaseToml, p as schemaPaths, u as migrationCommand } from "./config-CPVpXP5I.js";
5
- import { t as fileDiff } from "./diff-SjkO5rNr.js";
6
- import { o as permdockSource, r as entitlementsMode, s as readPermdock, t as compiledReadSets } from "./read-sets-BfMQcKy8.js";
7
- import { dirname, join, relative, resolve, sep } from "node:path";
8
- import { existsSync } from "node:fs";
9
- import { readFile, readdir } from "node:fs/promises";
10
- import { SQL_MODULES, contractSignature, customContracts, kitFileVersion, kitLayout, moduleBody, renderKit, resolveModules, sameKitFile, upgradePlan } from "better-supabase/sql";
11
- //#region src/cli/commands/sql.ts
12
- const SQL_ARGS = {
13
- action: {
14
- type: "positional",
15
- required: false,
16
- 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>"
17
- },
18
- check: {
19
- type: "boolean",
20
- description: "With sync: fail when a file is stale. With upgrade: fail when a module is behind"
21
- },
22
- "tests-dir": {
23
- type: "string",
24
- description: "Where the pgtap module goes. Defaults to sql.testsDir",
25
- valueHint: "dir"
26
- },
27
- "dry-run": {
28
- type: "boolean",
29
- description: "Show what would be written"
30
- },
31
- force: {
32
- type: "boolean",
33
- description: "Write tenant even though a permdock.config.ts is present"
34
- }
35
- };
36
- const USAGE = "Run `better-supabase sql --help` for the actions.";
37
- /** Modules that fill a claim PermDock's hook also writes (`memberships`). */
38
- const PERMDOCK_OWNED = /* @__PURE__ */ new Set(["tenant"]);
39
- /**
40
- * PermDock's helpers for the `entitlements` module. When `names` resolve to
41
- * that module, an invalid PermDock mode (no manifest, a scope it lacks, an
42
- * unknown id type) throws instead of falling back to the tenant module.
43
- * Without `names` (`sql list`) it only describes the modules, so it doesn't.
44
- */
45
- async function permdockFor(config, names) {
46
- const mode = entitlementsMode(config, await readPermdock(config.root, config.permdock));
47
- switch (mode.kind) {
48
- case "tenant": return;
49
- case "permdock": return mode.permdock;
50
- case "invalid":
51
- if (names === void 0 || !resolveModules(names, {}).some((module) => module.name === "entitlements")) return void 0;
52
- throw new TypeError(mode.problem);
53
- default: return mode;
54
- }
55
- }
56
- async function layout(config, args, names) {
57
- return kitLayout(config, args["tests-dir"], [], await permdockFor(config, names));
58
- }
59
- /** The layout, with `config.readSets` compiled when `names` includes `read-sets`. */
60
- async function layoutFor(config, args, names) {
61
- const permdock = await permdockFor(config, names);
62
- const needsReadSets = resolveModules(names, { ...permdock ? { permdock } : {} }).some((module) => module.name === "read-sets");
63
- return kitLayout(config, args["tests-dir"], needsReadSets ? await compiledReadSets(config) : [], permdock);
64
- }
65
- /**
66
- * The migrations folder next to the `config.toml` found walking up from
67
- * `sql.dir`, relative to the root; `supabase/migrations` without one. The
68
- * walk stops where `sql.dir` and the root meet, so a `sql.dir` outside the
69
- * project (a shared stack in a monorepo) finds that stack's folder.
70
- */
71
- function migrationsDir(config) {
72
- const root = resolve(config.root);
73
- let dir = resolve(root, config.sql.dir);
74
- let stop = root;
75
- while (dir !== stop && !dir.startsWith(stop + sep) && dirname(stop) !== stop) stop = dirname(stop);
76
- for (;;) {
77
- if (existsSync(join(dir, "config.toml"))) return relative(root, join(dir, "migrations")).replaceAll("\\", "/");
78
- if (dir === stop || dirname(dir) === dir) break;
79
- dir = dirname(dir);
80
- }
81
- return "supabase/migrations";
82
- }
83
- /** `YYYYMMDDHHMMSS` in UTC, the Supabase CLI's migration prefix. */
84
- const migrationStamp = (now) => now.toISOString().replaceAll(/[-:T]/g, "").slice(0, 14);
85
- /**
86
- * A stamp for `now`, or one second after the newest migration when that one
87
- * has the same stamp or a later one: the Supabase CLI keys migrations by
88
- * stamp, and the data has to run after the schema.
89
- */
90
- function stampAfter(migrations, now) {
91
- const newest = migrations.map((name) => /^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})_/.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);
92
- const at = Math.floor(now.getTime() / 1e3) * 1e3;
93
- return migrationStamp(new Date(Math.max(at, newest + 1e3)));
94
- }
95
- async function write(config, args, names, kit) {
96
- const lines = [];
97
- const dryRun = args["dry-run"] === true;
98
- let data = false;
99
- for (const file of renderKit(names, kit)) {
100
- const path = resolve(config.root, file.path);
101
- const shown = display(config.root, file.path);
102
- if (dryRun) {
103
- lines.push(`Would write ${shown} (${file.module})`);
104
- continue;
105
- }
106
- const wrote = await writeIfChanged(path, file.contents);
107
- if (wrote && file.kind === "data") data = true;
108
- lines.push(`${wrote ? "Wrote" : "Unchanged"} ${shown} (${file.module})`);
109
- }
110
- if (data) lines.push("", DATA_NEXT);
111
- return lines;
112
- }
113
- 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`.";
114
- const DATA_SUFFIX = "_better_supabase_kit_data.sql";
115
- /**
116
- * Writes the data files of `sql.kit` into one migration, meant to run after
117
- * the schema migration that creates their tables. Every statement is
118
- * idempotent, so the migration carries all of them, not only the changes.
119
- */
120
- async function dataMigration(config, args) {
121
- if (config.sql.kit.length === 0) return {
122
- code: 0,
123
- output: "sql.kit is empty; nothing to write."
124
- };
125
- const files = renderKit(config.sql.kit, await layoutFor(config, args, config.sql.kit)).filter((file) => file.kind === "data");
126
- 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`;
127
- const dir = migrationsDir(config);
128
- const existing = await readdir(resolve(config.root, dir)).catch(() => []);
129
- const latest = existing.toSorted().findLast((name) => name.endsWith(DATA_SUFFIX));
130
- if (latest !== void 0 && await readFile(resolve(config.root, dir, latest), "utf8") === contents) return {
131
- code: 0,
132
- output: `${dir}/${latest} already has these rows; nothing to write.`
133
- };
134
- const path = `${dir}/${stampAfter(existing, /* @__PURE__ */ new Date())}${DATA_SUFFIX}`;
135
- if (args["dry-run"] === true) return {
136
- code: 0,
137
- output: `Would write ${path}`
138
- };
139
- await writeIfChanged(resolve(config.root, path), contents);
140
- return {
141
- code: 0,
142
- output: `Wrote ${path}`
143
- };
144
- }
145
- /** A note when migra's `schema_paths` is set and misses kit files, which `supabase db diff` would then skip. */
146
- async function unlistedKitFiles(config, names, kit) {
147
- const order = await schemaPaths(config.root, await readSupabaseToml(config.root));
148
- if (!order.configured) return [];
149
- const unlisted = new Set(order.unlisted);
150
- const listed = new Set(order.files.filter((path) => !unlisted.has(path)));
151
- const dir = `${config.sql.dir.replace(/\/$/, "")}/`;
152
- const missing = renderKit(names, kit).filter((file) => file.kind !== "data").map((file) => file.path).filter((path) => path.startsWith(dir) && !listed.has(path));
153
- if (missing.length === 0) return [];
154
- return [
155
- "",
156
- "supabase/config.toml sets [db.migrations] schema_paths, and no entry matches these files, so `supabase db diff` skips them.",
157
- "Add them before the schemas that call their functions:",
158
- ...missing.map((path) => ` "./${path.startsWith("supabase/") ? path.slice(9) : path}",`)
159
- ];
160
- }
161
- /**
162
- * Rewrites the kit files of modules behind the current version, and writes
163
- * their upgrade steps (renames, backfills) as a migration that runs before
164
- * the one the schema diff creates.
165
- */
166
- async function upgrade(config, args, paint) {
167
- if (config.sql.kit.length === 0) return {
168
- code: 0,
169
- output: "sql.kit is empty; nothing to upgrade."
170
- };
171
- const kit = await layoutFor(config, args, config.sql.kit);
172
- const files = renderKit(config.sql.kit, kit);
173
- const installed = [];
174
- const stale = [];
175
- const diffs = [];
176
- for (const file of files) {
177
- if (file.kind === "data") continue;
178
- const current = await readFile(resolve(config.root, file.path), "utf8").catch(() => void 0);
179
- if (current === void 0) continue;
180
- installed.push({
181
- module: file.module,
182
- version: kitFileVersion(current)?.version ?? 1
183
- });
184
- if (!sameKitFile(current, file.contents)) {
185
- stale.push(file);
186
- diffs.push(fileDiff(display(config.root, file.path), current, file.contents, paint));
187
- }
188
- }
189
- const plan = upgradePlan(installed, kit);
190
- const behind = plan.map((entry) => `${entry.module} is at version ${String(entry.from)}; the current version is ${String(entry.to)}`);
191
- if (args.check === true) {
192
- if (plan.length === 0 && stale.length === 0) return {
193
- code: 0,
194
- output: "SQL kit modules are at their current versions."
195
- };
196
- return {
197
- code: 1,
198
- output: diffs.join("\n\n"),
199
- error: [
200
- ...behind,
201
- ...stale.length > 0 ? [`Out of date: ${stale.map((file) => display(config.root, file.path)).join(", ")}.`] : [],
202
- "Run `better-supabase sql upgrade`."
203
- ].join("\n")
204
- };
205
- }
206
- if (plan.length === 0 && stale.length === 0) return {
207
- code: 0,
208
- output: "SQL kit modules are at their current versions."
209
- };
210
- const lines = [];
211
- 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}`));
212
- const dryRun = args["dry-run"] === true;
213
- if (steps.length > 0) {
214
- const path = `${migrationsDir(config)}/${migrationStamp(/* @__PURE__ */ new Date())}_better_supabase_kit_upgrade.sql`;
215
- const contents = `-- better-supabase sql upgrade: steps that run before the schema diff.\n\n${steps.join("\n\n")}\n`;
216
- if (dryRun) lines.push(`Would write ${path}`);
217
- else {
218
- await writeIfChanged(resolve(config.root, path), contents);
219
- lines.push(`Wrote ${path}`);
220
- }
221
- }
222
- for (const entry of plan) lines.push(`${entry.module}: version ${String(entry.from)} to ${String(entry.to)}`, ...entry.steps.map((step) => ` ${step.description}`));
223
- lines.push(...await write(config, args, config.sql.kit, kit), "", `Then create a migration: ${migrationCommand(await readSupabaseToml(config.root), "better_supabase_kit")}`);
224
- return {
225
- code: 0,
226
- output: lines.join("\n")
227
- };
228
- }
229
- async function runSql(config, args, paint = plain) {
230
- const [action, ...names] = args._;
231
- switch (action) {
232
- case "list": {
233
- const kit = await layout(config, args);
234
- const files = new Map(renderKit(Object.keys(SQL_MODULES), kit).filter((file) => file.kind !== "data").map((file) => [file.module, file.path]));
235
- return {
236
- code: 0,
237
- output: `${Object.values(SQL_MODULES).map((module) => {
238
- const path = files.get(module.name);
239
- const installed = path !== void 0 && existsSync(resolve(config.root, path));
240
- const tracked = config.sql.kit.includes(module.name);
241
- const mark = path === void 0 ? "◇" : installed ? tracked ? "●" : "○" : " ";
242
- const requires = kit.permdock && module.permdockRequires ? module.permdockRequires : module.requires;
243
- const needs = requires.length > 0 ? ` (needs ${requires.join(", ")})` : "";
244
- return `${mark} ${module.name.padEnd(15)} ${module.description}${needs}`;
245
- }).join("\n")}\n\n● installed and in sql.kit ○ installed, not in sql.kit ◇ custom mode (the app implements it)`
246
- };
247
- }
248
- case "add": {
249
- if (names.length === 0) return {
250
- code: 2,
251
- error: `Name at least one module.\n${USAGE}`
252
- };
253
- const unknown = names.filter((name) => !(name in SQL_MODULES));
254
- if (unknown.length > 0) return {
255
- code: 2,
256
- error: `Unknown module ${unknown.join(", ")}. Available: ${Object.keys(SQL_MODULES).join(", ")}`
257
- };
258
- const project = await readPermdock(config.root, config.permdock);
259
- const permdock = project ? permdockSource(project) : void 0;
260
- const hookModules = names.filter((name) => PERMDOCK_OWNED.has(name));
261
- if (permdock && hookModules.length > 0 && args.force !== true) return {
262
- code: 1,
263
- error: [
264
- `${permdock} is present, so PermDock owns the access token hook and the memberships claim.`,
265
- `${hookModules.join(" and ")} would add a second source for them. Use \`permdock supabase hook generate\` instead,`,
266
- "or pass --force to write the modules anyway."
267
- ].join("\n")
268
- };
269
- const kit = await layoutFor(config, args, names);
270
- const lines = await write(config, args, names, kit);
271
- const pulledIn = resolveModules(names, kit).map((module) => module.name).filter((name) => PERMDOCK_OWNED.has(name) && !names.includes(name));
272
- if (permdock && pulledIn.length > 0) lines.push("", `${pulledIn.join(" and ")} came along as a dependency: its memberships table backs has_org_role() and has_entitlement().`, `PermDock's hook still owns the memberships claim, so don't call better_supabase.membership_claims from a hook.`, "List better_supabase.memberships as a PermDock membership source if both should agree.");
273
- const untracked = resolveModules(names, kit).map((module) => module.name).filter((name) => !config.sql.kit.includes(name));
274
- if (untracked.length > 0) lines.push("", `Add them to your config so \`sql sync --check\` keeps them current:`, ` sql: { kit: [${[...config.sql.kit, ...untracked].map((name) => `'${name}'`).join(", ")}] }`);
275
- if (args["dry-run"] !== true) lines.push(...await unlistedKitFiles(config, names, kit));
276
- lines.push("", `Then create a migration: ${migrationCommand(await readSupabaseToml(config.root), "better_supabase_kit")}`);
277
- return {
278
- code: 0,
279
- output: lines.join("\n")
280
- };
281
- }
282
- case "sync": {
283
- if (config.sql.kit.length === 0) return {
284
- code: 0,
285
- output: "sql.kit is empty; nothing to sync."
286
- };
287
- if (args.check !== true) return {
288
- code: 0,
289
- output: (await write(config, args, config.sql.kit, await layoutFor(config, args, config.sql.kit))).join("\n")
290
- };
291
- const stale = [];
292
- const diffs = [];
293
- for (const file of renderKit(config.sql.kit, await layoutFor(config, args, config.sql.kit))) {
294
- const current = await readFile(resolve(config.root, file.path), "utf8").catch(() => void 0);
295
- if (!sameKitFile(current, file.contents)) {
296
- const shown = display(config.root, file.path);
297
- stale.push(shown);
298
- diffs.push(fileDiff(shown, current, file.contents, paint));
299
- }
300
- }
301
- return stale.length === 0 ? {
302
- code: 0,
303
- output: "SQL kit files are up to date."
304
- } : {
305
- code: 1,
306
- output: diffs.join("\n\n"),
307
- error: `Out of date: ${stale.join(", ")}. Run \`better-supabase sql sync\`.`
308
- };
309
- }
310
- case "upgrade": return upgrade(config, args, paint);
311
- case "data": return dataMigration(config, args);
312
- case "print": {
313
- const [name] = names;
314
- const module = name ? SQL_MODULES[name] : void 0;
315
- if (!module) return {
316
- code: 2,
317
- error: `Name one module: ${Object.keys(SQL_MODULES).join(", ")}`
318
- };
319
- const body = moduleBody(module.name, await layout(config, args, [module.name]));
320
- if (body === void 0) return {
321
- code: 0,
322
- output: `-- kits.${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")}`
323
- };
324
- return {
325
- code: 0,
326
- output: body
327
- };
328
- }
329
- case void 0: return {
330
- code: 2,
331
- error: `Name an action.\n${USAGE}`
332
- };
333
- default: return {
334
- code: 2,
335
- error: `Unknown sql action "${action}".\n${USAGE}`
336
- };
337
- }
338
- }
339
- const sqlCommand = defineCliCommand({
340
- meta: {
341
- name: "sql",
342
- description: "Lists, adds, syncs, upgrades and prints SQL kit modules, and writes their data migration"
343
- },
344
- args: SQL_ARGS,
345
- run: (args, { config, io }) => runSql(config, args, painter(io.color))
346
- });
347
- //#endregion
348
- export { sqlCommand };
@@ -1,20 +0,0 @@
1
- //#region src/auth/entitlements.ts
2
- /**
3
- * Whether the session's plan-features claim grants `key` in `tenantId`.
4
- * `claim` is `config.claims.features` (default `features`), the claim
5
- * `better_supabase.feature_claims()` fills. The claim is as fresh as the
6
- * token: enforce it in RLS with `better_supabase.has_entitlement()`, and
7
- * refresh the session after checkout.
8
- */
9
- function hasEntitlement(session, tenantId, key, claim = "features") {
10
- if (session.kind !== "user") return false;
11
- const claims = session.claims;
12
- if (!isRecord(claims)) return false;
13
- const features = claims[claim];
14
- if (!isRecord(features) || !Object.hasOwn(features, tenantId)) return false;
15
- const keys = features[tenantId];
16
- return Array.isArray(keys) && keys.includes(key);
17
- }
18
- const isRecord = (value) => typeof value === "object" && value !== null;
19
- //#endregion
20
- export { hasEntitlement as t };