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,66 +1,182 @@
1
- import { n as dbError } from "./errors-DtwXa6b8.js";
1
+ import { n as dbError } from "./errors-B11Duf73.js";
2
2
  import { t as consoleLogger } from "./logger-glM28NVN.js";
3
3
  import { n as decodeJwtPayload } from "./base64-D2gsioCY.js";
4
- import { n as impersonatorOf, r as userContext } from "./impersonation-VfaGc4Q_.js";
4
+ import { a as actorOf, i as userContext } from "./impersonation-DcqaTBHx.js";
5
5
  import { DEFAULT_COOKIE_OPTIONS, createChunks, isChunkLike, parseCookieHeader, serializeCookieHeader, stringFromBase64URL, stringToBase64URL } from "@supabase/ssr";
6
6
  import { extractCredentials, verifyCredentials } from "@supabase/server/core";
7
- //#region src/auth/actor.ts
8
- function isRecord(value) {
9
- return typeof value === "object" && value !== null && !Array.isArray(value);
7
+ //#region src/auth/session.ts
8
+ const DEFAULT_SESSION_ENCODING = "user-and-tokens";
9
+ const BASE64_PREFIX = "base64-";
10
+ /** Headers that keep responses carrying session cookies out of shared caches. */
11
+ const AUTH_CACHE_HEADERS = {
12
+ "Cache-Control": "private, no-cache, no-store, must-revalidate, max-age=0",
13
+ Expires: "0",
14
+ Pragma: "no-cache"
15
+ };
16
+ /** `sb-<first label of the hostname>-auth-token`, the supabase-js default. */
17
+ function sessionCookieName(url) {
18
+ let name = cookieNames.get(url);
19
+ if (name === void 0) {
20
+ name = `sb-${new URL(url).hostname.split(".")[0] ?? ""}-auth-token`;
21
+ if (cookieNames.size < 16) cookieNames.set(url, name);
22
+ }
23
+ return name;
24
+ }
25
+ /** Project URLs come from configuration, so a handful of entries suffice. */
26
+ const cookieNames = /* @__PURE__ */ new Map();
27
+ function parseCookies(header) {
28
+ return header ? parseCookieHeader(header) : [];
29
+ }
30
+ function serializeCookie(write) {
31
+ return serializeCookieHeader(write.name, write.value, write.options);
32
+ }
33
+ /** Cookie values by name, per parsed cookie list: one request reads its session more than once. */
34
+ const cookieMaps = /* @__PURE__ */ new WeakMap();
35
+ function combine(cookies, name) {
36
+ let byName = cookieMaps.get(cookies);
37
+ if (!byName) {
38
+ byName = new Map(cookies.map((cookie) => [cookie.name, cookie.value]));
39
+ cookieMaps.set(cookies, byName);
40
+ }
41
+ const whole = byName.get(name);
42
+ if (whole) return whole;
43
+ const parts = [];
44
+ for (let index = 0;; index++) {
45
+ const part = byName.get(`${name}.${index}`);
46
+ if (!part) break;
47
+ parts.push(part);
48
+ }
49
+ return parts.length > 0 ? parts.join("") : void 0;
10
50
  }
11
- function copyAct(level) {
12
- const entries = Object.entries(level).map(([key, value]) => [key, key === "act" && isRecord(value) ? copyAct(value) : value]);
13
- return Object.fromEntries(entries);
51
+ function isStoredSession(value) {
52
+ if (typeof value !== "object" || value === null) return false;
53
+ const session = value;
54
+ return typeof session["access_token"] === "string" && typeof session["refresh_token"] === "string";
14
55
  }
15
56
  /**
16
- * Reads only `act` and `client_id`, the way PermDock's `actorOf` does. An
17
- * `act` that is not a chain of objects each with a non-empty `sub` is
18
- * `{ ok: false }`: the session must not pass as the user alone.
57
+ * Reads the session written by `@supabase/ssr` (plain or `base64-`, whole or
58
+ * chunked, `user-and-tokens` or `tokens-only`). Mismatched chunks from a
59
+ * partial write read as no session.
19
60
  */
20
- function actorOf(claims) {
21
- const outer = claims["act"];
22
- if (outer !== void 0) {
23
- let level = outer;
24
- while (level !== void 0) {
25
- if (!isRecord(level)) return {
26
- ok: false,
27
- reason: "invalid-chain"
28
- };
29
- const sub = level["sub"];
30
- if (typeof sub !== "string" || sub === "") return {
31
- ok: false,
32
- reason: "invalid-chain"
33
- };
34
- level = level["act"];
35
- }
36
- if (!isRecord(outer) || typeof outer["sub"] !== "string") return {
37
- ok: false,
38
- reason: "invalid-chain"
39
- };
40
- return {
41
- ok: true,
42
- actor: {
43
- id: outer["sub"],
44
- kind: "oauth-client",
45
- chain: copyAct(outer)
46
- }
47
- };
61
+ function readSession(cookies, name) {
62
+ const raw = combine(cookies, name);
63
+ if (!raw) return null;
64
+ try {
65
+ const json = raw.startsWith(BASE64_PREFIX) ? stringFromBase64URL(raw.slice(7)) : raw;
66
+ const parsed = JSON.parse(json);
67
+ return isStoredSession(parsed) ? parsed : null;
68
+ } catch {
69
+ return null;
48
70
  }
49
- const client = claims["client_id"];
50
- if (typeof client === "string" && client !== "") return {
51
- ok: true,
52
- actor: {
53
- id: client,
54
- kind: "oauth-client"
71
+ }
72
+ /** The encoding a stored session was written with: `tokens-only` without a `user`. */
73
+ function sessionEncoding(session) {
74
+ return session.user === void 0 || session.user === null ? "tokens-only" : "user-and-tokens";
75
+ }
76
+ function encoded(session, encode) {
77
+ switch (encode) {
78
+ case "user-and-tokens": return JSON.stringify(session);
79
+ case "tokens-only": {
80
+ const { user: _user, ...tokens } = session;
81
+ return JSON.stringify(tokens);
55
82
  }
83
+ default: return encode;
84
+ }
85
+ }
86
+ /**
87
+ * Cookie writes that store `session` (or clear it with `null`) exactly like
88
+ * `@supabase/ssr` with the same `encode`, and expire chunks the new value no
89
+ * longer uses.
90
+ */
91
+ function writeSession(existing, name, session, options = {}, { encode = DEFAULT_SESSION_ENCODING } = {}) {
92
+ const base = {
93
+ ...DEFAULT_COOKIE_OPTIONS,
94
+ ...options
56
95
  };
57
- return { ok: true };
96
+ const chunks = session ? createChunks(name, BASE64_PREFIX + stringToBase64URL(encoded(session, encode))) : [];
97
+ const kept = new Set(chunks.map((chunk) => chunk.name));
98
+ return [...existing.filter((cookie) => isChunkLike(cookie.name, name) && !kept.has(cookie.name)).map((cookie) => ({
99
+ name: cookie.name,
100
+ value: "",
101
+ options: {
102
+ ...base,
103
+ maxAge: 0
104
+ }
105
+ })), ...chunks.map((chunk) => ({
106
+ name: chunk.name,
107
+ value: chunk.value,
108
+ options: base
109
+ }))];
58
110
  }
59
- /** The OAuth `scope` claim (a space-separated string or a list); `undefined` when empty. */
60
- function delegationOf(claims) {
61
- const scope = claims["scope"];
62
- const scopes = typeof scope === "string" ? scope.split(/\s+/u).filter(Boolean) : Array.isArray(scope) ? scope.filter((item) => typeof item === "string") : [];
63
- return scopes.length > 0 ? { scopes } : void 0;
111
+ /**
112
+ * `Max-Age=0` writes for every chunk of the session cookie at each of
113
+ * `scopes`, like `clearAuthCookiesAtScopes` from `@supabase/ssr`. Use it once
114
+ * the cookie `domain` or `path` changed, for the scopes earlier deploys
115
+ * wrote: browsers ignore writes for scopes the host doesn't own, but a scope
116
+ * equal to the current one clears the live session.
117
+ */
118
+ function clearSessionAtScopes(existing, name, scopes) {
119
+ if (scopes.length === 0) return [];
120
+ const chunks = existing.map((cookie) => cookie.name).filter((cookie) => isChunkLike(cookie, name));
121
+ return scopes.flatMap((scope) => {
122
+ const options = {
123
+ ...DEFAULT_COOKIE_OPTIONS,
124
+ ...scope.domain === void 0 ? {} : { domain: scope.domain },
125
+ ...scope.path === void 0 ? {} : { path: scope.path },
126
+ maxAge: 0
127
+ };
128
+ return chunks.map((chunk) => ({
129
+ name: chunk,
130
+ value: "",
131
+ options
132
+ }));
133
+ });
134
+ }
135
+ /** Applies cookie writes to a cookie list, as the next request would see it. */
136
+ function applyCookieWrites(cookies, writes) {
137
+ const next = new Map(cookies.map((cookie) => [cookie.name, cookie.value]));
138
+ for (const write of writes) if (write.options.maxAge === 0) next.delete(write.name);
139
+ else next.set(write.name, write.value);
140
+ return [...next].map(([name, value]) => ({
141
+ name,
142
+ value
143
+ }));
144
+ }
145
+ //#endregion
146
+ //#region src/auth/ended.ts
147
+ const DEFAULT_TIMEOUT_MS$1 = 5e3;
148
+ function accessTokenOf(request, options) {
149
+ const bearer = extractCredentials(request).token;
150
+ if (bearer) return bearer;
151
+ return readSession(parseCookies(request.headers.get("cookie")), options.cookieName ?? sessionCookieName(options.url))?.access_token;
152
+ }
153
+ async function sessionStatus(input, options) {
154
+ const token = typeof input === "string" ? input : accessTokenOf(input, options);
155
+ if (!token) return "unknown";
156
+ const exp = decodeJwtPayload(token)?.["exp"];
157
+ if (typeof exp === "number" && exp * 1e3 <= (options.now ?? Date.now)()) return "unknown";
158
+ const doFetch = options.fetch ?? fetch;
159
+ try {
160
+ const response = await doFetch(`${options.url}/auth/v1/user`, {
161
+ headers: {
162
+ apikey: options.publishableKey,
163
+ authorization: `Bearer ${token}`
164
+ },
165
+ signal: AbortSignal.timeout(options.timeoutMs ?? DEFAULT_TIMEOUT_MS$1)
166
+ });
167
+ await response.body?.cancel();
168
+ if (response.status === 401 || response.status === 403) return "ended";
169
+ return response.ok ? "active" : "unknown";
170
+ } catch {
171
+ return "unknown";
172
+ }
173
+ }
174
+ function clearSessionCookies(request, response, options) {
175
+ const writes = writeSession(parseCookies(request.headers.get("cookie")), options.cookieName ?? sessionCookieName(options.url), null, options.cookie);
176
+ if (writes.length === 0) return response;
177
+ for (const write of writes) response.headers.append("set-cookie", serializeCookie(write));
178
+ for (const [key, value] of Object.entries(AUTH_CACHE_HEADERS)) response.headers.set(key, value);
179
+ return response;
64
180
  }
65
181
  //#endregion
66
182
  //#region src/auth/refresh.ts
@@ -71,6 +187,8 @@ function delegationOf(claims) {
71
187
  */
72
188
  const REUSE_MS = 1e4;
73
189
  const DEFAULT_TIMEOUT_MS = 5e3;
190
+ /** Finished refreshes kept for reuse; a burst of sign-ins can't grow it past this. */
191
+ const RECENT_MAX = 1e3;
74
192
  const inflight = /* @__PURE__ */ new Map();
75
193
  const recent = /* @__PURE__ */ new Map();
76
194
  function shared(outcome) {
@@ -139,120 +257,34 @@ async function request(refreshToken, options, now) {
139
257
  * window so parallel requests carrying the old cookie converge on one session.
140
258
  */
141
259
  function refreshSession(refreshToken, options) {
142
- const now = (options.now ?? Date.now)();
260
+ const clock = options.now ?? Date.now;
261
+ const now = clock();
143
262
  prune(now);
144
- const cached = recent.get(refreshToken);
263
+ const key = `${options.url}\n${refreshToken}`;
264
+ const cached = recent.get(key);
145
265
  if (cached) return Promise.resolve(shared(cached.outcome));
146
- const pending = inflight.get(refreshToken);
266
+ const pending = inflight.get(key);
147
267
  if (pending) return pending.then(shared);
148
268
  const promise = request(refreshToken, options, now).then((outcome) => {
149
269
  if (outcome.ok || outcome.reason === "rejected") {
150
- recent.delete(refreshToken);
151
- recent.set(refreshToken, {
270
+ recent.delete(key);
271
+ recent.set(key, {
152
272
  outcome,
153
- until: now + REUSE_MS
273
+ until: clock() + REUSE_MS
154
274
  });
275
+ if (recent.size > RECENT_MAX) {
276
+ const oldest = recent.keys().next();
277
+ if (!oldest.done) recent.delete(oldest.value);
278
+ }
155
279
  }
156
280
  return outcome;
157
281
  }).finally(() => {
158
- inflight.delete(refreshToken);
282
+ inflight.delete(key);
159
283
  });
160
- inflight.set(refreshToken, promise);
284
+ inflight.set(key, promise);
161
285
  return promise;
162
286
  }
163
287
  //#endregion
164
- //#region src/auth/session.ts
165
- const BASE64_PREFIX = "base64-";
166
- /** Headers that keep responses carrying session cookies out of shared caches. */
167
- const AUTH_CACHE_HEADERS = {
168
- "Cache-Control": "private, no-cache, no-store, must-revalidate, max-age=0",
169
- Expires: "0",
170
- Pragma: "no-cache"
171
- };
172
- /** `sb-<first label of the hostname>-auth-token`, the supabase-js default. */
173
- function sessionCookieName(url) {
174
- let name = cookieNames.get(url);
175
- if (name === void 0) {
176
- name = `sb-${new URL(url).hostname.split(".")[0] ?? ""}-auth-token`;
177
- if (cookieNames.size < 16) cookieNames.set(url, name);
178
- }
179
- return name;
180
- }
181
- /** Project URLs come from configuration, so a handful of entries suffice. */
182
- const cookieNames = /* @__PURE__ */ new Map();
183
- function parseCookies(header) {
184
- return header ? parseCookieHeader(header) : [];
185
- }
186
- function serializeCookie(write) {
187
- return serializeCookieHeader(write.name, write.value, write.options);
188
- }
189
- function combine(cookies, name) {
190
- const byName = new Map(cookies.map((cookie) => [cookie.name, cookie.value]));
191
- const whole = byName.get(name);
192
- if (whole) return whole;
193
- const parts = [];
194
- for (let index = 0;; index++) {
195
- const part = byName.get(`${name}.${index}`);
196
- if (!part) break;
197
- parts.push(part);
198
- }
199
- return parts.length > 0 ? parts.join("") : void 0;
200
- }
201
- function isStoredSession(value) {
202
- if (typeof value !== "object" || value === null) return false;
203
- const session = value;
204
- return typeof session["access_token"] === "string" && typeof session["refresh_token"] === "string";
205
- }
206
- /**
207
- * Reads the session written by `@supabase/ssr` (plain or `base64-`, whole or
208
- * chunked). Mismatched chunks from a partial write read as no session.
209
- */
210
- function readSession(cookies, name) {
211
- const raw = combine(cookies, name);
212
- if (!raw) return null;
213
- try {
214
- const json = raw.startsWith(BASE64_PREFIX) ? stringFromBase64URL(raw.slice(7)) : raw;
215
- const parsed = JSON.parse(json);
216
- return isStoredSession(parsed) ? parsed : null;
217
- } catch {
218
- return null;
219
- }
220
- }
221
- /**
222
- * Cookie writes that store `session` (or clear it with `null`) exactly like
223
- * `@supabase/ssr`, and expire chunks the new value no longer uses.
224
- */
225
- function writeSession(existing, name, session, options = {}) {
226
- const base = {
227
- ...DEFAULT_COOKIE_OPTIONS,
228
- ...options
229
- };
230
- const chunks = session ? createChunks(name, BASE64_PREFIX + stringToBase64URL(JSON.stringify(session))) : [];
231
- const kept = new Set(chunks.map((chunk) => chunk.name));
232
- return [...existing.filter((cookie) => isChunkLike(cookie.name, name) && !kept.has(cookie.name)).map((cookie) => ({
233
- name: cookie.name,
234
- value: "",
235
- options: {
236
- ...base,
237
- maxAge: 0
238
- }
239
- })), ...chunks.map((chunk) => ({
240
- name: chunk.name,
241
- value: chunk.value,
242
- options: base
243
- }))];
244
- }
245
- /** Applies cookie writes to a cookie list, as the next request would see it. */
246
- function applyCookieWrites(cookies, writes) {
247
- const next = new Map(cookies.map((cookie) => [cookie.name, cookie.value]));
248
- for (const write of writes) if (write.options.maxAge === 0) next.delete(write.name);
249
- else next.set(write.name, write.value);
250
- return [...next].map(([name, value]) => ({
251
- name,
252
- value
253
- }));
254
- }
255
- //#endregion
256
288
  //#region src/auth/resolve.ts
257
289
  function expiryOf(session) {
258
290
  if (typeof session.expires_at === "number") return session.expires_at;
@@ -274,60 +306,28 @@ let memoByJwks = /* @__PURE__ */ new WeakMap();
274
306
  /**
275
307
  * Tokens that already verified, until they expire. Every private-cache scope
276
308
  * and island resolves the same token again; this skips the signature check.
309
+ * A hit skips the audience and issuer checks too, so both are part of the key.
277
310
  */
278
311
  function memoFor(options) {
279
312
  const jwks = options.jwks ?? options.env.jwks;
280
- if (jwks && typeof jwks === "object" && !(jwks instanceof URL)) {
281
- let memo = memoByJwks.get(jwks);
282
- if (!memo) memoByJwks.set(jwks, memo = /* @__PURE__ */ new Map());
283
- return memo;
284
- }
313
+ const inline = jwks && typeof jwks === "object" && !(jwks instanceof URL);
285
314
  const key = JSON.stringify([
286
- String(jwks ?? options.env.jwksUrl),
315
+ inline ? null : String(jwks ?? options.env.jwksUrl),
287
316
  options.env.url,
288
317
  options.audience ?? null,
289
318
  options.issuer ?? null
290
319
  ]);
320
+ if (inline) {
321
+ let byKey = memoByJwks.get(jwks);
322
+ if (!byKey) memoByJwks.set(jwks, byKey = /* @__PURE__ */ new Map());
323
+ let memo = byKey.get(key);
324
+ if (!memo) byKey.set(key, memo = /* @__PURE__ */ new Map());
325
+ return memo;
326
+ }
291
327
  let memo = memoByUrl.get(key);
292
328
  if (!memo) memoByUrl.set(key, memo = /* @__PURE__ */ new Map());
293
329
  return memo;
294
330
  }
295
- function sameJson(a, b) {
296
- if (a === b) return true;
297
- if (typeof a !== "object" || typeof b !== "object" || !a || !b) return false;
298
- if (Array.isArray(a) !== Array.isArray(b)) return false;
299
- const left = Object.entries(a);
300
- const right = new Map(Object.entries(b));
301
- return left.length === right.size && left.every(([key, value]) => right.has(key) && sameJson(value, right.get(key)));
302
- }
303
- /**
304
- * Records a token that `@supabase/server` verified for this request, so the
305
- * next `resolveAuth` with these options doesn't verify it again. Only when
306
- * `claims` is the token's own payload, it hasn't expired, and its `iss` and
307
- * `aud` pass the checks these options would apply; otherwise returns false
308
- * and the token is verified as usual.
309
- */
310
- function rememberVerified(options, verified) {
311
- const { token, claims, user } = verified;
312
- const now = Math.floor((options.now ?? Date.now)() / 1e3);
313
- const expiresAt = typeof claims.exp === "number" ? claims.exp : null;
314
- if (expiresAt === null || expiresAt <= now) return false;
315
- if (!sameJson(decodeJwtPayload(token), claims)) return false;
316
- const issuers = [options.issuer ?? `${options.env.url}/auth/v1`].flat();
317
- if (typeof claims.iss !== "string" || !issuers.includes(claims.iss)) return false;
318
- const audiences = [options.audience ?? "authenticated"].flat();
319
- const aud = claims.aud;
320
- const given = Array.isArray(aud) ? aud : [aud];
321
- if (!audiences.some((audience) => given.includes(audience))) return false;
322
- remember(memoFor(options), token, {
323
- kind: "user",
324
- token,
325
- claims,
326
- user,
327
- expiresAt
328
- }, expiresAt);
329
- return true;
330
- }
331
331
  function remembered(memo, token, now) {
332
332
  const hit = memo.get(token);
333
333
  if (!hit) return void 0;
@@ -402,7 +402,7 @@ async function checkClaims(state, options) {
402
402
  if (!actorOf(state.claims).ok) return {
403
403
  kind: "invalid",
404
404
  reason: "actor",
405
- error: dbError("unauthorized", "The token's act claim is not a chain of actors with a sub", { code: "ACTOR_INVALID" })
405
+ error: dbError("unauthorized", "The token's act claim is not a chain of actors with a sub, or has a kind other than support or impersonation", { code: "ACTOR_INVALID" })
406
406
  };
407
407
  if (!options.claims) return state;
408
408
  let outcome = options.claims["~standard"].validate(state.claims);
@@ -502,11 +502,12 @@ async function verifyOnce(credentials, modes, options, source) {
502
502
  reason: "none"
503
503
  };
504
504
  }
505
- function resolution(auth, cookies, writes = []) {
505
+ function resolution(auth, cookies, writes = [], ended = false) {
506
506
  const headers = writes.length > 0 ? AUTH_CACHE_HEADERS : {};
507
507
  let requestCookies;
508
508
  return {
509
509
  auth,
510
+ ...ended ? { sessionEnded: true } : {},
510
511
  cookies: writes,
511
512
  headers,
512
513
  /** Parsed on first read: bearer requests rarely need their cookies. */
@@ -568,10 +569,11 @@ async function resolveAuth(request, options) {
568
569
  reason: "none"
569
570
  }, cookies);
570
571
  const name = options.cookie?.name ?? sessionCookieName(options.env.url);
572
+ const encoding = options.cookie?.encode === void 0 ? {} : { encode: options.cookie.encode };
571
573
  const session = readSession(cookies(), name);
572
574
  if (!session) {
573
575
  const stale = cookies().some((cookie) => cookie.name === name || cookie.name.startsWith(`${name}.`));
574
- const writes = stale && options.refresh ? writeSession(cookies(), name, null, options.cookie?.options) : [];
576
+ const writes = stale && options.refresh ? writeSession(cookies(), name, null, options.cookie?.options, encoding) : [];
575
577
  return resolution({
576
578
  kind: "anon",
577
579
  reason: stale ? "signed_out" : "none"
@@ -580,11 +582,22 @@ async function resolveAuth(request, options) {
580
582
  const now = Math.floor((options.now ?? Date.now)() / 1e3);
581
583
  const expiry = expiryOf(session);
582
584
  const leeway = options.refresh ? options.leeway ?? 60 : 0;
583
- if (expiry !== void 0 && expiry - leeway > now) {
585
+ const fresh = expiry !== void 0 && expiry - leeway > now;
586
+ if (fresh) {
584
587
  const state = await verify({
585
588
  token: session.access_token,
586
589
  apikey: null
587
590
  }, ["user"], options, "cookie");
591
+ if (state.kind === "user" && options.checkSession && await sessionStatus(state.token, {
592
+ url: options.env.url,
593
+ publishableKey: options.env.publishableKey,
594
+ ...options.fetch ? { fetch: options.fetch } : {},
595
+ ...options.refreshTimeoutMs === void 0 ? {} : { timeoutMs: options.refreshTimeoutMs },
596
+ ...options.now ? { now: options.now } : {}
597
+ }) === "ended") return resolution({
598
+ kind: "anon",
599
+ reason: "signed_out"
600
+ }, cookies, options.refresh ? writeSession(cookies(), name, null, options.cookie?.options, encoding) : [], true);
588
601
  if (state.kind !== "invalid" || state.reason !== "token" || state.error.kind === "network") return resolution(state, cookies);
589
602
  if (!options.refresh) return resolution({
590
603
  kind: "anon",
@@ -614,16 +627,25 @@ async function resolveAuth(request, options) {
614
627
  durationMs: performance.now() - started
615
628
  });
616
629
  if (!outcome.ok) {
617
- if (outcome.reason === "network") return resolution({
618
- kind: "anon",
619
- reason: "refresh_failed"
620
- }, cookies);
630
+ if (outcome.reason === "network") {
631
+ if (!fresh && expiry !== void 0 && expiry > now) {
632
+ const state = await verify({
633
+ token: session.access_token,
634
+ apikey: null
635
+ }, ["user"], options, "cookie");
636
+ if (state.kind !== "invalid") return resolution(state, cookies);
637
+ }
638
+ return resolution({
639
+ kind: "anon",
640
+ reason: "refresh_failed"
641
+ }, cookies);
642
+ }
621
643
  return resolution({
622
644
  kind: "anon",
623
645
  reason: "signed_out"
624
- }, cookies, writeSession(cookies(), name, null, options.cookie?.options));
646
+ }, cookies, writeSession(cookies(), name, null, options.cookie?.options, encoding));
625
647
  }
626
- const writes = writeSession(cookies(), name, outcome.session, options.cookie?.options);
648
+ const writes = writeSession(cookies(), name, outcome.session, options.cookie?.options, encoding);
627
649
  return resolution(await verify({
628
650
  token: outcome.session.access_token,
629
651
  apikey: null
@@ -641,6 +663,19 @@ function authContext(auth) {
641
663
  },
642
664
  claims: { role: "service_role" }
643
665
  };
666
+ case "apiKey": return {
667
+ actor: auth.userId ? {
668
+ id: auth.userId,
669
+ kind: "user",
670
+ role: "authenticated"
671
+ } : {
672
+ id: `api-key:${auth.keyId}`,
673
+ kind: "service",
674
+ role: "authenticated"
675
+ },
676
+ claims: auth.claims,
677
+ ...auth.organizationId ? { tenant: auth.organizationId } : {}
678
+ };
644
679
  case "anon":
645
680
  case "invalid": return {
646
681
  actor: {
@@ -654,89 +689,4 @@ function authContext(auth) {
654
689
  }
655
690
  }
656
691
  //#endregion
657
- //#region src/auth/mfa.ts
658
- /** The session's assurance level from its claims; anything but `aal2` reads as `aal1`. */
659
- function aalOf(claims) {
660
- return claims["aal"] === "aal2" ? "aal2" : "aal1";
661
- }
662
- /** The `amr` claim as typed entries, skipping malformed ones. */
663
- function amrOf(claims) {
664
- const amr = claims["amr"];
665
- if (!Array.isArray(amr)) return [];
666
- return amr.flatMap((entry) => {
667
- if (typeof entry !== "object" || entry === null) return [];
668
- const { method, timestamp, provider } = entry;
669
- if (typeof method !== "string" || typeof timestamp !== "number") return [];
670
- return [typeof provider === "string" ? {
671
- method,
672
- timestamp,
673
- provider
674
- } : {
675
- method,
676
- timestamp
677
- }];
678
- });
679
- }
680
- /**
681
- * `undefined` when a user session meets `required`; otherwise a `forbidden`
682
- * error with `required` and code `INSUFFICIENT_AAL`, for the client to start
683
- * an MFA challenge. Non-user sessions pass: `allow` decides about them.
684
- */
685
- function checkAal(auth, required) {
686
- if (required === "aal1" || auth.kind !== "user" || !("claims" in auth)) return void 0;
687
- if (aalOf(auth.claims) === "aal2") return void 0;
688
- return dbError("forbidden", "Verify a second factor to continue", {
689
- code: "INSUFFICIENT_AAL",
690
- required
691
- });
692
- }
693
- //#endregion
694
- //#region src/auth/view.ts
695
- /** Whether the token belongs to an anonymous user (`signInAnonymously()`). */
696
- function isAnonymousUser(claims) {
697
- return "is_anonymous" in claims && claims.is_anonymous === true;
698
- }
699
- /** Drops the token from an `AuthState`, leaving only serializable fields. */
700
- function toSession(auth) {
701
- switch (auth.kind) {
702
- case "user": {
703
- const impersonator = impersonatorOf(auth.claims);
704
- const outcome = actorOf(auth.claims);
705
- const actor = outcome.ok ? outcome.actor : void 0;
706
- const scopes = actor ? delegationOf(auth.claims)?.scopes : void 0;
707
- const delegation = actor && (scopes || actor.chain) ? {
708
- scopes: scopes ?? [],
709
- ...actor.chain ? { chain: actor.chain } : {}
710
- } : void 0;
711
- return {
712
- kind: "user",
713
- user: auth.user,
714
- claims: auth.claims,
715
- expiresAt: auth.expiresAt,
716
- ...auth.profile === void 0 ? {} : { profile: auth.profile },
717
- aal: aalOf(auth.claims),
718
- anonymous: isAnonymousUser(auth.claims),
719
- amr: amrOf(auth.claims),
720
- ...impersonator ? { impersonator } : {},
721
- ...actor ? { actor } : {},
722
- ...delegation ? { delegation } : {}
723
- };
724
- }
725
- case "service": return {
726
- kind: "service",
727
- keyName: auth.keyName
728
- };
729
- case "anon": return {
730
- kind: "anon",
731
- reason: auth.reason
732
- };
733
- case "invalid": return {
734
- kind: "invalid",
735
- reason: auth.reason,
736
- error: auth.error
737
- };
738
- default: return auth;
739
- }
740
- }
741
- //#endregion
742
- export { writeSession as _, checkAal as a, delegationOf as b, prefetchJwks as c, AUTH_CACHE_HEADERS as d, applyCookieWrites as f, sessionCookieName as g, serializeCookie as h, amrOf as i, rememberVerified as l, readSession as m, toSession as n, authContext as o, parseCookies as p, aalOf as r, clientIp as s, isAnonymousUser as t, resolveAuth as u, refreshSession as v, actorOf as y };
692
+ export { writeSession as _, refreshSession as a, AUTH_CACHE_HEADERS as c, clearSessionAtScopes as d, parseCookies as f, sessionEncoding as g, sessionCookieName as h, resolveAuth as i, DEFAULT_SESSION_ENCODING as l, serializeCookie as m, clientIp as n, clearSessionCookies as o, readSession as p, prefetchJwks as r, sessionStatus as s, authContext as t, applyCookieWrites as u };