better-supabase 0.5.1 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +187 -46
- package/dist/access-sql-B0dF-SoF.js +181 -0
- package/dist/{actor-DaJjqD5R.d.ts → actor-CQTlc1Hh.d.ts} +1 -1
- package/dist/adapter-Bc1o3zyy.js +1106 -0
- package/dist/agents-CVHGd7It.d.ts +94 -0
- package/dist/ai-cache-CBWs1W0k.js +80 -0
- package/dist/ai-cache-DaDu_G5L.d.ts +64 -0
- package/dist/ai-chat-7amvXjmQ.d.ts +590 -0
- package/dist/ai-chat-B24UI962.js +743 -0
- package/dist/ai-files-CSPNswUY.js +319 -0
- package/dist/ai-sdk/agents/index.d.ts +74 -0
- package/dist/ai-sdk/agents/index.js +159 -0
- package/dist/ai-sdk/batches/index.d.ts +74 -0
- package/dist/ai-sdk/batches/index.js +180 -0
- package/dist/ai-sdk/cache/index.d.ts +38 -0
- package/dist/ai-sdk/cache/index.js +127 -0
- package/dist/ai-sdk/chat/index.d.ts +2 -0
- package/dist/ai-sdk/chat/index.js +246 -0
- package/dist/ai-sdk/embeddings/index.d.ts +3 -0
- package/dist/ai-sdk/embeddings/index.js +2 -0
- package/dist/ai-sdk/files/index.d.ts +61 -0
- package/dist/ai-sdk/files/index.js +111 -0
- package/dist/ai-sdk/index.d.ts +145 -0
- package/dist/ai-sdk/index.js +174 -0
- package/dist/ai-sdk/mcp/index.d.ts +102 -0
- package/dist/ai-sdk/mcp/index.js +362 -0
- package/dist/ai-sdk/memory/index.d.ts +67 -0
- package/dist/ai-sdk/memory/index.js +175 -0
- package/dist/ai-sdk/react/index.d.ts +2 -0
- package/dist/ai-sdk/react/index.js +3 -0
- package/dist/ai-sdk/react/server.d.ts +6 -0
- package/dist/ai-sdk/react/server.js +7 -0
- package/dist/ai-sdk/workflow/index.d.ts +249 -0
- package/dist/ai-sdk/workflow/index.js +575 -0
- package/dist/ai-sdk/workflow/react/index.d.ts +20 -0
- package/dist/ai-sdk/workflow/react/index.js +66 -0
- package/dist/ai-sdk/workflow/react/server.d.ts +10 -0
- package/dist/ai-sdk/workflow/react/server.js +12 -0
- package/dist/ai-tasks-Cd1HMFvB.d.ts +131 -0
- package/dist/announcements-CiyOs-xP.js +107 -0
- package/dist/announcements-ZRGnScWI.d.ts +72 -0
- package/dist/api-keys-rCGtKaZA.d.ts +156 -0
- package/dist/assistant-DwdpDH1q.d.ts +147 -0
- package/dist/astro/index.d.ts +86 -0
- package/dist/astro/index.js +93 -0
- package/dist/attributes-5dYul0u0.js +13 -0
- package/dist/auth-link-BjFPqwLz.d.ts +97 -0
- package/dist/auth-link-DrDX9KOT.js +114 -0
- package/dist/authorization-BFCqamMs.d.ts +172 -0
- package/dist/before-route-CnR0C0Jr.js +30 -0
- package/dist/bind-Bu_ZNa3W.d.ts +62 -0
- package/dist/bind-l4kAvYSv.js +97 -0
- package/dist/block-events-CrT8r7Fe.js +76 -0
- package/dist/block-fields-GFkxl4dP.js +49 -0
- package/dist/block-fields-SJ6fEf3o.d.ts +31 -0
- package/dist/block-helpers-CKtbFcRv.d.ts +37 -0
- package/dist/block-helpers-DWHxHsEQ.js +190 -0
- package/dist/block-hooks-BmjMyXTa.js +114 -0
- package/dist/block-hooks-plbZ0AbJ.d.ts +107 -0
- package/dist/{kit-transport-DJlHQUBU.js → block-transport-BLr-ZgLc.js} +11 -7
- package/dist/block-transport-DvaoPuZ9.d.ts +48 -0
- package/dist/blocks/agents/index.d.ts +3 -0
- package/dist/blocks/agents/index.js +123 -0
- package/dist/blocks/ai-cache/index.d.ts +3 -0
- package/dist/blocks/ai-cache/index.js +3 -0
- package/dist/blocks/ai-chat/index.d.ts +31 -0
- package/dist/blocks/ai-chat/index.js +5 -0
- package/dist/blocks/ai-chat/react/index.d.ts +77 -0
- package/dist/blocks/ai-chat/react/index.js +387 -0
- package/dist/blocks/ai-chat/react/server.d.ts +16 -0
- package/dist/blocks/ai-chat/react/server.js +14 -0
- package/dist/blocks/ai-files/index.d.ts +14 -0
- package/dist/blocks/ai-files/index.js +3 -0
- package/dist/blocks/ai-providers/index.d.ts +7 -0
- package/dist/blocks/ai-providers/index.js +211 -0
- package/dist/blocks/ai-tasks/index.d.ts +3 -0
- package/dist/blocks/ai-tasks/index.js +203 -0
- package/dist/blocks/announcements/index.d.ts +3 -0
- package/dist/blocks/announcements/index.js +3 -0
- package/dist/blocks/announcements/react/index.d.ts +31 -0
- package/dist/blocks/announcements/react/index.js +86 -0
- package/dist/blocks/announcements/react/server.d.ts +6 -0
- package/dist/blocks/announcements/react/server.js +7 -0
- package/dist/blocks/api-keys/index.d.ts +35 -0
- package/dist/blocks/api-keys/index.js +334 -0
- package/dist/blocks/attachments/index.d.ts +210 -0
- package/dist/blocks/attachments/index.js +222 -0
- package/dist/blocks/audit/index.d.ts +366 -0
- package/dist/blocks/audit/index.js +714 -0
- package/dist/blocks/billing/index.d.ts +265 -0
- package/dist/blocks/billing/index.js +400 -0
- package/dist/blocks/comments/index.d.ts +200 -0
- package/dist/blocks/comments/index.js +207 -0
- package/dist/blocks/connectors/index.d.ts +3 -0
- package/dist/blocks/connectors/index.js +164 -0
- package/dist/blocks/data-lifecycle/index.d.ts +251 -0
- package/dist/blocks/data-lifecycle/index.js +353 -0
- package/dist/blocks/entitlements/index.d.ts +14 -0
- package/dist/blocks/entitlements/index.js +25 -0
- package/dist/blocks/flags/index.d.ts +226 -0
- package/dist/blocks/flags/index.js +282 -0
- package/dist/blocks/inbox/index.d.ts +6 -0
- package/dist/blocks/inbox/index.js +499 -0
- package/dist/blocks/inbox/react/index.d.ts +2 -0
- package/dist/blocks/inbox/react/index.js +225 -0
- package/dist/blocks/inbox/react/server.d.ts +10 -0
- package/dist/blocks/inbox/react/server.js +12 -0
- package/dist/blocks/index.d.ts +65 -0
- package/dist/blocks/index.js +77 -0
- package/dist/blocks/jobs/index.d.ts +297 -0
- package/dist/blocks/jobs/index.js +1051 -0
- package/dist/blocks/knowledge/index.d.ts +3 -0
- package/dist/blocks/knowledge/index.js +3 -0
- package/dist/blocks/memory/index.d.ts +8 -0
- package/dist/blocks/memory/index.js +289 -0
- package/dist/blocks/notifications/index.d.ts +297 -0
- package/dist/blocks/notifications/index.js +425 -0
- package/dist/blocks/notifications/react/index.d.ts +44 -0
- package/dist/blocks/notifications/react/index.js +67 -0
- package/dist/blocks/notifications/react/server.d.ts +6 -0
- package/dist/blocks/notifications/react/server.js +7 -0
- package/dist/blocks/onboarding/index.d.ts +3 -0
- package/dist/blocks/onboarding/index.js +64 -0
- package/dist/blocks/onboarding/react/index.d.ts +28 -0
- package/dist/blocks/onboarding/react/index.js +78 -0
- package/dist/blocks/onboarding/react/server.d.ts +7 -0
- package/dist/blocks/onboarding/react/server.js +7 -0
- package/dist/blocks/organizations/index.d.ts +241 -0
- package/dist/blocks/organizations/index.js +400 -0
- package/dist/blocks/outbox/index.d.ts +3 -0
- package/dist/blocks/outbox/index.js +266 -0
- package/dist/blocks/profiles/index.d.ts +40 -0
- package/dist/blocks/profiles/index.js +28 -0
- package/dist/blocks/push/index.d.ts +185 -0
- package/dist/blocks/push/index.js +258 -0
- package/dist/blocks/settings/index.d.ts +89 -0
- package/dist/blocks/settings/index.js +104 -0
- package/dist/blocks/sso/index.d.ts +198 -0
- package/dist/blocks/sso/index.js +1297 -0
- package/dist/blocks/usage/index.d.ts +4 -0
- package/dist/blocks/usage/index.js +233 -0
- package/dist/blocks/waitlist/index.d.ts +117 -0
- package/dist/blocks/waitlist/index.js +132 -0
- package/dist/blocks/webhooks/index.d.ts +304 -0
- package/dist/{webhooks → blocks/webhooks}/index.js +468 -148
- package/dist/blocks/workflow-builder/index.d.ts +21 -0
- package/dist/blocks/workflow-builder/index.js +5 -0
- package/dist/blocks/workflow-builder/react/index.d.ts +47 -0
- package/dist/blocks/workflow-builder/react/index.js +119 -0
- package/dist/blocks/workflow-builder/react/server.d.ts +8 -0
- package/dist/blocks/workflow-builder/react/server.js +11 -0
- package/dist/blocks/workflows/index.d.ts +3 -0
- package/dist/blocks/workflows/index.js +3 -0
- package/dist/blocks/workflows/react/index.d.ts +47 -0
- package/dist/blocks/workflows/react/index.js +137 -0
- package/dist/blocks/workflows/react/server.d.ts +8 -0
- package/dist/blocks/workflows/react/server.js +11 -0
- package/dist/{index-SaTsEfGP.d.ts → bucket-Cl46E3jS.d.ts} +134 -91
- package/dist/{simplify-_0oUKqCd.js → build-BXIzE6Xv.js} +222 -124
- package/dist/{channel-FQW-CnGR.d.ts → channel-_2Mx1Oyu.d.ts} +2 -2
- package/dist/channels-CkgQ_X60.js +114 -0
- package/dist/chat-sdk/index.d.ts +303 -0
- package/dist/chat-sdk/index.js +733 -0
- package/dist/chat-sdk/react/index.d.ts +2 -0
- package/dist/chat-sdk/react/index.js +3 -0
- package/dist/chat-sdk/react/server.d.ts +3 -0
- package/dist/chat-sdk/react/server.js +2 -0
- package/dist/claims-DDBQT6BK.js +61 -0
- package/dist/{claims-BAf6c7is.js → claims-PqzCxaTD.js} +39 -2
- package/dist/cli/bin.js +1 -1
- package/dist/cli/{codemod-DqV7612m.js → codemod-Bl_tQpHn.js} +105 -2
- package/dist/cli/config-B9HkL8nF.js +2 -0
- package/dist/cli/config-DU7EJImt.js +49 -0
- package/dist/cli/config-NiPxAmUF.js +1077 -0
- package/dist/cli/{dist-xn4wlboc.js → dist-DRAVaE6w.js} +111 -1
- package/dist/cli/{doctor-C_A-KEAz.js → doctor-B4JOm_ox.js} +991 -317
- package/dist/cli/{env-DmKv_G4A.js → env-CJLbUVPB.js} +1 -1
- package/dist/cli/{env-jIFUADLY.js → env-qXgyMV6r.js} +2 -2
- package/dist/cli/fresh-import-BeYf9I3x.js +40 -0
- package/dist/cli/gen-BGLb_zou.js +3100 -0
- package/dist/cli/gen-DAH8FM2W.js +2 -0
- package/dist/cli/index.d.ts +44 -5
- package/dist/cli/index.js +7 -7
- package/dist/cli/{init-DMa6M7hV.js → init-BIIwclPg.js} +242 -27
- package/dist/cli/{introspect-BKlaIu_M.js → introspect-DNUTuNvb.js} +5 -5
- package/dist/cli/{io-k41_z-jT.js → io-DI1mTdSA.js} +12 -3
- package/dist/cli/{keys-ByKHnvP9.js → keys-BGCnnb-s.js} +8 -6
- package/dist/cli/{ohash-D7bG_EOb.js → ohash-BjQY1cBb.js} +1 -1
- package/dist/cli/{openapi-Cp5Fyta-.js → openapi-BlRJ18s3.js} +2 -2
- package/dist/cli/{project-B_GeXyHh.js → project-DZRaBaY7.js} +11 -6
- package/dist/cli/read-sets-CETOSFx4.js +223 -0
- package/dist/cli/{run-Bo_NLT5n.js → run-DNWxHynX.js} +33 -23
- package/dist/cli/{seed-CUlqWh-8.js → seed-DQzqT7LP.js} +8 -6
- package/dist/cli/{skills-LJJIhLFR.js → skills-QQs4q68J.js} +3 -2
- package/dist/cli/sql-D0GUtUPp.js +536 -0
- package/dist/cli/{config-CPVpXP5I.js → supabase-toml-B-bIukQF.js} +72 -942
- package/dist/cli/typegen-version-DeFbtzYI.js +8 -0
- package/dist/cli/{version-BCtlgDQx.js → version-hr88OZG0.js} +1 -1
- package/dist/client/index.d.ts +3 -2
- package/dist/client/index.js +11 -71
- package/dist/client/native/index.d.ts +228 -0
- package/dist/client/native/index.js +361 -0
- package/dist/client-CI0Z2zWX.js +277 -0
- package/dist/cloud-event-BnmD5fb9.js +46 -0
- package/dist/cloud-event-C1JCc1bH.d.ts +50 -0
- package/dist/{compiler-BXH_aZ7N.d.ts → compiler-DY_wkj4R.d.ts} +2 -2
- package/dist/compose-BIBNgAnq.js +53 -0
- package/dist/composite-Bt1YK3Ke.d.ts +146 -0
- package/dist/composite-DhE66P5u.js +130 -0
- package/dist/config/index.d.ts +6 -4
- package/dist/config/index.js +5 -5
- package/dist/{config-Bv7gvfzC.d.ts → config-D44Y7PAv.d.ts} +406 -214
- package/dist/{config-DreERlKo.js → config-Dn7F5k9A.js} +62 -14
- package/dist/connector-Dv8kK0MO.d.ts +107 -0
- package/dist/connectors-hkLCwyEz.d.ts +120 -0
- package/dist/context-BCrWe7ow.d.ts +237 -0
- package/dist/credentials/index.d.ts +31 -0
- package/dist/credentials/index.js +168 -0
- package/dist/cron-DVPUg5k3.js +145 -0
- package/dist/csv-CPAzEmB6.js +25 -0
- package/dist/db-exception-CnWcYPxL.js +15 -0
- package/dist/{define-cNKzqwL_.js → define-B-TVjC25.js} +784 -227
- package/dist/{define-Bp_BZa5h.d.ts → define-CJJkkr1-.d.ts} +353 -61
- package/dist/edge/index.d.ts +69 -11
- package/dist/edge/index.js +191 -75
- package/dist/elysia/index.d.ts +59 -0
- package/dist/elysia/index.js +62 -0
- package/dist/embeddings-4ZvFzjsU.js +127 -0
- package/dist/embeddings-C9KGQnXt.d.ts +68 -0
- package/dist/{refresh-CFPX0Qft.d.ts → ended-jLfvw8h-.d.ts} +20 -2
- package/dist/{entitlements-BiJZ4t49.d.ts → entitlements-DHrY2UDZ.d.ts} +16 -7
- package/dist/entitlements-DRl6ZJUm.js +24 -0
- package/dist/envelope-DqnYGRw7.js +47 -0
- package/dist/{errors-DtwXa6b8.js → errors-B11Duf73.js} +82 -13
- package/dist/errors-DLjJHPLK.js +44 -0
- package/dist/escape-like-DHfx6jRr.js +7 -0
- package/dist/escape-like-ImTK0ps_.d.ts +15 -0
- package/dist/eve/index.d.ts +220 -0
- package/dist/eve/index.js +504 -0
- package/dist/eve-gT2Fpjut.d.ts +151 -0
- package/dist/events/index.d.ts +4 -3
- package/dist/events/index.js +9 -50
- package/dist/events-DWDhx77e.d.ts +549 -0
- package/dist/executor-Bq28caBo.js +718 -0
- package/dist/executor-C-R4pucm.js +83 -0
- package/dist/executor-CaWigTyR.d.ts +148 -0
- package/dist/executor-D14tGopJ.d.ts +36 -0
- package/dist/{executor-Cghdstwu.d.ts → executor-DbvExCFC.d.ts} +7 -1
- package/dist/{sql-Coh6n4cC.js → executor-De1Of3m3.js} +210 -11
- package/dist/executor-DvsBbNBS.d.ts +261 -0
- package/dist/expo/index.d.ts +79 -0
- package/dist/expo/index.js +129 -0
- package/dist/expo-sqlite/index.d.ts +58 -0
- package/dist/expo-sqlite/index.js +104 -0
- package/dist/field-errors-BFOa7WhB.d.ts +99 -0
- package/dist/field-errors-VF1yb8yI.js +13 -0
- package/dist/framework-CONDyPYx.js +51 -0
- package/dist/framework-DuVb4Xa8.d.ts +25 -0
- package/dist/gateway-C1ssRHnf.d.ts +130 -0
- package/dist/graph-BGyLLFLX.js +265 -0
- package/dist/h3/index.d.ts +59 -0
- package/dist/h3/index.js +55 -0
- package/dist/h3/v1/index.d.ts +63 -0
- package/dist/h3/v1/index.js +49 -0
- package/dist/history-BZih6SFP.js +64 -0
- package/dist/hono/index.d.ts +56 -7
- package/dist/hono/index.js +97 -45
- package/dist/{react-C_s7kiNz.js → hooks-1BTCJsiw.js} +104 -133
- package/dist/http-Cv4T29xh.js +40 -0
- package/dist/http-DdYadv-o.js +126 -0
- package/dist/image-url-pIVlO6R1.js +41 -0
- package/dist/{impersonation-BgSHAYLf.js → impersonation-DcqaTBHx.js} +21 -6
- package/dist/inbox-i7E1ppo6.d.ts +384 -0
- package/dist/index-ACiNPN4Z.d.ts +74 -0
- package/dist/{index-DgILJRXj.d.ts → index-Bepi-Hgg.d.ts} +91 -28
- package/dist/index-BkWT_uBO.d.ts +51 -0
- package/dist/index-BpFYMsi0.d.ts +53 -0
- package/dist/{index-C7f8cOBM.d.ts → index-Bxih3l0u.d.ts} +2 -2
- package/dist/index-CaxrMD1A.d.ts +1 -0
- package/dist/index-ClmjK_o-.d.ts +55 -0
- package/dist/index-CtuakVRc.d.ts +267 -0
- package/dist/index-D48jVS-N.d.ts +246 -0
- package/dist/index-DDrYaUcq.d.ts +138 -0
- package/dist/index-DQh4VCc9.d.ts +98 -0
- package/dist/{live-D9W2M5aO.d.ts → index-DunNRdnT.d.ts} +136 -38
- package/dist/index.d.ts +65 -18
- package/dist/index.js +42 -14
- package/dist/invalidate-BBqhpxyB.d.ts +19 -0
- package/dist/json-CEnpTHlZ.js +16 -0
- package/dist/json-schema-CvER4kgT.js +502 -0
- package/dist/keys-4MnkWTTh.js +35 -0
- package/dist/kit-B5tid-q5.d.ts +60 -0
- package/dist/kit-Fm-Fv7q5.js +78 -0
- package/dist/knowledge-BXBbT0Tr.d.ts +176 -0
- package/dist/knowledge-CDmiMLew.js +255 -0
- package/dist/lint/index.d.ts +1 -1
- package/dist/lint/index.js +37 -0
- package/dist/list/index.d.ts +3 -2
- package/dist/list/index.js +1 -444
- package/dist/{index-fag8VJZ2.d.ts → list-query-BRt-zDF7.d.ts} +20 -12
- package/dist/list-query-gl808ac1.js +459 -0
- package/dist/{live-CdJBOc4f.js → live-CTAZQkwl.js} +99 -14
- package/dist/logger-DWVYUmwi.d.ts +18 -0
- package/dist/mcp/index.d.ts +38 -11
- package/dist/mcp/index.js +82 -46
- package/dist/mcp/sdk/index.d.ts +105 -0
- package/dist/mcp/sdk/index.js +126 -0
- package/dist/message-CaKlqdsX.js +219 -0
- package/dist/message-CfDoR0Y6.d.ts +94 -0
- package/dist/messages-B9-5887d.js +715 -0
- package/dist/messages-DYP0sUTe.d.ts +59 -0
- package/dist/mfa-Daak8ukG.d.ts +54 -0
- package/dist/modules-DpPwzC7E.d.ts +192 -0
- package/dist/modules-dxrVK3ID.js +228 -0
- package/dist/nestjs/index.d.ts +68 -0
- package/dist/nestjs/index.js +164 -0
- package/dist/next/client/index.d.ts +35 -0
- package/dist/next/client/index.js +36 -0
- package/dist/next/image/index.js +3 -24
- package/dist/next/index.d.ts +150 -51
- package/dist/next/index.js +261 -107
- package/dist/node/index.d.ts +4 -0
- package/dist/node/index.js +210 -0
- package/dist/node-headers-AO06VhqH.d.ts +24 -0
- package/dist/node-headers-C71zNQHe.js +55 -0
- package/dist/nuxt/index.d.ts +60 -0
- package/dist/nuxt/index.js +64 -0
- package/dist/onboarding-BZGHYJks.d.ts +62 -0
- package/dist/openapi/index.d.ts +1 -1
- package/dist/openapi/index.js +3 -3
- package/dist/orpc/index.d.ts +70 -11
- package/dist/orpc/index.js +73 -24
- package/dist/otel/index.d.ts +7 -7
- package/dist/otel/index.js +87 -57
- package/dist/outbox-Cq7pPYvl.d.ts +161 -0
- package/dist/{plugin-o144f322.d.ts → plugin-FGY8UhYm.d.ts} +30 -10
- package/dist/plugin-tfXW1-qO.js +45 -0
- package/dist/plugins/actor/index.d.ts +2 -2
- package/dist/plugins/actor/index.js +3 -3
- package/dist/plugins/rules/index.d.ts +11 -4
- package/dist/plugins/rules/index.js +40 -13
- package/dist/plugins/soft-delete/index.d.ts +5 -4
- package/dist/plugins/soft-delete/index.js +10 -5
- package/dist/plugins/tenant/index.d.ts +2 -2
- package/dist/plugins/tenant/index.js +18 -11
- package/dist/plugins/timestamps/index.d.ts +5 -3
- package/dist/plugins/timestamps/index.js +6 -4
- package/dist/plugins/validation/index.d.ts +2 -2
- package/dist/plugins/validation/index.js +10 -6
- package/dist/{pool-C9voM4Kw.d.ts → pool-CAu2nLrL.d.ts} +2 -2
- package/dist/postgres/index.d.ts +4 -4
- package/dist/postgres/index.js +1 -2
- package/dist/{postgrest-CruYKAvV.d.ts → postgrest-BLVdEnfe.d.ts} +13 -3
- package/dist/powersync/index.d.ts +43 -0
- package/dist/powersync/index.js +199 -0
- package/dist/powersync/react/index.d.ts +87 -0
- package/dist/powersync/react/index.js +108 -0
- package/dist/{problem-BW1KhzSG.js → problem-BreOl8b8.js} +14 -3
- package/dist/{problem-Blxe8S31.d.ts → problem-DD8LZFjc.d.ts} +21 -3
- package/dist/provider-BH5UWZJ6.d.ts +113 -0
- package/dist/provider-Di3sRutW.js +57 -0
- package/dist/query/index.d.ts +4 -2
- package/dist/query/index.js +4 -3
- package/dist/{query-CCbo44lG.js → query-BQ-NaZon.js} +141 -24
- package/dist/{queue-BYUCjr59.d.ts → queue-CLJurhdy.d.ts} +258 -83
- package/dist/react/index.d.ts +11 -7
- package/dist/react/index.js +7 -3
- package/dist/react/native/index.d.ts +116 -0
- package/dist/react/native/index.js +130 -0
- package/dist/react/server.d.ts +28 -10
- package/dist/react/server.js +22 -5
- package/dist/react/session.d.ts +2 -2
- package/dist/react-4ZqkP8da.js +79 -0
- package/dist/react-F80mF4-t.js +409 -0
- package/dist/react-router/index.d.ts +83 -0
- package/dist/react-router/index.js +89 -0
- package/dist/react-topic-seAWjL3_.js +38 -0
- package/dist/{read-set-DQFt1N_Y.js → read-set-DuKWC9Mj.js} +67 -25
- package/dist/realtime/index.d.ts +4 -5
- package/dist/realtime/index.js +144 -82
- package/dist/refusal-CeJWxmkH.js +61 -0
- package/dist/refusal-D1rgbzNq.d.ts +15 -0
- package/dist/replicas-CwrYp5Zj.js +94 -0
- package/dist/{view-Bn6HNKUe.js → resolve-D_IcnvFd.js} +248 -240
- package/dist/{impersonation-BmePsuxz.d.ts → resolve-KW8nCeL6.d.ts} +29 -69
- package/dist/{resource-mqfJW4YF.js → resource-BsvzCMlX.js} +4 -4
- package/dist/{resource-DNRFP7KR.d.ts → resource-D6Uc7Sk7.d.ts} +5 -5
- package/dist/respond-BUgsXNgk.js +91 -0
- package/dist/respond-DoBijysA.d.ts +93 -0
- package/dist/result-D7y2fT87.d.ts +282 -0
- package/dist/{result-BKiliPY7.js → result-DzUbqgdW.js} +27 -2
- package/dist/run-state-CPo-1X2B.d.ts +12 -0
- package/dist/run-state-CgBKzYMW.js +13 -0
- package/dist/search-CUWCRYKL.js +9 -0
- package/dist/server/index.d.ts +143 -22
- package/dist/server/index.js +46 -14
- package/dist/{respond-BR1fJWOB.d.ts → server-CeVeeXwz.d.ts} +224 -85
- package/dist/session-ChiXDZdZ.d.ts +72 -0
- package/dist/shared-CBxosKK3.js +75 -0
- package/dist/{shared-D1dRUrAg.js → shared-CxWmcyqB.js} +2 -1
- package/dist/shared-DDSjEGDR.d.ts +11 -0
- package/dist/sign-in-BCV5S2WZ.d.ts +49 -0
- package/dist/sign-in-Cb1mwv6X.js +86 -0
- package/dist/{signers-Cc6r98SW.d.ts → signers-4y62_VIi.d.ts} +13 -9
- package/dist/simplify-DDO0j0LI.js +83 -0
- package/dist/solid/index.d.ts +131 -0
- package/dist/solid/index.js +344 -0
- package/dist/solid-start/index.d.ts +75 -0
- package/dist/solid-start/index.js +58 -0
- package/dist/{spec-pins-C3oc-Tdp.js → spec-pins--j6mTok4.js} +8 -1
- package/dist/{spec-pins-CqorWDnO.d.ts → spec-pins-C89s6DyW.d.ts} +7 -0
- package/dist/sql/index.d.ts +313 -212
- package/dist/sql/index.js +34872 -6579
- package/dist/ssr/index.d.ts +6 -5
- package/dist/ssr/index.js +3 -3
- package/dist/{standard-D7r6dMUu.js → standard-BK0cqJ7y.js} +4 -3
- package/dist/{standard-J4YgMOLm.d.ts → standard-CYsm7xpT.d.ts} +1 -1
- package/dist/stats-D_AD9GGu.js +1123 -0
- package/dist/storage/index.d.ts +5 -5
- package/dist/storage/index.js +1027 -368
- package/dist/store-BdH5ruDx.js +66 -0
- package/dist/store-CGjgWu5n.d.ts +68 -0
- package/dist/streams/index.d.ts +76 -0
- package/dist/streams/index.js +77 -0
- package/dist/streams/redis/index.d.ts +52 -0
- package/dist/streams/redis/index.js +185 -0
- package/dist/stripe-BMj5LtsT.js +38 -0
- package/dist/stripe-D04h-QBT.d.ts +136 -0
- package/dist/{support-wHnK6zp-.js → support-BivNqSpK.js} +32 -11
- package/dist/{support-view-B8SlToQX.d.ts → support-view-33Oi07TT.d.ts} +1 -1
- package/dist/svelte/index.d.ts +114 -0
- package/dist/svelte/index.js +344 -0
- package/dist/sveltekit/index.d.ts +116 -0
- package/dist/sveltekit/index.js +106 -0
- package/dist/tags-B99_U9Pp.js +39 -0
- package/dist/tags-Cx-LnIQP.d.ts +30 -0
- package/dist/tanstack-db/index.d.ts +71 -0
- package/dist/tanstack-db/index.js +72 -0
- package/dist/tanstack-start/index.d.ts +75 -0
- package/dist/tanstack-start/index.js +95 -0
- package/dist/tee-CoEppCER.js +101 -0
- package/dist/{template-TxrGI5jR.js → template--jDkl3UP.js} +34 -13
- package/dist/template-CwO38Do8.d.ts +6 -0
- package/dist/temporal-BJGitm-h.js +79 -0
- package/dist/{temporal-required-CAt4Dc9Z.js → temporal-required-BVvW7SYJ.js} +3 -2
- package/dist/tenant-I1TEZ_BX.js +27 -0
- package/dist/tenant-icPeuUBN.d.ts +17 -0
- package/dist/testing/index.d.ts +315 -41
- package/dist/testing/index.js +1046 -79
- package/dist/timing-CyTQPubY.js +92 -0
- package/dist/ttl-Hr34gRu8.js +12 -0
- package/dist/{types-Dnf_wRDz.d.ts → types-6BdhkmZe.d.ts} +111 -45
- package/dist/types-BI-0Sl2v.d.ts +359 -0
- package/dist/types-C05bxW-W.d.ts +220 -0
- package/dist/types-DGs5L0VN.d.ts +192 -0
- package/dist/types-TaiEeBGA.d.ts +156 -0
- package/dist/usage-CrvrL2vw.d.ts +177 -0
- package/dist/user-change-XzvgafU4.js +130 -0
- package/dist/vault-CSO7ss5C.d.ts +50 -0
- package/dist/vercel-connect/index.d.ts +47 -0
- package/dist/vercel-connect/index.js +119 -0
- package/dist/{verify-Ce49ETPz.js → verify-DL41hbvY.js} +85 -13
- package/dist/verify-DPuWngD4.d.ts +172 -0
- package/dist/{version-DOYTYwHP.js → version-Bvv6aLjZ.js} +1 -1
- package/dist/view-BeFcRV6G.js +99 -0
- package/dist/{view-CbgObAeb.d.ts → view-DbxLNu8L.d.ts} +22 -5
- package/dist/vue/index.d.ts +141 -0
- package/dist/vue/index.js +362 -0
- package/dist/watch-DI34G86j.d.ts +60 -0
- package/dist/watch-Xuxrvxq-.js +122 -0
- package/dist/{wire-D2dT86vi.js → wire-DtZQ4sdE.js} +15 -5
- package/dist/workflow-builder-DJ1oHn8g.js +398 -0
- package/dist/workflow-sdk/builder/index.d.ts +85 -0
- package/dist/workflow-sdk/builder/index.js +250 -0
- package/dist/workflow-sdk/index.d.ts +14 -0
- package/dist/workflow-sdk/index.js +3 -0
- package/dist/workflow-sdk/world/index.d.ts +107 -0
- package/dist/workflow-sdk/world/index.js +702 -0
- package/dist/workflow-sdk-B3yLD6Br.d.ts +98 -0
- package/dist/workflow-sdk-C2WJ_G2O.js +173 -0
- package/dist/workflow-sdk-world-D-prir6O.js +1397 -0
- package/dist/workflows-B0j9WKPu.d.ts +185 -0
- package/dist/workflows-wu1WWBn7.js +216 -0
- package/package.json +461 -20
- package/schemas/ai-message-v1.json +258 -0
- package/schemas/config-v1.json +1074 -140
- package/schemas/doctor-report-v1.json +20 -1
- package/schemas/snapshot-v2.json +8 -0
- package/skills/better-supabase/SKILL.md +41 -12
- package/skills/better-supabase/references/frontend.md +96 -0
- package/skills/better-supabase/references/plugins.md +10 -6
- package/skills/better-supabase/references/troubleshooting.md +2 -1
- package/skills/better-supabase-api/SKILL.md +76 -22
- package/skills/better-supabase-api/references/adapters.md +207 -0
- package/skills/better-supabase-api/references/ai.md +125 -0
- package/skills/better-supabase-api/references/expo.md +65 -0
- package/skills/better-supabase-api/references/powersync.md +35 -0
- package/skills/better-supabase-api/references/streams-credentials.md +105 -0
- package/skills/better-supabase-auth/SKILL.md +47 -11
- package/skills/better-supabase-auth/references/authorization-providers.md +51 -0
- package/skills/better-supabase-testing/SKILL.md +3 -1
- package/dist/cli/config-dtoekM0v.js +0 -2
- package/dist/cli/gen-CIdSQZad.js +0 -2
- package/dist/cli/gen-CjElD1Vw.js +0 -2241
- package/dist/cli/read-sets-VQcPgxU9.js +0 -436
- package/dist/cli/sql-CVx-1O8G.js +0 -373
- package/dist/entitlements-CTEBm7IB.js +0 -20
- package/dist/events-aIO7vsIk.d.ts +0 -230
- package/dist/executor-BunPOO-k.d.ts +0 -402
- package/dist/executor-XycESQPH.js +0 -94
- package/dist/index-CWMDdEr4.d.ts +0 -50
- package/dist/index-DOESKG27.d.ts +0 -100
- package/dist/index-DmXSxbLi.d.ts +0 -62
- package/dist/index-Dp2VDwog.d.ts +0 -161
- package/dist/jobs/index.d.ts +0 -226
- package/dist/jobs/index.js +0 -1007
- package/dist/json-schema-m1fiwKgN.js +0 -208
- package/dist/kit-events-CTFDfSwb.js +0 -60
- package/dist/kit-transport-B82k1djG.d.ts +0 -33
- package/dist/kits-CGLLrNPd.js +0 -157
- package/dist/mfa-Cu96oJdw.d.ts +0 -30
- package/dist/notifications/index.d.ts +0 -162
- package/dist/notifications/index.js +0 -264
- package/dist/orgs/index.d.ts +0 -132
- package/dist/orgs/index.js +0 -245
- package/dist/permdock-sql-C2Inc6Xc.d.ts +0 -29
- package/dist/permdock-sql-DgOfeixi.js +0 -51
- package/dist/plugin-DwARMuQp.js +0 -59
- package/dist/server-B1mZ7CgQ.js +0 -660
- package/dist/stats-Bqob3WqT.js +0 -592
- package/dist/support-CEPwlw2G.d.ts +0 -89
- package/dist/template-mbvlysOo.d.ts +0 -6
- package/dist/temporal-CVlIV2DZ.js +0 -40
- package/dist/user-change-CHFEUro1.js +0 -49
- package/dist/webhooks/index.d.ts +0 -285
- package/skills/better-supabase-auth/references/permdock.md +0 -122
|
@@ -0,0 +1,1123 @@
|
|
|
1
|
+
import { c as mapDbError, n as dbError, u as withMaxAffected } from "./errors-B11Duf73.js";
|
|
2
|
+
import { n as invalidRequest } from "./build-BXIzE6Xv.js";
|
|
3
|
+
import { t as lookupOf } from "./lookup-BaP5bI27.js";
|
|
4
|
+
import { d as temporalText } from "./temporal-BJGitm-h.js";
|
|
5
|
+
import { t as dateText } from "./wire-DtZQ4sdE.js";
|
|
6
|
+
import { a as ok, r as err, s as toDbError } from "./result-DzUbqgdW.js";
|
|
7
|
+
import { n as simplifyOrFalse } from "./simplify-DDO0j0LI.js";
|
|
8
|
+
//#region src/compile/postgrest.ts
|
|
9
|
+
/** `false` only for a version string whose major is known to be below 13. */
|
|
10
|
+
function supportsMaxAffected(version) {
|
|
11
|
+
if (version === void 0) return true;
|
|
12
|
+
const major = /^v?(\d+)/i.exec(version)?.[1];
|
|
13
|
+
return major === void 0 || Number(major) >= 13;
|
|
14
|
+
}
|
|
15
|
+
function scalar(value) {
|
|
16
|
+
if (typeof value === "string") return value;
|
|
17
|
+
if (typeof value === "number" || typeof value === "boolean") return String(value);
|
|
18
|
+
const temporalValue = temporalText(value);
|
|
19
|
+
if (temporalValue !== void 0) return temporalValue;
|
|
20
|
+
if (value instanceof Date) return dateText(value);
|
|
21
|
+
if (typeof value === "bigint") return String(value);
|
|
22
|
+
if (value === null) return "null";
|
|
23
|
+
return JSON.stringify(value);
|
|
24
|
+
}
|
|
25
|
+
/** Double-quotes a value for PostgREST lists and logic trees. */
|
|
26
|
+
function quote(value) {
|
|
27
|
+
return `"${scalar(value).replaceAll("\\", "\\\\").replaceAll("\"", "\\\"")}"`;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Values PostgREST reads the same with or without quotes in an `in` list:
|
|
31
|
+
* uuids, numbers, ISO dates and times, enum values, slugs and emails.
|
|
32
|
+
* `null` stays quoted, so it keeps meaning the string.
|
|
33
|
+
*/
|
|
34
|
+
const BARE = /^[\w.:+@-]+$/;
|
|
35
|
+
/** An `in` list element; quoted only when it needs to be, as supabase-js does. */
|
|
36
|
+
function listItem(value) {
|
|
37
|
+
const text = scalar(value);
|
|
38
|
+
return BARE.test(text) && text.toLowerCase() !== "null" ? text : quote(text);
|
|
39
|
+
}
|
|
40
|
+
const BRACES = /[{}]/;
|
|
41
|
+
function list(values, open, close) {
|
|
42
|
+
return `${open}${values.map(quote).join(",")}${close}`;
|
|
43
|
+
}
|
|
44
|
+
/** The filter target: the column, or `column->a->>b` for a json path. */
|
|
45
|
+
function target(condition) {
|
|
46
|
+
const { column, path } = condition;
|
|
47
|
+
if (!path || path.length === 0) return column;
|
|
48
|
+
const last = path.length - 1;
|
|
49
|
+
return `${column}${path.map((key, index) => `${index === last ? "->>" : "->"}${key}`).join("")}`;
|
|
50
|
+
}
|
|
51
|
+
const REGEX_SPECIAL = /[\\^$.|?*+()[\]{}]/;
|
|
52
|
+
/**
|
|
53
|
+
* A LIKE pattern as an anchored POSIX regex. PostgREST reads every `*` in a
|
|
54
|
+
* like value as `%`, so a pattern with a literal `*` goes as `match`.
|
|
55
|
+
*/
|
|
56
|
+
function likeToRegex(pattern) {
|
|
57
|
+
let regex = "^";
|
|
58
|
+
for (let index = 0; index < pattern.length; index += 1) {
|
|
59
|
+
const char = pattern.charAt(index);
|
|
60
|
+
if (char === "\\" && index + 1 < pattern.length) {
|
|
61
|
+
index += 1;
|
|
62
|
+
const next = pattern.charAt(index);
|
|
63
|
+
regex += REGEX_SPECIAL.test(next) ? `\\${next}` : next;
|
|
64
|
+
} else if (char === "%") regex += ".*";
|
|
65
|
+
else if (char === "_") regex += ".";
|
|
66
|
+
else regex += REGEX_SPECIAL.test(char) ? `\\${char}` : char;
|
|
67
|
+
}
|
|
68
|
+
return `${regex}$`;
|
|
69
|
+
}
|
|
70
|
+
function isBoolLike(value) {
|
|
71
|
+
return value === null || typeof value === "boolean";
|
|
72
|
+
}
|
|
73
|
+
function operatorAndValue(condition, inLogic) {
|
|
74
|
+
const { op, value } = condition;
|
|
75
|
+
const plain = (text) => inLogic ? quote(text) : scalar(text);
|
|
76
|
+
switch (op) {
|
|
77
|
+
case "eq":
|
|
78
|
+
case "neq":
|
|
79
|
+
case "gt":
|
|
80
|
+
case "gte":
|
|
81
|
+
case "lt":
|
|
82
|
+
case "lte":
|
|
83
|
+
case "match":
|
|
84
|
+
case "imatch": return {
|
|
85
|
+
operator: op,
|
|
86
|
+
value: plain(value)
|
|
87
|
+
};
|
|
88
|
+
case "like":
|
|
89
|
+
case "ilike": {
|
|
90
|
+
const text = scalar(value);
|
|
91
|
+
if (!text.includes("*")) return {
|
|
92
|
+
operator: op,
|
|
93
|
+
value: plain(text)
|
|
94
|
+
};
|
|
95
|
+
return {
|
|
96
|
+
operator: op === "like" ? "match" : "imatch",
|
|
97
|
+
value: plain(likeToRegex(text))
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
case "in":
|
|
101
|
+
if (!Array.isArray(value)) invalidRequest("\"in\" needs an array");
|
|
102
|
+
return {
|
|
103
|
+
operator: "in",
|
|
104
|
+
value: `(${value.map(listItem).join(",")})`
|
|
105
|
+
};
|
|
106
|
+
case "is":
|
|
107
|
+
if (!isBoolLike(value)) invalidRequest("\"is\" needs null, true or false");
|
|
108
|
+
return {
|
|
109
|
+
operator: "is",
|
|
110
|
+
value: String(value)
|
|
111
|
+
};
|
|
112
|
+
case "contains":
|
|
113
|
+
case "containedBy":
|
|
114
|
+
case "overlaps": {
|
|
115
|
+
const operator = op === "contains" ? "cs" : op === "containedBy" ? "cd" : "ov";
|
|
116
|
+
if (Array.isArray(value) && !condition.json) {
|
|
117
|
+
const literal = list(value, "{", "}");
|
|
118
|
+
return {
|
|
119
|
+
operator,
|
|
120
|
+
value: inLogic && BRACES.test(literal.slice(1, -1)) ? quote(literal) : literal
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
const json = JSON.stringify(value);
|
|
124
|
+
return {
|
|
125
|
+
operator,
|
|
126
|
+
value: inLogic ? quote(json) : json
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
case "fts": return {
|
|
130
|
+
operator: condition.config ? `wfts(${condition.config})` : "wfts",
|
|
131
|
+
value: plain(value)
|
|
132
|
+
};
|
|
133
|
+
default: return op;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
var PostgrestCompiler = class {
|
|
137
|
+
filters = [];
|
|
138
|
+
orders = [];
|
|
139
|
+
limits = [];
|
|
140
|
+
#counter = 0;
|
|
141
|
+
nextAlias() {
|
|
142
|
+
this.#counter += 1;
|
|
143
|
+
return `_bs${this.#counter}`;
|
|
144
|
+
}
|
|
145
|
+
/** Compiles a condition at `path` where top-level items are ANDed. */
|
|
146
|
+
andContext(condition, path, embeds) {
|
|
147
|
+
switch (condition.kind) {
|
|
148
|
+
case "and":
|
|
149
|
+
for (const item of condition.items) this.andContext(item, path, embeds);
|
|
150
|
+
return;
|
|
151
|
+
case "column": {
|
|
152
|
+
const { operator, value } = operatorAndValue(condition, false);
|
|
153
|
+
this.filters.push({
|
|
154
|
+
kind: "filter",
|
|
155
|
+
path: path ? `${path}.${target(condition)}` : target(condition),
|
|
156
|
+
operator,
|
|
157
|
+
value
|
|
158
|
+
});
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
case "not": {
|
|
162
|
+
const inner = condition.item;
|
|
163
|
+
if (inner.kind === "column") {
|
|
164
|
+
const { operator, value } = operatorAndValue(inner, false);
|
|
165
|
+
this.filters.push({
|
|
166
|
+
kind: "filter",
|
|
167
|
+
path: path ? `${path}.${target(inner)}` : target(inner),
|
|
168
|
+
operator: `not.${operator}`,
|
|
169
|
+
value
|
|
170
|
+
});
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
if (inner.kind === "relation") {
|
|
174
|
+
this.relationAnd(negateRelation(inner), path, embeds);
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
if (inner.kind === "not") {
|
|
178
|
+
this.andContext(inner.item, path, embeds);
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
this.filters.push({
|
|
182
|
+
kind: "or",
|
|
183
|
+
expression: this.logic(condition, embeds),
|
|
184
|
+
referencedTable: path
|
|
185
|
+
});
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
case "or":
|
|
189
|
+
this.filters.push({
|
|
190
|
+
kind: "or",
|
|
191
|
+
expression: this.logic(condition, embeds).replace(/^or\(/, "").replace(/\)$/, ""),
|
|
192
|
+
referencedTable: path
|
|
193
|
+
});
|
|
194
|
+
return;
|
|
195
|
+
case "relation":
|
|
196
|
+
this.relationAnd(condition, path, embeds);
|
|
197
|
+
return;
|
|
198
|
+
default: return condition;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
relationAnd(condition, path, embeds) {
|
|
202
|
+
if (condition.quantifier === "every" && !condition.where) return;
|
|
203
|
+
const alias = this.nextAlias();
|
|
204
|
+
const aliasPath = path ? `${path}.${alias}` : alias;
|
|
205
|
+
const node = filterEmbed(alias, condition, condition.quantifier === "some");
|
|
206
|
+
this.withPath(node.children, aliasPath);
|
|
207
|
+
embeds.push(node);
|
|
208
|
+
const where = condition.quantifier === "every" && condition.where ? {
|
|
209
|
+
kind: "not",
|
|
210
|
+
item: condition.where
|
|
211
|
+
} : condition.where;
|
|
212
|
+
if (where) this.andContext(where, aliasPath, node.children);
|
|
213
|
+
if (condition.quantifier !== "some") this.filters.push({
|
|
214
|
+
kind: "filter",
|
|
215
|
+
path: aliasPath,
|
|
216
|
+
operator: "is",
|
|
217
|
+
value: "null"
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
/** Compiles a condition into a PostgREST logic-tree term. */
|
|
221
|
+
logic(condition, embeds) {
|
|
222
|
+
switch (condition.kind) {
|
|
223
|
+
case "and":
|
|
224
|
+
case "or": return `${condition.kind}(${condition.items.map((item) => this.logic(item, embeds)).join(",")})`;
|
|
225
|
+
case "not": {
|
|
226
|
+
const inner = condition.item;
|
|
227
|
+
if (inner.kind === "column") {
|
|
228
|
+
const { operator, value } = operatorAndValue(inner, true);
|
|
229
|
+
return `${target(inner)}.not.${operator}.${value}`;
|
|
230
|
+
}
|
|
231
|
+
if (inner.kind === "relation") return this.logic(negateRelation(inner), embeds);
|
|
232
|
+
if (inner.kind === "not") return this.logic(inner.item, embeds);
|
|
233
|
+
return `not.${this.logic(inner, embeds)}`;
|
|
234
|
+
}
|
|
235
|
+
case "column": {
|
|
236
|
+
const { operator, value } = operatorAndValue(condition, true);
|
|
237
|
+
return `${target(condition)}.${operator}.${value}`;
|
|
238
|
+
}
|
|
239
|
+
case "relation": {
|
|
240
|
+
if (condition.quantifier === "every" && !condition.where) invalidRequest("every({}) must be simplified before compiling");
|
|
241
|
+
const alias = this.nextAlias();
|
|
242
|
+
const node = filterEmbed(alias, condition, false);
|
|
243
|
+
const nodePath = this.pathOf(alias, embeds);
|
|
244
|
+
this.withPath(node.children, nodePath);
|
|
245
|
+
embeds.push(node);
|
|
246
|
+
const where = condition.quantifier === "every" && condition.where ? {
|
|
247
|
+
kind: "not",
|
|
248
|
+
item: condition.where
|
|
249
|
+
} : condition.where;
|
|
250
|
+
if (where) this.andContext(where, nodePath, node.children);
|
|
251
|
+
return condition.quantifier === "some" ? `${alias}.not.is.null` : `${alias}.is.null`;
|
|
252
|
+
}
|
|
253
|
+
default: return condition;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
#paths;
|
|
257
|
+
withPath(embeds, path) {
|
|
258
|
+
(this.#paths ??= /* @__PURE__ */ new WeakMap()).set(embeds, path);
|
|
259
|
+
return embeds;
|
|
260
|
+
}
|
|
261
|
+
pathOf(alias, embeds) {
|
|
262
|
+
const parent = this.#paths?.get(embeds);
|
|
263
|
+
return parent ? `${parent}.${alias}` : alias;
|
|
264
|
+
}
|
|
265
|
+
include(include, path, embeds) {
|
|
266
|
+
const aliasPath = path ? `${path}.${include.alias}` : include.alias;
|
|
267
|
+
const node = {
|
|
268
|
+
alias: include.alias,
|
|
269
|
+
target: include.target,
|
|
270
|
+
relation: include.relation,
|
|
271
|
+
inner: include.required,
|
|
272
|
+
columns: include.selection.columns,
|
|
273
|
+
children: this.withPath([], aliasPath),
|
|
274
|
+
...include.count === void 0 ? {} : { count: true },
|
|
275
|
+
...include.selection.aggregate ? { measures: include.selection.aggregate.measures } : {}
|
|
276
|
+
};
|
|
277
|
+
embeds.push(node);
|
|
278
|
+
for (const child of include.selection.includes) this.include(child, aliasPath, node.children);
|
|
279
|
+
const where = simplifyOrFalse(include.where);
|
|
280
|
+
if (where.never) {
|
|
281
|
+
const [first] = include.target.primaryKey;
|
|
282
|
+
const column = first ? include.target.columns[first]?.db : void 0;
|
|
283
|
+
if (!column) invalidRequest(`Cannot filter "${include.alias}" to nothing`);
|
|
284
|
+
this.filters.push({
|
|
285
|
+
kind: "filter",
|
|
286
|
+
path: `${aliasPath}.${column}`,
|
|
287
|
+
operator: "is",
|
|
288
|
+
value: "null"
|
|
289
|
+
}, {
|
|
290
|
+
kind: "filter",
|
|
291
|
+
path: `${aliasPath}.${column}`,
|
|
292
|
+
operator: "not.is",
|
|
293
|
+
value: "null"
|
|
294
|
+
});
|
|
295
|
+
} else if (where.condition) this.andContext(where.condition, aliasPath, node.children);
|
|
296
|
+
for (const term of include.orderBy) this.order(term, aliasPath);
|
|
297
|
+
if (include.limit !== void 0) this.limits.push({
|
|
298
|
+
count: include.limit,
|
|
299
|
+
referencedTable: aliasPath
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Sorts the root rows by a column of a to-one embed, `order=alias(column)`.
|
|
304
|
+
* Reuses the include of that relation, or adds an empty embed for it.
|
|
305
|
+
*/
|
|
306
|
+
relationOrder(term, embeds) {
|
|
307
|
+
const { relation } = term;
|
|
308
|
+
if (!relation) return;
|
|
309
|
+
let alias = embeds.find((node) => node.relation.foreignKey === relation.relation.foreignKey && node.target === relation.target && node.count === void 0 && node.measures === void 0 && node.alias === relation.name)?.alias;
|
|
310
|
+
if (alias === void 0) {
|
|
311
|
+
alias = this.nextAlias();
|
|
312
|
+
embeds.push({
|
|
313
|
+
alias,
|
|
314
|
+
target: relation.target,
|
|
315
|
+
relation: relation.relation,
|
|
316
|
+
inner: false,
|
|
317
|
+
columns: [],
|
|
318
|
+
children: []
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
this.order({
|
|
322
|
+
...term,
|
|
323
|
+
column: `${alias}(${term.column})`
|
|
324
|
+
}, void 0);
|
|
325
|
+
}
|
|
326
|
+
order(term, referencedTable) {
|
|
327
|
+
this.orders.push({
|
|
328
|
+
column: term.column,
|
|
329
|
+
ascending: term.direction === "asc",
|
|
330
|
+
nullsFirst: term.nulls === void 0 ? void 0 : term.nulls === "first",
|
|
331
|
+
referencedTable
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
};
|
|
335
|
+
function negateRelation(condition) {
|
|
336
|
+
switch (condition.quantifier) {
|
|
337
|
+
case "some": return {
|
|
338
|
+
...condition,
|
|
339
|
+
quantifier: "none"
|
|
340
|
+
};
|
|
341
|
+
case "none": return {
|
|
342
|
+
...condition,
|
|
343
|
+
quantifier: "some"
|
|
344
|
+
};
|
|
345
|
+
case "every": return {
|
|
346
|
+
...condition,
|
|
347
|
+
quantifier: "some",
|
|
348
|
+
where: condition.where ? {
|
|
349
|
+
kind: "not",
|
|
350
|
+
item: condition.where
|
|
351
|
+
} : void 0
|
|
352
|
+
};
|
|
353
|
+
default: return condition.quantifier;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
function filterEmbed(alias, condition, inner) {
|
|
357
|
+
return {
|
|
358
|
+
alias,
|
|
359
|
+
target: condition.target,
|
|
360
|
+
relation: condition.relation,
|
|
361
|
+
inner,
|
|
362
|
+
columns: [],
|
|
363
|
+
children: []
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
const columnTexts = /* @__PURE__ */ new WeakMap();
|
|
367
|
+
/** The rendered column list, cached per (shared, immutable) column array. */
|
|
368
|
+
function columnText(columns) {
|
|
369
|
+
let text = columnTexts.get(columns);
|
|
370
|
+
if (text === void 0) {
|
|
371
|
+
text = columns.map(({ alias, column, cast }) => {
|
|
372
|
+
const source = cast ? `${column}::${cast}` : column;
|
|
373
|
+
return alias === column ? source : `${alias}:${source}`;
|
|
374
|
+
}).join(",");
|
|
375
|
+
columnTexts.set(columns, text);
|
|
376
|
+
}
|
|
377
|
+
return text;
|
|
378
|
+
}
|
|
379
|
+
function columnList(columns) {
|
|
380
|
+
return columns.length > 0 ? [columnText(columns)] : [];
|
|
381
|
+
}
|
|
382
|
+
/** `key:column.sum()::text`, PostgREST's aggregate syntax (PostgREST 12+). */
|
|
383
|
+
function measureList(measures) {
|
|
384
|
+
return measures.map(({ key, column, fn, cast }) => `${key}:${column}.${fn}()${cast ? `::${cast}` : ""}`);
|
|
385
|
+
}
|
|
386
|
+
function aggregateList(aggregate) {
|
|
387
|
+
return [...aggregate.count ? ["_count:count()"] : [], ...measureList(aggregate.measures)];
|
|
388
|
+
}
|
|
389
|
+
function renderEmbeds(embeds) {
|
|
390
|
+
return embeds.map((node) => {
|
|
391
|
+
const hint = `${node.target.name}!${node.relation.foreignKey}${node.inner ? "!inner" : ""}`;
|
|
392
|
+
if (node.count) return `${node.alias}:${hint}(count)`;
|
|
393
|
+
if (node.measures) return `${node.alias}:${hint}(${measureList(node.measures).join(",")})`;
|
|
394
|
+
const inside = [...columnList(node.columns), ...renderEmbeds(node.children)];
|
|
395
|
+
return `${node.alias}:${hint}(${inside.join(",")})`;
|
|
396
|
+
});
|
|
397
|
+
}
|
|
398
|
+
function renderSelect(selection, embeds) {
|
|
399
|
+
if (!selection.aggregate && embeds.length === 0) return selection.columns.length > 0 ? columnText(selection.columns) : "*";
|
|
400
|
+
const parts = [
|
|
401
|
+
...columnList(selection.columns),
|
|
402
|
+
...selection.aggregate ? aggregateList(selection.aggregate) : [],
|
|
403
|
+
...renderEmbeds(embeds)
|
|
404
|
+
];
|
|
405
|
+
return parts.length > 0 ? parts.join(",") : "*";
|
|
406
|
+
}
|
|
407
|
+
/**
|
|
408
|
+
* PostgREST orders by columns only. `order=count` still sorts groups by
|
|
409
|
+
* their row count: Postgres reads `customers.count` as `count(customers)`
|
|
410
|
+
* when the table has no `count` column. Measures have no such spelling.
|
|
411
|
+
*/
|
|
412
|
+
function aggregateOrder(compiler, term, table) {
|
|
413
|
+
if (term.aggregate !== "count") invalidRequest(`PostgREST can't sort "${table.key}" by _${term.aggregate}; sort by _count or a groupBy column, or use the postgres adapter`, table.key);
|
|
414
|
+
if (Object.values(table.columns).some((column) => column.db === "count")) invalidRequest(`PostgREST can't sort "${table.key}" by _count because the table has a column named "count"; sort by a groupBy column or use the postgres adapter`, table.key);
|
|
415
|
+
compiler.order({
|
|
416
|
+
...term,
|
|
417
|
+
column: "count"
|
|
418
|
+
}, void 0);
|
|
419
|
+
}
|
|
420
|
+
function applyWhere(compiler, condition, embeds) {
|
|
421
|
+
const where = simplifyOrFalse(condition);
|
|
422
|
+
if (where.never) return false;
|
|
423
|
+
if (where.condition) compiler.andContext(where.condition, void 0, embeds);
|
|
424
|
+
return true;
|
|
425
|
+
}
|
|
426
|
+
/** Compiles an operation into a PostgREST plan. */
|
|
427
|
+
function compilePostgrest(op, options = {}) {
|
|
428
|
+
const maxAffected = op.kind === "update" || op.kind === "delete" ? op.maxAffected : void 0;
|
|
429
|
+
if (maxAffected !== void 0) {
|
|
430
|
+
if (!Number.isInteger(maxAffected) || maxAffected < 0) invalidRequest(`"maxAffected" must be a non-negative integer, got ${maxAffected}`, op.table.key);
|
|
431
|
+
if (!supportsMaxAffected(options.postgrestVersion)) invalidRequest(`"maxAffected" needs PostgREST 13 or later; postgrestVersion is "${options.postgrestVersion}"`, op.table.key);
|
|
432
|
+
}
|
|
433
|
+
const compiler = new PostgrestCompiler();
|
|
434
|
+
const embeds = compiler.withPath([], void 0);
|
|
435
|
+
const selection = op.kind === "select" ? op.selection : op.kind === "insert" ? op.returning : op.returning;
|
|
436
|
+
if (selection) for (const include of selection.includes) compiler.include(include, void 0, embeds);
|
|
437
|
+
let matches = true;
|
|
438
|
+
if (op.kind === "select" || op.kind === "update" || op.kind === "delete") {
|
|
439
|
+
const before = embeds.length;
|
|
440
|
+
matches = applyWhere(compiler, op.where, embeds);
|
|
441
|
+
if (op.kind !== "select" && embeds.length > before) invalidRequest(`Relation filters are not supported in ${op.kind} on PostgREST; filter by key instead`, op.table.key);
|
|
442
|
+
}
|
|
443
|
+
let range;
|
|
444
|
+
if (op.kind === "select") {
|
|
445
|
+
for (const term of op.orderBy) if (term.relation) compiler.relationOrder(term, embeds);
|
|
446
|
+
else if (term.aggregate) aggregateOrder(compiler, term, op.table);
|
|
447
|
+
else compiler.order(term, void 0);
|
|
448
|
+
if (op.offset !== void 0) {
|
|
449
|
+
const from = op.offset;
|
|
450
|
+
range = {
|
|
451
|
+
from,
|
|
452
|
+
to: op.limit === void 0 ? Number.MAX_SAFE_INTEGER : from + op.limit - 1
|
|
453
|
+
};
|
|
454
|
+
} else if (op.limit !== void 0) compiler.limits.push({
|
|
455
|
+
count: op.limit,
|
|
456
|
+
referencedTable: void 0
|
|
457
|
+
});
|
|
458
|
+
}
|
|
459
|
+
return {
|
|
460
|
+
select: selection ? renderSelect(selection, embeds) : void 0,
|
|
461
|
+
filters: compiler.filters,
|
|
462
|
+
orders: compiler.orders,
|
|
463
|
+
limits: compiler.limits,
|
|
464
|
+
range,
|
|
465
|
+
never: !matches,
|
|
466
|
+
...maxAffected === void 0 ? {} : { maxAffected }
|
|
467
|
+
};
|
|
468
|
+
}
|
|
469
|
+
//#endregion
|
|
470
|
+
//#region src/core/in-chunks.ts
|
|
471
|
+
/** The length of the query string supabase-js sends for `plan`. */
|
|
472
|
+
function queryLength(plan) {
|
|
473
|
+
let length = plan.select === void 0 ? 0 : 8 + encoded(plan.select);
|
|
474
|
+
for (const filter of plan.filters) length += filter.kind === "filter" ? encoded(filter.path) + 2 + encoded(`${filter.operator}.${filter.value}`) : 4 + encoded(`(${filter.expression})`) + (filter.referencedTable ? encoded(filter.referencedTable) + 1 : 0);
|
|
475
|
+
for (const order of plan.orders) length += 24 + encoded(order.column);
|
|
476
|
+
return length;
|
|
477
|
+
}
|
|
478
|
+
function encoded(text) {
|
|
479
|
+
return encodeURIComponent(text).length;
|
|
480
|
+
}
|
|
481
|
+
function topLevel(where) {
|
|
482
|
+
if (!where) return [];
|
|
483
|
+
return where.kind === "and" ? where.items : [where];
|
|
484
|
+
}
|
|
485
|
+
function isInList(condition) {
|
|
486
|
+
return condition.kind === "column" && condition.op === "in" && condition.path === void 0 && Array.isArray(condition.value);
|
|
487
|
+
}
|
|
488
|
+
/** Column types whose order JavaScript reproduces without the database's collation. */
|
|
489
|
+
const SORTABLE = /* @__PURE__ */ new Set([
|
|
490
|
+
"int2",
|
|
491
|
+
"int4",
|
|
492
|
+
"int8",
|
|
493
|
+
"float4",
|
|
494
|
+
"float8",
|
|
495
|
+
"numeric",
|
|
496
|
+
"uuid",
|
|
497
|
+
"date",
|
|
498
|
+
"timestamp",
|
|
499
|
+
"timestamptz",
|
|
500
|
+
"bool"
|
|
501
|
+
]);
|
|
502
|
+
const TIME = /* @__PURE__ */ new Set([
|
|
503
|
+
"date",
|
|
504
|
+
"timestamp",
|
|
505
|
+
"timestamptz"
|
|
506
|
+
]);
|
|
507
|
+
const NUMERIC = /* @__PURE__ */ new Set([
|
|
508
|
+
"int2",
|
|
509
|
+
"int4",
|
|
510
|
+
"float4",
|
|
511
|
+
"float8",
|
|
512
|
+
"numeric"
|
|
513
|
+
]);
|
|
514
|
+
const INTEGER = /^-?\d+$/;
|
|
515
|
+
function sortKind(type) {
|
|
516
|
+
if (type === "int8") return "bigint";
|
|
517
|
+
if (NUMERIC.has(type)) return "number";
|
|
518
|
+
return TIME.has(type) ? "time" : "text";
|
|
519
|
+
}
|
|
520
|
+
/** The `invalid_request` for a request whose URL is over the limit. */
|
|
521
|
+
function tooLong(op, length, max, why) {
|
|
522
|
+
return dbError("invalid_request", `The request for "${op.table.key}" is ${length} characters, over the ${max} the URL takes, and ${why}`, {
|
|
523
|
+
table: op.table.key,
|
|
524
|
+
hint: "Split the in list or paginate, pass a shorter list to a search function, or raise `urlLengthLimit` when every proxy in front of PostgREST accepts longer URLs."
|
|
525
|
+
});
|
|
526
|
+
}
|
|
527
|
+
/**
|
|
528
|
+
* Splits a read whose query string is over `max` into reads that each fit,
|
|
529
|
+
* along its longest top-level `in` list. Only reads without a limit, offset,
|
|
530
|
+
* count or single row qualify, since chunks can't share those; their rows are
|
|
531
|
+
* disjoint, and an order is re-applied in memory on columns that sort the
|
|
532
|
+
* same in JavaScript.
|
|
533
|
+
*/
|
|
534
|
+
function chunkRead(op, plan, max) {
|
|
535
|
+
const length = queryLength(plan);
|
|
536
|
+
if (op.limit !== void 0 || op.offset !== void 0 || op.count !== void 0 || op.head || op.single !== void 0 || op.source !== void 0) return tooLong(op, length, max, "a read with a limit, offset, count or single row can't be split");
|
|
537
|
+
const items = topLevel(op.where);
|
|
538
|
+
let longest;
|
|
539
|
+
for (const condition of items) {
|
|
540
|
+
if (!isInList(condition)) continue;
|
|
541
|
+
const seen = /* @__PURE__ */ new Set();
|
|
542
|
+
const values = [];
|
|
543
|
+
const texts = [];
|
|
544
|
+
const sizes = [];
|
|
545
|
+
let total = 0;
|
|
546
|
+
let largest = 0;
|
|
547
|
+
for (const value of condition.value) {
|
|
548
|
+
const text = listItem(value);
|
|
549
|
+
if (seen.has(text)) continue;
|
|
550
|
+
seen.add(text);
|
|
551
|
+
const size = encoded(text) + 3;
|
|
552
|
+
values.push(value);
|
|
553
|
+
texts.push(text);
|
|
554
|
+
sizes.push(size);
|
|
555
|
+
total += size;
|
|
556
|
+
if (size > largest) largest = size;
|
|
557
|
+
}
|
|
558
|
+
if (!longest || total > longest.total) longest = {
|
|
559
|
+
condition,
|
|
560
|
+
values,
|
|
561
|
+
texts,
|
|
562
|
+
sizes,
|
|
563
|
+
total,
|
|
564
|
+
largest
|
|
565
|
+
};
|
|
566
|
+
}
|
|
567
|
+
if (!longest) return tooLong(op, length, max, "it has no top-level in list to split");
|
|
568
|
+
const listLength = encoded(`(${longest.condition.value.map(listItem).join(",")})`);
|
|
569
|
+
const { byDb } = lookupOf(op.table);
|
|
570
|
+
const hidden = [];
|
|
571
|
+
const aliases = new Map(op.selection.columns.map((c) => [c.column, c.alias]));
|
|
572
|
+
for (const term of op.orderBy) {
|
|
573
|
+
if (term.relation || aliases.has(term.column)) continue;
|
|
574
|
+
const alias = `_bs_order${hidden.length}`;
|
|
575
|
+
const exact = byDb.get(term.column)?.[1].type === "int8";
|
|
576
|
+
hidden.push({
|
|
577
|
+
alias,
|
|
578
|
+
column: term.column,
|
|
579
|
+
...exact ? { cast: "text" } : {}
|
|
580
|
+
});
|
|
581
|
+
aliases.set(term.column, alias);
|
|
582
|
+
}
|
|
583
|
+
const hiddenText = (column) => `${column.alias}:${column.column}${column.cast ? `::${column.cast}` : ""}`;
|
|
584
|
+
const extra = hidden.reduce((sum, column) => sum + encoded(`,${hiddenText(column)}`), 0);
|
|
585
|
+
const budget = max - (length - listLength) - extra - encoded("()");
|
|
586
|
+
if (budget < longest.largest) return tooLong(op, length, max, "the rest of the request leaves no room for its in list");
|
|
587
|
+
let sort;
|
|
588
|
+
if (op.orderBy.length > 0) {
|
|
589
|
+
const keys = [];
|
|
590
|
+
for (const term of op.orderBy) {
|
|
591
|
+
const type = byDb.get(term.column)?.[1].type ?? "";
|
|
592
|
+
const alias = aliases.get(term.column);
|
|
593
|
+
if (term.relation || alias === void 0 || !SORTABLE.has(type) && !term.implicit) return tooLong(op, length, max, `its order on "${term.column}" can't be re-applied after splitting it; order by number, uuid, date or time columns`);
|
|
594
|
+
const desc = term.direction === "desc";
|
|
595
|
+
keys.push({
|
|
596
|
+
alias,
|
|
597
|
+
desc,
|
|
598
|
+
nullsFirst: (term.nulls ?? (desc ? "first" : "last")) === "first",
|
|
599
|
+
kind: sortKind(type)
|
|
600
|
+
});
|
|
601
|
+
}
|
|
602
|
+
sort = (rows) => {
|
|
603
|
+
const decorated = rows.map((row) => ({
|
|
604
|
+
row,
|
|
605
|
+
values: keys.map((key) => sortValue(row[key.alias], key.kind))
|
|
606
|
+
}));
|
|
607
|
+
decorated.sort((left, right) => {
|
|
608
|
+
for (const [index, key] of keys.entries()) {
|
|
609
|
+
const a = left.values[index];
|
|
610
|
+
const b = right.values[index];
|
|
611
|
+
if (a === b) continue;
|
|
612
|
+
if (a === void 0) return key.nullsFirst ? -1 : 1;
|
|
613
|
+
if (b === void 0) return key.nullsFirst ? 1 : -1;
|
|
614
|
+
const order = a < b ? -1 : a > b ? 1 : 0;
|
|
615
|
+
if (order !== 0) return key.desc ? -order : order;
|
|
616
|
+
}
|
|
617
|
+
return 0;
|
|
618
|
+
});
|
|
619
|
+
return decorated.map(({ row }) => {
|
|
620
|
+
for (const column of hidden) delete row[column.alias];
|
|
621
|
+
return row;
|
|
622
|
+
});
|
|
623
|
+
};
|
|
624
|
+
}
|
|
625
|
+
const chunks = [];
|
|
626
|
+
let current = {
|
|
627
|
+
values: [],
|
|
628
|
+
texts: []
|
|
629
|
+
};
|
|
630
|
+
let used = 0;
|
|
631
|
+
const list = longest;
|
|
632
|
+
list.values.forEach((value, index) => {
|
|
633
|
+
const size = list.sizes[index] ?? 0;
|
|
634
|
+
if (current.values.length > 0 && used + size > budget) {
|
|
635
|
+
chunks.push(current);
|
|
636
|
+
current = {
|
|
637
|
+
values: [],
|
|
638
|
+
texts: []
|
|
639
|
+
};
|
|
640
|
+
used = 0;
|
|
641
|
+
}
|
|
642
|
+
current.values.push(value);
|
|
643
|
+
current.texts.push(list.texts[index] ?? "");
|
|
644
|
+
used += size;
|
|
645
|
+
});
|
|
646
|
+
if (current.values.length > 0) chunks.push(current);
|
|
647
|
+
const full = `(${list.condition.value.map(listItem).join(",")})`;
|
|
648
|
+
const at = plan.filters.findIndex((filter) => filter.kind === "filter" && filter.operator === "in" && filter.path === list.condition.column && filter.value === full);
|
|
649
|
+
const select = plan.select === void 0 || hidden.length === 0 ? plan.select : `${plan.select},${hidden.map(hiddenText).join(",")}`;
|
|
650
|
+
const plans = at === -1 ? void 0 : chunks.map((chunk) => ({
|
|
651
|
+
...plan,
|
|
652
|
+
select,
|
|
653
|
+
filters: plan.filters.map((filter, index) => index === at && filter.kind === "filter" ? {
|
|
654
|
+
...filter,
|
|
655
|
+
value: `(${chunk.texts.join(",")})`
|
|
656
|
+
} : filter)
|
|
657
|
+
}));
|
|
658
|
+
return {
|
|
659
|
+
ops: chunks.map(({ values }) => {
|
|
660
|
+
const where = items.map((item) => item === list.condition ? {
|
|
661
|
+
...list.condition,
|
|
662
|
+
value: values
|
|
663
|
+
} : item);
|
|
664
|
+
return {
|
|
665
|
+
...op,
|
|
666
|
+
...hidden.length > 0 && { selection: {
|
|
667
|
+
...op.selection,
|
|
668
|
+
columns: [...op.selection.columns, ...hidden]
|
|
669
|
+
} },
|
|
670
|
+
where: where.length === 1 ? where[0] : {
|
|
671
|
+
kind: "and",
|
|
672
|
+
items: where
|
|
673
|
+
}
|
|
674
|
+
};
|
|
675
|
+
}),
|
|
676
|
+
plans,
|
|
677
|
+
sort
|
|
678
|
+
};
|
|
679
|
+
}
|
|
680
|
+
/**
|
|
681
|
+
* A comparable value, or `undefined` for SQL null. Times compare by
|
|
682
|
+
* instant, which text can't do across offsets, with the microseconds
|
|
683
|
+
* `Date.parse` drops appended.
|
|
684
|
+
*/
|
|
685
|
+
function sortValue(value, kind) {
|
|
686
|
+
if (value === null || value === void 0) return void 0;
|
|
687
|
+
if (kind === "number") return Number(value);
|
|
688
|
+
if (kind === "bigint") {
|
|
689
|
+
if (typeof value === "bigint") return value;
|
|
690
|
+
if (typeof value === "number" && Number.isInteger(value)) return BigInt(value);
|
|
691
|
+
if (typeof value === "string" && INTEGER.test(value)) return BigInt(value);
|
|
692
|
+
return Number(value);
|
|
693
|
+
}
|
|
694
|
+
const text = String(value);
|
|
695
|
+
if (kind === "text") return text;
|
|
696
|
+
const instant = Date.parse(text);
|
|
697
|
+
if (Number.isNaN(instant)) return text;
|
|
698
|
+
const micros = (/\.(\d+)/.exec(text)?.[1] ?? "").slice(3, 6).padEnd(3, "0");
|
|
699
|
+
return `${String(instant + 864e13).padStart(17, "0")}${micros}`;
|
|
700
|
+
}
|
|
701
|
+
//#endregion
|
|
702
|
+
//#region src/core/timeout.ts
|
|
703
|
+
const NO_DEADLINE = (signal) => ({
|
|
704
|
+
signal,
|
|
705
|
+
timedOut: () => false,
|
|
706
|
+
clear: () => {}
|
|
707
|
+
});
|
|
708
|
+
/**
|
|
709
|
+
* Either signal aborting aborts the result. Uses `AbortSignal.any` where the
|
|
710
|
+
* runtime has it; Hermes and older runtimes get the same behaviour by hand.
|
|
711
|
+
*/
|
|
712
|
+
function anySignal(signals) {
|
|
713
|
+
if (typeof AbortSignal.any === "function") return {
|
|
714
|
+
signal: AbortSignal.any([...signals]),
|
|
715
|
+
detach: () => {}
|
|
716
|
+
};
|
|
717
|
+
const controller = new AbortController();
|
|
718
|
+
const abort = () => {
|
|
719
|
+
controller.abort();
|
|
720
|
+
};
|
|
721
|
+
for (const signal of signals) if (signal.aborted) {
|
|
722
|
+
abort();
|
|
723
|
+
return {
|
|
724
|
+
signal: controller.signal,
|
|
725
|
+
detach: () => {}
|
|
726
|
+
};
|
|
727
|
+
}
|
|
728
|
+
for (const signal of signals) signal.addEventListener("abort", abort);
|
|
729
|
+
return {
|
|
730
|
+
signal: controller.signal,
|
|
731
|
+
detach: () => {
|
|
732
|
+
for (const signal of signals) signal.removeEventListener("abort", abort);
|
|
733
|
+
}
|
|
734
|
+
};
|
|
735
|
+
}
|
|
736
|
+
/** `true` for a timeout the executors and the repository accept. */
|
|
737
|
+
function isTimeout(value) {
|
|
738
|
+
return typeof value === "number" && Number.isFinite(value) && value > 0;
|
|
739
|
+
}
|
|
740
|
+
/**
|
|
741
|
+
* `signal` combined with a `timeoutMs` timer. Without a timeout it returns
|
|
742
|
+
* the signal unchanged, so calls without one allocate nothing.
|
|
743
|
+
*/
|
|
744
|
+
function deadline(signal, timeoutMs) {
|
|
745
|
+
if (timeoutMs === void 0) return NO_DEADLINE(signal);
|
|
746
|
+
const timer = new AbortController();
|
|
747
|
+
const handle = setTimeout(() => {
|
|
748
|
+
timer.abort();
|
|
749
|
+
}, timeoutMs);
|
|
750
|
+
const combined = signal ? anySignal([signal, timer.signal]) : {
|
|
751
|
+
signal: timer.signal,
|
|
752
|
+
detach: () => {}
|
|
753
|
+
};
|
|
754
|
+
return {
|
|
755
|
+
signal: combined.signal,
|
|
756
|
+
timedOut: () => timer.signal.aborted && !(signal?.aborted ?? false),
|
|
757
|
+
clear: () => {
|
|
758
|
+
clearTimeout(handle);
|
|
759
|
+
combined.detach();
|
|
760
|
+
}
|
|
761
|
+
};
|
|
762
|
+
}
|
|
763
|
+
const NO_TUNING = Object.freeze({});
|
|
764
|
+
/** `invalid_request` text for a bad `timeout` or `retry`, else `undefined`. */
|
|
765
|
+
function invalidTuning(tuning) {
|
|
766
|
+
if (tuning.timeout !== void 0 && !isTimeout(tuning.timeout)) return `"timeout" must be a positive number of milliseconds, got ${String(tuning.timeout)}`;
|
|
767
|
+
if (tuning.retry !== void 0 && typeof tuning.retry !== "boolean") return `"retry" must be a boolean, got ${String(tuning.retry)}`;
|
|
768
|
+
}
|
|
769
|
+
/** `timeout` and `retry` from a call's arguments, or why they are invalid. */
|
|
770
|
+
function tuningOf(args) {
|
|
771
|
+
const timeout = args?.["timeout"];
|
|
772
|
+
const retry = args?.["retry"];
|
|
773
|
+
if (timeout === void 0 && retry === void 0) return NO_TUNING;
|
|
774
|
+
const invalid = invalidTuning({
|
|
775
|
+
timeout,
|
|
776
|
+
retry
|
|
777
|
+
});
|
|
778
|
+
if (invalid) return { invalid };
|
|
779
|
+
return {
|
|
780
|
+
...isTimeout(timeout) ? { timeout } : {},
|
|
781
|
+
...typeof retry === "boolean" ? { retry } : {}
|
|
782
|
+
};
|
|
783
|
+
}
|
|
784
|
+
//#endregion
|
|
785
|
+
//#region src/core/postgrest-executor.ts
|
|
786
|
+
function scope(client, schema) {
|
|
787
|
+
const loose = client;
|
|
788
|
+
if (schema === "public" || !loose.schema) return loose;
|
|
789
|
+
let schemas = scopedClients.get(client);
|
|
790
|
+
if (!schemas) {
|
|
791
|
+
schemas = /* @__PURE__ */ new Map();
|
|
792
|
+
scopedClients.set(client, schemas);
|
|
793
|
+
}
|
|
794
|
+
let scoped = schemas.get(schema);
|
|
795
|
+
if (!scoped) {
|
|
796
|
+
scoped = loose.schema(schema);
|
|
797
|
+
schemas.set(schema, scoped);
|
|
798
|
+
}
|
|
799
|
+
return scoped;
|
|
800
|
+
}
|
|
801
|
+
/** `schema()` builds a new client on every call; one per client and schema is enough. */
|
|
802
|
+
const scopedClients = /* @__PURE__ */ new WeakMap();
|
|
803
|
+
function fromTable(client, schema, table) {
|
|
804
|
+
return scope(client, schema).from(table);
|
|
805
|
+
}
|
|
806
|
+
/** A POST to the function: arguments such as query vectors are too long for a URL. */
|
|
807
|
+
function fromFunction(client, source, options) {
|
|
808
|
+
const scoped = scope(client, source.schema);
|
|
809
|
+
if (!scoped.rpc) throw new TypeError(`better-supabase: the client has no rpc(), needed to read from ${source.name}`);
|
|
810
|
+
return scoped.rpc(source.name, source.args, options);
|
|
811
|
+
}
|
|
812
|
+
function applyFilters(builder, plan) {
|
|
813
|
+
let query = builder;
|
|
814
|
+
for (const filter of plan.filters) query = filter.kind === "filter" ? query.filter(filter.path, filter.operator, filter.value) : query.or(filter.expression, filter.referencedTable ? { referencedTable: filter.referencedTable } : {});
|
|
815
|
+
return query;
|
|
816
|
+
}
|
|
817
|
+
function applyOrderAndLimits(builder, plan) {
|
|
818
|
+
let query = builder;
|
|
819
|
+
for (const order of plan.orders) {
|
|
820
|
+
const options = { ascending: order.ascending };
|
|
821
|
+
if (order.nullsFirst !== void 0) options.nullsFirst = order.nullsFirst;
|
|
822
|
+
if (order.referencedTable) options.referencedTable = order.referencedTable;
|
|
823
|
+
query = query.order(order.column, options);
|
|
824
|
+
}
|
|
825
|
+
for (const limit of plan.limits) query = query.limit(limit.count, limit.referencedTable ? { referencedTable: limit.referencedTable } : {});
|
|
826
|
+
if (plan.range) query = query.range(plan.range.from, plan.range.to);
|
|
827
|
+
return query;
|
|
828
|
+
}
|
|
829
|
+
/** A mutation without `returning` reports its row count, `exact` unless the op says otherwise. */
|
|
830
|
+
function countOf(op, plan) {
|
|
831
|
+
return plan.select === void 0 ? { count: op.count ?? "exact" } : {};
|
|
832
|
+
}
|
|
833
|
+
function bounded(query, op, plan) {
|
|
834
|
+
if (plan.maxAffected === void 0) return query;
|
|
835
|
+
if (!query.maxAffected) invalidRequest("\"maxAffected\" needs @supabase/postgrest-js 2 or later", op.table.key);
|
|
836
|
+
return query.maxAffected(plan.maxAffected);
|
|
837
|
+
}
|
|
838
|
+
function build(client, op, plan) {
|
|
839
|
+
const base = fromTable(client, op.table.schema, op.table.name);
|
|
840
|
+
switch (op.kind) {
|
|
841
|
+
case "select": {
|
|
842
|
+
const options = {};
|
|
843
|
+
if (op.count) options.count = op.count;
|
|
844
|
+
if (op.head) options.head = true;
|
|
845
|
+
let query = applyOrderAndLimits(applyFilters(op.source ? fromFunction(client, op.source, options).select(plan.select) : base.select(plan.select, options), plan), plan);
|
|
846
|
+
if (op.single === "one") query = query.single();
|
|
847
|
+
if (op.single === "maybe") query = query.maybeSingle();
|
|
848
|
+
return query;
|
|
849
|
+
}
|
|
850
|
+
case "insert": {
|
|
851
|
+
const rows = op.rows.length === 1 ? op.rows[0] : op.rows;
|
|
852
|
+
const count = countOf(op, plan);
|
|
853
|
+
let query = op.onConflict ? base.upsert(rows, {
|
|
854
|
+
onConflict: op.onConflict.columns.join(","),
|
|
855
|
+
ignoreDuplicates: op.onConflict.action === "ignore",
|
|
856
|
+
defaultToNull: op.defaultToNull,
|
|
857
|
+
...count
|
|
858
|
+
}) : base.insert(rows, {
|
|
859
|
+
defaultToNull: op.defaultToNull,
|
|
860
|
+
...count
|
|
861
|
+
});
|
|
862
|
+
if (plan.select !== void 0) query = query.select(plan.select);
|
|
863
|
+
return query;
|
|
864
|
+
}
|
|
865
|
+
case "update": {
|
|
866
|
+
let query = applyFilters(base.update(op.set, countOf(op, plan)), plan);
|
|
867
|
+
if (plan.select !== void 0) query = query.select(plan.select);
|
|
868
|
+
return bounded(query, op, plan);
|
|
869
|
+
}
|
|
870
|
+
case "delete": {
|
|
871
|
+
let query = applyFilters(base.delete(countOf(op, plan)), plan);
|
|
872
|
+
if (plan.select !== void 0) query = query.select(plan.select);
|
|
873
|
+
return bounded(query, op, plan);
|
|
874
|
+
}
|
|
875
|
+
default: return op;
|
|
876
|
+
}
|
|
877
|
+
}
|
|
878
|
+
function rowsOf(data) {
|
|
879
|
+
if (data === null || data === void 0) return [];
|
|
880
|
+
if (Array.isArray(data)) return data;
|
|
881
|
+
return [data];
|
|
882
|
+
}
|
|
883
|
+
const ONLY_ROWS = /there are only (\d+) rows/;
|
|
884
|
+
/**
|
|
885
|
+
* PostgREST answers a counted read whose offset is past the last row with
|
|
886
|
+
* 416 (`PGRST103`); the SQL executor returns no rows and the total.
|
|
887
|
+
*/
|
|
888
|
+
function pastLastRow(op, error) {
|
|
889
|
+
if (op.kind !== "select" || !op.count || error.code !== "PGRST103") return;
|
|
890
|
+
const match = ONLY_ROWS.exec(error.details ?? "");
|
|
891
|
+
return match ? Number(match[1]) : void 0;
|
|
892
|
+
}
|
|
893
|
+
const aborted = () => dbError("aborted", "The request was aborted");
|
|
894
|
+
function tune(builder, signal, retry) {
|
|
895
|
+
let query = builder;
|
|
896
|
+
if (signal) query = query.abortSignal(signal);
|
|
897
|
+
if (retry !== void 0 && query.retry) query = query.retry(retry);
|
|
898
|
+
return query;
|
|
899
|
+
}
|
|
900
|
+
const timedOut = (ms) => dbError("timeout", `The request timed out after ${ms} ms`);
|
|
901
|
+
const DEFAULT_URL_LENGTH_LIMIT = 6e3;
|
|
902
|
+
/** `urlLengthLimit` on a bare `PostgrestClient`, or on supabase-js's `rest` client. */
|
|
903
|
+
function clientUrlLengthLimit(client) {
|
|
904
|
+
const loose = client;
|
|
905
|
+
const limit = loose.urlLengthLimit ?? loose.rest?.urlLengthLimit;
|
|
906
|
+
return typeof limit === "number" && limit > 0 ? limit : void 0;
|
|
907
|
+
}
|
|
908
|
+
/** The query-string budget for one read: the option, else the lower of 6000 and the client's limit. */
|
|
909
|
+
function resolveUrlLengthLimit(client, options) {
|
|
910
|
+
const explicit = options.urlLengthLimit;
|
|
911
|
+
if (explicit !== void 0) return explicit;
|
|
912
|
+
const fromClient = clientUrlLengthLimit(client);
|
|
913
|
+
return fromClient === void 0 ? DEFAULT_URL_LENGTH_LIMIT : Math.min(fromClient, DEFAULT_URL_LENGTH_LIMIT);
|
|
914
|
+
}
|
|
915
|
+
/** Chunks of a split read in flight at once. */
|
|
916
|
+
const CHUNK_CONCURRENCY = 4;
|
|
917
|
+
/** Executes IR operations through a supabase-js client. */
|
|
918
|
+
function postgrestExecutor(client, options = {}) {
|
|
919
|
+
const urlLengthLimit = resolveUrlLengthLimit(client, options);
|
|
920
|
+
const compileOptions = options.postgrestVersion === void 0 ? {} : { postgrestVersion: options.postgrestVersion };
|
|
921
|
+
const timeout = isTimeout(options.timeout) ? options.timeout : void 0;
|
|
922
|
+
const execute = async (op, context) => {
|
|
923
|
+
let plan;
|
|
924
|
+
try {
|
|
925
|
+
plan = compilePostgrest(op, compileOptions);
|
|
926
|
+
} catch (cause) {
|
|
927
|
+
return err(toDbError(cause));
|
|
928
|
+
}
|
|
929
|
+
if (plan.never) return ok({
|
|
930
|
+
rows: [],
|
|
931
|
+
count: 0
|
|
932
|
+
});
|
|
933
|
+
if (context.signal?.aborted) return err(aborted());
|
|
934
|
+
const length = queryLength(plan);
|
|
935
|
+
if (op.kind !== "select" && length > urlLengthLimit) return err(tooLong(op, length, urlLengthLimit, "a write can't be split into several requests"));
|
|
936
|
+
if (op.kind === "select" && length > urlLengthLimit) {
|
|
937
|
+
const chunked = chunkRead(op, plan, urlLengthLimit);
|
|
938
|
+
if (!("ops" in chunked)) return err(chunked);
|
|
939
|
+
const results = [];
|
|
940
|
+
let next = 0;
|
|
941
|
+
const lane = async () => {
|
|
942
|
+
while (next < chunked.ops.length) {
|
|
943
|
+
const index = next++;
|
|
944
|
+
const chunk = chunked.ops[index];
|
|
945
|
+
const chunkPlan = chunked.plans?.[index];
|
|
946
|
+
const result = await (chunkPlan ? run(chunk, chunkPlan, context) : send(chunk, context));
|
|
947
|
+
results[index] = result;
|
|
948
|
+
if (!result.ok) next = chunked.ops.length;
|
|
949
|
+
}
|
|
950
|
+
};
|
|
951
|
+
await Promise.all(Array.from({ length: Math.min(CHUNK_CONCURRENCY, chunked.ops.length) }, lane));
|
|
952
|
+
const rows = [];
|
|
953
|
+
for (const result of results) {
|
|
954
|
+
if (!result.ok) return result;
|
|
955
|
+
for (const row of result.data.rows) rows.push(row);
|
|
956
|
+
}
|
|
957
|
+
return ok({
|
|
958
|
+
rows: chunked.sort ? chunked.sort(rows) : rows,
|
|
959
|
+
count: null
|
|
960
|
+
});
|
|
961
|
+
}
|
|
962
|
+
return run(op, plan, context);
|
|
963
|
+
};
|
|
964
|
+
const send = (op, context) => {
|
|
965
|
+
let plan;
|
|
966
|
+
try {
|
|
967
|
+
plan = compilePostgrest(op, compileOptions);
|
|
968
|
+
} catch (cause) {
|
|
969
|
+
return Promise.resolve(err(toDbError(cause)));
|
|
970
|
+
}
|
|
971
|
+
return plan.never ? Promise.resolve(ok({
|
|
972
|
+
rows: [],
|
|
973
|
+
count: 0
|
|
974
|
+
})) : run(op, plan, context);
|
|
975
|
+
};
|
|
976
|
+
const run = async (op, plan, context) => {
|
|
977
|
+
let query;
|
|
978
|
+
try {
|
|
979
|
+
query = build(client, op, plan);
|
|
980
|
+
} catch (cause) {
|
|
981
|
+
return err(toDbError(cause));
|
|
982
|
+
}
|
|
983
|
+
const limit = deadline(context.signal, timeout);
|
|
984
|
+
try {
|
|
985
|
+
query = tune(query, limit.signal, context.retry ?? options.retry);
|
|
986
|
+
const response = await query;
|
|
987
|
+
if (response.error) {
|
|
988
|
+
if (limit.timedOut() && timeout !== void 0) return err(timedOut(timeout));
|
|
989
|
+
if (limit.signal?.aborted) return err(aborted());
|
|
990
|
+
const total = pastLastRow(op, response.error);
|
|
991
|
+
if (total !== void 0) return ok({
|
|
992
|
+
rows: [],
|
|
993
|
+
count: total
|
|
994
|
+
});
|
|
995
|
+
return err(withMaxAffected(mapDbError(response.error, context.errorMappers), plan.maxAffected));
|
|
996
|
+
}
|
|
997
|
+
return ok({
|
|
998
|
+
rows: rowsOf(response.data),
|
|
999
|
+
count: response.count ?? null
|
|
1000
|
+
});
|
|
1001
|
+
} finally {
|
|
1002
|
+
limit.clear();
|
|
1003
|
+
}
|
|
1004
|
+
};
|
|
1005
|
+
return {
|
|
1006
|
+
name: "postgrest",
|
|
1007
|
+
functionSources: true,
|
|
1008
|
+
execute,
|
|
1009
|
+
async rpc(name, args, context) {
|
|
1010
|
+
const scoped = scope(client, context.schema);
|
|
1011
|
+
if (!scoped.rpc) return err(toDbError(/* @__PURE__ */ new Error("The client does not support rpc()")));
|
|
1012
|
+
if (context.signal?.aborted) return err(aborted());
|
|
1013
|
+
const built = context.get ? scoped.rpc(name, queryArgs(args), { get: true }) : scoped.rpc(name, args);
|
|
1014
|
+
const limit = deadline(context.signal, timeout);
|
|
1015
|
+
try {
|
|
1016
|
+
const response = await tune(built, limit.signal, context.retry ?? options.retry);
|
|
1017
|
+
if (response.error) {
|
|
1018
|
+
if (limit.timedOut() && timeout !== void 0) return err(timedOut(timeout));
|
|
1019
|
+
if (limit.signal?.aborted) return err(aborted());
|
|
1020
|
+
return err(mapDbError(response.error, context.errorMappers));
|
|
1021
|
+
}
|
|
1022
|
+
return ok(response.data);
|
|
1023
|
+
} finally {
|
|
1024
|
+
limit.clear();
|
|
1025
|
+
}
|
|
1026
|
+
}
|
|
1027
|
+
};
|
|
1028
|
+
}
|
|
1029
|
+
/**
|
|
1030
|
+
* GET arguments travel in the query string, where supabase-js would print an
|
|
1031
|
+
* object as `[object Object]`; json and jsonb parameters take it as JSON.
|
|
1032
|
+
*/
|
|
1033
|
+
function queryArgs(args) {
|
|
1034
|
+
return Object.fromEntries(Object.entries(args).map(([key, value]) => [key, typeof value === "object" && value !== null && !Array.isArray(value) ? JSON.stringify(value) : value]));
|
|
1035
|
+
}
|
|
1036
|
+
/** The compiled plan for an operation; useful for debugging and tests. */
|
|
1037
|
+
function explainPostgrest(op, options) {
|
|
1038
|
+
return compilePostgrest(op, options);
|
|
1039
|
+
}
|
|
1040
|
+
//#endregion
|
|
1041
|
+
//#region src/core/stats.ts
|
|
1042
|
+
const EMPTY_STATS = {
|
|
1043
|
+
calls: 0,
|
|
1044
|
+
waves: 0,
|
|
1045
|
+
tables: [],
|
|
1046
|
+
ms: 0
|
|
1047
|
+
};
|
|
1048
|
+
/**
|
|
1049
|
+
* Counts calls and waves. A recorder with a `parent` also reports to it, so
|
|
1050
|
+
* a request-wide recorder sees every scope's calls.
|
|
1051
|
+
*/
|
|
1052
|
+
var StatsRecorder = class {
|
|
1053
|
+
#parent;
|
|
1054
|
+
#now;
|
|
1055
|
+
#tables = /* @__PURE__ */ new Set();
|
|
1056
|
+
#calls = 0;
|
|
1057
|
+
#waves = 0;
|
|
1058
|
+
#inFlight = 0;
|
|
1059
|
+
#first;
|
|
1060
|
+
#last;
|
|
1061
|
+
constructor(parent, now = () => performance.now()) {
|
|
1062
|
+
this.#parent = parent;
|
|
1063
|
+
this.#now = now;
|
|
1064
|
+
}
|
|
1065
|
+
/** Records a call to `table`; the returned function ends it. */
|
|
1066
|
+
begin(table) {
|
|
1067
|
+
const end = this.#parent?.begin(table);
|
|
1068
|
+
const started = this.#now();
|
|
1069
|
+
if (this.#inFlight === 0) this.#waves += 1;
|
|
1070
|
+
this.#inFlight += 1;
|
|
1071
|
+
this.#calls += 1;
|
|
1072
|
+
this.#tables.add(table);
|
|
1073
|
+
this.#first ??= started;
|
|
1074
|
+
let ended = false;
|
|
1075
|
+
return () => {
|
|
1076
|
+
if (ended) return;
|
|
1077
|
+
ended = true;
|
|
1078
|
+
this.#inFlight -= 1;
|
|
1079
|
+
this.#last = Math.max(this.#last ?? 0, this.#now());
|
|
1080
|
+
end?.();
|
|
1081
|
+
};
|
|
1082
|
+
}
|
|
1083
|
+
/** The totals so far. */
|
|
1084
|
+
snapshot() {
|
|
1085
|
+
return {
|
|
1086
|
+
calls: this.#calls,
|
|
1087
|
+
waves: this.#waves,
|
|
1088
|
+
tables: [...this.#tables],
|
|
1089
|
+
ms: this.#first === void 0 || this.#last === void 0 ? 0 : Math.round((this.#last - this.#first) * 100) / 100
|
|
1090
|
+
};
|
|
1091
|
+
}
|
|
1092
|
+
};
|
|
1093
|
+
/** Wraps an executor so every call is recorded. */
|
|
1094
|
+
function recordStats(executor, recorder) {
|
|
1095
|
+
const wrapped = {
|
|
1096
|
+
name: executor.name,
|
|
1097
|
+
async execute(op, context) {
|
|
1098
|
+
const end = recorder.begin(op.table.key);
|
|
1099
|
+
try {
|
|
1100
|
+
return await executor.execute(op, context);
|
|
1101
|
+
} finally {
|
|
1102
|
+
end();
|
|
1103
|
+
}
|
|
1104
|
+
}
|
|
1105
|
+
};
|
|
1106
|
+
if (executor.rpc) {
|
|
1107
|
+
const rpc = executor.rpc.bind(executor);
|
|
1108
|
+
return {
|
|
1109
|
+
...wrapped,
|
|
1110
|
+
async rpc(name, args, context) {
|
|
1111
|
+
const end = recorder.begin(`${name}()`);
|
|
1112
|
+
try {
|
|
1113
|
+
return await rpc(name, args, context);
|
|
1114
|
+
} finally {
|
|
1115
|
+
end();
|
|
1116
|
+
}
|
|
1117
|
+
}
|
|
1118
|
+
};
|
|
1119
|
+
}
|
|
1120
|
+
return wrapped;
|
|
1121
|
+
}
|
|
1122
|
+
//#endregion
|
|
1123
|
+
export { postgrestExecutor as a, invalidTuning as c, explainPostgrest as i, tuningOf as l, StatsRecorder as n, NO_TUNING as o, recordStats as r, deadline as s, EMPTY_STATS as t, compilePostgrest as u };
|