better-supabase 0.7.0 → 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-B-tL8hqg.js → adapter-CN45ibbV.js} +663 -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-CVdnLahA.js → doctor-VcDtuusV.js} +317 -222
- 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-Cr6arjXU.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-Bzuv1HHj.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-Bp4fyubI.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-CpHLEo-G.d.ts → composite-CWAJTRBF.d.ts} +6 -6
- package/dist/{composite-C6I8ZyaF.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-KIPvRQJU.d.ts → framework-148t1m3C.d.ts} +5 -5
- package/dist/{framework-BDCpJI7o.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-ZSJ9rCcV.d.ts → server-types-CrAmZ8jv.d.ts} +110 -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-DWwzVf-O.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--AolB5ej.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/skills/better-supabase-auth/SKILL.md +8 -4
- package/dist/cli/config-B9HkL8nF.js +0 -2
- package/dist/cli/gen-AIf4MREI.js +0 -3100
- package/dist/cli/gen-DSrahEdX.js +0 -2
- package/dist/cli/prompts-BTYQGunc.js +0 -2
- package/dist/cli/run-BO052mki.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
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
//#region src/spec/resource.ts
|
|
2
|
+
const ACTION_NAME = /^[A-Za-z][A-Za-z0-9_]*$/u;
|
|
3
|
+
const RESERVED = /* @__PURE__ */ new Set([
|
|
4
|
+
"list",
|
|
5
|
+
"get",
|
|
6
|
+
"create",
|
|
7
|
+
"update",
|
|
8
|
+
"delete"
|
|
9
|
+
]);
|
|
10
|
+
function planAction(table, name, action, keyParam) {
|
|
11
|
+
if (!ACTION_NAME.test(name) || RESERVED.has(name)) throw new TypeError(`${table}.actions.${name}: use a name of letters, digits and "_" that is not an operation`);
|
|
12
|
+
if (!action.path.startsWith("/") || action.path === "/") throw new TypeError(`${table}.actions.${name}: the path must start with "/" and name a segment, e.g. "/{id}/send"`);
|
|
13
|
+
const segments = action.path.slice(1).split("/");
|
|
14
|
+
const params = [];
|
|
15
|
+
for (const segment of segments) {
|
|
16
|
+
const match = /^\{(\w+)\}$/u.exec(segment);
|
|
17
|
+
if (match) params.push(match[1]);
|
|
18
|
+
else if (segment === "" || /[{}]/u.test(segment)) throw new TypeError(`${table}.actions.${name}: "${action.path}" has an invalid segment`);
|
|
19
|
+
}
|
|
20
|
+
if (params.some((param) => param !== keyParam)) throw new TypeError(`${table}.actions.${name}: the only path parameter is the key ${keyParam ? `"{${keyParam}}"` : "(this table has none)"}`);
|
|
21
|
+
return {
|
|
22
|
+
...action,
|
|
23
|
+
name,
|
|
24
|
+
params,
|
|
25
|
+
segments
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Resolves what a resource serves: the operations, the key, paging,
|
|
30
|
+
* actions and permissions. Shared by `defineResource` and the API model.
|
|
31
|
+
*/
|
|
32
|
+
function planResource(schema, table, description = {}, authorizer) {
|
|
33
|
+
const meta = schema.tables[table];
|
|
34
|
+
if (!meta) throw new TypeError(`Unknown table "${table}"`);
|
|
35
|
+
const operations = description.operations ?? (meta.kind === "view" ? ["list", "get"] : [
|
|
36
|
+
"list",
|
|
37
|
+
"get",
|
|
38
|
+
"create",
|
|
39
|
+
"update",
|
|
40
|
+
"delete"
|
|
41
|
+
]);
|
|
42
|
+
const keyParam = meta.primaryKey.length === 1 ? meta.primaryKey[0] : void 0;
|
|
43
|
+
const pagination = description.list ? description.list.pagination ?? "offset" : description.pagination ?? "offset";
|
|
44
|
+
const actions = Object.entries(description.actions ?? {}).map(([name, action]) => planAction(table, name, action, keyParam));
|
|
45
|
+
const permissions = {};
|
|
46
|
+
if (description.permissions === true) {
|
|
47
|
+
if (!authorizer?.forOperation) throw new TypeError(`${table}: permissions: true needs an authorizer with forOperation()`);
|
|
48
|
+
for (const operation of operations) {
|
|
49
|
+
const ref = authorizer.forOperation(table, operation);
|
|
50
|
+
if (ref !== void 0) permissions[operation] = ref;
|
|
51
|
+
}
|
|
52
|
+
} else if (description.permissions) {
|
|
53
|
+
for (const [operation, ref] of Object.entries(description.permissions)) if (ref !== void 0) permissions[operation] = ref;
|
|
54
|
+
}
|
|
55
|
+
for (const action of actions) if (action.permission !== void 0) permissions[action.name] = action.permission;
|
|
56
|
+
return {
|
|
57
|
+
table,
|
|
58
|
+
meta,
|
|
59
|
+
operations,
|
|
60
|
+
keyParam,
|
|
61
|
+
pagination,
|
|
62
|
+
maxPageSize: description.maxPageSize ?? 200,
|
|
63
|
+
description,
|
|
64
|
+
actions,
|
|
65
|
+
permissions
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/** The action whose method and segments match, with its params. */
|
|
69
|
+
function matchAction(plan, method, segments) {
|
|
70
|
+
let wrongMethod = false;
|
|
71
|
+
for (const action of plan.actions) {
|
|
72
|
+
if (action.segments.length !== segments.length) continue;
|
|
73
|
+
const params = {};
|
|
74
|
+
if (!action.segments.every((segment, index) => {
|
|
75
|
+
const value = segments[index];
|
|
76
|
+
if (segment.startsWith("{")) {
|
|
77
|
+
params[segment.slice(1, -1)] = value;
|
|
78
|
+
return value !== "";
|
|
79
|
+
}
|
|
80
|
+
return segment === value;
|
|
81
|
+
})) continue;
|
|
82
|
+
if (action.method === method) return {
|
|
83
|
+
action,
|
|
84
|
+
params
|
|
85
|
+
};
|
|
86
|
+
wrongMethod = true;
|
|
87
|
+
}
|
|
88
|
+
return wrongMethod ? "method" : void 0;
|
|
89
|
+
}
|
|
90
|
+
//#endregion
|
|
91
|
+
export { planResource as n, matchAction as t };
|
|
@@ -0,0 +1,463 @@
|
|
|
1
|
+
import { n as dbError, o as isDbError } from "./errors-2M6CKMP4.js";
|
|
2
|
+
import { a as ok, r as err, s as toDbError } from "./result-DEqHCMKP.js";
|
|
3
|
+
import { n as isRecord } from "./guards-6F2bCtQR.js";
|
|
4
|
+
import { n as validate } from "./standard-DkzZUneg.js";
|
|
5
|
+
import { a as methodNotAllowed } from "./problem-CJvFeGu7.js";
|
|
6
|
+
import { a as respond, i as isResult } from "./respond-volM3ByS.js";
|
|
7
|
+
import { n as checkPermission, t as checkEach } from "./authorizer-ayxUDXXP.js";
|
|
8
|
+
import { n as planResource, t as matchAction } from "./resource-BqNqlYg9.js";
|
|
9
|
+
//#region src/server/resource-execute.ts
|
|
10
|
+
async function settled(value) {
|
|
11
|
+
return await value;
|
|
12
|
+
}
|
|
13
|
+
function failure(cause, message) {
|
|
14
|
+
if (isDbError(cause)) return err(cause);
|
|
15
|
+
const error = toDbError(cause);
|
|
16
|
+
return err(error.kind === "unexpected" ? dbError("unexpected", message) : error);
|
|
17
|
+
}
|
|
18
|
+
/** Runs a hook: its `Result` passes through, anything else is an `unexpected` error. */
|
|
19
|
+
async function runHook(name, call) {
|
|
20
|
+
try {
|
|
21
|
+
const value = await call();
|
|
22
|
+
if (!isResult(value)) return err(dbError("unexpected", `The ${name} hook must return a Result`));
|
|
23
|
+
return value.ok ? ok(value.data) : failure(value.error, `The ${name} hook failed`);
|
|
24
|
+
} catch (cause) {
|
|
25
|
+
return failure(cause, `The ${name} hook failed`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/** Runs an action handler: a `Result` unwraps, a plain value is the data. */
|
|
29
|
+
async function runHandler(name, call) {
|
|
30
|
+
try {
|
|
31
|
+
const value = await call();
|
|
32
|
+
if (!isResult(value)) return ok(value);
|
|
33
|
+
return value.ok ? ok(value.data) : failure(value.error, `The ${name} action failed`);
|
|
34
|
+
} catch (cause) {
|
|
35
|
+
return failure(cause, `The ${name} action failed`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/** Defines an action and types its handler's `data` and `query` from the schemas. */
|
|
39
|
+
function defineAction(action) {
|
|
40
|
+
return action;
|
|
41
|
+
}
|
|
42
|
+
//#endregion
|
|
43
|
+
//#region src/server/resource-http.ts
|
|
44
|
+
const INTEGER = /* @__PURE__ */ new Set([
|
|
45
|
+
"int2",
|
|
46
|
+
"int4",
|
|
47
|
+
"int8"
|
|
48
|
+
]);
|
|
49
|
+
function keyValue(table, raw) {
|
|
50
|
+
const invalid = err(dbError("invalid_input", `${JSON.stringify(raw)} is not a valid ${table.key} key`));
|
|
51
|
+
const column = table.columns[table.primaryKey[0]];
|
|
52
|
+
if (column && INTEGER.has(column.type)) {
|
|
53
|
+
const value = typeof raw === "string" ? Number(raw) : raw;
|
|
54
|
+
return typeof value === "number" && Number.isSafeInteger(value) ? ok(value) : invalid;
|
|
55
|
+
}
|
|
56
|
+
return typeof raw === "string" && raw !== "" ? ok(raw) : invalid;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* A cross-site browser request that needed no CORS preflight: a form post
|
|
60
|
+
* riding on the session cookie. Bearer requests and JSON bodies (which need a
|
|
61
|
+
* preflight) pass, as do requests without an `Origin` (not a browser).
|
|
62
|
+
*/
|
|
63
|
+
function crossSiteSimpleRequest(request) {
|
|
64
|
+
if (request.method === "GET" || request.method === "HEAD") return false;
|
|
65
|
+
if (request.headers.has("authorization")) return false;
|
|
66
|
+
const origin = request.headers.get("origin");
|
|
67
|
+
if (!origin || origin === new URL(request.url).origin) return false;
|
|
68
|
+
if (request.headers.get("sec-fetch-site") === "same-origin") return false;
|
|
69
|
+
const type = request.headers.get("content-type") ?? "";
|
|
70
|
+
return !/^application\/(?:[\w.+-]+\+)?json\b/iu.test(type);
|
|
71
|
+
}
|
|
72
|
+
async function readBody(request) {
|
|
73
|
+
try {
|
|
74
|
+
const body = await request.json();
|
|
75
|
+
if (typeof body === "object" && body !== null && !Array.isArray(body)) return ok(body);
|
|
76
|
+
} catch {}
|
|
77
|
+
return err(dbError("invalid_input", "The request body must be a JSON object"));
|
|
78
|
+
}
|
|
79
|
+
/** Any JSON body; an empty body is `undefined`. */
|
|
80
|
+
async function readJson(request) {
|
|
81
|
+
const text = await request.text();
|
|
82
|
+
if (text.trim() === "") return ok(void 0);
|
|
83
|
+
try {
|
|
84
|
+
return ok(JSON.parse(text));
|
|
85
|
+
} catch {
|
|
86
|
+
return err(dbError("invalid_input", "The request body must be JSON"));
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/** URL parameters as an object; a repeated name becomes an array. */
|
|
90
|
+
function queryObject(query) {
|
|
91
|
+
if (!(query instanceof URLSearchParams)) return query ?? {};
|
|
92
|
+
const values = {};
|
|
93
|
+
for (const [name, value] of query) {
|
|
94
|
+
const seen = values[name];
|
|
95
|
+
values[name] = seen === void 0 ? value : [...Array.isArray(seen) ? seen : [seen], value];
|
|
96
|
+
}
|
|
97
|
+
return values;
|
|
98
|
+
}
|
|
99
|
+
function pageArgs(query, max, pagination) {
|
|
100
|
+
const raw = (name) => {
|
|
101
|
+
const value = query instanceof URLSearchParams ? query.get(name) : query?.[name];
|
|
102
|
+
return value === null || value === "" ? void 0 : value;
|
|
103
|
+
};
|
|
104
|
+
const read = (name, fallback) => {
|
|
105
|
+
const value = raw(name);
|
|
106
|
+
if (value === void 0) return fallback;
|
|
107
|
+
const number = Number(value);
|
|
108
|
+
return Number.isSafeInteger(number) && number >= 1 ? number : void 0;
|
|
109
|
+
};
|
|
110
|
+
const issues = [];
|
|
111
|
+
const size = read("size", 50);
|
|
112
|
+
if (size === void 0 || size > max) issues.push({
|
|
113
|
+
message: `Must be between 1 and ${max}`,
|
|
114
|
+
path: ["size"]
|
|
115
|
+
});
|
|
116
|
+
const [used, unused] = pagination === "cursor" ? ["after", "page"] : ["page", "after"];
|
|
117
|
+
if (raw(unused) !== void 0) issues.push({
|
|
118
|
+
message: `This list pages with \`${used}\``,
|
|
119
|
+
path: [unused]
|
|
120
|
+
});
|
|
121
|
+
const page = read("page", 1);
|
|
122
|
+
if (pagination === "offset" && page === void 0) issues.push({
|
|
123
|
+
message: "Must be a positive integer",
|
|
124
|
+
path: ["page"]
|
|
125
|
+
});
|
|
126
|
+
const after = raw("after");
|
|
127
|
+
if (pagination === "cursor" && after !== void 0 && typeof after !== "string") issues.push({
|
|
128
|
+
message: "Must be text",
|
|
129
|
+
path: ["after"]
|
|
130
|
+
});
|
|
131
|
+
if (issues.length > 0 || size === void 0) return err(dbError("validation", "Invalid page parameters", { issues }));
|
|
132
|
+
return pagination === "cursor" ? ok({
|
|
133
|
+
after: typeof after === "string" ? after : null,
|
|
134
|
+
size
|
|
135
|
+
}) : ok({
|
|
136
|
+
page: page ?? 1,
|
|
137
|
+
size
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
function asObject(value) {
|
|
141
|
+
return typeof value === "object" && value !== null && !Array.isArray(value) ? ok(value) : err(dbError("invalid_input", "Expected an object of column values"));
|
|
142
|
+
}
|
|
143
|
+
function splitPath(subpath) {
|
|
144
|
+
if (typeof subpath !== "string") return ok(subpath);
|
|
145
|
+
try {
|
|
146
|
+
return ok(subpath.split("/").filter((segment) => segment !== "").map((segment) => decodeURIComponent(segment)));
|
|
147
|
+
} catch {
|
|
148
|
+
return err(dbError("invalid_input", `Malformed path ${subpath}`));
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
function contextOf(db) {
|
|
152
|
+
const value = "$context" in db ? db.$context : void 0;
|
|
153
|
+
return isRecord(value) ? value : {};
|
|
154
|
+
}
|
|
155
|
+
/** Whether an action's path fits these segments, whatever the method. */
|
|
156
|
+
function actionFits(action, segments) {
|
|
157
|
+
return action.segments.length === segments.length && action.segments.every((segment, index) => segment.startsWith("{") ? segments[index] !== "" : segment === segments[index]);
|
|
158
|
+
}
|
|
159
|
+
//#endregion
|
|
160
|
+
//#region src/server/resource.ts
|
|
161
|
+
/**
|
|
162
|
+
* Operations over one table, matching the paths and responses of the API
|
|
163
|
+
* model: `GET/POST /<table>`, `GET/PATCH/DELETE /<table>/{id}` and each
|
|
164
|
+
* action's path. Shared by the HTTP adapters and the MCP table tools.
|
|
165
|
+
*
|
|
166
|
+
* With permissions, the authorizer decides before the repository runs:
|
|
167
|
+
* `get`, `update` and `delete` fetch the row first (under RLS) and pass it
|
|
168
|
+
* as the resource's properties, and `list` keeps only the rows it grants.
|
|
169
|
+
*/
|
|
170
|
+
function defineResource(betterSupabase, table, options = {}, authorizer) {
|
|
171
|
+
if (options.list && options.list.table !== table) throw new TypeError(`The list query is for "${options.list.table}", not "${table}"`);
|
|
172
|
+
const plan = planResource(betterSupabase.meta, table, options, authorizer);
|
|
173
|
+
const { meta, operations, keyParam, pagination, maxPageSize } = plan;
|
|
174
|
+
const has = (operation) => operations.includes(operation);
|
|
175
|
+
const extra = options.select === void 0 ? {} : { select: options.select };
|
|
176
|
+
const list = options.list;
|
|
177
|
+
const hooks = options.hooks ?? {};
|
|
178
|
+
const resourceOf = (id, row) => ({
|
|
179
|
+
type: table,
|
|
180
|
+
...id === void 0 ? {} : { id: String(id) },
|
|
181
|
+
...isRecord(row) ? { properties: row } : {}
|
|
182
|
+
});
|
|
183
|
+
const permit = (name, db, resource) => {
|
|
184
|
+
const permission = plan.permissions[name];
|
|
185
|
+
if (permission === void 0) return ok(void 0);
|
|
186
|
+
return checkPermission({
|
|
187
|
+
authorizer,
|
|
188
|
+
permission,
|
|
189
|
+
resource,
|
|
190
|
+
context: contextOf(db)
|
|
191
|
+
});
|
|
192
|
+
};
|
|
193
|
+
const ctxOf = (db, input) => ({
|
|
194
|
+
db,
|
|
195
|
+
table,
|
|
196
|
+
request: input.request,
|
|
197
|
+
context: contextOf(db)
|
|
198
|
+
});
|
|
199
|
+
const after = async (name, ctx, result) => {
|
|
200
|
+
const run = hooks[name];
|
|
201
|
+
if (!run || !result.ok) return result;
|
|
202
|
+
return runHook(name, () => run.call(hooks, ctx, result.data));
|
|
203
|
+
};
|
|
204
|
+
const authorize = async (ctx, operation, target) => hooks.authorize ? runHook("authorize", () => hooks.authorize(ctx, operation, target)) : ok(void 0);
|
|
205
|
+
const repositoryOf = (db) => {
|
|
206
|
+
const repository = db[table];
|
|
207
|
+
if (!repository) throw new TypeError(`The db has no "${table}" repository`);
|
|
208
|
+
return repository;
|
|
209
|
+
};
|
|
210
|
+
const key = (raw) => keyParam ? keyValue(meta, raw) : err(dbError("invalid_request", `${table} has no single-column key`));
|
|
211
|
+
/** Fetches the row a permission decision reads, under the caller's RLS. */
|
|
212
|
+
const rowFor = async (name, db, id) => {
|
|
213
|
+
if (plan.permissions[name] === void 0) return ok(void 0);
|
|
214
|
+
return settled(repositoryOf(db).findById(id));
|
|
215
|
+
};
|
|
216
|
+
const filterRows = async (db, result) => {
|
|
217
|
+
const permission = plan.permissions["list"];
|
|
218
|
+
if (permission === void 0 || !result.ok) return result;
|
|
219
|
+
if (!authorizer) {
|
|
220
|
+
const denied = await checkPermission({
|
|
221
|
+
authorizer,
|
|
222
|
+
permission,
|
|
223
|
+
resource: { type: table },
|
|
224
|
+
context: contextOf(db)
|
|
225
|
+
});
|
|
226
|
+
if (!denied.ok) return denied;
|
|
227
|
+
}
|
|
228
|
+
const page = result.data;
|
|
229
|
+
if (!isRecord(page) || !Array.isArray(page["items"])) return result;
|
|
230
|
+
const items = page["items"];
|
|
231
|
+
const granted = await checkEach(authorizer, permission, items.map((row) => resourceOf(keyParam && isRecord(row) ? row[keyParam] : void 0, row)), contextOf(db));
|
|
232
|
+
return ok({
|
|
233
|
+
...page,
|
|
234
|
+
items: items.filter((_, index) => granted[index])
|
|
235
|
+
});
|
|
236
|
+
};
|
|
237
|
+
const execute = async (db, operation, input = {}) => {
|
|
238
|
+
const repository = repositoryOf(db);
|
|
239
|
+
if (!has(operation)) return err(dbError("forbidden", `${operation} is not enabled for ${table}`));
|
|
240
|
+
const ctx = ctxOf(db, input);
|
|
241
|
+
switch (operation) {
|
|
242
|
+
case "list": {
|
|
243
|
+
let run;
|
|
244
|
+
let query = input.query;
|
|
245
|
+
if (list) {
|
|
246
|
+
const parsed = list.parse(input.query ?? {});
|
|
247
|
+
if (!parsed.ok) return err(dbError("validation", "Invalid list query", { issues: parsed.issues }));
|
|
248
|
+
query = parsed.value;
|
|
249
|
+
run = () => settled(list.run(db, parsed.value, extra));
|
|
250
|
+
} else {
|
|
251
|
+
const page = pageArgs(input.query, maxPageSize, pagination);
|
|
252
|
+
if (!page.ok) return page;
|
|
253
|
+
query = page.data;
|
|
254
|
+
run = () => settled(repository.paginate({
|
|
255
|
+
...extra,
|
|
256
|
+
...page.data,
|
|
257
|
+
..."page" in page.data ? { count: "exact" } : {}
|
|
258
|
+
}));
|
|
259
|
+
}
|
|
260
|
+
const allowed = await authorize(ctx, "list", { query });
|
|
261
|
+
if (!allowed.ok) return allowed;
|
|
262
|
+
return after("afterList", ctx, await filterRows(db, await run()));
|
|
263
|
+
}
|
|
264
|
+
case "get": {
|
|
265
|
+
const id = key(input.id);
|
|
266
|
+
if (!id.ok) return id;
|
|
267
|
+
const row = await settled(repository.findById(id.data, extra));
|
|
268
|
+
if (!row.ok) return row;
|
|
269
|
+
const permitted = await permit("get", db, resourceOf(id.data, row.data));
|
|
270
|
+
if (!permitted.ok) return permitted;
|
|
271
|
+
const allowed = await authorize(ctx, "get", {
|
|
272
|
+
id: id.data,
|
|
273
|
+
row: row.data
|
|
274
|
+
});
|
|
275
|
+
if (!allowed.ok) return allowed;
|
|
276
|
+
return after("afterGet", ctx, row);
|
|
277
|
+
}
|
|
278
|
+
case "create": {
|
|
279
|
+
const body = asObject(input.data);
|
|
280
|
+
if (!body.ok) return body;
|
|
281
|
+
const data = options.input?.create ? await validate(options.input.create, body.data, "data") : body;
|
|
282
|
+
if (!data.ok) return data;
|
|
283
|
+
const permitted = await permit("create", db, resourceOf(void 0, data.data));
|
|
284
|
+
if (!permitted.ok) return permitted;
|
|
285
|
+
const allowed = await authorize(ctx, "create", { data: data.data });
|
|
286
|
+
if (!allowed.ok) return allowed;
|
|
287
|
+
const values = hooks.beforeCreate ? await runHook("beforeCreate", () => hooks.beforeCreate(ctx, data.data)) : data;
|
|
288
|
+
if (!values.ok) return values;
|
|
289
|
+
const created = await settled(repository.create(values.data, extra));
|
|
290
|
+
return after("afterCreate", ctx, created);
|
|
291
|
+
}
|
|
292
|
+
case "update": {
|
|
293
|
+
const id = key(input.id);
|
|
294
|
+
if (!id.ok) return id;
|
|
295
|
+
const body = asObject(input.data);
|
|
296
|
+
if (!body.ok) return body;
|
|
297
|
+
const data = options.input?.update ? await validate(options.input.update, body.data, "data") : body;
|
|
298
|
+
if (!data.ok) return data;
|
|
299
|
+
const row = await rowFor("update", db, id.data);
|
|
300
|
+
if (!row.ok) return row;
|
|
301
|
+
const permitted = await permit("update", db, resourceOf(id.data, row.data));
|
|
302
|
+
if (!permitted.ok) return permitted;
|
|
303
|
+
const target = {
|
|
304
|
+
id: id.data,
|
|
305
|
+
data: data.data,
|
|
306
|
+
...row.data === void 0 ? {} : { row: row.data }
|
|
307
|
+
};
|
|
308
|
+
const allowed = await authorize(ctx, "update", target);
|
|
309
|
+
if (!allowed.ok) return allowed;
|
|
310
|
+
const values = hooks.beforeUpdate ? await runHook("beforeUpdate", () => hooks.beforeUpdate(ctx, data.data, target)) : data;
|
|
311
|
+
if (!values.ok) return values;
|
|
312
|
+
const updated = await settled(repository.update(id.data, values.data, extra));
|
|
313
|
+
return after("afterUpdate", ctx, updated);
|
|
314
|
+
}
|
|
315
|
+
case "delete": {
|
|
316
|
+
const id = key(input.id);
|
|
317
|
+
if (!id.ok) return id;
|
|
318
|
+
const row = await rowFor("delete", db, id.data);
|
|
319
|
+
if (!row.ok) return row;
|
|
320
|
+
const permitted = await permit("delete", db, resourceOf(id.data, row.data));
|
|
321
|
+
if (!permitted.ok) return permitted;
|
|
322
|
+
const target = {
|
|
323
|
+
id: id.data,
|
|
324
|
+
...row.data === void 0 ? {} : { row: row.data }
|
|
325
|
+
};
|
|
326
|
+
const allowed = await authorize(ctx, "delete", target);
|
|
327
|
+
if (!allowed.ok) return allowed;
|
|
328
|
+
if (hooks.beforeDelete) {
|
|
329
|
+
const before = await runHook("beforeDelete", () => hooks.beforeDelete(ctx, target));
|
|
330
|
+
if (!before.ok) return before;
|
|
331
|
+
}
|
|
332
|
+
return settled(repository.delete(id.data));
|
|
333
|
+
}
|
|
334
|
+
default: throw new TypeError(`Unknown operation ${String(operation)}`);
|
|
335
|
+
}
|
|
336
|
+
};
|
|
337
|
+
const action = async (db, name, input = {}) => {
|
|
338
|
+
const planned = plan.actions.find((candidate) => candidate.name === name);
|
|
339
|
+
const definition = options.actions?.[name];
|
|
340
|
+
if (!planned || !definition) return err(dbError("not_found", `${table} has no action ${name}`));
|
|
341
|
+
let id;
|
|
342
|
+
if (planned.params.length > 0) {
|
|
343
|
+
const parsed = key(input.id);
|
|
344
|
+
if (!parsed.ok) return parsed;
|
|
345
|
+
id = parsed.data;
|
|
346
|
+
}
|
|
347
|
+
let data = input.data;
|
|
348
|
+
if (planned.input) {
|
|
349
|
+
const parsed = await validate(planned.input, data, "data");
|
|
350
|
+
if (!parsed.ok) return parsed;
|
|
351
|
+
data = parsed.data;
|
|
352
|
+
}
|
|
353
|
+
let query = queryObject(input.query);
|
|
354
|
+
if (planned.query) {
|
|
355
|
+
const parsed = await validate(planned.query, query, "query");
|
|
356
|
+
if (!parsed.ok) return parsed;
|
|
357
|
+
query = parsed.data;
|
|
358
|
+
}
|
|
359
|
+
const row = id === void 0 ? ok(void 0) : await rowFor(name, db, id);
|
|
360
|
+
if (!row.ok) return row;
|
|
361
|
+
const permitted = await permit(name, db, resourceOf(id, row.data ?? data));
|
|
362
|
+
if (!permitted.ok) return permitted;
|
|
363
|
+
const ctx = ctxOf(db, input);
|
|
364
|
+
const allowed = await authorize(ctx, name, {
|
|
365
|
+
id,
|
|
366
|
+
data,
|
|
367
|
+
query,
|
|
368
|
+
...row.data === void 0 ? {} : { row: row.data }
|
|
369
|
+
});
|
|
370
|
+
if (!allowed.ok) return allowed;
|
|
371
|
+
return runHandler(name, () => definition.handler(ctx, {
|
|
372
|
+
id,
|
|
373
|
+
data,
|
|
374
|
+
query
|
|
375
|
+
}));
|
|
376
|
+
};
|
|
377
|
+
const collectionMethods = [...has("list") ? ["GET"] : [], ...has("create") ? ["POST"] : []];
|
|
378
|
+
const itemMethods = [
|
|
379
|
+
...has("get") ? ["GET"] : [],
|
|
380
|
+
...has("update") ? ["PATCH"] : [],
|
|
381
|
+
...has("delete") ? ["DELETE"] : []
|
|
382
|
+
];
|
|
383
|
+
const route = async (request, db, segments, actions) => {
|
|
384
|
+
if (crossSiteSimpleRequest(request)) return [err(dbError("forbidden", "Cross-site requests need Content-Type: application/json or a bearer token", { code: "CROSS_SITE_REQUEST" }))];
|
|
385
|
+
if (actions && segments.length > 0) {
|
|
386
|
+
const method = request.method === "HEAD" ? "GET" : request.method;
|
|
387
|
+
const found = matchAction(plan, method, segments);
|
|
388
|
+
if (found === "method") return [methodNotAllowed(plan.actions.filter((candidate) => actionFits(candidate, segments)).map((candidate) => candidate.method))];
|
|
389
|
+
if (found) {
|
|
390
|
+
const body = method === "GET" ? ok(void 0) : await readJson(request);
|
|
391
|
+
if (!body.ok) return [body];
|
|
392
|
+
const id = keyParam ? found.params[keyParam] : void 0;
|
|
393
|
+
return [await action(db, found.action.name, {
|
|
394
|
+
id,
|
|
395
|
+
data: body.data,
|
|
396
|
+
query: new URL(request.url).searchParams,
|
|
397
|
+
request
|
|
398
|
+
}), found.action.status ?? 200];
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
if (segments.length === 0) {
|
|
402
|
+
if (request.method === "GET" && has("list")) return [await execute(db, "list", {
|
|
403
|
+
query: new URL(request.url).searchParams,
|
|
404
|
+
request
|
|
405
|
+
})];
|
|
406
|
+
if (request.method === "POST" && has("create")) {
|
|
407
|
+
const body = await readBody(request);
|
|
408
|
+
return [body.ok ? await execute(db, "create", {
|
|
409
|
+
data: body.data,
|
|
410
|
+
request
|
|
411
|
+
}) : body, 201];
|
|
412
|
+
}
|
|
413
|
+
return [methodNotAllowed(collectionMethods)];
|
|
414
|
+
}
|
|
415
|
+
if (segments.length > 1 || !keyParam) return [new Response(null, { status: 404 })];
|
|
416
|
+
const id = segments[0];
|
|
417
|
+
if (request.method === "GET" && has("get")) return [await execute(db, "get", {
|
|
418
|
+
id,
|
|
419
|
+
request
|
|
420
|
+
})];
|
|
421
|
+
if (request.method === "PATCH" && has("update")) {
|
|
422
|
+
const body = await readBody(request);
|
|
423
|
+
return [body.ok ? await execute(db, "update", {
|
|
424
|
+
id,
|
|
425
|
+
data: body.data,
|
|
426
|
+
request
|
|
427
|
+
}) : body];
|
|
428
|
+
}
|
|
429
|
+
if (request.method === "DELETE" && has("delete")) return [await execute(db, "delete", {
|
|
430
|
+
id,
|
|
431
|
+
request
|
|
432
|
+
})];
|
|
433
|
+
return [methodNotAllowed(itemMethods)];
|
|
434
|
+
};
|
|
435
|
+
const reply = async (routed, respondOptions) => {
|
|
436
|
+
const [value, status] = await routed();
|
|
437
|
+
return respond(() => value, status === void 0 ? respondOptions : {
|
|
438
|
+
...respondOptions,
|
|
439
|
+
status
|
|
440
|
+
});
|
|
441
|
+
};
|
|
442
|
+
return {
|
|
443
|
+
table,
|
|
444
|
+
meta,
|
|
445
|
+
operations,
|
|
446
|
+
keyParam,
|
|
447
|
+
list,
|
|
448
|
+
pagination,
|
|
449
|
+
maxPageSize,
|
|
450
|
+
plan,
|
|
451
|
+
execute,
|
|
452
|
+
action,
|
|
453
|
+
handle(request, db, id, respondOptions = {}) {
|
|
454
|
+
return reply(() => route(request, db, id === void 0 ? [] : [id], false), respondOptions);
|
|
455
|
+
},
|
|
456
|
+
serve(request, db, subpath, respondOptions = {}) {
|
|
457
|
+
const segments = splitPath(subpath);
|
|
458
|
+
return reply(async () => segments.ok ? route(request, db, segments.data, true) : [segments], respondOptions);
|
|
459
|
+
}
|
|
460
|
+
};
|
|
461
|
+
}
|
|
462
|
+
//#endregion
|
|
463
|
+
export { actionFits as n, defineAction as r, defineResource as t };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { n as ResourceActionSpec } from "./resource--vTrBe6I.js";
|
|
2
|
+
import { i as ResourceContext, n as Parsed, r as ResourceAction, t as ActionArgs } from "./resource-types-CqB6GWGT.js";
|
|
3
|
+
import { StandardSchemaV1 } from "@standard-schema/spec";
|
|
4
|
+
//#region src/server/resource-execute.d.ts
|
|
5
|
+
/** Defines an action and types its handler's `data` and `query` from the schemas. */
|
|
6
|
+
declare function defineAction<DbT = unknown, Ref = string, I extends StandardSchemaV1 | undefined = undefined, Q extends StandardSchemaV1 | undefined = undefined>(action: Omit<ResourceActionSpec<Ref>, "input" | "query"> & {
|
|
7
|
+
readonly input?: I;
|
|
8
|
+
readonly query?: Q;
|
|
9
|
+
handler(ctx: ResourceContext<DbT>, args: ActionArgs<Parsed<I>, Parsed<Q>>): unknown;
|
|
10
|
+
}): ResourceAction<Ref, DbT>;
|
|
11
|
+
//#endregion
|
|
12
|
+
export { defineAction as t };
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
//#region src/spec/resource-schemas.ts
|
|
2
|
+
/** The `after` or `page` parameter and `size` of a list, for the spec and the MCP tools alike. */
|
|
3
|
+
function pageQuery(cursor, maxPageSize) {
|
|
4
|
+
return [cursor ? {
|
|
5
|
+
name: "after",
|
|
6
|
+
description: "`nextCursor` of the previous page. Leave it out for the first page.",
|
|
7
|
+
schema: { type: "string" }
|
|
8
|
+
} : {
|
|
9
|
+
name: "page",
|
|
10
|
+
description: "1-based page number.",
|
|
11
|
+
schema: {
|
|
12
|
+
type: "integer",
|
|
13
|
+
minimum: 1,
|
|
14
|
+
default: 1
|
|
15
|
+
}
|
|
16
|
+
}, {
|
|
17
|
+
name: "size",
|
|
18
|
+
description: "Page size.",
|
|
19
|
+
schema: {
|
|
20
|
+
type: "integer",
|
|
21
|
+
minimum: 1,
|
|
22
|
+
maximum: maxPageSize,
|
|
23
|
+
default: 50
|
|
24
|
+
}
|
|
25
|
+
}];
|
|
26
|
+
}
|
|
27
|
+
/** The list input as one object schema, for tools that take a body. */
|
|
28
|
+
function pageInputSchema(cursor, maxPageSize) {
|
|
29
|
+
return {
|
|
30
|
+
type: "object",
|
|
31
|
+
properties: Object.fromEntries(pageQuery(cursor, maxPageSize).map((p) => [p.name, p.schema])),
|
|
32
|
+
additionalProperties: false
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/** The page a list answers with: `items` plus the cursor or the page counts. */
|
|
36
|
+
function pageSchema(row, cursor) {
|
|
37
|
+
const items = {
|
|
38
|
+
type: "array",
|
|
39
|
+
items: row
|
|
40
|
+
};
|
|
41
|
+
return cursor ? {
|
|
42
|
+
type: "object",
|
|
43
|
+
required: [
|
|
44
|
+
"items",
|
|
45
|
+
"nextCursor",
|
|
46
|
+
"hasMore"
|
|
47
|
+
],
|
|
48
|
+
properties: {
|
|
49
|
+
items,
|
|
50
|
+
nextCursor: { type: ["string", "null"] },
|
|
51
|
+
hasMore: { type: "boolean" }
|
|
52
|
+
}
|
|
53
|
+
} : {
|
|
54
|
+
type: "object",
|
|
55
|
+
required: ["items", "page"],
|
|
56
|
+
properties: {
|
|
57
|
+
items,
|
|
58
|
+
page: {
|
|
59
|
+
type: "object",
|
|
60
|
+
required: [
|
|
61
|
+
"number",
|
|
62
|
+
"size",
|
|
63
|
+
"total",
|
|
64
|
+
"pages",
|
|
65
|
+
"hasMore"
|
|
66
|
+
],
|
|
67
|
+
properties: {
|
|
68
|
+
number: { type: "integer" },
|
|
69
|
+
size: { type: "integer" },
|
|
70
|
+
total: { type: ["integer", "null"] },
|
|
71
|
+
pages: { type: ["integer", "null"] },
|
|
72
|
+
hasMore: { type: "boolean" }
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
//#endregion
|
|
79
|
+
export { pageQuery as n, pageSchema as r, pageInputSchema as t };
|