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.
- package/README.md +299 -41
- package/dist/access-sql-B0dF-SoF.js +181 -0
- package/dist/actor-CQTlc1Hh.d.ts +43 -0
- 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-L7Z8mYTx.js → doctor-B4JOm_ox.js} +992 -316
- 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-Saf5-R9T.js → init-BIIwclPg.js} +242 -27
- package/dist/cli/{introspect--H7oGmcd.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-BKR2W_79.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-BDJuO0UR.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-T_ejwyd3.d.ts → config-D44Y7PAv.d.ts} +406 -205
- 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-BTrQ_ZTp.d.ts → ended-jLfvw8h-.d.ts} +20 -2
- package/dist/{entitlements-DUxU4oHe.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-DcqaTBHx.js +148 -0
- 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-CusDgPaD.d.ts → mfa-Daak8ukG.d.ts} +8 -2
- 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-Bq64ki8-.js → resolve-D_IcnvFd.js} +239 -289
- package/dist/{resolve-C15TJq77.d.ts → resolve-KW8nCeL6.d.ts} +29 -45
- package/dist/{resource-CRxxwkQq.js → resource-BsvzCMlX.js} +4 -4
- package/dist/{resource-D8iqWMr-.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 -21
- package/dist/server/index.js +46 -14
- package/dist/{respond-D2OQl62-.d.ts → server-CeVeeXwz.d.ts} +225 -80
- 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 +330 -194
- package/dist/sql/index.js +34901 -6489
- 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-Dk6vdmEw.js → support-BivNqSpK.js} +35 -12
- package/dist/{support-view-Da5peKFg.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 +343 -37
- package/dist/testing/index.js +1186 -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-DM_Roffb.js → version-Bvv6aLjZ.js} +1 -1
- package/dist/view-BeFcRV6G.js +99 -0
- package/dist/{view-BEf0diC5.d.ts → view-DbxLNu8L.d.ts} +35 -32
- 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 +470 -29
- package/schemas/ai-message-v1.json +258 -0
- package/schemas/config-v1.json +1074 -140
- package/schemas/doctor-report-v1.json +21 -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 +62 -18
- 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-BJc9vdyu.js +0 -2
- package/dist/cli/gen-C2osRcr5.js +0 -2204
- package/dist/cli/read-sets-BfMQcKy8.js +0 -289
- package/dist/cli/sql-DzPbfngx.js +0 -348
- 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/impersonation-VfaGc4Q_.js +0 -41
- package/dist/index-BGdgBPdf.d.ts +0 -161
- package/dist/index-DOESKG27.d.ts +0 -100
- package/dist/index-DmXSxbLi.d.ts +0 -62
- package/dist/index-Dxn2a5cw.d.ts +0 -50
- 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/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-Csx2sRjg.js +0 -655
- package/dist/stats-Bqob3WqT.js +0 -592
- package/dist/support-DT-OhSxD.d.ts +0 -88
- 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 -100
|
@@ -1,66 +1,182 @@
|
|
|
1
|
-
import { n as dbError } from "./errors-
|
|
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 {
|
|
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/
|
|
8
|
-
|
|
9
|
-
|
|
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
|
|
12
|
-
|
|
13
|
-
|
|
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
|
|
17
|
-
* `
|
|
18
|
-
*
|
|
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
|
|
21
|
-
const
|
|
22
|
-
if (
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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
|
-
|
|
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
|
-
/**
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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
|
|
260
|
+
const clock = options.now ?? Date.now;
|
|
261
|
+
const now = clock();
|
|
143
262
|
prune(now);
|
|
144
|
-
const
|
|
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(
|
|
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(
|
|
151
|
-
recent.set(
|
|
270
|
+
recent.delete(key);
|
|
271
|
+
recent.set(key, {
|
|
152
272
|
outcome,
|
|
153
|
-
until:
|
|
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(
|
|
282
|
+
inflight.delete(key);
|
|
159
283
|
});
|
|
160
|
-
inflight.set(
|
|
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
|
-
|
|
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
|
-
|
|
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")
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
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
|
-
|
|
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 };
|