better-supabase 0.17.0 → 0.18.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 (563) hide show
  1. package/dist/{access-sql-B-MkVARa.js → access-sql-CNIgUqWf.js} +2 -0
  2. package/dist/{adapter-Dyks1lX1.js → adapter-CfuBICuG.js} +3 -1
  3. package/dist/{ai-schedules-Dk9H3kAp.d.ts → ai-schedules-DzLh6BYI.d.ts} +1 -1
  4. package/dist/ai-sdk/agents/index.d.ts +2 -2
  5. package/dist/ai-sdk/memory/index.js +1 -1
  6. package/dist/{api-CpL3hm87.d.ts → api-B6zteBya.d.ts} +1 -1
  7. package/dist/{app-tables-Q0TYfeih.js → app-tables-DyswUg6J.js} +10 -2
  8. package/dist/{app-tables-dS02piE7.d.ts → app-tables-XwCviyhP.d.ts} +1 -1
  9. package/dist/astro/index.d.ts +3 -3
  10. package/dist/astro/index.js +5 -5
  11. package/dist/{attachments-aJYgdYtB.js → attachments-M-Dy79Ry.js} +9 -2
  12. package/dist/{authorization-CNsvnwle.d.ts → authorization-IiE__z2m.d.ts} +169 -87
  13. package/dist/{automations-CIwRq7zm.js → automations-B5P6vTvk.js} +2 -2
  14. package/dist/{automations-CD1XlL2W.js → automations-BKjJpktQ.js} +1 -1
  15. package/dist/{automations-Bc2ue55V.js → automations-FCnWy387.js} +2 -2
  16. package/dist/{bind-C801IaK-.d.ts → bind-pu5TLrla.d.ts} +3 -3
  17. package/dist/{block-env-BeG4DiiO.d.ts → block-env-CA65ulTD.d.ts} +4 -4
  18. package/dist/blocks/access-requests/index.d.ts +1 -1
  19. package/dist/blocks/access-requests/index.js +1 -1
  20. package/dist/blocks/activities/index.d.ts +1 -1
  21. package/dist/blocks/activities/index.js +1 -1
  22. package/dist/blocks/agents/index.d.ts +1 -1
  23. package/dist/blocks/agents/index.js +1 -1
  24. package/dist/blocks/ai-cache/index.d.ts +1 -1
  25. package/dist/blocks/ai-cache/index.js +1 -1
  26. package/dist/blocks/ai-chat/index.d.ts +4 -4
  27. package/dist/blocks/ai-chat/index.js +1 -1
  28. package/dist/blocks/ai-files/index.d.ts +1 -1
  29. package/dist/blocks/ai-files/index.js +1 -1
  30. package/dist/blocks/ai-keys/index.d.ts +1 -1
  31. package/dist/blocks/ai-keys/index.js +1 -1
  32. package/dist/blocks/ai-schedules/index.d.ts +2 -2
  33. package/dist/blocks/ai-schedules/index.js +1 -1
  34. package/dist/blocks/announcements/index.d.ts +4 -4
  35. package/dist/blocks/announcements/index.js +1 -1
  36. package/dist/blocks/api-keys/index.d.ts +2 -2
  37. package/dist/blocks/api-keys/index.js +1 -1
  38. package/dist/blocks/approvals/index.d.ts +1 -1
  39. package/dist/blocks/approvals/index.js +1 -1
  40. package/dist/blocks/assets/index.d.ts +1 -1
  41. package/dist/blocks/assets/index.js +1 -1
  42. package/dist/blocks/assignment/index.d.ts +1 -1
  43. package/dist/blocks/attachments/index.d.ts +40 -4
  44. package/dist/blocks/attachments/index.js +42 -4
  45. package/dist/blocks/audit/index.d.ts +3 -3
  46. package/dist/blocks/audit/index.js +2 -2
  47. package/dist/blocks/automations/index.d.ts +3 -3
  48. package/dist/blocks/automations/index.js +1 -1
  49. package/dist/blocks/billable-time/index.d.ts +1 -1
  50. package/dist/blocks/billing/index.d.ts +2 -2
  51. package/dist/blocks/billing/index.js +1 -1
  52. package/dist/blocks/bookings/index.d.ts +2 -2
  53. package/dist/blocks/bookings/index.js +1 -1
  54. package/dist/blocks/bulk/index.d.ts +1 -1
  55. package/dist/blocks/bulk/index.js +1 -1
  56. package/dist/blocks/calendar/index.d.ts +2 -2
  57. package/dist/blocks/calendar/index.js +1 -1
  58. package/dist/blocks/catalog/index.d.ts +1 -1
  59. package/dist/blocks/catalog/index.js +1 -1
  60. package/dist/blocks/channels/index.d.ts +1 -1
  61. package/dist/blocks/collections/index.d.ts +1 -1
  62. package/dist/blocks/collections/index.js +1 -1
  63. package/dist/blocks/comments/index.d.ts +5 -5
  64. package/dist/blocks/comments/index.js +1 -1
  65. package/dist/blocks/compliance/index.d.ts +1 -1
  66. package/dist/blocks/compliance/index.js +1 -1
  67. package/dist/blocks/connectors/index.d.ts +1 -1
  68. package/dist/blocks/connectors/index.js +1 -1
  69. package/dist/blocks/contacts/index.d.ts +1 -1
  70. package/dist/blocks/contacts/index.js +1 -1
  71. package/dist/blocks/content/index.d.ts +2 -2
  72. package/dist/blocks/content/index.js +1 -1
  73. package/dist/blocks/contracts/index.d.ts +1 -1
  74. package/dist/blocks/contracts/index.js +1 -1
  75. package/dist/blocks/courses/index.d.ts +2 -2
  76. package/dist/blocks/courses/index.js +1 -1
  77. package/dist/blocks/created-by/index.d.ts +1 -1
  78. package/dist/blocks/created-by/index.js +1 -1
  79. package/dist/blocks/custom-fields/index.d.ts +1 -1
  80. package/dist/blocks/custom-fields/index.js +1 -1
  81. package/dist/blocks/data-lifecycle/index.d.ts +1 -1
  82. package/dist/blocks/data-lifecycle/index.js +1 -1
  83. package/dist/blocks/deals/index.d.ts +1 -1
  84. package/dist/blocks/deals/index.js +1 -1
  85. package/dist/blocks/dispatch/index.d.ts +2 -2
  86. package/dist/blocks/dispatch/index.js +1 -1
  87. package/dist/blocks/documents/index.d.ts +1 -1
  88. package/dist/blocks/documents/index.js +1 -1
  89. package/dist/blocks/domains/index.d.ts +1 -1
  90. package/dist/blocks/domains/index.js +1 -1
  91. package/dist/blocks/donations/index.d.ts +1 -1
  92. package/dist/blocks/donations/index.js +1 -1
  93. package/dist/blocks/drive/index.d.ts +1 -1
  94. package/dist/blocks/drive/index.js +2 -2
  95. package/dist/blocks/employees/index.d.ts +2 -2
  96. package/dist/blocks/employees/index.js +1 -1
  97. package/dist/blocks/enrichment/index.d.ts +1 -1
  98. package/dist/blocks/enrollments/index.d.ts +1 -1
  99. package/dist/blocks/enrollments/index.js +1 -1
  100. package/dist/blocks/entitlements/index.d.ts +3 -3
  101. package/dist/blocks/expenses/index.d.ts +1 -1
  102. package/dist/blocks/expenses/index.js +1 -1
  103. package/dist/blocks/field-history/index.d.ts +1 -1
  104. package/dist/blocks/flags/index.d.ts +1 -1
  105. package/dist/blocks/flags/index.js +1 -1
  106. package/dist/blocks/forecasts/index.d.ts +1 -1
  107. package/dist/blocks/forms/index.d.ts +2 -2
  108. package/dist/blocks/forms/index.js +1 -1
  109. package/dist/blocks/goals/index.d.ts +1 -1
  110. package/dist/blocks/goals/index.js +1 -1
  111. package/dist/blocks/guests/index.d.ts +1 -1
  112. package/dist/blocks/hiring/index.d.ts +1 -1
  113. package/dist/blocks/hiring/index.js +1 -1
  114. package/dist/blocks/identities/index.d.ts +1 -1
  115. package/dist/blocks/identities/index.js +1 -1
  116. package/dist/blocks/imports/index.d.ts +1 -1
  117. package/dist/blocks/inbox/index.d.ts +5 -5
  118. package/dist/blocks/inbox/index.js +1 -1
  119. package/dist/blocks/incidents/index.d.ts +1 -1
  120. package/dist/blocks/incidents/index.js +1 -1
  121. package/dist/blocks/index.d.ts +4 -4
  122. package/dist/blocks/index.js +1 -1
  123. package/dist/blocks/inventory/index.d.ts +1 -1
  124. package/dist/blocks/inventory/index.js +1 -1
  125. package/dist/blocks/invoices/index.d.ts +1 -1
  126. package/dist/blocks/invoices/index.js +1 -1
  127. package/dist/blocks/knowledge/index.d.ts +1 -1
  128. package/dist/blocks/knowledge/index.js +1 -1
  129. package/dist/blocks/lead-scoring/index.d.ts +2 -2
  130. package/dist/blocks/lead-scoring/index.js +1 -1
  131. package/dist/blocks/leases/index.d.ts +1 -1
  132. package/dist/blocks/leases/index.js +1 -1
  133. package/dist/blocks/leave/index.d.ts +1 -1
  134. package/dist/blocks/leave/index.js +1 -1
  135. package/dist/blocks/ledger/index.d.ts +1 -1
  136. package/dist/blocks/mail-sync/index.d.ts +2 -2
  137. package/dist/blocks/mail-sync/index.js +1 -1
  138. package/dist/blocks/memberships/index.d.ts +3 -3
  139. package/dist/blocks/memberships/index.js +1 -1
  140. package/dist/blocks/memory/index.d.ts +1 -1
  141. package/dist/blocks/memory/index.js +1 -1
  142. package/dist/blocks/messaging/index.d.ts +5 -5
  143. package/dist/blocks/messaging/index.js +1 -1
  144. package/dist/blocks/metrics/index.d.ts +1 -1
  145. package/dist/blocks/metrics/index.js +1 -1
  146. package/dist/blocks/mfa/index.d.ts +2 -2
  147. package/dist/blocks/moderation/index.d.ts +1 -1
  148. package/dist/blocks/moderation/index.js +1 -1
  149. package/dist/blocks/notifications/index.d.ts +17 -6
  150. package/dist/blocks/notifications/index.js +110 -40
  151. package/dist/blocks/numbering/index.d.ts +1 -1
  152. package/dist/blocks/numbering/index.js +1 -1
  153. package/dist/blocks/oauth-server/index.d.ts +1 -1
  154. package/dist/blocks/oauth-server/index.js +1 -1
  155. package/dist/blocks/onboarding/index.d.ts +2 -2
  156. package/dist/blocks/onboarding/index.js +1 -1
  157. package/dist/blocks/orders/index.d.ts +2 -2
  158. package/dist/blocks/orders/index.js +1 -1
  159. package/dist/blocks/organizations/index.d.ts +38 -3
  160. package/dist/blocks/organizations/index.js +50 -5
  161. package/dist/blocks/outbox/index.d.ts +1 -1
  162. package/dist/blocks/outbox/index.js +1 -1
  163. package/dist/blocks/passes/index.d.ts +2 -2
  164. package/dist/blocks/passes/index.js +1 -1
  165. package/dist/blocks/permissions/index.d.ts +4 -4
  166. package/dist/blocks/permissions/index.js +2 -2
  167. package/dist/blocks/pipelines/index.d.ts +1 -1
  168. package/dist/blocks/pipelines/index.js +1 -1
  169. package/dist/blocks/posts/index.d.ts +2 -2
  170. package/dist/blocks/posts/index.js +1 -1
  171. package/dist/blocks/profiles/index.d.ts +1 -1
  172. package/dist/blocks/profiles/index.js +1 -1
  173. package/dist/blocks/promotions/index.d.ts +1 -1
  174. package/dist/blocks/promotions/index.js +1 -1
  175. package/dist/blocks/push/index.d.ts +76 -10
  176. package/dist/blocks/push/index.js +172 -43
  177. package/dist/blocks/queue/index.d.ts +1 -1
  178. package/dist/blocks/queue/index.js +1 -1
  179. package/dist/blocks/quotes/index.d.ts +1 -1
  180. package/dist/blocks/quotes/index.js +1 -1
  181. package/dist/blocks/rank/index.d.ts +1 -1
  182. package/dist/blocks/reactions/index.d.ts +4 -4
  183. package/dist/blocks/reactions/index.js +1 -1
  184. package/dist/blocks/relations/index.d.ts +1 -1
  185. package/dist/blocks/relations/index.js +1 -1
  186. package/dist/blocks/reminders/index.d.ts +1 -1
  187. package/dist/blocks/reminders/index.js +1 -1
  188. package/dist/blocks/reviews/index.d.ts +1 -1
  189. package/dist/blocks/reviews/index.js +1 -1
  190. package/dist/blocks/saved-views/index.d.ts +2 -2
  191. package/dist/blocks/saved-views/index.js +1 -1
  192. package/dist/blocks/scores/index.d.ts +1 -1
  193. package/dist/blocks/scores/index.js +1 -1
  194. package/dist/blocks/search/index.d.ts +3 -3
  195. package/dist/blocks/search/index.js +1 -1
  196. package/dist/blocks/security-events/index.d.ts +1 -1
  197. package/dist/blocks/security-events/index.js +1 -1
  198. package/dist/blocks/segments/index.d.ts +2 -2
  199. package/dist/blocks/segments/index.js +1 -1
  200. package/dist/blocks/sequences/index.d.ts +2 -2
  201. package/dist/blocks/sequences/index.js +1 -1
  202. package/dist/blocks/service-accounts/index.d.ts +1 -1
  203. package/dist/blocks/service-accounts/index.js +1 -1
  204. package/dist/blocks/sessions/index.d.ts +2 -2
  205. package/dist/blocks/sessions/index.js +1 -1
  206. package/dist/blocks/settings/index.d.ts +2 -2
  207. package/dist/blocks/settings/index.js +1 -1
  208. package/dist/blocks/share-links/index.d.ts +1 -1
  209. package/dist/blocks/share-links/index.js +1 -1
  210. package/dist/blocks/shipments/index.d.ts +2 -2
  211. package/dist/blocks/shipments/index.js +1 -1
  212. package/dist/blocks/signatures/index.d.ts +2 -2
  213. package/dist/blocks/signatures/index.js +1 -1
  214. package/dist/blocks/signing-keys/index.d.ts +1 -1
  215. package/dist/blocks/signing-keys/index.js +1 -1
  216. package/dist/blocks/sla/index.d.ts +1 -1
  217. package/dist/blocks/sla/index.js +1 -1
  218. package/dist/blocks/sso/index.d.ts +1 -1
  219. package/dist/blocks/sso/index.js +1 -1
  220. package/dist/blocks/state-machine/index.d.ts +1 -1
  221. package/dist/blocks/state-machine/index.js +1 -1
  222. package/dist/blocks/subjects/index.d.ts +2 -2
  223. package/dist/blocks/tags/index.d.ts +2 -2
  224. package/dist/blocks/tags/index.js +1 -1
  225. package/dist/blocks/tasks/index.d.ts +2 -2
  226. package/dist/blocks/tasks/index.js +1 -1
  227. package/dist/blocks/teams/index.d.ts +1 -1
  228. package/dist/blocks/teams/index.js +1 -1
  229. package/dist/blocks/templates/index.d.ts +2 -2
  230. package/dist/blocks/templates/index.js +1 -1
  231. package/dist/blocks/time-tracking/index.d.ts +1 -1
  232. package/dist/blocks/time-tracking/index.js +1 -1
  233. package/dist/blocks/timeline/index.d.ts +1 -1
  234. package/dist/blocks/trash/index.d.ts +1 -1
  235. package/dist/blocks/trash/index.js +1 -1
  236. package/dist/blocks/undo/index.d.ts +2 -2
  237. package/dist/blocks/updated-at/index.d.ts +1 -1
  238. package/dist/blocks/updated-at/index.js +1 -1
  239. package/dist/blocks/usage/index.d.ts +2 -2
  240. package/dist/blocks/usage/index.js +1 -1
  241. package/dist/blocks/vercel-marketplace/index.d.ts +1 -1
  242. package/dist/blocks/vercel-marketplace/index.js +1 -1
  243. package/dist/blocks/versions/index.d.ts +1 -1
  244. package/dist/blocks/versions/index.js +1 -1
  245. package/dist/blocks/waitlist/index.d.ts +1 -1
  246. package/dist/blocks/waitlist/index.js +1 -1
  247. package/dist/blocks/webhooks/index.d.ts +1 -1
  248. package/dist/blocks/webhooks/index.js +1 -1
  249. package/dist/blocks/workflow-editor/index.d.ts +4 -4
  250. package/dist/blocks/workflow-editor/index.js +1 -1
  251. package/dist/blocks/workflows/index.d.ts +4 -4
  252. package/dist/{channel-BjvGO39m.d.ts → channel-JcMd5lNP.d.ts} +30 -2
  253. package/dist/cli/{add-DMcrsWjC.js → add-B1S3yK4L.js} +18 -13
  254. package/dist/cli/add-BQPJnapO.js +1 -0
  255. package/dist/cli/{add-BinNYhFD.js → add-D7YIXslp.js} +2 -2
  256. package/dist/cli/{backfill-DxBB62Zr.js → backfill-BwkyNhlC.js} +4 -4
  257. package/dist/cli/bin.js +1 -1
  258. package/dist/cli/{blocks-rxOS-Mzz.js → blocks-CBqENu3C.js} +1 -1
  259. package/dist/cli/{blocks-DSgTifw0.js → blocks-DDm1Zc2S.js} +2 -2
  260. package/dist/cli/{cache-oU0yHKf0.js → cache-DE2IH1-C.js} +1 -1
  261. package/dist/cli/{codemod-Dsrv_3gQ.js → codemod-OHKhVV-v.js} +4 -4
  262. package/dist/cli/{command-CQ61x6gN.js → command-BWEEXmtz.js} +20 -0
  263. package/dist/cli/{completion-Dlu5AdUW.js → completion-8EDK21xj.js} +1 -1
  264. package/dist/cli/{completion-BwI0_Ap5.js → completion-BfnKI4QZ.js} +2 -2
  265. package/dist/cli/{completion-2Y3D_eNu.js → completion-Bt7LMypX.js} +2 -2
  266. package/dist/cli/{config-2rwFHbwj.js → config-BJSqMi04.js} +17 -5
  267. package/dist/cli/{config-C6XylzKz.js → config-BlfVh0IP.js} +1 -1
  268. package/dist/cli/{config-CPux9Wa7.js → config-WKDixoGK.js} +1 -1
  269. package/dist/cli/{content-mapper-DLbXilBz.js → content-mapper-CaygHH_k.js} +2 -2
  270. package/dist/cli/{db-Bwrr3GHM.js → db-DYU5hUcd.js} +3 -3
  271. package/dist/cli/{doctor-CKt5Yyl4.js → doctor-D_nrsd9E.js} +17 -16
  272. package/dist/cli/{env-BBl5L8Bf.js → env-BCgVZkcb.js} +1 -1
  273. package/dist/cli/env-xhwXk5Ri.js +1 -0
  274. package/dist/cli/{gen-CeG6lbka.js → gen-D7gMEwvg.js} +22 -15
  275. package/dist/cli/index.d.ts +2 -2
  276. package/dist/cli/index.js +8 -8
  277. package/dist/cli/{init-DrQlf9RL.js → init-ch-HWJyp.js} +7 -7
  278. package/dist/cli/{keys-DGEpMbeB.js → keys-CbaL0lnw.js} +1 -1
  279. package/dist/cli/{live-BvWGM4c3.js → live-B38ePuRS.js} +2 -2
  280. package/dist/cli/{mcp-BrOnGB15.js → mcp-P9RP2SJ3.js} +3 -3
  281. package/dist/cli/{metadata-BNSdPuKp.js → metadata-BTihErEc.js} +3 -3
  282. package/dist/cli/{migration-safety-NtB3dsRU.js → migration-safety-DYo1vVWC.js} +2 -2
  283. package/dist/cli/{module-migration-mKhX88V_.js → migrations-BoIyGczt.js} +3 -113
  284. package/dist/cli/module-migration-DXvo0EqU.js +119 -0
  285. package/dist/cli/{moved-CsfDQcyk.js → moved-DVwgE8lV.js} +1 -1
  286. package/dist/cli/{parse-B9Iv_-Pf.js → parse-B079x40m.js} +1 -1
  287. package/dist/cli/powersync-D-0yV_L_.js +283 -0
  288. package/dist/cli/powersync-DXVsKkAu.js +1 -0
  289. package/dist/cli/{print-Dh8iuPK3.js → print-CRon4lXf.js} +2 -1
  290. package/dist/cli/{remove-DfFXVBRr.js → remove-D89s99ha.js} +6 -6
  291. package/dist/cli/{render-ChIwdIOJ.js → render-BJF9ytUi.js} +8 -5
  292. package/dist/cli/{run-BXx6D1aR.js → run-DmOTMa44.js} +2 -2
  293. package/dist/cli/{run-CLSHSVYo.js → run-jeplMBOK.js} +29 -10
  294. package/dist/cli/{run-D48ZEU58.js → run-x9ZY4Tm0.js} +38 -37
  295. package/dist/cli/{seed-CG-pA-5N.js → seed-D9mt8bnW.js} +3 -3
  296. package/dist/cli/seed-EPO6AvLG.js +1 -0
  297. package/dist/cli/{shared-D0XBFSlz.js → shared-B38Chjgd.js} +1 -1
  298. package/dist/cli/{skills-toUan_OV.js → skills-FXAVPLzp.js} +1 -1
  299. package/dist/cli/{snapshot-C6vh_n3t.js → snapshot-BXmU3IXN.js} +3 -3
  300. package/dist/cli/{source-args-MTLYpifA.js → source-args-DlckPVje.js} +1 -1
  301. package/dist/cli/{source-BZbEK5if.js → source-irttnsEb.js} +1 -1
  302. package/dist/cli/{spec-B4LhpI6t.js → spec-CDxfokey.js} +3 -3
  303. package/dist/cli/{spec-C-dhdKwa.js → spec-DzD5wMVF.js} +1 -1
  304. package/dist/cli/{sql-layout-26LSoifK.js → sql-layout-D8QrNvt4.js} +2 -2
  305. package/dist/cli/{stack-CWEHdO0b.js → stack-DgASZP0K.js} +1 -1
  306. package/dist/cli/{sync-CHGMZCJ5.js → sync-s1iKFIos.js} +3 -2
  307. package/dist/cli/{upgrade-C0dVsqNX.js → upgrade-B4FPlK-_.js} +4 -3
  308. package/dist/cli/{upgrade-GB9rqUGT.js → upgrade-CluxP3JJ.js} +3 -3
  309. package/dist/cli/{version-T507a49w.js → version-TgFM8sOd.js} +1 -1
  310. package/dist/client/index.d.ts +5 -5
  311. package/dist/client/native/index.d.ts +4 -4
  312. package/dist/{composite-B7f1MMgr.d.ts → composite-C-8A8qzi.d.ts} +2 -2
  313. package/dist/{composite-B3TIjId4.js → composite-D24L5RIY.js} +2 -2
  314. package/dist/config/index.d.ts +3 -3
  315. package/dist/config/index.js +4 -4
  316. package/dist/{config-CIBc79_8.js → config-CD2OGfCG.js} +2 -1
  317. package/dist/{config-BVNNJwGC.js → config-mbVyJwSc.js} +3 -3
  318. package/dist/{context-CKCgjEDF.d.ts → context-D24k1Cpc.d.ts} +29 -4
  319. package/dist/{controller-CJUXhshv.d.ts → controller-BR7CZ1R9.d.ts} +1 -1
  320. package/dist/{conversion-DgHdDlTK.d.ts → conversion-BgtOfTaS.d.ts} +1 -1
  321. package/dist/create/index.d.ts +2 -2
  322. package/dist/create/index.js +5 -5
  323. package/dist/{define-block-Xxw8Hroe.d.ts → define-block-CJWiDWa5.d.ts} +10 -3
  324. package/dist/edge/index.d.ts +5 -5
  325. package/dist/edge/index.js +7 -7
  326. package/dist/elysia/index.d.ts +1 -1
  327. package/dist/elysia/index.js +1 -1
  328. package/dist/{email-tt2QqiSc.d.ts → email-B3YxEzwC.d.ts} +1 -1
  329. package/dist/{entitlements-B0jmjNLD.d.ts → entitlements-DHcNt1aF.d.ts} +1 -1
  330. package/dist/{events-SqJLbb8q.js → events-DuLhzjP6.js} +2 -0
  331. package/dist/expo/index.d.ts +1 -1
  332. package/dist/expo/index.js +3 -3
  333. package/dist/{field-errors-DqlebtTE.d.ts → field-errors-DucQdLl7.d.ts} +5 -5
  334. package/dist/{framework-BozTXRzt.js → framework-CNhTg0th.js} +1 -1
  335. package/dist/{framework-CF6zFU7a.d.ts → framework-x9Y4uB1q.d.ts} +4 -4
  336. package/dist/h3/index.d.ts +1 -1
  337. package/dist/h3/index.js +1 -1
  338. package/dist/h3/v1/index.d.ts +1 -1
  339. package/dist/h3/v1/index.js +1 -1
  340. package/dist/hono/index.d.ts +4 -4
  341. package/dist/hono/index.js +7 -6
  342. package/dist/{index-Dbb7BQdi.d.ts → index-4WT_uRRL.d.ts} +14 -3
  343. package/dist/{index-BCeTYhFk.d.ts → index-BAcQz5DS.d.ts} +1 -1
  344. package/dist/{index-lB-8iPmY.d.ts → index-BH3NYExp.d.ts} +2 -2
  345. package/dist/{index-B8YjrfVl.d.ts → index-C0t-vNIt.d.ts} +1 -1
  346. package/dist/{index-DUxXdQN_.d.ts → index-C6ruLtyx.d.ts} +2 -2
  347. package/dist/{index-ClMN0f98.d.ts → index-XAyzdLns.d.ts} +8 -8
  348. package/dist/{index-BxYOB1Oc.d.ts → index-iRkFvJ7J.d.ts} +1 -1
  349. package/dist/index.d.ts +1 -1
  350. package/dist/index.js +1 -1
  351. package/dist/{instances-QOzIz9-q.js → instances-DDt7NdVl.js} +1 -1
  352. package/dist/{kit-DOwKpSkA.d.ts → kit-CVgQCIBO.d.ts} +1 -1
  353. package/dist/{kit-5l-o8RxL.js → kit-DhlB-vv_.js} +1 -1
  354. package/dist/mapper/bin.js +7 -6
  355. package/dist/mcp/index.d.ts +9 -3
  356. package/dist/mcp/index.js +6 -6
  357. package/dist/mcp/sdk/index.d.ts +1 -1
  358. package/dist/mcp/sdk/index.js +2 -2
  359. package/dist/{methods-B3o7BFOW.js → methods-Cund9ZBe.js} +1 -1
  360. package/dist/nestjs/index.d.ts +2 -2
  361. package/dist/nestjs/index.js +1 -1
  362. package/dist/next/index.d.ts +12 -12
  363. package/dist/next/index.js +6 -6
  364. package/dist/node/index.d.ts +2 -2
  365. package/dist/node/index.js +1 -1
  366. package/dist/{operations-Dc07aV_H.d.ts → operations-CAjMgNr9.d.ts} +1 -1
  367. package/dist/{options-CK5WiFwG.js → options-3OYOU56e.js} +1 -1
  368. package/dist/{options-xD4_FRUq.js → options-56zYYXxc.js} +1 -1
  369. package/dist/{options-_F-enoBs.d.ts → options-5WvWOkAm.d.ts} +1 -1
  370. package/dist/{options-SViK_2x2.js → options-62woPFn3.js} +1 -1
  371. package/dist/{options-1GgseJq5.js → options-7ixoOoap.js} +1 -1
  372. package/dist/{options-BZsoPJGX.js → options-9dSU5RML.js} +2 -2
  373. package/dist/{options-y_-AkVCs.d.ts → options-B0YZtAkb.d.ts} +1 -1
  374. package/dist/{options-HLwOuF2H.js → options-B2Kz_tCx.js} +2 -2
  375. package/dist/{options-CEMawFrr.js → options-B685YSzQ.js} +1 -1
  376. package/dist/{options-DWbA9buW.js → options-B692WoK6.js} +2 -2
  377. package/dist/options-BHU1wc74.js +5 -0
  378. package/dist/{options-CPK2nQER.js → options-BHy0Z5Zd.js} +2 -2
  379. package/dist/{options-Fz6xqu-b.js → options-BKDxrPvE.js} +2 -2
  380. package/dist/{options-BVg58avP.js → options-BLfymS4s.js} +2 -2
  381. package/dist/{options-CYV4iZiQ.js → options-BOCRbzh3.js} +1 -1
  382. package/dist/{options-tSsUF0-7.js → options-BQWJqwHO.js} +1 -1
  383. package/dist/{options-Cl9Ag2Pt.js → options-BQunK6_Y.js} +2 -2
  384. package/dist/{options-CljDnQt2.js → options-BQyrZjwM.js} +4 -1
  385. package/dist/options-BR9xTHZW.js +5 -0
  386. package/dist/{options-D40CQzji.js → options-BRUdd5jY.js} +1 -1
  387. package/dist/{options-CsGl5BLH.d.ts → options-BTmaRzx2.d.ts} +13 -5
  388. package/dist/{options-Li1Dyu88.d.ts → options-BUCQYAeJ.d.ts} +2 -2
  389. package/dist/{options-B5BU2Yg7.js → options-BawzwlmC.js} +2 -2
  390. package/dist/{options-BlzSfWxC.d.ts → options-BbLDAp7G.d.ts} +2 -2
  391. package/dist/{options-DTDxFT6J.js → options-Bc4xz5jQ.js} +2 -2
  392. package/dist/options-BfFC4iFE.js +8 -0
  393. package/dist/{options-Br1Xi2Hw.js → options-BfPsL7E2.js} +1 -1
  394. package/dist/{options-DYBQ973I.js → options-Bfmwwc78.js} +1 -1
  395. package/dist/{options-c5WCsky5.js → options-BhsdveDk.js} +2 -2
  396. package/dist/{options-B5woz53h.js → options-BomoTH-8.js} +2 -2
  397. package/dist/{options-DeNejBtq.js → options-BtjkzIVh.js} +1 -1
  398. package/dist/options-Bvi9bl4H.js +5 -0
  399. package/dist/{options-IHPg8ZoA.js → options-BwKNmaJo.js} +2 -2
  400. package/dist/{options-CtUUU71w.js → options-BxpLtyk-.js} +4 -6
  401. package/dist/{options-D_bBVCXg.js → options-BzB2QxL3.js} +1 -1
  402. package/dist/{options-CmraJhd9.js → options-C078wBP0.js} +1 -1
  403. package/dist/options-C1-pwEqm.js +5 -0
  404. package/dist/{options-BZOliZvb.js → options-C3AdsFJ6.js} +2 -2
  405. package/dist/options-C7C5OhmL.d.ts +8 -0
  406. package/dist/{options-CCUaRLgd.js → options-C87u6eSa.js} +1 -1
  407. package/dist/{options-CVSWgZpY.js → options-CBAEGxwS.js} +1 -1
  408. package/dist/{options-9gvPo1BC.js → options-CDUr8zzX.js} +1 -1
  409. package/dist/{options-DMR68VAC.js → options-CFjGxfa8.js} +2 -2
  410. package/dist/{options-Bf96aVk5.js → options-CI6P0xhV.js} +1 -1
  411. package/dist/{options-B5VUf4IT.js → options-CJFMK9A_.js} +1 -1
  412. package/dist/{options-CRz8Ht_4.js → options-CLpgx7en.js} +3 -2
  413. package/dist/{options-BesyRBnM.js → options-CTXHj9zr.js} +2 -2
  414. package/dist/{options-D2d1fFuw.js → options-CTl8T88w.js} +1 -1
  415. package/dist/{options-C3RgtOLo.js → options-CTv-xmbA.js} +2 -2
  416. package/dist/{options-Bpl-WFPk.js → options-CUIOOv4z.js} +1 -1
  417. package/dist/{options-o2kfYU2x.js → options-CZDmtsbV.js} +2 -2
  418. package/dist/{options-CF7nRWXS.js → options-CZTscdPB.js} +1 -1
  419. package/dist/{options-BlncUmIc.js → options-CZdKndeo.js} +2 -2
  420. package/dist/{options-DplE18Ko.d.ts → options-C_7g9TTq.d.ts} +1 -1
  421. package/dist/{options-C_pb1Nd3.js → options-Cb2FOFj5.js} +1 -1
  422. package/dist/{options-t_O5ldT6.js → options-CbOstLa7.js} +2 -2
  423. package/dist/{options-Bt0bYMLl.js → options-CcXgWlvm.js} +2 -2
  424. package/dist/{options-BMjcVuaI.js → options-CfVPctAw.js} +7 -0
  425. package/dist/{options-DWpz3V3F.js → options-ChiL-4ZS.js} +2 -2
  426. package/dist/{options-E7KcmHQv.js → options-Cjgaf8ub.js} +2 -2
  427. package/dist/{options-DrSkIBCD.js → options-CoSPgWKy.js} +1 -1
  428. package/dist/{options-Bp7sgKvl.js → options-CpZ2HlSU.js} +5 -3
  429. package/dist/{options-CN7PHkhU.js → options-CsSe8Nba.js} +1 -1
  430. package/dist/{options-B9q8CROT.js → options-CsvJR-r2.js} +1 -1
  431. package/dist/{options-oeAq4Ho5.js → options-Cucv6sWP.js} +2 -2
  432. package/dist/{options-BOOEzor9.js → options-CyjL9lTf.js} +2 -2
  433. package/dist/{options-pOVWwbAK.d.ts → options-D-OOO9V2.d.ts} +1 -1
  434. package/dist/{options-nFzfgtA6.js → options-D0Y6ZMe8.js} +1 -1
  435. package/dist/{options-BnZS7IK-.js → options-D0sj5abR.js} +2 -2
  436. package/dist/{options-0qvUckqt.js → options-D2s7fT1s.js} +2 -2
  437. package/dist/{options-BjtrC7o6.js → options-D32-YxnO.js} +1 -1
  438. package/dist/{options-B0EJULm5.js → options-D610Fa6T.js} +2 -2
  439. package/dist/{options-BvtnxHfK.js → options-D96dScev.js} +1 -1
  440. package/dist/{options-DgQo80Xh.js → options-DFpyP1bg.js} +2 -2
  441. package/dist/{options-BYOtaF7w.js → options-DJEcS4DX.js} +1 -1
  442. package/dist/{options-DPgdAXO5.js → options-DJbN3bi9.js} +2 -2
  443. package/dist/{options-EsUh744F.js → options-DKoQoRCy.js} +2 -2
  444. package/dist/{options-CvD9vNvx.js → options-DM1qaMMQ.js} +1 -1
  445. package/dist/{options-eBPsk4WI.js → options-DNgSwhsm.js} +2 -2
  446. package/dist/{options-2EMA_x6_.js → options-DOIwzRXL.js} +2 -2
  447. package/dist/{options-D6as77gU.d.ts → options-DRIgHh4O.d.ts} +2 -2
  448. package/dist/{options-DDzggjN7.js → options-DRrZmJyI.js} +2 -2
  449. package/dist/{options-DJ-aYPVN.js → options-DUMUsvml.js} +2 -2
  450. package/dist/{options-Cp0HyUEk.js → options-DWwL5Kaz.js} +1 -1
  451. package/dist/{options-BCrqe3HH.js → options-DZHZYlpD.js} +1 -1
  452. package/dist/{options-BQIYfx9F.js → options-DZLkeqWn.js} +2 -2
  453. package/dist/{options-RKYdmIdV.js → options-DZRpXKQE.js} +1 -1
  454. package/dist/{options-D0G06Zm9.js → options-D_9Vxx7f.js} +2 -2
  455. package/dist/{options-BMGClqoa.js → options-DcHl59RC.js} +1 -1
  456. package/dist/{options-CW9wTqOk.js → options-Dcaql09y.js} +1 -1
  457. package/dist/{options-CXFz0xxS.js → options-DcnBNYmV.js} +1 -1
  458. package/dist/{options-21s0dpnX.js → options-DdpM-fiP.js} +2 -2
  459. package/dist/{options-BbnPv6p7.js → options-DhdazgTZ.js} +2 -2
  460. package/dist/{options-C239TLRF.js → options-Dpy-Ruo-.js} +1 -1
  461. package/dist/{options-DWVYM8P0.d.ts → options-DsVuVRH3.d.ts} +1 -1
  462. package/dist/{options-BlOPivzq.js → options-DtAJxfHS.js} +1 -1
  463. package/dist/{options-DXnBN2E7.js → options-Dz9Yo52Z.js} +2 -2
  464. package/dist/{options-DcOx8_3X.d.ts → options-HnfETSHr.d.ts} +1 -1
  465. package/dist/{options-CoX6VKGb.js → options-LqUXTpML.js} +1 -1
  466. package/dist/options-MsloEAIB.js +5 -0
  467. package/dist/{options-DCduTMST.js → options-P2FxqYpd.js} +2 -2
  468. package/dist/options-_1gAIMq7.d.ts +60 -0
  469. package/dist/{options-B0FcEKtH.js → options-aT89JqlB.js} +1 -1
  470. package/dist/{options-Cyu0hgmN.js → options-cVKZu9b0.js} +2 -2
  471. package/dist/options-fMxhtuVR.js +5 -0
  472. package/dist/{options-BxcFLL1G.js → options-fkShrmGQ.js} +2 -2
  473. package/dist/{options-Ctac2R0Q.js → options-gUvfr3no.js} +2 -2
  474. package/dist/{options-DNKyN5uq.js → options-hynwKWuf.js} +2 -2
  475. package/dist/{options-CkScQRJR.js → options-lsxJYfYx.js} +2 -2
  476. package/dist/{options-CyAhRKKm.d.ts → options-o5wCw8H7.d.ts} +2 -2
  477. package/dist/{options-DARkpk2P.js → options-p49DFg3H.js} +2 -2
  478. package/dist/{options-zkyhM3qi.js → options-pYNpXKcg.js} +1 -1
  479. package/dist/{options-Cqq2jUww.js → options-qtETCHzW.js} +2 -2
  480. package/dist/options-rnKlqYEr.js +5 -0
  481. package/dist/{options-KV84gAxl.js → options-sU_zGkiV.js} +2 -2
  482. package/dist/{options-BfLmA375.js → options-xq4MXG1M.js} +2 -2
  483. package/dist/{options-BA6jV6py.js → options-zzlznRA7.js} +2 -2
  484. package/dist/orpc/index.d.ts +19 -8
  485. package/dist/orpc/index.js +60 -31
  486. package/dist/otel/index.d.ts +1 -1
  487. package/dist/otel/index.js +5 -5
  488. package/dist/{ports-DnpAuTvB.d.ts → ports-g0H1Kzwr.d.ts} +1 -1
  489. package/dist/powersync/index.d.ts +135 -2
  490. package/dist/powersync/index.js +333 -1
  491. package/dist/preset/index.d.ts +3 -3
  492. package/dist/preset/index.js +3 -3
  493. package/dist/{preset-BIANzB5p.js → preset-B3CukUhu.js} +4 -4
  494. package/dist/{push-token-C_mFkYfq.d.ts → push-token-Cl2EihRc.d.ts} +1 -1
  495. package/dist/query/index.d.ts +1 -1
  496. package/dist/react/index.d.ts +5 -5
  497. package/dist/react/native/index.d.ts +1 -1
  498. package/dist/react/server.d.ts +5 -5
  499. package/dist/react-router/index.d.ts +3 -3
  500. package/dist/react-router/index.js +5 -5
  501. package/dist/realtime/index.d.ts +3 -3
  502. package/dist/realtime/index.js +1 -1
  503. package/dist/{record-form-xWvVcb86.d.ts → record-form-zMwz0Ayt.d.ts} +1 -1
  504. package/dist/records/index.d.ts +7 -7
  505. package/dist/{refusal-ByBZcm0V.js → refusal-D48CMqpQ.js} +2 -2
  506. package/dist/{refusal-CSntB_x8.d.ts → refusal-OrlI3g4H.d.ts} +1 -1
  507. package/dist/{resource-DV2GC2dB.js → resource-R3KToNze.js} +1 -1
  508. package/dist/{resource-execute-DqWfEc56.d.ts → resource-execute-CKBtGL8-.d.ts} +1 -1
  509. package/dist/{resource-types-BIoz_ElD.d.ts → resource-types-8Q5Klkpa.d.ts} +1 -1
  510. package/dist/{resources-C02l_YBJ.js → resources-DqIwoQsP.js} +1 -1
  511. package/dist/{resources-Bt2PDKE7.d.ts → resources-DxpqenZA.d.ts} +1 -1
  512. package/dist/{respond-C3CcOZlA.js → respond-3RKp6VgU.js} +8 -1
  513. package/dist/{respond-Dn1_YhC1.d.ts → respond-oZeJ342J.d.ts} +6 -0
  514. package/dist/server/index.d.ts +6 -6
  515. package/dist/server/index.js +6 -6
  516. package/dist/{session-C1OuXbtN.d.ts → session-Fcft5A39.d.ts} +1 -1
  517. package/dist/{sign-in-B64114O4.js → sign-in-BLkRU3lc.js} +1 -1
  518. package/dist/solid/index.d.ts +5 -5
  519. package/dist/solid-start/index.d.ts +3 -3
  520. package/dist/solid-start/index.js +5 -5
  521. package/dist/spec/index.d.ts +2 -2
  522. package/dist/spec/index.js +1 -1
  523. package/dist/{spec-pins-DIx95afw.d.ts → spec-pins-BZkKfwY8.d.ts} +2 -0
  524. package/dist/{spec-pins-C1Vm8OBl.js → spec-pins-D3zDek-u.js} +1 -0
  525. package/dist/sql/index.d.ts +5 -5
  526. package/dist/sql/index.js +5 -5
  527. package/dist/{sql-ClTmzHs8.js → sql-fHTjZGqR.js} +2608 -1415
  528. package/dist/sql-type-iUSZpaUu.js +34 -0
  529. package/dist/ssr/index.d.ts +1 -1
  530. package/dist/{statuses-DMMDwXpZ.js → statuses-Alll5Ip6.js} +2 -2
  531. package/dist/storage/index.js +1 -1
  532. package/dist/svelte/index.d.ts +5 -5
  533. package/dist/sveltekit/index.d.ts +3 -3
  534. package/dist/sveltekit/index.js +5 -5
  535. package/dist/tanstack-start/index.d.ts +3 -3
  536. package/dist/tanstack-start/index.js +5 -5
  537. package/dist/{tenant-DVvjw9H-.d.ts → tenant-DyoVYFfC.d.ts} +1 -1
  538. package/dist/testing/index.d.ts +7 -7
  539. package/dist/testing/index.js +6 -3
  540. package/dist/{timeline-BBfKuMVL.d.ts → timeline-CMmo0R7g.d.ts} +2 -2
  541. package/dist/{topic-ikV_pLTX.js → topic-J9I3yu6f.js} +1 -1
  542. package/dist/{topic-BtLz-qTI.d.ts → topic-nQYxoTaU.d.ts} +1 -1
  543. package/dist/vue/index.d.ts +5 -5
  544. package/dist/{watch-topic-tnfOTa3-.d.ts → watch-topic-UGSEWAqR.d.ts} +1 -1
  545. package/dist/workflow-sdk/world/index.js +1 -1
  546. package/dist/{workflow-sdk-Bw6_u0ar.js → workflow-sdk-DELaQEp3.js} +2 -0
  547. package/dist/yjs/index.d.ts +1 -1
  548. package/dist/yjs/index.js +1 -1
  549. package/package.json +1 -1
  550. package/schemas/config-v1.json +449 -69
  551. package/dist/cli/add-z-3pXI6C.js +0 -1
  552. package/dist/cli/env-CAU1nknN.js +0 -1
  553. package/dist/cli/seed-CUxW5Dks.js +0 -1
  554. package/dist/options-63AKQNv0.js +0 -5
  555. package/dist/options-B-cxGmRA.js +0 -5
  556. package/dist/options-BPDiwSa-.js +0 -5
  557. package/dist/options-C6rEL6U5.js +0 -8
  558. package/dist/options-CE93HOYi.d.ts +0 -7
  559. package/dist/options-CTZNpb2n.js +0 -5
  560. package/dist/options-CrC78Tee.js +0 -5
  561. package/dist/options-DINdgVih.d.ts +0 -9
  562. package/dist/options-DWML05Cp.js +0 -5
  563. package/dist/options-Q1Bzgqpr.js +0 -5
@@ -0,0 +1,283 @@
1
+ import { p as commandMeta, r as defineCliCommand } from "./command-BWEEXmtz.js";
2
+ import { c as layoutFor, i as stampAfter } from "./migrations-BoIyGczt.js";
3
+ import { n as PLAN_ARGS, r as applyPlan, u as planResult } from "./files-CX71yBm8.js";
4
+ import { n as migrationsDir } from "./sql-layout-D8QrNvt4.js";
5
+ import { existsSync } from "node:fs";
6
+ import { join, resolve } from "node:path";
7
+ import { readFile, readdir } from "node:fs/promises";
8
+ import { declaredColumnTypes, renderBlocks } from "better-supabase/sql";
9
+ import { SPEC_PINS } from "better-supabase";
10
+ //#region src/cli/powersync/streams.ts
11
+ /** The blocks `gen.powersync` can sync. */
12
+ const POWERSYNC_BLOCKS = ["notifications", "attachments"];
13
+ const isPowerSyncBlock = (value) => POWERSYNC_BLOCKS.some((block) => block === value);
14
+ const GENERATED = "@generated by better-supabase gen";
15
+ const SAFE_IDENT = /^[a-z_][a-z0-9_]*$/;
16
+ const ident = (name) => SAFE_IDENT.test(name) ? name : `"${name.replaceAll("\"", "\"\"")}"`;
17
+ const qualifiedIdent = (qualified) => {
18
+ const dot = qualified.indexOf(".");
19
+ return `${ident(qualified.slice(0, dot))}.${ident(qualified.slice(dot + 1))}`;
20
+ };
21
+ const baseName = (qualified) => qualified.slice(qualified.indexOf(".") + 1);
22
+ /** The PowerSync column type a Postgres type syncs as. */
23
+ function powersyncColumnType(type) {
24
+ const base = type.replace(/\[\]$/, "").replace(/\(.*\)$/, "");
25
+ if (/^(?:smallint|integer|int|int2|int4|int8|bigint|boolean|bool|smallserial|serial|bigserial)$/.test(base) && !type.endsWith("[]")) return "integer";
26
+ if (/^(?:real|double precision|float4|float8|numeric|decimal)$/.test(base) && !type.endsWith("[]")) return "real";
27
+ return "text";
28
+ }
29
+ const CREATE_TABLE = /create table (?:if not exists )?("(?:[^"]|"")+"|[a-z_][a-z0-9_$]*)\./gi;
30
+ const unquote = (name) => name.startsWith("\"") ? name.slice(1, -1).replaceAll("\"\"", "\"") : name;
31
+ function tablesOf(input, key) {
32
+ const files = input.files.flatMap((file) => file.kind === "schema" && (file.instance ?? file.module) === key ? [{ text: file.contents }] : []);
33
+ const schemas = new Set(files.flatMap(({ text }) => [...text.matchAll(CREATE_TABLE)].map((match) => unquote(match[1]))));
34
+ return declaredColumnTypes(files, [...schemas]);
35
+ }
36
+ /** The table of `tables` that has every one of `columns`. */
37
+ function tableWith(tables, columns, what) {
38
+ const found = [...tables].find(([, declared]) => columns.every((column) => declared.has(column)));
39
+ if (found === void 0) throw new Error(`gen.powersync: found no ${what} table`);
40
+ return found;
41
+ }
42
+ function notificationTables(input, instance) {
43
+ const tables = tablesOf(input, instance.key);
44
+ const [recipients, recipientColumns] = tableWith(tables, [
45
+ "event_id",
46
+ "user_id",
47
+ "read_at",
48
+ "dismissed_at"
49
+ ], `${instance.key} recipients`);
50
+ const [events, eventColumns] = tableWith(tables, [
51
+ "type",
52
+ "idempotency_key",
53
+ "summary"
54
+ ], `${instance.key} events`);
55
+ const mine = `${qualifiedIdent(recipients)} WHERE user_id = auth.user_id()`;
56
+ return [{
57
+ qualified: recipients,
58
+ name: baseName(recipients),
59
+ stream: `${instance.key}_recipients`,
60
+ query: `SELECT * FROM ${mine}`,
61
+ columns: recipientColumns
62
+ }, {
63
+ qualified: events,
64
+ name: baseName(events),
65
+ stream: `${instance.key}_events`,
66
+ query: `SELECT * FROM ${qualifiedIdent(events)} WHERE id IN (SELECT event_id FROM ${mine})`,
67
+ columns: eventColumns
68
+ }];
69
+ }
70
+ function attachmentTables(input, instance) {
71
+ const [attachments, columns] = tableWith(tablesOf(input, instance.key), [
72
+ "bucket",
73
+ "object_path",
74
+ "uploaded_by"
75
+ ], `${instance.key} attachments`);
76
+ const memberships = [...tablesOf(input, "memberships")].find(([, declared]) => declared.has("user_id") && declared.has("role"));
77
+ if (memberships === void 0) throw new Error(`gen.powersync: ${instance.key} syncs the files of the user's organizations, which needs the memberships block`);
78
+ const [membershipTable, membershipColumns] = memberships;
79
+ const tenant = [...columns.keys()].find((column) => column.endsWith("_id") && column !== "user_id" && membershipColumns.has(column));
80
+ if (tenant === void 0) throw new Error(`gen.powersync: ${instance.key} and memberships share no organization column`);
81
+ return [{
82
+ qualified: attachments,
83
+ name: baseName(attachments),
84
+ stream: instance.key,
85
+ query: `SELECT * FROM ${qualifiedIdent(attachments)} WHERE ${ident(tenant)} IN (SELECT ${ident(tenant)} FROM ${qualifiedIdent(membershipTable)} WHERE user_id = auth.user_id())`,
86
+ columns
87
+ }];
88
+ }
89
+ function syncedTables(input, instance) {
90
+ switch (instance.block) {
91
+ case "notifications": return notificationTables(input, instance);
92
+ case "attachments": return attachmentTables(input, instance);
93
+ default: {
94
+ const unknown = instance.block;
95
+ throw new Error(`gen.powersync: ${String(unknown)} can't sync`);
96
+ }
97
+ }
98
+ }
99
+ const yamlString = (text) => JSON.stringify(text);
100
+ function streamsYaml(tables) {
101
+ const streams = tables.flatMap((table) => [
102
+ ` ${table.stream}:`,
103
+ " auto_subscribe: true",
104
+ ` query: ${yamlString(table.query)}`
105
+ ]);
106
+ return [
107
+ `# ${GENERATED}. Do not edit; run \`better-supabase gen\` instead.`,
108
+ "config:",
109
+ ` edition: ${SPEC_PINS.powersyncSyncStreams}`,
110
+ "",
111
+ "streams:",
112
+ ...streams,
113
+ ""
114
+ ].join("\n");
115
+ }
116
+ function publicationSql(tables) {
117
+ const names = tables.map((table) => `('${table.qualified.replaceAll("'", "''")}')`).join(", ");
118
+ return `-- ${GENERATED}: the block tables PowerSync replicates.
119
+ do $$
120
+ declare
121
+ t record;
122
+ begin
123
+ if not exists (select 1 from pg_publication where pubname = 'powersync') then
124
+ create publication powersync;
125
+ end if;
126
+
127
+ for t in
128
+ select n.nspname as schema_name, c.relname as table_name
129
+ from (values ${names}) as wanted (name)
130
+ join pg_class c on c.oid = wanted.name::regclass
131
+ join pg_namespace n on n.oid = c.relnamespace
132
+ where not exists (
133
+ select 1 from pg_publication_tables p
134
+ where p.pubname = 'powersync' and p.schemaname = n.nspname and p.tablename = c.relname
135
+ )
136
+ loop
137
+ execute format('alter publication powersync add table %I.%I', t.schema_name, t.table_name);
138
+ end loop;
139
+ end;
140
+ $$;
141
+ `;
142
+ }
143
+ const propertyName = (name) => /^[A-Za-z_$][\w$]*$/.test(name) ? name : JSON.stringify(name);
144
+ function schemaModule(tables, importFrom) {
145
+ const definitions = tables.map((table) => {
146
+ const columns = [...table.columns].filter(([column]) => column !== "id").map(([column, type]) => ` ${propertyName(column)}: column.${powersyncColumnType(type)},`);
147
+ return [
148
+ `export const ${table.name} = new Table({`,
149
+ ...columns,
150
+ "});"
151
+ ].join("\n");
152
+ });
153
+ return [
154
+ `// ${GENERATED}. Do not edit; run \`better-supabase gen\` instead.`,
155
+ "",
156
+ `import { column, Table } from ${JSON.stringify(importFrom)};`,
157
+ "",
158
+ ...definitions.flatMap((definition) => [definition, ""]),
159
+ "/** The block tables, to spread into the app's `new Schema({ ... })`. */",
160
+ `export const blockTables = { ${tables.map((table) => table.name).join(", ")} };`,
161
+ ""
162
+ ].join("\n");
163
+ }
164
+ /** The sync streams, publication and PowerSync schema for `input.instances`. */
165
+ function powersyncOutput(input) {
166
+ const byInstance = input.instances.map((instance) => [instance.key, syncedTables(input, instance)]);
167
+ const tables = byInstance.flatMap(([, synced]) => synced);
168
+ return {
169
+ streams: streamsYaml(tables),
170
+ publication: publicationSql(tables),
171
+ schema: schemaModule(tables, input.importFrom),
172
+ tables: Object.fromEntries(byInstance.map(([key, synced]) => [key, synced.map(({ name }) => name)]))
173
+ };
174
+ }
175
+ //#endregion
176
+ //#region src/cli/commands/powersync.ts
177
+ const ARGS = {
178
+ instance: {
179
+ type: "string",
180
+ description: "Block instances to sync, comma separated. Defaults to gen.powersync.instances",
181
+ valueHint: "keys"
182
+ },
183
+ out: {
184
+ type: "string",
185
+ description: "Folder for sync-streams.yaml and schema.ts. Defaults to gen.powersync.out, then powersync",
186
+ valueHint: "dir"
187
+ },
188
+ ...PLAN_ARGS
189
+ };
190
+ const PUBLICATION_SUFFIX = "_powersync_publication.sql";
191
+ const REGENERATE = "better-supabase powersync streams";
192
+ function instancesOf(config, keys) {
193
+ const instances = [];
194
+ for (const key of keys) {
195
+ const block = config.instances[key]?.block;
196
+ if (block === void 0) return `${key} is not a block in the config.`;
197
+ if (!isPowerSyncBlock(block)) return `${key} installs ${block}, which can't sync yet. PowerSync syncs ${POWERSYNC_BLOCKS.join(" and ")}.`;
198
+ instances.push({
199
+ key,
200
+ block
201
+ });
202
+ }
203
+ return instances;
204
+ }
205
+ /**
206
+ * The publication migration, unless the newest one already adds these tables: a
207
+ * pushed migration is never rewritten, so a change gets a new one.
208
+ */
209
+ async function publicationMigration(config, sql, now) {
210
+ const dir = resolve(config.root, migrationsDir(config));
211
+ const names = existsSync(dir) ? (await readdir(dir)).toSorted() : [];
212
+ const latest = names.findLast((name) => name.endsWith(PUBLICATION_SUFFIX));
213
+ if (latest !== void 0 && await readFile(join(dir, latest), "utf-8") === sql) return;
214
+ return {
215
+ path: join(dir, `${stampAfter(names, now())}${PUBLICATION_SUFFIX}`),
216
+ contents: sql,
217
+ policy: "create",
218
+ note: "adds the tables to the powersync publication"
219
+ };
220
+ }
221
+ /**
222
+ * Writes `sync-streams.yaml` and `schema.ts` for the synced block instances,
223
+ * and a migration that adds their tables to the `powersync` publication.
224
+ */
225
+ async function runPowerSync(config, args, now = () => /* @__PURE__ */ new Date()) {
226
+ const settings = config.gen.powersync;
227
+ const keys = args.instance === void 0 ? settings?.instances ?? [] : args.instance.split(",").map((key) => key.trim()).filter(Boolean);
228
+ if (keys.length === 0) return {
229
+ code: 1,
230
+ errorCode: "config_invalid",
231
+ error: "Name the block instances to sync: set gen.powersync.instances, or pass --instance notifications."
232
+ };
233
+ const instances = instancesOf(config, keys);
234
+ if (typeof instances === "string") return {
235
+ code: 1,
236
+ errorCode: "config_invalid",
237
+ error: instances
238
+ };
239
+ const layout = await layoutFor(config, {}, config.blockNames);
240
+ let output;
241
+ try {
242
+ output = powersyncOutput({
243
+ files: renderBlocks(config.blockNames, layout),
244
+ instances,
245
+ importFrom: settings?.import ?? "@powersync/common"
246
+ });
247
+ } catch (cause) {
248
+ return {
249
+ code: 1,
250
+ errorCode: "config_invalid",
251
+ error: cause instanceof Error ? cause.message : String(cause)
252
+ };
253
+ }
254
+ const out = resolve(config.root, args.out ?? settings?.out ?? "powersync");
255
+ const migration = await publicationMigration(config, output.publication, now);
256
+ const plan = {
257
+ root: config.root,
258
+ regenerate: REGENERATE,
259
+ files: [
260
+ {
261
+ path: join(out, "sync-streams.yaml"),
262
+ contents: output.streams
263
+ },
264
+ {
265
+ path: join(out, "schema.ts"),
266
+ contents: output.schema
267
+ },
268
+ ...migration === void 0 ? [] : [migration]
269
+ ]
270
+ };
271
+ const applied = await applyPlan(plan, args);
272
+ return planResult(plan, applied, { data: {
273
+ instances: keys,
274
+ tables: output.tables
275
+ } });
276
+ }
277
+ const powersyncStreamsCommand = defineCliCommand({
278
+ meta: commandMeta("powersync streams"),
279
+ args: ARGS,
280
+ run: (args, { config }) => runPowerSync(config, args)
281
+ });
282
+ //#endregion
283
+ export { runPowerSync as n, powersyncStreamsCommand as t };
@@ -0,0 +1 @@
1
+ export { t as powersyncStreamsCommand } from "./powersync-D-0yV_L_.js";
@@ -1,5 +1,6 @@
1
1
  import { n as CliError } from "./errors-BTe6A15O.js";
2
- import { g as layout, o as migrationModules, r as latestMigration, u as writesMigrations } from "./module-migration-mKhX88V_.js";
2
+ import { s as layout } from "./migrations-BoIyGczt.js";
3
+ import { o as migrationModules, r as latestMigration, u as writesMigrations } from "./module-migration-DXvo0EqU.js";
3
4
  import { existsSync } from "node:fs";
4
5
  import { resolve } from "node:path";
5
6
  import { SQL_MODULES, contractSignature, customContracts, moduleBody, moduleFilePaths } from "better-supabase/sql";
@@ -1,16 +1,16 @@
1
- import { p as commandMeta, r as defineCliCommand } from "./command-CQ61x6gN.js";
1
+ import { p as commandMeta, r as defineCliCommand } from "./command-BWEEXmtz.js";
2
2
  import { i as plain } from "./style-Bm2X5JrN.js";
3
3
  import { n as CliError } from "./errors-BTe6A15O.js";
4
4
  import { r as readIfExists, t as display } from "./io-DH1kcmmP.js";
5
- import { _ as layoutFor } from "./module-migration-mKhX88V_.js";
5
+ import { c as layoutFor } from "./migrations-BoIyGczt.js";
6
6
  import { i as changeLines, n as PLAN_ARGS, r as applyPlan, t as HAND_EDITED, u as planResult } from "./files-CX71yBm8.js";
7
- import { a as sqlPlan } from "./sql-layout-26LSoifK.js";
8
- import { g as templateContextFor, i as blocksWiringPath, n as blockClients } from "./add-DMcrsWjC.js";
7
+ import { a as sqlPlan } from "./sql-layout-D8QrNvt4.js";
8
+ import { g as templateContextFor, i as blocksWiringPath, n as blockClients } from "./add-B1S3yK4L.js";
9
9
  import { t as detectProject } from "./detect-D9JaAX20.js";
10
10
  import { _ as wiringBlocks, a as configObject, c as mask, i as closingIndex, l as properties } from "./config-edit-CrWfk8s3.js";
11
- import { n as guardedRemoval } from "./sync-CHGMZCJ5.js";
11
+ import { n as guardedRemoval } from "./sync-s1iKFIos.js";
12
12
  import { t as SQL_ARGS } from "./args-UEwg0l-N.js";
13
- import { t as blockNames } from "./blocks-DSgTifw0.js";
13
+ import { t as blockNames } from "./blocks-DDm1Zc2S.js";
14
14
  import { i as tidyInline, t as cutRange } from "./config-group-C8tjut39.js";
15
15
  import { existsSync } from "node:fs";
16
16
  import { resolve } from "node:path";
@@ -1,10 +1,10 @@
1
1
  import { n as CliError, r as errorText } from "./errors-BTe6A15O.js";
2
2
  import { n as importPath } from "./io-DH1kcmmP.js";
3
- import { i as cachedTypesModule, n as cachedDatabaseTypes, s as typesModuleKey } from "./cache-oU0yHKf0.js";
3
+ import { i as cachedTypesModule, n as cachedDatabaseTypes, s as typesModuleKey } from "./cache-DE2IH1-C.js";
4
4
  import { t as byCodePoint } from "./compare-BmIWVEui.js";
5
- import { f as generateDatabaseTypes, h as restrictSchemas, p as oxfmtInstalled, v as tsTypeOf } from "./snapshot-C6vh_n3t.js";
5
+ import { f as generateDatabaseTypes, h as restrictSchemas, p as oxfmtInstalled, v as tsTypeOf } from "./snapshot-BXmU3IXN.js";
6
6
  import { t as isRecord$1 } from "./guards-CUlDNYZs.js";
7
- import { a as toCatalog } from "./source-BZbEK5if.js";
7
+ import { a as toCatalog } from "./source-irttnsEb.js";
8
8
  import { basename, dirname, isAbsolute, join, posix, relative, resolve } from "node:path";
9
9
  import { entityNames } from "better-supabase/blocks";
10
10
  import { DEFAULT_CLAIMS, blockEntities, blockEntityRenames, blockSubjectTypes, tenantClaimPaths, tenantNameOf } from "better-supabase/config";
@@ -1727,13 +1727,14 @@ function renamedBlockLines(entries) {
1727
1727
  * `defineBlocks(blockConfig, blocks)`. A renamed instance uses its renamed
1728
1728
  * constant; the others import their block.
1729
1729
  */
1730
- function instanceMapLines(entries, renamed) {
1730
+ function instanceMapLines(entries, renamed, synced) {
1731
1731
  const imported = /* @__PURE__ */ new Map();
1732
1732
  const members = [];
1733
1733
  for (const [instance, entry] of Object.entries(entries)) {
1734
1734
  const manifest = MANIFESTS.get(entry.block ?? instance);
1735
1735
  const client = manifest?.client;
1736
1736
  if (manifest === void 0 || client === void 0 || client === null) continue;
1737
+ if (synced !== void 0 && !synced.has(instance)) members.push(" /** Needs the network on native. */");
1737
1738
  const constant = renamed.get(instance);
1738
1739
  if (constant !== void 0) {
1739
1740
  members.push(` ${prop(instance)}: ${constant},`);
@@ -1760,6 +1761,7 @@ function instanceMapLines(entries, renamed) {
1760
1761
  " * Every installed block instance with a client, under its key, for",
1761
1762
  " * `defineBlocks(blockConfig, { ...blocks, ... })`. Override an entry to give",
1762
1763
  " * a block its ports (`notifications: notificationsBlock.using(...)`).",
1764
+ ...synced === void 0 ? [] : [" * Instances outside `gen.powersync.instances` call the Data API, so", " * their hooks need the network on native."],
1763
1765
  " * @public",
1764
1766
  " */",
1765
1767
  "export const blocks = {",
@@ -1813,7 +1815,8 @@ function emitBlockConfig(config, options = {}) {
1813
1815
  const runtime = options.runtimeImport ?? "better-supabase";
1814
1816
  const renamed = renamedBlockLines(entries);
1815
1817
  const constants = nameConstantLines(config, entries);
1816
- const instances = instanceMapLines(entries, renamed.constants);
1818
+ const synced = config.gen.powersync?.instances;
1819
+ const instances = instanceMapLines(entries, renamed.constants, synced === void 0 ? void 0 : new Set(synced));
1817
1820
  const specifiers = [
1818
1821
  ...events.length === 0 ? [] : [
1819
1822
  "type AppTableEventData",
@@ -1,9 +1,9 @@
1
- import { p as commandMeta, r as defineCliCommand } from "./command-CQ61x6gN.js";
1
+ import { p as commandMeta, r as defineCliCommand } from "./command-BWEEXmtz.js";
2
2
  import { n as CliError } from "./errors-BTe6A15O.js";
3
3
  import { t as PROCESS_ENV } from "./env-DMgjB_4y.js";
4
4
  import { n as spawnInherited } from "./exec--Q1ZEWUW.js";
5
5
  import { i as staleVariables } from "./stack-env-6hS-WEmh.js";
6
- import { i as readStackEnv } from "./env-BBl5L8Bf.js";
6
+ import { i as readStackEnv } from "./env-BCgVZkcb.js";
7
7
  //#region src/cli/commands/run.ts
8
8
  const ARGS = {
9
9
  prefix: {
@@ -1,17 +1,19 @@
1
1
  import { r as errorText } from "./errors-BTe6A15O.js";
2
2
  import { a as sameText, t as display } from "./io-DH1kcmmP.js";
3
- import { c as writeAtomic, o as storeTypesModule, s as typesModuleKey, t as CACHE_DIR } from "./cache-oU0yHKf0.js";
3
+ import { c as writeAtomic, o as storeTypesModule, s as typesModuleKey, t as CACHE_DIR } from "./cache-DE2IH1-C.js";
4
4
  import { t as byCodePoint } from "./compare-BmIWVEui.js";
5
- import { _ as stabilizeMetadata, b as typegenVersionNotice, p as oxfmtInstalled, t as loadSnapshot, y as typegenVersion } from "./snapshot-C6vh_n3t.js";
6
- import { n as render } from "./render-ChIwdIOJ.js";
7
- import { C as entitlementsMode, E as unsafeKey, S as entitlementRequirements, T as providerLabel, b as accessProviderMode, c as sameModuleMigration, l as writeLatestMigration, n as READ_SETS_SUFFIX, r as latestMigration, u as writesMigrations, w as moduleKeyProblems, x as accessRequirements, y as compiledReadSets } from "./module-migration-mKhX88V_.js";
8
- import { s as schemaStampPath } from "./content-mapper-DLbXilBz.js";
5
+ import { _ as stabilizeMetadata, b as typegenVersionNotice, p as oxfmtInstalled, t as loadSnapshot, y as typegenVersion } from "./snapshot-BXmU3IXN.js";
6
+ import { n as render } from "./render-BJF9ytUi.js";
7
+ import { _ as unsafeKey, d as accessProviderMode, f as accessRequirements, g as providerLabel, h as moduleKeyProblems, m as entitlementsMode, p as entitlementRequirements, u as compiledReadSets } from "./migrations-BoIyGczt.js";
8
+ import { s as schemaStampPath } from "./content-mapper-CaygHH_k.js";
9
9
  import { a as changedFiles, d as fileDiff, i as changeLines, r as applyPlan, s as hasConflicts } from "./files-CX71yBm8.js";
10
- import { n as migrationsDir, o as writtenByBlocks } from "./sql-layout-26LSoifK.js";
11
- import { l as tableObject, n as exposed, o as policyObject, s as qualified, t as catalogOf } from "./shared-D0XBFSlz.js";
10
+ import { n as migrationsDir, o as writtenByBlocks } from "./sql-layout-D8QrNvt4.js";
11
+ import { l as tableObject, n as exposed, o as policyObject, s as qualified, t as catalogOf } from "./shared-B38Chjgd.js";
12
+ import { c as sameModuleMigration, l as writeLatestMigration, n as READ_SETS_SUFFIX, r as latestMigration, u as writesMigrations } from "./module-migration-DXvo0EqU.js";
12
13
  import { existsSync } from "node:fs";
13
14
  import { dirname, isAbsolute, relative, resolve, sep } from "node:path";
14
15
  import { readFile } from "node:fs/promises";
16
+ import { DEFAULT_ACTIVE_TENANT } from "better-supabase/config";
15
17
  import { SQL_MODULES, adoptedTables, declaredTables, moduleHidingColumns, moduleLayout, modulePermissionKeys, renderBlocks, resolveBlocks, sameBlockFile } from "better-supabase/sql";
16
18
  //#region src/cli/doctor/advisor-rules.ts
17
19
  /**
@@ -654,6 +656,11 @@ const TEMPLATE_EFFECT = {
654
656
  isPlatformFor: "their checks of another user's platform permissions (platform_can) answer false or are skipped",
655
657
  canAssignFor: "better_supabase.can_assign_as is not written and the inviter's right to assign the role is not checked again when the invitation is accepted"
656
658
  };
659
+ function activeTenantLabel(source) {
660
+ if (source === "claim") return "the app_metadata claim";
661
+ if (source === "resolver") return "the request (the tenant resolver)";
662
+ return `the profile column ${source.profileColumn}`;
663
+ }
657
664
  /** The optional templates installed modules call that the provider doesn't set. */
658
665
  function missingTemplates(context, provider) {
659
666
  const installed = new Set(context.config.blockNames);
@@ -935,7 +942,7 @@ const AUTHORIZATION_RULES = [
935
942
  code: "BS409",
936
943
  severity: "warning",
937
944
  title: "The authorization provider and the better-supabase config disagree",
938
- description: "The provider's hook writes the active tenant to `tokenHook.tenantClaim`, and its tenant scope is `tenantScope`. Doctor warns when `auth.organization.claim` names another claim (the tenant plugin, guards and RLS would read a claim the hook never writes), notes when `auth.claims.scope` is neither `tenant` nor the provider's tenant scope, notes when the provider sets `suspension` or `roleSources` but `blocks.permissions.model` is not `provider` (only that model reads them), and reports the `problems` the provider found while it was built.",
945
+ description: "The provider's hook writes the active tenant to `tokenHook.tenantClaim`, and its tenant scope is `tenantScope`. Doctor warns when `auth.organization.claim` names another claim (the tenant plugin, guards and RLS would read a claim the hook never writes), notes when `auth.claims.scope` is neither `tenant` nor the provider's tenant scope, warns when the provider's `tokenHook.activeOrganizationFrom` differs from `blocks.permissions.activeTenant` (where `switch_organization` writes the active organization), notes when the provider sets `suspension` or `roleSources` but `blocks.permissions.model` is not `provider` (only that model reads them), and reports the `problems` the provider found while it was built.",
939
946
  check: (context) => {
940
947
  const provider = context.config.authorization;
941
948
  if (!provider) return [];
@@ -949,6 +956,12 @@ const AUTHORIZATION_RULES = [
949
956
  message: `The hook of ${label} writes the active tenant to "${tenantClaim}", but auth.organization.claim is "${context.config.claims.tenant}". Set auth.organization.claim to "${tenantClaim}", or change the provider's tenant claim.`,
950
957
  target: "claims.tenant"
951
958
  });
959
+ const readsFrom = provider.tokenHook?.activeOrganizationFrom;
960
+ const writesTo = context.config.blocks.permissions?.activeTenant ?? DEFAULT_ACTIVE_TENANT;
961
+ if (readsFrom !== void 0 && activeTenantLabel(readsFrom) !== activeTenantLabel(writesTo)) findings.push({
962
+ message: `The hook of ${label} reads the active organization from ${activeTenantLabel(readsFrom)}, but switch_organization writes it to ${activeTenantLabel(writesTo)} (blocks.permissions.activeTenant), so switching never changes the token. Set blocks.permissions.activeTenant to match the provider.`,
963
+ target: "blocks.permissions.activeTenant"
964
+ });
952
965
  const scope = context.config.claims.scope;
953
966
  if (scope !== "tenant" && scope !== provider.tenantScope) findings.push({
954
967
  severity: "info",
@@ -969,7 +982,7 @@ const AUTHORIZATION_RULES = [
969
982
  code: "BS411",
970
983
  severity: "error",
971
984
  title: "The provider access model can't use the authorization provider",
972
- description: "With `blocks.permissions.model: 'provider'`, the `access` module fills the provider's `idsWith` template for tenant checks and `isPlatform` for platform checks, at its tenant scope. Doctor reports a config without `authorization`, a tenant scope or id type the module can't render, a function those templates call that `authorization.requires` doesn't list, doesn't let `authenticated` execute or the database lacks, and every module permission key (from `modulePermissionKeys`) the provider doesn't mark `sqlComplete: true`, since its functions are trusted with role and scope only. It warns when neither `blocks.permissions.functions.canAssign` nor the provider's `canAssign` is set, because only the service role then assigns roles, and when an installed module calls a template the provider doesn't set (`idsWithFor` and `isPlatformFor` to check another user, `canAssignFor` to recheck an inviter).",
985
+ description: "With `blocks.permissions.model: 'provider'`, the `access` module fills the provider's `idsWith` template for tenant checks and `isPlatform` for platform checks, at its tenant scope. Doctor reports a config without `authorization`, a tenant scope or id type the module can't render, a function those templates call that `authorization.requires` doesn't list, doesn't let `authenticated` execute or the database lacks, and every module permission key (from `modulePermissionKeys`) the provider doesn't mark `sqlComplete: true`, since its functions are trusted with role and scope only. It warns when neither `blocks.permissions.functions.canAssign` nor the provider's `canAssign` is set, because only the service role then assigns roles, and when an installed module calls a template the provider doesn't set (`idsWithFor` and `isPlatformFor` to check another user, `canAssignFor` to recheck an inviter). It also warns when `blocks.memberships.options.roles.many` is on and none of the provider's `memberships` names a `rolesTable`, since the provider then sees one role per member.",
973
986
  check: (context) => {
974
987
  const mode = accessModule(context);
975
988
  if (mode.kind === "off") return [];
@@ -992,6 +1005,12 @@ const AUTHORIZATION_RULES = [
992
1005
  message: `Neither blocks.permissions.functions.canAssign nor ${providerLabel(provider)} sets canAssign, so under the provider model only the service role assigns roles: the memberships guard refuses every membership a member adds or changes. Use a provider that sets authorization.functions.canAssign, or set blocks.permissions.functions.canAssign.`,
993
1006
  target: "blocks.permissions.functions.canAssign"
994
1007
  });
1008
+ const roles = context.config.blocks["memberships"]?.options?.["roles"];
1009
+ if (typeof roles === "object" && roles !== null && "many" in roles && roles.many === true && (provider.memberships ?? []).length > 0 && !(provider.memberships ?? []).some((membership) => membership.rolesTable !== void 0)) findings.push({
1010
+ severity: "warning",
1011
+ message: `blocks.memberships.options.roles.many keeps several roles per member in better_supabase.membership_roles, but ${providerLabel(provider)} reads one role per membership: none of its authorization.memberships sets rolesTable. A member's extra roles then grant nothing through the provider. Use a provider that reads the role set, or turn roles.many off.`,
1012
+ target: "blocks.memberships.options.roles"
1013
+ });
995
1014
  findings.push(...missingTemplates(context, provider));
996
1015
  return findings;
997
1016
  }
@@ -1140,7 +1159,7 @@ function templateCalls(template) {
1140
1159
  return [...withoutStrings(template).matchAll(TEMPLATE_CALL)].map((match) => `${match[1]}.${match[2]}`.replaceAll("\"", "").toLowerCase());
1141
1160
  }
1142
1161
  const CONTRACT_CALL = /\bbetter_supabase"?\s*\.\s*"?(can|tenant_ids_with)"?\s*\(/gi;
1143
- const ROLE_HELPER_CALL = /\bbetter_supabase"?\s*\.\s*"?(member_organization_ids|has_organization_role|organization_member_role)"?\s*\(/gi;
1162
+ const ROLE_HELPER_CALL = /\bbetter_supabase"?\s*\.\s*"?(member_organization_ids|has_organization_role|organization_member_roles?)"?\s*\(/gi;
1144
1163
  /** The tenant role helpers `text` calls, outside string literals. */
1145
1164
  function roleHelperCalls(text) {
1146
1165
  const names = /* @__PURE__ */ new Set();
@@ -1,10 +1,10 @@
1
- import { c as COMMANDS, d as GROUPS, f as RESERVED_NAMES, h as runCommand, i as joinRepeated, m as parseArgs$2, o as listArgs, s as runsWithInvalidConfig, t as GLOBAL_ARGS, u as DOCS_ORIGIN } from "./command-CQ61x6gN.js";
1
+ import { c as COMMANDS, d as GROUPS, f as RESERVED_NAMES, h as runCommand, i as joinRepeated, m as parseArgs$2, o as listArgs, s as runsWithInvalidConfig, t as GLOBAL_ARGS, u as DOCS_ORIGIN } from "./command-BWEEXmtz.js";
2
2
  import { n as highlight, r as painter } from "./style-Bm2X5JrN.js";
3
- import { t as VERSION } from "./version-T507a49w.js";
3
+ import { t as VERSION } from "./version-TgFM8sOd.js";
4
4
  import { n as CliError, o as toCliError } from "./errors-BTe6A15O.js";
5
5
  import { a as missingInputNext, o as resolveAgent, t as checkConsent } from "./agent-CbuPvI2x.js";
6
- import { a as globalFlags, c as resolveCommand, i as commandTree, n as closestName, o as isVariadic, r as commandArgs, t as checkArgs } from "./parse-B9Iv_-Pf.js";
7
- import { n as movedCommand, r as movedFlag } from "./moved-CsfDQcyk.js";
6
+ import { a as globalFlags, c as resolveCommand, i as commandTree, n as closestName, o as isVariadic, r as commandArgs, t as checkArgs } from "./parse-B079x40m.js";
7
+ import { n as movedCommand, r as movedFlag } from "./moved-DVwgE8lV.js";
8
8
  import { n as HTTP_CHANNEL, t as EXEC_CHANNEL } from "./trace-VbdO6bcN.js";
9
9
  import { stripVTControlCharacters } from "node:util";
10
10
  import { subscribe, unsubscribe } from "node:diagnostics_channel";
@@ -16,37 +16,38 @@ import { resolve } from "node:path";
16
16
  * loads on demand, so `--version` and `--help` import no command.
17
17
  */
18
18
  const LOADERS = [
19
- ["init", () => import("./init-DrQlf9RL.js").then((m) => m.initCommand)],
20
- ["add", () => import("./add-z-3pXI6C.js").then((m) => m.addCommand)],
21
- ["remove", () => import("./remove-DfFXVBRr.js").then((m) => m.removeCommand)],
22
- ["upgrade", () => import("./upgrade-GB9rqUGT.js").then((m) => m.upgradeCommand)],
23
- ["gen", () => import("./gen-CeG6lbka.js").then((m) => m.genCommand)],
24
- ["doctor", () => import("./doctor-CKt5Yyl4.js").then((m) => m.doctorCommand)],
25
- ["db query", () => import("./db-Bwrr3GHM.js").then((m) => m.dbQueryCommand)],
26
- ["db diff", () => import("./db-Bwrr3GHM.js").then((m) => m.dbDiffCommand)],
27
- ["db seed", () => import("./seed-CUxW5Dks.js").then((m) => m.seedCommand)],
28
- ["db backfill", () => import("./backfill-DxBB62Zr.js").then((m) => m.dbBackfillCommand)],
29
- ["dev env", () => import("./env-CAU1nknN.js").then((m) => m.envCommand)],
30
- ["dev run", () => import("./run-BXx6D1aR.js").then((m) => m.runCommand)],
31
- ["dev keys", () => import("./keys-DGEpMbeB.js").then((m) => m.keysCommand)],
32
- ["dev stack ls", () => import("./stack-CWEHdO0b.js").then((m) => m.stackLsCommand)],
33
- ["dev stack prune", () => import("./stack-CWEHdO0b.js").then((m) => m.stackPruneCommand)],
34
- ["blocks list", () => import("./blocks-rxOS-Mzz.js").then((m) => m.blocksListCommand)],
35
- ["blocks view", () => import("./blocks-rxOS-Mzz.js").then((m) => m.blocksViewCommand)],
36
- ["blocks search", () => import("./blocks-rxOS-Mzz.js").then((m) => m.blocksSearchCommand)],
37
- ["spec emit", () => import("./spec-C-dhdKwa.js").then((m) => m.specEmitCommand)],
38
- ["spec validate", () => import("./spec-C-dhdKwa.js").then((m) => m.specValidateCommand)],
39
- ["mcp", () => import("./mcp-BrOnGB15.js").then((m) => m.mcpCommand)],
40
- ["skills list", () => import("./skills-toUan_OV.js").then((m) => m.skillsListCommand)],
41
- ["skills install", () => import("./skills-toUan_OV.js").then((m) => m.skillsInstallCommand)],
42
- ["codemod 0.4", () => import("./codemod-Dsrv_3gQ.js").then((m) => m.codemodCommand("0.4"))],
43
- ["codemod 0.5", () => import("./codemod-Dsrv_3gQ.js").then((m) => m.codemodCommand("0.5"))],
44
- ["codemod 0.6", () => import("./codemod-Dsrv_3gQ.js").then((m) => m.codemodCommand("0.6"))],
45
- ["codemod 0.9", () => import("./codemod-Dsrv_3gQ.js").then((m) => m.codemodCommand("0.9"))],
46
- ["codemod 0.11", () => import("./codemod-Dsrv_3gQ.js").then((m) => m.codemodCommand("0.11"))],
47
- ["codemod 0.15", () => import("./codemod-Dsrv_3gQ.js").then((m) => m.codemodCommand("0.15"))],
48
- ["completion", () => import("./completion-BwI0_Ap5.js").then((m) => m.completionCommand)],
49
- ["config", () => import("./config-CPux9Wa7.js").then((m) => m.configCommand)]
19
+ ["init", () => import("./init-ch-HWJyp.js").then((m) => m.initCommand)],
20
+ ["add", () => import("./add-BQPJnapO.js").then((m) => m.addCommand)],
21
+ ["remove", () => import("./remove-D89s99ha.js").then((m) => m.removeCommand)],
22
+ ["upgrade", () => import("./upgrade-CluxP3JJ.js").then((m) => m.upgradeCommand)],
23
+ ["gen", () => import("./gen-D7gMEwvg.js").then((m) => m.genCommand)],
24
+ ["doctor", () => import("./doctor-D_nrsd9E.js").then((m) => m.doctorCommand)],
25
+ ["db query", () => import("./db-DYU5hUcd.js").then((m) => m.dbQueryCommand)],
26
+ ["db diff", () => import("./db-DYU5hUcd.js").then((m) => m.dbDiffCommand)],
27
+ ["db seed", () => import("./seed-EPO6AvLG.js").then((m) => m.seedCommand)],
28
+ ["db backfill", () => import("./backfill-BwkyNhlC.js").then((m) => m.dbBackfillCommand)],
29
+ ["dev env", () => import("./env-xhwXk5Ri.js").then((m) => m.envCommand)],
30
+ ["dev run", () => import("./run-DmOTMa44.js").then((m) => m.runCommand)],
31
+ ["dev keys", () => import("./keys-CbaL0lnw.js").then((m) => m.keysCommand)],
32
+ ["dev stack ls", () => import("./stack-DgASZP0K.js").then((m) => m.stackLsCommand)],
33
+ ["dev stack prune", () => import("./stack-DgASZP0K.js").then((m) => m.stackPruneCommand)],
34
+ ["blocks list", () => import("./blocks-CBqENu3C.js").then((m) => m.blocksListCommand)],
35
+ ["blocks view", () => import("./blocks-CBqENu3C.js").then((m) => m.blocksViewCommand)],
36
+ ["blocks search", () => import("./blocks-CBqENu3C.js").then((m) => m.blocksSearchCommand)],
37
+ ["powersync streams", () => import("./powersync-DXVsKkAu.js").then((m) => m.powersyncStreamsCommand)],
38
+ ["spec emit", () => import("./spec-DzD5wMVF.js").then((m) => m.specEmitCommand)],
39
+ ["spec validate", () => import("./spec-DzD5wMVF.js").then((m) => m.specValidateCommand)],
40
+ ["mcp", () => import("./mcp-P9RP2SJ3.js").then((m) => m.mcpCommand)],
41
+ ["skills list", () => import("./skills-FXAVPLzp.js").then((m) => m.skillsListCommand)],
42
+ ["skills install", () => import("./skills-FXAVPLzp.js").then((m) => m.skillsInstallCommand)],
43
+ ["codemod 0.4", () => import("./codemod-OHKhVV-v.js").then((m) => m.codemodCommand("0.4"))],
44
+ ["codemod 0.5", () => import("./codemod-OHKhVV-v.js").then((m) => m.codemodCommand("0.5"))],
45
+ ["codemod 0.6", () => import("./codemod-OHKhVV-v.js").then((m) => m.codemodCommand("0.6"))],
46
+ ["codemod 0.9", () => import("./codemod-OHKhVV-v.js").then((m) => m.codemodCommand("0.9"))],
47
+ ["codemod 0.11", () => import("./codemod-OHKhVV-v.js").then((m) => m.codemodCommand("0.11"))],
48
+ ["codemod 0.15", () => import("./codemod-OHKhVV-v.js").then((m) => m.codemodCommand("0.15"))],
49
+ ["completion", () => import("./completion-BfnKI4QZ.js").then((m) => m.completionCommand)],
50
+ ["config", () => import("./config-WKDixoGK.js").then((m) => m.configCommand)]
50
51
  ];
51
52
  /** The built-in commands, for `createCli`. */
52
53
  function builtinCommands() {
@@ -465,7 +466,7 @@ function cliFromTree(init, extra = {}) {
465
466
  };
466
467
  if (argv[0] === "__complete") {
467
468
  const words = argv[1] === "--" ? argv.slice(2) : argv.slice(1);
468
- const lines = await import("./completion-Dlu5AdUW.js").then(async ({ complete, completionLines }) => completionLines(await complete(tree, words))).catch(() => "");
469
+ const lines = await import("./completion-8EDK21xj.js").then(async ({ complete, completionLines }) => completionLines(await complete(tree, words))).catch(() => "");
469
470
  if (lines !== "") out(lines);
470
471
  return {
471
472
  code: 0,
@@ -594,7 +595,7 @@ function cliFromTree(init, extra = {}) {
594
595
  try {
595
596
  const [loaded, { defaultConfig, discoverConfig, loadConfig }, { configEnvironment, isCi, parseEnv }] = await Promise.all([
596
597
  node.load(),
597
- import("./config-C6XylzKz.js"),
598
+ import("./config-BlfVh0IP.js"),
598
599
  import("./env-C-Bl6Awn.js")
599
600
  ]);
600
601
  command = loaded;
@@ -1,11 +1,11 @@
1
- import { p as commandMeta, r as defineCliCommand } from "./command-CQ61x6gN.js";
1
+ import { p as commandMeta, r as defineCliCommand } from "./command-BWEEXmtz.js";
2
2
  import { i as isLocalDatabaseUrl, r as databaseHost } from "./agent-CbuPvI2x.js";
3
3
  import { t as display } from "./io-DH1kcmmP.js";
4
- import { l as stdinDatabaseUrl, n as databaseUrl, o as importExport } from "./config-2rwFHbwj.js";
4
+ import { l as stdinDatabaseUrl, n as databaseUrl, o as importExport } from "./config-BJSqMi04.js";
5
5
  import { m as supabaseDir } from "./supabase-toml-CncmQbO0.js";
6
6
  import { t as connect } from "./db-CQCLx7cx.js";
7
7
  import { c as insideRoot, i as changeLines, n as PLAN_ARGS, r as applyPlan, s as hasConflicts, u as planResult } from "./files-CX71yBm8.js";
8
- import { r as STACK_ARG, t as DB_URL_STDIN_ARG } from "./source-args-MTLYpifA.js";
8
+ import { r as STACK_ARG, t as DB_URL_STDIN_ARG } from "./source-args-DlckPVje.js";
9
9
  import { existsSync } from "node:fs";
10
10
  import { resolve } from "node:path";
11
11
  import { readFile } from "node:fs/promises";
@@ -0,0 +1 @@
1
+ export { n as seedCommand } from "./seed-D9mt8bnW.js";
@@ -1,4 +1,4 @@
1
- import { a as toCatalog } from "./source-BZbEK5if.js";
1
+ import { a as toCatalog } from "./source-irttnsEb.js";
2
2
  import { h as tomlGet, p as sqlWorkflow, r as detectWorkflow } from "./supabase-toml-CncmQbO0.js";
3
3
  //#region src/cli/doctor/shared.ts
4
4
  const catalogs = /* @__PURE__ */ new WeakMap();
@@ -1,4 +1,4 @@
1
- import { a as list, p as commandMeta, r as defineCliCommand } from "./command-CQ61x6gN.js";
1
+ import { a as list, p as commandMeta, r as defineCliCommand } from "./command-BWEEXmtz.js";
2
2
  import { n as CliError } from "./errors-BTe6A15O.js";
3
3
  import { t as byCodePoint } from "./compare-BmIWVEui.js";
4
4
  import { n as PLAN_ARGS, r as applyPlan, u as planResult } from "./files-CX71yBm8.js";
@@ -1,8 +1,8 @@
1
1
  import { n as CliError, r as errorText } from "./errors-BTe6A15O.js";
2
- import { d as readExtras, l as TYPEGEN_VERSION, r as cachedIntrospect } from "./cache-oU0yHKf0.js";
2
+ import { d as readExtras, l as TYPEGEN_VERSION, r as cachedIntrospect } from "./cache-DE2IH1-C.js";
3
3
  import { t as byCodePoint } from "./compare-BmIWVEui.js";
4
- import { n as managementSource, r as pgSource } from "./source-BZbEK5if.js";
5
- import { n as databaseUrl, u as accessToken } from "./config-2rwFHbwj.js";
4
+ import { n as managementSource, r as pgSource } from "./source-irttnsEb.js";
5
+ import { n as databaseUrl, u as accessToken } from "./config-BJSqMi04.js";
6
6
  import { d as readSupabaseToml, f as schemaPaths, h as tomlGet, u as pgFunctionHooks } from "./supabase-toml-CncmQbO0.js";
7
7
  import { t as connect } from "./db-CQCLx7cx.js";
8
8
  import { existsSync } from "node:fs";