better-supabase 0.5.1 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +187 -46
- package/dist/access-sql-B0dF-SoF.js +181 -0
- package/dist/{actor-DaJjqD5R.d.ts → actor-CQTlc1Hh.d.ts} +1 -1
- package/dist/adapter-Bc1o3zyy.js +1106 -0
- package/dist/agents-CVHGd7It.d.ts +94 -0
- package/dist/ai-cache-CBWs1W0k.js +80 -0
- package/dist/ai-cache-DaDu_G5L.d.ts +64 -0
- package/dist/ai-chat-7amvXjmQ.d.ts +590 -0
- package/dist/ai-chat-B24UI962.js +743 -0
- package/dist/ai-files-CSPNswUY.js +319 -0
- package/dist/ai-sdk/agents/index.d.ts +74 -0
- package/dist/ai-sdk/agents/index.js +159 -0
- package/dist/ai-sdk/batches/index.d.ts +74 -0
- package/dist/ai-sdk/batches/index.js +180 -0
- package/dist/ai-sdk/cache/index.d.ts +38 -0
- package/dist/ai-sdk/cache/index.js +127 -0
- package/dist/ai-sdk/chat/index.d.ts +2 -0
- package/dist/ai-sdk/chat/index.js +246 -0
- package/dist/ai-sdk/embeddings/index.d.ts +3 -0
- package/dist/ai-sdk/embeddings/index.js +2 -0
- package/dist/ai-sdk/files/index.d.ts +61 -0
- package/dist/ai-sdk/files/index.js +111 -0
- package/dist/ai-sdk/index.d.ts +145 -0
- package/dist/ai-sdk/index.js +174 -0
- package/dist/ai-sdk/mcp/index.d.ts +102 -0
- package/dist/ai-sdk/mcp/index.js +362 -0
- package/dist/ai-sdk/memory/index.d.ts +67 -0
- package/dist/ai-sdk/memory/index.js +175 -0
- package/dist/ai-sdk/react/index.d.ts +2 -0
- package/dist/ai-sdk/react/index.js +3 -0
- package/dist/ai-sdk/react/server.d.ts +6 -0
- package/dist/ai-sdk/react/server.js +7 -0
- package/dist/ai-sdk/workflow/index.d.ts +249 -0
- package/dist/ai-sdk/workflow/index.js +575 -0
- package/dist/ai-sdk/workflow/react/index.d.ts +20 -0
- package/dist/ai-sdk/workflow/react/index.js +66 -0
- package/dist/ai-sdk/workflow/react/server.d.ts +10 -0
- package/dist/ai-sdk/workflow/react/server.js +12 -0
- package/dist/ai-tasks-Cd1HMFvB.d.ts +131 -0
- package/dist/announcements-CiyOs-xP.js +107 -0
- package/dist/announcements-ZRGnScWI.d.ts +72 -0
- package/dist/api-keys-rCGtKaZA.d.ts +156 -0
- package/dist/assistant-DwdpDH1q.d.ts +147 -0
- package/dist/astro/index.d.ts +86 -0
- package/dist/astro/index.js +93 -0
- package/dist/attributes-5dYul0u0.js +13 -0
- package/dist/auth-link-BjFPqwLz.d.ts +97 -0
- package/dist/auth-link-DrDX9KOT.js +114 -0
- package/dist/authorization-BFCqamMs.d.ts +172 -0
- package/dist/before-route-CnR0C0Jr.js +30 -0
- package/dist/bind-Bu_ZNa3W.d.ts +62 -0
- package/dist/bind-l4kAvYSv.js +97 -0
- package/dist/block-events-CrT8r7Fe.js +76 -0
- package/dist/block-fields-GFkxl4dP.js +49 -0
- package/dist/block-fields-SJ6fEf3o.d.ts +31 -0
- package/dist/block-helpers-CKtbFcRv.d.ts +37 -0
- package/dist/block-helpers-DWHxHsEQ.js +190 -0
- package/dist/block-hooks-BmjMyXTa.js +114 -0
- package/dist/block-hooks-plbZ0AbJ.d.ts +107 -0
- package/dist/{kit-transport-DJlHQUBU.js → block-transport-BLr-ZgLc.js} +11 -7
- package/dist/block-transport-DvaoPuZ9.d.ts +48 -0
- package/dist/blocks/agents/index.d.ts +3 -0
- package/dist/blocks/agents/index.js +123 -0
- package/dist/blocks/ai-cache/index.d.ts +3 -0
- package/dist/blocks/ai-cache/index.js +3 -0
- package/dist/blocks/ai-chat/index.d.ts +31 -0
- package/dist/blocks/ai-chat/index.js +5 -0
- package/dist/blocks/ai-chat/react/index.d.ts +77 -0
- package/dist/blocks/ai-chat/react/index.js +387 -0
- package/dist/blocks/ai-chat/react/server.d.ts +16 -0
- package/dist/blocks/ai-chat/react/server.js +14 -0
- package/dist/blocks/ai-files/index.d.ts +14 -0
- package/dist/blocks/ai-files/index.js +3 -0
- package/dist/blocks/ai-providers/index.d.ts +7 -0
- package/dist/blocks/ai-providers/index.js +211 -0
- package/dist/blocks/ai-tasks/index.d.ts +3 -0
- package/dist/blocks/ai-tasks/index.js +203 -0
- package/dist/blocks/announcements/index.d.ts +3 -0
- package/dist/blocks/announcements/index.js +3 -0
- package/dist/blocks/announcements/react/index.d.ts +31 -0
- package/dist/blocks/announcements/react/index.js +86 -0
- package/dist/blocks/announcements/react/server.d.ts +6 -0
- package/dist/blocks/announcements/react/server.js +7 -0
- package/dist/blocks/api-keys/index.d.ts +35 -0
- package/dist/blocks/api-keys/index.js +334 -0
- package/dist/blocks/attachments/index.d.ts +210 -0
- package/dist/blocks/attachments/index.js +222 -0
- package/dist/blocks/audit/index.d.ts +366 -0
- package/dist/blocks/audit/index.js +714 -0
- package/dist/blocks/billing/index.d.ts +265 -0
- package/dist/blocks/billing/index.js +400 -0
- package/dist/blocks/comments/index.d.ts +200 -0
- package/dist/blocks/comments/index.js +207 -0
- package/dist/blocks/connectors/index.d.ts +3 -0
- package/dist/blocks/connectors/index.js +164 -0
- package/dist/blocks/data-lifecycle/index.d.ts +251 -0
- package/dist/blocks/data-lifecycle/index.js +353 -0
- package/dist/blocks/entitlements/index.d.ts +14 -0
- package/dist/blocks/entitlements/index.js +25 -0
- package/dist/blocks/flags/index.d.ts +226 -0
- package/dist/blocks/flags/index.js +282 -0
- package/dist/blocks/inbox/index.d.ts +6 -0
- package/dist/blocks/inbox/index.js +499 -0
- package/dist/blocks/inbox/react/index.d.ts +2 -0
- package/dist/blocks/inbox/react/index.js +225 -0
- package/dist/blocks/inbox/react/server.d.ts +10 -0
- package/dist/blocks/inbox/react/server.js +12 -0
- package/dist/blocks/index.d.ts +65 -0
- package/dist/blocks/index.js +77 -0
- package/dist/blocks/jobs/index.d.ts +297 -0
- package/dist/blocks/jobs/index.js +1051 -0
- package/dist/blocks/knowledge/index.d.ts +3 -0
- package/dist/blocks/knowledge/index.js +3 -0
- package/dist/blocks/memory/index.d.ts +8 -0
- package/dist/blocks/memory/index.js +289 -0
- package/dist/blocks/notifications/index.d.ts +297 -0
- package/dist/blocks/notifications/index.js +425 -0
- package/dist/blocks/notifications/react/index.d.ts +44 -0
- package/dist/blocks/notifications/react/index.js +67 -0
- package/dist/blocks/notifications/react/server.d.ts +6 -0
- package/dist/blocks/notifications/react/server.js +7 -0
- package/dist/blocks/onboarding/index.d.ts +3 -0
- package/dist/blocks/onboarding/index.js +64 -0
- package/dist/blocks/onboarding/react/index.d.ts +28 -0
- package/dist/blocks/onboarding/react/index.js +78 -0
- package/dist/blocks/onboarding/react/server.d.ts +7 -0
- package/dist/blocks/onboarding/react/server.js +7 -0
- package/dist/blocks/organizations/index.d.ts +241 -0
- package/dist/blocks/organizations/index.js +400 -0
- package/dist/blocks/outbox/index.d.ts +3 -0
- package/dist/blocks/outbox/index.js +266 -0
- package/dist/blocks/profiles/index.d.ts +40 -0
- package/dist/blocks/profiles/index.js +28 -0
- package/dist/blocks/push/index.d.ts +185 -0
- package/dist/blocks/push/index.js +258 -0
- package/dist/blocks/settings/index.d.ts +89 -0
- package/dist/blocks/settings/index.js +104 -0
- package/dist/blocks/sso/index.d.ts +198 -0
- package/dist/blocks/sso/index.js +1297 -0
- package/dist/blocks/usage/index.d.ts +4 -0
- package/dist/blocks/usage/index.js +233 -0
- package/dist/blocks/waitlist/index.d.ts +117 -0
- package/dist/blocks/waitlist/index.js +132 -0
- package/dist/blocks/webhooks/index.d.ts +304 -0
- package/dist/{webhooks → blocks/webhooks}/index.js +468 -148
- package/dist/blocks/workflow-builder/index.d.ts +21 -0
- package/dist/blocks/workflow-builder/index.js +5 -0
- package/dist/blocks/workflow-builder/react/index.d.ts +47 -0
- package/dist/blocks/workflow-builder/react/index.js +119 -0
- package/dist/blocks/workflow-builder/react/server.d.ts +8 -0
- package/dist/blocks/workflow-builder/react/server.js +11 -0
- package/dist/blocks/workflows/index.d.ts +3 -0
- package/dist/blocks/workflows/index.js +3 -0
- package/dist/blocks/workflows/react/index.d.ts +47 -0
- package/dist/blocks/workflows/react/index.js +137 -0
- package/dist/blocks/workflows/react/server.d.ts +8 -0
- package/dist/blocks/workflows/react/server.js +11 -0
- package/dist/{index-SaTsEfGP.d.ts → bucket-Cl46E3jS.d.ts} +134 -91
- package/dist/{simplify-_0oUKqCd.js → build-BXIzE6Xv.js} +222 -124
- package/dist/{channel-FQW-CnGR.d.ts → channel-_2Mx1Oyu.d.ts} +2 -2
- package/dist/channels-CkgQ_X60.js +114 -0
- package/dist/chat-sdk/index.d.ts +303 -0
- package/dist/chat-sdk/index.js +733 -0
- package/dist/chat-sdk/react/index.d.ts +2 -0
- package/dist/chat-sdk/react/index.js +3 -0
- package/dist/chat-sdk/react/server.d.ts +3 -0
- package/dist/chat-sdk/react/server.js +2 -0
- package/dist/claims-DDBQT6BK.js +61 -0
- package/dist/{claims-BAf6c7is.js → claims-PqzCxaTD.js} +39 -2
- package/dist/cli/bin.js +1 -1
- package/dist/cli/{codemod-DqV7612m.js → codemod-Bl_tQpHn.js} +105 -2
- package/dist/cli/config-B9HkL8nF.js +2 -0
- package/dist/cli/config-DU7EJImt.js +49 -0
- package/dist/cli/config-NiPxAmUF.js +1077 -0
- package/dist/cli/{dist-xn4wlboc.js → dist-DRAVaE6w.js} +111 -1
- package/dist/cli/{doctor-C_A-KEAz.js → doctor-B4JOm_ox.js} +991 -317
- package/dist/cli/{env-DmKv_G4A.js → env-CJLbUVPB.js} +1 -1
- package/dist/cli/{env-jIFUADLY.js → env-qXgyMV6r.js} +2 -2
- package/dist/cli/fresh-import-BeYf9I3x.js +40 -0
- package/dist/cli/gen-BGLb_zou.js +3100 -0
- package/dist/cli/gen-DAH8FM2W.js +2 -0
- package/dist/cli/index.d.ts +44 -5
- package/dist/cli/index.js +7 -7
- package/dist/cli/{init-DMa6M7hV.js → init-BIIwclPg.js} +242 -27
- package/dist/cli/{introspect-BKlaIu_M.js → introspect-DNUTuNvb.js} +5 -5
- package/dist/cli/{io-k41_z-jT.js → io-DI1mTdSA.js} +12 -3
- package/dist/cli/{keys-ByKHnvP9.js → keys-BGCnnb-s.js} +8 -6
- package/dist/cli/{ohash-D7bG_EOb.js → ohash-BjQY1cBb.js} +1 -1
- package/dist/cli/{openapi-Cp5Fyta-.js → openapi-BlRJ18s3.js} +2 -2
- package/dist/cli/{project-B_GeXyHh.js → project-DZRaBaY7.js} +11 -6
- package/dist/cli/read-sets-CETOSFx4.js +223 -0
- package/dist/cli/{run-Bo_NLT5n.js → run-DNWxHynX.js} +33 -23
- package/dist/cli/{seed-CUlqWh-8.js → seed-DQzqT7LP.js} +8 -6
- package/dist/cli/{skills-LJJIhLFR.js → skills-QQs4q68J.js} +3 -2
- package/dist/cli/sql-D0GUtUPp.js +536 -0
- package/dist/cli/{config-CPVpXP5I.js → supabase-toml-B-bIukQF.js} +72 -942
- package/dist/cli/typegen-version-DeFbtzYI.js +8 -0
- package/dist/cli/{version-BCtlgDQx.js → version-hr88OZG0.js} +1 -1
- package/dist/client/index.d.ts +3 -2
- package/dist/client/index.js +11 -71
- package/dist/client/native/index.d.ts +228 -0
- package/dist/client/native/index.js +361 -0
- package/dist/client-CI0Z2zWX.js +277 -0
- package/dist/cloud-event-BnmD5fb9.js +46 -0
- package/dist/cloud-event-C1JCc1bH.d.ts +50 -0
- package/dist/{compiler-BXH_aZ7N.d.ts → compiler-DY_wkj4R.d.ts} +2 -2
- package/dist/compose-BIBNgAnq.js +53 -0
- package/dist/composite-Bt1YK3Ke.d.ts +146 -0
- package/dist/composite-DhE66P5u.js +130 -0
- package/dist/config/index.d.ts +6 -4
- package/dist/config/index.js +5 -5
- package/dist/{config-Bv7gvfzC.d.ts → config-D44Y7PAv.d.ts} +406 -214
- package/dist/{config-DreERlKo.js → config-Dn7F5k9A.js} +62 -14
- package/dist/connector-Dv8kK0MO.d.ts +107 -0
- package/dist/connectors-hkLCwyEz.d.ts +120 -0
- package/dist/context-BCrWe7ow.d.ts +237 -0
- package/dist/credentials/index.d.ts +31 -0
- package/dist/credentials/index.js +168 -0
- package/dist/cron-DVPUg5k3.js +145 -0
- package/dist/csv-CPAzEmB6.js +25 -0
- package/dist/db-exception-CnWcYPxL.js +15 -0
- package/dist/{define-cNKzqwL_.js → define-B-TVjC25.js} +784 -227
- package/dist/{define-Bp_BZa5h.d.ts → define-CJJkkr1-.d.ts} +353 -61
- package/dist/edge/index.d.ts +69 -11
- package/dist/edge/index.js +191 -75
- package/dist/elysia/index.d.ts +59 -0
- package/dist/elysia/index.js +62 -0
- package/dist/embeddings-4ZvFzjsU.js +127 -0
- package/dist/embeddings-C9KGQnXt.d.ts +68 -0
- package/dist/{refresh-CFPX0Qft.d.ts → ended-jLfvw8h-.d.ts} +20 -2
- package/dist/{entitlements-BiJZ4t49.d.ts → entitlements-DHrY2UDZ.d.ts} +16 -7
- package/dist/entitlements-DRl6ZJUm.js +24 -0
- package/dist/envelope-DqnYGRw7.js +47 -0
- package/dist/{errors-DtwXa6b8.js → errors-B11Duf73.js} +82 -13
- package/dist/errors-DLjJHPLK.js +44 -0
- package/dist/escape-like-DHfx6jRr.js +7 -0
- package/dist/escape-like-ImTK0ps_.d.ts +15 -0
- package/dist/eve/index.d.ts +220 -0
- package/dist/eve/index.js +504 -0
- package/dist/eve-gT2Fpjut.d.ts +151 -0
- package/dist/events/index.d.ts +4 -3
- package/dist/events/index.js +9 -50
- package/dist/events-DWDhx77e.d.ts +549 -0
- package/dist/executor-Bq28caBo.js +718 -0
- package/dist/executor-C-R4pucm.js +83 -0
- package/dist/executor-CaWigTyR.d.ts +148 -0
- package/dist/executor-D14tGopJ.d.ts +36 -0
- package/dist/{executor-Cghdstwu.d.ts → executor-DbvExCFC.d.ts} +7 -1
- package/dist/{sql-Coh6n4cC.js → executor-De1Of3m3.js} +210 -11
- package/dist/executor-DvsBbNBS.d.ts +261 -0
- package/dist/expo/index.d.ts +79 -0
- package/dist/expo/index.js +129 -0
- package/dist/expo-sqlite/index.d.ts +58 -0
- package/dist/expo-sqlite/index.js +104 -0
- package/dist/field-errors-BFOa7WhB.d.ts +99 -0
- package/dist/field-errors-VF1yb8yI.js +13 -0
- package/dist/framework-CONDyPYx.js +51 -0
- package/dist/framework-DuVb4Xa8.d.ts +25 -0
- package/dist/gateway-C1ssRHnf.d.ts +130 -0
- package/dist/graph-BGyLLFLX.js +265 -0
- package/dist/h3/index.d.ts +59 -0
- package/dist/h3/index.js +55 -0
- package/dist/h3/v1/index.d.ts +63 -0
- package/dist/h3/v1/index.js +49 -0
- package/dist/history-BZih6SFP.js +64 -0
- package/dist/hono/index.d.ts +56 -7
- package/dist/hono/index.js +97 -45
- package/dist/{react-C_s7kiNz.js → hooks-1BTCJsiw.js} +104 -133
- package/dist/http-Cv4T29xh.js +40 -0
- package/dist/http-DdYadv-o.js +126 -0
- package/dist/image-url-pIVlO6R1.js +41 -0
- package/dist/{impersonation-BgSHAYLf.js → impersonation-DcqaTBHx.js} +21 -6
- package/dist/inbox-i7E1ppo6.d.ts +384 -0
- package/dist/index-ACiNPN4Z.d.ts +74 -0
- package/dist/{index-DgILJRXj.d.ts → index-Bepi-Hgg.d.ts} +91 -28
- package/dist/index-BkWT_uBO.d.ts +51 -0
- package/dist/index-BpFYMsi0.d.ts +53 -0
- package/dist/{index-C7f8cOBM.d.ts → index-Bxih3l0u.d.ts} +2 -2
- package/dist/index-CaxrMD1A.d.ts +1 -0
- package/dist/index-ClmjK_o-.d.ts +55 -0
- package/dist/index-CtuakVRc.d.ts +267 -0
- package/dist/index-D48jVS-N.d.ts +246 -0
- package/dist/index-DDrYaUcq.d.ts +138 -0
- package/dist/index-DQh4VCc9.d.ts +98 -0
- package/dist/{live-D9W2M5aO.d.ts → index-DunNRdnT.d.ts} +136 -38
- package/dist/index.d.ts +65 -18
- package/dist/index.js +42 -14
- package/dist/invalidate-BBqhpxyB.d.ts +19 -0
- package/dist/json-CEnpTHlZ.js +16 -0
- package/dist/json-schema-CvER4kgT.js +502 -0
- package/dist/keys-4MnkWTTh.js +35 -0
- package/dist/kit-B5tid-q5.d.ts +60 -0
- package/dist/kit-Fm-Fv7q5.js +78 -0
- package/dist/knowledge-BXBbT0Tr.d.ts +176 -0
- package/dist/knowledge-CDmiMLew.js +255 -0
- package/dist/lint/index.d.ts +1 -1
- package/dist/lint/index.js +37 -0
- package/dist/list/index.d.ts +3 -2
- package/dist/list/index.js +1 -444
- package/dist/{index-fag8VJZ2.d.ts → list-query-BRt-zDF7.d.ts} +20 -12
- package/dist/list-query-gl808ac1.js +459 -0
- package/dist/{live-CdJBOc4f.js → live-CTAZQkwl.js} +99 -14
- package/dist/logger-DWVYUmwi.d.ts +18 -0
- package/dist/mcp/index.d.ts +38 -11
- package/dist/mcp/index.js +82 -46
- package/dist/mcp/sdk/index.d.ts +105 -0
- package/dist/mcp/sdk/index.js +126 -0
- package/dist/message-CaKlqdsX.js +219 -0
- package/dist/message-CfDoR0Y6.d.ts +94 -0
- package/dist/messages-B9-5887d.js +715 -0
- package/dist/messages-DYP0sUTe.d.ts +59 -0
- package/dist/mfa-Daak8ukG.d.ts +54 -0
- package/dist/modules-DpPwzC7E.d.ts +192 -0
- package/dist/modules-dxrVK3ID.js +228 -0
- package/dist/nestjs/index.d.ts +68 -0
- package/dist/nestjs/index.js +164 -0
- package/dist/next/client/index.d.ts +35 -0
- package/dist/next/client/index.js +36 -0
- package/dist/next/image/index.js +3 -24
- package/dist/next/index.d.ts +150 -51
- package/dist/next/index.js +261 -107
- package/dist/node/index.d.ts +4 -0
- package/dist/node/index.js +210 -0
- package/dist/node-headers-AO06VhqH.d.ts +24 -0
- package/dist/node-headers-C71zNQHe.js +55 -0
- package/dist/nuxt/index.d.ts +60 -0
- package/dist/nuxt/index.js +64 -0
- package/dist/onboarding-BZGHYJks.d.ts +62 -0
- package/dist/openapi/index.d.ts +1 -1
- package/dist/openapi/index.js +3 -3
- package/dist/orpc/index.d.ts +70 -11
- package/dist/orpc/index.js +73 -24
- package/dist/otel/index.d.ts +7 -7
- package/dist/otel/index.js +87 -57
- package/dist/outbox-Cq7pPYvl.d.ts +161 -0
- package/dist/{plugin-o144f322.d.ts → plugin-FGY8UhYm.d.ts} +30 -10
- package/dist/plugin-tfXW1-qO.js +45 -0
- package/dist/plugins/actor/index.d.ts +2 -2
- package/dist/plugins/actor/index.js +3 -3
- package/dist/plugins/rules/index.d.ts +11 -4
- package/dist/plugins/rules/index.js +40 -13
- package/dist/plugins/soft-delete/index.d.ts +5 -4
- package/dist/plugins/soft-delete/index.js +10 -5
- package/dist/plugins/tenant/index.d.ts +2 -2
- package/dist/plugins/tenant/index.js +18 -11
- package/dist/plugins/timestamps/index.d.ts +5 -3
- package/dist/plugins/timestamps/index.js +6 -4
- package/dist/plugins/validation/index.d.ts +2 -2
- package/dist/plugins/validation/index.js +10 -6
- package/dist/{pool-C9voM4Kw.d.ts → pool-CAu2nLrL.d.ts} +2 -2
- package/dist/postgres/index.d.ts +4 -4
- package/dist/postgres/index.js +1 -2
- package/dist/{postgrest-CruYKAvV.d.ts → postgrest-BLVdEnfe.d.ts} +13 -3
- package/dist/powersync/index.d.ts +43 -0
- package/dist/powersync/index.js +199 -0
- package/dist/powersync/react/index.d.ts +87 -0
- package/dist/powersync/react/index.js +108 -0
- package/dist/{problem-BW1KhzSG.js → problem-BreOl8b8.js} +14 -3
- package/dist/{problem-Blxe8S31.d.ts → problem-DD8LZFjc.d.ts} +21 -3
- package/dist/provider-BH5UWZJ6.d.ts +113 -0
- package/dist/provider-Di3sRutW.js +57 -0
- package/dist/query/index.d.ts +4 -2
- package/dist/query/index.js +4 -3
- package/dist/{query-CCbo44lG.js → query-BQ-NaZon.js} +141 -24
- package/dist/{queue-BYUCjr59.d.ts → queue-CLJurhdy.d.ts} +258 -83
- package/dist/react/index.d.ts +11 -7
- package/dist/react/index.js +7 -3
- package/dist/react/native/index.d.ts +116 -0
- package/dist/react/native/index.js +130 -0
- package/dist/react/server.d.ts +28 -10
- package/dist/react/server.js +22 -5
- package/dist/react/session.d.ts +2 -2
- package/dist/react-4ZqkP8da.js +79 -0
- package/dist/react-F80mF4-t.js +409 -0
- package/dist/react-router/index.d.ts +83 -0
- package/dist/react-router/index.js +89 -0
- package/dist/react-topic-seAWjL3_.js +38 -0
- package/dist/{read-set-DQFt1N_Y.js → read-set-DuKWC9Mj.js} +67 -25
- package/dist/realtime/index.d.ts +4 -5
- package/dist/realtime/index.js +144 -82
- package/dist/refusal-CeJWxmkH.js +61 -0
- package/dist/refusal-D1rgbzNq.d.ts +15 -0
- package/dist/replicas-CwrYp5Zj.js +94 -0
- package/dist/{view-Bn6HNKUe.js → resolve-D_IcnvFd.js} +248 -240
- package/dist/{impersonation-BmePsuxz.d.ts → resolve-KW8nCeL6.d.ts} +29 -69
- package/dist/{resource-mqfJW4YF.js → resource-BsvzCMlX.js} +4 -4
- package/dist/{resource-DNRFP7KR.d.ts → resource-D6Uc7Sk7.d.ts} +5 -5
- package/dist/respond-BUgsXNgk.js +91 -0
- package/dist/respond-DoBijysA.d.ts +93 -0
- package/dist/result-D7y2fT87.d.ts +282 -0
- package/dist/{result-BKiliPY7.js → result-DzUbqgdW.js} +27 -2
- package/dist/run-state-CPo-1X2B.d.ts +12 -0
- package/dist/run-state-CgBKzYMW.js +13 -0
- package/dist/search-CUWCRYKL.js +9 -0
- package/dist/server/index.d.ts +143 -22
- package/dist/server/index.js +46 -14
- package/dist/{respond-BR1fJWOB.d.ts → server-CeVeeXwz.d.ts} +224 -85
- package/dist/session-ChiXDZdZ.d.ts +72 -0
- package/dist/shared-CBxosKK3.js +75 -0
- package/dist/{shared-D1dRUrAg.js → shared-CxWmcyqB.js} +2 -1
- package/dist/shared-DDSjEGDR.d.ts +11 -0
- package/dist/sign-in-BCV5S2WZ.d.ts +49 -0
- package/dist/sign-in-Cb1mwv6X.js +86 -0
- package/dist/{signers-Cc6r98SW.d.ts → signers-4y62_VIi.d.ts} +13 -9
- package/dist/simplify-DDO0j0LI.js +83 -0
- package/dist/solid/index.d.ts +131 -0
- package/dist/solid/index.js +344 -0
- package/dist/solid-start/index.d.ts +75 -0
- package/dist/solid-start/index.js +58 -0
- package/dist/{spec-pins-C3oc-Tdp.js → spec-pins--j6mTok4.js} +8 -1
- package/dist/{spec-pins-CqorWDnO.d.ts → spec-pins-C89s6DyW.d.ts} +7 -0
- package/dist/sql/index.d.ts +313 -212
- package/dist/sql/index.js +34872 -6579
- package/dist/ssr/index.d.ts +6 -5
- package/dist/ssr/index.js +3 -3
- package/dist/{standard-D7r6dMUu.js → standard-BK0cqJ7y.js} +4 -3
- package/dist/{standard-J4YgMOLm.d.ts → standard-CYsm7xpT.d.ts} +1 -1
- package/dist/stats-D_AD9GGu.js +1123 -0
- package/dist/storage/index.d.ts +5 -5
- package/dist/storage/index.js +1027 -368
- package/dist/store-BdH5ruDx.js +66 -0
- package/dist/store-CGjgWu5n.d.ts +68 -0
- package/dist/streams/index.d.ts +76 -0
- package/dist/streams/index.js +77 -0
- package/dist/streams/redis/index.d.ts +52 -0
- package/dist/streams/redis/index.js +185 -0
- package/dist/stripe-BMj5LtsT.js +38 -0
- package/dist/stripe-D04h-QBT.d.ts +136 -0
- package/dist/{support-wHnK6zp-.js → support-BivNqSpK.js} +32 -11
- package/dist/{support-view-B8SlToQX.d.ts → support-view-33Oi07TT.d.ts} +1 -1
- package/dist/svelte/index.d.ts +114 -0
- package/dist/svelte/index.js +344 -0
- package/dist/sveltekit/index.d.ts +116 -0
- package/dist/sveltekit/index.js +106 -0
- package/dist/tags-B99_U9Pp.js +39 -0
- package/dist/tags-Cx-LnIQP.d.ts +30 -0
- package/dist/tanstack-db/index.d.ts +71 -0
- package/dist/tanstack-db/index.js +72 -0
- package/dist/tanstack-start/index.d.ts +75 -0
- package/dist/tanstack-start/index.js +95 -0
- package/dist/tee-CoEppCER.js +101 -0
- package/dist/{template-TxrGI5jR.js → template--jDkl3UP.js} +34 -13
- package/dist/template-CwO38Do8.d.ts +6 -0
- package/dist/temporal-BJGitm-h.js +79 -0
- package/dist/{temporal-required-CAt4Dc9Z.js → temporal-required-BVvW7SYJ.js} +3 -2
- package/dist/tenant-I1TEZ_BX.js +27 -0
- package/dist/tenant-icPeuUBN.d.ts +17 -0
- package/dist/testing/index.d.ts +315 -41
- package/dist/testing/index.js +1046 -79
- package/dist/timing-CyTQPubY.js +92 -0
- package/dist/ttl-Hr34gRu8.js +12 -0
- package/dist/{types-Dnf_wRDz.d.ts → types-6BdhkmZe.d.ts} +111 -45
- package/dist/types-BI-0Sl2v.d.ts +359 -0
- package/dist/types-C05bxW-W.d.ts +220 -0
- package/dist/types-DGs5L0VN.d.ts +192 -0
- package/dist/types-TaiEeBGA.d.ts +156 -0
- package/dist/usage-CrvrL2vw.d.ts +177 -0
- package/dist/user-change-XzvgafU4.js +130 -0
- package/dist/vault-CSO7ss5C.d.ts +50 -0
- package/dist/vercel-connect/index.d.ts +47 -0
- package/dist/vercel-connect/index.js +119 -0
- package/dist/{verify-Ce49ETPz.js → verify-DL41hbvY.js} +85 -13
- package/dist/verify-DPuWngD4.d.ts +172 -0
- package/dist/{version-DOYTYwHP.js → version-Bvv6aLjZ.js} +1 -1
- package/dist/view-BeFcRV6G.js +99 -0
- package/dist/{view-CbgObAeb.d.ts → view-DbxLNu8L.d.ts} +22 -5
- package/dist/vue/index.d.ts +141 -0
- package/dist/vue/index.js +362 -0
- package/dist/watch-DI34G86j.d.ts +60 -0
- package/dist/watch-Xuxrvxq-.js +122 -0
- package/dist/{wire-D2dT86vi.js → wire-DtZQ4sdE.js} +15 -5
- package/dist/workflow-builder-DJ1oHn8g.js +398 -0
- package/dist/workflow-sdk/builder/index.d.ts +85 -0
- package/dist/workflow-sdk/builder/index.js +250 -0
- package/dist/workflow-sdk/index.d.ts +14 -0
- package/dist/workflow-sdk/index.js +3 -0
- package/dist/workflow-sdk/world/index.d.ts +107 -0
- package/dist/workflow-sdk/world/index.js +702 -0
- package/dist/workflow-sdk-B3yLD6Br.d.ts +98 -0
- package/dist/workflow-sdk-C2WJ_G2O.js +173 -0
- package/dist/workflow-sdk-world-D-prir6O.js +1397 -0
- package/dist/workflows-B0j9WKPu.d.ts +185 -0
- package/dist/workflows-wu1WWBn7.js +216 -0
- package/package.json +461 -20
- package/schemas/ai-message-v1.json +258 -0
- package/schemas/config-v1.json +1074 -140
- package/schemas/doctor-report-v1.json +20 -1
- package/schemas/snapshot-v2.json +8 -0
- package/skills/better-supabase/SKILL.md +41 -12
- package/skills/better-supabase/references/frontend.md +96 -0
- package/skills/better-supabase/references/plugins.md +10 -6
- package/skills/better-supabase/references/troubleshooting.md +2 -1
- package/skills/better-supabase-api/SKILL.md +76 -22
- package/skills/better-supabase-api/references/adapters.md +207 -0
- package/skills/better-supabase-api/references/ai.md +125 -0
- package/skills/better-supabase-api/references/expo.md +65 -0
- package/skills/better-supabase-api/references/powersync.md +35 -0
- package/skills/better-supabase-api/references/streams-credentials.md +105 -0
- package/skills/better-supabase-auth/SKILL.md +47 -11
- package/skills/better-supabase-auth/references/authorization-providers.md +51 -0
- package/skills/better-supabase-testing/SKILL.md +3 -1
- package/dist/cli/config-dtoekM0v.js +0 -2
- package/dist/cli/gen-CIdSQZad.js +0 -2
- package/dist/cli/gen-CjElD1Vw.js +0 -2241
- package/dist/cli/read-sets-VQcPgxU9.js +0 -436
- package/dist/cli/sql-CVx-1O8G.js +0 -373
- package/dist/entitlements-CTEBm7IB.js +0 -20
- package/dist/events-aIO7vsIk.d.ts +0 -230
- package/dist/executor-BunPOO-k.d.ts +0 -402
- package/dist/executor-XycESQPH.js +0 -94
- package/dist/index-CWMDdEr4.d.ts +0 -50
- package/dist/index-DOESKG27.d.ts +0 -100
- package/dist/index-DmXSxbLi.d.ts +0 -62
- package/dist/index-Dp2VDwog.d.ts +0 -161
- package/dist/jobs/index.d.ts +0 -226
- package/dist/jobs/index.js +0 -1007
- package/dist/json-schema-m1fiwKgN.js +0 -208
- package/dist/kit-events-CTFDfSwb.js +0 -60
- package/dist/kit-transport-B82k1djG.d.ts +0 -33
- package/dist/kits-CGLLrNPd.js +0 -157
- package/dist/mfa-Cu96oJdw.d.ts +0 -30
- package/dist/notifications/index.d.ts +0 -162
- package/dist/notifications/index.js +0 -264
- package/dist/orgs/index.d.ts +0 -132
- package/dist/orgs/index.js +0 -245
- package/dist/permdock-sql-C2Inc6Xc.d.ts +0 -29
- package/dist/permdock-sql-DgOfeixi.js +0 -51
- package/dist/plugin-DwARMuQp.js +0 -59
- package/dist/server-B1mZ7CgQ.js +0 -660
- package/dist/stats-Bqob3WqT.js +0 -592
- package/dist/support-CEPwlw2G.d.ts +0 -89
- package/dist/template-mbvlysOo.d.ts +0 -6
- package/dist/temporal-CVlIV2DZ.js +0 -40
- package/dist/user-change-CHFEUro1.js +0 -49
- package/dist/webhooks/index.d.ts +0 -285
- package/skills/better-supabase-auth/references/permdock.md +0 -122
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { n as
|
|
3
|
-
import { n as liveQuery, t as liveCount } from "./live-
|
|
1
|
+
import { r as invalidateTables, t as clearOnUserChange } from "./user-change-XzvgafU4.js";
|
|
2
|
+
import { n as sessionUserId, r as specKey, t as claimedTenant } from "./keys-4MnkWTTh.js";
|
|
3
|
+
import { n as liveQuery, t as liveCount } from "./live-CTAZQkwl.js";
|
|
4
4
|
import { useSession } from "./react/session.js";
|
|
5
|
-
import {
|
|
6
|
-
import { createContext, createElement, useCallback, useContext, useEffect, useMemo, useRef, useState, useSyncExternalStore } from "react";
|
|
5
|
+
import { createContext, createElement, useContext, useEffect, useMemo, useRef, useState, useSyncExternalStore } from "react";
|
|
7
6
|
//#region src/react/hooks.ts
|
|
8
7
|
const ClientContext = createContext(null);
|
|
9
8
|
const LOADING = {
|
|
@@ -66,12 +65,15 @@ function createHooks() {
|
|
|
66
65
|
* resubscribes when the topic or the signed-in user changes.
|
|
67
66
|
*
|
|
68
67
|
* ```ts
|
|
69
|
-
* useBroadcast(customersTopic,
|
|
68
|
+
* useBroadcast(customersTopic, organizationId ? { organizationId } : null, {}, { invalidate: ['customers'] });
|
|
70
69
|
* ```
|
|
71
70
|
*/
|
|
72
71
|
function useBroadcast(topic, values, handlers, options) {
|
|
73
|
-
const
|
|
74
|
-
const
|
|
72
|
+
const context = useContext(ClientContext);
|
|
73
|
+
const supabase = options?.client ?? context?.client.supabase;
|
|
74
|
+
if (!supabase) throw new Error("better-supabase: useBroadcast needs <BetterSupabaseProvider client={bs}> or { client: supabase }");
|
|
75
|
+
const queryClient = options?.queryClient ?? context?.queryClient;
|
|
76
|
+
const auth = useBroadcastAuth(options?.client === void 0 ? context?.client : void 0, supabase);
|
|
75
77
|
const [status, setStatus] = useState("closed");
|
|
76
78
|
const latest = useRef({
|
|
77
79
|
handlers,
|
|
@@ -82,8 +84,9 @@ function useBroadcast(topic, values, handlers, options) {
|
|
|
82
84
|
options
|
|
83
85
|
};
|
|
84
86
|
const name = values ? topic.topic(values) : null;
|
|
85
|
-
const userId = auth.
|
|
86
|
-
|
|
87
|
+
const userId = auth.userId;
|
|
88
|
+
const self = options?.self;
|
|
89
|
+
if (options?.invalidate && !queryClient) throw new Error("better-supabase: useBroadcast({ invalidate }) needs <BetterSupabaseProvider queryClient={...}> or { queryClient }");
|
|
87
90
|
useEffect(() => {
|
|
88
91
|
if (!name || auth.status === "loading") return;
|
|
89
92
|
const matched = topic.match(name);
|
|
@@ -100,8 +103,8 @@ function useBroadcast(topic, values, handlers, options) {
|
|
|
100
103
|
}
|
|
101
104
|
for (const queryKey of invalidate(message)) queryClient.invalidateQueries({ queryKey });
|
|
102
105
|
};
|
|
103
|
-
const subscription = topic.subscribe(
|
|
104
|
-
...
|
|
106
|
+
const subscription = topic.subscribe(supabase, matched, { "*": forward }, {
|
|
107
|
+
...self === void 0 ? {} : { self },
|
|
105
108
|
onStatus: setStatus,
|
|
106
109
|
onInvalid: (message, issues) => latest.current.options?.onInvalid?.(message, issues)
|
|
107
110
|
});
|
|
@@ -110,21 +113,61 @@ function useBroadcast(topic, values, handlers, options) {
|
|
|
110
113
|
setStatus("closed");
|
|
111
114
|
};
|
|
112
115
|
}, [
|
|
113
|
-
|
|
116
|
+
supabase,
|
|
114
117
|
topic,
|
|
115
118
|
name,
|
|
116
119
|
userId,
|
|
117
120
|
auth.status,
|
|
118
|
-
queryClient
|
|
121
|
+
queryClient,
|
|
122
|
+
self
|
|
119
123
|
]);
|
|
120
124
|
return status;
|
|
121
125
|
}
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
126
|
+
const NO_AUTH = () => () => void 0;
|
|
127
|
+
/**
|
|
128
|
+
* The user `useBroadcast` subscribes as: the provider's auth snapshot, or
|
|
129
|
+
* for a plain supabase-js client, its auth state.
|
|
130
|
+
*/
|
|
131
|
+
function useBroadcastAuth(client, supabase) {
|
|
132
|
+
const snapshot = useSyncExternalStore(client?.auth.subscribe ?? NO_AUTH, client?.auth.current ?? (() => LOADING), () => LOADING);
|
|
133
|
+
const [plain, setPlain] = useState({
|
|
134
|
+
status: "loading",
|
|
135
|
+
userId: null
|
|
136
|
+
});
|
|
137
|
+
useEffect(() => {
|
|
138
|
+
if (client) return;
|
|
139
|
+
const { data } = supabase.auth.onAuthStateChange((_event, session) => {
|
|
140
|
+
setPlain({
|
|
141
|
+
status: session ? "signed-in" : "signed-out",
|
|
142
|
+
userId: session ? sessionUserId(session) : null
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
return () => {
|
|
146
|
+
data.subscription.unsubscribe();
|
|
147
|
+
};
|
|
148
|
+
}, [client, supabase]);
|
|
149
|
+
return client ? {
|
|
150
|
+
status: snapshot.status,
|
|
151
|
+
userId: snapshot.user?.id ?? null
|
|
152
|
+
} : plain;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* The spec from the render whose key last changed, so effects keep the
|
|
156
|
+
* original values (`bigint`, Temporal) and only rerun on a different query.
|
|
157
|
+
*/
|
|
158
|
+
function useHeldSpec(spec) {
|
|
159
|
+
const key = spec ? specKey(spec) : null;
|
|
160
|
+
const [held, setHeld] = useState({
|
|
161
|
+
key,
|
|
162
|
+
spec: spec ?? null
|
|
163
|
+
});
|
|
164
|
+
if (held.key === key) return held;
|
|
165
|
+
const next = {
|
|
166
|
+
key,
|
|
167
|
+
spec: spec ?? null
|
|
168
|
+
};
|
|
169
|
+
setHeld(next);
|
|
170
|
+
return next;
|
|
128
171
|
}
|
|
129
172
|
/**
|
|
130
173
|
* Keeps a query fresh: invalidates every cached query that read a table the
|
|
@@ -142,25 +185,30 @@ function useLiveQuery(spec, options = {}) {
|
|
|
142
185
|
const auth = useAuth();
|
|
143
186
|
const [status, setStatus] = useState("closed");
|
|
144
187
|
if (spec && !queryClient) throw new Error("better-supabase: useLiveQuery needs <BetterSupabaseProvider queryClient={...}>");
|
|
145
|
-
const
|
|
188
|
+
const held = useHeldSpec(spec);
|
|
189
|
+
const joined = useRef(null);
|
|
146
190
|
const tenant = options.tenant ?? claimedTenant(auth, client.betterSupabase.meta);
|
|
147
191
|
const userId = auth.user?.id ?? null;
|
|
148
192
|
const debounceMs = options.debounceMs;
|
|
149
193
|
useEffect(() => {
|
|
150
|
-
if (!
|
|
151
|
-
const
|
|
194
|
+
if (!held.spec || !queryClient || auth.status === "loading") return;
|
|
195
|
+
const resumed = joined.current === held.key;
|
|
196
|
+
joined.current = held.key;
|
|
197
|
+
const live = liveQuery(client.betterSupabase, client.supabase, held.spec, {
|
|
152
198
|
onChange: (tables) => void invalidateTables(queryClient, tables),
|
|
153
199
|
onStatus: setStatus,
|
|
154
200
|
...tenant === void 0 ? {} : { tenant },
|
|
201
|
+
...userId === null ? {} : { user: userId },
|
|
155
202
|
...debounceMs === void 0 ? {} : { debounceMs }
|
|
156
203
|
});
|
|
204
|
+
if (resumed) live.ready.then(() => void invalidateTables(queryClient, live.tables), () => void 0);
|
|
157
205
|
return () => {
|
|
158
206
|
live.unsubscribe();
|
|
159
207
|
};
|
|
160
208
|
}, [
|
|
161
209
|
client,
|
|
162
210
|
queryClient,
|
|
163
|
-
|
|
211
|
+
held,
|
|
164
212
|
tenant,
|
|
165
213
|
userId,
|
|
166
214
|
auth.status,
|
|
@@ -187,34 +235,53 @@ function useLiveCount(source, options = {}) {
|
|
|
187
235
|
const [state, setState] = useState({
|
|
188
236
|
key: null,
|
|
189
237
|
count: void 0,
|
|
238
|
+
at: 0,
|
|
190
239
|
error: void 0
|
|
191
240
|
});
|
|
192
241
|
const [status, setStatus] = useState("closed");
|
|
193
|
-
const
|
|
242
|
+
const held = useHeldSpec(spec);
|
|
243
|
+
const joined = useRef(null);
|
|
194
244
|
const tenant = options.tenant ?? claimedTenant(auth, client.betterSupabase.meta);
|
|
195
245
|
const userId = auth.user?.id ?? null;
|
|
196
246
|
const debounceMs = options.debounceMs;
|
|
197
247
|
const hasInitial = initial !== void 0;
|
|
248
|
+
const seedAt = seed?.at;
|
|
198
249
|
useEffect(() => {
|
|
199
|
-
if (!
|
|
200
|
-
const
|
|
201
|
-
|
|
250
|
+
if (!held.spec || auth.status === "loading") return;
|
|
251
|
+
const key = held.key;
|
|
252
|
+
const previous = joined.current?.key === key ? joined.current : null;
|
|
253
|
+
joined.current = {
|
|
254
|
+
key,
|
|
255
|
+
at: previous?.at ?? seedAt ?? 0
|
|
256
|
+
};
|
|
257
|
+
const since = previous ? previous.at : seedAt;
|
|
258
|
+
const live = liveCount(client.betterSupabase, client.supabase, client.db, held.spec, {
|
|
259
|
+
immediate: !hasInitial && !previous,
|
|
260
|
+
...since === void 0 ? {} : { since },
|
|
202
261
|
onCount: (count) => {
|
|
262
|
+
const at = Date.now();
|
|
263
|
+
if (joined.current?.key === key) joined.current = {
|
|
264
|
+
key,
|
|
265
|
+
at
|
|
266
|
+
};
|
|
203
267
|
setState({
|
|
204
268
|
key,
|
|
205
269
|
count,
|
|
270
|
+
at,
|
|
206
271
|
error: void 0
|
|
207
272
|
});
|
|
208
273
|
},
|
|
209
274
|
onError: (error) => {
|
|
210
|
-
setState((
|
|
275
|
+
setState((last) => ({
|
|
211
276
|
key,
|
|
212
|
-
count:
|
|
277
|
+
count: last.key === key ? last.count : void 0,
|
|
278
|
+
at: last.key === key ? last.at : 0,
|
|
213
279
|
error
|
|
214
280
|
}));
|
|
215
281
|
},
|
|
216
282
|
onStatus: setStatus,
|
|
217
283
|
...tenant === void 0 ? {} : { tenant },
|
|
284
|
+
...userId === null ? {} : { user: userId },
|
|
218
285
|
...debounceMs === void 0 ? {} : { debounceMs }
|
|
219
286
|
});
|
|
220
287
|
return () => {
|
|
@@ -222,117 +289,21 @@ function useLiveCount(source, options = {}) {
|
|
|
222
289
|
};
|
|
223
290
|
}, [
|
|
224
291
|
client,
|
|
225
|
-
|
|
292
|
+
held,
|
|
226
293
|
tenant,
|
|
227
294
|
userId,
|
|
228
295
|
auth.status,
|
|
229
296
|
debounceMs,
|
|
230
|
-
hasInitial
|
|
297
|
+
hasInitial,
|
|
298
|
+
seedAt
|
|
231
299
|
]);
|
|
232
|
-
const fresh = state.key === key;
|
|
300
|
+
const fresh = state.key === held.key;
|
|
301
|
+
const seedNewer = seedAt !== void 0 && seed?.count !== null && seedAt > state.at;
|
|
233
302
|
return {
|
|
234
|
-
count: fresh && state.count !== void 0 ? state.count : initial,
|
|
303
|
+
count: fresh && state.count !== void 0 && !seedNewer ? state.count : initial,
|
|
235
304
|
status,
|
|
236
305
|
error: fresh ? state.error : void 0
|
|
237
306
|
};
|
|
238
307
|
}
|
|
239
308
|
//#endregion
|
|
240
|
-
|
|
241
|
-
const unread = (items) => items.filter((item) => typeof item === "object" && item !== null && "readAt" in item && item.readAt === null).length;
|
|
242
|
-
/** Joins a private topic and returns the function that leaves it. */
|
|
243
|
-
function watchTopic(supabase, topic, watch) {
|
|
244
|
-
let closed = false;
|
|
245
|
-
let joined = false;
|
|
246
|
-
const channel = supabase.channel(topic, { config: { private: true } });
|
|
247
|
-
channel.on("broadcast", { event: "*" }, (message) => {
|
|
248
|
-
watch.onMessage(message.event, message["payload"]);
|
|
249
|
-
});
|
|
250
|
-
(async () => {
|
|
251
|
-
watch.onStatus("joining");
|
|
252
|
-
await supabase.realtime.setAuth();
|
|
253
|
-
if (closed) return;
|
|
254
|
-
channel.subscribe((state) => {
|
|
255
|
-
switch (state) {
|
|
256
|
-
case REALTIME_SUBSCRIBE_STATES.SUBSCRIBED:
|
|
257
|
-
if (joined) watch.onRejoin();
|
|
258
|
-
joined = true;
|
|
259
|
-
watch.onStatus("subscribed");
|
|
260
|
-
return;
|
|
261
|
-
case REALTIME_SUBSCRIBE_STATES.CLOSED:
|
|
262
|
-
watch.onStatus("closed");
|
|
263
|
-
return;
|
|
264
|
-
case REALTIME_SUBSCRIBE_STATES.CHANNEL_ERROR:
|
|
265
|
-
case REALTIME_SUBSCRIBE_STATES.TIMED_OUT:
|
|
266
|
-
watch.onStatus("error");
|
|
267
|
-
return;
|
|
268
|
-
default: throw new Error(`Unknown realtime status ${String(state)}`);
|
|
269
|
-
}
|
|
270
|
-
});
|
|
271
|
-
})();
|
|
272
|
-
return () => {
|
|
273
|
-
closed = true;
|
|
274
|
-
supabase.removeChannel(channel);
|
|
275
|
-
watch.onStatus("closed");
|
|
276
|
-
};
|
|
277
|
-
}
|
|
278
|
-
/**
|
|
279
|
-
* The signed-in user's notifications, kept current: loads them, then loads
|
|
280
|
-
* again after each broadcast on `topic` and after the channel rejoins.
|
|
281
|
-
*
|
|
282
|
-
* ```tsx
|
|
283
|
-
* const { items, count } = useNotifications({
|
|
284
|
-
* topic: `org:${orgId}:notifications:${userId}`,
|
|
285
|
-
* load: () => listNotifications(orgId),
|
|
286
|
-
* });
|
|
287
|
-
* ```
|
|
288
|
-
*/
|
|
289
|
-
function useNotifications(options) {
|
|
290
|
-
const supabase = useSupabase();
|
|
291
|
-
const auth = useAuth();
|
|
292
|
-
const [items, setItems] = useState(void 0);
|
|
293
|
-
const [error, setError] = useState(void 0);
|
|
294
|
-
const [status, setStatus] = useState("closed");
|
|
295
|
-
const latest = useRef(options);
|
|
296
|
-
latest.current = options;
|
|
297
|
-
const userId = auth.user?.id ?? null;
|
|
298
|
-
const refresh = useCallback(async () => {
|
|
299
|
-
const current = latest.current;
|
|
300
|
-
try {
|
|
301
|
-
const merged = (await Promise.all([current.load, ...current.sources ?? []].map((source) => source()))).flat();
|
|
302
|
-
setItems(current.sort ? [...merged].sort(current.sort) : merged);
|
|
303
|
-
setError(void 0);
|
|
304
|
-
} catch (cause) {
|
|
305
|
-
setError(cause);
|
|
306
|
-
}
|
|
307
|
-
}, []);
|
|
308
|
-
const topic = options.topic;
|
|
309
|
-
useEffect(() => {
|
|
310
|
-
if (auth.status !== "signed-in") return;
|
|
311
|
-
refresh();
|
|
312
|
-
if (!topic) return;
|
|
313
|
-
return watchTopic(supabase, topic, {
|
|
314
|
-
onMessage: (event, payload) => {
|
|
315
|
-
latest.current.onMessage?.(event, payload);
|
|
316
|
-
refresh();
|
|
317
|
-
},
|
|
318
|
-
onRejoin: () => void refresh(),
|
|
319
|
-
onStatus: setStatus
|
|
320
|
-
});
|
|
321
|
-
}, [
|
|
322
|
-
supabase,
|
|
323
|
-
topic,
|
|
324
|
-
userId,
|
|
325
|
-
auth.status,
|
|
326
|
-
refresh
|
|
327
|
-
]);
|
|
328
|
-
const list = items ?? [];
|
|
329
|
-
return {
|
|
330
|
-
items,
|
|
331
|
-
count: (options.count ?? unread)(list),
|
|
332
|
-
status,
|
|
333
|
-
error,
|
|
334
|
-
refresh
|
|
335
|
-
};
|
|
336
|
-
}
|
|
337
|
-
//#endregion
|
|
338
|
-
export { useBroadcast as a, useSupabase as c, useAuth as i, BetterSupabaseProvider as n, useLiveCount as o, createHooks as r, useLiveQuery as s, useNotifications as t };
|
|
309
|
+
export { useBroadcast as a, useLiveQuery as c, useAuth as i, useSupabase as l, ClientContext as n, useBroadcastAuth as o, createHooks as r, useLiveCount as s, BetterSupabaseProvider as t };
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { i as toWebHeaders, r as nodeRequestUrl, t as applyWebHeaders } from "./node-headers-C71zNQHe.js";
|
|
2
|
+
import { Readable } from "node:stream";
|
|
3
|
+
import { pipeline } from "node:stream/promises";
|
|
4
|
+
//#region src/node/http.ts
|
|
5
|
+
/**
|
|
6
|
+
* A Node `IncomingMessage` as a Web `Request`. Express, Fastify and Koa
|
|
7
|
+
* pass theirs (`req`, `request.raw`, `ctx.req`). With `body: false` the
|
|
8
|
+
* stream stays unread, for middleware that runs before a body parser.
|
|
9
|
+
*/
|
|
10
|
+
function toWebRequest(req, options = {}) {
|
|
11
|
+
const method = req.method ?? "GET";
|
|
12
|
+
const hasBody = (options.body ?? true) && method !== "GET" && method !== "HEAD";
|
|
13
|
+
const controller = new AbortController();
|
|
14
|
+
req.once("close", () => {
|
|
15
|
+
if (!req.complete) controller.abort();
|
|
16
|
+
});
|
|
17
|
+
return new Request(nodeRequestUrl(req, options.trustProxy ?? false), {
|
|
18
|
+
method,
|
|
19
|
+
headers: toWebHeaders(req.headers),
|
|
20
|
+
signal: controller.signal,
|
|
21
|
+
...hasBody ? {
|
|
22
|
+
body: Readable.toWeb(req),
|
|
23
|
+
duplex: "half"
|
|
24
|
+
} : {}
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
/** Writes a Web `Response` to a Node `ServerResponse`, streaming the body. */
|
|
28
|
+
async function sendWebResponse(res, response) {
|
|
29
|
+
res.statusCode = response.status;
|
|
30
|
+
if (response.statusText) res.statusMessage = response.statusText;
|
|
31
|
+
applyWebHeaders(res, response.headers);
|
|
32
|
+
if (!response.body) {
|
|
33
|
+
res.end();
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const body = response.body;
|
|
37
|
+
await pipeline(Readable.fromWeb(body), res);
|
|
38
|
+
}
|
|
39
|
+
//#endregion
|
|
40
|
+
export { toWebRequest as n, sendWebResponse as t };
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { getEnv } from "@supabase/middleware";
|
|
2
|
+
import { fromSupabaseUrl } from "@supabase/server/oauth-protected-resource";
|
|
3
|
+
//#region src/mcp/http.ts
|
|
4
|
+
/** The RFC 9728 well-known prefix. The Supabase Edge Functions gateway never routes it to a function. */
|
|
5
|
+
const WELL_KNOWN = "/.well-known/oauth-protected-resource";
|
|
6
|
+
/** The path suffix `withOAuthProtectedResource` serves, reachable through `/functions/v1/<slug>`. */
|
|
7
|
+
const SUFFIX = "/oauth-protected-resource";
|
|
8
|
+
/** The prefix the Edge Functions gateway strips before the function sees the request. */
|
|
9
|
+
const EDGE_PREFIX = "/functions/v1";
|
|
10
|
+
const ALLOW_HEADERS = "Authorization, Content-Type, Accept, Mcp-Protocol-Version, Mcp-Session-Id, Mcp-Method, Mcp-Name";
|
|
11
|
+
const trim = (value) => value.replace(/\/+$/, "");
|
|
12
|
+
/**
|
|
13
|
+
* Whether the request runs on Supabase Edge Functions, detected as
|
|
14
|
+
* `@supabase/server` 1.9 does, minus its plain-Deno fallback so a Deno Deploy
|
|
15
|
+
* server keeps its own URLs.
|
|
16
|
+
*/
|
|
17
|
+
function onEdgeFunctions() {
|
|
18
|
+
return ["SUPABASE_FUNCTION_SLUG", "SB_EXECUTION_ID"].some((key) => Boolean(getEnv(key)));
|
|
19
|
+
}
|
|
20
|
+
/** The public origin: `SUPABASE_PUBLIC_URL`, else the gateway's `X-Forwarded-*` headers. */
|
|
21
|
+
function edgeOrigin(request) {
|
|
22
|
+
const publicUrl = getEnv("SUPABASE_PUBLIC_URL");
|
|
23
|
+
if (publicUrl) return trim(publicUrl);
|
|
24
|
+
const url = new URL(request.url);
|
|
25
|
+
const host = request.headers.get("x-forwarded-host") ?? url.hostname;
|
|
26
|
+
const proto = (request.headers.get("x-forwarded-proto") ?? url.protocol.slice(0, -1)).toLowerCase();
|
|
27
|
+
const port = host.includes(":") ? "" : request.headers.get("x-forwarded-port") ?? url.port;
|
|
28
|
+
return `${proto}://${host}${port && !(proto === "https" && port === "443" || proto === "http" && port === "80") ? `:${port}` : ""}`;
|
|
29
|
+
}
|
|
30
|
+
function stripMetadata(pathname) {
|
|
31
|
+
if (pathname.startsWith(WELL_KNOWN)) return pathname.slice(37);
|
|
32
|
+
if (pathname.endsWith(SUFFIX)) return pathname.slice(0, -25);
|
|
33
|
+
return pathname;
|
|
34
|
+
}
|
|
35
|
+
function edgePath(request) {
|
|
36
|
+
const slug = getEnv("SUPABASE_FUNCTION_SLUG");
|
|
37
|
+
if (slug) return `${EDGE_PREFIX}/${slug}`;
|
|
38
|
+
return trim(`${EDGE_PREFIX}${stripMetadata(new URL(request.url).pathname)}`);
|
|
39
|
+
}
|
|
40
|
+
/** A request for the RFC 9728 metadata, at the well-known prefix or the `{resource}/oauth-protected-resource` suffix. */
|
|
41
|
+
function isMetadataRequest(request) {
|
|
42
|
+
const { pathname } = new URL(request.url);
|
|
43
|
+
if (pathname === WELL_KNOWN || pathname.startsWith(`${WELL_KNOWN}/`)) return true;
|
|
44
|
+
return pathname.endsWith(SUFFIX) && request.method !== "POST";
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* The public URLs of an MCP endpoint. On Supabase Edge Functions they come
|
|
48
|
+
* from the gateway (the request URL is internal there, without
|
|
49
|
+
* `/functions/v1`), and the metadata is advertised at the suffix route.
|
|
50
|
+
*/
|
|
51
|
+
function discovery(options, supabaseUrl) {
|
|
52
|
+
const resource = (request) => {
|
|
53
|
+
if (typeof options.resource === "function") return options.resource(request);
|
|
54
|
+
if (options.resource) return options.resource;
|
|
55
|
+
if (onEdgeFunctions()) return `${edgeOrigin(request)}${edgePath(request)}`;
|
|
56
|
+
const url = new URL(request.url);
|
|
57
|
+
return trim(`${url.origin}${stripMetadata(url.pathname)}`);
|
|
58
|
+
};
|
|
59
|
+
return {
|
|
60
|
+
resource,
|
|
61
|
+
metadataUrl: (request) => {
|
|
62
|
+
const target = new URL(resource(request));
|
|
63
|
+
const path = trim(target.pathname);
|
|
64
|
+
return onEdgeFunctions() ? `${target.origin}${path}${SUFFIX}` : `${target.origin}${WELL_KNOWN}${path}`;
|
|
65
|
+
},
|
|
66
|
+
authorizationServers: (request) => {
|
|
67
|
+
if (options.authorizationServers) return options.authorizationServers;
|
|
68
|
+
return onEdgeFunctions() ? [`${edgeOrigin(request)}/auth/v1`] : [fromSupabaseUrl(supabaseUrl())];
|
|
69
|
+
},
|
|
70
|
+
host: (request) => {
|
|
71
|
+
return (onEdgeFunctions() ? request.headers.get("x-forwarded-host") : null) ?? request.headers.get("host");
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/** The `OPTIONS` answer for the metadata route. */
|
|
76
|
+
function metadataPreflight() {
|
|
77
|
+
return new Response(null, {
|
|
78
|
+
status: 204,
|
|
79
|
+
headers: {
|
|
80
|
+
"access-control-allow-origin": "*",
|
|
81
|
+
"access-control-allow-methods": "GET, OPTIONS",
|
|
82
|
+
"access-control-allow-headers": "Content-Type, Mcp-Protocol-Version"
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
/** The `OPTIONS` answer for the MCP endpoint. */
|
|
87
|
+
function endpointPreflight(request, allowedOrigins) {
|
|
88
|
+
return withCors(new Response(null, {
|
|
89
|
+
status: 204,
|
|
90
|
+
headers: {
|
|
91
|
+
"access-control-allow-methods": "POST, OPTIONS",
|
|
92
|
+
"access-control-allow-headers": ALLOW_HEADERS,
|
|
93
|
+
"access-control-max-age": "86400"
|
|
94
|
+
}
|
|
95
|
+
}), request, allowedOrigins);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Adds CORS headers to an endpoint response, keeping any the handler set.
|
|
99
|
+
* With `allowedOrigins` a listed origin is echoed; otherwise any origin may
|
|
100
|
+
* call, which is safe because the token travels in a header, not a cookie.
|
|
101
|
+
*/
|
|
102
|
+
function withCors(response, request, allowedOrigins) {
|
|
103
|
+
const origin = request.headers.get("origin");
|
|
104
|
+
const allow = allowedOrigins ? origin && allowedOrigins.includes(origin) ? origin : null : "*";
|
|
105
|
+
const apply = (headers) => {
|
|
106
|
+
if (allow && !headers.has("access-control-allow-origin")) {
|
|
107
|
+
headers.set("access-control-allow-origin", allow);
|
|
108
|
+
if (allow !== "*") headers.append("vary", "Origin");
|
|
109
|
+
}
|
|
110
|
+
if (!headers.has("access-control-expose-headers")) headers.set("access-control-expose-headers", "WWW-Authenticate");
|
|
111
|
+
};
|
|
112
|
+
try {
|
|
113
|
+
apply(response.headers);
|
|
114
|
+
return response;
|
|
115
|
+
} catch {
|
|
116
|
+
const headers = new Headers(response.headers);
|
|
117
|
+
apply(headers);
|
|
118
|
+
return new Response(response.body, {
|
|
119
|
+
status: response.status,
|
|
120
|
+
statusText: response.statusText,
|
|
121
|
+
headers
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
//#endregion
|
|
126
|
+
export { withCors as a, metadataPreflight as i, endpointPreflight as n, isMetadataRequest as r, discovery as t };
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
//#region src/storage/image-url.ts
|
|
2
|
+
/** Storage's image transformation limits. */
|
|
3
|
+
const MAX_SIDE = 2500;
|
|
4
|
+
const QUALITY = {
|
|
5
|
+
min: 20,
|
|
6
|
+
max: 100
|
|
7
|
+
};
|
|
8
|
+
const clamp = (value, min, max) => Math.min(max, Math.max(min, Math.round(value)));
|
|
9
|
+
/**
|
|
10
|
+
* Turns public Storage object URLs into Supabase image transformation URLs
|
|
11
|
+
* (`/render/image/public`) at a given size. Any other URL (local files,
|
|
12
|
+
* other hosts, signed URLs) comes back as `undefined`: a signed URL's token
|
|
13
|
+
* covers the transform it was signed with, so sign it with `renderUrl()`.
|
|
14
|
+
*
|
|
15
|
+
* ```ts
|
|
16
|
+
* const imageUrl = storageImageUrl({ url: SUPABASE_URL })
|
|
17
|
+
* imageUrl(avatar, { width: 96 }) ?? avatar
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
function storageImageUrl(options) {
|
|
21
|
+
const storage = `${options.url.replace(/\/+$/, "")}/storage/v1`;
|
|
22
|
+
const publicPrefixes = [`${storage}/object/public/`, `${storage}/render/image/public/`].map((prefix) => ({
|
|
23
|
+
prefix,
|
|
24
|
+
length: new URL(prefix).pathname.length
|
|
25
|
+
}));
|
|
26
|
+
return (src, size) => {
|
|
27
|
+
const prefix = publicPrefixes.find((candidate) => src.startsWith(candidate.prefix));
|
|
28
|
+
if (prefix === void 0) return;
|
|
29
|
+
const source = new URL(src);
|
|
30
|
+
const object = source.pathname.slice(prefix.length);
|
|
31
|
+
const target = new URL(`${storage}/render/image/public/${object}`);
|
|
32
|
+
for (const [key, value] of source.searchParams) target.searchParams.set(key, value);
|
|
33
|
+
target.searchParams.set("width", String(clamp(size.width, 1, MAX_SIDE)));
|
|
34
|
+
if (size.height !== void 0) target.searchParams.set("height", String(clamp(size.height, 1, MAX_SIDE)));
|
|
35
|
+
if (size.quality !== void 0) target.searchParams.set("quality", String(clamp(size.quality, QUALITY.min, QUALITY.max)));
|
|
36
|
+
if (options.resize) target.searchParams.set("resize", options.resize);
|
|
37
|
+
return target.toString();
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
//#endregion
|
|
41
|
+
export { storageImageUrl as t };
|
|
@@ -15,7 +15,7 @@ function actorAt(outer, id) {
|
|
|
15
15
|
const sessionId = outer["session_id"];
|
|
16
16
|
const readOnly = outer["read_only"];
|
|
17
17
|
const reason = outer["reason"];
|
|
18
|
-
if (kind === "support"
|
|
18
|
+
if (kind === "support") {
|
|
19
19
|
if (typeof sessionId !== "string" || sessionId === "") return INVALID;
|
|
20
20
|
if (readOnly !== void 0 && typeof readOnly !== "boolean") return INVALID;
|
|
21
21
|
return {
|
|
@@ -37,7 +37,7 @@ function actorAt(outer, id) {
|
|
|
37
37
|
...typeof reason === "string" ? { reason } : {}
|
|
38
38
|
}
|
|
39
39
|
};
|
|
40
|
-
if (kind !== void 0) return INVALID;
|
|
40
|
+
if (kind !== void 0 || sessionId !== void 0) return INVALID;
|
|
41
41
|
return {
|
|
42
42
|
ok: true,
|
|
43
43
|
actor: {
|
|
@@ -48,10 +48,10 @@ function actorAt(outer, id) {
|
|
|
48
48
|
};
|
|
49
49
|
}
|
|
50
50
|
/**
|
|
51
|
-
* Reads only `act` and `client_id
|
|
51
|
+
* Reads only `act` and `client_id`. An
|
|
52
52
|
* `act` that is not a chain of objects each with a non-empty `sub`, a
|
|
53
|
-
* `kind` other than `support` or `impersonation`,
|
|
54
|
-
* a `session_id` is `{ ok: false }`: the session must not pass as the user
|
|
53
|
+
* `kind` other than `support` or `impersonation`, a support level without
|
|
54
|
+
* a `session_id`, or a `session_id` without `kind` is `{ ok: false }`: the session must not pass as the user
|
|
55
55
|
* alone.
|
|
56
56
|
*/
|
|
57
57
|
function actorOf(claims) {
|
|
@@ -95,6 +95,21 @@ function actClaim(options) {
|
|
|
95
95
|
reason: options.reason
|
|
96
96
|
};
|
|
97
97
|
}
|
|
98
|
+
/** The `act` claim that `impersonatorOf` reads back as `impersonator`. */
|
|
99
|
+
function impersonatorClaim(impersonator) {
|
|
100
|
+
const reason = impersonator.reason === void 0 ? {} : { reason: impersonator.reason };
|
|
101
|
+
return impersonator.kind === "support" ? {
|
|
102
|
+
kind: "support",
|
|
103
|
+
sub: impersonator.id,
|
|
104
|
+
session_id: impersonator.sessionId,
|
|
105
|
+
read_only: impersonator.readOnly ?? true,
|
|
106
|
+
...reason
|
|
107
|
+
} : {
|
|
108
|
+
kind: "impersonation",
|
|
109
|
+
sub: impersonator.id,
|
|
110
|
+
...reason
|
|
111
|
+
};
|
|
112
|
+
}
|
|
98
113
|
/**
|
|
99
114
|
* The admin in `claims.act`: a support session or an impersonated session
|
|
100
115
|
* (`actorOf` reads the same level, so the two always agree). `undefined`
|
|
@@ -130,4 +145,4 @@ function userContext(user, claims) {
|
|
|
130
145
|
};
|
|
131
146
|
}
|
|
132
147
|
//#endregion
|
|
133
|
-
export {
|
|
148
|
+
export { actorOf as a, userContext as i, impersonatorClaim as n, delegationOf as o, impersonatorOf as r, actClaim as t };
|