better-supabase 0.7.1 → 0.8.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 +6 -2
- package/dist/{access-sql-B0dF-SoF.js → access-sql-CrSbK1q-.js} +1 -1
- package/dist/{adapter-iKgjHVPx.js → adapter-CN45ibbV.js} +658 -157
- package/dist/{agents-CVHGd7It.d.ts → agents-BY_LQXtQ.d.ts} +4 -4
- package/dist/{ai-cache-CBWs1W0k.js → ai-cache-Dfgk8nBT.js} +2 -1
- package/dist/{ai-cache-DaDu_G5L.d.ts → ai-cache-DrUMMgp6.d.ts} +4 -4
- package/dist/{ai-chat-B24UI962.js → ai-chat-CVLRWbtS.js} +4 -3
- package/dist/{ai-chat-7amvXjmQ.d.ts → ai-chat-DXkMy74O.d.ts} +5 -5
- package/dist/{ai-files-CSPNswUY.js → ai-files-CioLu5du.js} +5 -4
- package/dist/ai-message-DfaP8sis.js +14 -0
- package/dist/ai-sdk/agents/index.d.ts +4 -4
- package/dist/ai-sdk/batches/index.d.ts +4 -4
- package/dist/ai-sdk/batches/index.js +4 -4
- package/dist/ai-sdk/cache/index.d.ts +2 -2
- package/dist/ai-sdk/cache/index.js +2 -2
- package/dist/ai-sdk/chat/index.d.ts +1 -1
- package/dist/ai-sdk/chat/index.js +8 -20
- package/dist/ai-sdk/embeddings/index.d.ts +2 -2
- package/dist/ai-sdk/files/index.d.ts +3 -3
- package/dist/ai-sdk/files/index.js +4 -4
- package/dist/ai-sdk/index.d.ts +37 -9
- package/dist/ai-sdk/index.js +3 -2
- package/dist/ai-sdk/mcp/index.d.ts +43 -6
- package/dist/ai-sdk/mcp/index.js +36 -7
- package/dist/ai-sdk/memory/index.d.ts +2 -2
- package/dist/ai-sdk/memory/index.js +1 -1
- package/dist/ai-sdk/workflow/index.d.ts +6 -6
- package/dist/ai-sdk/workflow/index.js +13 -24
- package/dist/{ai-tasks-Cd1HMFvB.d.ts → ai-tasks-BRQ6iQLc.d.ts} +4 -4
- package/dist/{announcements-ZRGnScWI.d.ts → announcements-Bouy0Ski.d.ts} +3 -3
- package/dist/{announcements-CiyOs-xP.js → announcements-p_BFofiR.js} +1 -1
- package/dist/api-Dnf2q-Ht.d.ts +370 -0
- package/dist/api-DtHFC037.js +676 -0
- package/dist/{api-keys-CIjghYjV.d.ts → api-keys-C8BlF3L2.d.ts} +4 -4
- package/dist/arazzo/index.d.ts +255 -0
- package/dist/arazzo/index.js +622 -0
- package/dist/{assistant-DwdpDH1q.d.ts → assistant-DBlFDZsi.d.ts} +5 -5
- package/dist/astro/index.d.ts +7 -7
- package/dist/astro/index.js +7 -7
- package/dist/asyncapi/index.d.ts +103 -0
- package/dist/asyncapi/index.js +569 -0
- package/dist/authorizer-ayxUDXXP.js +126 -0
- package/dist/authorizer-eiOjo-3l.d.ts +73 -0
- package/dist/better-result/index.d.ts +118 -0
- package/dist/better-result/index.js +64 -0
- package/dist/{bind-l4kAvYSv.js → bind-ButSzrHe.js} +1 -1
- package/dist/{bind-Bu_ZNa3W.d.ts → bind-CQ5mPyX1.d.ts} +3 -3
- package/dist/{block-events-CrT8r7Fe.js → block-events-DTxU5tfr.js} +18 -3
- package/dist/{block-fields-GFkxl4dP.js → block-fields-CroxUuF2.js} +3 -3
- package/dist/{block-fields-SJ6fEf3o.d.ts → block-fields-D1pfrcIY.d.ts} +2 -2
- package/dist/{block-helpers-CKtbFcRv.d.ts → block-helpers-C0Xj8War.d.ts} +2 -2
- package/dist/{block-helpers-DWHxHsEQ.js → block-helpers-Cy3pB96I.js} +41 -9
- package/dist/{block-hooks-BmjMyXTa.js → block-hooks-BPNMIlLl.js} +3 -3
- package/dist/{block-hooks-plbZ0AbJ.d.ts → block-hooks-DaOVC7SC.d.ts} +3 -3
- package/dist/{block-transport-BLr-ZgLc.js → block-transport-bAKh-dGc.js} +28 -2
- package/dist/{block-transport-DvaoPuZ9.d.ts → block-transport-inD4fFq-.d.ts} +24 -2
- package/dist/blocks/agents/index.d.ts +3 -3
- package/dist/blocks/agents/index.js +5 -4
- package/dist/blocks/ai-cache/index.d.ts +3 -3
- package/dist/blocks/ai-cache/index.js +3 -3
- package/dist/blocks/ai-chat/index.d.ts +9 -4
- package/dist/blocks/ai-chat/index.js +5 -5
- package/dist/blocks/ai-chat/react/index.d.ts +3 -3
- package/dist/blocks/ai-chat/react/index.js +5 -5
- package/dist/blocks/ai-files/index.d.ts +3 -3
- package/dist/blocks/ai-files/index.js +3 -3
- package/dist/blocks/ai-providers/index.d.ts +3 -3
- package/dist/blocks/ai-providers/index.js +8 -7
- package/dist/blocks/ai-tasks/index.d.ts +3 -3
- package/dist/blocks/ai-tasks/index.js +7 -6
- package/dist/blocks/announcements/index.d.ts +3 -3
- package/dist/blocks/announcements/index.js +3 -3
- package/dist/blocks/announcements/react/index.d.ts +3 -3
- package/dist/blocks/announcements/react/index.js +3 -3
- package/dist/blocks/api-keys/index.d.ts +5 -5
- package/dist/blocks/api-keys/index.js +8 -8
- package/dist/blocks/attachments/index.d.ts +12 -8
- package/dist/blocks/attachments/index.js +22 -13
- package/dist/blocks/audit/index.d.ts +21 -10
- package/dist/blocks/audit/index.js +30 -11
- package/dist/blocks/billing/index.d.ts +11 -9
- package/dist/blocks/billing/index.js +15 -15
- package/dist/blocks/comments/index.d.ts +8 -8
- package/dist/blocks/comments/index.js +8 -7
- package/dist/blocks/connectors/index.d.ts +3 -3
- package/dist/blocks/connectors/index.js +7 -6
- package/dist/blocks/data-lifecycle/index.d.ts +12 -8
- package/dist/blocks/data-lifecycle/index.js +13 -8
- package/dist/blocks/entitlements/index.d.ts +3 -3
- package/dist/blocks/entitlements/index.js +1 -1
- package/dist/blocks/flags/index.d.ts +4 -4
- package/dist/blocks/flags/index.js +4 -3
- package/dist/blocks/inbox/index.d.ts +3 -3
- package/dist/blocks/inbox/index.js +4 -5
- package/dist/blocks/inbox/react/index.d.ts +1 -1
- package/dist/blocks/inbox/react/index.js +1 -1
- package/dist/blocks/inbox/react/server.d.ts +1 -1
- package/dist/blocks/index.d.ts +10 -10
- package/dist/blocks/index.js +6 -6
- package/dist/blocks/jobs/index.d.ts +48 -32
- package/dist/blocks/jobs/index.js +44 -287
- package/dist/blocks/knowledge/index.d.ts +3 -3
- package/dist/blocks/knowledge/index.js +3 -3
- package/dist/blocks/memory/index.d.ts +4 -4
- package/dist/blocks/memory/index.js +7 -6
- package/dist/blocks/notifications/index.d.ts +11 -9
- package/dist/blocks/notifications/index.js +20 -25
- package/dist/blocks/notifications/react/index.d.ts +1 -1
- package/dist/blocks/notifications/react/index.js +1 -1
- package/dist/blocks/onboarding/index.d.ts +3 -3
- package/dist/blocks/onboarding/index.js +3 -3
- package/dist/blocks/onboarding/react/index.d.ts +2 -2
- package/dist/blocks/onboarding/react/index.js +2 -2
- package/dist/blocks/onboarding/react/server.d.ts +1 -1
- package/dist/blocks/organizations/index.d.ts +9 -9
- package/dist/blocks/organizations/index.js +11 -18
- package/dist/blocks/outbox/index.d.ts +2 -2
- package/dist/blocks/outbox/index.js +16 -25
- package/dist/blocks/profiles/index.d.ts +7 -7
- package/dist/blocks/profiles/index.js +7 -6
- package/dist/blocks/push/index.d.ts +4 -4
- package/dist/blocks/push/index.js +3 -3
- package/dist/blocks/settings/index.d.ts +4 -4
- package/dist/blocks/settings/index.js +7 -6
- package/dist/blocks/sso/index.d.ts +5 -5
- package/dist/blocks/sso/index.js +6 -5
- package/dist/blocks/usage/index.d.ts +3 -3
- package/dist/blocks/usage/index.js +5 -4
- package/dist/blocks/waitlist/index.d.ts +5 -5
- package/dist/blocks/waitlist/index.js +5 -4
- package/dist/blocks/webhooks/index.d.ts +22 -13
- package/dist/blocks/webhooks/index.js +41 -70
- package/dist/blocks/workflow-builder/index.d.ts +4 -4
- package/dist/blocks/workflow-builder/index.js +3 -3
- package/dist/blocks/workflow-builder/react/index.d.ts +4 -4
- package/dist/blocks/workflow-builder/react/index.js +4 -4
- package/dist/blocks/workflows/index.d.ts +3 -3
- package/dist/blocks/workflows/index.js +3 -3
- package/dist/blocks/workflows/react/index.d.ts +3 -3
- package/dist/blocks/workflows/react/index.js +3 -3
- package/dist/build-hPwk3_X5.js +1296 -0
- package/dist/{build-BXIzE6Xv.js → build-meLuYGri.js} +3 -3
- package/dist/casing-DdFWEtqr.js +16 -0
- package/dist/chat-sdk/index.d.ts +6 -6
- package/dist/chat-sdk/index.js +5 -4
- package/dist/chat-sdk/react/index.d.ts +1 -1
- package/dist/chat-sdk/react/server.d.ts +1 -1
- package/dist/{claims-DDBQT6BK.js → claims-0KZVT804.js} +1 -1
- package/dist/cli/add-1dc5wM5k.js +69 -0
- package/dist/cli/arazzo-1.0-BalU61-_.js +532 -0
- package/dist/cli/arazzo-1.1-Bnfasbun.js +705 -0
- package/dist/cli/asyncapi-3.0.0-C78dBjR6.js +5593 -0
- package/dist/cli/asyncapi-3.1.0-g-7aIfV1.js +5833 -0
- package/dist/cli/bin.js +4 -4
- package/dist/cli/cache-CIfA-jBV.js +483 -0
- package/dist/cli/{codemod-Bl_tQpHn.js → codemod-JVlTQQG2.js} +4 -4
- package/dist/cli/{command-CK14fP91.js → command-DV-StG1x.js} +5 -0
- package/dist/cli/{config-DU7EJImt.js → config-C2Pz2_4A.js} +7 -4
- package/dist/cli/config-DpbF8ML3.js +2 -0
- package/dist/cli/{config-NiPxAmUF.js → config-M-WzL9O2.js} +116 -18
- package/dist/cli/{db-DOBPt660.js → db-BkcfOlyB.js} +2 -1
- package/dist/cli/{diff-SjkO5rNr.js → diff-D1jGdb3Y.js} +1 -1
- package/dist/cli/{doctor-DJk0aeBi.js → doctor-VcDtuusV.js} +316 -221
- package/dist/cli/emit-BHHfwUoT.js +1136 -0
- package/dist/cli/{env-qXgyMV6r.js → env-B--LMhEe.js} +13 -10
- package/dist/cli/env-vzBG90Um.js +2 -0
- package/dist/cli/{env-CJLbUVPB.js → env-zHJtMIBo.js} +11 -3
- package/dist/cli/{errors-4v4DTtda.js → errors-CqTLXe2M.js} +18 -2
- package/dist/cli/{fastest-levenshtein-CFN-lNDv.js → fastest-levenshtein-CF7BCi9l.js} +1 -1
- package/dist/cli/files-BVupXPIC.js +34 -0
- package/dist/cli/gen-DmVj3u4L.js +322 -0
- package/dist/cli/{init-BHuEQrQK.js → glue-C1UE8gQN.js} +16 -313
- package/dist/cli/index.d.ts +59 -31
- package/dist/cli/index.js +8 -6
- package/dist/cli/init-CVZ3s5kl.js +258 -0
- package/dist/cli/{introspect-DzR2nyQb.js → introspect-BToGNfm-.js} +14 -14
- package/dist/cli/{io-DI1mTdSA.js → io-CFzJVJ68.js} +5 -1
- package/dist/cli/{keys-BGCnnb-s.js → keys-CJhtIxJ3.js} +4 -4
- package/dist/cli/metadata-DSRKCaf-.js +133 -0
- package/dist/cli/names-D6LrQnOv.js +6 -0
- package/dist/cli/openapi-3.0-t7xwkuRH.js +928 -0
- package/dist/cli/openapi-3.1-CVze7tBS.js +870 -0
- package/dist/cli/openapi-3.2-CFoMYM01.js +1031 -0
- package/dist/cli/{openapi-BlRJ18s3.js → openapi-DWa4Ir1q.js} +8 -14
- package/dist/cli/prompts-BdeVmVpg.js +2 -0
- package/dist/cli/{prompts-BNcNfAve.js → prompts-DZJB1nTw.js} +6 -6
- package/dist/cli/{rolldown-runtime-BPOCksWG.js → rolldown-runtime-CMFfr-1z.js} +3 -1
- package/dist/cli/run-DA6_lg3w.js +389 -0
- package/dist/cli/run-DuN1MX-7.js +705 -0
- package/dist/cli/scaffold-5DenHSxF.js +292 -0
- package/dist/cli/scaffold-CwQUMFRb.js +2 -0
- package/dist/cli/{seed-DQzqT7LP.js → seed-CzBmrGON.js} +14 -18
- package/dist/cli/seed-DOmit9Hq.js +2 -0
- package/dist/cli/{skills-QQs4q68J.js → skills-CnO8QFS7.js} +7 -6
- package/dist/cli/snapshot-Bstk6ulj.js +287 -0
- package/dist/cli/source-args-BYfq6imV.js +31 -0
- package/dist/cli/spec-CzosTYm3.js +7438 -0
- package/dist/cli/spec-T_0Bcyw7.js +2 -0
- package/dist/cli/{sql-B8csQPyn.js → sql-BKOOQAX3.js} +240 -218
- package/dist/cli/sql-DJrNDxQm.js +3 -0
- package/dist/cli/{style-C0NFdJRL.js → style-CB3vxgh0.js} +3 -3
- package/dist/cli/typegen-Demi5-VQ.js +486 -0
- package/dist/cli/validate-Ca13ktgz.js +7522 -0
- package/dist/cli/{version-59gcepIG.js → version-B4k0aUxS.js} +1 -1
- package/dist/client/index.d.ts +4 -3
- package/dist/client/index.js +60 -3
- package/dist/client/native/index.d.ts +3 -3
- package/dist/client/native/index.js +3 -3
- package/dist/{client-CI0Z2zWX.js → client-wxeTQFtB.js} +36 -3
- package/dist/{clone-BfgmLU90.js → clone-dN9XOL1K.js} +9 -1
- package/dist/{cloud-event-BnmD5fb9.js → cloud-event-CTh9Sr5w.js} +16 -2
- package/dist/{cloud-event-C1JCc1bH.d.ts → cloud-event-Dune0KI7.d.ts} +16 -2
- package/dist/{compiler-DY_wkj4R.d.ts → compiler-V1qvcST1.d.ts} +2 -2
- package/dist/{compose-BIBNgAnq.js → compose-BHej1acw.js} +3 -3
- package/dist/{composite--yqry7uW.d.ts → composite-CWAJTRBF.d.ts} +6 -6
- package/dist/{composite-DXVUibdi.js → composite-zTe0TCqj.js} +4 -4
- package/dist/config/index.d.ts +3 -4
- package/dist/config/index.js +4 -4
- package/dist/config-DlKvtt95.js +540 -0
- package/dist/{connector-Dv8kK0MO.d.ts → connector-CySQEFcW.d.ts} +1 -1
- package/dist/{connectors-CrpknU0P.d.ts → connectors--PGhmiu0.d.ts} +4 -4
- package/dist/{context-BCrWe7ow.d.ts → context-DsV2SueA.d.ts} +11 -2
- package/dist/context-nPDvQ-Zl.js +41 -0
- package/dist/credentials/index.d.ts +5 -5
- package/dist/credentials/index.js +9 -17
- package/dist/{cron-DVPUg5k3.js → cron-D25Ukpxy.js} +1 -1
- package/dist/cron-route-D2AN9SA1.js +24 -0
- package/dist/{csv-DCK-PT1n.js → csv-BZnHA1Py.js} +1 -1
- package/dist/{define-B-TVjC25.js → define-CFQcvM20.js} +263 -229
- package/dist/{define-CJJkkr1-.d.ts → define-DmcfoNXB.d.ts} +136 -111
- package/dist/edge/index.d.ts +66 -13
- package/dist/edge/index.js +65 -39
- package/dist/elysia/index.d.ts +1 -1
- package/dist/elysia/index.js +1 -1
- package/dist/{embeddings-C9KGQnXt.d.ts → embeddings-B4vhS-dY.d.ts} +1 -1
- package/dist/{ended-XjeGQ5XW.d.ts → ended-CcvcRqEd.d.ts} +7 -1
- package/dist/{entitlements-DRl6ZJUm.js → entitlements-BYFf0Cdh.js} +2 -2
- package/dist/{entitlements-BKSVGtrG.d.ts → entitlements-Ds8qoYZ-.d.ts} +1 -1
- package/dist/env/index.d.ts +1 -1
- package/dist/env/index.js +9 -2
- package/dist/{errors-B11Duf73.js → errors-2M6CKMP4.js} +5 -0
- package/dist/{errors-DLjJHPLK.js → errors-rZ7VIqp6.js} +2 -2
- package/dist/{escape-like-ImTK0ps_.d.ts → escape-like-DDWoHzh_.d.ts} +1 -1
- package/dist/eve/index.d.ts +5 -5
- package/dist/eve/index.js +5 -11
- package/dist/{eve-gT2Fpjut.d.ts → eve-CoAIcCkq.d.ts} +2 -2
- package/dist/events/index.d.ts +4 -4
- package/dist/events/index.js +7 -2
- package/dist/{events-DWDhx77e.d.ts → events-D1BOCll8.d.ts} +6 -4
- package/dist/{executor-Bq28caBo.js → executor-B-fD7DLt.js} +52 -35
- package/dist/executor-B_Hfobee.js +162 -0
- package/dist/{executor-BVBFM86G.d.ts → executor-CpxLPCiz.d.ts} +1 -1
- package/dist/{executor-CaWigTyR.d.ts → executor-DfEtf0cq.d.ts} +43 -27
- package/dist/{executor-DvsBbNBS.d.ts → executor-Drzu3dBK.d.ts} +2 -2
- package/dist/{executor-DbvExCFC.d.ts → executor-ngjKL_Pe.d.ts} +2 -2
- package/dist/expo/index.d.ts +4 -4
- package/dist/expo/index.js +6 -6
- package/dist/expo-sqlite/index.d.ts +3 -3
- package/dist/expo-sqlite/index.js +2 -2
- package/dist/extra-CGQ2_q3S.js +10 -0
- package/dist/{field-errors-BFOa7WhB.d.ts → field-errors-DIe9XYWL.d.ts} +17 -7
- package/dist/{field-errors-VF1yb8yI.js → field-errors-DZVRWRkf.js} +1 -1
- package/dist/format-DTXdu8ya.d.ts +70 -0
- package/dist/{framework-BmzgK32X.d.ts → framework-148t1m3C.d.ts} +5 -5
- package/dist/{framework-a7aRCIqv.js → framework-3ey3QmrO.js} +2 -2
- package/dist/function-contract-BcZenXMO.d.ts +8 -0
- package/dist/{gateway-C1ssRHnf.d.ts → gateway-S9vicgeo.d.ts} +4 -4
- package/dist/{guards-BnzDvFrz.js → guards-6F2bCtQR.js} +3 -1
- package/dist/h3/index.d.ts +1 -1
- package/dist/h3/index.js +1 -1
- package/dist/h3/v1/index.d.ts +1 -1
- package/dist/h3/v1/index.js +1 -1
- package/dist/{message-CaKlqdsX.js → history-GH1HJWQV.js} +65 -13
- package/dist/hmac-DCud0myt.js +22 -0
- package/dist/hono/index.d.ts +19 -14
- package/dist/hono/index.js +21 -16
- package/dist/{hooks-1BTCJsiw.js → hooks-Bhza9Hnr.js} +68 -100
- package/dist/http-sbmBe5d2.js +25 -0
- package/dist/{inbox-i7E1ppo6.d.ts → inbox-Cd1KCEBL.d.ts} +3 -3
- package/dist/index-B72Rvv_j.d.ts +89 -0
- package/dist/{index-DunNRdnT.d.ts → index-BCHR4Ucl.d.ts} +4 -4
- package/dist/{index-CLg87OBW.d.ts → index-BUK7jUzR.d.ts} +6 -0
- package/dist/{config-D44Y7PAv.d.ts → index-Ba1SI-uO.d.ts} +625 -278
- package/dist/{index-D48jVS-N.d.ts → index-BfxOaOYs.d.ts} +4 -5
- package/dist/{index-ClmjK_o-.d.ts → index-CicIyqOe.d.ts} +4 -4
- package/dist/{index-ACiNPN4Z.d.ts → index-D69h4QqD.d.ts} +1 -1
- package/dist/index-DG2SUXDQ.d.ts +58 -0
- package/dist/{index-Bepi-Hgg.d.ts → index-DoNVLHOU.d.ts} +3 -3
- package/dist/{index-CdZKQF98.d.ts → index-R274XFlg.d.ts} +1 -1
- package/dist/{index-CewnYSpv.d.ts → index-_4R4b01v.d.ts} +8 -18
- package/dist/index.d.ts +89 -14
- package/dist/index.js +12 -11
- package/dist/{json-schema-CvER4kgT.js → json-schema-CT4tvrkA.js} +148 -102
- package/dist/{kit-Fm-Fv7q5.js → kit-BhHr9T9v.js} +36 -10
- package/dist/{kit-CkNzZUqv.d.ts → kit-W99LCPBS.d.ts} +13 -7
- package/dist/{knowledge-BXBbT0Tr.d.ts → knowledge-CAReFpRA.d.ts} +5 -5
- package/dist/{knowledge-CDmiMLew.js → knowledge-DnHtb64A.js} +4 -3
- package/dist/list/index.d.ts +1 -2
- package/dist/{list-query-BRt-zDF7.d.ts → list-query-D3JQeEL7.d.ts} +4 -4
- package/dist/mcp/index.d.ts +49 -19
- package/dist/mcp/index.js +158 -94
- package/dist/mcp/sdk/index.d.ts +38 -6
- package/dist/mcp/sdk/index.js +88 -6
- package/dist/{message-CfDoR0Y6.d.ts → message-B0fNJgq8.d.ts} +1 -2
- package/dist/{messages-B9-5887d.js → messages-CJoHHCWT.js} +4 -205
- package/dist/{mfa-Daak8ukG.d.ts → mfa-SZc9YYyb.d.ts} +1 -1
- package/dist/model-OgBxvk3N.d.ts +300 -0
- package/dist/model-messages-Cxw_Up4f.js +206 -0
- package/dist/model-messages-D4GZllOD.d.ts +34 -0
- package/dist/modules-DksjZyMW.js +77 -0
- package/dist/nestjs/index.d.ts +2 -2
- package/dist/nestjs/index.js +1 -1
- package/dist/next/index.d.ts +105 -55
- package/dist/next/index.js +204 -170
- package/dist/node/index.d.ts +2 -2
- package/dist/node/index.js +1 -1
- package/dist/{onboarding-BZGHYJks.d.ts → onboarding-LZvlK1P4.d.ts} +3 -3
- package/dist/openapi/index.d.ts +4 -2
- package/dist/openapi/index.js +21 -343
- package/dist/optional-peer-D1pi-skw.js +24 -0
- package/dist/orpc/index.d.ts +8 -8
- package/dist/orpc/index.js +21 -20
- package/dist/otel/index.d.ts +3 -3
- package/dist/otel/index.js +7 -7
- package/dist/{outbox-Cq7pPYvl.d.ts → outbox-DZfAvfzC.d.ts} +6 -6
- package/dist/overlay/index.d.ts +233 -0
- package/dist/overlay/index.js +554 -0
- package/dist/{plugin-FGY8UhYm.d.ts → plugin-CPK2HsbY.d.ts} +42 -3
- package/dist/plugins/actor/index.d.ts +1 -1
- package/dist/plugins/actor/index.js +1 -1
- package/dist/plugins/rules/index.d.ts +2 -2
- package/dist/plugins/rules/index.js +1 -1
- package/dist/plugins/soft-delete/index.d.ts +3 -3
- package/dist/plugins/soft-delete/index.js +9 -2
- package/dist/plugins/tenant/index.d.ts +7 -2
- package/dist/plugins/tenant/index.js +16 -2
- package/dist/plugins/timestamps/index.d.ts +1 -1
- package/dist/plugins/timestamps/index.js +8 -1
- package/dist/plugins/validation/index.d.ts +2 -2
- package/dist/plugins/validation/index.js +4 -4
- package/dist/{pool-CAu2nLrL.d.ts → pool-gkhbGp2E.d.ts} +2 -2
- package/dist/postgres/index.d.ts +4 -4
- package/dist/postgres/index.js +2 -1
- package/dist/{postgrest-BLVdEnfe.d.ts → postgrest-BUqLag2Q.d.ts} +1 -1
- package/dist/powersync/index.d.ts +5 -5
- package/dist/powersync/index.js +4 -4
- package/dist/powersync/react/index.d.ts +3 -3
- package/dist/powersync/react/index.js +1 -1
- package/dist/{problem-BreOl8b8.js → problem-CJvFeGu7.js} +13 -2
- package/dist/{problem-DD8LZFjc.d.ts → problem-TvGdxO1t.d.ts} +7 -1
- package/dist/{provider-Di3sRutW.js → provider-DxRTex4x.js} +1 -1
- package/dist/{provider-D-UEMvSD.d.ts → provider-ib9wzUDz.d.ts} +2 -2
- package/dist/query/index.d.ts +2 -2
- package/dist/query/index.js +1 -1
- package/dist/{query-BQ-NaZon.js → query-Ctz-qKRx.js} +1 -1
- package/dist/rate-limit-Bw7HgmFj.js +260 -0
- package/dist/react/index.d.ts +9 -9
- package/dist/react/index.js +4 -4
- package/dist/react/native/index.d.ts +1 -1
- package/dist/react/native/index.js +2 -2
- package/dist/react/server.d.ts +10 -10
- package/dist/react/server.js +3 -3
- package/dist/react/session.d.ts +2 -2
- package/dist/{react-F80mF4-t.js → react-Bmpo59D7.js} +4 -4
- package/dist/react-router/index.d.ts +6 -6
- package/dist/react-router/index.js +9 -11
- package/dist/{read-set-DuKWC9Mj.js → read-set-DAeWhqPf.js} +2 -2
- package/dist/realtime/index.d.ts +3 -3
- package/dist/realtime/index.js +30 -36
- package/dist/{refusal-DhSU2Vvr.d.ts → refusal-CFI8-5nf.d.ts} +4 -1
- package/dist/{refusal-CeJWxmkH.js → refusal-K78A1Vmq.js} +5 -5
- package/dist/{resolve-tJZY3FEa.js → resolve-Bvgf3ut_.js} +131 -42
- package/dist/{resolve-ChTYeTEl.d.ts → resolve-MxXVWyhd.d.ts} +12 -8
- package/dist/resource--vTrBe6I.d.ts +103 -0
- package/dist/resource-BqNqlYg9.js +91 -0
- package/dist/resource-DA811u_4.js +463 -0
- package/dist/resource-execute-rbKvuCsY.d.ts +12 -0
- package/dist/resource-schemas-BJ518zFH.js +79 -0
- package/dist/resource-types-CqB6GWGT.d.ts +141 -0
- package/dist/resources-BVYPnuLo.js +56 -0
- package/dist/resources-DZSk8tXJ.d.ts +7 -0
- package/dist/{respond-DprrgyXX.d.ts → respond-Cw-zanCm.d.ts} +3 -3
- package/dist/{respond-BUgsXNgk.js → respond-volM3ByS.js} +4 -4
- package/dist/{result-D7y2fT87.d.ts → result-BchM1XZn.d.ts} +7 -1
- package/dist/{result-DzUbqgdW.js → result-DEqHCMKP.js} +1 -1
- package/dist/server/index.d.ts +81 -19
- package/dist/server/index.js +16 -14
- package/dist/{server-Bh0EVSwU.d.ts → server-types-CrAmZ8jv.d.ts} +92 -36
- package/dist/{shared-CxWmcyqB.js → shared-DHjhfRdV.js} +2 -15
- package/dist/shared-DTneRoxi.js +14 -0
- package/dist/{sign-in-Cb1mwv6X.js → sign-in-D_yoP0PF.js} +1 -1
- package/dist/signatures-BRS_p3WD.d.ts +34 -0
- package/dist/signatures-DsWv_bYR.js +103 -0
- package/dist/{signers-4y62_VIi.d.ts → signers-cpdmZYrv.d.ts} +1 -1
- package/dist/solid/index.d.ts +9 -18
- package/dist/solid/index.js +2 -2
- package/dist/solid-start/index.d.ts +6 -6
- package/dist/solid-start/index.js +7 -7
- package/dist/spec/index.d.ts +134 -0
- package/dist/spec/index.js +353 -0
- package/dist/{spec-pins-C89s6DyW.d.ts → spec-pins-CwzDY25w.d.ts} +18 -1
- package/dist/{spec-pins--j6mTok4.js → spec-pins-DsLfUH7l.js} +14 -1
- package/dist/sql/index.d.ts +145 -119
- package/dist/sql/index.js +19921 -19798
- package/dist/{executor-De1Of3m3.js → sql-CwuqaQ4Y.js} +34 -169
- package/dist/ssr/index.d.ts +4 -4
- package/dist/ssr/index.js +3 -2
- package/dist/{standard-BK0cqJ7y.js → standard-DkzZUneg.js} +2 -2
- package/dist/{standard-CYsm7xpT.d.ts → standard-lmkbOtPB.d.ts} +1 -1
- package/dist/{stats-D_AD9GGu.js → stats-DhU78Ctf.js} +8 -4
- package/dist/storage/index.d.ts +4 -6
- package/dist/storage/index.js +16 -17
- package/dist/{bucket-Cl46E3jS.d.ts → storage-api-CB7Zl1Ci.d.ts} +243 -8
- package/dist/{store-CGjgWu5n.d.ts → store-DsIYEBnv.d.ts} +1 -1
- package/dist/streams/index.d.ts +4 -4
- package/dist/streams/index.js +5 -4
- package/dist/streams/redis/index.d.ts +1 -1
- package/dist/streams/redis/index.js +5 -11
- package/dist/{stripe-BMj5LtsT.js → stripe-v-Y2lmop.js} +2 -8
- package/dist/supabase-mcp-C6tMoEjn.d.ts +43 -0
- package/dist/supabase-mcp-Cpn5A4i-.js +28 -0
- package/dist/{support-ig_K4PvS.js → support-D1pFFouF.js} +71 -35
- package/dist/{support-view-CVOJJLpc.d.ts → support-view-scqMgtOo.d.ts} +1 -1
- package/dist/svelte/index.d.ts +8 -17
- package/dist/svelte/index.js +2 -2
- package/dist/sveltekit/index.d.ts +7 -7
- package/dist/sveltekit/index.js +10 -12
- package/dist/table-schema-htM_SbCW.js +286 -0
- package/dist/{tags-Cx-LnIQP.d.ts → tags-BO9LjtWG.d.ts} +1 -1
- package/dist/tanstack-db/index.d.ts +2 -2
- package/dist/tanstack-db/supabase/index.d.ts +52 -0
- package/dist/tanstack-db/supabase/index.js +97 -0
- package/dist/tanstack-start/index.d.ts +6 -6
- package/dist/tanstack-start/index.js +8 -12
- package/dist/{tee-CoEppCER.js → tee-Cb98Vn3b.js} +1 -1
- package/dist/{template--jDkl3UP.js → template-lPVh-EwW.js} +11 -2
- package/dist/{temporal-required-BVvW7SYJ.js → temporal-required-BtynQtM-.js} +1 -1
- package/dist/{tenant-BxNFk9bx.d.ts → tenant-CM368LXb.d.ts} +2 -2
- package/dist/testing/index.d.ts +249 -118
- package/dist/testing/index.js +1418 -870
- package/dist/ttl-cache-XzZ-Q2eX.js +29 -0
- package/dist/types-BRTSpOIh.js +5 -0
- package/dist/{types-C05bxW-W.d.ts → types-Bb_4-vdW.d.ts} +4 -4
- package/dist/{types-AYOvcyep.d.ts → types-CD6yCDx3.d.ts} +5 -5
- package/dist/{types-6rocye-y.d.ts → types-CbOUc5IH.d.ts} +4 -4
- package/dist/{types-6BdhkmZe.d.ts → types-CoE5Zwy4.d.ts} +8 -0
- package/dist/{types-DGs5L0VN.d.ts → types-DSJ3-m9X.d.ts} +4 -4
- package/dist/{queue-CLJurhdy.d.ts → types-D__3EN0q.d.ts} +17 -19
- package/dist/{usage-CrvrL2vw.d.ts → usage-D0NNUFfr.d.ts} +3 -3
- package/dist/{vault-wlbBhqm7.d.ts → vault-BpmApxxW.d.ts} +3 -3
- package/dist/vercel-connect/index.d.ts +1 -1
- package/dist/vercel-connect/index.js +5 -11
- package/dist/{verify-DPuWngD4.d.ts → verify-C91Wyp40.d.ts} +5 -35
- package/dist/verify-CJbYfADA.js +124 -0
- package/dist/{version-C6OfRAIn.js → version-Cq8gfDbd.js} +1 -1
- package/dist/{view-BeFcRV6G.js → view-D5ryq3gz.js} +1 -1
- package/dist/{view-CF7ihnkg.d.ts → view-TpXEUcVN.d.ts} +3 -3
- package/dist/vue/index.d.ts +9 -18
- package/dist/vue/index.js +2 -2
- package/dist/{watch-Xuxrvxq-.js → watch-BcvtAHOd.js} +2 -2
- package/dist/{watch-DI34G86j.d.ts → watch-COzRWvVN.d.ts} +23 -9
- package/dist/{wire-DtZQ4sdE.js → wire-Df3EWkG8.js} +2 -2
- package/dist/{workflow-builder-DJ1oHn8g.js → workflow-builder-CHqHpAVt.js} +6 -5
- package/dist/workflow-sdk/builder/index.d.ts +3 -3
- package/dist/workflow-sdk/index.d.ts +1 -1
- package/dist/workflow-sdk/world/index.d.ts +23 -17
- package/dist/workflow-sdk/world/index.js +59 -76
- package/dist/{workflow-sdk-B3yLD6Br.d.ts → workflow-sdk-DTZyrvNo.d.ts} +3 -3
- package/dist/{workflow-sdk-world-D-prir6O.js → workflow-sdk-world-CMV1ahFW.js} +528 -526
- package/dist/{workflows-B0j9WKPu.d.ts → workflows-CcpCBfIe.d.ts} +3 -3
- package/dist/{workflows-wu1WWBn7.js → workflows-IvxzG2cl.js} +5 -4
- package/package.json +54 -3
- package/schemas/config-v1.json +243 -0
- package/schemas/doctor-report-v1.json +4 -1
- package/schemas/spec-manifest-v1.json +95 -0
- package/skills/better-supabase/SKILL.md +8 -4
- package/skills/better-supabase/references/troubleshooting.md +20 -20
- package/skills/better-supabase-api/references/expo.md +6 -3
- package/skills/better-supabase-api/references/powersync.md +2 -1
- package/dist/cli/config-B9HkL8nF.js +0 -2
- package/dist/cli/gen-CCMc39Dx.js +0 -3100
- package/dist/cli/gen-DRmzPI75.js +0 -2
- package/dist/cli/prompts-BTYQGunc.js +0 -2
- package/dist/cli/run-BqDPh9UH.js +0 -361
- package/dist/config-Dn7F5k9A.js +0 -202
- package/dist/history-BZih6SFP.js +0 -64
- package/dist/index-BkWT_uBO.d.ts +0 -51
- package/dist/index-Bxih3l0u.d.ts +0 -81
- package/dist/index-CaxrMD1A.d.ts +0 -1
- package/dist/index-DQh4VCc9.d.ts +0 -98
- package/dist/keys-4MnkWTTh.js +0 -35
- package/dist/messages-DYP0sUTe.d.ts +0 -59
- package/dist/modules-dxrVK3ID.js +0 -228
- package/dist/path-Cv__-OTj.d.ts +0 -17
- package/dist/resource-BsvzCMlX.js +0 -212
- package/dist/resource-IPS5xi9q.d.ts +0 -74
- package/dist/template-CwO38Do8.d.ts +0 -6
- package/dist/verify-DL41hbvY.js +0 -232
- package/dist/cli/{read-sets-CETOSFx4.js → read-sets-DjJrm8Wj.js} +1 -1
|
@@ -1,16 +1,18 @@
|
|
|
1
|
-
import { c as mapDbError, n as dbError, o as isDbError, r as dbErrorOf } from "./errors-
|
|
2
|
-
import { t as temporal } from "./temporal-required-
|
|
3
|
-
import { a as ok, r as err, t as AsyncResult } from "./result-
|
|
4
|
-
import {
|
|
5
|
-
import { a as
|
|
1
|
+
import { c as mapDbError, n as dbError, o as isDbError, r as dbErrorOf } from "./errors-2M6CKMP4.js";
|
|
2
|
+
import { t as temporal } from "./temporal-required-BtynQtM-.js";
|
|
3
|
+
import { a as ok, r as err, s as toDbError, t as AsyncResult } from "./result-DEqHCMKP.js";
|
|
4
|
+
import { n as isRecord } from "./guards-6F2bCtQR.js";
|
|
5
|
+
import { a as postgrestExecutor, n as StatsRecorder } from "./stats-DhU78Ctf.js";
|
|
6
|
+
import { o as problemResponse } from "./problem-CJvFeGu7.js";
|
|
6
7
|
import { loadEnv } from "./env/index.js";
|
|
7
8
|
import { a as actorOf, i as userContext, n as impersonatorClaim, t as actClaim } from "./impersonation-DcqaTBHx.js";
|
|
8
|
-
import { t as fromPgError } from "./executor-
|
|
9
|
-
import {
|
|
9
|
+
import { t as fromPgError } from "./executor-B_Hfobee.js";
|
|
10
|
+
import { i as forwardBlockEvents, t as DEFAULT_TYPE_PREFIX } from "./cloud-event-CTh9Sr5w.js";
|
|
10
11
|
import { a as replicaState, i as primaryCookieWrite, o as routedExecutor, r as pinnedUntil, s as withPrimaryPin } from "./replicas-CwrYp5Zj.js";
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
12
|
+
import { t as authContext } from "./context-nPDvQ-Zl.js";
|
|
13
|
+
import { d as parseCookies, m as sessionCookieName, n as prefetchJwks, p as serializeCookie, r as resolveAuth, s as AUTH_CACHE_HEADERS, u as clearSessionAtScopes } from "./resolve-Bvgf3ut_.js";
|
|
14
|
+
import { t as credentialProviderOf } from "./provider-DxRTex4x.js";
|
|
15
|
+
import { a as respond, n as defaultPrefetchJwks, r as guard, t as defaultExpose } from "./respond-volM3ByS.js";
|
|
14
16
|
import { createClient } from "@supabase/supabase-js";
|
|
15
17
|
import { defineMiddleware, getEnv, pipeline, seedContext } from "@supabase/middleware";
|
|
16
18
|
import { PostgrestClient } from "@supabase/postgrest-js";
|
|
@@ -251,7 +253,7 @@ function serverAudit(betterSupabase, sink) {
|
|
|
251
253
|
specversion: "1.0",
|
|
252
254
|
id: crypto.randomUUID(),
|
|
253
255
|
source: SERVER_EVENT_SOURCE,
|
|
254
|
-
type:
|
|
256
|
+
type: `${DEFAULT_TYPE_PREFIX}.${type}`,
|
|
255
257
|
subject: `users/${userId}`,
|
|
256
258
|
time: (/* @__PURE__ */ new Date()).toISOString(),
|
|
257
259
|
datacontenttype: "application/json",
|
|
@@ -268,6 +270,149 @@ function serverAudit(betterSupabase, sink) {
|
|
|
268
270
|
} };
|
|
269
271
|
}
|
|
270
272
|
//#endregion
|
|
273
|
+
//#region src/server/clients.ts
|
|
274
|
+
const STATELESS = {
|
|
275
|
+
persistSession: false,
|
|
276
|
+
autoRefreshToken: false,
|
|
277
|
+
detectSessionInUrl: false
|
|
278
|
+
};
|
|
279
|
+
/** The Supabase and PostgREST clients of one server: shared service and anon clients, per-request user clients. */
|
|
280
|
+
function createClients(input) {
|
|
281
|
+
const { options, env, definitionExecutor, lite, createClient } = input;
|
|
282
|
+
let adminClient;
|
|
283
|
+
let anonClient;
|
|
284
|
+
const secretKey = () => {
|
|
285
|
+
const key = env().secretKey;
|
|
286
|
+
if (!key) throw new TypeError("admin() needs SUPABASE_SECRET_KEY; it is not set");
|
|
287
|
+
return key;
|
|
288
|
+
};
|
|
289
|
+
const customFetch = options.fetch ? { fetch: options.fetch } : void 0;
|
|
290
|
+
const urlLengthLimit = options.db?.urlLengthLimit ?? definitionExecutor.urlLengthLimit;
|
|
291
|
+
const db = {
|
|
292
|
+
...options.db?.timeout === void 0 ? {} : { timeout: options.db.timeout },
|
|
293
|
+
...options.db?.retry === void 0 ? {} : { retry: options.db.retry },
|
|
294
|
+
...urlLengthLimit === void 0 ? {} : { urlLengthLimit }
|
|
295
|
+
};
|
|
296
|
+
const dbOptions = Object.keys(db).length > 0 ? { db } : {};
|
|
297
|
+
const sharedGlobal = {
|
|
298
|
+
...customFetch ? { global: customFetch } : {},
|
|
299
|
+
...dbOptions
|
|
300
|
+
};
|
|
301
|
+
/** postgrest-js options a bare `PostgrestClient` takes; `timeout` is the executor's. */
|
|
302
|
+
const restOptions = {
|
|
303
|
+
...db.retry === void 0 ? {} : { retry: db.retry },
|
|
304
|
+
...urlLengthLimit === void 0 ? {} : { urlLengthLimit }
|
|
305
|
+
};
|
|
306
|
+
const rpcUnavailable = lite?.rpcUnavailable;
|
|
307
|
+
const executorOptions = {
|
|
308
|
+
...definitionExecutor,
|
|
309
|
+
...urlLengthLimit === void 0 ? {} : { urlLengthLimit },
|
|
310
|
+
...db.timeout === void 0 ? {} : { timeout: db.timeout },
|
|
311
|
+
...db.retry === void 0 ? {} : { retry: db.retry },
|
|
312
|
+
...rpcUnavailable === void 0 ? {} : { rpcUnavailable }
|
|
313
|
+
};
|
|
314
|
+
/** Set when `db` options or the backend need an executor built with them. */
|
|
315
|
+
const tunedExecutor = options.db !== void 0 || rpcUnavailable !== void 0;
|
|
316
|
+
const serviceClient = () => {
|
|
317
|
+
adminClient ??= createClient(env().url, secretKey(), {
|
|
318
|
+
auth: STATELESS,
|
|
319
|
+
...sharedGlobal
|
|
320
|
+
});
|
|
321
|
+
return adminClient;
|
|
322
|
+
};
|
|
323
|
+
const readUrl = () => options.readUrl === false ? void 0 : options.readUrl?.replace(/\/+$/, "") ?? env().readUrl;
|
|
324
|
+
const apiKeyClient = () => {
|
|
325
|
+
throw new TypeError("ctx.supabase and ctx.db.$client are not available for an API key: ctx.db and ctx.sql run over direct Postgres with the key's claims");
|
|
326
|
+
};
|
|
327
|
+
/** Clients for the primary share the service and anon clients; others don't. */
|
|
328
|
+
const supabaseAt = (url, auth, headers = {}) => {
|
|
329
|
+
const custom = Object.keys(headers).length > 0;
|
|
330
|
+
const global = custom ? {
|
|
331
|
+
global: {
|
|
332
|
+
headers,
|
|
333
|
+
...customFetch
|
|
334
|
+
},
|
|
335
|
+
...dbOptions
|
|
336
|
+
} : sharedGlobal;
|
|
337
|
+
const shared = !custom && url === env().url;
|
|
338
|
+
switch (auth.kind) {
|
|
339
|
+
case "user": return createClient(url, env().publishableKey, {
|
|
340
|
+
accessToken: () => Promise.resolve(auth.token),
|
|
341
|
+
...global
|
|
342
|
+
});
|
|
343
|
+
case "service": return shared ? serviceClient() : createClient(url, secretKey(), {
|
|
344
|
+
auth: STATELESS,
|
|
345
|
+
...global
|
|
346
|
+
});
|
|
347
|
+
case "anon":
|
|
348
|
+
case "invalid":
|
|
349
|
+
if (!shared) return createClient(url, env().publishableKey, {
|
|
350
|
+
auth: STATELESS,
|
|
351
|
+
...global
|
|
352
|
+
});
|
|
353
|
+
anonClient ??= createClient(url, env().publishableKey, {
|
|
354
|
+
auth: STATELESS,
|
|
355
|
+
...sharedGlobal
|
|
356
|
+
});
|
|
357
|
+
return anonClient;
|
|
358
|
+
case "apiKey": return apiKeyClient();
|
|
359
|
+
default: return auth;
|
|
360
|
+
}
|
|
361
|
+
};
|
|
362
|
+
const supabaseFor = (auth, headers = {}) => supabaseAt(env().url, auth, headers);
|
|
363
|
+
const restUrls = /* @__PURE__ */ new Map();
|
|
364
|
+
const restUrl = (url) => {
|
|
365
|
+
let rest = restUrls.get(url);
|
|
366
|
+
if (rest === void 0) {
|
|
367
|
+
rest = new URL("rest/v1", url.endsWith("/") ? url : `${url}/`).href;
|
|
368
|
+
restUrls.set(url, rest);
|
|
369
|
+
}
|
|
370
|
+
return rest;
|
|
371
|
+
};
|
|
372
|
+
/**
|
|
373
|
+
* The client queries run on. Requests need only PostgREST, so they skip
|
|
374
|
+
* building Realtime, Storage and Auth clients per request; the shared
|
|
375
|
+
* service and anon clients for the primary are built once anyway.
|
|
376
|
+
*/
|
|
377
|
+
const restAt = (url, auth, headers = {}) => {
|
|
378
|
+
let key;
|
|
379
|
+
let bearer;
|
|
380
|
+
switch (auth.kind) {
|
|
381
|
+
case "user":
|
|
382
|
+
key = env().publishableKey;
|
|
383
|
+
bearer = auth.token;
|
|
384
|
+
break;
|
|
385
|
+
case "service":
|
|
386
|
+
case "anon":
|
|
387
|
+
case "invalid":
|
|
388
|
+
if (Object.keys(headers).length === 0 && url === env().url) return supabaseAt(url, auth, headers);
|
|
389
|
+
key = auth.kind === "service" ? secretKey() : env().publishableKey;
|
|
390
|
+
bearer = key;
|
|
391
|
+
break;
|
|
392
|
+
case "apiKey": return apiKeyClient();
|
|
393
|
+
default: return auth;
|
|
394
|
+
}
|
|
395
|
+
return new PostgrestClient(restUrl(url), {
|
|
396
|
+
headers: {
|
|
397
|
+
...headers,
|
|
398
|
+
apikey: key,
|
|
399
|
+
Authorization: `Bearer ${bearer}`
|
|
400
|
+
},
|
|
401
|
+
...customFetch,
|
|
402
|
+
...restOptions
|
|
403
|
+
});
|
|
404
|
+
};
|
|
405
|
+
return {
|
|
406
|
+
executorOptions,
|
|
407
|
+
tunedExecutor,
|
|
408
|
+
serviceClient,
|
|
409
|
+
readUrl,
|
|
410
|
+
apiKeyClient,
|
|
411
|
+
supabaseFor,
|
|
412
|
+
restAt
|
|
413
|
+
};
|
|
414
|
+
}
|
|
415
|
+
//#endregion
|
|
271
416
|
//#region src/server/entries/core.ts
|
|
272
417
|
const cores = /* @__PURE__ */ new WeakMap();
|
|
273
418
|
/** Records the core behind `server`, so `serverCore` finds it on copies too. */
|
|
@@ -456,6 +601,58 @@ function withTenant(core) {
|
|
|
456
601
|
})();
|
|
457
602
|
}
|
|
458
603
|
//#endregion
|
|
604
|
+
//#region src/server/lite.ts
|
|
605
|
+
/** Lite's default driver, the one `lite init` scaffolds. */
|
|
606
|
+
const DEFAULT_LITE_DRIVER = "sqlite-postgres";
|
|
607
|
+
/** Whether the driver stores data in SQLite, where Lite has no database functions. */
|
|
608
|
+
function isSqliteDriver(driver) {
|
|
609
|
+
switch (driver) {
|
|
610
|
+
case "sqlite-postgres":
|
|
611
|
+
case "sqlite": return true;
|
|
612
|
+
case "pglite":
|
|
613
|
+
case "postgres": return false;
|
|
614
|
+
default: return driver;
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
function liteRpcUnavailable(driver) {
|
|
618
|
+
return `rpc() is not available on Supabase Lite with the ${driver} driver. Set [db] driver = "pglite" or "postgres" in supabase/config.toml, or call an HTTP endpoint instead.`;
|
|
619
|
+
}
|
|
620
|
+
/** What `backend: "lite"` changes in `createServer`; `undefined` for Supabase. */
|
|
621
|
+
function liteBackend(options, env) {
|
|
622
|
+
if (options.backend !== "lite") return void 0;
|
|
623
|
+
const driver = options.liteDriver ?? DEFAULT_LITE_DRIVER;
|
|
624
|
+
if (options.postgres && driver !== "postgres") throw new TypeError(`Supabase Lite with the ${driver} driver has no Postgres connection for ctx.sql. Remove the postgres option, or run Lite with [db] driver = "postgres".`);
|
|
625
|
+
return {
|
|
626
|
+
auth() {
|
|
627
|
+
if (options.auth?.jwtSecret !== void 0) return options.auth;
|
|
628
|
+
const jwtSecret = env().jwtSecret;
|
|
629
|
+
if (jwtSecret === void 0) throw new TypeError("backend: \"lite\" needs SUPABASE_JWT_SECRET, the auth.jwt_secret Supabase Lite signs user tokens with");
|
|
630
|
+
return {
|
|
631
|
+
...options.auth,
|
|
632
|
+
jwtSecret
|
|
633
|
+
};
|
|
634
|
+
},
|
|
635
|
+
rpcUnavailable: isSqliteDriver(driver) ? liteRpcUnavailable(driver) : void 0
|
|
636
|
+
};
|
|
637
|
+
}
|
|
638
|
+
//#endregion
|
|
639
|
+
//#region src/server/refusing-executor.ts
|
|
640
|
+
/**
|
|
641
|
+
* An executor for credentials that did not verify: every query, function
|
|
642
|
+
* call and batch answers `error`, so a handler that skips the route guard
|
|
643
|
+
* gets a 401 `Result` and never queries as anon.
|
|
644
|
+
*/
|
|
645
|
+
function refusingExecutor(error) {
|
|
646
|
+
const refuse = () => err(error);
|
|
647
|
+
return {
|
|
648
|
+
name: "refused",
|
|
649
|
+
functionSources: true,
|
|
650
|
+
execute: () => Promise.resolve(refuse()),
|
|
651
|
+
rpc: () => Promise.resolve(refuse()),
|
|
652
|
+
batch: (ops) => Promise.resolve(ops.map(() => refuse()))
|
|
653
|
+
};
|
|
654
|
+
}
|
|
655
|
+
//#endregion
|
|
459
656
|
//#region src/server/request-ids.ts
|
|
460
657
|
const REQUEST_ID_PATTERN = /^[A-Za-z0-9._:;,@/+=-]{1,128}$/;
|
|
461
658
|
function requestIdOrUndefined(value) {
|
|
@@ -507,6 +704,10 @@ function requestIdPolicy(options = {}) {
|
|
|
507
704
|
};
|
|
508
705
|
}
|
|
509
706
|
//#endregion
|
|
707
|
+
//#region src/server/server-types.ts
|
|
708
|
+
/** The header `current_tenant_id()` reads over the Data API. */
|
|
709
|
+
const TENANT_HEADER = "x-bs-tenant";
|
|
710
|
+
//#endregion
|
|
510
711
|
//#region src/auth/support-cookie.ts
|
|
511
712
|
/** The cookie that carries the support session id. */
|
|
512
713
|
const SUPPORT_COOKIE = "bs-support";
|
|
@@ -558,21 +759,415 @@ const supportOff = {
|
|
|
558
759
|
revoke: notConfigured,
|
|
559
760
|
current: () => Promise.resolve(void 0),
|
|
560
761
|
list: notConfigured,
|
|
762
|
+
expire: notConfigured,
|
|
763
|
+
expireRoute: () => () => Promise.resolve(problemResponse(dbError("unexpected", NOT_CONFIGURED))),
|
|
561
764
|
sessionIdOf: () => void 0,
|
|
562
765
|
clearCookie: () => clearSupportCookie()
|
|
563
766
|
};
|
|
564
767
|
//#endregion
|
|
768
|
+
//#region src/server/support-storage.ts
|
|
769
|
+
const VISIBLE_OBJECT = "select exists (select 1 from storage.objects o where o.bucket_id = $1 and o.name = $2) as visible";
|
|
770
|
+
const VISIBLE_OBJECTS = `select n.path from unnest($2::text[]) as n(path)
|
|
771
|
+
where exists (select 1 from storage.objects o where o.bucket_id = $1 and o.name = n.path)`;
|
|
772
|
+
const OBJECT_INFO = "select to_jsonb(o) as object from storage.objects o where o.bucket_id = $1 and o.name = $2";
|
|
773
|
+
const SEARCH = `select s.name, s.id::text as id, s.updated_at, s.created_at, s.last_accessed_at, s.metadata
|
|
774
|
+
from storage.search($1::text, $2::text, $3::int, $4::int, $5::int, $6::text, $7::text, $8::text) s`;
|
|
775
|
+
const SEARCH_V2 = `select s.key, s.name, s.id::text as id, s.updated_at, s.created_at, s.last_accessed_at, s.metadata
|
|
776
|
+
from storage.search_v2($1::text, $2::text, $3::int, $4::int, $5::text, $6::text, $7::text, $8::text) s`;
|
|
777
|
+
const HIDDEN_URL = "Either the object does not exist or you do not have access to it";
|
|
778
|
+
const LIST_SORT_COLUMNS = /* @__PURE__ */ new Set([
|
|
779
|
+
"name",
|
|
780
|
+
"updated_at",
|
|
781
|
+
"created_at",
|
|
782
|
+
"last_accessed_at"
|
|
783
|
+
]);
|
|
784
|
+
const LIST_V2_SORT_COLUMNS = /* @__PURE__ */ new Set([
|
|
785
|
+
"name",
|
|
786
|
+
"updated_at",
|
|
787
|
+
"created_at"
|
|
788
|
+
]);
|
|
789
|
+
const FLAT_SORT_COLUMNS = /* @__PURE__ */ new Set(["updated_at", "created_at"]);
|
|
790
|
+
const SORT_ORDERS = /* @__PURE__ */ new Set(["asc", "desc"]);
|
|
791
|
+
const CURSOR_PARTS = {
|
|
792
|
+
l: "startAfter",
|
|
793
|
+
o: "sortOrder",
|
|
794
|
+
c: "sortColumn",
|
|
795
|
+
a: "sortColumnAfter"
|
|
796
|
+
};
|
|
797
|
+
const isCursorKey = (key) => Object.hasOwn(CURSOR_PARTS, key);
|
|
798
|
+
/** The path storage-js sends for an upload: no leading or trailing `/`, and no empty folders. */
|
|
799
|
+
function normalizePath(path) {
|
|
800
|
+
return path.replaceAll(/^\/|\/$/g, "").replaceAll(/\/+/g, "/");
|
|
801
|
+
}
|
|
802
|
+
/** `undefined` for an empty string, which storage-api treats as absent. */
|
|
803
|
+
const filled = (value) => value === "" ? void 0 : value;
|
|
804
|
+
/** `LIKE` escaping as storage-api applies it. */
|
|
805
|
+
function escapeLike(text) {
|
|
806
|
+
return text.replaceAll("\\", "\\\\").replaceAll(/([%_])/g, "\\$1");
|
|
807
|
+
}
|
|
808
|
+
function iso(value) {
|
|
809
|
+
if (value instanceof Date) return value.toISOString();
|
|
810
|
+
if (typeof value !== "string") return value;
|
|
811
|
+
const time = Date.parse(value);
|
|
812
|
+
return Number.isNaN(time) ? value : new Date(time).toISOString();
|
|
813
|
+
}
|
|
814
|
+
/** storage-api's continuation token: `key:value` lines, base64 encoded. */
|
|
815
|
+
function encodeCursor(cursor) {
|
|
816
|
+
const text = Object.entries(CURSOR_PARTS).flatMap(([key, part]) => cursor[part] ? [`${key}:${cursor[part]}`] : []).join("\n");
|
|
817
|
+
let binary = "";
|
|
818
|
+
for (const byte of new TextEncoder().encode(text)) binary += String.fromCodePoint(byte);
|
|
819
|
+
return btoa(binary);
|
|
820
|
+
}
|
|
821
|
+
function decodeCursor(token) {
|
|
822
|
+
let text;
|
|
823
|
+
try {
|
|
824
|
+
text = new TextDecoder().decode(Uint8Array.from(atob(token), (char) => char.codePointAt(0) ?? 0));
|
|
825
|
+
} catch {
|
|
826
|
+
return;
|
|
827
|
+
}
|
|
828
|
+
const cursor = {
|
|
829
|
+
startAfter: "",
|
|
830
|
+
sortOrder: "asc"
|
|
831
|
+
};
|
|
832
|
+
for (const part of text.split("\n")) {
|
|
833
|
+
const match = /^(\S):(.*)/.exec(part);
|
|
834
|
+
const key = match?.[1];
|
|
835
|
+
if (!key || !isCursorKey(key)) return void 0;
|
|
836
|
+
cursor[CURSOR_PARTS[key]] = match[2] ?? "";
|
|
837
|
+
}
|
|
838
|
+
return cursor;
|
|
839
|
+
}
|
|
840
|
+
const apiError = (status, message, code) => ({
|
|
841
|
+
name: "StorageApiError",
|
|
842
|
+
message,
|
|
843
|
+
status,
|
|
844
|
+
statusCode: String(status),
|
|
845
|
+
code
|
|
846
|
+
});
|
|
847
|
+
const failed = (error) => ({
|
|
848
|
+
data: null,
|
|
849
|
+
error
|
|
850
|
+
});
|
|
851
|
+
/** Storage answers a hidden object like a missing one: HTTP 400 with `statusCode` 404. */
|
|
852
|
+
const NOT_FOUND = {
|
|
853
|
+
name: "StorageApiError",
|
|
854
|
+
message: "Object not found",
|
|
855
|
+
status: 400,
|
|
856
|
+
statusCode: "404",
|
|
857
|
+
code: "NoSuchKey"
|
|
858
|
+
};
|
|
859
|
+
const invalid = (message) => apiError(400, message, "InvalidRequest");
|
|
860
|
+
/** A database failure as a Storage `error` that `fromStorageError` passes through unchanged. */
|
|
861
|
+
function sqlFailure(cause) {
|
|
862
|
+
const raw = fromPgError(cause);
|
|
863
|
+
return {
|
|
864
|
+
name: "DbError",
|
|
865
|
+
...raw ? mapDbError(raw) : toDbError(cause)
|
|
866
|
+
};
|
|
867
|
+
}
|
|
868
|
+
async function settled(run) {
|
|
869
|
+
try {
|
|
870
|
+
return await run();
|
|
871
|
+
} catch (cause) {
|
|
872
|
+
return failed(sqlFailure(cause));
|
|
873
|
+
}
|
|
874
|
+
}
|
|
875
|
+
function listProblem(options) {
|
|
876
|
+
const { limit, offset, sortBy } = options;
|
|
877
|
+
if (limit !== void 0 && (!Number.isInteger(limit) || limit < 1)) return "body/limit must be an integer of at least 1";
|
|
878
|
+
if (offset !== void 0 && (!Number.isInteger(offset) || offset < 0)) return "body/offset must be an integer of at least 0";
|
|
879
|
+
if (sortBy?.column !== void 0 && !LIST_SORT_COLUMNS.has(sortBy.column)) return "body/sortBy/column must be name, updated_at, created_at or last_accessed_at";
|
|
880
|
+
if (sortBy?.order !== void 0 && !SORT_ORDERS.has(sortBy.order)) return "body/sortBy/order must be asc or desc";
|
|
881
|
+
}
|
|
882
|
+
function listV2Problem(options) {
|
|
883
|
+
const { limit, sortBy } = options;
|
|
884
|
+
if (limit !== void 0 && (!Number.isInteger(limit) || limit < 1)) return "body/limit must be an integer of at least 1";
|
|
885
|
+
if (sortBy !== void 0 && !LIST_V2_SORT_COLUMNS.has(sortBy.column)) return "body/sortBy/column must be name, updated_at or created_at";
|
|
886
|
+
if (sortBy?.order !== void 0 && !SORT_ORDERS.has(sortBy.order)) return "body/sortBy/order must be asc or desc";
|
|
887
|
+
}
|
|
888
|
+
/** The query storage-api runs for a `list-v2` page without a delimiter. */
|
|
889
|
+
function flatPage(bucket, prefix, maxKeys, cursor, column, order) {
|
|
890
|
+
const values = [bucket, maxKeys];
|
|
891
|
+
const conditions = ["bucket_id = $1"];
|
|
892
|
+
const sortColumn = column && FLAT_SORT_COLUMNS.has(column) ? column : void 0;
|
|
893
|
+
const sortOrder = order && SORT_ORDERS.has(order) ? order : "asc";
|
|
894
|
+
const operator = sortOrder === "asc" ? ">" : "<";
|
|
895
|
+
const param = () => `$${String(values.length)}`;
|
|
896
|
+
if (prefix) {
|
|
897
|
+
values.push(`${escapeLike(prefix)}%`);
|
|
898
|
+
conditions.push(`name like ${param()}`);
|
|
899
|
+
}
|
|
900
|
+
const startAfter = cursor?.startAfter;
|
|
901
|
+
if (startAfter && sortColumn && cursor.sortColumnAfter) {
|
|
902
|
+
values.push(cursor.sortColumnAfter);
|
|
903
|
+
const afterParam = param();
|
|
904
|
+
values.push(startAfter);
|
|
905
|
+
conditions.push(`row(date_trunc('milliseconds', ${sortColumn}), name collate "C") ${operator} row(coalesce(nullif(${afterParam}, '')::timestamptz, 'epoch'::timestamptz), ${param()})`);
|
|
906
|
+
} else if (startAfter) {
|
|
907
|
+
values.push(startAfter);
|
|
908
|
+
conditions.push(`name collate "C" ${operator} ${param()}`);
|
|
909
|
+
}
|
|
910
|
+
return {
|
|
911
|
+
text: `select id::text as id, name, metadata, updated_at, created_at, last_accessed_at
|
|
912
|
+
from storage.objects
|
|
913
|
+
where ${conditions.join(" and ")}
|
|
914
|
+
order by ${sortColumn ? `${sortColumn} ${sortOrder}, ` : ""}name collate "C" ${sortOrder}
|
|
915
|
+
limit $2::int`,
|
|
916
|
+
values
|
|
917
|
+
};
|
|
918
|
+
}
|
|
919
|
+
/** Groups the entries below the next delimiter into folders, as storage-api does. */
|
|
920
|
+
function delimited(entries, prefix) {
|
|
921
|
+
const grouped = [];
|
|
922
|
+
let previous = "";
|
|
923
|
+
for (const entry of entries) {
|
|
924
|
+
const name = String(entry["name"]);
|
|
925
|
+
const index = name.replace(prefix, "").indexOf("/");
|
|
926
|
+
if (index < 0) {
|
|
927
|
+
grouped.push(entry);
|
|
928
|
+
continue;
|
|
929
|
+
}
|
|
930
|
+
const folder = name.slice(0, prefix.length + index + 1);
|
|
931
|
+
if (folder === previous) continue;
|
|
932
|
+
previous = folder;
|
|
933
|
+
grouped.push({
|
|
934
|
+
id: null,
|
|
935
|
+
name: folder
|
|
936
|
+
});
|
|
937
|
+
}
|
|
938
|
+
return grouped;
|
|
939
|
+
}
|
|
940
|
+
const text = (value) => typeof value === "string" ? value : void 0;
|
|
941
|
+
const metadataOf = (value) => isRecord(value) ? value : null;
|
|
942
|
+
function listEntryOf(row) {
|
|
943
|
+
return {
|
|
944
|
+
name: String(row["name"]),
|
|
945
|
+
id: text(row["id"]) ?? null,
|
|
946
|
+
updated_at: text(iso(row["updated_at"])) ?? null,
|
|
947
|
+
created_at: text(iso(row["created_at"])) ?? null,
|
|
948
|
+
last_accessed_at: text(iso(row["last_accessed_at"])) ?? null,
|
|
949
|
+
metadata: metadataOf(row["metadata"])
|
|
950
|
+
};
|
|
951
|
+
}
|
|
952
|
+
function folderOf(row) {
|
|
953
|
+
const name = String(row["name"]);
|
|
954
|
+
const key = text(row["key"]);
|
|
955
|
+
return {
|
|
956
|
+
name: name.endsWith("/") ? name : `${name}/`,
|
|
957
|
+
...key === void 0 ? {} : { key }
|
|
958
|
+
};
|
|
959
|
+
}
|
|
960
|
+
function objectOf(row) {
|
|
961
|
+
const key = text(row["key"]);
|
|
962
|
+
const lastAccessed = text(iso(row["last_accessed_at"]));
|
|
963
|
+
return {
|
|
964
|
+
name: String(row["name"]),
|
|
965
|
+
...key === void 0 ? {} : { key },
|
|
966
|
+
id: text(row["id"]) ?? "",
|
|
967
|
+
updated_at: text(iso(row["updated_at"])) ?? "",
|
|
968
|
+
created_at: text(iso(row["created_at"])) ?? "",
|
|
969
|
+
...lastAccessed === void 0 ? {} : { last_accessed_at: lastAccessed },
|
|
970
|
+
metadata: metadataOf(row["metadata"])
|
|
971
|
+
};
|
|
972
|
+
}
|
|
973
|
+
function infoOf(row) {
|
|
974
|
+
const metadata = isRecord(row["metadata"]) ? row["metadata"] : {};
|
|
975
|
+
const size = metadata["size"];
|
|
976
|
+
const contentType = text(metadata["mimetype"]);
|
|
977
|
+
const cacheControl = text(metadata["cacheControl"]);
|
|
978
|
+
const etag = text(metadata["eTag"]);
|
|
979
|
+
const lastModified = text(iso(row["updated_at"]));
|
|
980
|
+
const userMetadata = row["user_metadata"];
|
|
981
|
+
const archivedAt = row["archived_at"];
|
|
982
|
+
const deleteMarker = row["is_delete_marker"];
|
|
983
|
+
const versioned = row["is_versioned"];
|
|
984
|
+
return {
|
|
985
|
+
id: text(row["id"]) ?? "",
|
|
986
|
+
name: text(row["name"]) ?? "",
|
|
987
|
+
version: text(row["version"]) ?? "",
|
|
988
|
+
bucketId: text(row["bucket_id"]) ?? "",
|
|
989
|
+
createdAt: text(iso(row["created_at"])) ?? "",
|
|
990
|
+
...typeof size === "number" ? { size } : {},
|
|
991
|
+
...contentType === void 0 ? {} : { contentType },
|
|
992
|
+
...cacheControl === void 0 ? {} : { cacheControl },
|
|
993
|
+
...etag === void 0 ? {} : { etag },
|
|
994
|
+
...lastModified === void 0 ? {} : { lastModified },
|
|
995
|
+
...isRecord(userMetadata) ? { metadata: userMetadata } : {},
|
|
996
|
+
...archivedAt === void 0 ? {} : { archivedAt: text(iso(archivedAt)) ?? null },
|
|
997
|
+
...typeof deleteMarker === "boolean" ? { isDeleteMarker: deleteMarker } : {},
|
|
998
|
+
...typeof versioned === "boolean" ? { isVersioned: versioned } : {}
|
|
999
|
+
};
|
|
1000
|
+
}
|
|
1001
|
+
/**
|
|
1002
|
+
* Storage for a support session, with the same `from(bucket)` file API as
|
|
1003
|
+
* `supabase.storage`, so `bucket.connect()` and the blocks take it.
|
|
1004
|
+
*
|
|
1005
|
+
* Storage policies read `auth.uid()` from the request's token, and there is
|
|
1006
|
+
* no token for the target, so reads go through Postgres as the target.
|
|
1007
|
+
* `exists`, `info`, `list` and `listV2` run entirely there: the listings
|
|
1008
|
+
* call the invoker-rights `storage.search` functions storage-api calls, so
|
|
1009
|
+
* RLS filters each page as it would for the target's own request.
|
|
1010
|
+
* `download` and the signed URLs first check there that the target may see
|
|
1011
|
+
* the object, then the service client serves it. A hidden object answers
|
|
1012
|
+
* like a missing one. `getPublicUrl` is built without a check, as it is
|
|
1013
|
+
* built without a request.
|
|
1014
|
+
*
|
|
1015
|
+
* Writes resolve to a `403` error: `SUPPORT_READ_ONLY` in a read-only
|
|
1016
|
+
* session and `SUPPORT_STORAGE_WRITES` in a writable one. The service client
|
|
1017
|
+
* would store the object with no owner, and Storage never sees the session's
|
|
1018
|
+
* `act` claim, so the write could be neither attributed to the target nor
|
|
1019
|
+
* audited as the admin's.
|
|
1020
|
+
*/
|
|
1021
|
+
function supportStorage(options) {
|
|
1022
|
+
const refusal = options.readOnly ?? true ? apiError(403, "The support session is read-only", "SUPPORT_READ_ONLY") : apiError(403, "Storage writes are not available in a support session", "SUPPORT_STORAGE_WRITES");
|
|
1023
|
+
const refuse = () => Promise.resolve(failed(refusal));
|
|
1024
|
+
const rows = (query, values) => options.sql.queryRaw(query, values);
|
|
1025
|
+
return { from(bucket) {
|
|
1026
|
+
const admin = () => options.admin.from(bucket);
|
|
1027
|
+
const visible = async (path) => {
|
|
1028
|
+
const [row] = await rows(VISIBLE_OBJECT, [bucket, path]);
|
|
1029
|
+
return row?.["visible"] === true;
|
|
1030
|
+
};
|
|
1031
|
+
const checked = (path, read) => settled(async () => {
|
|
1032
|
+
const name = normalizePath(path);
|
|
1033
|
+
if (!await visible(name)) return failed(NOT_FOUND);
|
|
1034
|
+
return read(name);
|
|
1035
|
+
});
|
|
1036
|
+
const list = (path, listOptions = {}) => settled(async () => {
|
|
1037
|
+
const problem = listProblem(listOptions);
|
|
1038
|
+
if (problem) return failed(invalid(problem));
|
|
1039
|
+
let prefix = path ?? "";
|
|
1040
|
+
if (prefix.length > 0 && !prefix.endsWith("/")) prefix = `${prefix}/`;
|
|
1041
|
+
const column = listOptions.sortBy?.column ?? "name";
|
|
1042
|
+
const escape = column !== "name";
|
|
1043
|
+
const safePrefix = escape ? escapeLike(prefix) : prefix;
|
|
1044
|
+
const search = listOptions.search ?? "";
|
|
1045
|
+
const safeSearch = escape ? escapeLike(search) : search;
|
|
1046
|
+
return {
|
|
1047
|
+
data: (await rows(SEARCH, [
|
|
1048
|
+
safePrefix,
|
|
1049
|
+
bucket,
|
|
1050
|
+
listOptions.limit ?? 100,
|
|
1051
|
+
(safePrefix + safeSearch).split("/").length,
|
|
1052
|
+
listOptions.offset ?? 0,
|
|
1053
|
+
safeSearch,
|
|
1054
|
+
column,
|
|
1055
|
+
listOptions.sortBy?.order ?? "asc"
|
|
1056
|
+
])).map(listEntryOf),
|
|
1057
|
+
error: null
|
|
1058
|
+
};
|
|
1059
|
+
});
|
|
1060
|
+
const listV2 = (listOptions = {}) => settled(async () => {
|
|
1061
|
+
const problem = listV2Problem(listOptions);
|
|
1062
|
+
if (problem) return failed(invalid(problem));
|
|
1063
|
+
const limit = Math.min(listOptions.limit ?? 1e3, 1e3);
|
|
1064
|
+
const prefix = listOptions.prefix ?? "";
|
|
1065
|
+
const cursor = listOptions.cursor ? decodeCursor(listOptions.cursor) : void 0;
|
|
1066
|
+
if (listOptions.cursor && !cursor) return failed(apiError(400, "Invalid continuation token", "InvalidParameter"));
|
|
1067
|
+
const sortOrder = filled(cursor?.sortOrder) ?? listOptions.sortBy?.order;
|
|
1068
|
+
const sortColumn = filled(cursor?.sortColumn) ?? listOptions.sortBy?.column;
|
|
1069
|
+
let found;
|
|
1070
|
+
if (listOptions.with_delimiter) found = await rows(SEARCH_V2, [
|
|
1071
|
+
prefix,
|
|
1072
|
+
bucket,
|
|
1073
|
+
limit + 1,
|
|
1074
|
+
prefix ? prefix.split("/").length : 1,
|
|
1075
|
+
cursor?.startAfter ?? "",
|
|
1076
|
+
sortOrder ?? "asc",
|
|
1077
|
+
sortColumn ?? "name",
|
|
1078
|
+
filled(cursor?.sortColumnAfter) ?? null
|
|
1079
|
+
]);
|
|
1080
|
+
else {
|
|
1081
|
+
const page = flatPage(bucket, listOptions.prefix, limit + 1, cursor, sortColumn, sortOrder);
|
|
1082
|
+
found = await rows(page.text, page.values);
|
|
1083
|
+
}
|
|
1084
|
+
const entries = listOptions.with_delimiter ? delimited(found, prefix) : found;
|
|
1085
|
+
const hasNext = entries.length > limit;
|
|
1086
|
+
const count = hasNext ? limit : entries.length;
|
|
1087
|
+
const folders = [];
|
|
1088
|
+
const objects = [];
|
|
1089
|
+
for (const entry of entries.slice(0, count)) if (entry["id"] === null || entry["id"] === void 0) folders.push(folderOf(entry));
|
|
1090
|
+
else objects.push(objectOf(entry));
|
|
1091
|
+
const last = entries[count - 1];
|
|
1092
|
+
const after = last && sortColumn && sortColumn !== "name" ? iso(last[sortColumn]) : void 0;
|
|
1093
|
+
const nextCursor = hasNext && last ? encodeCursor({
|
|
1094
|
+
startAfter: String(last["name"]),
|
|
1095
|
+
...sortOrder ? { sortOrder } : {},
|
|
1096
|
+
...sortColumn ? { sortColumn } : {},
|
|
1097
|
+
...typeof after === "string" ? { sortColumnAfter: new Date(after).toISOString() } : {}
|
|
1098
|
+
}) : void 0;
|
|
1099
|
+
return {
|
|
1100
|
+
data: {
|
|
1101
|
+
hasNext,
|
|
1102
|
+
...nextCursor === void 0 ? {} : { nextCursor },
|
|
1103
|
+
folders,
|
|
1104
|
+
objects
|
|
1105
|
+
},
|
|
1106
|
+
error: null
|
|
1107
|
+
};
|
|
1108
|
+
});
|
|
1109
|
+
return {
|
|
1110
|
+
exists: (path) => settled(async () => ({
|
|
1111
|
+
data: await visible(normalizePath(path)),
|
|
1112
|
+
error: null
|
|
1113
|
+
})).then((reply) => reply.error === null ? reply : {
|
|
1114
|
+
data: false,
|
|
1115
|
+
error: reply.error
|
|
1116
|
+
}),
|
|
1117
|
+
info: (path, infoOptions) => settled(async () => {
|
|
1118
|
+
const versionId = infoOptions?.versionId;
|
|
1119
|
+
const name = normalizePath(path);
|
|
1120
|
+
const [row] = await rows(versionId === void 0 ? OBJECT_INFO : `${OBJECT_INFO} and o.version = $3`, versionId === void 0 ? [bucket, name] : [
|
|
1121
|
+
bucket,
|
|
1122
|
+
name,
|
|
1123
|
+
versionId
|
|
1124
|
+
]);
|
|
1125
|
+
const object = row?.["object"];
|
|
1126
|
+
return isRecord(object) ? {
|
|
1127
|
+
data: infoOf(object),
|
|
1128
|
+
error: null
|
|
1129
|
+
} : failed(NOT_FOUND);
|
|
1130
|
+
}),
|
|
1131
|
+
download: (path, downloadOptions, parameters) => checked(path, (name) => admin().download(name, downloadOptions, parameters)),
|
|
1132
|
+
createSignedUrl: (path, expiresIn, urlOptions) => checked(path, (name) => admin().createSignedUrl(name, expiresIn, urlOptions)),
|
|
1133
|
+
createSignedUrls: (paths, expiresIn, urlOptions) => settled(async () => {
|
|
1134
|
+
const names = paths.map(normalizePath);
|
|
1135
|
+
const seen = new Set((await rows(VISIBLE_OBJECTS, [bucket, names])).map((row) => String(row["path"])));
|
|
1136
|
+
const shown = [...new Set(names.filter((name) => seen.has(name)))];
|
|
1137
|
+
const signed = /* @__PURE__ */ new Map();
|
|
1138
|
+
if (shown.length > 0) {
|
|
1139
|
+
const reply = await admin().createSignedUrls(shown, expiresIn, urlOptions);
|
|
1140
|
+
if (reply.error) return failed(reply.error);
|
|
1141
|
+
for (const entry of reply.data) if (entry.path !== null) signed.set(entry.path, entry);
|
|
1142
|
+
}
|
|
1143
|
+
return {
|
|
1144
|
+
data: names.map((name) => signed.get(name) ?? {
|
|
1145
|
+
error: HIDDEN_URL,
|
|
1146
|
+
path: name,
|
|
1147
|
+
signedUrl: null
|
|
1148
|
+
}),
|
|
1149
|
+
error: null
|
|
1150
|
+
};
|
|
1151
|
+
}),
|
|
1152
|
+
getPublicUrl: (path, urlOptions) => admin().getPublicUrl(path, urlOptions),
|
|
1153
|
+
list,
|
|
1154
|
+
listV2,
|
|
1155
|
+
upload: refuse,
|
|
1156
|
+
update: refuse,
|
|
1157
|
+
createSignedUploadUrl: refuse,
|
|
1158
|
+
uploadToSignedUrl: refuse,
|
|
1159
|
+
remove: refuse,
|
|
1160
|
+
copy: refuse,
|
|
1161
|
+
move: refuse,
|
|
1162
|
+
purgeCache: refuse
|
|
1163
|
+
};
|
|
1164
|
+
} };
|
|
1165
|
+
}
|
|
1166
|
+
//#endregion
|
|
565
1167
|
//#region src/server/server.ts
|
|
566
|
-
/** The header `current_tenant_id()` reads over the Data API. */
|
|
567
|
-
const TENANT_HEADER = "x-bs-tenant";
|
|
568
1168
|
/** The environment as `getEnv` resolves it, one variable at a time. */
|
|
569
1169
|
const RUNTIME_ENV = new Proxy({}, { get: (_target, key) => typeof key === "string" ? getEnv(key) : void 0 });
|
|
570
1170
|
const needsPostgres = (method) => dbError("invalid_request", `${method} needs createServer(betterSupabase, { postgres: createPostgres() })`);
|
|
571
|
-
const STATELESS = {
|
|
572
|
-
persistSession: false,
|
|
573
|
-
autoRefreshToken: false,
|
|
574
|
-
detectSessionInUrl: false
|
|
575
|
-
};
|
|
576
1171
|
/**
|
|
577
1172
|
* A framework adapter's server: `server` plus the adapter's own methods,
|
|
578
1173
|
* without reading the lazy `env` getter. `extra` can't replace a
|
|
@@ -586,13 +1181,6 @@ function extendServer(server, extra) {
|
|
|
586
1181
|
shareCore(server, extended);
|
|
587
1182
|
return extended;
|
|
588
1183
|
}
|
|
589
|
-
/** `{ ...base, ...extra }` that keeps lazy getters lazy. */
|
|
590
|
-
function withExtra(base, extra) {
|
|
591
|
-
return Object.defineProperties({}, {
|
|
592
|
-
...Object.getOwnPropertyDescriptors(base),
|
|
593
|
-
...Object.getOwnPropertyDescriptors(extra)
|
|
594
|
-
});
|
|
595
|
-
}
|
|
596
1184
|
/**
|
|
597
1185
|
* Server-side entry point for APIs, jobs, MCP servers and framework
|
|
598
1186
|
* adapters. Holds the secrets; `betterSupabase` stays isomorphic.
|
|
@@ -601,134 +1189,20 @@ function createServer(betterSupabase, options = {}) {
|
|
|
601
1189
|
const credentials = options.credentials === void 0 ? {} : { credentials: credentialProviderOf(options.credentials) };
|
|
602
1190
|
let loaded;
|
|
603
1191
|
const env = () => loaded ??= options.env ?? loadEnv(RUNTIME_ENV);
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
if ((options.prefetchJwks ?? defaultPrefetchJwks()) && options.auth?.jwks === void 0) try {
|
|
1192
|
+
const lite = liteBackend(options, env);
|
|
1193
|
+
if (lite === void 0 && (options.prefetchJwks ?? defaultPrefetchJwks()) && options.auth?.jwks === void 0) try {
|
|
607
1194
|
prefetchJwks({
|
|
608
1195
|
...options.auth,
|
|
609
1196
|
env: env()
|
|
610
1197
|
});
|
|
611
1198
|
} catch {}
|
|
612
|
-
const
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
const urlLengthLimit = options.db?.urlLengthLimit ?? definitionExecutor.urlLengthLimit;
|
|
620
|
-
const db = {
|
|
621
|
-
...options.db?.timeout === void 0 ? {} : { timeout: options.db.timeout },
|
|
622
|
-
...options.db?.retry === void 0 ? {} : { retry: options.db.retry },
|
|
623
|
-
...urlLengthLimit === void 0 ? {} : { urlLengthLimit }
|
|
624
|
-
};
|
|
625
|
-
const dbOptions = Object.keys(db).length > 0 ? { db } : {};
|
|
626
|
-
const sharedGlobal = {
|
|
627
|
-
...customFetch ? { global: customFetch } : {},
|
|
628
|
-
...dbOptions
|
|
629
|
-
};
|
|
630
|
-
/** postgrest-js options a bare `PostgrestClient` takes; `timeout` is the executor's. */
|
|
631
|
-
const restOptions = {
|
|
632
|
-
...db.retry === void 0 ? {} : { retry: db.retry },
|
|
633
|
-
...urlLengthLimit === void 0 ? {} : { urlLengthLimit }
|
|
634
|
-
};
|
|
635
|
-
const executorOptions = {
|
|
636
|
-
...definitionExecutor,
|
|
637
|
-
...urlLengthLimit === void 0 ? {} : { urlLengthLimit },
|
|
638
|
-
...db.timeout === void 0 ? {} : { timeout: db.timeout },
|
|
639
|
-
...db.retry === void 0 ? {} : { retry: db.retry }
|
|
640
|
-
};
|
|
641
|
-
/** Set when `db` options need an executor built with them. */
|
|
642
|
-
const tunedExecutor = options.db !== void 0;
|
|
643
|
-
const serviceClient = () => {
|
|
644
|
-
adminClient ??= createClient(env().url, secretKey(), {
|
|
645
|
-
auth: STATELESS,
|
|
646
|
-
...sharedGlobal
|
|
647
|
-
});
|
|
648
|
-
return adminClient;
|
|
649
|
-
};
|
|
650
|
-
const readUrl = () => options.readUrl === false ? void 0 : options.readUrl?.replace(/\/+$/, "") ?? env().readUrl;
|
|
651
|
-
const apiKeyClient = () => {
|
|
652
|
-
throw new TypeError("ctx.supabase and ctx.db.$client are not available for an API key: ctx.db and ctx.sql run over direct Postgres with the key's claims");
|
|
653
|
-
};
|
|
654
|
-
/** Clients for the primary share the service and anon clients; others don't. */
|
|
655
|
-
const supabaseAt = (url, auth, headers = {}) => {
|
|
656
|
-
const custom = Object.keys(headers).length > 0;
|
|
657
|
-
const global = custom ? {
|
|
658
|
-
global: {
|
|
659
|
-
headers,
|
|
660
|
-
...customFetch
|
|
661
|
-
},
|
|
662
|
-
...dbOptions
|
|
663
|
-
} : sharedGlobal;
|
|
664
|
-
const shared = !custom && url === env().url;
|
|
665
|
-
switch (auth.kind) {
|
|
666
|
-
case "user": return createClient(url, env().publishableKey, {
|
|
667
|
-
accessToken: () => Promise.resolve(auth.token),
|
|
668
|
-
...global
|
|
669
|
-
});
|
|
670
|
-
case "service": return shared ? serviceClient() : createClient(url, secretKey(), {
|
|
671
|
-
auth: STATELESS,
|
|
672
|
-
...global
|
|
673
|
-
});
|
|
674
|
-
case "anon":
|
|
675
|
-
case "invalid":
|
|
676
|
-
if (!shared) return createClient(url, env().publishableKey, {
|
|
677
|
-
auth: STATELESS,
|
|
678
|
-
...global
|
|
679
|
-
});
|
|
680
|
-
anonClient ??= createClient(url, env().publishableKey, {
|
|
681
|
-
auth: STATELESS,
|
|
682
|
-
...sharedGlobal
|
|
683
|
-
});
|
|
684
|
-
return anonClient;
|
|
685
|
-
case "apiKey": return apiKeyClient();
|
|
686
|
-
default: return auth;
|
|
687
|
-
}
|
|
688
|
-
};
|
|
689
|
-
const supabaseFor = (auth, headers = {}) => supabaseAt(env().url, auth, headers);
|
|
690
|
-
const restUrls = /* @__PURE__ */ new Map();
|
|
691
|
-
const restUrl = (url) => {
|
|
692
|
-
let rest = restUrls.get(url);
|
|
693
|
-
if (rest === void 0) {
|
|
694
|
-
rest = new URL("rest/v1", url.endsWith("/") ? url : `${url}/`).href;
|
|
695
|
-
restUrls.set(url, rest);
|
|
696
|
-
}
|
|
697
|
-
return rest;
|
|
698
|
-
};
|
|
699
|
-
/**
|
|
700
|
-
* The client queries run on. Requests need only PostgREST, so they skip
|
|
701
|
-
* building Realtime, Storage and Auth clients per request; the shared
|
|
702
|
-
* service and anon clients for the primary are built once anyway.
|
|
703
|
-
*/
|
|
704
|
-
const restAt = (url, auth, headers = {}) => {
|
|
705
|
-
let key;
|
|
706
|
-
let bearer;
|
|
707
|
-
switch (auth.kind) {
|
|
708
|
-
case "user":
|
|
709
|
-
key = env().publishableKey;
|
|
710
|
-
bearer = auth.token;
|
|
711
|
-
break;
|
|
712
|
-
case "service":
|
|
713
|
-
case "anon":
|
|
714
|
-
case "invalid":
|
|
715
|
-
if (Object.keys(headers).length === 0 && url === env().url) return supabaseAt(url, auth, headers);
|
|
716
|
-
key = auth.kind === "service" ? secretKey() : env().publishableKey;
|
|
717
|
-
bearer = key;
|
|
718
|
-
break;
|
|
719
|
-
case "apiKey": return apiKeyClient();
|
|
720
|
-
default: return auth;
|
|
721
|
-
}
|
|
722
|
-
return new PostgrestClient(restUrl(url), {
|
|
723
|
-
headers: {
|
|
724
|
-
...headers,
|
|
725
|
-
apikey: key,
|
|
726
|
-
Authorization: `Bearer ${bearer}`
|
|
727
|
-
},
|
|
728
|
-
...customFetch,
|
|
729
|
-
...restOptions
|
|
730
|
-
});
|
|
731
|
-
};
|
|
1199
|
+
const { executorOptions, tunedExecutor, serviceClient, readUrl, apiKeyClient, supabaseFor, restAt } = createClients({
|
|
1200
|
+
options,
|
|
1201
|
+
env,
|
|
1202
|
+
definitionExecutor: betterSupabase.executorOptions(),
|
|
1203
|
+
lite,
|
|
1204
|
+
createClient
|
|
1205
|
+
});
|
|
732
1206
|
/** `$client` stays the full Supabase client, built when first read. */
|
|
733
1207
|
const withLazyClient = (db, client) => Object.defineProperty(db, "$client", {
|
|
734
1208
|
get: client,
|
|
@@ -741,12 +1215,15 @@ function createServer(betterSupabase, options = {}) {
|
|
|
741
1215
|
const db = betterSupabase.connect(rest, {
|
|
742
1216
|
...authContext(auth),
|
|
743
1217
|
...context
|
|
744
|
-
}, tunedExecutor ? { executor: postgrestExecutor(rest, executorOptions) } : {});
|
|
1218
|
+
}, auth.kind === "invalid" ? { executor: refusingExecutor(auth.error) } : tunedExecutor ? { executor: postgrestExecutor(rest, executorOptions) } : {});
|
|
745
1219
|
return withLazyClient(db, () => supabase ??= supabaseFor(auth));
|
|
746
1220
|
};
|
|
747
|
-
const sqlFor = (claims, context, stats, session) => {
|
|
1221
|
+
const sqlFor = (claims, context, stats, session, storage) => {
|
|
748
1222
|
if (!options.postgres) throw new TypeError("Direct Postgres access needs createServer(betterSupabase, { postgres: createPostgres() })");
|
|
749
|
-
return betterSupabase.connect(session ? options.postgres.executorFor(claims, session) : options.postgres.executorFor(claims), context,
|
|
1223
|
+
return betterSupabase.connect(session ? options.postgres.executorFor(claims, session) : options.postgres.executorFor(claims), context, {
|
|
1224
|
+
...stats ? { stats } : {},
|
|
1225
|
+
...storage ? { storage } : {}
|
|
1226
|
+
});
|
|
750
1227
|
};
|
|
751
1228
|
/** `ServerOptions.tenant` outside `context()`, where it can't be awaited. */
|
|
752
1229
|
const syncTenant = (request, auth) => {
|
|
@@ -758,7 +1235,7 @@ function createServer(betterSupabase, options = {}) {
|
|
|
758
1235
|
const idPolicy = requestIdPolicy(options.requestIds);
|
|
759
1236
|
if (options.support && !options.postgres) throw new TypeError("Support sessions need createServer(betterSupabase, { postgres: createPostgres(), support })");
|
|
760
1237
|
const audit = serverAudit(betterSupabase, options.audit);
|
|
761
|
-
const support = options.support ? options.support.create(betterSupabase.events, options.auth?.claims ?? betterSupabase.claimsSchema) : supportOff;
|
|
1238
|
+
const support = options.support ? options.support.create(betterSupabase.events, options.auth?.claims ?? betterSupabase.claimsSchema, betterSupabase.temporal) : supportOff;
|
|
762
1239
|
/**
|
|
763
1240
|
* The target's context in a support session. Queries run over direct
|
|
764
1241
|
* Postgres with the target's claims plus `act`, read-only unless the
|
|
@@ -801,17 +1278,32 @@ function createServer(betterSupabase, options = {}) {
|
|
|
801
1278
|
};
|
|
802
1279
|
let db;
|
|
803
1280
|
let sql;
|
|
1281
|
+
let storage;
|
|
1282
|
+
const targetStorage = () => {
|
|
1283
|
+
const postgres = options.postgres;
|
|
1284
|
+
if (!postgres) throw new TypeError("Support sessions need createServer(betterSupabase, { postgres: createPostgres(), support })");
|
|
1285
|
+
let asTarget;
|
|
1286
|
+
storage ??= supportStorage({
|
|
1287
|
+
admin: { from: (bucket) => serviceClient().storage.from(bucket) },
|
|
1288
|
+
sql: { queryRaw: (text, params) => (asTarget ??= postgres.asUser(sqlClaims, sessionOptions)).queryRaw(text, params) },
|
|
1289
|
+
readOnly: session.readOnly
|
|
1290
|
+
});
|
|
1291
|
+
return storage;
|
|
1292
|
+
};
|
|
804
1293
|
return {
|
|
805
1294
|
...credentials,
|
|
806
1295
|
...ids,
|
|
807
1296
|
auth,
|
|
808
1297
|
resolution,
|
|
809
1298
|
support: active,
|
|
1299
|
+
get storage() {
|
|
1300
|
+
return targetStorage();
|
|
1301
|
+
},
|
|
810
1302
|
get supabase() {
|
|
811
1303
|
return unavailable();
|
|
812
1304
|
},
|
|
813
1305
|
get db() {
|
|
814
|
-
db ??= Object.defineProperty(sqlFor(sqlClaims, context, recorder, sessionOptions), "$client", {
|
|
1306
|
+
db ??= Object.defineProperty(sqlFor(sqlClaims, context, recorder, sessionOptions, targetStorage()), "$client", {
|
|
815
1307
|
get: unavailable,
|
|
816
1308
|
enumerable: true,
|
|
817
1309
|
configurable: true
|
|
@@ -819,7 +1311,7 @@ function createServer(betterSupabase, options = {}) {
|
|
|
819
1311
|
return db;
|
|
820
1312
|
},
|
|
821
1313
|
get sql() {
|
|
822
|
-
sql ??= sqlFor(sqlClaims, context, recorder, sessionOptions);
|
|
1314
|
+
sql ??= sqlFor(sqlClaims, context, recorder, sessionOptions, targetStorage());
|
|
823
1315
|
return sql;
|
|
824
1316
|
},
|
|
825
1317
|
replica: void 0,
|
|
@@ -915,7 +1407,7 @@ function createServer(betterSupabase, options = {}) {
|
|
|
915
1407
|
const rest = (sharesClient ? void 0 : supabase) ?? restAt(env().url, auth, headers);
|
|
916
1408
|
const connected = betterSupabase.connect(rest, context, {
|
|
917
1409
|
stats: recorder,
|
|
918
|
-
...url && replica ? { executor: routedExecutor(postgrestExecutor(rest, executorOptions), postgrestExecutor(restAt(url, auth, headers), executorOptions), replica) } : tunedExecutor ? { executor: postgrestExecutor(rest, executorOptions) } : {}
|
|
1410
|
+
...auth.kind === "invalid" ? { executor: refusingExecutor(auth.error) } : url && replica ? { executor: routedExecutor(postgrestExecutor(rest, executorOptions), postgrestExecutor(restAt(url, auth, headers), executorOptions), replica) } : tunedExecutor ? { executor: postgrestExecutor(rest, executorOptions) } : {}
|
|
919
1411
|
});
|
|
920
1412
|
db = withLazyClient(connected, client);
|
|
921
1413
|
return db;
|
|
@@ -943,7 +1435,7 @@ function createServer(betterSupabase, options = {}) {
|
|
|
943
1435
|
const userMetadata = betterSupabase.userMetadataSchema;
|
|
944
1436
|
const resolution = await resolveAuth(request, {
|
|
945
1437
|
logger: betterSupabase.events.logger,
|
|
946
|
-
...options.auth,
|
|
1438
|
+
...lite ? lite.auth() : options.auth,
|
|
947
1439
|
...claims ? { claims } : {},
|
|
948
1440
|
...userMetadata ? { userMetadata } : {},
|
|
949
1441
|
env: env(),
|
|
@@ -980,6 +1472,7 @@ function createServer(betterSupabase, options = {}) {
|
|
|
980
1472
|
return env();
|
|
981
1473
|
},
|
|
982
1474
|
events: betterSupabase.events,
|
|
1475
|
+
authorizer: options.authorizer,
|
|
983
1476
|
resolve,
|
|
984
1477
|
supabaseFor,
|
|
985
1478
|
dbFor,
|
|
@@ -1127,6 +1620,14 @@ function createServer(betterSupabase, options = {}) {
|
|
|
1127
1620
|
function flushEvents(server, waitUntil) {
|
|
1128
1621
|
if (waitUntil && server.events.pending) waitUntil(server.events.settled());
|
|
1129
1622
|
}
|
|
1623
|
+
/** Runs `run`, then hands pending event sink sends to `waitUntil` even when it throws. */
|
|
1624
|
+
async function withFlush(server, waitUntil, run) {
|
|
1625
|
+
try {
|
|
1626
|
+
return await run();
|
|
1627
|
+
} finally {
|
|
1628
|
+
flushEvents(server, waitUntil);
|
|
1629
|
+
}
|
|
1630
|
+
}
|
|
1130
1631
|
/** The 500 for an error a handler threw; the message only when `expose` is set. */
|
|
1131
1632
|
function unexpectedResponse(cause, options) {
|
|
1132
1633
|
return problemResponse(dbError("unexpected", options.expose && cause instanceof Error ? cause.message : "Internal server error"), options);
|
|
@@ -1187,4 +1688,4 @@ async function resolveToken(server, token) {
|
|
|
1187
1688
|
return auth;
|
|
1188
1689
|
}
|
|
1189
1690
|
//#endregion
|
|
1190
|
-
export {
|
|
1691
|
+
export { withServerContext as C, lastSignIns as D, endSessions as E, suspendAccount as O, shouldRefresh as S, SERVER_EVENT_SOURCE as T, withSupport as _, unexpectedResponse as a, refreshFor as b, extendServer as c, clearSupportCookie as d, supportCookie as f, withTenant as g, TENANT_HEADER as h, resolveToken as i, deleteAccount as k, supportStorage as l, supportCookieValue as m, flushEvents as n, withFlush as o, supportCookieMaxAge as p, handle as r, createServer as s, bearerRequest as t, SUPPORT_COOKIE as u, withSession as v, serverCore as w, shouldCheckSession as x, isPrefetch as y };
|