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,9 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { n as dbError } from "./errors-B11Duf73.js";
|
|
2
|
+
import { i as tableMeta, t as builderFor } from "./build-BXIzE6Xv.js";
|
|
2
3
|
import { n as touchedTables } from "./tables-Cb-3_VWc.js";
|
|
3
4
|
//#region src/core/spec.ts
|
|
4
5
|
const READ_METHODS = [
|
|
5
6
|
"findMany",
|
|
6
7
|
"findFirst",
|
|
8
|
+
"findOnly",
|
|
7
9
|
"findUnique",
|
|
8
10
|
"findById",
|
|
9
11
|
"count",
|
|
@@ -121,13 +123,29 @@ const PARAM = /^[a-z_][a-z0-9_]*$/i;
|
|
|
121
123
|
const TYPE = /^(?:[a-z_][a-z0-9_]*\.)?[a-z_][a-z0-9_]*(?:\[\])?$/;
|
|
122
124
|
/** `jsonb_build_object` takes at most 100 arguments. */
|
|
123
125
|
const MAX_ENTRIES = 50;
|
|
124
|
-
/**
|
|
126
|
+
/**
|
|
127
|
+
* Placeholders are `NUL bs:<name> NUL`: no real parameter value holds a NUL.
|
|
128
|
+
* Auth placeholders start with `@`, which no parameter name can.
|
|
129
|
+
*/
|
|
125
130
|
const NUL = "\0";
|
|
126
|
-
const SENTINEL = new RegExp(`${NUL}bs:([a-z_][a-z0-9_]*)${NUL}`, "gi");
|
|
127
|
-
const EXACT = new RegExp(`^${NUL}bs:([a-z_][a-z0-9_]*)${NUL}$`, "i");
|
|
131
|
+
const SENTINEL = new RegExp(`${NUL}bs:(@?[a-z_][a-z0-9_]*)${NUL}`, "gi");
|
|
132
|
+
const EXACT = new RegExp(`^${NUL}bs:(@?[a-z_][a-z0-9_]*)${NUL}$`, "i");
|
|
128
133
|
function sentinel(name) {
|
|
129
134
|
return `${NUL}bs:${name}${NUL}`;
|
|
130
135
|
}
|
|
136
|
+
const AUTH = { uid: sentinel("@uid") };
|
|
137
|
+
function tagged(name, array) {
|
|
138
|
+
if (!name.startsWith("@")) return {
|
|
139
|
+
kind: "param",
|
|
140
|
+
name,
|
|
141
|
+
array
|
|
142
|
+
};
|
|
143
|
+
return name === "@uid" ? {
|
|
144
|
+
kind: "auth",
|
|
145
|
+
name: "uid",
|
|
146
|
+
array
|
|
147
|
+
} : void 0;
|
|
148
|
+
}
|
|
131
149
|
/**
|
|
132
150
|
* Registers reads that run as one round trip:
|
|
133
151
|
*
|
|
@@ -155,7 +173,7 @@ function defineReadSet(betterSupabase, name, options, build) {
|
|
|
155
173
|
if (!TYPE.test(type)) throw new TypeError(`better-supabase: read set "${name}" parameter "${key}" has an invalid type "${type}"`);
|
|
156
174
|
placeholders[key] = type.endsWith("[]") ? [sentinel(key)] : sentinel(key);
|
|
157
175
|
}
|
|
158
|
-
const specs = build(betterSupabase.spec, placeholders);
|
|
176
|
+
const specs = build(betterSupabase.spec, placeholders, AUTH);
|
|
159
177
|
const entries = Object.entries(specs);
|
|
160
178
|
if (entries.length === 0 || entries.length > MAX_ENTRIES) throw new TypeError(`better-supabase: read set "${name}" needs between 1 and ${MAX_ENTRIES} reads`);
|
|
161
179
|
for (const [key, spec] of entries) if (!isQuerySpec(spec)) throw new TypeError(`better-supabase: read set "${name}" entry "${key}" is not a spec from betterSupabase.spec`);
|
|
@@ -176,14 +194,16 @@ function defineReadSet(betterSupabase, name, options, build) {
|
|
|
176
194
|
* that only those plugins add never reach it.
|
|
177
195
|
*/
|
|
178
196
|
function warnUnscopedReads(betterSupabase, name, specs) {
|
|
179
|
-
const
|
|
180
|
-
if (
|
|
197
|
+
const filtering = betterSupabase.plugins.filter((plugin) => plugin.transformQuery !== void 0 && plugin.scopes?.length !== 0);
|
|
198
|
+
if (filtering.length === 0) return;
|
|
181
199
|
const { meta } = betterSupabase;
|
|
182
|
-
const
|
|
200
|
+
const filters = (plugin, key) => {
|
|
183
201
|
const flags = meta.tables[key]?.flags;
|
|
184
|
-
return
|
|
185
|
-
}
|
|
202
|
+
return plugin.scopes === void 0 || plugin.scopes.some((flag) => flags?.[flag] !== void 0);
|
|
203
|
+
};
|
|
204
|
+
const tables = [...new Set(Object.values(specs).flatMap((spec) => specTables(meta, spec)))].filter((key) => filtering.some((plugin) => filters(plugin, key)));
|
|
186
205
|
if (tables.length === 0) return;
|
|
206
|
+
const scoping = filtering.filter((plugin) => tables.some((key) => filters(plugin, key))).map((plugin) => plugin.name);
|
|
187
207
|
betterSupabase.events.logger.warn(`read set "${name}" reads ${tables.join(", ")}, which ${scoping.join(", ")} scope at runtime; its generated function only sees those filters when the specs spell them out (or RLS enforces them)`, {
|
|
188
208
|
readSet: name,
|
|
189
209
|
tables,
|
|
@@ -193,19 +213,16 @@ function warnUnscopedReads(betterSupabase, name, specs) {
|
|
|
193
213
|
function isReadSet(value) {
|
|
194
214
|
return typeof value === "object" && value !== null && value.kind === "read-set" && typeof value.name === "string";
|
|
195
215
|
}
|
|
196
|
-
/**
|
|
216
|
+
/** The placeholder a string or array carries, if it is exactly one. */
|
|
197
217
|
function placeholderOf(value) {
|
|
198
218
|
if (typeof value === "string") {
|
|
199
219
|
const match = EXACT.exec(value);
|
|
200
|
-
return match ?
|
|
201
|
-
name: match[1],
|
|
202
|
-
array: false
|
|
203
|
-
} : void 0;
|
|
220
|
+
return match ? tagged(match[1], false) : void 0;
|
|
204
221
|
}
|
|
205
222
|
if (Array.isArray(value) && value.length === 1) {
|
|
206
223
|
const inner = placeholderOf(value[0]);
|
|
207
224
|
return inner && !inner.array ? {
|
|
208
|
-
|
|
225
|
+
...inner,
|
|
209
226
|
array: true
|
|
210
227
|
} : inner;
|
|
211
228
|
}
|
|
@@ -216,7 +233,8 @@ function splitPlaceholders(value) {
|
|
|
216
233
|
let last = 0;
|
|
217
234
|
for (const match of value.matchAll(SENTINEL)) {
|
|
218
235
|
if (match.index > last) parts.push({ text: value.slice(last, match.index) });
|
|
219
|
-
|
|
236
|
+
const placeholder = tagged(match[1], false);
|
|
237
|
+
parts.push(placeholder ?? { text: match[0] });
|
|
220
238
|
last = match.index + match[0].length;
|
|
221
239
|
}
|
|
222
240
|
if (last < value.length) parts.push({ text: value.slice(last) });
|
|
@@ -232,6 +250,16 @@ function containsPlaceholder(value) {
|
|
|
232
250
|
if (typeof value === "object" && value !== null) return Object.values(value).some(containsPlaceholder);
|
|
233
251
|
return false;
|
|
234
252
|
}
|
|
253
|
+
/** Whether the set's specs read the caller's identity. */
|
|
254
|
+
function readSetUsesAuth(set) {
|
|
255
|
+
return Object.values(set.specs).some((spec) => usesAuth(spec.args));
|
|
256
|
+
}
|
|
257
|
+
function usesAuth(value) {
|
|
258
|
+
if (typeof value === "string") return [...value.matchAll(SENTINEL)].some((match) => match[1].startsWith("@"));
|
|
259
|
+
if (Array.isArray(value)) return value.some(usesAuth);
|
|
260
|
+
if (typeof value === "object" && value !== null) return Object.values(value).some(usesAuth);
|
|
261
|
+
return false;
|
|
262
|
+
}
|
|
235
263
|
/** Missing or wrongly typed parameters, as messages. */
|
|
236
264
|
function checkParams(set, values) {
|
|
237
265
|
const problems = [];
|
|
@@ -242,14 +270,25 @@ function checkParams(set, values) {
|
|
|
242
270
|
}
|
|
243
271
|
return problems;
|
|
244
272
|
}
|
|
245
|
-
/**
|
|
246
|
-
|
|
273
|
+
/**
|
|
274
|
+
* The specs with every placeholder replaced by its value; `auth.uid` takes
|
|
275
|
+
* the `sub` claim, which must be verified. `noCaller` is set when the set
|
|
276
|
+
* reads `auth.uid` and there is no `sub`: the specs then match no user, and
|
|
277
|
+
* only the function, which reads `auth.uid()` itself, can run the set.
|
|
278
|
+
*/
|
|
279
|
+
function bindParams(set, values, context) {
|
|
280
|
+
const sub = context.claims?.["sub"];
|
|
281
|
+
const uid = typeof sub === "string" && sub !== "" ? sub : null;
|
|
282
|
+
const valueOf = (placeholder) => placeholder.kind === "auth" ? uid : values?.[placeholder.name];
|
|
247
283
|
const bind = (value) => {
|
|
248
284
|
const placeholder = placeholderOf(value);
|
|
249
|
-
if (placeholder)
|
|
285
|
+
if (placeholder) {
|
|
286
|
+
const bound = valueOf(placeholder);
|
|
287
|
+
return placeholder.kind === "auth" && placeholder.array ? [bound] : bound;
|
|
288
|
+
}
|
|
250
289
|
if (typeof value === "string") {
|
|
251
290
|
if (!hasPlaceholder(value)) return value;
|
|
252
|
-
return splitPlaceholders(value).map((part) => "text" in part ? part.text : String(
|
|
291
|
+
return splitPlaceholders(value).map((part) => "text" in part ? part.text : String(valueOf(part) ?? "")).join("");
|
|
253
292
|
}
|
|
254
293
|
if (Array.isArray(value)) return value.map(bind);
|
|
255
294
|
if (typeof value === "object" && value !== null) {
|
|
@@ -258,10 +297,13 @@ function bindParams(set, values) {
|
|
|
258
297
|
}
|
|
259
298
|
return value;
|
|
260
299
|
};
|
|
261
|
-
return
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
300
|
+
return {
|
|
301
|
+
specs: Object.fromEntries(Object.entries(set.specs).map(([key, spec]) => [key, {
|
|
302
|
+
...spec,
|
|
303
|
+
args: spec.args.map(bind)
|
|
304
|
+
}])),
|
|
305
|
+
noCaller: uid === null && readSetUsesAuth(set) ? dbError("invalid_request", `db.$many(${set.name}): the read set reads auth.uid, but this connection has no user claims. Connect with the user's verified claims ({ claims: { sub } }), or call it over PostgREST, where the function reads auth.uid().`) : void 0
|
|
306
|
+
};
|
|
265
307
|
}
|
|
266
308
|
/** App keys of every table the set reads. */
|
|
267
309
|
function readSetTables(set, meta) {
|
package/dist/realtime/index.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { n as
|
|
3
|
-
import { n as
|
|
4
|
-
|
|
5
|
-
export { type CountRunner, type EventSchemas, type LiveCountOptions, type LiveCountSeed, type LiveQueryOptions, type LiveSource, type LiveSubscription, type PermdockCatalog, type PermdockTopicPolicy, type RealtimeClient, type RowChange, type SubscribeOptions, type Subscription, type SubscriptionStatus, type TemplateParams, type TemplateValues, type Topic, type TopicEvent, type TopicHandlers, type TopicMessage, type TopicOptions, type TopicPayload, type TriggerOptions, defineTopic, liveCount, liveQuery, liveTopic, rowChange };
|
|
1
|
+
import { n as AccessPolicySql, r as AccessTopicPolicy } from "../types-6BdhkmZe.js";
|
|
2
|
+
import { n as TemplateValues, t as TemplateParams } from "../template-CwO38Do8.js";
|
|
3
|
+
import { A as TopicSubscription, C as TopicEvent, D as TopicPayload, E as TopicOptions, F as rowChange, M as TriggerOptions, N as TriggerValue, O as TopicSqlOptions, P as defineTopic, S as Topic, T as TopicMessage, _ as RealtimeClient, a as LiveSource, b as Subscription, c as liveQuery, d as PresenceInput, f as PresenceMember, g as PresenceSubscription, h as PresenceSchema, i as LiveQueryOptions, j as TriggerLookup, k as TopicSubscribeOptions, l as liveTopic, m as PresenceOutput, n as LiveCountOptions, o as LiveSubscription, p as PresenceOptions, r as LiveCountSeed, s as liveCount, t as CountRunner, u as EventSchemas, v as RowChange, w as TopicHandlers, x as SubscriptionStatus, y as SubscribeOptions } from "../index-DunNRdnT.js";
|
|
4
|
+
export { type AccessPolicySql, type AccessTopicPolicy, type CountRunner, type EventSchemas, type LiveCountOptions, type LiveCountSeed, type LiveQueryOptions, type LiveSource, type LiveSubscription, type PresenceInput, type PresenceMember, type PresenceOptions, type PresenceOutput, type PresenceSchema, type PresenceSubscription, type RealtimeClient, type RowChange, type SubscribeOptions, type Subscription, type SubscriptionStatus, type TemplateParams, type TemplateValues, type Topic, type TopicEvent, type TopicHandlers, type TopicMessage, type TopicOptions, type TopicPayload, type TopicSqlOptions, type TopicSubscribeOptions, type TopicSubscription, type TriggerLookup, type TriggerOptions, type TriggerValue, defineTopic, liveCount, liveQuery, liveTopic, rowChange };
|
package/dist/realtime/index.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import { n as dbError } from "../errors-
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { n as liveQuery, r as liveTopic, t as liveCount } from "../live-
|
|
5
|
-
import { i as sqlString, n as slug, r as sqlIdent, t as parseTemplate } from "../template
|
|
6
|
-
import { c as toApp } from "../shared-
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
1
|
+
import { n as dbError } from "../errors-B11Duf73.js";
|
|
2
|
+
import { a as ok, r as err, t as AsyncResult } from "../result-DzUbqgdW.js";
|
|
3
|
+
import { a as tenantClaimPaths } from "../claims-PqzCxaTD.js";
|
|
4
|
+
import { i as refreshRealtimeAuth, n as liveQuery, r as liveTopic, t as liveCount } from "../live-CTAZQkwl.js";
|
|
5
|
+
import { i as sqlString, n as slug, r as sqlIdent, t as parseTemplate } from "../template--jDkl3UP.js";
|
|
6
|
+
import { c as toApp } from "../shared-CxWmcyqB.js";
|
|
7
|
+
import { t as joinTopic } from "../channels-CkgQ_X60.js";
|
|
8
|
+
import { o as resolveProviderSql, r as accessCheck } from "../access-sql-B0dF-SoF.js";
|
|
9
|
+
import "@supabase/supabase-js";
|
|
9
10
|
//#region src/realtime/topic.ts
|
|
10
11
|
const VALUE = /^[\w.@+=-]+$/;
|
|
11
12
|
function validateValue(_name, value) {
|
|
@@ -43,15 +44,38 @@ function sendError(status, message) {
|
|
|
43
44
|
if (status === 429 || status >= 500 || status === 0) return dbError("network", message, status ? { status } : {});
|
|
44
45
|
return dbError("invalid_request", message, { status });
|
|
45
46
|
}
|
|
47
|
+
function columnSql(meta, column, where) {
|
|
48
|
+
const db = meta.columns[column]?.db;
|
|
49
|
+
if (!db) throw new TypeError(`defineTopic: no column for ${where} on "${meta.key}" ("${column}")`);
|
|
50
|
+
return sqlIdent(db);
|
|
51
|
+
}
|
|
52
|
+
/** A trigger value as SQL on `rec`, with one subquery per lookup. */
|
|
53
|
+
function triggerValueSql(tables, meta, value, where, depth = 0) {
|
|
54
|
+
if (typeof value === "string") return `rec.${columnSql(meta, value, where)}`;
|
|
55
|
+
const joined = tables[value.from];
|
|
56
|
+
if (!joined) throw new TypeError(`defineTopic: unknown table "${value.from}" for ${where}`);
|
|
57
|
+
const key = value.key ?? (joined.primaryKey.length === 1 ? joined.primaryKey[0] : void 0);
|
|
58
|
+
if (key === void 0) throw new TypeError(`defineTopic: "${value.from}" has no single-column primary key; name its key for ${where}`);
|
|
59
|
+
const alias = `j${String(depth)}`;
|
|
60
|
+
const via = triggerValueSql(tables, meta, value.via, where, depth + 1);
|
|
61
|
+
return `(select ${alias}.${columnSql(joined, value.select, where)} from ${sqlIdent(joined.schema)}.${sqlIdent(joined.name)} ${alias} where ${alias}.${columnSql(joined, key, where)} = ${via} limit 1)`;
|
|
62
|
+
}
|
|
63
|
+
/** The event name: one for every operation, one per operation, or the operation. */
|
|
64
|
+
function eventSql(event) {
|
|
65
|
+
if (event === void 0) return "tg_op";
|
|
66
|
+
if (typeof event === "string") return sqlString(event);
|
|
67
|
+
const cases = Object.entries(event).filter((entry) => entry[1] !== void 0).map(([operation, name]) => ` when ${sqlString(operation.toUpperCase())} then ${sqlString(name)}`);
|
|
68
|
+
return cases.length === 0 ? "tg_op" : `case tg_op${cases.join("")} else tg_op end`;
|
|
69
|
+
}
|
|
46
70
|
/**
|
|
47
71
|
* A typed Realtime broadcast topic: names from a template, RLS policies for
|
|
48
72
|
* private channels, row-change triggers, and disposable subscriptions.
|
|
49
73
|
*
|
|
50
74
|
* ```ts
|
|
51
|
-
* export const notifications = defineTopic('
|
|
75
|
+
* export const notifications = defineTopic('organization:{organizationId}:notifications:{userId}', {
|
|
52
76
|
* events: { created: v.object({ id: v.string(), title: v.string() }) },
|
|
53
77
|
* });
|
|
54
|
-
* using sub = notifications.subscribe(supabase, {
|
|
78
|
+
* using sub = notifications.subscribe(supabase, { organizationId, userId }, { created: (n) => toast(n.title) });
|
|
55
79
|
* ```
|
|
56
80
|
*/
|
|
57
81
|
function defineTopic(template, options = {}) {
|
|
@@ -60,25 +84,29 @@ function defineTopic(template, options = {}) {
|
|
|
60
84
|
const name = slug(options.name ?? literal) || "topic";
|
|
61
85
|
const isPrivate = options.private ?? true;
|
|
62
86
|
const schemas = options.events ?? {};
|
|
87
|
+
const hasPresence = options.presence !== void 0 && options.presence !== false;
|
|
88
|
+
const presenceSchema = typeof options.presence === "object" ? options.presence : void 0;
|
|
63
89
|
const segment = (param, kind) => {
|
|
64
90
|
const index = parsed.segmentOf(param);
|
|
65
91
|
if (index === void 0) throw new TypeError(`defineTopic: the ${kind} check needs {${param}} as a whole segment in "${template}"`);
|
|
66
92
|
return index;
|
|
67
93
|
};
|
|
68
94
|
const checks = [];
|
|
69
|
-
const
|
|
70
|
-
const tenantParam = options.tenant === false ? void 0 : options.tenant?.param ?? "
|
|
71
|
-
const
|
|
72
|
-
if (!
|
|
95
|
+
const access = options.access;
|
|
96
|
+
const tenantParam = options.tenant === false ? void 0 : options.tenant?.param ?? "organizationId";
|
|
97
|
+
const accessChecksFor = (functions) => {
|
|
98
|
+
if (!access) return void 0;
|
|
73
99
|
const where = `defineTopic(${template})`;
|
|
74
|
-
const
|
|
75
|
-
const
|
|
100
|
+
const target = resolveProviderSql(where, access, functions);
|
|
101
|
+
const id = access.scope === "platform" ? void 0 : `split_part((select realtime.topic()), ':', ${String(access.segment ?? segment(tenantParam ?? "organizationId", "access"))})`;
|
|
102
|
+
const receive = accessCheck(where, target, access.receive, id);
|
|
76
103
|
return {
|
|
77
104
|
receive,
|
|
78
|
-
send:
|
|
105
|
+
send: access.send === void 0 ? receive : accessCheck(where, target, access.send, id)
|
|
79
106
|
};
|
|
80
|
-
}
|
|
81
|
-
|
|
107
|
+
};
|
|
108
|
+
const fixedChecks = access?.sql === "provider" ? void 0 : accessChecksFor();
|
|
109
|
+
if (!access && tenantParam && (options.tenant || parsed.params.includes(tenantParam))) {
|
|
82
110
|
const tenant = options.tenant === false ? {} : options.tenant ?? {};
|
|
83
111
|
const expression = tenant.sql ?? claimSql(tenant.claim ?? tenantClaimPaths());
|
|
84
112
|
checks.push(`split_part((select realtime.topic()), ':', ${String(segment(tenantParam, "tenant"))}) = (${expression})`);
|
|
@@ -91,10 +119,12 @@ function defineTopic(template, options = {}) {
|
|
|
91
119
|
name,
|
|
92
120
|
params: parsed.params,
|
|
93
121
|
private: isPrivate,
|
|
122
|
+
presence: hasPresence,
|
|
94
123
|
topic: topicOf,
|
|
95
124
|
match: (topic) => parsed.match(topic),
|
|
96
|
-
sql() {
|
|
97
|
-
const
|
|
125
|
+
sql(sqlOptions) {
|
|
126
|
+
const accessChecks = access?.sql === "provider" ? accessChecksFor(sqlOptions?.functions) : fixedChecks;
|
|
127
|
+
const extensions = hasPresence ? "('broadcast', 'presence')" : "('broadcast')";
|
|
98
128
|
const condition = (extra) => [
|
|
99
129
|
`(select realtime.topic()) ~ ${sqlString(parsed.sqlPattern)}`,
|
|
100
130
|
`realtime.messages.extension in ${extensions}`,
|
|
@@ -106,13 +136,13 @@ function defineTopic(template, options = {}) {
|
|
|
106
136
|
"receive",
|
|
107
137
|
"select",
|
|
108
138
|
"using",
|
|
109
|
-
condition(
|
|
139
|
+
condition(accessChecks?.receive)
|
|
110
140
|
]];
|
|
111
|
-
if (options.send ||
|
|
141
|
+
if (options.send || hasPresence || access?.send !== void 0) policies.push([
|
|
112
142
|
"send",
|
|
113
143
|
"insert",
|
|
114
144
|
"with check",
|
|
115
|
-
condition(
|
|
145
|
+
condition(accessChecks?.send)
|
|
116
146
|
]);
|
|
117
147
|
for (const [suffix, command, clause, check] of policies) {
|
|
118
148
|
const policy = sqlIdent(`bs_topic_${name}_${suffix}`);
|
|
@@ -124,13 +154,13 @@ function defineTopic(template, options = {}) {
|
|
|
124
154
|
const meta = betterSupabase.meta.tables[table];
|
|
125
155
|
if (!meta) throw new TypeError(`defineTopic: unknown table "${table}"`);
|
|
126
156
|
const values = trigger.values;
|
|
157
|
+
const tables = betterSupabase.meta.tables;
|
|
127
158
|
const parts = template.split(/(\{[^}]+\})/).filter(Boolean).map((part) => {
|
|
128
159
|
const param = /^\{(.+)\}$/.exec(part)?.[1];
|
|
129
160
|
if (param === void 0) return sqlString(part);
|
|
130
|
-
const
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
return `rec.${sqlIdent(db)}::text`;
|
|
161
|
+
const value = values[param];
|
|
162
|
+
if (value === void 0) throw new TypeError(`defineTopic: no column for {${param}} on "${table}"`);
|
|
163
|
+
return `${triggerValueSql(tables, meta, value, `{${param}}`)}::text`;
|
|
134
164
|
});
|
|
135
165
|
const schema = trigger.functionSchema ?? "better_supabase";
|
|
136
166
|
const fn = `${sqlIdent(schema)}.${sqlIdent(`bs_broadcast_${name}_${slug(meta.name)}`)}`;
|
|
@@ -141,6 +171,18 @@ function defineTopic(template, options = {}) {
|
|
|
141
171
|
"update",
|
|
142
172
|
"delete"
|
|
143
173
|
]).join(" or ");
|
|
174
|
+
const event = eventSql(trigger.event);
|
|
175
|
+
const payload = trigger.payload;
|
|
176
|
+
const send = payload ? [
|
|
177
|
+
" perform realtime.send(",
|
|
178
|
+
` jsonb_build_object(${Object.entries(payload).map(([key, value]) => `${sqlString(key)}, ${typeof value === "object" && "sql" in value ? `(${value.sql.replaceAll("{row}", "rec")})` : triggerValueSql(tables, meta, value, `payload.${key}`)}`).join(", ")}),`,
|
|
179
|
+
` ${event}, topic, ${String(isPrivate)}`,
|
|
180
|
+
" );"
|
|
181
|
+
] : [
|
|
182
|
+
" perform realtime.broadcast_changes(",
|
|
183
|
+
` topic, ${event}, tg_op, tg_table_name, tg_table_schema, new, old`,
|
|
184
|
+
" );"
|
|
185
|
+
];
|
|
144
186
|
return [
|
|
145
187
|
`-- better-supabase: broadcast ${meta.name} changes to ${template}`,
|
|
146
188
|
`create schema if not exists ${sqlIdent(schema)};`,
|
|
@@ -152,12 +194,14 @@ function defineTopic(template, options = {}) {
|
|
|
152
194
|
"as $$",
|
|
153
195
|
"declare",
|
|
154
196
|
" rec record;",
|
|
197
|
+
" topic text;",
|
|
155
198
|
"begin",
|
|
156
199
|
" if tg_op = 'DELETE' then rec := old; else rec := new; end if;",
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
"
|
|
160
|
-
"
|
|
200
|
+
` topic := ${parts.join(" || ")};`,
|
|
201
|
+
" if topic is null then",
|
|
202
|
+
" return null;",
|
|
203
|
+
" end if;",
|
|
204
|
+
...send,
|
|
161
205
|
" return null;",
|
|
162
206
|
"end;",
|
|
163
207
|
"$$;",
|
|
@@ -169,68 +213,86 @@ function defineTopic(template, options = {}) {
|
|
|
169
213
|
""
|
|
170
214
|
].join("\n");
|
|
171
215
|
},
|
|
172
|
-
subscribe(client, values, handlers,
|
|
216
|
+
subscribe(client, values, handlers, given) {
|
|
173
217
|
const topic = topicOf(values);
|
|
174
|
-
const channel = client.channel(topic, { config: {
|
|
175
|
-
private: isPrivate,
|
|
176
|
-
broadcast: { self: subscribeOptions.self ?? false }
|
|
177
|
-
} });
|
|
178
218
|
const table = handlers;
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
219
|
+
const subscribeOptions = given ?? {};
|
|
220
|
+
let members = [];
|
|
221
|
+
let syncs = 0;
|
|
222
|
+
const sync = async (state) => {
|
|
223
|
+
const run = ++syncs;
|
|
224
|
+
const checked = await Promise.all(Object.entries(state).flatMap(([key, metas]) => metas.map(async ({ presence_ref: _ref, ...meta }) => ({
|
|
225
|
+
key,
|
|
226
|
+
meta,
|
|
227
|
+
checked: await validate(presenceSchema, meta)
|
|
228
|
+
}))));
|
|
229
|
+
if (run !== syncs) return;
|
|
230
|
+
const valid = [];
|
|
231
|
+
for (const each of checked) if (each.checked.ok) valid.push({
|
|
232
|
+
key: each.key,
|
|
233
|
+
state: each.checked.value
|
|
190
234
|
});
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
return;
|
|
208
|
-
case REALTIME_SUBSCRIBE_STATES.CHANNEL_ERROR:
|
|
209
|
-
case REALTIME_SUBSCRIBE_STATES.TIMED_OUT: {
|
|
210
|
-
const failure = error ?? /* @__PURE__ */ new Error(`Realtime ${status.toLowerCase()} on ${topic}`);
|
|
211
|
-
subscribeOptions.onStatus?.("error", failure);
|
|
212
|
-
reject(failure);
|
|
213
|
-
return;
|
|
214
|
-
}
|
|
215
|
-
default: reject(/* @__PURE__ */ new Error(`Unknown realtime status ${String(status)}`));
|
|
216
|
-
}
|
|
235
|
+
else subscribeOptions.onInvalid?.({
|
|
236
|
+
event: "presence",
|
|
237
|
+
payload: each.meta,
|
|
238
|
+
topic
|
|
239
|
+
}, each.checked.issues);
|
|
240
|
+
members = valid;
|
|
241
|
+
subscribeOptions.onPresence?.(valid);
|
|
242
|
+
};
|
|
243
|
+
const subscriber = {
|
|
244
|
+
onStatus: subscribeOptions.onStatus,
|
|
245
|
+
receive: (message) => {
|
|
246
|
+
const handler = table[message.event] ?? table["*"];
|
|
247
|
+
if (!handler) return;
|
|
248
|
+
validate(schemas[message.event], message.payload).then((checked) => {
|
|
249
|
+
if (checked.ok) handler(checked.value, message);
|
|
250
|
+
else subscribeOptions.onInvalid?.(message, checked.issues);
|
|
217
251
|
});
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
|
|
252
|
+
},
|
|
253
|
+
...hasPresence ? { sync: (state) => void sync(state) } : {}
|
|
254
|
+
};
|
|
255
|
+
const { shared, leave } = joinTopic(client, topic, isPrivate, subscribeOptions.self ?? false, hasPresence, subscriber);
|
|
256
|
+
let closed = false;
|
|
221
257
|
const unsubscribe = async () => {
|
|
222
258
|
if (closed) return;
|
|
223
259
|
closed = true;
|
|
224
|
-
await
|
|
260
|
+
await leave();
|
|
225
261
|
};
|
|
226
|
-
|
|
262
|
+
const presenceCall = (action, run) => AsyncResult.from(async () => {
|
|
263
|
+
if (closed) return err(dbError("invalid_request", `Presence ${action} after unsubscribe on ${topic}`));
|
|
264
|
+
try {
|
|
265
|
+
await shared.ready;
|
|
266
|
+
} catch (cause) {
|
|
267
|
+
return err(dbError("network", `Presence ${action} on ${topic}: the join failed`, { details: cause instanceof Error ? cause.message : String(cause) }));
|
|
268
|
+
}
|
|
269
|
+
const answer = await run();
|
|
270
|
+
return answer === "ok" ? ok(void 0) : err(dbError("network", `Presence ${action} ${answer} on ${topic}`));
|
|
271
|
+
});
|
|
272
|
+
const subscription = {
|
|
227
273
|
topic,
|
|
228
|
-
channel,
|
|
229
|
-
ready,
|
|
274
|
+
channel: shared.channel,
|
|
275
|
+
ready: shared.ready,
|
|
230
276
|
unsubscribe,
|
|
231
277
|
[Symbol.dispose]: () => void unsubscribe(),
|
|
232
278
|
[Symbol.asyncDispose]: unsubscribe
|
|
233
279
|
};
|
|
280
|
+
return hasPresence ? {
|
|
281
|
+
...subscription,
|
|
282
|
+
track: (state) => AsyncResult.from(async () => {
|
|
283
|
+
const checked = await validate(presenceSchema, state);
|
|
284
|
+
if (!checked.ok) return err(dbError("validation", `Invalid presence state for ${topic}`, { issues: checked.issues }));
|
|
285
|
+
return presenceCall("track", async () => {
|
|
286
|
+
shared.tracker = subscriber;
|
|
287
|
+
return shared.channel.track(checked.value);
|
|
288
|
+
});
|
|
289
|
+
}),
|
|
290
|
+
untrack: () => presenceCall("untrack", async () => {
|
|
291
|
+
if (shared.tracker === subscriber) shared.tracker = void 0;
|
|
292
|
+
return shared.channel.untrack();
|
|
293
|
+
}),
|
|
294
|
+
members: () => members
|
|
295
|
+
} : subscription;
|
|
234
296
|
},
|
|
235
297
|
send(client, values, event, payload) {
|
|
236
298
|
return AsyncResult.from(async () => {
|
|
@@ -238,7 +300,7 @@ function defineTopic(template, options = {}) {
|
|
|
238
300
|
const checked = await validate(schemas[event], payload);
|
|
239
301
|
if (!checked.ok) return err(dbError("validation", `Invalid payload for ${event}`, { issues: checked.issues }));
|
|
240
302
|
const open = client.getChannels().some((existing) => existing.topic === `realtime:${topic}`);
|
|
241
|
-
if (isPrivate && !open) await client
|
|
303
|
+
if (isPrivate && !open) await refreshRealtimeAuth(client);
|
|
242
304
|
const channel = client.channel(topic, { config: { private: isPrivate } });
|
|
243
305
|
try {
|
|
244
306
|
const response = await channel.httpSend(event, checked.value);
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { r as dbErrorOf } from "./errors-B11Duf73.js";
|
|
2
|
+
import { a as problemResponse } from "./problem-BreOl8b8.js";
|
|
3
|
+
import { t as defaultExpose } from "./respond-BUgsXNgk.js";
|
|
4
|
+
import { i as requireCaller } from "./kit-Fm-Fv7q5.js";
|
|
5
|
+
//#region src/server/refusal.ts
|
|
6
|
+
function isAalRefusal(error) {
|
|
7
|
+
return error.kind === "forbidden" && "required" in error && error.required === "aal2";
|
|
8
|
+
}
|
|
9
|
+
/** The page a refused caller is sent to, with `?next=`, when one is configured. */
|
|
10
|
+
function refusalTarget(error, request, redirects) {
|
|
11
|
+
const page = error.kind === "unauthorized" ? redirects.signIn : isAalRefusal(error) ? redirects.mfa : void 0;
|
|
12
|
+
if (page === void 0) return void 0;
|
|
13
|
+
const url = new URL(request.url);
|
|
14
|
+
const target = new URL(page, url);
|
|
15
|
+
if (target.pathname === url.pathname) return void 0;
|
|
16
|
+
target.searchParams.set("next", `${url.pathname}${url.search}`);
|
|
17
|
+
return target;
|
|
18
|
+
}
|
|
19
|
+
/** A refusal as a redirect to `signIn` or `mfa`, else Problem Details. */
|
|
20
|
+
function refusalResponse(error, request, redirects, expose) {
|
|
21
|
+
const target = refusalTarget(error, request, redirects);
|
|
22
|
+
if (target) return new Response(null, {
|
|
23
|
+
status: 303,
|
|
24
|
+
headers: { location: target.href }
|
|
25
|
+
});
|
|
26
|
+
return problemResponse(error, {
|
|
27
|
+
instance: new URL(request.url).pathname,
|
|
28
|
+
expose
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
/** The refusal for a caller `options` refuses, or `undefined` to let it through. */
|
|
32
|
+
async function routeRefusal(locals, request, options) {
|
|
33
|
+
const caller = await requireCaller(locals.bs.auth, options, locals.tenant);
|
|
34
|
+
if (!("kind" in caller)) return void 0;
|
|
35
|
+
return refusalResponse(caller, request, options, options.expose ?? defaultExpose());
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* An `onError` mapper: a thrown `DbException` (or an error caused by a
|
|
39
|
+
* `DbError`) becomes Problem Details; anything else is `undefined`, so the
|
|
40
|
+
* framework's own handling stays.
|
|
41
|
+
*/
|
|
42
|
+
function errorResponse(cause, request, options = {}) {
|
|
43
|
+
const found = dbErrorOf(cause);
|
|
44
|
+
if (!found) return void 0;
|
|
45
|
+
return problemResponse(found, {
|
|
46
|
+
instance: new URL(request.url).pathname,
|
|
47
|
+
expose: options.expose ?? defaultExpose()
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
/** Reads the guard's view of a request's contributions; throws without `withBetterSupabase`. */
|
|
51
|
+
function guardedLocals(contributions) {
|
|
52
|
+
const bs = "bs" in contributions ? contributions.bs : void 0;
|
|
53
|
+
if (typeof bs !== "object" || bs === null || !("auth" in bs)) throw new Error("better-supabase: the route guard needs withBetterSupabase(server) in the entries");
|
|
54
|
+
const tenant = "tenant" in contributions ? contributions.tenant : void 0;
|
|
55
|
+
return {
|
|
56
|
+
bs,
|
|
57
|
+
tenant: typeof tenant === "string" ? tenant : void 0
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
//#endregion
|
|
61
|
+
export { routeRefusal as a, refusalTarget as i, guardedLocals as n, refusalResponse as r, errorResponse as t };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { s as BlockRequireOptions } from "./kit-B5tid-q5.js";
|
|
2
|
+
//#region src/server/refusal.d.ts
|
|
3
|
+
/** Where refused callers go instead of a Problem Details response. */
|
|
4
|
+
interface RefusalRedirects {
|
|
5
|
+
/** Sign-in page for callers without a session; gets `?next=<path>`. */
|
|
6
|
+
readonly signIn?: string;
|
|
7
|
+
/** Second-factor page for users below the route's `aal`; gets `?next=<path>`. */
|
|
8
|
+
readonly mfa?: string;
|
|
9
|
+
}
|
|
10
|
+
interface RouteGuardOptions<C = unknown, P = unknown> extends BlockRequireOptions<C, P>, RefusalRedirects {
|
|
11
|
+
/** Include internal error messages in Problem Details. Defaults to development only. */
|
|
12
|
+
readonly expose?: boolean;
|
|
13
|
+
}
|
|
14
|
+
//#endregion
|
|
15
|
+
export { RouteGuardOptions as n, RefusalRedirects as t };
|