better-supabase 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +299 -41
- package/dist/access-sql-B0dF-SoF.js +181 -0
- package/dist/actor-CQTlc1Hh.d.ts +43 -0
- package/dist/adapter-Bc1o3zyy.js +1106 -0
- package/dist/agents-CVHGd7It.d.ts +94 -0
- package/dist/ai-cache-CBWs1W0k.js +80 -0
- package/dist/ai-cache-DaDu_G5L.d.ts +64 -0
- package/dist/ai-chat-7amvXjmQ.d.ts +590 -0
- package/dist/ai-chat-B24UI962.js +743 -0
- package/dist/ai-files-CSPNswUY.js +319 -0
- package/dist/ai-sdk/agents/index.d.ts +74 -0
- package/dist/ai-sdk/agents/index.js +159 -0
- package/dist/ai-sdk/batches/index.d.ts +74 -0
- package/dist/ai-sdk/batches/index.js +180 -0
- package/dist/ai-sdk/cache/index.d.ts +38 -0
- package/dist/ai-sdk/cache/index.js +127 -0
- package/dist/ai-sdk/chat/index.d.ts +2 -0
- package/dist/ai-sdk/chat/index.js +246 -0
- package/dist/ai-sdk/embeddings/index.d.ts +3 -0
- package/dist/ai-sdk/embeddings/index.js +2 -0
- package/dist/ai-sdk/files/index.d.ts +61 -0
- package/dist/ai-sdk/files/index.js +111 -0
- package/dist/ai-sdk/index.d.ts +145 -0
- package/dist/ai-sdk/index.js +174 -0
- package/dist/ai-sdk/mcp/index.d.ts +102 -0
- package/dist/ai-sdk/mcp/index.js +362 -0
- package/dist/ai-sdk/memory/index.d.ts +67 -0
- package/dist/ai-sdk/memory/index.js +175 -0
- package/dist/ai-sdk/react/index.d.ts +2 -0
- package/dist/ai-sdk/react/index.js +3 -0
- package/dist/ai-sdk/react/server.d.ts +6 -0
- package/dist/ai-sdk/react/server.js +7 -0
- package/dist/ai-sdk/workflow/index.d.ts +249 -0
- package/dist/ai-sdk/workflow/index.js +575 -0
- package/dist/ai-sdk/workflow/react/index.d.ts +20 -0
- package/dist/ai-sdk/workflow/react/index.js +66 -0
- package/dist/ai-sdk/workflow/react/server.d.ts +10 -0
- package/dist/ai-sdk/workflow/react/server.js +12 -0
- package/dist/ai-tasks-Cd1HMFvB.d.ts +131 -0
- package/dist/announcements-CiyOs-xP.js +107 -0
- package/dist/announcements-ZRGnScWI.d.ts +72 -0
- package/dist/api-keys-rCGtKaZA.d.ts +156 -0
- package/dist/assistant-DwdpDH1q.d.ts +147 -0
- package/dist/astro/index.d.ts +86 -0
- package/dist/astro/index.js +93 -0
- package/dist/attributes-5dYul0u0.js +13 -0
- package/dist/auth-link-BjFPqwLz.d.ts +97 -0
- package/dist/auth-link-DrDX9KOT.js +114 -0
- package/dist/authorization-BFCqamMs.d.ts +172 -0
- package/dist/before-route-CnR0C0Jr.js +30 -0
- package/dist/bind-Bu_ZNa3W.d.ts +62 -0
- package/dist/bind-l4kAvYSv.js +97 -0
- package/dist/block-events-CrT8r7Fe.js +76 -0
- package/dist/block-fields-GFkxl4dP.js +49 -0
- package/dist/block-fields-SJ6fEf3o.d.ts +31 -0
- package/dist/block-helpers-CKtbFcRv.d.ts +37 -0
- package/dist/block-helpers-DWHxHsEQ.js +190 -0
- package/dist/block-hooks-BmjMyXTa.js +114 -0
- package/dist/block-hooks-plbZ0AbJ.d.ts +107 -0
- package/dist/{kit-transport-DJlHQUBU.js → block-transport-BLr-ZgLc.js} +11 -7
- package/dist/block-transport-DvaoPuZ9.d.ts +48 -0
- package/dist/blocks/agents/index.d.ts +3 -0
- package/dist/blocks/agents/index.js +123 -0
- package/dist/blocks/ai-cache/index.d.ts +3 -0
- package/dist/blocks/ai-cache/index.js +3 -0
- package/dist/blocks/ai-chat/index.d.ts +31 -0
- package/dist/blocks/ai-chat/index.js +5 -0
- package/dist/blocks/ai-chat/react/index.d.ts +77 -0
- package/dist/blocks/ai-chat/react/index.js +387 -0
- package/dist/blocks/ai-chat/react/server.d.ts +16 -0
- package/dist/blocks/ai-chat/react/server.js +14 -0
- package/dist/blocks/ai-files/index.d.ts +14 -0
- package/dist/blocks/ai-files/index.js +3 -0
- package/dist/blocks/ai-providers/index.d.ts +7 -0
- package/dist/blocks/ai-providers/index.js +211 -0
- package/dist/blocks/ai-tasks/index.d.ts +3 -0
- package/dist/blocks/ai-tasks/index.js +203 -0
- package/dist/blocks/announcements/index.d.ts +3 -0
- package/dist/blocks/announcements/index.js +3 -0
- package/dist/blocks/announcements/react/index.d.ts +31 -0
- package/dist/blocks/announcements/react/index.js +86 -0
- package/dist/blocks/announcements/react/server.d.ts +6 -0
- package/dist/blocks/announcements/react/server.js +7 -0
- package/dist/blocks/api-keys/index.d.ts +35 -0
- package/dist/blocks/api-keys/index.js +334 -0
- package/dist/blocks/attachments/index.d.ts +210 -0
- package/dist/blocks/attachments/index.js +222 -0
- package/dist/blocks/audit/index.d.ts +366 -0
- package/dist/blocks/audit/index.js +714 -0
- package/dist/blocks/billing/index.d.ts +265 -0
- package/dist/blocks/billing/index.js +400 -0
- package/dist/blocks/comments/index.d.ts +200 -0
- package/dist/blocks/comments/index.js +207 -0
- package/dist/blocks/connectors/index.d.ts +3 -0
- package/dist/blocks/connectors/index.js +164 -0
- package/dist/blocks/data-lifecycle/index.d.ts +251 -0
- package/dist/blocks/data-lifecycle/index.js +353 -0
- package/dist/blocks/entitlements/index.d.ts +14 -0
- package/dist/blocks/entitlements/index.js +25 -0
- package/dist/blocks/flags/index.d.ts +226 -0
- package/dist/blocks/flags/index.js +282 -0
- package/dist/blocks/inbox/index.d.ts +6 -0
- package/dist/blocks/inbox/index.js +499 -0
- package/dist/blocks/inbox/react/index.d.ts +2 -0
- package/dist/blocks/inbox/react/index.js +225 -0
- package/dist/blocks/inbox/react/server.d.ts +10 -0
- package/dist/blocks/inbox/react/server.js +12 -0
- package/dist/blocks/index.d.ts +65 -0
- package/dist/blocks/index.js +77 -0
- package/dist/blocks/jobs/index.d.ts +297 -0
- package/dist/blocks/jobs/index.js +1051 -0
- package/dist/blocks/knowledge/index.d.ts +3 -0
- package/dist/blocks/knowledge/index.js +3 -0
- package/dist/blocks/memory/index.d.ts +8 -0
- package/dist/blocks/memory/index.js +289 -0
- package/dist/blocks/notifications/index.d.ts +297 -0
- package/dist/blocks/notifications/index.js +425 -0
- package/dist/blocks/notifications/react/index.d.ts +44 -0
- package/dist/blocks/notifications/react/index.js +67 -0
- package/dist/blocks/notifications/react/server.d.ts +6 -0
- package/dist/blocks/notifications/react/server.js +7 -0
- package/dist/blocks/onboarding/index.d.ts +3 -0
- package/dist/blocks/onboarding/index.js +64 -0
- package/dist/blocks/onboarding/react/index.d.ts +28 -0
- package/dist/blocks/onboarding/react/index.js +78 -0
- package/dist/blocks/onboarding/react/server.d.ts +7 -0
- package/dist/blocks/onboarding/react/server.js +7 -0
- package/dist/blocks/organizations/index.d.ts +241 -0
- package/dist/blocks/organizations/index.js +400 -0
- package/dist/blocks/outbox/index.d.ts +3 -0
- package/dist/blocks/outbox/index.js +266 -0
- package/dist/blocks/profiles/index.d.ts +40 -0
- package/dist/blocks/profiles/index.js +28 -0
- package/dist/blocks/push/index.d.ts +185 -0
- package/dist/blocks/push/index.js +258 -0
- package/dist/blocks/settings/index.d.ts +89 -0
- package/dist/blocks/settings/index.js +104 -0
- package/dist/blocks/sso/index.d.ts +198 -0
- package/dist/blocks/sso/index.js +1297 -0
- package/dist/blocks/usage/index.d.ts +4 -0
- package/dist/blocks/usage/index.js +233 -0
- package/dist/blocks/waitlist/index.d.ts +117 -0
- package/dist/blocks/waitlist/index.js +132 -0
- package/dist/blocks/webhooks/index.d.ts +304 -0
- package/dist/{webhooks → blocks/webhooks}/index.js +468 -148
- package/dist/blocks/workflow-builder/index.d.ts +21 -0
- package/dist/blocks/workflow-builder/index.js +5 -0
- package/dist/blocks/workflow-builder/react/index.d.ts +47 -0
- package/dist/blocks/workflow-builder/react/index.js +119 -0
- package/dist/blocks/workflow-builder/react/server.d.ts +8 -0
- package/dist/blocks/workflow-builder/react/server.js +11 -0
- package/dist/blocks/workflows/index.d.ts +3 -0
- package/dist/blocks/workflows/index.js +3 -0
- package/dist/blocks/workflows/react/index.d.ts +47 -0
- package/dist/blocks/workflows/react/index.js +137 -0
- package/dist/blocks/workflows/react/server.d.ts +8 -0
- package/dist/blocks/workflows/react/server.js +11 -0
- package/dist/{index-SaTsEfGP.d.ts → bucket-Cl46E3jS.d.ts} +134 -91
- package/dist/{simplify-_0oUKqCd.js → build-BXIzE6Xv.js} +222 -124
- package/dist/{channel-FQW-CnGR.d.ts → channel-_2Mx1Oyu.d.ts} +2 -2
- package/dist/channels-CkgQ_X60.js +114 -0
- package/dist/chat-sdk/index.d.ts +303 -0
- package/dist/chat-sdk/index.js +733 -0
- package/dist/chat-sdk/react/index.d.ts +2 -0
- package/dist/chat-sdk/react/index.js +3 -0
- package/dist/chat-sdk/react/server.d.ts +3 -0
- package/dist/chat-sdk/react/server.js +2 -0
- package/dist/claims-DDBQT6BK.js +61 -0
- package/dist/{claims-BAf6c7is.js → claims-PqzCxaTD.js} +39 -2
- package/dist/cli/bin.js +1 -1
- package/dist/cli/{codemod-DqV7612m.js → codemod-Bl_tQpHn.js} +105 -2
- package/dist/cli/config-B9HkL8nF.js +2 -0
- package/dist/cli/config-DU7EJImt.js +49 -0
- package/dist/cli/config-NiPxAmUF.js +1077 -0
- package/dist/cli/{dist-xn4wlboc.js → dist-DRAVaE6w.js} +111 -1
- package/dist/cli/{doctor-L7Z8mYTx.js → doctor-B4JOm_ox.js} +992 -316
- package/dist/cli/{env-DmKv_G4A.js → env-CJLbUVPB.js} +1 -1
- package/dist/cli/{env-jIFUADLY.js → env-qXgyMV6r.js} +2 -2
- package/dist/cli/fresh-import-BeYf9I3x.js +40 -0
- package/dist/cli/gen-BGLb_zou.js +3100 -0
- package/dist/cli/gen-DAH8FM2W.js +2 -0
- package/dist/cli/index.d.ts +44 -5
- package/dist/cli/index.js +7 -7
- package/dist/cli/{init-Saf5-R9T.js → init-BIIwclPg.js} +242 -27
- package/dist/cli/{introspect--H7oGmcd.js → introspect-DNUTuNvb.js} +5 -5
- package/dist/cli/{io-k41_z-jT.js → io-DI1mTdSA.js} +12 -3
- package/dist/cli/{keys-ByKHnvP9.js → keys-BGCnnb-s.js} +8 -6
- package/dist/cli/{ohash-D7bG_EOb.js → ohash-BjQY1cBb.js} +1 -1
- package/dist/cli/{openapi-Cp5Fyta-.js → openapi-BlRJ18s3.js} +2 -2
- package/dist/cli/{project-B_GeXyHh.js → project-DZRaBaY7.js} +11 -6
- package/dist/cli/read-sets-CETOSFx4.js +223 -0
- package/dist/cli/{run-BKR2W_79.js → run-DNWxHynX.js} +33 -23
- package/dist/cli/{seed-CUlqWh-8.js → seed-DQzqT7LP.js} +8 -6
- package/dist/cli/{skills-LJJIhLFR.js → skills-QQs4q68J.js} +3 -2
- package/dist/cli/sql-D0GUtUPp.js +536 -0
- package/dist/cli/{config-CPVpXP5I.js → supabase-toml-B-bIukQF.js} +72 -942
- package/dist/cli/typegen-version-DeFbtzYI.js +8 -0
- package/dist/cli/{version-BDJuO0UR.js → version-hr88OZG0.js} +1 -1
- package/dist/client/index.d.ts +3 -2
- package/dist/client/index.js +11 -71
- package/dist/client/native/index.d.ts +228 -0
- package/dist/client/native/index.js +361 -0
- package/dist/client-CI0Z2zWX.js +277 -0
- package/dist/cloud-event-BnmD5fb9.js +46 -0
- package/dist/cloud-event-C1JCc1bH.d.ts +50 -0
- package/dist/{compiler-BXH_aZ7N.d.ts → compiler-DY_wkj4R.d.ts} +2 -2
- package/dist/compose-BIBNgAnq.js +53 -0
- package/dist/composite-Bt1YK3Ke.d.ts +146 -0
- package/dist/composite-DhE66P5u.js +130 -0
- package/dist/config/index.d.ts +6 -4
- package/dist/config/index.js +5 -5
- package/dist/{config-T_ejwyd3.d.ts → config-D44Y7PAv.d.ts} +406 -205
- package/dist/{config-DreERlKo.js → config-Dn7F5k9A.js} +62 -14
- package/dist/connector-Dv8kK0MO.d.ts +107 -0
- package/dist/connectors-hkLCwyEz.d.ts +120 -0
- package/dist/context-BCrWe7ow.d.ts +237 -0
- package/dist/credentials/index.d.ts +31 -0
- package/dist/credentials/index.js +168 -0
- package/dist/cron-DVPUg5k3.js +145 -0
- package/dist/csv-CPAzEmB6.js +25 -0
- package/dist/db-exception-CnWcYPxL.js +15 -0
- package/dist/{define-cNKzqwL_.js → define-B-TVjC25.js} +784 -227
- package/dist/{define-Bp_BZa5h.d.ts → define-CJJkkr1-.d.ts} +353 -61
- package/dist/edge/index.d.ts +69 -11
- package/dist/edge/index.js +191 -75
- package/dist/elysia/index.d.ts +59 -0
- package/dist/elysia/index.js +62 -0
- package/dist/embeddings-4ZvFzjsU.js +127 -0
- package/dist/embeddings-C9KGQnXt.d.ts +68 -0
- package/dist/{refresh-BTrQ_ZTp.d.ts → ended-jLfvw8h-.d.ts} +20 -2
- package/dist/{entitlements-DUxU4oHe.d.ts → entitlements-DHrY2UDZ.d.ts} +16 -7
- package/dist/entitlements-DRl6ZJUm.js +24 -0
- package/dist/envelope-DqnYGRw7.js +47 -0
- package/dist/{errors-DtwXa6b8.js → errors-B11Duf73.js} +82 -13
- package/dist/errors-DLjJHPLK.js +44 -0
- package/dist/escape-like-DHfx6jRr.js +7 -0
- package/dist/escape-like-ImTK0ps_.d.ts +15 -0
- package/dist/eve/index.d.ts +220 -0
- package/dist/eve/index.js +504 -0
- package/dist/eve-gT2Fpjut.d.ts +151 -0
- package/dist/events/index.d.ts +4 -3
- package/dist/events/index.js +9 -50
- package/dist/events-DWDhx77e.d.ts +549 -0
- package/dist/executor-Bq28caBo.js +718 -0
- package/dist/executor-C-R4pucm.js +83 -0
- package/dist/executor-CaWigTyR.d.ts +148 -0
- package/dist/executor-D14tGopJ.d.ts +36 -0
- package/dist/{executor-Cghdstwu.d.ts → executor-DbvExCFC.d.ts} +7 -1
- package/dist/{sql-Coh6n4cC.js → executor-De1Of3m3.js} +210 -11
- package/dist/executor-DvsBbNBS.d.ts +261 -0
- package/dist/expo/index.d.ts +79 -0
- package/dist/expo/index.js +129 -0
- package/dist/expo-sqlite/index.d.ts +58 -0
- package/dist/expo-sqlite/index.js +104 -0
- package/dist/field-errors-BFOa7WhB.d.ts +99 -0
- package/dist/field-errors-VF1yb8yI.js +13 -0
- package/dist/framework-CONDyPYx.js +51 -0
- package/dist/framework-DuVb4Xa8.d.ts +25 -0
- package/dist/gateway-C1ssRHnf.d.ts +130 -0
- package/dist/graph-BGyLLFLX.js +265 -0
- package/dist/h3/index.d.ts +59 -0
- package/dist/h3/index.js +55 -0
- package/dist/h3/v1/index.d.ts +63 -0
- package/dist/h3/v1/index.js +49 -0
- package/dist/history-BZih6SFP.js +64 -0
- package/dist/hono/index.d.ts +56 -7
- package/dist/hono/index.js +97 -45
- package/dist/{react-C_s7kiNz.js → hooks-1BTCJsiw.js} +104 -133
- package/dist/http-Cv4T29xh.js +40 -0
- package/dist/http-DdYadv-o.js +126 -0
- package/dist/image-url-pIVlO6R1.js +41 -0
- package/dist/impersonation-DcqaTBHx.js +148 -0
- package/dist/inbox-i7E1ppo6.d.ts +384 -0
- package/dist/index-ACiNPN4Z.d.ts +74 -0
- package/dist/{index-DgILJRXj.d.ts → index-Bepi-Hgg.d.ts} +91 -28
- package/dist/index-BkWT_uBO.d.ts +51 -0
- package/dist/index-BpFYMsi0.d.ts +53 -0
- package/dist/{index-C7f8cOBM.d.ts → index-Bxih3l0u.d.ts} +2 -2
- package/dist/index-CaxrMD1A.d.ts +1 -0
- package/dist/index-ClmjK_o-.d.ts +55 -0
- package/dist/index-CtuakVRc.d.ts +267 -0
- package/dist/index-D48jVS-N.d.ts +246 -0
- package/dist/index-DDrYaUcq.d.ts +138 -0
- package/dist/index-DQh4VCc9.d.ts +98 -0
- package/dist/{live-D9W2M5aO.d.ts → index-DunNRdnT.d.ts} +136 -38
- package/dist/index.d.ts +65 -18
- package/dist/index.js +42 -14
- package/dist/invalidate-BBqhpxyB.d.ts +19 -0
- package/dist/json-CEnpTHlZ.js +16 -0
- package/dist/json-schema-CvER4kgT.js +502 -0
- package/dist/keys-4MnkWTTh.js +35 -0
- package/dist/kit-B5tid-q5.d.ts +60 -0
- package/dist/kit-Fm-Fv7q5.js +78 -0
- package/dist/knowledge-BXBbT0Tr.d.ts +176 -0
- package/dist/knowledge-CDmiMLew.js +255 -0
- package/dist/lint/index.d.ts +1 -1
- package/dist/lint/index.js +37 -0
- package/dist/list/index.d.ts +3 -2
- package/dist/list/index.js +1 -444
- package/dist/{index-fag8VJZ2.d.ts → list-query-BRt-zDF7.d.ts} +20 -12
- package/dist/list-query-gl808ac1.js +459 -0
- package/dist/{live-CdJBOc4f.js → live-CTAZQkwl.js} +99 -14
- package/dist/logger-DWVYUmwi.d.ts +18 -0
- package/dist/mcp/index.d.ts +38 -11
- package/dist/mcp/index.js +82 -46
- package/dist/mcp/sdk/index.d.ts +105 -0
- package/dist/mcp/sdk/index.js +126 -0
- package/dist/message-CaKlqdsX.js +219 -0
- package/dist/message-CfDoR0Y6.d.ts +94 -0
- package/dist/messages-B9-5887d.js +715 -0
- package/dist/messages-DYP0sUTe.d.ts +59 -0
- package/dist/{mfa-CusDgPaD.d.ts → mfa-Daak8ukG.d.ts} +8 -2
- package/dist/modules-DpPwzC7E.d.ts +192 -0
- package/dist/modules-dxrVK3ID.js +228 -0
- package/dist/nestjs/index.d.ts +68 -0
- package/dist/nestjs/index.js +164 -0
- package/dist/next/client/index.d.ts +35 -0
- package/dist/next/client/index.js +36 -0
- package/dist/next/image/index.js +3 -24
- package/dist/next/index.d.ts +150 -51
- package/dist/next/index.js +261 -107
- package/dist/node/index.d.ts +4 -0
- package/dist/node/index.js +210 -0
- package/dist/node-headers-AO06VhqH.d.ts +24 -0
- package/dist/node-headers-C71zNQHe.js +55 -0
- package/dist/nuxt/index.d.ts +60 -0
- package/dist/nuxt/index.js +64 -0
- package/dist/onboarding-BZGHYJks.d.ts +62 -0
- package/dist/openapi/index.d.ts +1 -1
- package/dist/openapi/index.js +3 -3
- package/dist/orpc/index.d.ts +70 -11
- package/dist/orpc/index.js +73 -24
- package/dist/otel/index.d.ts +7 -7
- package/dist/otel/index.js +87 -57
- package/dist/outbox-Cq7pPYvl.d.ts +161 -0
- package/dist/{plugin-o144f322.d.ts → plugin-FGY8UhYm.d.ts} +30 -10
- package/dist/plugin-tfXW1-qO.js +45 -0
- package/dist/plugins/actor/index.d.ts +2 -2
- package/dist/plugins/actor/index.js +3 -3
- package/dist/plugins/rules/index.d.ts +11 -4
- package/dist/plugins/rules/index.js +40 -13
- package/dist/plugins/soft-delete/index.d.ts +5 -4
- package/dist/plugins/soft-delete/index.js +10 -5
- package/dist/plugins/tenant/index.d.ts +2 -2
- package/dist/plugins/tenant/index.js +18 -11
- package/dist/plugins/timestamps/index.d.ts +5 -3
- package/dist/plugins/timestamps/index.js +6 -4
- package/dist/plugins/validation/index.d.ts +2 -2
- package/dist/plugins/validation/index.js +10 -6
- package/dist/{pool-C9voM4Kw.d.ts → pool-CAu2nLrL.d.ts} +2 -2
- package/dist/postgres/index.d.ts +4 -4
- package/dist/postgres/index.js +1 -2
- package/dist/{postgrest-CruYKAvV.d.ts → postgrest-BLVdEnfe.d.ts} +13 -3
- package/dist/powersync/index.d.ts +43 -0
- package/dist/powersync/index.js +199 -0
- package/dist/powersync/react/index.d.ts +87 -0
- package/dist/powersync/react/index.js +108 -0
- package/dist/{problem-BW1KhzSG.js → problem-BreOl8b8.js} +14 -3
- package/dist/{problem-Blxe8S31.d.ts → problem-DD8LZFjc.d.ts} +21 -3
- package/dist/provider-BH5UWZJ6.d.ts +113 -0
- package/dist/provider-Di3sRutW.js +57 -0
- package/dist/query/index.d.ts +4 -2
- package/dist/query/index.js +4 -3
- package/dist/{query-CCbo44lG.js → query-BQ-NaZon.js} +141 -24
- package/dist/{queue-BYUCjr59.d.ts → queue-CLJurhdy.d.ts} +258 -83
- package/dist/react/index.d.ts +11 -7
- package/dist/react/index.js +7 -3
- package/dist/react/native/index.d.ts +116 -0
- package/dist/react/native/index.js +130 -0
- package/dist/react/server.d.ts +28 -10
- package/dist/react/server.js +22 -5
- package/dist/react/session.d.ts +2 -2
- package/dist/react-4ZqkP8da.js +79 -0
- package/dist/react-F80mF4-t.js +409 -0
- package/dist/react-router/index.d.ts +83 -0
- package/dist/react-router/index.js +89 -0
- package/dist/react-topic-seAWjL3_.js +38 -0
- package/dist/{read-set-DQFt1N_Y.js → read-set-DuKWC9Mj.js} +67 -25
- package/dist/realtime/index.d.ts +4 -5
- package/dist/realtime/index.js +144 -82
- package/dist/refusal-CeJWxmkH.js +61 -0
- package/dist/refusal-D1rgbzNq.d.ts +15 -0
- package/dist/replicas-CwrYp5Zj.js +94 -0
- package/dist/{view-Bq64ki8-.js → resolve-D_IcnvFd.js} +239 -289
- package/dist/{resolve-C15TJq77.d.ts → resolve-KW8nCeL6.d.ts} +29 -45
- package/dist/{resource-CRxxwkQq.js → resource-BsvzCMlX.js} +4 -4
- package/dist/{resource-D8iqWMr-.d.ts → resource-D6Uc7Sk7.d.ts} +5 -5
- package/dist/respond-BUgsXNgk.js +91 -0
- package/dist/respond-DoBijysA.d.ts +93 -0
- package/dist/result-D7y2fT87.d.ts +282 -0
- package/dist/{result-BKiliPY7.js → result-DzUbqgdW.js} +27 -2
- package/dist/run-state-CPo-1X2B.d.ts +12 -0
- package/dist/run-state-CgBKzYMW.js +13 -0
- package/dist/search-CUWCRYKL.js +9 -0
- package/dist/server/index.d.ts +143 -21
- package/dist/server/index.js +46 -14
- package/dist/{respond-D2OQl62-.d.ts → server-CeVeeXwz.d.ts} +225 -80
- package/dist/session-ChiXDZdZ.d.ts +72 -0
- package/dist/shared-CBxosKK3.js +75 -0
- package/dist/{shared-D1dRUrAg.js → shared-CxWmcyqB.js} +2 -1
- package/dist/shared-DDSjEGDR.d.ts +11 -0
- package/dist/sign-in-BCV5S2WZ.d.ts +49 -0
- package/dist/sign-in-Cb1mwv6X.js +86 -0
- package/dist/{signers-Cc6r98SW.d.ts → signers-4y62_VIi.d.ts} +13 -9
- package/dist/simplify-DDO0j0LI.js +83 -0
- package/dist/solid/index.d.ts +131 -0
- package/dist/solid/index.js +344 -0
- package/dist/solid-start/index.d.ts +75 -0
- package/dist/solid-start/index.js +58 -0
- package/dist/{spec-pins-C3oc-Tdp.js → spec-pins--j6mTok4.js} +8 -1
- package/dist/{spec-pins-CqorWDnO.d.ts → spec-pins-C89s6DyW.d.ts} +7 -0
- package/dist/sql/index.d.ts +330 -194
- package/dist/sql/index.js +34901 -6489
- package/dist/ssr/index.d.ts +6 -5
- package/dist/ssr/index.js +3 -3
- package/dist/{standard-D7r6dMUu.js → standard-BK0cqJ7y.js} +4 -3
- package/dist/{standard-J4YgMOLm.d.ts → standard-CYsm7xpT.d.ts} +1 -1
- package/dist/stats-D_AD9GGu.js +1123 -0
- package/dist/storage/index.d.ts +5 -5
- package/dist/storage/index.js +1027 -368
- package/dist/store-BdH5ruDx.js +66 -0
- package/dist/store-CGjgWu5n.d.ts +68 -0
- package/dist/streams/index.d.ts +76 -0
- package/dist/streams/index.js +77 -0
- package/dist/streams/redis/index.d.ts +52 -0
- package/dist/streams/redis/index.js +185 -0
- package/dist/stripe-BMj5LtsT.js +38 -0
- package/dist/stripe-D04h-QBT.d.ts +136 -0
- package/dist/{support-Dk6vdmEw.js → support-BivNqSpK.js} +35 -12
- package/dist/{support-view-Da5peKFg.d.ts → support-view-33Oi07TT.d.ts} +1 -1
- package/dist/svelte/index.d.ts +114 -0
- package/dist/svelte/index.js +344 -0
- package/dist/sveltekit/index.d.ts +116 -0
- package/dist/sveltekit/index.js +106 -0
- package/dist/tags-B99_U9Pp.js +39 -0
- package/dist/tags-Cx-LnIQP.d.ts +30 -0
- package/dist/tanstack-db/index.d.ts +71 -0
- package/dist/tanstack-db/index.js +72 -0
- package/dist/tanstack-start/index.d.ts +75 -0
- package/dist/tanstack-start/index.js +95 -0
- package/dist/tee-CoEppCER.js +101 -0
- package/dist/{template-TxrGI5jR.js → template--jDkl3UP.js} +34 -13
- package/dist/template-CwO38Do8.d.ts +6 -0
- package/dist/temporal-BJGitm-h.js +79 -0
- package/dist/{temporal-required-CAt4Dc9Z.js → temporal-required-BVvW7SYJ.js} +3 -2
- package/dist/tenant-I1TEZ_BX.js +27 -0
- package/dist/tenant-icPeuUBN.d.ts +17 -0
- package/dist/testing/index.d.ts +343 -37
- package/dist/testing/index.js +1186 -79
- package/dist/timing-CyTQPubY.js +92 -0
- package/dist/ttl-Hr34gRu8.js +12 -0
- package/dist/{types-Dnf_wRDz.d.ts → types-6BdhkmZe.d.ts} +111 -45
- package/dist/types-BI-0Sl2v.d.ts +359 -0
- package/dist/types-C05bxW-W.d.ts +220 -0
- package/dist/types-DGs5L0VN.d.ts +192 -0
- package/dist/types-TaiEeBGA.d.ts +156 -0
- package/dist/usage-CrvrL2vw.d.ts +177 -0
- package/dist/user-change-XzvgafU4.js +130 -0
- package/dist/vault-CSO7ss5C.d.ts +50 -0
- package/dist/vercel-connect/index.d.ts +47 -0
- package/dist/vercel-connect/index.js +119 -0
- package/dist/{verify-Ce49ETPz.js → verify-DL41hbvY.js} +85 -13
- package/dist/verify-DPuWngD4.d.ts +172 -0
- package/dist/{version-DM_Roffb.js → version-Bvv6aLjZ.js} +1 -1
- package/dist/view-BeFcRV6G.js +99 -0
- package/dist/{view-BEf0diC5.d.ts → view-DbxLNu8L.d.ts} +35 -32
- package/dist/vue/index.d.ts +141 -0
- package/dist/vue/index.js +362 -0
- package/dist/watch-DI34G86j.d.ts +60 -0
- package/dist/watch-Xuxrvxq-.js +122 -0
- package/dist/{wire-D2dT86vi.js → wire-DtZQ4sdE.js} +15 -5
- package/dist/workflow-builder-DJ1oHn8g.js +398 -0
- package/dist/workflow-sdk/builder/index.d.ts +85 -0
- package/dist/workflow-sdk/builder/index.js +250 -0
- package/dist/workflow-sdk/index.d.ts +14 -0
- package/dist/workflow-sdk/index.js +3 -0
- package/dist/workflow-sdk/world/index.d.ts +107 -0
- package/dist/workflow-sdk/world/index.js +702 -0
- package/dist/workflow-sdk-B3yLD6Br.d.ts +98 -0
- package/dist/workflow-sdk-C2WJ_G2O.js +173 -0
- package/dist/workflow-sdk-world-D-prir6O.js +1397 -0
- package/dist/workflows-B0j9WKPu.d.ts +185 -0
- package/dist/workflows-wu1WWBn7.js +216 -0
- package/package.json +470 -29
- package/schemas/ai-message-v1.json +258 -0
- package/schemas/config-v1.json +1074 -140
- package/schemas/doctor-report-v1.json +21 -1
- package/schemas/snapshot-v2.json +8 -0
- package/skills/better-supabase/SKILL.md +41 -12
- package/skills/better-supabase/references/frontend.md +96 -0
- package/skills/better-supabase/references/plugins.md +10 -6
- package/skills/better-supabase/references/troubleshooting.md +2 -1
- package/skills/better-supabase-api/SKILL.md +76 -22
- package/skills/better-supabase-api/references/adapters.md +207 -0
- package/skills/better-supabase-api/references/ai.md +125 -0
- package/skills/better-supabase-api/references/expo.md +65 -0
- package/skills/better-supabase-api/references/powersync.md +35 -0
- package/skills/better-supabase-api/references/streams-credentials.md +105 -0
- package/skills/better-supabase-auth/SKILL.md +62 -18
- package/skills/better-supabase-auth/references/authorization-providers.md +51 -0
- package/skills/better-supabase-testing/SKILL.md +3 -1
- package/dist/cli/config-dtoekM0v.js +0 -2
- package/dist/cli/gen-BJc9vdyu.js +0 -2
- package/dist/cli/gen-C2osRcr5.js +0 -2204
- package/dist/cli/read-sets-BfMQcKy8.js +0 -289
- package/dist/cli/sql-DzPbfngx.js +0 -348
- package/dist/entitlements-CTEBm7IB.js +0 -20
- package/dist/events-aIO7vsIk.d.ts +0 -230
- package/dist/executor-BunPOO-k.d.ts +0 -402
- package/dist/executor-XycESQPH.js +0 -94
- package/dist/impersonation-VfaGc4Q_.js +0 -41
- package/dist/index-BGdgBPdf.d.ts +0 -161
- package/dist/index-DOESKG27.d.ts +0 -100
- package/dist/index-DmXSxbLi.d.ts +0 -62
- package/dist/index-Dxn2a5cw.d.ts +0 -50
- package/dist/jobs/index.d.ts +0 -226
- package/dist/jobs/index.js +0 -1007
- package/dist/json-schema-m1fiwKgN.js +0 -208
- package/dist/kit-events-CTFDfSwb.js +0 -60
- package/dist/kit-transport-B82k1djG.d.ts +0 -33
- package/dist/kits-CGLLrNPd.js +0 -157
- package/dist/notifications/index.d.ts +0 -162
- package/dist/notifications/index.js +0 -264
- package/dist/orgs/index.d.ts +0 -132
- package/dist/orgs/index.js +0 -245
- package/dist/permdock-sql-C2Inc6Xc.d.ts +0 -29
- package/dist/permdock-sql-DgOfeixi.js +0 -51
- package/dist/plugin-DwARMuQp.js +0 -59
- package/dist/server-Csx2sRjg.js +0 -655
- package/dist/stats-Bqob3WqT.js +0 -592
- package/dist/support-DT-OhSxD.d.ts +0 -88
- package/dist/template-mbvlysOo.d.ts +0 -6
- package/dist/temporal-CVlIV2DZ.js +0 -40
- package/dist/user-change-CHFEUro1.js +0 -49
- package/dist/webhooks/index.d.ts +0 -285
- package/skills/better-supabase-auth/references/permdock.md +0 -100
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
import { f as Result, w as ErrorMapper } from "./result-D7y2fT87.js";
|
|
2
|
+
import { O as RelationMeta, R as TableMeta, d as Codec, g as FunctionMeta } from "./types-6BdhkmZe.js";
|
|
3
|
+
//#region src/ir/types.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* The query IR. Every repository call becomes one of these operations; the
|
|
6
|
+
* executor compiles it to PostgREST or SQL. Column names in the IR are
|
|
7
|
+
* database names; `Selection` carries the app aliases.
|
|
8
|
+
*/
|
|
9
|
+
type ColumnOp = "eq" | "neq" | "gt" | "gte" | "lt" | "lte" | "in" | "is" | "like" | "ilike" | "match" | "imatch" | "contains" | "containedBy" | "overlaps" | "fts";
|
|
10
|
+
type Quantifier = "some" | "none" | "every";
|
|
11
|
+
type Condition = {
|
|
12
|
+
readonly kind: "and";
|
|
13
|
+
readonly items: readonly Condition[];
|
|
14
|
+
} | {
|
|
15
|
+
readonly kind: "or";
|
|
16
|
+
readonly items: readonly Condition[];
|
|
17
|
+
} | {
|
|
18
|
+
readonly kind: "not";
|
|
19
|
+
readonly item: Condition;
|
|
20
|
+
} | {
|
|
21
|
+
readonly kind: "column";
|
|
22
|
+
readonly column: string;
|
|
23
|
+
readonly op: ColumnOp;
|
|
24
|
+
readonly value: unknown;
|
|
25
|
+
/** Full-text search configuration for `fts`. */
|
|
26
|
+
readonly config?: string;
|
|
27
|
+
/**
|
|
28
|
+
* The column is `json`/`jsonb`: containment values are JSON documents,
|
|
29
|
+
* also when they are arrays, never Postgres array literals.
|
|
30
|
+
*/
|
|
31
|
+
readonly json?: true;
|
|
32
|
+
/**
|
|
33
|
+
* Keys into a json column: the condition compares the text at this path
|
|
34
|
+
* (`column->a->>b`, `column #>> '{a,b}'`), and `is null` holds when the
|
|
35
|
+
* key is missing or JSON `null`.
|
|
36
|
+
*/
|
|
37
|
+
readonly path?: readonly string[];
|
|
38
|
+
} | {
|
|
39
|
+
readonly kind: "relation";
|
|
40
|
+
readonly name: string;
|
|
41
|
+
readonly relation: RelationMeta;
|
|
42
|
+
readonly target: TableMeta;
|
|
43
|
+
readonly quantifier: Quantifier;
|
|
44
|
+
readonly where: Condition | undefined;
|
|
45
|
+
};
|
|
46
|
+
interface SelectColumn {
|
|
47
|
+
/** Key in the returned row. */
|
|
48
|
+
readonly alias: string;
|
|
49
|
+
/** Database column name. */
|
|
50
|
+
readonly column: string;
|
|
51
|
+
/** Read the column as text, so exact `int8`/`numeric` values survive JSON. */
|
|
52
|
+
readonly cast?: "text";
|
|
53
|
+
/** Decodes the returned value (see `ColumnMeta.codec`). */
|
|
54
|
+
readonly codec?: Codec;
|
|
55
|
+
}
|
|
56
|
+
interface OrderTerm {
|
|
57
|
+
readonly column: string;
|
|
58
|
+
readonly direction: "asc" | "desc";
|
|
59
|
+
readonly nulls?: "first" | "last";
|
|
60
|
+
/**
|
|
61
|
+
* Added by the repository (the primary key order of `findMany`), not asked
|
|
62
|
+
* for by the caller, so a split read may sort it approximately.
|
|
63
|
+
*/
|
|
64
|
+
readonly implicit?: true;
|
|
65
|
+
/**
|
|
66
|
+
* Sort `aggregate()` groups by this aggregate of `column`; `count` counts
|
|
67
|
+
* the group's rows and its `column` is `*`.
|
|
68
|
+
*/
|
|
69
|
+
readonly aggregate?: AggregateFn | "count";
|
|
70
|
+
/** Sort by `column` of this to-one relation's row (only on the root table). */
|
|
71
|
+
readonly relation?: {
|
|
72
|
+
readonly name: string;
|
|
73
|
+
readonly relation: RelationMeta;
|
|
74
|
+
readonly target: TableMeta;
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
interface Include {
|
|
78
|
+
readonly alias: string;
|
|
79
|
+
readonly relation: RelationMeta;
|
|
80
|
+
readonly target: TableMeta;
|
|
81
|
+
readonly selection: Selection;
|
|
82
|
+
readonly where: Condition | undefined;
|
|
83
|
+
readonly orderBy: readonly OrderTerm[];
|
|
84
|
+
readonly limit: number | undefined;
|
|
85
|
+
/** Drop parent rows without a match (`!inner`). */
|
|
86
|
+
readonly required: boolean;
|
|
87
|
+
/**
|
|
88
|
+
* `_count` include: returns the number of matching related rows instead of
|
|
89
|
+
* rows, folded into `row._count[count]` when decoded.
|
|
90
|
+
*/
|
|
91
|
+
readonly count?: string;
|
|
92
|
+
/**
|
|
93
|
+
* `_sum`/`_avg`/`_min`/`_max` include: `selection.aggregate` holds the
|
|
94
|
+
* measures, folded into `row[`_${fn}`][name]` when decoded.
|
|
95
|
+
*/
|
|
96
|
+
readonly aggregate?: {
|
|
97
|
+
readonly fn: AggregateFn;
|
|
98
|
+
readonly name: string;
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
type AggregateFn = "sum" | "avg" | "min" | "max";
|
|
102
|
+
interface Measure {
|
|
103
|
+
readonly fn: AggregateFn;
|
|
104
|
+
/** Key in the returned row (`_sum_amount`, or the column alias in an include). */
|
|
105
|
+
readonly key: string;
|
|
106
|
+
/** App column name, the key under `_sum` in the decoded row. */
|
|
107
|
+
readonly alias: string;
|
|
108
|
+
/** Database column name. */
|
|
109
|
+
readonly column: string;
|
|
110
|
+
/** Read the result as text, so exact `int8`/`numeric` values survive JSON. */
|
|
111
|
+
readonly cast?: "text";
|
|
112
|
+
readonly codec?: Codec;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Aggregates instead of rows. `Selection.columns` become the grouping
|
|
116
|
+
* columns; without any, the result is exactly one row.
|
|
117
|
+
*/
|
|
118
|
+
interface Aggregation {
|
|
119
|
+
/** Also return `_count`, the number of rows in each group. */
|
|
120
|
+
readonly count: boolean;
|
|
121
|
+
readonly measures: readonly Measure[];
|
|
122
|
+
}
|
|
123
|
+
interface Selection {
|
|
124
|
+
readonly columns: readonly SelectColumn[];
|
|
125
|
+
readonly includes: readonly Include[];
|
|
126
|
+
readonly aggregate?: Aggregation;
|
|
127
|
+
}
|
|
128
|
+
type CountMode = "exact" | "planned" | "estimated";
|
|
129
|
+
interface SelectOp {
|
|
130
|
+
readonly kind: "select";
|
|
131
|
+
readonly table: TableMeta;
|
|
132
|
+
readonly selection: Selection;
|
|
133
|
+
readonly where: Condition | undefined;
|
|
134
|
+
readonly orderBy: readonly OrderTerm[];
|
|
135
|
+
readonly limit: number | undefined;
|
|
136
|
+
readonly offset: number | undefined;
|
|
137
|
+
readonly count: CountMode | undefined;
|
|
138
|
+
/** Only count, return no rows. */
|
|
139
|
+
readonly head: boolean;
|
|
140
|
+
readonly single: "one" | "maybe" | undefined;
|
|
141
|
+
/** `limit` includes one row past the page, which `paginate()` reads to set `hasMore`. */
|
|
142
|
+
readonly lookAhead?: boolean;
|
|
143
|
+
/** `limit` bounds a check, not a page: `findOnly` reads two rows to detect a second match. */
|
|
144
|
+
readonly unpaged?: boolean;
|
|
145
|
+
/**
|
|
146
|
+
* Read from this set-returning function instead of the table (`db.$search`).
|
|
147
|
+
* Only executors with `functionSources` honor it.
|
|
148
|
+
*/
|
|
149
|
+
readonly source?: FunctionSource;
|
|
150
|
+
}
|
|
151
|
+
/** A function returning `setof <table>`, called with named arguments. */
|
|
152
|
+
interface FunctionSource {
|
|
153
|
+
readonly schema: string;
|
|
154
|
+
readonly name: string;
|
|
155
|
+
readonly args: Readonly<Record<string, unknown>>;
|
|
156
|
+
}
|
|
157
|
+
/** The statement a mutation runs. */
|
|
158
|
+
type MutationKind = "insert" | "upsert" | "update" | "delete";
|
|
159
|
+
/** What the caller asked for: `softDelete` is a `delete` that a plugin turned into an update. */
|
|
160
|
+
type MutationIntent = MutationKind | "softDelete";
|
|
161
|
+
interface MutationBase {
|
|
162
|
+
/**
|
|
163
|
+
* What the caller asked for, when a plugin rewrote the mutation into
|
|
164
|
+
* another kind. The plugin that rewrites it sets this; mutation events
|
|
165
|
+
* report it.
|
|
166
|
+
*/
|
|
167
|
+
readonly intent?: MutationIntent;
|
|
168
|
+
/**
|
|
169
|
+
* How a mutation without `returning` counts the rows it wrote. Defaults to
|
|
170
|
+
* `exact`; SQL executors always return the statement's own row count.
|
|
171
|
+
*/
|
|
172
|
+
readonly count?: CountMode;
|
|
173
|
+
}
|
|
174
|
+
interface BoundedMutation extends MutationBase {
|
|
175
|
+
/**
|
|
176
|
+
* The most rows the statement may change. More fails with `max_affected`
|
|
177
|
+
* and writes nothing. Over PostgREST it needs PostgREST 13 or later.
|
|
178
|
+
*/
|
|
179
|
+
readonly maxAffected?: number;
|
|
180
|
+
}
|
|
181
|
+
interface InsertOp extends MutationBase {
|
|
182
|
+
readonly kind: "insert";
|
|
183
|
+
readonly table: TableMeta;
|
|
184
|
+
/** Rows keyed by database column names. */
|
|
185
|
+
readonly rows: readonly Readonly<Record<string, unknown>>[];
|
|
186
|
+
readonly returning: Selection | undefined;
|
|
187
|
+
readonly onConflict: {
|
|
188
|
+
readonly columns: readonly string[];
|
|
189
|
+
readonly action: "update" | "ignore";
|
|
190
|
+
} | undefined;
|
|
191
|
+
/**
|
|
192
|
+
* In a multi-row insert, columns some rows leave out become `null`
|
|
193
|
+
* instead of their column default.
|
|
194
|
+
*/
|
|
195
|
+
readonly defaultToNull: boolean;
|
|
196
|
+
}
|
|
197
|
+
interface UpdateOp extends BoundedMutation {
|
|
198
|
+
readonly kind: "update";
|
|
199
|
+
readonly table: TableMeta;
|
|
200
|
+
/** Keyed by database column names. */
|
|
201
|
+
readonly set: Readonly<Record<string, unknown>>;
|
|
202
|
+
readonly where: Condition | undefined;
|
|
203
|
+
readonly returning: Selection | undefined;
|
|
204
|
+
}
|
|
205
|
+
interface DeleteOp extends BoundedMutation {
|
|
206
|
+
readonly kind: "delete";
|
|
207
|
+
readonly table: TableMeta;
|
|
208
|
+
readonly where: Condition | undefined;
|
|
209
|
+
readonly returning: Selection | undefined;
|
|
210
|
+
}
|
|
211
|
+
type Operation = SelectOp | InsertOp | UpdateOp | DeleteOp;
|
|
212
|
+
type MutationOp = InsertOp | UpdateOp | DeleteOp;
|
|
213
|
+
declare const and: (...items: (Condition | undefined)[]) => Condition | undefined;
|
|
214
|
+
declare const or: (...items: Condition[]) => Condition;
|
|
215
|
+
declare const not: (item: Condition) => Condition;
|
|
216
|
+
declare const column: (name: string, op: ColumnOp, value: unknown) => Condition;
|
|
217
|
+
//#endregion
|
|
218
|
+
//#region src/core/executor.d.ts
|
|
219
|
+
interface ExecuteContext {
|
|
220
|
+
/** Already includes the call's `timeout`, when it has one. */
|
|
221
|
+
readonly signal?: AbortSignal;
|
|
222
|
+
readonly errorMappers: readonly ErrorMapper[];
|
|
223
|
+
/**
|
|
224
|
+
* The call's `retry` setting. PostgREST passes it to postgrest-js, which
|
|
225
|
+
* retries idempotent requests on network errors, 503 and 520; executors
|
|
226
|
+
* without retries ignore it.
|
|
227
|
+
*/
|
|
228
|
+
readonly retry?: boolean;
|
|
229
|
+
}
|
|
230
|
+
interface ExecuteResult {
|
|
231
|
+
/** Rows keyed by the aliases in the operation's selection. */
|
|
232
|
+
readonly rows: readonly Record<string, unknown>[];
|
|
233
|
+
readonly count: number | null;
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Runs IR operations. PostgREST (`postgrestExecutor`) and SQL
|
|
237
|
+
* (`better-supabase/postgres`) are built in; any other backend can implement
|
|
238
|
+
* this interface and prove it with `testExecutor` from `better-supabase/testing`.
|
|
239
|
+
*/
|
|
240
|
+
interface Executor {
|
|
241
|
+
readonly name: string;
|
|
242
|
+
/** Honors `SelectOp.source`. `db.$search` fails on executors without it. */
|
|
243
|
+
readonly functionSources?: boolean;
|
|
244
|
+
execute(op: Operation, context: ExecuteContext): Promise<Result<ExecuteResult>>;
|
|
245
|
+
/** Calls a database function. Optional; `db.$rpc` fails without it. */
|
|
246
|
+
rpc?(name: string, args: Readonly<Record<string, unknown>>, context: RpcContext): Promise<Result<unknown>>;
|
|
247
|
+
/**
|
|
248
|
+
* Runs several reads together, for `db.$many`: one transaction on a SQL
|
|
249
|
+
* connection. Returns one result per operation, in order. Optional;
|
|
250
|
+
* without it `db.$many` runs the operations in parallel.
|
|
251
|
+
*/
|
|
252
|
+
batch?(ops: readonly Operation[], context: ExecuteContext): Promise<readonly Result<ExecuteResult>[]>;
|
|
253
|
+
}
|
|
254
|
+
interface RpcContext extends ExecuteContext {
|
|
255
|
+
readonly schema: string;
|
|
256
|
+
/** The function is `stable`: send it as a GET, so read replicas can serve it. */
|
|
257
|
+
readonly get?: boolean;
|
|
258
|
+
readonly function?: FunctionMeta;
|
|
259
|
+
}
|
|
260
|
+
//#endregion
|
|
261
|
+
export { Selection as C, not as D, column as E, or as O, SelectOp as S, and as T, MutationOp as _, AggregateFn as a, Quantifier as b, Condition as c, FunctionSource as d, Include as f, MutationKind as g, MutationIntent as h, RpcContext as i, CountMode as l, Measure as m, ExecuteResult as n, Aggregation as o, InsertOp as p, Executor as r, ColumnOp as s, ExecuteContext as t, DeleteOp as u, Operation as v, UpdateOp as w, SelectColumn as x, OrderTerm as y };
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { a as AnyModels, i as AnyFunctions } from "../types-6BdhkmZe.js";
|
|
2
|
+
import { t as BetterSupabase } from "../define-CJJkkr1-.js";
|
|
3
|
+
import { i as ServerContext, n as ContextOptions, o as ServerOptions, t as BetterServer } from "../server-CeVeeXwz.js";
|
|
4
|
+
import { i as MiddlewareOptions, r as GuardOptions } from "../respond-DoBijysA.js";
|
|
5
|
+
import { t as Validated } from "../shared-DDSjEGDR.js";
|
|
6
|
+
import { AnyEntry, Contributions } from "@supabase/middleware";
|
|
7
|
+
import { ImmutableRequest, MiddlewareFunction } from "expo-server";
|
|
8
|
+
//#region src/bridges/expo.d.ts
|
|
9
|
+
/** Route parameters from the file name (`[id]`, `[...slug]`). */
|
|
10
|
+
type ExpoParams = Record<string, string | string[]>;
|
|
11
|
+
interface ToExpoOptions {
|
|
12
|
+
/** The host's env object for `getEnv`, read per request (EAS Hosting runs on Workers). */
|
|
13
|
+
readonly env?: (request: Request) => unknown;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Runs an entry array around an Expo Router API route handler
|
|
17
|
+
* (`export const GET = toExpo([...], handler)`). Short-circuit responses
|
|
18
|
+
* (a 401 from the guard, a CORS preflight) answer before the handler runs,
|
|
19
|
+
* and the handler's response passes back through the entries.
|
|
20
|
+
*/
|
|
21
|
+
export declare function toExpo<const Entries extends readonly AnyEntry[]>(entries: Entries & Validated<Entries>, handler: (request: Request, ctx: Contributions<Entries>, params: ExpoParams) => Response | Promise<Response>, options?: ToExpoOptions): (request: Request, params?: ExpoParams) => Promise<Response>;
|
|
22
|
+
//#endregion
|
|
23
|
+
//#region src/expo/index.d.ts
|
|
24
|
+
/** A request as Expo Router passes it: `ImmutableRequest` in loaders and middleware, `Request` in API routes. */
|
|
25
|
+
export type ExpoRequest = Request | ImmutableRequest;
|
|
26
|
+
export interface ExpoOptions extends ServerOptions {
|
|
27
|
+
/** Include error details in problem responses. Defaults to `NODE_ENV === 'development'`. */
|
|
28
|
+
readonly exposeErrors?: boolean;
|
|
29
|
+
}
|
|
30
|
+
export interface ExpoContextOptions extends Omit<ContextOptions, "refresh">, GuardOptions {
|
|
31
|
+
/**
|
|
32
|
+
* Refresh an expired cookie session and write the new cookies with
|
|
33
|
+
* `setResponseHeaders`. Defaults to true; bearer tokens never refresh.
|
|
34
|
+
*/
|
|
35
|
+
readonly refresh?: boolean;
|
|
36
|
+
}
|
|
37
|
+
export interface ExpoMiddlewareOptions extends MiddlewareOptions {
|
|
38
|
+
/**
|
|
39
|
+
* Where a caller `allow` refuses goes, e.g. `/sign-in`. Without it the
|
|
40
|
+
* middleware lets every request through and only refreshes the session.
|
|
41
|
+
*/
|
|
42
|
+
readonly redirectTo?: string;
|
|
43
|
+
/**
|
|
44
|
+
* Paths every caller may open, such as `/` or `/pricing`. An entry matches
|
|
45
|
+
* the path itself and everything under it (`/auth` matches
|
|
46
|
+
* `/auth/callback`). The `redirectTo` path and everything under it are
|
|
47
|
+
* always public, so its callback routes never loop back to it.
|
|
48
|
+
*/
|
|
49
|
+
readonly publicPaths?: readonly string[];
|
|
50
|
+
}
|
|
51
|
+
export interface BetterExpo<M extends AnyModels, F extends AnyFunctions, E, C = unknown, P = unknown> extends BetterServer<M, F, E, C, P> {
|
|
52
|
+
/**
|
|
53
|
+
* The verified caller for a server loader, API route or middleware: a
|
|
54
|
+
* bearer token first, the session cookie second. Refreshed session
|
|
55
|
+
* cookies go out through `setResponseHeaders`. With `allow`, a refused
|
|
56
|
+
* caller throws a `StatusError` (401 or 403) that Expo Router answers.
|
|
57
|
+
*/
|
|
58
|
+
request(request: ExpoRequest, options?: ExpoContextOptions): Promise<ServerContext<M, F, E, C, P>>;
|
|
59
|
+
/**
|
|
60
|
+
* A server loader (`export const loader = bs.loader(...)`) that runs `fn`
|
|
61
|
+
* as the caller. A `DbException` from `.orThrow()` becomes a `StatusError`
|
|
62
|
+
* with the error's status. Throws during static rendering, which has no request.
|
|
63
|
+
*/
|
|
64
|
+
loader<T>(fn: (ctx: ServerContext<M, F, E, C, P>, params: ExpoParams, request: ImmutableRequest) => Promise<T> | T, options?: ExpoContextOptions): (request: ImmutableRequest | undefined, params: ExpoParams) => Promise<T>;
|
|
65
|
+
/**
|
|
66
|
+
* An API route handler (`export const GET = bs.handler(...)`): `Result`s
|
|
67
|
+
* become JSON or Problem Details, `undefined` becomes 204.
|
|
68
|
+
*/
|
|
69
|
+
handler(fn: (request: Request, ctx: ServerContext<M, F, E, C, P>, params: ExpoParams) => unknown, options?: MiddlewareOptions): (request: Request, params?: ExpoParams) => Promise<Response>;
|
|
70
|
+
/**
|
|
71
|
+
* `+middleware.ts`: refreshes an expired cookie session once per request,
|
|
72
|
+
* before loaders run, and redirects refused callers when `redirectTo` is set.
|
|
73
|
+
*/
|
|
74
|
+
middleware(options?: ExpoMiddlewareOptions): MiddlewareFunction;
|
|
75
|
+
}
|
|
76
|
+
/** Expo Router integration: server loaders, API routes and `+middleware.ts`. */
|
|
77
|
+
export declare function createExpo<M extends AnyModels, D, F extends AnyFunctions, E, C = unknown, P = unknown>(betterSupabase: BetterSupabase<M, D, F, E, C, P>, options?: ExpoOptions): BetterExpo<M, F, E, C, P>;
|
|
78
|
+
//#endregion
|
|
79
|
+
export type { ExpoParams, GuardOptions, MiddlewareOptions, ToExpoOptions };
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { t as DbException } from "../db-exception-CnWcYPxL.js";
|
|
2
|
+
import { o as toProblem } from "../problem-BreOl8b8.js";
|
|
3
|
+
import { a as unexpectedResponse, c as extendServer, s as createServer, y as refreshFor } from "../adapter-Bc1o3zyy.js";
|
|
4
|
+
import { m as serializeCookie } from "../resolve-D_IcnvFd.js";
|
|
5
|
+
import { a as respond, r as guard, t as defaultExpose } from "../respond-BUgsXNgk.js";
|
|
6
|
+
import { t as withBetterSupabase } from "../composite-DhE66P5u.js";
|
|
7
|
+
import { r as handoffOf } from "../shared-CBxosKK3.js";
|
|
8
|
+
import { bufferRequest, pipeline, seedContext } from "@supabase/middleware";
|
|
9
|
+
import { StatusError, setResponseHeaders } from "expo-server";
|
|
10
|
+
//#region src/bridges/expo.ts
|
|
11
|
+
const PARAMS = Symbol("toExpo.params");
|
|
12
|
+
/**
|
|
13
|
+
* Runs an entry array around an Expo Router API route handler
|
|
14
|
+
* (`export const GET = toExpo([...], handler)`). Short-circuit responses
|
|
15
|
+
* (a 401 from the guard, a CORS preflight) answer before the handler runs,
|
|
16
|
+
* and the handler's response passes back through the entries.
|
|
17
|
+
*/
|
|
18
|
+
function toExpo(entries, handler, options = {}) {
|
|
19
|
+
const run = pipeline(entries, (request, ctx) => Promise.resolve(handler(request, ctx, handoffOf(ctx, PARAMS))));
|
|
20
|
+
return (request, params = {}) => run(request.body ? bufferRequest(request) : request, {
|
|
21
|
+
...seedContext(options.env?.(request)),
|
|
22
|
+
[PARAMS]: params
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
//#endregion
|
|
26
|
+
//#region src/expo/index.ts
|
|
27
|
+
/** `path` is `prefix` or a path under it. */
|
|
28
|
+
function under(path, prefix) {
|
|
29
|
+
const base = prefix.endsWith("/") ? prefix.slice(0, -1) : prefix;
|
|
30
|
+
return base === "" ? path === "/" : path === base || path.startsWith(`${base}/`);
|
|
31
|
+
}
|
|
32
|
+
/** `ImmutableRequest` has no body and immutable headers; the resolver only reads URL, method and headers. */
|
|
33
|
+
function toRequest(request) {
|
|
34
|
+
if (request instanceof Request) return request;
|
|
35
|
+
return new Request(request.url, {
|
|
36
|
+
method: request.method,
|
|
37
|
+
headers: new Headers(request.headers)
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
/** Sends the cookies and headers `ctx.apply` would add to a response. */
|
|
41
|
+
function writeHeaders(ctx) {
|
|
42
|
+
const cookies = ctx.cookies().map(serializeCookie);
|
|
43
|
+
const others = Object.entries(ctx.resolution.headers);
|
|
44
|
+
if (cookies.length === 0 && others.length === 0) return;
|
|
45
|
+
setResponseHeaders((headers) => {
|
|
46
|
+
const sent = new Set(headers.getSetCookie());
|
|
47
|
+
for (const cookie of cookies) if (!sent.has(cookie)) headers.append("set-cookie", cookie);
|
|
48
|
+
for (const [name, value] of others) headers.set(name, value);
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
function statusError(error, expose) {
|
|
52
|
+
const problem = toProblem(error, { expose });
|
|
53
|
+
return new StatusError(problem.status, {
|
|
54
|
+
error: problem.title,
|
|
55
|
+
...problem
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
/** Expo Router integration: server loaders, API routes and `+middleware.ts`. */
|
|
59
|
+
function createExpo(betterSupabase, options = {}) {
|
|
60
|
+
const server = createServer(betterSupabase, options);
|
|
61
|
+
const expose = options.exposeErrors ?? defaultExpose();
|
|
62
|
+
const request = async (incoming, contextOptions = {}) => {
|
|
63
|
+
const { allow, aal, scopes, refresh = true, ...rest } = contextOptions;
|
|
64
|
+
const ctx = await server.context(toRequest(incoming), {
|
|
65
|
+
...rest,
|
|
66
|
+
refresh
|
|
67
|
+
});
|
|
68
|
+
writeHeaders(ctx);
|
|
69
|
+
if (allow !== void 0 || aal !== void 0 || scopes !== void 0) {
|
|
70
|
+
const denied = guard(ctx.auth, allow, aal, scopes);
|
|
71
|
+
if (denied) throw statusError(denied, expose);
|
|
72
|
+
}
|
|
73
|
+
return ctx;
|
|
74
|
+
};
|
|
75
|
+
return extendServer(server, {
|
|
76
|
+
request,
|
|
77
|
+
loader(fn, loaderOptions) {
|
|
78
|
+
return async (incoming, params) => {
|
|
79
|
+
if (!incoming) throw new StatusError(500, "better-supabase: bs.loader() needs a request; static rendering has none (use createStaticLoader)");
|
|
80
|
+
const ctx = await request(incoming, loaderOptions);
|
|
81
|
+
try {
|
|
82
|
+
return await fn(ctx, params, incoming);
|
|
83
|
+
} catch (cause) {
|
|
84
|
+
if (cause instanceof DbException) throw statusError(cause.error, expose);
|
|
85
|
+
throw cause;
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
},
|
|
89
|
+
handler(fn, handlerOptions = {}) {
|
|
90
|
+
return toExpo([withBetterSupabase(server, {
|
|
91
|
+
...handlerOptions,
|
|
92
|
+
expose
|
|
93
|
+
})], async (incoming, ctx, params) => {
|
|
94
|
+
const instance = new URL(incoming.url).pathname;
|
|
95
|
+
try {
|
|
96
|
+
return await respond(() => fn(incoming, ctx.bs, params), {
|
|
97
|
+
instance,
|
|
98
|
+
expose
|
|
99
|
+
});
|
|
100
|
+
} catch (cause) {
|
|
101
|
+
return unexpectedResponse(cause, {
|
|
102
|
+
instance,
|
|
103
|
+
expose
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
},
|
|
108
|
+
middleware(middlewareOptions = {}) {
|
|
109
|
+
const { redirectTo, allow, aal, scopes, publicPaths = [] } = middlewareOptions;
|
|
110
|
+
return async (incoming) => {
|
|
111
|
+
const resolved = toRequest(incoming);
|
|
112
|
+
const ctx = await server.context(resolved, { refresh: refreshFor(middlewareOptions.refresh, resolved) ?? true });
|
|
113
|
+
const url = new URL(incoming.url);
|
|
114
|
+
const target = redirectTo === void 0 ? void 0 : new URL(redirectTo, url);
|
|
115
|
+
if (!target || under(url.pathname, target.pathname) || publicPaths.some((path) => under(url.pathname, path)) || !guard(ctx.auth, allow, aal, scopes)) {
|
|
116
|
+
writeHeaders(ctx);
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
target.searchParams.set("next", url.pathname + url.search);
|
|
120
|
+
return ctx.apply(new Response(null, {
|
|
121
|
+
status: 303,
|
|
122
|
+
headers: { location: target.href }
|
|
123
|
+
}));
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
//#endregion
|
|
129
|
+
export { createExpo, toExpo };
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { r as Executor } from "../executor-DvsBbNBS.js";
|
|
2
|
+
import { n as PowerSyncExecutorOptions, t as PowerSyncDatabaseLike } from "../executor-CaWigTyR.js";
|
|
3
|
+
import { i as checkSqlite, n as sqliteTables, r as watch, t as WatchOptions } from "../watch-DI34G86j.js";
|
|
4
|
+
//#region src/expo-sqlite/executor.d.ts
|
|
5
|
+
/** What an expo-sqlite database or exclusive transaction can run. */
|
|
6
|
+
interface ExpoSqliteContextLike {
|
|
7
|
+
getAllAsync<T>(source: string, params: unknown[]): Promise<T[]>;
|
|
8
|
+
runAsync(source: string, params: unknown[]): Promise<unknown>;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* The part of expo-sqlite's `SQLiteDatabase` the executor uses. Typed by
|
|
12
|
+
* shape, so better-supabase doesn't depend on expo-sqlite.
|
|
13
|
+
*/
|
|
14
|
+
interface ExpoSqliteDatabaseLike extends ExpoSqliteContextLike {
|
|
15
|
+
/** Filters change events to this database when several are open. */
|
|
16
|
+
readonly databasePath?: string;
|
|
17
|
+
withTransactionAsync(task: () => Promise<void>): Promise<void>;
|
|
18
|
+
/** Native only: isolates the transaction from other queries on `db`. */
|
|
19
|
+
withExclusiveTransactionAsync?(task: (txn: ExpoSqliteContextLike) => Promise<void>): Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
/** The fields of an expo-sqlite change event the watcher reads. */
|
|
22
|
+
interface DatabaseChangeEventLike {
|
|
23
|
+
readonly tableName: string;
|
|
24
|
+
readonly databaseFilePath?: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* expo-sqlite's `addDatabaseChangeListener`. Open the database with
|
|
28
|
+
* `{ enableChangeListener: true }` so it reports changes.
|
|
29
|
+
*/
|
|
30
|
+
type AddDatabaseChangeListener = (listener: (event: DatabaseChangeEventLike) => void) => {
|
|
31
|
+
remove(): void;
|
|
32
|
+
};
|
|
33
|
+
interface ExpoSqliteOptions extends PowerSyncExecutorOptions {
|
|
34
|
+
/** Enables `watch()` and `useWatch()` on the database. */
|
|
35
|
+
readonly addDatabaseChangeListener?: AddDatabaseChangeListener;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* An expo-sqlite database in the shape the SQLite executor, `watch()` and
|
|
39
|
+
* `useWatch()` read. Writes run in `withExclusiveTransactionAsync` on
|
|
40
|
+
* native and `withTransactionAsync` on web.
|
|
41
|
+
*/
|
|
42
|
+
export declare function expoSqliteDatabase(db: ExpoSqliteDatabaseLike, options?: Pick<ExpoSqliteOptions, "addDatabaseChangeListener">): PowerSyncDatabaseLike;
|
|
43
|
+
/**
|
|
44
|
+
* Runs repository operations on an expo-sqlite database, without PowerSync:
|
|
45
|
+
* the same repositories and list definitions work on a local database the
|
|
46
|
+
* app owns. Reads return rows in the PostgREST shape; what SQLite can't
|
|
47
|
+
* express returns a `DbError` of kind `unsupported`. An insert that leaves
|
|
48
|
+
* out a text or uuid key gets `crypto.randomUUID()`, else a UUID from
|
|
49
|
+
* SQLite.
|
|
50
|
+
*
|
|
51
|
+
* ```ts
|
|
52
|
+
* const sqlite = await openDatabaseAsync("app.db", { enableChangeListener: true });
|
|
53
|
+
* const db = betterSupabase.connect(expoSqliteExecutor(sqlite, { addDatabaseChangeListener }));
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
export declare function expoSqliteExecutor(db: ExpoSqliteDatabaseLike, options?: ExpoSqliteOptions): Executor;
|
|
57
|
+
//#endregion
|
|
58
|
+
export { type AddDatabaseChangeListener, type DatabaseChangeEventLike, type ExpoSqliteContextLike, type ExpoSqliteDatabaseLike, type ExpoSqliteOptions, type WatchOptions, checkSqlite, sqliteTables, watch };
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { n as watch, t as sqliteTables } from "../watch-Xuxrvxq-.js";
|
|
2
|
+
import { i as checkSqlite, r as powersyncExecutor } from "../executor-Bq28caBo.js";
|
|
3
|
+
//#region src/expo-sqlite/executor.ts
|
|
4
|
+
const DEFAULT_THROTTLE_MS = 30;
|
|
5
|
+
/** A UUID v4 from SQLite's `randomblob`, for runtimes without `crypto.randomUUID`. */
|
|
6
|
+
const UUID_SQL = "select lower(hex(randomblob(4)) || '-' || hex(randomblob(2)) || '-4' || substr(hex(randomblob(2)), 2) || '-' || substr('89ab', 1 + (abs(random()) % 4), 1) || substr(hex(randomblob(2)), 2) || '-' || hex(randomblob(6))) as id";
|
|
7
|
+
function contextOf(db) {
|
|
8
|
+
return {
|
|
9
|
+
getAll: (sql, parameters = []) => db.getAllAsync(sql, parameters),
|
|
10
|
+
execute: (sql, parameters = []) => db.runAsync(sql, parameters)
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
function changesOf(db, addListener) {
|
|
14
|
+
return (handler, options = {}) => {
|
|
15
|
+
const tables = options.tables ? new Set(options.tables) : void 0;
|
|
16
|
+
const throttleMs = options.throttleMs ?? DEFAULT_THROTTLE_MS;
|
|
17
|
+
let pending = /* @__PURE__ */ new Set();
|
|
18
|
+
let timer;
|
|
19
|
+
const flush = () => {
|
|
20
|
+
timer = void 0;
|
|
21
|
+
const changedTables = [...pending];
|
|
22
|
+
pending = /* @__PURE__ */ new Set();
|
|
23
|
+
if (changedTables.length > 0) handler.onChange({ changedTables });
|
|
24
|
+
};
|
|
25
|
+
const subscription = addListener((event) => {
|
|
26
|
+
if (event.databaseFilePath !== void 0 && db.databasePath !== void 0 && event.databaseFilePath !== db.databasePath) return;
|
|
27
|
+
if (tables && !tables.has(event.tableName)) return;
|
|
28
|
+
pending.add(event.tableName);
|
|
29
|
+
timer ??= setTimeout(flush, throttleMs);
|
|
30
|
+
});
|
|
31
|
+
const stop = () => {
|
|
32
|
+
subscription.remove();
|
|
33
|
+
if (timer !== void 0) clearTimeout(timer);
|
|
34
|
+
timer = void 0;
|
|
35
|
+
pending = /* @__PURE__ */ new Set();
|
|
36
|
+
};
|
|
37
|
+
options.signal?.addEventListener("abort", stop, { once: true });
|
|
38
|
+
return stop;
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* An expo-sqlite database in the shape the SQLite executor, `watch()` and
|
|
43
|
+
* `useWatch()` read. Writes run in `withExclusiveTransactionAsync` on
|
|
44
|
+
* native and `withTransactionAsync` on web.
|
|
45
|
+
*/
|
|
46
|
+
function expoSqliteDatabase(db, options = {}) {
|
|
47
|
+
const context = contextOf(db);
|
|
48
|
+
const database = {
|
|
49
|
+
...context,
|
|
50
|
+
async writeTransaction(callback) {
|
|
51
|
+
let box;
|
|
52
|
+
if (db.withExclusiveTransactionAsync) await db.withExclusiveTransactionAsync(async (txn) => {
|
|
53
|
+
box = { value: await callback(contextOf(txn)) };
|
|
54
|
+
});
|
|
55
|
+
else await db.withTransactionAsync(async () => {
|
|
56
|
+
box = { value: await callback(context) };
|
|
57
|
+
});
|
|
58
|
+
if (!box) throw new TypeError("expo-sqlite skipped the transaction");
|
|
59
|
+
return box.value;
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
const addListener = options.addDatabaseChangeListener;
|
|
63
|
+
return addListener ? {
|
|
64
|
+
...database,
|
|
65
|
+
onChange: changesOf(db, addListener)
|
|
66
|
+
} : database;
|
|
67
|
+
}
|
|
68
|
+
/** Hermes has no `crypto` unless the app installs a polyfill. */
|
|
69
|
+
function randomId() {
|
|
70
|
+
const { crypto } = globalThis;
|
|
71
|
+
return crypto?.randomUUID?.();
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Runs repository operations on an expo-sqlite database, without PowerSync:
|
|
75
|
+
* the same repositories and list definitions work on a local database the
|
|
76
|
+
* app owns. Reads return rows in the PostgREST shape; what SQLite can't
|
|
77
|
+
* express returns a `DbError` of kind `unsupported`. An insert that leaves
|
|
78
|
+
* out a text or uuid key gets `crypto.randomUUID()`, else a UUID from
|
|
79
|
+
* SQLite.
|
|
80
|
+
*
|
|
81
|
+
* ```ts
|
|
82
|
+
* const sqlite = await openDatabaseAsync("app.db", { enableChangeListener: true });
|
|
83
|
+
* const db = betterSupabase.connect(expoSqliteExecutor(sqlite, { addDatabaseChangeListener }));
|
|
84
|
+
* ```
|
|
85
|
+
*/
|
|
86
|
+
function expoSqliteExecutor(db, options = {}) {
|
|
87
|
+
const database = expoSqliteDatabase(db, options);
|
|
88
|
+
const newId = options.newId ?? (async (_table) => {
|
|
89
|
+
const random = randomId();
|
|
90
|
+
if (random !== void 0) return random;
|
|
91
|
+
const [row] = await database.getAll(UUID_SQL);
|
|
92
|
+
if (!row) throw new TypeError("SQLite returned no id");
|
|
93
|
+
return row.id;
|
|
94
|
+
});
|
|
95
|
+
return {
|
|
96
|
+
...powersyncExecutor(database, {
|
|
97
|
+
...options,
|
|
98
|
+
newId
|
|
99
|
+
}),
|
|
100
|
+
name: "expo-sqlite"
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
//#endregion
|
|
104
|
+
export { checkSqlite, expoSqliteDatabase, expoSqliteExecutor, sqliteTables, watch };
|