better-supabase 0.5.1 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +187 -46
- package/dist/access-sql-B0dF-SoF.js +181 -0
- package/dist/{actor-DaJjqD5R.d.ts → actor-CQTlc1Hh.d.ts} +1 -1
- package/dist/adapter-Bc1o3zyy.js +1106 -0
- package/dist/agents-CVHGd7It.d.ts +94 -0
- package/dist/ai-cache-CBWs1W0k.js +80 -0
- package/dist/ai-cache-DaDu_G5L.d.ts +64 -0
- package/dist/ai-chat-7amvXjmQ.d.ts +590 -0
- package/dist/ai-chat-B24UI962.js +743 -0
- package/dist/ai-files-CSPNswUY.js +319 -0
- package/dist/ai-sdk/agents/index.d.ts +74 -0
- package/dist/ai-sdk/agents/index.js +159 -0
- package/dist/ai-sdk/batches/index.d.ts +74 -0
- package/dist/ai-sdk/batches/index.js +180 -0
- package/dist/ai-sdk/cache/index.d.ts +38 -0
- package/dist/ai-sdk/cache/index.js +127 -0
- package/dist/ai-sdk/chat/index.d.ts +2 -0
- package/dist/ai-sdk/chat/index.js +246 -0
- package/dist/ai-sdk/embeddings/index.d.ts +3 -0
- package/dist/ai-sdk/embeddings/index.js +2 -0
- package/dist/ai-sdk/files/index.d.ts +61 -0
- package/dist/ai-sdk/files/index.js +111 -0
- package/dist/ai-sdk/index.d.ts +145 -0
- package/dist/ai-sdk/index.js +174 -0
- package/dist/ai-sdk/mcp/index.d.ts +102 -0
- package/dist/ai-sdk/mcp/index.js +362 -0
- package/dist/ai-sdk/memory/index.d.ts +67 -0
- package/dist/ai-sdk/memory/index.js +175 -0
- package/dist/ai-sdk/react/index.d.ts +2 -0
- package/dist/ai-sdk/react/index.js +3 -0
- package/dist/ai-sdk/react/server.d.ts +6 -0
- package/dist/ai-sdk/react/server.js +7 -0
- package/dist/ai-sdk/workflow/index.d.ts +249 -0
- package/dist/ai-sdk/workflow/index.js +575 -0
- package/dist/ai-sdk/workflow/react/index.d.ts +20 -0
- package/dist/ai-sdk/workflow/react/index.js +66 -0
- package/dist/ai-sdk/workflow/react/server.d.ts +10 -0
- package/dist/ai-sdk/workflow/react/server.js +12 -0
- package/dist/ai-tasks-Cd1HMFvB.d.ts +131 -0
- package/dist/announcements-CiyOs-xP.js +107 -0
- package/dist/announcements-ZRGnScWI.d.ts +72 -0
- package/dist/api-keys-rCGtKaZA.d.ts +156 -0
- package/dist/assistant-DwdpDH1q.d.ts +147 -0
- package/dist/astro/index.d.ts +86 -0
- package/dist/astro/index.js +93 -0
- package/dist/attributes-5dYul0u0.js +13 -0
- package/dist/auth-link-BjFPqwLz.d.ts +97 -0
- package/dist/auth-link-DrDX9KOT.js +114 -0
- package/dist/authorization-BFCqamMs.d.ts +172 -0
- package/dist/before-route-CnR0C0Jr.js +30 -0
- package/dist/bind-Bu_ZNa3W.d.ts +62 -0
- package/dist/bind-l4kAvYSv.js +97 -0
- package/dist/block-events-CrT8r7Fe.js +76 -0
- package/dist/block-fields-GFkxl4dP.js +49 -0
- package/dist/block-fields-SJ6fEf3o.d.ts +31 -0
- package/dist/block-helpers-CKtbFcRv.d.ts +37 -0
- package/dist/block-helpers-DWHxHsEQ.js +190 -0
- package/dist/block-hooks-BmjMyXTa.js +114 -0
- package/dist/block-hooks-plbZ0AbJ.d.ts +107 -0
- package/dist/{kit-transport-DJlHQUBU.js → block-transport-BLr-ZgLc.js} +11 -7
- package/dist/block-transport-DvaoPuZ9.d.ts +48 -0
- package/dist/blocks/agents/index.d.ts +3 -0
- package/dist/blocks/agents/index.js +123 -0
- package/dist/blocks/ai-cache/index.d.ts +3 -0
- package/dist/blocks/ai-cache/index.js +3 -0
- package/dist/blocks/ai-chat/index.d.ts +31 -0
- package/dist/blocks/ai-chat/index.js +5 -0
- package/dist/blocks/ai-chat/react/index.d.ts +77 -0
- package/dist/blocks/ai-chat/react/index.js +387 -0
- package/dist/blocks/ai-chat/react/server.d.ts +16 -0
- package/dist/blocks/ai-chat/react/server.js +14 -0
- package/dist/blocks/ai-files/index.d.ts +14 -0
- package/dist/blocks/ai-files/index.js +3 -0
- package/dist/blocks/ai-providers/index.d.ts +7 -0
- package/dist/blocks/ai-providers/index.js +211 -0
- package/dist/blocks/ai-tasks/index.d.ts +3 -0
- package/dist/blocks/ai-tasks/index.js +203 -0
- package/dist/blocks/announcements/index.d.ts +3 -0
- package/dist/blocks/announcements/index.js +3 -0
- package/dist/blocks/announcements/react/index.d.ts +31 -0
- package/dist/blocks/announcements/react/index.js +86 -0
- package/dist/blocks/announcements/react/server.d.ts +6 -0
- package/dist/blocks/announcements/react/server.js +7 -0
- package/dist/blocks/api-keys/index.d.ts +35 -0
- package/dist/blocks/api-keys/index.js +334 -0
- package/dist/blocks/attachments/index.d.ts +210 -0
- package/dist/blocks/attachments/index.js +222 -0
- package/dist/blocks/audit/index.d.ts +366 -0
- package/dist/blocks/audit/index.js +714 -0
- package/dist/blocks/billing/index.d.ts +265 -0
- package/dist/blocks/billing/index.js +400 -0
- package/dist/blocks/comments/index.d.ts +200 -0
- package/dist/blocks/comments/index.js +207 -0
- package/dist/blocks/connectors/index.d.ts +3 -0
- package/dist/blocks/connectors/index.js +164 -0
- package/dist/blocks/data-lifecycle/index.d.ts +251 -0
- package/dist/blocks/data-lifecycle/index.js +353 -0
- package/dist/blocks/entitlements/index.d.ts +14 -0
- package/dist/blocks/entitlements/index.js +25 -0
- package/dist/blocks/flags/index.d.ts +226 -0
- package/dist/blocks/flags/index.js +282 -0
- package/dist/blocks/inbox/index.d.ts +6 -0
- package/dist/blocks/inbox/index.js +499 -0
- package/dist/blocks/inbox/react/index.d.ts +2 -0
- package/dist/blocks/inbox/react/index.js +225 -0
- package/dist/blocks/inbox/react/server.d.ts +10 -0
- package/dist/blocks/inbox/react/server.js +12 -0
- package/dist/blocks/index.d.ts +65 -0
- package/dist/blocks/index.js +77 -0
- package/dist/blocks/jobs/index.d.ts +297 -0
- package/dist/blocks/jobs/index.js +1051 -0
- package/dist/blocks/knowledge/index.d.ts +3 -0
- package/dist/blocks/knowledge/index.js +3 -0
- package/dist/blocks/memory/index.d.ts +8 -0
- package/dist/blocks/memory/index.js +289 -0
- package/dist/blocks/notifications/index.d.ts +297 -0
- package/dist/blocks/notifications/index.js +425 -0
- package/dist/blocks/notifications/react/index.d.ts +44 -0
- package/dist/blocks/notifications/react/index.js +67 -0
- package/dist/blocks/notifications/react/server.d.ts +6 -0
- package/dist/blocks/notifications/react/server.js +7 -0
- package/dist/blocks/onboarding/index.d.ts +3 -0
- package/dist/blocks/onboarding/index.js +64 -0
- package/dist/blocks/onboarding/react/index.d.ts +28 -0
- package/dist/blocks/onboarding/react/index.js +78 -0
- package/dist/blocks/onboarding/react/server.d.ts +7 -0
- package/dist/blocks/onboarding/react/server.js +7 -0
- package/dist/blocks/organizations/index.d.ts +241 -0
- package/dist/blocks/organizations/index.js +400 -0
- package/dist/blocks/outbox/index.d.ts +3 -0
- package/dist/blocks/outbox/index.js +266 -0
- package/dist/blocks/profiles/index.d.ts +40 -0
- package/dist/blocks/profiles/index.js +28 -0
- package/dist/blocks/push/index.d.ts +185 -0
- package/dist/blocks/push/index.js +258 -0
- package/dist/blocks/settings/index.d.ts +89 -0
- package/dist/blocks/settings/index.js +104 -0
- package/dist/blocks/sso/index.d.ts +198 -0
- package/dist/blocks/sso/index.js +1297 -0
- package/dist/blocks/usage/index.d.ts +4 -0
- package/dist/blocks/usage/index.js +233 -0
- package/dist/blocks/waitlist/index.d.ts +117 -0
- package/dist/blocks/waitlist/index.js +132 -0
- package/dist/blocks/webhooks/index.d.ts +304 -0
- package/dist/{webhooks → blocks/webhooks}/index.js +468 -148
- package/dist/blocks/workflow-builder/index.d.ts +21 -0
- package/dist/blocks/workflow-builder/index.js +5 -0
- package/dist/blocks/workflow-builder/react/index.d.ts +47 -0
- package/dist/blocks/workflow-builder/react/index.js +119 -0
- package/dist/blocks/workflow-builder/react/server.d.ts +8 -0
- package/dist/blocks/workflow-builder/react/server.js +11 -0
- package/dist/blocks/workflows/index.d.ts +3 -0
- package/dist/blocks/workflows/index.js +3 -0
- package/dist/blocks/workflows/react/index.d.ts +47 -0
- package/dist/blocks/workflows/react/index.js +137 -0
- package/dist/blocks/workflows/react/server.d.ts +8 -0
- package/dist/blocks/workflows/react/server.js +11 -0
- package/dist/{index-SaTsEfGP.d.ts → bucket-Cl46E3jS.d.ts} +134 -91
- package/dist/{simplify-_0oUKqCd.js → build-BXIzE6Xv.js} +222 -124
- package/dist/{channel-FQW-CnGR.d.ts → channel-_2Mx1Oyu.d.ts} +2 -2
- package/dist/channels-CkgQ_X60.js +114 -0
- package/dist/chat-sdk/index.d.ts +303 -0
- package/dist/chat-sdk/index.js +733 -0
- package/dist/chat-sdk/react/index.d.ts +2 -0
- package/dist/chat-sdk/react/index.js +3 -0
- package/dist/chat-sdk/react/server.d.ts +3 -0
- package/dist/chat-sdk/react/server.js +2 -0
- package/dist/claims-DDBQT6BK.js +61 -0
- package/dist/{claims-BAf6c7is.js → claims-PqzCxaTD.js} +39 -2
- package/dist/cli/bin.js +1 -1
- package/dist/cli/{codemod-DqV7612m.js → codemod-Bl_tQpHn.js} +105 -2
- package/dist/cli/config-B9HkL8nF.js +2 -0
- package/dist/cli/config-DU7EJImt.js +49 -0
- package/dist/cli/config-NiPxAmUF.js +1077 -0
- package/dist/cli/{dist-xn4wlboc.js → dist-DRAVaE6w.js} +111 -1
- package/dist/cli/{doctor-C_A-KEAz.js → doctor-B4JOm_ox.js} +991 -317
- package/dist/cli/{env-DmKv_G4A.js → env-CJLbUVPB.js} +1 -1
- package/dist/cli/{env-jIFUADLY.js → env-qXgyMV6r.js} +2 -2
- package/dist/cli/fresh-import-BeYf9I3x.js +40 -0
- package/dist/cli/gen-BGLb_zou.js +3100 -0
- package/dist/cli/gen-DAH8FM2W.js +2 -0
- package/dist/cli/index.d.ts +44 -5
- package/dist/cli/index.js +7 -7
- package/dist/cli/{init-DMa6M7hV.js → init-BIIwclPg.js} +242 -27
- package/dist/cli/{introspect-BKlaIu_M.js → introspect-DNUTuNvb.js} +5 -5
- package/dist/cli/{io-k41_z-jT.js → io-DI1mTdSA.js} +12 -3
- package/dist/cli/{keys-ByKHnvP9.js → keys-BGCnnb-s.js} +8 -6
- package/dist/cli/{ohash-D7bG_EOb.js → ohash-BjQY1cBb.js} +1 -1
- package/dist/cli/{openapi-Cp5Fyta-.js → openapi-BlRJ18s3.js} +2 -2
- package/dist/cli/{project-B_GeXyHh.js → project-DZRaBaY7.js} +11 -6
- package/dist/cli/read-sets-CETOSFx4.js +223 -0
- package/dist/cli/{run-Bo_NLT5n.js → run-DNWxHynX.js} +33 -23
- package/dist/cli/{seed-CUlqWh-8.js → seed-DQzqT7LP.js} +8 -6
- package/dist/cli/{skills-LJJIhLFR.js → skills-QQs4q68J.js} +3 -2
- package/dist/cli/sql-D0GUtUPp.js +536 -0
- package/dist/cli/{config-CPVpXP5I.js → supabase-toml-B-bIukQF.js} +72 -942
- package/dist/cli/typegen-version-DeFbtzYI.js +8 -0
- package/dist/cli/{version-BCtlgDQx.js → version-hr88OZG0.js} +1 -1
- package/dist/client/index.d.ts +3 -2
- package/dist/client/index.js +11 -71
- package/dist/client/native/index.d.ts +228 -0
- package/dist/client/native/index.js +361 -0
- package/dist/client-CI0Z2zWX.js +277 -0
- package/dist/cloud-event-BnmD5fb9.js +46 -0
- package/dist/cloud-event-C1JCc1bH.d.ts +50 -0
- package/dist/{compiler-BXH_aZ7N.d.ts → compiler-DY_wkj4R.d.ts} +2 -2
- package/dist/compose-BIBNgAnq.js +53 -0
- package/dist/composite-Bt1YK3Ke.d.ts +146 -0
- package/dist/composite-DhE66P5u.js +130 -0
- package/dist/config/index.d.ts +6 -4
- package/dist/config/index.js +5 -5
- package/dist/{config-Bv7gvfzC.d.ts → config-D44Y7PAv.d.ts} +406 -214
- package/dist/{config-DreERlKo.js → config-Dn7F5k9A.js} +62 -14
- package/dist/connector-Dv8kK0MO.d.ts +107 -0
- package/dist/connectors-hkLCwyEz.d.ts +120 -0
- package/dist/context-BCrWe7ow.d.ts +237 -0
- package/dist/credentials/index.d.ts +31 -0
- package/dist/credentials/index.js +168 -0
- package/dist/cron-DVPUg5k3.js +145 -0
- package/dist/csv-CPAzEmB6.js +25 -0
- package/dist/db-exception-CnWcYPxL.js +15 -0
- package/dist/{define-cNKzqwL_.js → define-B-TVjC25.js} +784 -227
- package/dist/{define-Bp_BZa5h.d.ts → define-CJJkkr1-.d.ts} +353 -61
- package/dist/edge/index.d.ts +69 -11
- package/dist/edge/index.js +191 -75
- package/dist/elysia/index.d.ts +59 -0
- package/dist/elysia/index.js +62 -0
- package/dist/embeddings-4ZvFzjsU.js +127 -0
- package/dist/embeddings-C9KGQnXt.d.ts +68 -0
- package/dist/{refresh-CFPX0Qft.d.ts → ended-jLfvw8h-.d.ts} +20 -2
- package/dist/{entitlements-BiJZ4t49.d.ts → entitlements-DHrY2UDZ.d.ts} +16 -7
- package/dist/entitlements-DRl6ZJUm.js +24 -0
- package/dist/envelope-DqnYGRw7.js +47 -0
- package/dist/{errors-DtwXa6b8.js → errors-B11Duf73.js} +82 -13
- package/dist/errors-DLjJHPLK.js +44 -0
- package/dist/escape-like-DHfx6jRr.js +7 -0
- package/dist/escape-like-ImTK0ps_.d.ts +15 -0
- package/dist/eve/index.d.ts +220 -0
- package/dist/eve/index.js +504 -0
- package/dist/eve-gT2Fpjut.d.ts +151 -0
- package/dist/events/index.d.ts +4 -3
- package/dist/events/index.js +9 -50
- package/dist/events-DWDhx77e.d.ts +549 -0
- package/dist/executor-Bq28caBo.js +718 -0
- package/dist/executor-C-R4pucm.js +83 -0
- package/dist/executor-CaWigTyR.d.ts +148 -0
- package/dist/executor-D14tGopJ.d.ts +36 -0
- package/dist/{executor-Cghdstwu.d.ts → executor-DbvExCFC.d.ts} +7 -1
- package/dist/{sql-Coh6n4cC.js → executor-De1Of3m3.js} +210 -11
- package/dist/executor-DvsBbNBS.d.ts +261 -0
- package/dist/expo/index.d.ts +79 -0
- package/dist/expo/index.js +129 -0
- package/dist/expo-sqlite/index.d.ts +58 -0
- package/dist/expo-sqlite/index.js +104 -0
- package/dist/field-errors-BFOa7WhB.d.ts +99 -0
- package/dist/field-errors-VF1yb8yI.js +13 -0
- package/dist/framework-CONDyPYx.js +51 -0
- package/dist/framework-DuVb4Xa8.d.ts +25 -0
- package/dist/gateway-C1ssRHnf.d.ts +130 -0
- package/dist/graph-BGyLLFLX.js +265 -0
- package/dist/h3/index.d.ts +59 -0
- package/dist/h3/index.js +55 -0
- package/dist/h3/v1/index.d.ts +63 -0
- package/dist/h3/v1/index.js +49 -0
- package/dist/history-BZih6SFP.js +64 -0
- package/dist/hono/index.d.ts +56 -7
- package/dist/hono/index.js +97 -45
- package/dist/{react-C_s7kiNz.js → hooks-1BTCJsiw.js} +104 -133
- package/dist/http-Cv4T29xh.js +40 -0
- package/dist/http-DdYadv-o.js +126 -0
- package/dist/image-url-pIVlO6R1.js +41 -0
- package/dist/{impersonation-BgSHAYLf.js → impersonation-DcqaTBHx.js} +21 -6
- package/dist/inbox-i7E1ppo6.d.ts +384 -0
- package/dist/index-ACiNPN4Z.d.ts +74 -0
- package/dist/{index-DgILJRXj.d.ts → index-Bepi-Hgg.d.ts} +91 -28
- package/dist/index-BkWT_uBO.d.ts +51 -0
- package/dist/index-BpFYMsi0.d.ts +53 -0
- package/dist/{index-C7f8cOBM.d.ts → index-Bxih3l0u.d.ts} +2 -2
- package/dist/index-CaxrMD1A.d.ts +1 -0
- package/dist/index-ClmjK_o-.d.ts +55 -0
- package/dist/index-CtuakVRc.d.ts +267 -0
- package/dist/index-D48jVS-N.d.ts +246 -0
- package/dist/index-DDrYaUcq.d.ts +138 -0
- package/dist/index-DQh4VCc9.d.ts +98 -0
- package/dist/{live-D9W2M5aO.d.ts → index-DunNRdnT.d.ts} +136 -38
- package/dist/index.d.ts +65 -18
- package/dist/index.js +42 -14
- package/dist/invalidate-BBqhpxyB.d.ts +19 -0
- package/dist/json-CEnpTHlZ.js +16 -0
- package/dist/json-schema-CvER4kgT.js +502 -0
- package/dist/keys-4MnkWTTh.js +35 -0
- package/dist/kit-B5tid-q5.d.ts +60 -0
- package/dist/kit-Fm-Fv7q5.js +78 -0
- package/dist/knowledge-BXBbT0Tr.d.ts +176 -0
- package/dist/knowledge-CDmiMLew.js +255 -0
- package/dist/lint/index.d.ts +1 -1
- package/dist/lint/index.js +37 -0
- package/dist/list/index.d.ts +3 -2
- package/dist/list/index.js +1 -444
- package/dist/{index-fag8VJZ2.d.ts → list-query-BRt-zDF7.d.ts} +20 -12
- package/dist/list-query-gl808ac1.js +459 -0
- package/dist/{live-CdJBOc4f.js → live-CTAZQkwl.js} +99 -14
- package/dist/logger-DWVYUmwi.d.ts +18 -0
- package/dist/mcp/index.d.ts +38 -11
- package/dist/mcp/index.js +82 -46
- package/dist/mcp/sdk/index.d.ts +105 -0
- package/dist/mcp/sdk/index.js +126 -0
- package/dist/message-CaKlqdsX.js +219 -0
- package/dist/message-CfDoR0Y6.d.ts +94 -0
- package/dist/messages-B9-5887d.js +715 -0
- package/dist/messages-DYP0sUTe.d.ts +59 -0
- package/dist/mfa-Daak8ukG.d.ts +54 -0
- package/dist/modules-DpPwzC7E.d.ts +192 -0
- package/dist/modules-dxrVK3ID.js +228 -0
- package/dist/nestjs/index.d.ts +68 -0
- package/dist/nestjs/index.js +164 -0
- package/dist/next/client/index.d.ts +35 -0
- package/dist/next/client/index.js +36 -0
- package/dist/next/image/index.js +3 -24
- package/dist/next/index.d.ts +150 -51
- package/dist/next/index.js +261 -107
- package/dist/node/index.d.ts +4 -0
- package/dist/node/index.js +210 -0
- package/dist/node-headers-AO06VhqH.d.ts +24 -0
- package/dist/node-headers-C71zNQHe.js +55 -0
- package/dist/nuxt/index.d.ts +60 -0
- package/dist/nuxt/index.js +64 -0
- package/dist/onboarding-BZGHYJks.d.ts +62 -0
- package/dist/openapi/index.d.ts +1 -1
- package/dist/openapi/index.js +3 -3
- package/dist/orpc/index.d.ts +70 -11
- package/dist/orpc/index.js +73 -24
- package/dist/otel/index.d.ts +7 -7
- package/dist/otel/index.js +87 -57
- package/dist/outbox-Cq7pPYvl.d.ts +161 -0
- package/dist/{plugin-o144f322.d.ts → plugin-FGY8UhYm.d.ts} +30 -10
- package/dist/plugin-tfXW1-qO.js +45 -0
- package/dist/plugins/actor/index.d.ts +2 -2
- package/dist/plugins/actor/index.js +3 -3
- package/dist/plugins/rules/index.d.ts +11 -4
- package/dist/plugins/rules/index.js +40 -13
- package/dist/plugins/soft-delete/index.d.ts +5 -4
- package/dist/plugins/soft-delete/index.js +10 -5
- package/dist/plugins/tenant/index.d.ts +2 -2
- package/dist/plugins/tenant/index.js +18 -11
- package/dist/plugins/timestamps/index.d.ts +5 -3
- package/dist/plugins/timestamps/index.js +6 -4
- package/dist/plugins/validation/index.d.ts +2 -2
- package/dist/plugins/validation/index.js +10 -6
- package/dist/{pool-C9voM4Kw.d.ts → pool-CAu2nLrL.d.ts} +2 -2
- package/dist/postgres/index.d.ts +4 -4
- package/dist/postgres/index.js +1 -2
- package/dist/{postgrest-CruYKAvV.d.ts → postgrest-BLVdEnfe.d.ts} +13 -3
- package/dist/powersync/index.d.ts +43 -0
- package/dist/powersync/index.js +199 -0
- package/dist/powersync/react/index.d.ts +87 -0
- package/dist/powersync/react/index.js +108 -0
- package/dist/{problem-BW1KhzSG.js → problem-BreOl8b8.js} +14 -3
- package/dist/{problem-Blxe8S31.d.ts → problem-DD8LZFjc.d.ts} +21 -3
- package/dist/provider-BH5UWZJ6.d.ts +113 -0
- package/dist/provider-Di3sRutW.js +57 -0
- package/dist/query/index.d.ts +4 -2
- package/dist/query/index.js +4 -3
- package/dist/{query-CCbo44lG.js → query-BQ-NaZon.js} +141 -24
- package/dist/{queue-BYUCjr59.d.ts → queue-CLJurhdy.d.ts} +258 -83
- package/dist/react/index.d.ts +11 -7
- package/dist/react/index.js +7 -3
- package/dist/react/native/index.d.ts +116 -0
- package/dist/react/native/index.js +130 -0
- package/dist/react/server.d.ts +28 -10
- package/dist/react/server.js +22 -5
- package/dist/react/session.d.ts +2 -2
- package/dist/react-4ZqkP8da.js +79 -0
- package/dist/react-F80mF4-t.js +409 -0
- package/dist/react-router/index.d.ts +83 -0
- package/dist/react-router/index.js +89 -0
- package/dist/react-topic-seAWjL3_.js +38 -0
- package/dist/{read-set-DQFt1N_Y.js → read-set-DuKWC9Mj.js} +67 -25
- package/dist/realtime/index.d.ts +4 -5
- package/dist/realtime/index.js +144 -82
- package/dist/refusal-CeJWxmkH.js +61 -0
- package/dist/refusal-D1rgbzNq.d.ts +15 -0
- package/dist/replicas-CwrYp5Zj.js +94 -0
- package/dist/{view-Bn6HNKUe.js → resolve-D_IcnvFd.js} +248 -240
- package/dist/{impersonation-BmePsuxz.d.ts → resolve-KW8nCeL6.d.ts} +29 -69
- package/dist/{resource-mqfJW4YF.js → resource-BsvzCMlX.js} +4 -4
- package/dist/{resource-DNRFP7KR.d.ts → resource-D6Uc7Sk7.d.ts} +5 -5
- package/dist/respond-BUgsXNgk.js +91 -0
- package/dist/respond-DoBijysA.d.ts +93 -0
- package/dist/result-D7y2fT87.d.ts +282 -0
- package/dist/{result-BKiliPY7.js → result-DzUbqgdW.js} +27 -2
- package/dist/run-state-CPo-1X2B.d.ts +12 -0
- package/dist/run-state-CgBKzYMW.js +13 -0
- package/dist/search-CUWCRYKL.js +9 -0
- package/dist/server/index.d.ts +143 -22
- package/dist/server/index.js +46 -14
- package/dist/{respond-BR1fJWOB.d.ts → server-CeVeeXwz.d.ts} +224 -85
- package/dist/session-ChiXDZdZ.d.ts +72 -0
- package/dist/shared-CBxosKK3.js +75 -0
- package/dist/{shared-D1dRUrAg.js → shared-CxWmcyqB.js} +2 -1
- package/dist/shared-DDSjEGDR.d.ts +11 -0
- package/dist/sign-in-BCV5S2WZ.d.ts +49 -0
- package/dist/sign-in-Cb1mwv6X.js +86 -0
- package/dist/{signers-Cc6r98SW.d.ts → signers-4y62_VIi.d.ts} +13 -9
- package/dist/simplify-DDO0j0LI.js +83 -0
- package/dist/solid/index.d.ts +131 -0
- package/dist/solid/index.js +344 -0
- package/dist/solid-start/index.d.ts +75 -0
- package/dist/solid-start/index.js +58 -0
- package/dist/{spec-pins-C3oc-Tdp.js → spec-pins--j6mTok4.js} +8 -1
- package/dist/{spec-pins-CqorWDnO.d.ts → spec-pins-C89s6DyW.d.ts} +7 -0
- package/dist/sql/index.d.ts +313 -212
- package/dist/sql/index.js +34872 -6579
- package/dist/ssr/index.d.ts +6 -5
- package/dist/ssr/index.js +3 -3
- package/dist/{standard-D7r6dMUu.js → standard-BK0cqJ7y.js} +4 -3
- package/dist/{standard-J4YgMOLm.d.ts → standard-CYsm7xpT.d.ts} +1 -1
- package/dist/stats-D_AD9GGu.js +1123 -0
- package/dist/storage/index.d.ts +5 -5
- package/dist/storage/index.js +1027 -368
- package/dist/store-BdH5ruDx.js +66 -0
- package/dist/store-CGjgWu5n.d.ts +68 -0
- package/dist/streams/index.d.ts +76 -0
- package/dist/streams/index.js +77 -0
- package/dist/streams/redis/index.d.ts +52 -0
- package/dist/streams/redis/index.js +185 -0
- package/dist/stripe-BMj5LtsT.js +38 -0
- package/dist/stripe-D04h-QBT.d.ts +136 -0
- package/dist/{support-wHnK6zp-.js → support-BivNqSpK.js} +32 -11
- package/dist/{support-view-B8SlToQX.d.ts → support-view-33Oi07TT.d.ts} +1 -1
- package/dist/svelte/index.d.ts +114 -0
- package/dist/svelte/index.js +344 -0
- package/dist/sveltekit/index.d.ts +116 -0
- package/dist/sveltekit/index.js +106 -0
- package/dist/tags-B99_U9Pp.js +39 -0
- package/dist/tags-Cx-LnIQP.d.ts +30 -0
- package/dist/tanstack-db/index.d.ts +71 -0
- package/dist/tanstack-db/index.js +72 -0
- package/dist/tanstack-start/index.d.ts +75 -0
- package/dist/tanstack-start/index.js +95 -0
- package/dist/tee-CoEppCER.js +101 -0
- package/dist/{template-TxrGI5jR.js → template--jDkl3UP.js} +34 -13
- package/dist/template-CwO38Do8.d.ts +6 -0
- package/dist/temporal-BJGitm-h.js +79 -0
- package/dist/{temporal-required-CAt4Dc9Z.js → temporal-required-BVvW7SYJ.js} +3 -2
- package/dist/tenant-I1TEZ_BX.js +27 -0
- package/dist/tenant-icPeuUBN.d.ts +17 -0
- package/dist/testing/index.d.ts +315 -41
- package/dist/testing/index.js +1046 -79
- package/dist/timing-CyTQPubY.js +92 -0
- package/dist/ttl-Hr34gRu8.js +12 -0
- package/dist/{types-Dnf_wRDz.d.ts → types-6BdhkmZe.d.ts} +111 -45
- package/dist/types-BI-0Sl2v.d.ts +359 -0
- package/dist/types-C05bxW-W.d.ts +220 -0
- package/dist/types-DGs5L0VN.d.ts +192 -0
- package/dist/types-TaiEeBGA.d.ts +156 -0
- package/dist/usage-CrvrL2vw.d.ts +177 -0
- package/dist/user-change-XzvgafU4.js +130 -0
- package/dist/vault-CSO7ss5C.d.ts +50 -0
- package/dist/vercel-connect/index.d.ts +47 -0
- package/dist/vercel-connect/index.js +119 -0
- package/dist/{verify-Ce49ETPz.js → verify-DL41hbvY.js} +85 -13
- package/dist/verify-DPuWngD4.d.ts +172 -0
- package/dist/{version-DOYTYwHP.js → version-Bvv6aLjZ.js} +1 -1
- package/dist/view-BeFcRV6G.js +99 -0
- package/dist/{view-CbgObAeb.d.ts → view-DbxLNu8L.d.ts} +22 -5
- package/dist/vue/index.d.ts +141 -0
- package/dist/vue/index.js +362 -0
- package/dist/watch-DI34G86j.d.ts +60 -0
- package/dist/watch-Xuxrvxq-.js +122 -0
- package/dist/{wire-D2dT86vi.js → wire-DtZQ4sdE.js} +15 -5
- package/dist/workflow-builder-DJ1oHn8g.js +398 -0
- package/dist/workflow-sdk/builder/index.d.ts +85 -0
- package/dist/workflow-sdk/builder/index.js +250 -0
- package/dist/workflow-sdk/index.d.ts +14 -0
- package/dist/workflow-sdk/index.js +3 -0
- package/dist/workflow-sdk/world/index.d.ts +107 -0
- package/dist/workflow-sdk/world/index.js +702 -0
- package/dist/workflow-sdk-B3yLD6Br.d.ts +98 -0
- package/dist/workflow-sdk-C2WJ_G2O.js +173 -0
- package/dist/workflow-sdk-world-D-prir6O.js +1397 -0
- package/dist/workflows-B0j9WKPu.d.ts +185 -0
- package/dist/workflows-wu1WWBn7.js +216 -0
- package/package.json +461 -20
- package/schemas/ai-message-v1.json +258 -0
- package/schemas/config-v1.json +1074 -140
- package/schemas/doctor-report-v1.json +20 -1
- package/schemas/snapshot-v2.json +8 -0
- package/skills/better-supabase/SKILL.md +41 -12
- package/skills/better-supabase/references/frontend.md +96 -0
- package/skills/better-supabase/references/plugins.md +10 -6
- package/skills/better-supabase/references/troubleshooting.md +2 -1
- package/skills/better-supabase-api/SKILL.md +76 -22
- package/skills/better-supabase-api/references/adapters.md +207 -0
- package/skills/better-supabase-api/references/ai.md +125 -0
- package/skills/better-supabase-api/references/expo.md +65 -0
- package/skills/better-supabase-api/references/powersync.md +35 -0
- package/skills/better-supabase-api/references/streams-credentials.md +105 -0
- package/skills/better-supabase-auth/SKILL.md +47 -11
- package/skills/better-supabase-auth/references/authorization-providers.md +51 -0
- package/skills/better-supabase-testing/SKILL.md +3 -1
- package/dist/cli/config-dtoekM0v.js +0 -2
- package/dist/cli/gen-CIdSQZad.js +0 -2
- package/dist/cli/gen-CjElD1Vw.js +0 -2241
- package/dist/cli/read-sets-VQcPgxU9.js +0 -436
- package/dist/cli/sql-CVx-1O8G.js +0 -373
- package/dist/entitlements-CTEBm7IB.js +0 -20
- package/dist/events-aIO7vsIk.d.ts +0 -230
- package/dist/executor-BunPOO-k.d.ts +0 -402
- package/dist/executor-XycESQPH.js +0 -94
- package/dist/index-CWMDdEr4.d.ts +0 -50
- package/dist/index-DOESKG27.d.ts +0 -100
- package/dist/index-DmXSxbLi.d.ts +0 -62
- package/dist/index-Dp2VDwog.d.ts +0 -161
- package/dist/jobs/index.d.ts +0 -226
- package/dist/jobs/index.js +0 -1007
- package/dist/json-schema-m1fiwKgN.js +0 -208
- package/dist/kit-events-CTFDfSwb.js +0 -60
- package/dist/kit-transport-B82k1djG.d.ts +0 -33
- package/dist/kits-CGLLrNPd.js +0 -157
- package/dist/mfa-Cu96oJdw.d.ts +0 -30
- package/dist/notifications/index.d.ts +0 -162
- package/dist/notifications/index.js +0 -264
- package/dist/orgs/index.d.ts +0 -132
- package/dist/orgs/index.js +0 -245
- package/dist/permdock-sql-C2Inc6Xc.d.ts +0 -29
- package/dist/permdock-sql-DgOfeixi.js +0 -51
- package/dist/plugin-DwARMuQp.js +0 -59
- package/dist/server-B1mZ7CgQ.js +0 -660
- package/dist/stats-Bqob3WqT.js +0 -592
- package/dist/support-CEPwlw2G.d.ts +0 -89
- package/dist/template-mbvlysOo.d.ts +0 -6
- package/dist/temporal-CVlIV2DZ.js +0 -40
- package/dist/user-change-CHFEUro1.js +0 -49
- package/dist/webhooks/index.d.ts +0 -285
- package/skills/better-supabase-auth/references/permdock.md +0 -122
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { n as decodeJwtPayload } from "./base64-D2gsioCY.js";
|
|
2
|
+
import { i as userContext } from "./impersonation-DcqaTBHx.js";
|
|
3
|
+
import { n as identityKey } from "./user-change-XzvgafU4.js";
|
|
4
|
+
import { n as createQueries } from "./query-BQ-NaZon.js";
|
|
5
|
+
//#region src/client/bind.ts
|
|
6
|
+
const LOADING = {
|
|
7
|
+
status: "loading",
|
|
8
|
+
user: null,
|
|
9
|
+
claims: null
|
|
10
|
+
};
|
|
11
|
+
const SIGNED_OUT = {
|
|
12
|
+
status: "signed-out",
|
|
13
|
+
user: null,
|
|
14
|
+
claims: null
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* `session.user`, or `undefined` when auth-js put its placeholder there: with
|
|
18
|
+
* `tokens-only` cookies and no user in `userStorage`, reading `id` throws.
|
|
19
|
+
*/
|
|
20
|
+
function storedUser(session) {
|
|
21
|
+
try {
|
|
22
|
+
return typeof session.user.id === "string" ? session.user : void 0;
|
|
23
|
+
} catch {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const text = (value) => typeof value === "string" && value !== "" ? value : void 0;
|
|
28
|
+
function snapshotOf(session) {
|
|
29
|
+
if (!session) return SIGNED_OUT;
|
|
30
|
+
const claims = decodeJwtPayload(session.access_token) ?? {};
|
|
31
|
+
const stored = storedUser(session);
|
|
32
|
+
const id = text(claims["sub"]) ?? stored?.id;
|
|
33
|
+
if (id === void 0) return SIGNED_OUT;
|
|
34
|
+
const email = text(claims["email"]) ?? text(stored?.email);
|
|
35
|
+
const role = text(claims["role"]) ?? text(stored?.role);
|
|
36
|
+
return {
|
|
37
|
+
status: "signed-in",
|
|
38
|
+
user: {
|
|
39
|
+
id,
|
|
40
|
+
...email ? { email } : {},
|
|
41
|
+
...role ? { role } : {}
|
|
42
|
+
},
|
|
43
|
+
claims
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function contextOf(snapshot) {
|
|
47
|
+
if (snapshot.status !== "signed-in") return {
|
|
48
|
+
actor: {
|
|
49
|
+
id: "anon",
|
|
50
|
+
kind: "anon",
|
|
51
|
+
role: "anon"
|
|
52
|
+
},
|
|
53
|
+
claims: { role: "anon" }
|
|
54
|
+
};
|
|
55
|
+
return userContext(snapshot.user, snapshot.claims);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Repositories that follow `supabase`'s session, TanStack Query options and
|
|
59
|
+
* an auth store, for a supabase-js client you created yourself.
|
|
60
|
+
*/
|
|
61
|
+
function bindClient(betterSupabase, supabase, options = {}) {
|
|
62
|
+
let snapshot = LOADING;
|
|
63
|
+
let db;
|
|
64
|
+
const listeners = /* @__PURE__ */ new Set();
|
|
65
|
+
const { data } = supabase.auth.onAuthStateChange((_event, session) => {
|
|
66
|
+
const next = snapshotOf(session);
|
|
67
|
+
if (next.status === snapshot.status && identityKey(next) === identityKey(snapshot)) return;
|
|
68
|
+
snapshot = next;
|
|
69
|
+
db = void 0;
|
|
70
|
+
for (const listener of listeners) listener();
|
|
71
|
+
});
|
|
72
|
+
const client = {
|
|
73
|
+
betterSupabase,
|
|
74
|
+
supabase,
|
|
75
|
+
get db() {
|
|
76
|
+
db ??= betterSupabase.connect(supabase, contextOf(snapshot));
|
|
77
|
+
return db;
|
|
78
|
+
},
|
|
79
|
+
queries: createQueries(betterSupabase, () => client.db, options.staleTime === void 0 ? {} : { staleTime: options.staleTime }),
|
|
80
|
+
dispose: () => {
|
|
81
|
+
data.subscription.unsubscribe();
|
|
82
|
+
listeners.clear();
|
|
83
|
+
},
|
|
84
|
+
auth: {
|
|
85
|
+
current: () => snapshot,
|
|
86
|
+
subscribe: (listener) => {
|
|
87
|
+
listeners.add(listener);
|
|
88
|
+
return () => {
|
|
89
|
+
listeners.delete(listener);
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
return client;
|
|
95
|
+
}
|
|
96
|
+
//#endregion
|
|
97
|
+
export { bindClient as t };
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { t as cloneValue } from "./clone-BfgmLU90.js";
|
|
2
|
+
import { s as nowInstant } from "./temporal-BJGitm-h.js";
|
|
3
|
+
//#region src/core/block-events.ts
|
|
4
|
+
/**
|
|
5
|
+
* Event types that changed name in 0.6, old to new, for sinks and consumers
|
|
6
|
+
* that still receive the old ones (`BLOCK_EVENT_RENAMES[type] ?? type`).
|
|
7
|
+
* `better-supabase codemod 0.6` rewrites the string literals.
|
|
8
|
+
*/
|
|
9
|
+
const BLOCK_EVENT_RENAMES = {
|
|
10
|
+
"org.created": "organization.created",
|
|
11
|
+
"org.updated": "organization.updated",
|
|
12
|
+
"org.deleted": "organization.deleted",
|
|
13
|
+
"org.member_added": "organization.member_added",
|
|
14
|
+
"org.member_removed": "organization.member_removed",
|
|
15
|
+
"org.member_left": "organization.member_left",
|
|
16
|
+
"org.role_changed": "organization.role_changed",
|
|
17
|
+
"org.ownership_transferred": "organization.ownership_transferred",
|
|
18
|
+
"org.switched": "organization.switched"
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Fixed OpenTelemetry attribute names for block work, so dashboards and
|
|
22
|
+
* queries can rely on them.
|
|
23
|
+
*/
|
|
24
|
+
const BLOCK_ATTRIBUTES = {
|
|
25
|
+
event: "better_supabase.block.event",
|
|
26
|
+
tenant: "better_supabase.tenant",
|
|
27
|
+
actor: "better_supabase.actor.id",
|
|
28
|
+
supportSessionId: "better_supabase.support.session_id",
|
|
29
|
+
organizationId: "better_supabase.organization.id",
|
|
30
|
+
invitationId: "better_supabase.invitation.id",
|
|
31
|
+
notificationType: "better_supabase.notification.type",
|
|
32
|
+
webhookEndpointId: "better_supabase.webhook.endpoint_id"
|
|
33
|
+
};
|
|
34
|
+
/** The `BLOCK_ATTRIBUTES` an event carries. */
|
|
35
|
+
function blockEventAttributes(event) {
|
|
36
|
+
const attributes = { [BLOCK_ATTRIBUTES.event]: event.type };
|
|
37
|
+
if (event.tenant) attributes[BLOCK_ATTRIBUTES.tenant] = event.tenant;
|
|
38
|
+
if (event.actorId) attributes[BLOCK_ATTRIBUTES.actor] = event.actorId;
|
|
39
|
+
const data = Object.fromEntries(Object.entries(event.data));
|
|
40
|
+
const add = (key, value) => {
|
|
41
|
+
if (typeof value === "string" && value.length > 0) attributes[key] = value;
|
|
42
|
+
};
|
|
43
|
+
add(BLOCK_ATTRIBUTES.supportSessionId, data["sessionId"]);
|
|
44
|
+
add(BLOCK_ATTRIBUTES.organizationId, data["organizationId"]);
|
|
45
|
+
add(BLOCK_ATTRIBUTES.invitationId, data["invitationId"]);
|
|
46
|
+
add(BLOCK_ATTRIBUTES.notificationType, data["type"]);
|
|
47
|
+
add(BLOCK_ATTRIBUTES.webhookEndpointId, data["endpointId"]);
|
|
48
|
+
return attributes;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Emits a block event on `events` with a copy of `data`. Does nothing without
|
|
52
|
+
* a `block` handler, so blocks call it unconditionally.
|
|
53
|
+
*/
|
|
54
|
+
function emitBlockEvent(events, type, data, meta = {}) {
|
|
55
|
+
if (!events.has("block")) return;
|
|
56
|
+
const event = {
|
|
57
|
+
...meta,
|
|
58
|
+
type,
|
|
59
|
+
data: cloneValue(data),
|
|
60
|
+
time: nowInstant()
|
|
61
|
+
};
|
|
62
|
+
events.emit("block", event);
|
|
63
|
+
}
|
|
64
|
+
const matches = (pattern, type) => pattern.endsWith(".*") ? type.startsWith(pattern.slice(0, -1)) : pattern === type;
|
|
65
|
+
/**
|
|
66
|
+
* Listens to the block events that match `pattern` (`'support.started'` or
|
|
67
|
+
* `'support.*'`). Returns a function that stops listening.
|
|
68
|
+
*/
|
|
69
|
+
function onBlockEvent(betterSupabase, pattern, handler) {
|
|
70
|
+
return betterSupabase.events.on("block", (event) => {
|
|
71
|
+
if (!matches(pattern, event.type)) return;
|
|
72
|
+
handler(event);
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
//#endregion
|
|
76
|
+
export { onBlockEvent as a, emitBlockEvent as i, BLOCK_EVENT_RENAMES as n, blockEventAttributes as r, BLOCK_ATTRIBUTES as t };
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { n as dbError } from "./errors-B11Duf73.js";
|
|
2
|
+
import { a as ok, r as err } from "./result-DzUbqgdW.js";
|
|
3
|
+
import { t as toIssues } from "./standard-BK0cqJ7y.js";
|
|
4
|
+
//#region src/core/block-fields.ts
|
|
5
|
+
const isObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
6
|
+
async function run(schema, value) {
|
|
7
|
+
return schema["~standard"].validate(value);
|
|
8
|
+
}
|
|
9
|
+
const invalid = (label, issues) => err(dbError("validation", `Invalid ${label}`, { issues }));
|
|
10
|
+
/**
|
|
11
|
+
* The `fields` helper block creators use. Without a schema, reads and
|
|
12
|
+
* writes pass through unchanged.
|
|
13
|
+
*/
|
|
14
|
+
function blockFields(schema, label) {
|
|
15
|
+
return {
|
|
16
|
+
async read(row) {
|
|
17
|
+
if (schema === void 0) return ok(row);
|
|
18
|
+
const outcome = await run(schema, row);
|
|
19
|
+
if (outcome.issues) return invalid(label, toIssues(outcome.issues));
|
|
20
|
+
if (!isObject(outcome.value)) return invalid(label, [{ message: "fields must parse to an object" }]);
|
|
21
|
+
return ok({
|
|
22
|
+
...row,
|
|
23
|
+
...outcome.value
|
|
24
|
+
});
|
|
25
|
+
},
|
|
26
|
+
async write(attrs) {
|
|
27
|
+
if (schema === void 0) return ok(attrs);
|
|
28
|
+
const outcome = await run(schema, attrs);
|
|
29
|
+
if (!outcome.issues) {
|
|
30
|
+
if (!isObject(outcome.value)) return ok(attrs);
|
|
31
|
+
const parsed = outcome.value;
|
|
32
|
+
const picked = Object.fromEntries(Object.keys(attrs).filter((key) => key in parsed).map((key) => [key, parsed[key]]));
|
|
33
|
+
return ok({
|
|
34
|
+
...attrs,
|
|
35
|
+
...picked
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
const given = new Set(Object.keys(attrs));
|
|
39
|
+
const relevant = toIssues(outcome.issues).filter((issue) => {
|
|
40
|
+
const [first] = issue.path ?? [];
|
|
41
|
+
return first === void 0 || given.has(String(first));
|
|
42
|
+
});
|
|
43
|
+
if (relevant.length === 0) return ok(attrs);
|
|
44
|
+
return invalid(label, relevant);
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
//#endregion
|
|
49
|
+
export { blockFields as t };
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { f as Result } from "./result-D7y2fT87.js";
|
|
2
|
+
import { t as StandardSchemaV1 } from "./standard-CYsm7xpT.js";
|
|
3
|
+
//#region src/core/block-fields.d.ts
|
|
4
|
+
/** The fields a `fields` schema adds, or none when the block has no schema. */
|
|
5
|
+
type FieldsOf<S> = S extends StandardSchemaV1<unknown, infer O> ? O extends object ? O : never : Record<never, never>;
|
|
6
|
+
/**
|
|
7
|
+
* Parses and validates the extra fields an app adds to a block's table,
|
|
8
|
+
* with any Standard Schema (zod, valibot, arktype) for an object.
|
|
9
|
+
*/
|
|
10
|
+
interface BlockFields<T extends object> {
|
|
11
|
+
/**
|
|
12
|
+
* Parses a row the block read: the schema's output replaces the fields it
|
|
13
|
+
* covers, and the other fields stay as read. A row the schema rejects is
|
|
14
|
+
* a `validation` error.
|
|
15
|
+
*/
|
|
16
|
+
read<R extends object>(row: R): Promise<Result<R & T>>;
|
|
17
|
+
/**
|
|
18
|
+
* Validates the fields a write sets. Issues about fields the write leaves
|
|
19
|
+
* out are ignored, so partial updates pass; the database applies its
|
|
20
|
+
* defaults and `not null` checks. A rejected write is a `validation`
|
|
21
|
+
* error, and nothing is sent to the database.
|
|
22
|
+
*/
|
|
23
|
+
write<A extends object>(attrs: A): Promise<Result<A>>;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* The `fields` helper block creators use. Without a schema, reads and
|
|
27
|
+
* writes pass through unchanged.
|
|
28
|
+
*/
|
|
29
|
+
declare function blockFields<T extends object = Record<never, never>>(schema: StandardSchemaV1 | undefined, label: string): BlockFields<T>;
|
|
30
|
+
//#endregion
|
|
31
|
+
export { FieldsOf as n, blockFields as r, BlockFields as t };
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { t as AsyncResult, w as ErrorMapper } from "./result-D7y2fT87.js";
|
|
2
|
+
import { t as BlockTransport } from "./block-transport-DvaoPuZ9.js";
|
|
3
|
+
//#region src/core/block-helpers.d.ts
|
|
4
|
+
/** The `temporal` option every block creator takes. */
|
|
5
|
+
interface BlockTemporalOptions {
|
|
6
|
+
/**
|
|
7
|
+
* The Temporal namespace for runtimes without a global one, such as
|
|
8
|
+
* `import { Temporal } from "temporal-polyfill"`. Blocks use it instead of
|
|
9
|
+
* `globalThis.Temporal`, which stays untouched; like
|
|
10
|
+
* `defineSupabase(schema, { temporal })`, it applies to the whole process.
|
|
11
|
+
*/
|
|
12
|
+
readonly temporal?: typeof Temporal;
|
|
13
|
+
}
|
|
14
|
+
/** The options every block creator shares. */
|
|
15
|
+
interface BlockOptions extends BlockTemporalOptions {
|
|
16
|
+
/** `sqlTransport(ctx.postgres)` for members, or `rpcTransport` over an API schema. */
|
|
17
|
+
readonly transport: BlockTransport;
|
|
18
|
+
/** The transport for service-only calls (jobs, purges). Defaults to `transport`. */
|
|
19
|
+
readonly service?: BlockTransport;
|
|
20
|
+
/** The module's schema, or its API schema. Default `better_supabase`. */
|
|
21
|
+
readonly schema?: string;
|
|
22
|
+
/** Error mappers that run before the built-in ones. */
|
|
23
|
+
readonly mappers?: readonly ErrorMapper[];
|
|
24
|
+
}
|
|
25
|
+
/** Calls one block function and maps a rejection to a `DbError`. */
|
|
26
|
+
type BlockCall = <T>(fn: string, args: Readonly<Record<string, unknown>>, then: (value: unknown) => T | Promise<T>) => AsyncResult<T>;
|
|
27
|
+
/**
|
|
28
|
+
* One page of a list. `cursor` is the previous page's `next` cursor or last
|
|
29
|
+
* item, in the shape each list documents.
|
|
30
|
+
*/
|
|
31
|
+
interface CursorPageOptions<Cursor> {
|
|
32
|
+
/** The most items to return. Each list documents its default and maximum. */
|
|
33
|
+
readonly limit?: number;
|
|
34
|
+
readonly cursor?: Cursor;
|
|
35
|
+
}
|
|
36
|
+
//#endregion
|
|
37
|
+
export { CursorPageOptions as i, BlockOptions as n, BlockTemporalOptions as r, BlockCall as t };
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { c as mapDbError, n as dbError } from "./errors-B11Duf73.js";
|
|
2
|
+
import { l as provideTemporal } from "./temporal-BJGitm-h.js";
|
|
3
|
+
import { t as temporal } from "./temporal-required-BVvW7SYJ.js";
|
|
4
|
+
import { a as ok, r as err, s as toDbError, t as AsyncResult } from "./result-DzUbqgdW.js";
|
|
5
|
+
import { t as fromPgError } from "./executor-De1Of3m3.js";
|
|
6
|
+
import { t as rawError } from "./block-transport-BLr-ZgLc.js";
|
|
7
|
+
//#region src/core/block-helpers.ts
|
|
8
|
+
/** Provides `options.temporal`, when set, for the block's time values. */
|
|
9
|
+
function applyTemporal(options) {
|
|
10
|
+
if (options?.temporal !== void 0) provideTemporal(options.temporal);
|
|
11
|
+
}
|
|
12
|
+
/** The block schema when the options name none. */
|
|
13
|
+
const DEFAULT_BLOCK_SCHEMA = "better_supabase";
|
|
14
|
+
/** A `BlockCall` over `transport`, in `schema`, with the app's error mappers first. */
|
|
15
|
+
function blockCall(transport, schema = DEFAULT_BLOCK_SCHEMA, mappers = []) {
|
|
16
|
+
return (fn, args, then) => AsyncResult.from(async () => {
|
|
17
|
+
let value;
|
|
18
|
+
try {
|
|
19
|
+
value = await transport.call(schema, fn, args);
|
|
20
|
+
} catch (cause) {
|
|
21
|
+
const raw = rawError(cause);
|
|
22
|
+
return err(raw ? mapDbError(raw, mappers) : toDbError(cause));
|
|
23
|
+
}
|
|
24
|
+
return ok(await then(value));
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
28
|
+
const textOf = (value) => typeof value === "string" ? value : String(value);
|
|
29
|
+
const optionalText = (value) => value === null || value === void 0 ? void 0 : textOf(value);
|
|
30
|
+
/** A function result that must be an object. */
|
|
31
|
+
function recordOf(value, fn) {
|
|
32
|
+
if (!isRecord(value)) throw new TypeError(`${fn} returned ${JSON.stringify(value)}`);
|
|
33
|
+
return value;
|
|
34
|
+
}
|
|
35
|
+
/** A function result that must be an array of objects. */
|
|
36
|
+
function recordsOf(value, fn) {
|
|
37
|
+
if (value === null || value === void 0) return [];
|
|
38
|
+
if (!Array.isArray(value) || !value.every(isRecord)) throw new TypeError(`${fn} returned ${JSON.stringify(value)}`);
|
|
39
|
+
return value;
|
|
40
|
+
}
|
|
41
|
+
const stringsOf = (value) => Array.isArray(value) ? value.map(textOf) : [];
|
|
42
|
+
/** `value` when it is one of `values`, otherwise `fallback`. */
|
|
43
|
+
function oneOf(value, values, fallback) {
|
|
44
|
+
return values.find((item) => item === value) ?? fallback;
|
|
45
|
+
}
|
|
46
|
+
/** `value` when it is one of `values`; throws for anything else. */
|
|
47
|
+
function enumOrThrow(value, values, what) {
|
|
48
|
+
const found = values.find((item) => item === value);
|
|
49
|
+
if (found === void 0) throw new TypeError(`unknown ${what} "${String(value)}"`);
|
|
50
|
+
return found;
|
|
51
|
+
}
|
|
52
|
+
/** A jsonb object column, or an empty object for anything else. */
|
|
53
|
+
const recordOrEmpty = (value) => isRecord(value) ? value : {};
|
|
54
|
+
/** A `credential_ref` column, or `undefined` when it names no provider. */
|
|
55
|
+
function credentialRefOf(value) {
|
|
56
|
+
if (!isRecord(value) || typeof value["provider"] !== "string") return;
|
|
57
|
+
return {
|
|
58
|
+
...value,
|
|
59
|
+
provider: value["provider"]
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/** The `not_found` error a block returns for a row the caller can't see. */
|
|
63
|
+
const notFoundError = (message, hint) => dbError("not_found", message, hint === void 0 ? {} : { hint });
|
|
64
|
+
/** A `timestamptz` from jsonb or `pg`, or `undefined` for null. */
|
|
65
|
+
const optionalInstant = (value) => value === null || value === void 0 ? void 0 : value instanceof Date || typeof value === "string" ? toInstant(value) : void 0;
|
|
66
|
+
/** A `timestamptz` that must be there; throws when it is null or missing. */
|
|
67
|
+
function requiredInstant(value, field) {
|
|
68
|
+
const instant = optionalInstant(value);
|
|
69
|
+
if (instant === void 0) throw new TypeError(`${field} is missing`);
|
|
70
|
+
return instant;
|
|
71
|
+
}
|
|
72
|
+
/** An optional `timestamptz` as text for a function argument. */
|
|
73
|
+
const instantArg = (value) => value === void 0 ? void 0 : value === null ? null : value.toString();
|
|
74
|
+
/** SHA-256 of `value` as lowercase hex, with WebCrypto. */
|
|
75
|
+
async function sha256Hex(value) {
|
|
76
|
+
const digest = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(value));
|
|
77
|
+
return [...new Uint8Array(digest)].map((byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
78
|
+
}
|
|
79
|
+
/** `bytes` random bytes as base64url, for secrets and codes. */
|
|
80
|
+
function randomToken(bytes = 24) {
|
|
81
|
+
const data = crypto.getRandomValues(new Uint8Array(bytes));
|
|
82
|
+
let binary = "";
|
|
83
|
+
for (const byte of data) binary += String.fromCodePoint(byte);
|
|
84
|
+
return btoa(binary).replaceAll("+", "-").replaceAll("/", "_").replace(/=+$/, "");
|
|
85
|
+
}
|
|
86
|
+
function asDbError(cause) {
|
|
87
|
+
const raw = fromPgError(cause);
|
|
88
|
+
return raw ? mapDbError(raw) : toDbError(cause);
|
|
89
|
+
}
|
|
90
|
+
function run(fn) {
|
|
91
|
+
return AsyncResult.from(async () => {
|
|
92
|
+
try {
|
|
93
|
+
return ok(await fn());
|
|
94
|
+
} catch (cause) {
|
|
95
|
+
return err(asDbError(cause));
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* The request body as text, or `undefined` once it is longer than `limit`
|
|
101
|
+
* bytes. A larger `Content-Length` is refused before reading; otherwise
|
|
102
|
+
* reading stops at the limit, so a body without one can't fill memory.
|
|
103
|
+
*/
|
|
104
|
+
async function readBodyCapped(request, limit) {
|
|
105
|
+
const length = Number(request.headers.get("content-length") ?? NaN);
|
|
106
|
+
if (Number.isFinite(length) && length > limit) return void 0;
|
|
107
|
+
if (!request.body) return "";
|
|
108
|
+
const reader = request.body.getReader();
|
|
109
|
+
const chunks = [];
|
|
110
|
+
let size = 0;
|
|
111
|
+
for (;;) {
|
|
112
|
+
const { done, value } = await reader.read();
|
|
113
|
+
if (done) break;
|
|
114
|
+
size += value.byteLength;
|
|
115
|
+
if (size > limit) {
|
|
116
|
+
reader.cancel().catch(() => void 0);
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
chunks.push(value);
|
|
120
|
+
}
|
|
121
|
+
const bytes = new Uint8Array(size);
|
|
122
|
+
let offset = 0;
|
|
123
|
+
for (const chunk of chunks) {
|
|
124
|
+
bytes.set(chunk, offset);
|
|
125
|
+
offset += chunk.byteLength;
|
|
126
|
+
}
|
|
127
|
+
return new TextDecoder().decode(bytes);
|
|
128
|
+
}
|
|
129
|
+
function seconds(value) {
|
|
130
|
+
return typeof value === "number" ? `${String(value)} seconds` : value;
|
|
131
|
+
}
|
|
132
|
+
function workerId() {
|
|
133
|
+
return `worker-${crypto.randomUUID().slice(0, 8)}`;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Runs `fn` over `items` with at most `limit` calls in flight. After the
|
|
137
|
+
* first rejection no new item starts; the ones running finish, then it
|
|
138
|
+
* rethrows.
|
|
139
|
+
*/
|
|
140
|
+
async function eachLimit(items, limit, fn) {
|
|
141
|
+
let next = 0;
|
|
142
|
+
let failure;
|
|
143
|
+
const lane = async () => {
|
|
144
|
+
while (failure === void 0 && next < items.length) {
|
|
145
|
+
const index = next++;
|
|
146
|
+
try {
|
|
147
|
+
await fn(items[index], index);
|
|
148
|
+
} catch (cause) {
|
|
149
|
+
failure ??= { cause };
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
await Promise.all(Array.from({ length: Math.min(Math.max(1, limit), items.length) }, lane));
|
|
154
|
+
if (failure) throw failure.cause;
|
|
155
|
+
}
|
|
156
|
+
const sleep = (ms, signal) => new Promise((resolve) => {
|
|
157
|
+
if (signal?.aborted) {
|
|
158
|
+
resolve();
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
const timer = setTimeout(done, ms);
|
|
162
|
+
function done() {
|
|
163
|
+
clearTimeout(timer);
|
|
164
|
+
signal?.removeEventListener("abort", done);
|
|
165
|
+
resolve();
|
|
166
|
+
}
|
|
167
|
+
signal?.addEventListener("abort", done, { once: true });
|
|
168
|
+
});
|
|
169
|
+
/** pgmq and the inbox return `timestamptz` as text over RPC and as `Date` from `pg`. */
|
|
170
|
+
const toInstant = (value) => value instanceof Date ? temporal().Instant.fromEpochMilliseconds(value.getTime()) : temporal().Instant.from(value);
|
|
171
|
+
function errorText(error) {
|
|
172
|
+
if (error instanceof Error) return error.message;
|
|
173
|
+
if (typeof error === "object" && error !== null && "message" in error) return String(error.message);
|
|
174
|
+
return String(error);
|
|
175
|
+
}
|
|
176
|
+
function injectableOf(what, value) {
|
|
177
|
+
if (value === void 0) return void 0;
|
|
178
|
+
const version = value.apiVersion;
|
|
179
|
+
if (version !== void 0 && version !== 1) throw new TypeError(`${what} targets API ${String(version)}; this better-supabase supports 1. Upgrade better-supabase or use a release built for API 1.`);
|
|
180
|
+
return value;
|
|
181
|
+
}
|
|
182
|
+
/** Reads `limit` and `cursor` from a list's options. */
|
|
183
|
+
function pageOf(options = {}) {
|
|
184
|
+
return {
|
|
185
|
+
limit: options.limit,
|
|
186
|
+
cursor: options.cursor
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
//#endregion
|
|
190
|
+
export { workerId as A, run as C, stringsOf as D, sleep as E, textOf as O, requiredInstant as S, sha256Hex as T, randomToken as _, credentialRefOf as a, recordOrEmpty as b, errorText as c, isRecord as d, notFoundError as f, pageOf as g, optionalText as h, blockCall as i, toInstant as k, injectableOf as l, optionalInstant as m, applyTemporal as n, eachLimit as o, oneOf as p, asDbError as r, enumOrThrow as s, DEFAULT_BLOCK_SCHEMA as t, instantArg as u, readBodyCapped as v, seconds as w, recordsOf as x, recordOf as y };
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { n as dbError, o as isDbError } from "./errors-B11Duf73.js";
|
|
2
|
+
import { r as err, t as AsyncResult } from "./result-DzUbqgdW.js";
|
|
3
|
+
import { t as consoleLogger } from "./logger-glM28NVN.js";
|
|
4
|
+
import { i as blockCall } from "./block-helpers-DWHxHsEQ.js";
|
|
5
|
+
//#region src/core/block-hooks.ts
|
|
6
|
+
const isPlainObject = (value) => {
|
|
7
|
+
const proto = Object.getPrototypeOf(value);
|
|
8
|
+
return proto === Object.prototype || proto === null;
|
|
9
|
+
};
|
|
10
|
+
/** A copy of plain objects and arrays; class instances (Temporal values) are immutable and stay shared. */
|
|
11
|
+
function copyOf(value) {
|
|
12
|
+
if (Array.isArray(value)) return value.map(copyOf);
|
|
13
|
+
if (typeof value === "object" && value !== null && isPlainObject(value)) return Object.fromEntries(Object.entries(value).map(([key, entry]) => [key, copyOf(entry)]));
|
|
14
|
+
return value;
|
|
15
|
+
}
|
|
16
|
+
/** A new client with the same methods: a spread for object literals, a child object otherwise. */
|
|
17
|
+
function cloneClient(client) {
|
|
18
|
+
if (isPlainObject(client)) return { ...client };
|
|
19
|
+
return Object.create(client);
|
|
20
|
+
}
|
|
21
|
+
/** The client's method named `name`, or undefined when it has none. */
|
|
22
|
+
function methodOf(client, name) {
|
|
23
|
+
const value = client[name];
|
|
24
|
+
if (typeof value !== "function") return void 0;
|
|
25
|
+
return value;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Runs `hooks` around a block client's methods. Use it to add a rule the
|
|
29
|
+
* block doesn't know (refuse `invite` above a seat limit), rewrite arguments
|
|
30
|
+
* (fill a default), or observe results (metrics, an audit line). Methods
|
|
31
|
+
* without hooks are unchanged.
|
|
32
|
+
*
|
|
33
|
+
* ```ts
|
|
34
|
+
* const orgs = withBlockHooks(createOrganizations(options), {
|
|
35
|
+
* invite: { before: ([input]) => (input.role === "owner" ? dbError("forbidden", "Owners are added by support") : undefined) },
|
|
36
|
+
* });
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
function withBlockHooks(client, hooks, options = {}) {
|
|
40
|
+
if (hooks === void 0) return client;
|
|
41
|
+
const block = options.block ?? "block";
|
|
42
|
+
const logger = options.logger ?? consoleLogger;
|
|
43
|
+
const wrapped = cloneClient(client);
|
|
44
|
+
for (const [method, hook] of Object.entries(hooks)) {
|
|
45
|
+
if (hook === void 0) continue;
|
|
46
|
+
const original = methodOf(client, method);
|
|
47
|
+
if (original === void 0) throw new TypeError(`better-supabase: ${block} has no method "${method}" to hook`);
|
|
48
|
+
const { before, after } = hook;
|
|
49
|
+
const info = {
|
|
50
|
+
block,
|
|
51
|
+
method
|
|
52
|
+
};
|
|
53
|
+
wrapped[method] = (...args) => AsyncResult.from(async () => {
|
|
54
|
+
let current = args;
|
|
55
|
+
if (before) {
|
|
56
|
+
const outcome = await before(current, info);
|
|
57
|
+
if (isDbError(outcome)) return err(outcome);
|
|
58
|
+
if (Array.isArray(outcome)) current = outcome;
|
|
59
|
+
}
|
|
60
|
+
const result = await original.apply(client, current);
|
|
61
|
+
if (after) try {
|
|
62
|
+
await after(copyOf(result), current, info);
|
|
63
|
+
} catch (cause) {
|
|
64
|
+
logger.error(`${block}.${method} after hook threw`, { cause });
|
|
65
|
+
}
|
|
66
|
+
return result;
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
return wrapped;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Adds methods to a block client. The builder gets the base client, so a
|
|
73
|
+
* new method can compose existing ones, and `call` for SQL functions the
|
|
74
|
+
* app adds to the block's schema. Redefining a base method throws: wrap it
|
|
75
|
+
* with `withBlockHooks` instead.
|
|
76
|
+
*
|
|
77
|
+
* ```ts
|
|
78
|
+
* const orgs = extendBlock(createOrganizations(options), (base, { call }) => ({
|
|
79
|
+
* archive: (id: string) => call("archive_organization", { id }, () => undefined),
|
|
80
|
+
* }), { transport: options.transport });
|
|
81
|
+
* ```
|
|
82
|
+
*/
|
|
83
|
+
function extendBlock(client, build, options = {}) {
|
|
84
|
+
const { transport } = options;
|
|
85
|
+
const additions = build(client, { call: transport ? blockCall(transport, options.schema ?? "better_supabase", options.mappers ?? []) : () => AsyncResult.err(dbError("unsupported", "extendBlock needs the transport option to call SQL functions")) });
|
|
86
|
+
const taken = Object.keys(additions).filter((key) => key in client);
|
|
87
|
+
if (taken.length > 0) throw new TypeError(`better-supabase: extendBlock can't redefine ${taken.map((key) => `"${key}"`).join(", ")}; wrap a base method with withBlockHooks instead`);
|
|
88
|
+
return Object.assign(cloneClient(client), additions);
|
|
89
|
+
}
|
|
90
|
+
/** Fills in `apiVersion: 1`. */
|
|
91
|
+
function defineTransportMiddleware(middleware) {
|
|
92
|
+
return {
|
|
93
|
+
...middleware,
|
|
94
|
+
apiVersion: 1
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* A transport that runs `middleware` around `transport`, the first one
|
|
99
|
+
* outermost. Throws when a middleware targets an API other than 1.
|
|
100
|
+
*/
|
|
101
|
+
function wrapTransport(transport, ...middleware) {
|
|
102
|
+
for (const entry of middleware) {
|
|
103
|
+
const version = entry.apiVersion;
|
|
104
|
+
if (version !== 1) throw new TypeError(`better-supabase: transport middleware "${entry.name}" targets API ${String(version)}; this better-supabase supports 1`);
|
|
105
|
+
}
|
|
106
|
+
const run = middleware.reduceRight((next, entry) => (request) => entry.call(request, next), (request) => transport.call(request.schema, request.fn, request.args));
|
|
107
|
+
return { call: (schema, fn, args) => run({
|
|
108
|
+
schema,
|
|
109
|
+
fn,
|
|
110
|
+
args
|
|
111
|
+
}) };
|
|
112
|
+
}
|
|
113
|
+
//#endregion
|
|
114
|
+
export { wrapTransport as i, extendBlock as n, withBlockHooks as r, defineTransportMiddleware as t };
|