better-supabase 0.5.1 → 0.6.1
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-CHnPkCPd.js +1160 -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 +224 -0
- package/dist/blocks/attachments/index.js +234 -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 +259 -0
- package/dist/blocks/data-lifecycle/index.js +358 -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-BMqBgM3X.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-4JlOwgWG.js +2 -0
- package/dist/cli/gen-DeuDgPxN.js +3100 -0
- package/dist/cli/index.d.ts +44 -5
- package/dist/cli/index.js +7 -7
- package/dist/cli/{init-DMa6M7hV.js → init-C7Xd0Kda.js} +242 -27
- package/dist/cli/{introspect-BKlaIu_M.js → introspect-CSnMJ94U.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-C8tnlHSb.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-C_4JwyiM.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-CLqs9-OA.js +130 -0
- package/dist/composite-pSfeJNce.d.ts +146 -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-CdPDPpFs.d.ts +25 -0
- package/dist/framework-xjTBoyBB.js +51 -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-C6DWVEVG.d.ts} +237 -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 +34924 -6609
- 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-view-B8SlToQX.d.ts → support-view-33Oi07TT.d.ts} +1 -1
- package/dist/{support-wHnK6zp-.js → support-zIa1URaN.js} +32 -11
- 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-CQt77F3T.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,141 @@
|
|
|
1
|
+
import { b as DbError } from "../result-D7y2fT87.js";
|
|
2
|
+
import { it as QuerySpec } from "../define-CJJkkr1-.js";
|
|
3
|
+
import { n as TemplateValues } from "../template-CwO38Do8.js";
|
|
4
|
+
import { t as AuthSnapshot } from "../bind-Bu_ZNa3W.js";
|
|
5
|
+
import { t as AuthSession } from "../view-DbxLNu8L.js";
|
|
6
|
+
import { S as Topic, f as PresenceMember, u as EventSchemas, w as TopicHandlers, x as SubscriptionStatus } from "../index-DunNRdnT.js";
|
|
7
|
+
import { t as SupportView } from "../support-view-33Oi07TT.js";
|
|
8
|
+
import { a as BroadcastOptions, c as LiveCountSource, d as PresenceTopic, f as UseActionOptions, i as ActionState, l as LiveQueryHookOptions, n as ActionInputOf, o as ClientLike, r as ActionResultOf, s as LiveCountHookOptions, t as fieldErrorsOf, u as PresenceHookOptions } from "../field-errors-BFOa7WhB.js";
|
|
9
|
+
import { SupabaseClient } from "@supabase/supabase-js";
|
|
10
|
+
import { App, ComputedRef, MaybeRefOrGetter, Ref } from "vue";
|
|
11
|
+
import { StandardSchemaV1 } from "@standard-schema/spec";
|
|
12
|
+
import { QueryClient } from "@tanstack/query-core";
|
|
13
|
+
//#region src/vue/index.d.ts
|
|
14
|
+
export interface BetterSupabaseVueOptions {
|
|
15
|
+
/** better-supabase queries are reset when the user signs out or changes. */
|
|
16
|
+
readonly queryClient?: QueryClient;
|
|
17
|
+
}
|
|
18
|
+
export interface BetterSupabasePlugin {
|
|
19
|
+
install(app: App): void;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* The Vue plugin: provides the client to the composables and, with a
|
|
23
|
+
* `queryClient`, resets better-supabase queries when the caller changes.
|
|
24
|
+
*
|
|
25
|
+
* ```ts
|
|
26
|
+
* app.use(VueQueryPlugin, { queryClient }).use(betterSupabase(bs, { queryClient }));
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export declare function betterSupabase(client: ClientLike, options?: BetterSupabaseVueOptions): BetterSupabasePlugin;
|
|
30
|
+
/** The session state for UI: `loading`, `signed-out` or `signed-in` with the user and claims. */
|
|
31
|
+
export declare function useAuth(): Readonly<Ref<AuthSnapshot>>;
|
|
32
|
+
export declare function useSupabase(): SupabaseClient;
|
|
33
|
+
/**
|
|
34
|
+
* Shares a server-verified session (from `useAsyncData`, a loader or a
|
|
35
|
+
* prop) with the components below.
|
|
36
|
+
*/
|
|
37
|
+
export declare function provideSession(session: MaybeRefOrGetter<AuthSession>): void;
|
|
38
|
+
/** The session from the nearest `provideSession()`. */
|
|
39
|
+
export declare function useSession<C = unknown, P = unknown>(): ComputedRef<AuthSession<C, P>>;
|
|
40
|
+
/** The support session the page renders in, or `undefined` for a normal session. */
|
|
41
|
+
export declare function useSupportSession(): ComputedRef<SupportView | undefined>;
|
|
42
|
+
/** The claims type of a client's `betterSupabase.claims(schema)`, `unknown` without one. */
|
|
43
|
+
export type ClaimsOf<B extends ClientLike> = B["betterSupabase"] extends {
|
|
44
|
+
readonly claimsSchema: StandardSchemaV1<unknown, infer C> | undefined;
|
|
45
|
+
} ? C : unknown;
|
|
46
|
+
/** The profile type of a client's `betterSupabase.userMetadata(schema)`, `unknown` without one. */
|
|
47
|
+
export type ProfileOf<B extends ClientLike> = B["betterSupabase"] extends {
|
|
48
|
+
readonly userMetadataSchema: StandardSchemaV1<unknown, infer P> | undefined;
|
|
49
|
+
} ? P : unknown;
|
|
50
|
+
export interface BetterComposables<B extends ClientLike> {
|
|
51
|
+
/** Repositories bound to the current session. */
|
|
52
|
+
readonly useDb: () => B["db"];
|
|
53
|
+
/** TanStack Query option factories: `useQuery(useQueries().customers.findMany())`. */
|
|
54
|
+
readonly useQueries: () => B["queries"];
|
|
55
|
+
readonly useSupabase: () => SupabaseClient;
|
|
56
|
+
readonly useAuth: () => Readonly<Ref<AuthSnapshot>>;
|
|
57
|
+
readonly useSession: () => ComputedRef<AuthSession<ClaimsOf<B>, ProfileOf<B>>>;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Composables typed for your schema.
|
|
61
|
+
*
|
|
62
|
+
* ```ts
|
|
63
|
+
* export const { useDb, useQueries, useAuth } = createBindings<typeof bs>();
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
export declare function createBindings<B extends ClientLike>(): BetterComposables<B>;
|
|
67
|
+
/**
|
|
68
|
+
* Subscribes to a topic while the component is mounted. A `null` value
|
|
69
|
+
* pauses. It resubscribes when the topic values or the signed-in user change.
|
|
70
|
+
*
|
|
71
|
+
* ```ts
|
|
72
|
+
* useBroadcast(customersTopic, () => ({ organizationId: org.value }), {}, { invalidate: ['customers'] });
|
|
73
|
+
* ```
|
|
74
|
+
*/
|
|
75
|
+
export declare function useBroadcast<P extends string, E extends EventSchemas>(topic: Topic<P, E>, values: MaybeRefOrGetter<TemplateValues<P> | null | undefined>, handlers?: TopicHandlers<E>, options?: BroadcastOptions): Readonly<Ref<SubscriptionStatus>>;
|
|
76
|
+
/**
|
|
77
|
+
* Keeps a query fresh: invalidates every cached query that read a table the
|
|
78
|
+
* spec touches whenever one of them changes. A `null` spec pauses.
|
|
79
|
+
*
|
|
80
|
+
* ```ts
|
|
81
|
+
* const spec = computed(() => betterSupabase.spec.customers.findMany({ where: { orgId: org.value } }));
|
|
82
|
+
* useLiveQuery(spec);
|
|
83
|
+
* ```
|
|
84
|
+
*/
|
|
85
|
+
export declare function useLiveQuery(spec: MaybeRefOrGetter<QuerySpec | null | undefined>, options?: LiveQueryHookOptions): Readonly<Ref<SubscriptionStatus>>;
|
|
86
|
+
export interface LiveCount {
|
|
87
|
+
/** `undefined` until the first count arrives. */
|
|
88
|
+
readonly count: number | undefined;
|
|
89
|
+
readonly status: SubscriptionStatus;
|
|
90
|
+
/** The last failed refetch; the previous count stays. */
|
|
91
|
+
readonly error: DbError | undefined;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* A count that stays current: refetches only the `count` spec after each
|
|
95
|
+
* debounced change to a table it reads. Takes a spec or a `bs.liveCount()`
|
|
96
|
+
* seed; `null` pauses. The returned object's fields are reactive.
|
|
97
|
+
*
|
|
98
|
+
* ```ts
|
|
99
|
+
* const unread = useLiveCount(() => betterSupabase.spec.messages.count({ where: { read: false } }));
|
|
100
|
+
* // {{ unread.count }}
|
|
101
|
+
* ```
|
|
102
|
+
*/
|
|
103
|
+
export declare function useLiveCount(source: MaybeRefOrGetter<LiveCountSource>, options?: LiveCountHookOptions): LiveCount;
|
|
104
|
+
export interface Presence<I, O> {
|
|
105
|
+
/** Everyone on the topic, this client included, from the last sync. */
|
|
106
|
+
readonly members: readonly PresenceMember<O>[];
|
|
107
|
+
readonly status: SubscriptionStatus;
|
|
108
|
+
/** Shares a state now; the `state` option tracks one for you. */
|
|
109
|
+
readonly track: (state: I) => Promise<DbError | undefined>;
|
|
110
|
+
readonly untrack: () => Promise<DbError | undefined>;
|
|
111
|
+
}
|
|
112
|
+
export interface VuePresenceOptions<I> extends Omit<PresenceHookOptions<I>, "state"> {
|
|
113
|
+
readonly state?: MaybeRefOrGetter<I | null | undefined>;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Joins a presence topic while mounted and returns who is on it. A `null`
|
|
117
|
+
* value pauses. The returned object's fields are reactive.
|
|
118
|
+
*
|
|
119
|
+
* ```ts
|
|
120
|
+
* const room = usePresence(roomTopic, () => ({ roomId: id.value }), { state: () => ({ name: name.value }) });
|
|
121
|
+
* ```
|
|
122
|
+
*/
|
|
123
|
+
export declare function usePresence<P extends string, I, O>(topic: PresenceTopic<P, I, O>, values: MaybeRefOrGetter<TemplateValues<P> | null | undefined>, options?: VuePresenceOptions<I>): Presence<I, O>;
|
|
124
|
+
export interface ActionHandle<I, T> extends ActionState<I, T> {
|
|
125
|
+
/** Runs the action; resolves with its result. */
|
|
126
|
+
readonly run: (input: I) => Promise<ActionResultOf<T>>;
|
|
127
|
+
readonly reset: () => void;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Calls a server action from an event handler: tracks pending inputs and
|
|
131
|
+
* the last result, and calls `onSuccess` or `onError`. The returned
|
|
132
|
+
* object's fields are reactive.
|
|
133
|
+
*
|
|
134
|
+
* ```ts
|
|
135
|
+
* const remove = useAction(removeMember, { onError: (e) => toast.error(e.message) });
|
|
136
|
+
* // <button :disabled="remove.pending" @click="remove.run({ userId })">
|
|
137
|
+
* ```
|
|
138
|
+
*/
|
|
139
|
+
export declare function useAction<I, T>(action: (input: I) => Promise<ActionResultOf<T>>, options?: UseActionOptions<ActionInputOf<I>, T>): ActionHandle<ActionInputOf<I>, T>;
|
|
140
|
+
//#endregion
|
|
141
|
+
export { type ActionInputOf, type ActionResultOf, type ActionState, type AuthSession, type AuthSnapshot, type BroadcastOptions, type ClientLike, type LiveCountHookOptions, type LiveCountSource, type LiveQueryHookOptions, type PresenceHookOptions, type PresenceTopic, type SupportView, type UseActionOptions, fieldErrorsOf };
|
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
import { t as clearOnUserChange } from "../user-change-XzvgafU4.js";
|
|
2
|
+
import { t as supportOf } from "../support-view-g4YLBeqX.js";
|
|
3
|
+
import { t as fieldErrorsOf } from "../field-errors-VF1yb8yI.js";
|
|
4
|
+
import { a as createActionRunner, c as liveKey, d as shownCount, f as startBroadcast, i as countSource, l as notJoined, m as startLiveQuery, n as assertInvalidateClient, o as joinPresence, p as startLiveCount, r as callerOf, s as keyed, t as NO_COUNT, u as plainCaller } from "../client-CI0Z2zWX.js";
|
|
5
|
+
import { computed, getCurrentInstance, getCurrentScope, inject, onMounted, onScopeDispose, provide, readonly, shallowRef, toValue, watch } from "vue";
|
|
6
|
+
//#region src/vue/index.ts
|
|
7
|
+
const CLIENT = Symbol("better-supabase");
|
|
8
|
+
const SESSION = Symbol("better-supabase-session");
|
|
9
|
+
/**
|
|
10
|
+
* The Vue plugin: provides the client to the composables and, with a
|
|
11
|
+
* `queryClient`, resets better-supabase queries when the caller changes.
|
|
12
|
+
*
|
|
13
|
+
* ```ts
|
|
14
|
+
* app.use(VueQueryPlugin, { queryClient }).use(betterSupabase(bs, { queryClient }));
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
function betterSupabase(client, options = {}) {
|
|
18
|
+
return { install(app) {
|
|
19
|
+
const auth = shallowRef(client.auth.current());
|
|
20
|
+
const stops = [client.auth.subscribe(() => {
|
|
21
|
+
auth.value = client.auth.current();
|
|
22
|
+
})];
|
|
23
|
+
if (options.queryClient) stops.push(clearOnUserChange(options.queryClient, client.auth));
|
|
24
|
+
app.onUnmount(() => {
|
|
25
|
+
for (const stop of stops) stop();
|
|
26
|
+
});
|
|
27
|
+
app.provide(CLIENT, {
|
|
28
|
+
client,
|
|
29
|
+
queryClient: options.queryClient,
|
|
30
|
+
auth: readonly(auth)
|
|
31
|
+
});
|
|
32
|
+
} };
|
|
33
|
+
}
|
|
34
|
+
function useContext() {
|
|
35
|
+
const context = inject(CLIENT, null);
|
|
36
|
+
if (!context) throw new Error("better-supabase: install the plugin with app.use(betterSupabase(bs))");
|
|
37
|
+
return context;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Runs `start` on mount in a component, at once elsewhere (an effect
|
|
41
|
+
* scope), and never during server rendering.
|
|
42
|
+
*/
|
|
43
|
+
function onClient(start) {
|
|
44
|
+
if (getCurrentInstance()) onMounted(start);
|
|
45
|
+
else start();
|
|
46
|
+
}
|
|
47
|
+
/** The session state for UI: `loading`, `signed-out` or `signed-in` with the user and claims. */
|
|
48
|
+
function useAuth() {
|
|
49
|
+
return useContext().auth;
|
|
50
|
+
}
|
|
51
|
+
function useSupabase() {
|
|
52
|
+
return useContext().client.supabase;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Shares a server-verified session (from `useAsyncData`, a loader or a
|
|
56
|
+
* prop) with the components below.
|
|
57
|
+
*/
|
|
58
|
+
function provideSession(session) {
|
|
59
|
+
provide(SESSION, session);
|
|
60
|
+
}
|
|
61
|
+
/** The session from the nearest `provideSession()`. */
|
|
62
|
+
function useSession() {
|
|
63
|
+
const session = inject(SESSION, null);
|
|
64
|
+
if (session === null) throw new Error("better-supabase: useSession() needs provideSession(session) in a parent component");
|
|
65
|
+
return computed(() => toValue(session));
|
|
66
|
+
}
|
|
67
|
+
/** The support session the page renders in, or `undefined` for a normal session. */
|
|
68
|
+
function useSupportSession() {
|
|
69
|
+
const session = useSession();
|
|
70
|
+
return computed(() => supportOf(session.value));
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Composables typed for your schema.
|
|
74
|
+
*
|
|
75
|
+
* ```ts
|
|
76
|
+
* export const { useDb, useQueries, useAuth } = createBindings<typeof bs>();
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
function createBindings() {
|
|
80
|
+
return {
|
|
81
|
+
useDb: () => useContext().client.db,
|
|
82
|
+
useQueries: () => useContext().client.queries,
|
|
83
|
+
useSupabase,
|
|
84
|
+
useAuth,
|
|
85
|
+
useSession
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
/** The caller a subscription runs as: the plugin's auth, or a plain client's. */
|
|
89
|
+
function useCaller(context, client) {
|
|
90
|
+
if (context && client === void 0) return computed(() => callerOf(context.auth.value));
|
|
91
|
+
const supabase = client ?? context?.client.supabase;
|
|
92
|
+
if (!supabase) throw new Error("better-supabase: no supabase client");
|
|
93
|
+
const store = plainCaller(supabase);
|
|
94
|
+
const caller = shallowRef(store.current());
|
|
95
|
+
onClient(() => {
|
|
96
|
+
const stop = store.subscribe(() => {
|
|
97
|
+
caller.value = store.current();
|
|
98
|
+
});
|
|
99
|
+
onScopeDispose(stop);
|
|
100
|
+
});
|
|
101
|
+
return caller;
|
|
102
|
+
}
|
|
103
|
+
function supabaseFor(hook, context, client) {
|
|
104
|
+
const supabase = client ?? context?.client.supabase;
|
|
105
|
+
if (!supabase) throw new Error(`better-supabase: ${hook} needs app.use(betterSupabase(bs)) or { client: supabase }`);
|
|
106
|
+
return supabase;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Subscribes to a topic while the component is mounted. A `null` value
|
|
110
|
+
* pauses. It resubscribes when the topic values or the signed-in user change.
|
|
111
|
+
*
|
|
112
|
+
* ```ts
|
|
113
|
+
* useBroadcast(customersTopic, () => ({ organizationId: org.value }), {}, { invalidate: ['customers'] });
|
|
114
|
+
* ```
|
|
115
|
+
*/
|
|
116
|
+
function useBroadcast(topic, values, handlers, options) {
|
|
117
|
+
const context = inject(CLIENT, null);
|
|
118
|
+
const supabase = supabaseFor("useBroadcast", context, options?.client);
|
|
119
|
+
const queryClient = options?.queryClient ?? context?.queryClient;
|
|
120
|
+
assertInvalidateClient("useBroadcast", options, queryClient);
|
|
121
|
+
const caller = useCaller(context, options?.client);
|
|
122
|
+
const status = shallowRef("closed");
|
|
123
|
+
const run = keyed();
|
|
124
|
+
const key = computed(() => {
|
|
125
|
+
const current = toValue(values);
|
|
126
|
+
if (!current || caller.value.status === "loading") return null;
|
|
127
|
+
return JSON.stringify([topic.topic(current), caller.value.userId]);
|
|
128
|
+
});
|
|
129
|
+
onClient(() => {
|
|
130
|
+
watch(key, (next) => {
|
|
131
|
+
run.update(next, () => {
|
|
132
|
+
const current = toValue(values);
|
|
133
|
+
if (!current) return;
|
|
134
|
+
return startBroadcast({
|
|
135
|
+
supabase,
|
|
136
|
+
topic,
|
|
137
|
+
name: topic.topic(current),
|
|
138
|
+
latest: () => ({
|
|
139
|
+
handlers,
|
|
140
|
+
options
|
|
141
|
+
}),
|
|
142
|
+
queryClient,
|
|
143
|
+
onStatus: (next) => {
|
|
144
|
+
status.value = next;
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
}, { immediate: true });
|
|
149
|
+
onScopeDispose(run.stop);
|
|
150
|
+
});
|
|
151
|
+
return readonly(status);
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Keeps a query fresh: invalidates every cached query that read a table the
|
|
155
|
+
* spec touches whenever one of them changes. A `null` spec pauses.
|
|
156
|
+
*
|
|
157
|
+
* ```ts
|
|
158
|
+
* const spec = computed(() => betterSupabase.spec.customers.findMany({ where: { orgId: org.value } }));
|
|
159
|
+
* useLiveQuery(spec);
|
|
160
|
+
* ```
|
|
161
|
+
*/
|
|
162
|
+
function useLiveQuery(spec, options = {}) {
|
|
163
|
+
const { client, queryClient, auth } = useContext();
|
|
164
|
+
const status = shallowRef("closed");
|
|
165
|
+
const run = keyed();
|
|
166
|
+
let joined = null;
|
|
167
|
+
const key = computed(() => {
|
|
168
|
+
const current = toValue(spec);
|
|
169
|
+
if (current && !queryClient) throw new Error("better-supabase: useLiveQuery needs betterSupabase(bs, { queryClient })");
|
|
170
|
+
return liveKey(client, current, auth.value, options);
|
|
171
|
+
});
|
|
172
|
+
onClient(() => {
|
|
173
|
+
watch(key, (next) => {
|
|
174
|
+
run.update(next, () => {
|
|
175
|
+
const current = toValue(spec);
|
|
176
|
+
if (!current || !queryClient || next === null) return;
|
|
177
|
+
const resumed = joined === next;
|
|
178
|
+
joined = next;
|
|
179
|
+
return startLiveQuery({
|
|
180
|
+
client,
|
|
181
|
+
queryClient,
|
|
182
|
+
spec: current,
|
|
183
|
+
auth: auth.value,
|
|
184
|
+
options,
|
|
185
|
+
resumed,
|
|
186
|
+
onStatus: (value) => {
|
|
187
|
+
status.value = value;
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
});
|
|
191
|
+
}, { immediate: true });
|
|
192
|
+
onScopeDispose(run.stop);
|
|
193
|
+
});
|
|
194
|
+
return readonly(status);
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* A count that stays current: refetches only the `count` spec after each
|
|
198
|
+
* debounced change to a table it reads. Takes a spec or a `bs.liveCount()`
|
|
199
|
+
* seed; `null` pauses. The returned object's fields are reactive.
|
|
200
|
+
*
|
|
201
|
+
* ```ts
|
|
202
|
+
* const unread = useLiveCount(() => betterSupabase.spec.messages.count({ where: { read: false } }));
|
|
203
|
+
* // {{ unread.count }}
|
|
204
|
+
* ```
|
|
205
|
+
*/
|
|
206
|
+
function useLiveCount(source, options = {}) {
|
|
207
|
+
const { client, auth } = useContext();
|
|
208
|
+
const status = shallowRef("closed");
|
|
209
|
+
const state = shallowRef(NO_COUNT);
|
|
210
|
+
const run = keyed();
|
|
211
|
+
let joined = null;
|
|
212
|
+
const parsed = computed(() => countSource(toValue(source), options));
|
|
213
|
+
const key = computed(() => liveKey(client, parsed.value.spec, auth.value, options));
|
|
214
|
+
onClient(() => {
|
|
215
|
+
watch(key, (next) => {
|
|
216
|
+
run.update(next, () => {
|
|
217
|
+
const { spec, initial, seedAt } = parsed.value;
|
|
218
|
+
if (!spec || next === null) return;
|
|
219
|
+
const previous = joined?.key === next ? joined : null;
|
|
220
|
+
joined = {
|
|
221
|
+
key: next,
|
|
222
|
+
at: previous?.at ?? seedAt ?? 0
|
|
223
|
+
};
|
|
224
|
+
return startLiveCount({
|
|
225
|
+
client,
|
|
226
|
+
spec,
|
|
227
|
+
key: next,
|
|
228
|
+
auth: auth.value,
|
|
229
|
+
options,
|
|
230
|
+
immediate: initial === void 0 && !previous,
|
|
231
|
+
since: previous ? previous.at : seedAt,
|
|
232
|
+
onState: (update) => {
|
|
233
|
+
state.value = update(state.value);
|
|
234
|
+
if (joined?.key === next) joined = {
|
|
235
|
+
key: next,
|
|
236
|
+
at: state.value.at
|
|
237
|
+
};
|
|
238
|
+
},
|
|
239
|
+
onStatus: (value) => {
|
|
240
|
+
status.value = value;
|
|
241
|
+
}
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
}, { immediate: true });
|
|
245
|
+
onScopeDispose(run.stop);
|
|
246
|
+
});
|
|
247
|
+
const shown = computed(() => shownCount(state.value, key.value, parsed.value));
|
|
248
|
+
return {
|
|
249
|
+
get count() {
|
|
250
|
+
return shown.value.count;
|
|
251
|
+
},
|
|
252
|
+
get status() {
|
|
253
|
+
return status.value;
|
|
254
|
+
},
|
|
255
|
+
get error() {
|
|
256
|
+
return shown.value.error;
|
|
257
|
+
}
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
const NO_MEMBERS = [];
|
|
261
|
+
/**
|
|
262
|
+
* Joins a presence topic while mounted and returns who is on it. A `null`
|
|
263
|
+
* value pauses. The returned object's fields are reactive.
|
|
264
|
+
*
|
|
265
|
+
* ```ts
|
|
266
|
+
* const room = usePresence(roomTopic, () => ({ roomId: id.value }), { state: () => ({ name: name.value }) });
|
|
267
|
+
* ```
|
|
268
|
+
*/
|
|
269
|
+
function usePresence(topic, values, options = {}) {
|
|
270
|
+
const context = inject(CLIENT, null);
|
|
271
|
+
const supabase = supabaseFor("usePresence", context, options.client);
|
|
272
|
+
const caller = useCaller(context, options.client);
|
|
273
|
+
const members = shallowRef(NO_MEMBERS);
|
|
274
|
+
const status = shallowRef("closed");
|
|
275
|
+
let join;
|
|
276
|
+
const run = keyed();
|
|
277
|
+
const key = computed(() => {
|
|
278
|
+
const current = toValue(values);
|
|
279
|
+
if (!current || caller.value.status === "loading") return null;
|
|
280
|
+
return JSON.stringify([topic.topic(current), caller.value.userId]);
|
|
281
|
+
});
|
|
282
|
+
onClient(() => {
|
|
283
|
+
watch(key, (next) => {
|
|
284
|
+
run.update(next, () => {
|
|
285
|
+
const current = toValue(values);
|
|
286
|
+
if (!current) return;
|
|
287
|
+
const joined = joinPresence(supabase, topic, topic.topic(current), {
|
|
288
|
+
onStatus: (value) => {
|
|
289
|
+
status.value = value;
|
|
290
|
+
},
|
|
291
|
+
onPresence: (value) => {
|
|
292
|
+
members.value = value;
|
|
293
|
+
}
|
|
294
|
+
});
|
|
295
|
+
if (!joined) return;
|
|
296
|
+
join = joined;
|
|
297
|
+
joined.sync(toValue(options.state));
|
|
298
|
+
return () => {
|
|
299
|
+
join = void 0;
|
|
300
|
+
members.value = NO_MEMBERS;
|
|
301
|
+
status.value = "closed";
|
|
302
|
+
joined.leave();
|
|
303
|
+
};
|
|
304
|
+
});
|
|
305
|
+
}, { immediate: true });
|
|
306
|
+
watch(() => JSON.stringify(toValue(options.state)), () => join?.sync(toValue(options.state)));
|
|
307
|
+
onScopeDispose(run.stop);
|
|
308
|
+
});
|
|
309
|
+
return {
|
|
310
|
+
get members() {
|
|
311
|
+
return members.value;
|
|
312
|
+
},
|
|
313
|
+
get status() {
|
|
314
|
+
return status.value;
|
|
315
|
+
},
|
|
316
|
+
track: (state) => join?.track(state) ?? notJoined(),
|
|
317
|
+
untrack: () => join?.untrack() ?? notJoined()
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Calls a server action from an event handler: tracks pending inputs and
|
|
322
|
+
* the last result, and calls `onSuccess` or `onError`. The returned
|
|
323
|
+
* object's fields are reactive.
|
|
324
|
+
*
|
|
325
|
+
* ```ts
|
|
326
|
+
* const remove = useAction(removeMember, { onError: (e) => toast.error(e.message) });
|
|
327
|
+
* // <button :disabled="remove.pending" @click="remove.run({ userId })">
|
|
328
|
+
* ```
|
|
329
|
+
*/
|
|
330
|
+
function useAction(action, options = {}) {
|
|
331
|
+
const call = action;
|
|
332
|
+
const runner = createActionRunner(() => ({
|
|
333
|
+
action: call,
|
|
334
|
+
options
|
|
335
|
+
}));
|
|
336
|
+
const state = shallowRef(runner.current());
|
|
337
|
+
const stop = runner.subscribe(() => {
|
|
338
|
+
state.value = runner.current();
|
|
339
|
+
});
|
|
340
|
+
if (getCurrentScope()) onScopeDispose(stop);
|
|
341
|
+
return {
|
|
342
|
+
run: runner.run,
|
|
343
|
+
reset: runner.reset,
|
|
344
|
+
get pending() {
|
|
345
|
+
return state.value.pending;
|
|
346
|
+
},
|
|
347
|
+
get pendingInputs() {
|
|
348
|
+
return state.value.pendingInputs;
|
|
349
|
+
},
|
|
350
|
+
get pendingInput() {
|
|
351
|
+
return state.value.pendingInput;
|
|
352
|
+
},
|
|
353
|
+
get data() {
|
|
354
|
+
return state.value.data;
|
|
355
|
+
},
|
|
356
|
+
get error() {
|
|
357
|
+
return state.value.error;
|
|
358
|
+
}
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
//#endregion
|
|
362
|
+
export { betterSupabase, createBindings, fieldErrorsOf, provideSession, useAction, useAuth, useBroadcast, useLiveCount, useLiveQuery, usePresence, useSession, useSupabase, useSupportSession };
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { f as Result } from "./result-D7y2fT87.js";
|
|
2
|
+
import { L as TableKey, P as SchemaMeta, a as AnyModels, i as AnyFunctions } from "./types-6BdhkmZe.js";
|
|
3
|
+
import { t as BetterSupabase } from "./define-CJJkkr1-.js";
|
|
4
|
+
import { i as ListDefinition } from "./list-query-BRt-zDF7.js";
|
|
5
|
+
import { c as SqliteCompilerOptions, p as SqlitePlan, t as PowerSyncDatabaseLike } from "./executor-CaWigTyR.js";
|
|
6
|
+
import { t as Compiler } from "./compiler-DY_wkj4R.js";
|
|
7
|
+
//#region src/powersync/compiler.d.ts
|
|
8
|
+
declare const sqliteCompiler: Compiler<SqlitePlan>;
|
|
9
|
+
/**
|
|
10
|
+
* Compiles every operation a list definition runs (the page, its count and
|
|
11
|
+
* the facet counts) for SQLite, without a database. Returns the first
|
|
12
|
+
* `unsupported` or `invalid_request` error, so a test or a dev build fails
|
|
13
|
+
* before a native screen does.
|
|
14
|
+
*
|
|
15
|
+
* ```ts
|
|
16
|
+
* expect(await checkSqlite(betterSupabase, customerList)).toEqual({ ok: true, data: undefined });
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
declare function checkSqlite<M extends AnyModels, D, F extends AnyFunctions, E, T extends TableKey<M>, S extends string, Fa extends string, C extends boolean, P extends "offset" | "cursor">(betterSupabase: BetterSupabase<M, D, F, E>, list: ListDefinition<M, T, E, S, Fa, C, P>, options?: SqliteCompilerOptions): Promise<Result<undefined>>;
|
|
20
|
+
//#endregion
|
|
21
|
+
//#region src/powersync/watch.d.ts
|
|
22
|
+
interface WatchOptions<T> {
|
|
23
|
+
/** SQLite tables whose changes rerun the query (`sqliteTables()` maps app keys). */
|
|
24
|
+
readonly tables: readonly string[];
|
|
25
|
+
/** Called with the first result, then after every change to `tables`. */
|
|
26
|
+
readonly onResult: (result: Result<T>) => void;
|
|
27
|
+
readonly signal?: AbortSignal;
|
|
28
|
+
/** The least time between two runs. Defaults to PowerSync's 30 ms. */
|
|
29
|
+
readonly throttleMs?: number;
|
|
30
|
+
/**
|
|
31
|
+
* Keeps unchanged rows' object identity across runs and skips `onResult`
|
|
32
|
+
* when a run returns what the last one did. Defaults to true.
|
|
33
|
+
*/
|
|
34
|
+
readonly structuralSharing?: boolean;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Reruns a repository call whenever PowerSync reports a change to one of
|
|
38
|
+
* `tables`: local writes and synced rows alike. The same call works with
|
|
39
|
+
* lists, aggregates and single rows. Unchanged rows keep their identity
|
|
40
|
+
* between runs, and a run that changes nothing calls no `onResult`. Returns
|
|
41
|
+
* a function that stops it.
|
|
42
|
+
*
|
|
43
|
+
* ```ts
|
|
44
|
+
* const stop = watch(powersync, () => customerList.run(db, query), {
|
|
45
|
+
* tables: ['customers'],
|
|
46
|
+
* onResult: (page) => render(page),
|
|
47
|
+
* });
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
declare function watch<T>(db: PowerSyncDatabaseLike, query: () => PromiseLike<Result<T>>, options: WatchOptions<T>): () => void;
|
|
51
|
+
/**
|
|
52
|
+
* The SQLite table names of app table keys (`customerTags` to
|
|
53
|
+
* `customer_tags`). Pass the executor's `tableName` when it renames tables,
|
|
54
|
+
* so `watch` listens to the names the queries read.
|
|
55
|
+
*/
|
|
56
|
+
declare function sqliteTables(betterSupabase: {
|
|
57
|
+
readonly meta: SchemaMeta;
|
|
58
|
+
}, keys: readonly string[], options?: SqliteCompilerOptions): string[];
|
|
59
|
+
//#endregion
|
|
60
|
+
export { sqliteCompiler as a, checkSqlite as i, sqliteTables as n, watch as r, WatchOptions as t };
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { n as isPlainObject } from "./clone-BfgmLU90.js";
|
|
2
|
+
import { r as err, s as toDbError } from "./result-DzUbqgdW.js";
|
|
3
|
+
//#region src/core/share.ts
|
|
4
|
+
function sameValue(prev, next) {
|
|
5
|
+
if (Object.is(prev, next)) return true;
|
|
6
|
+
if (typeof prev !== "object" || typeof next !== "object") return false;
|
|
7
|
+
if (prev === null || next === null) return false;
|
|
8
|
+
return Object.getPrototypeOf(prev) === Object.getPrototypeOf(next) && !Array.isArray(prev) && !isPlainObject(prev) && "toJSON" in prev && typeof prev.toJSON === "function" && JSON.stringify(prev) === JSON.stringify(next);
|
|
9
|
+
}
|
|
10
|
+
function idOf(value) {
|
|
11
|
+
return isPlainObject(value) ? value["id"] : void 0;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* `next` with every part that equals `prev` replaced by `prev`'s object, so
|
|
15
|
+
* unchanged rows keep their identity and `memo` skips them. Array items
|
|
16
|
+
* match by their `id` when they have one (a reordered list keeps its rows),
|
|
17
|
+
* else by position. Returns `prev` itself when nothing changed.
|
|
18
|
+
*/
|
|
19
|
+
function shareStructure(prev, next) {
|
|
20
|
+
if (sameValue(prev, next)) return prev;
|
|
21
|
+
if (Array.isArray(prev) && Array.isArray(next)) {
|
|
22
|
+
const before = prev;
|
|
23
|
+
const after = next;
|
|
24
|
+
const byId = /* @__PURE__ */ new Map();
|
|
25
|
+
for (const item of before) {
|
|
26
|
+
const id = idOf(item);
|
|
27
|
+
if (id !== void 0) byId.set(id, item);
|
|
28
|
+
}
|
|
29
|
+
let same = before.length === after.length;
|
|
30
|
+
const shared = after.map((item, index) => {
|
|
31
|
+
const id = idOf(item);
|
|
32
|
+
const value = shareStructure(id === void 0 ? before[index] : byId.get(id), item);
|
|
33
|
+
if (value !== before[index]) same = false;
|
|
34
|
+
return value;
|
|
35
|
+
});
|
|
36
|
+
return same ? prev : shared;
|
|
37
|
+
}
|
|
38
|
+
if (isPlainObject(prev) && isPlainObject(next)) {
|
|
39
|
+
const keys = Object.keys(next);
|
|
40
|
+
let same = keys.length === Object.keys(prev).length;
|
|
41
|
+
const shared = {};
|
|
42
|
+
for (const key of keys) {
|
|
43
|
+
const value = shareStructure(prev[key], next[key]);
|
|
44
|
+
if (!Object.hasOwn(prev, key) || value !== prev[key]) same = false;
|
|
45
|
+
shared[key] = value;
|
|
46
|
+
}
|
|
47
|
+
return same ? prev : shared;
|
|
48
|
+
}
|
|
49
|
+
return next;
|
|
50
|
+
}
|
|
51
|
+
//#endregion
|
|
52
|
+
//#region src/powersync/watch.ts
|
|
53
|
+
/**
|
|
54
|
+
* Reruns a repository call whenever PowerSync reports a change to one of
|
|
55
|
+
* `tables`: local writes and synced rows alike. The same call works with
|
|
56
|
+
* lists, aggregates and single rows. Unchanged rows keep their identity
|
|
57
|
+
* between runs, and a run that changes nothing calls no `onResult`. Returns
|
|
58
|
+
* a function that stops it.
|
|
59
|
+
*
|
|
60
|
+
* ```ts
|
|
61
|
+
* const stop = watch(powersync, () => customerList.run(db, query), {
|
|
62
|
+
* tables: ['customers'],
|
|
63
|
+
* onResult: (page) => render(page),
|
|
64
|
+
* });
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
function watch(db, query, options) {
|
|
68
|
+
if (!db.onChange) throw new TypeError("better-supabase: watch() needs a PowerSync database with onChange()");
|
|
69
|
+
const signal = options.signal;
|
|
70
|
+
if (signal?.aborted) return () => void 0;
|
|
71
|
+
const controller = new AbortController();
|
|
72
|
+
const stop = () => {
|
|
73
|
+
controller.abort();
|
|
74
|
+
};
|
|
75
|
+
signal?.addEventListener("abort", stop, { once: true });
|
|
76
|
+
let latest = 0;
|
|
77
|
+
let previous;
|
|
78
|
+
const sharing = options.structuralSharing ?? true;
|
|
79
|
+
const rerun = async () => {
|
|
80
|
+
latest += 1;
|
|
81
|
+
const run = latest;
|
|
82
|
+
let result;
|
|
83
|
+
try {
|
|
84
|
+
result = await query();
|
|
85
|
+
} catch (cause) {
|
|
86
|
+
result = err(toDbError(cause));
|
|
87
|
+
}
|
|
88
|
+
if (run !== latest || controller.signal.aborted) return;
|
|
89
|
+
if (sharing) {
|
|
90
|
+
const shared = shareStructure(previous, result);
|
|
91
|
+
if (shared === previous) return;
|
|
92
|
+
result = shared;
|
|
93
|
+
}
|
|
94
|
+
previous = result;
|
|
95
|
+
options.onResult(result);
|
|
96
|
+
};
|
|
97
|
+
rerun();
|
|
98
|
+
const unsubscribe = db.onChange({ onChange: rerun }, {
|
|
99
|
+
tables: [...options.tables],
|
|
100
|
+
signal: controller.signal,
|
|
101
|
+
...options.throttleMs === void 0 ? {} : { throttleMs: options.throttleMs }
|
|
102
|
+
});
|
|
103
|
+
return () => {
|
|
104
|
+
signal?.removeEventListener("abort", stop);
|
|
105
|
+
stop();
|
|
106
|
+
unsubscribe();
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* The SQLite table names of app table keys (`customerTags` to
|
|
111
|
+
* `customer_tags`). Pass the executor's `tableName` when it renames tables,
|
|
112
|
+
* so `watch` listens to the names the queries read.
|
|
113
|
+
*/
|
|
114
|
+
function sqliteTables(betterSupabase, keys, options = {}) {
|
|
115
|
+
return keys.map((key) => {
|
|
116
|
+
const table = betterSupabase.meta.tables[key];
|
|
117
|
+
if (!table) throw new TypeError(`better-supabase: unknown table "${key}"`);
|
|
118
|
+
return options.tableName ? options.tableName(table) : table.name;
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
//#endregion
|
|
122
|
+
export { watch as n, sqliteTables as t };
|