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
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { c as SpecDiagnostic, r as DocumentFormat } from "../format-DTXdu8ya.js";
|
|
2
|
+
import { B as TopicInput, C as ApiSource, F as BlockEventSchema, I as BlockEventSchemas, L as CLOUD_EVENT_TRAIT, R as CloudEventsInput, n as DefineApiOptions, z as EventsOptions } from "../api-Dnf2q-Ht.js";
|
|
3
|
+
import { t as SPEC_PINS } from "../spec-pins-CwzDY25w.js";
|
|
4
|
+
//#region src/asyncapi/types.d.ts
|
|
5
|
+
type Json = Record<string, unknown>;
|
|
6
|
+
/** The AsyncAPI versions `asyncapiFormat` renders. */
|
|
7
|
+
type AsyncApiVersion = "3.0" | "3.1";
|
|
8
|
+
/** The file name `asyncapiFormat` writes; Arazzo source descriptions point at it. */
|
|
9
|
+
export declare const ASYNCAPI_FILE_NAME = "asyncapi.json";
|
|
10
|
+
interface AsyncApiInfo {
|
|
11
|
+
readonly title: string;
|
|
12
|
+
readonly version: string;
|
|
13
|
+
readonly description?: string;
|
|
14
|
+
readonly termsOfService?: string;
|
|
15
|
+
readonly contact?: {
|
|
16
|
+
readonly name?: string;
|
|
17
|
+
readonly url?: string;
|
|
18
|
+
readonly email?: string;
|
|
19
|
+
};
|
|
20
|
+
readonly license?: {
|
|
21
|
+
readonly name: string;
|
|
22
|
+
readonly url?: string;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
interface AsyncApiComponents {
|
|
26
|
+
readonly schemas?: Readonly<Record<string, Json>>;
|
|
27
|
+
readonly messages?: Readonly<Record<string, Json>>;
|
|
28
|
+
readonly messageTraits?: Readonly<Record<string, Json>>;
|
|
29
|
+
readonly securitySchemes?: Readonly<Record<string, Json>>;
|
|
30
|
+
}
|
|
31
|
+
interface AsyncApiDocumentBase {
|
|
32
|
+
readonly info: AsyncApiInfo;
|
|
33
|
+
readonly defaultContentType: string;
|
|
34
|
+
readonly servers?: Readonly<Record<string, Json>>;
|
|
35
|
+
/** Channel id to Channel Object. */
|
|
36
|
+
readonly channels: Readonly<Record<string, Json>>;
|
|
37
|
+
/** Operation id to Operation Object. */
|
|
38
|
+
readonly operations: Readonly<Record<string, Json>>;
|
|
39
|
+
readonly components: AsyncApiComponents;
|
|
40
|
+
readonly [extension: `x-${string}`]: unknown;
|
|
41
|
+
}
|
|
42
|
+
interface AsyncApi30Document extends AsyncApiDocumentBase {
|
|
43
|
+
readonly asyncapi: typeof SPEC_PINS.asyncapi30;
|
|
44
|
+
}
|
|
45
|
+
/** AsyncAPI 3.1 adds the `ros2` bindings; the rest matches 3.0. */
|
|
46
|
+
interface AsyncApi31Document extends AsyncApiDocumentBase {
|
|
47
|
+
readonly asyncapi: typeof SPEC_PINS.asyncapi31;
|
|
48
|
+
}
|
|
49
|
+
interface AsyncApiDocuments {
|
|
50
|
+
readonly "3.0": AsyncApi30Document;
|
|
51
|
+
readonly "3.1": AsyncApi31Document;
|
|
52
|
+
}
|
|
53
|
+
type AsyncApiDocument<V extends AsyncApiVersion = "3.0"> = AsyncApiDocuments[V];
|
|
54
|
+
type AnyAsyncApiDocument = AsyncApiDocuments[AsyncApiVersion];
|
|
55
|
+
/** What an AsyncAPI `transform` receives, discriminated by `version`. */
|
|
56
|
+
type RenderedAsyncApi = { readonly [V in AsyncApiVersion]: {
|
|
57
|
+
readonly format: "asyncapi";
|
|
58
|
+
readonly version: V;
|
|
59
|
+
readonly document: AsyncApiDocuments[V];
|
|
60
|
+
}; }[AsyncApiVersion];
|
|
61
|
+
//#endregion
|
|
62
|
+
//#region src/asyncapi/format.d.ts
|
|
63
|
+
/**
|
|
64
|
+
* AsyncAPI as a `DocumentFormat`, for the events the API model describes:
|
|
65
|
+
* Realtime table change signals and broadcast topics on the Supabase
|
|
66
|
+
* Realtime websocket (`ws` bindings), CloudEvents (headers as the
|
|
67
|
+
* `cloudEvent` message trait), outgoing webhooks over HTTP and the events
|
|
68
|
+
* HTTP operations emit. 3.0 is the default; 3.1 only adds `ros2` bindings,
|
|
69
|
+
* so the two documents differ in the `asyncapi` field.
|
|
70
|
+
*/
|
|
71
|
+
export declare const asyncapiFormat: DocumentFormat<"asyncapi", AsyncApiVersion, AnyAsyncApiDocument, AsyncApiDocuments>;
|
|
72
|
+
//#endregion
|
|
73
|
+
//#region src/asyncapi/index.d.ts
|
|
74
|
+
export interface AsyncApiOptions<V extends AsyncApiVersion = "3.0", Ref = string> extends DefineApiOptions<Ref> {
|
|
75
|
+
/** Defaults to 3.0, which more tools read; 3.1 only adds `ros2` bindings. */
|
|
76
|
+
readonly version?: V;
|
|
77
|
+
/** Last change to the document before overlays; it receives a copy. */
|
|
78
|
+
readonly transform?: (rendered: Extract<RenderedAsyncApi, {
|
|
79
|
+
readonly version: V;
|
|
80
|
+
}>) => AnyAsyncApiDocument | undefined;
|
|
81
|
+
readonly overlays?: readonly unknown[];
|
|
82
|
+
/** Hears every warning and info finding. Errors throw. */
|
|
83
|
+
readonly onDiagnostic?: (diagnostic: SpecDiagnostic) => void;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* An AsyncAPI document for the app's events: Realtime table change signals
|
|
87
|
+
* and broadcast topics, CloudEvents for row and block events, outgoing
|
|
88
|
+
* webhooks and the events HTTP operations emit. Pass `events` (and
|
|
89
|
+
* `realtimeUrl` for the websocket server). Throws when building or checking
|
|
90
|
+
* the document finds an error; use `defineApi(...).render(asyncapiFormat)`
|
|
91
|
+
* to read every finding instead.
|
|
92
|
+
*
|
|
93
|
+
* ```ts
|
|
94
|
+
* const doc = createAsyncApi(betterSupabase, {
|
|
95
|
+
* info: { title: "CRM events", version: "1.0.0" },
|
|
96
|
+
* realtimeUrl: "wss://example.supabase.co/realtime/v1/websocket",
|
|
97
|
+
* events: { tables: ["customers"], cloudEvents: { source: "/crm", blocks: { "support.started": true } } },
|
|
98
|
+
* });
|
|
99
|
+
* ```
|
|
100
|
+
*/
|
|
101
|
+
export declare function createAsyncApi<V extends AsyncApiVersion = "3.0", Ref = string>(betterSupabase: ApiSource, options: AsyncApiOptions<V, Ref>): AsyncApiDocuments[V];
|
|
102
|
+
//#endregion
|
|
103
|
+
export { type AnyAsyncApiDocument, type AsyncApi30Document, type AsyncApi31Document, type AsyncApiComponents, type AsyncApiDocument, type AsyncApiDocuments, type AsyncApiInfo, type AsyncApiVersion, type BlockEventSchema, type BlockEventSchemas, CLOUD_EVENT_TRAIT, type CloudEventsInput, type EventsOptions, type RenderedAsyncApi, type TopicInput };
|
|
@@ -0,0 +1,569 @@
|
|
|
1
|
+
import { r as isPlainObject } from "../clone-dN9XOL1K.js";
|
|
2
|
+
import { t as SPEC_PINS } from "../spec-pins-DsLfUH7l.js";
|
|
3
|
+
import { o as defineDocumentFormat, t as defineApi } from "../api-DtHFC037.js";
|
|
4
|
+
import { a as safeKey, i as CLOUD_EVENT_TRAIT, l as pointerToken, s as pascal } from "../build-hPwk3_X5.js";
|
|
5
|
+
import { t as ASYNCAPI_FILE_NAME } from "../types-BRTSpOIh.js";
|
|
6
|
+
//#region src/asyncapi/format.ts
|
|
7
|
+
const ASYNCAPI_FIELD = {
|
|
8
|
+
"3.0": SPEC_PINS.asyncapi30,
|
|
9
|
+
"3.1": SPEC_PINS.asyncapi31
|
|
10
|
+
};
|
|
11
|
+
const SCHEMA_PREFIX = "#/components/schemas/";
|
|
12
|
+
const KEY = /^[A-Za-z0-9_-]+$/;
|
|
13
|
+
const PARAM = /\{([^}]+)\}/g;
|
|
14
|
+
/** JSON Schema 2020-12 keywords the AsyncAPI Schema Object (draft-07) lacks. */
|
|
15
|
+
const KEYWORDS_2020 = /* @__PURE__ */ new Set([
|
|
16
|
+
"$defs",
|
|
17
|
+
"$anchor",
|
|
18
|
+
"$dynamicRef",
|
|
19
|
+
"$dynamicAnchor",
|
|
20
|
+
"prefixItems",
|
|
21
|
+
"dependentSchemas",
|
|
22
|
+
"dependentRequired",
|
|
23
|
+
"unevaluatedProperties",
|
|
24
|
+
"unevaluatedItems"
|
|
25
|
+
]);
|
|
26
|
+
/** The query Supabase Realtime reads on the websocket upgrade. */
|
|
27
|
+
const WS_BINDING = { ws: {
|
|
28
|
+
method: "GET",
|
|
29
|
+
query: {
|
|
30
|
+
type: "object",
|
|
31
|
+
required: ["apikey"],
|
|
32
|
+
properties: {
|
|
33
|
+
apikey: {
|
|
34
|
+
type: "string",
|
|
35
|
+
description: "The project's publishable (anon) key."
|
|
36
|
+
},
|
|
37
|
+
vsn: {
|
|
38
|
+
type: "string",
|
|
39
|
+
description: "Realtime protocol version."
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
bindingVersion: "0.1.0"
|
|
44
|
+
} };
|
|
45
|
+
const STANDARD_WEBHOOK_HEADERS = {
|
|
46
|
+
type: "object",
|
|
47
|
+
required: [
|
|
48
|
+
"webhook-id",
|
|
49
|
+
"webhook-timestamp",
|
|
50
|
+
"webhook-signature"
|
|
51
|
+
],
|
|
52
|
+
properties: {
|
|
53
|
+
"webhook-id": {
|
|
54
|
+
type: "string",
|
|
55
|
+
description: "Unique message id; the same on every retry."
|
|
56
|
+
},
|
|
57
|
+
"webhook-timestamp": {
|
|
58
|
+
type: "string",
|
|
59
|
+
pattern: "^[0-9]+$",
|
|
60
|
+
description: "Unix time in seconds when the message was sent."
|
|
61
|
+
},
|
|
62
|
+
"webhook-signature": {
|
|
63
|
+
type: "string",
|
|
64
|
+
description: "Space-separated signatures of `id.timestamp.body`, each `v1,<base64>`."
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
const omitUndefined = (value) => Object.fromEntries(Object.entries(value).filter(([, entry]) => entry !== void 0));
|
|
69
|
+
function collectRefs(value, out) {
|
|
70
|
+
if (Array.isArray(value)) for (const item of value) collectRefs(item, out);
|
|
71
|
+
else if (isPlainObject(value)) for (const [key, item] of Object.entries(value)) if (key === "$ref" && typeof item === "string") out.add(item);
|
|
72
|
+
else collectRefs(item, out);
|
|
73
|
+
}
|
|
74
|
+
function uses2020(value) {
|
|
75
|
+
if (Array.isArray(value)) return value.some(uses2020);
|
|
76
|
+
if (!isPlainObject(value)) return false;
|
|
77
|
+
return Object.entries(value).some(([key, item]) => KEYWORDS_2020.has(key) || uses2020(item));
|
|
78
|
+
}
|
|
79
|
+
/** Component names a set of values references, with everything they reference. */
|
|
80
|
+
function referencedSchemas(model, roots) {
|
|
81
|
+
const out = {};
|
|
82
|
+
const pending = [];
|
|
83
|
+
const visit = (value) => {
|
|
84
|
+
const refs = /* @__PURE__ */ new Set();
|
|
85
|
+
collectRefs(value, refs);
|
|
86
|
+
for (const ref of refs) {
|
|
87
|
+
if (!ref.startsWith(SCHEMA_PREFIX)) continue;
|
|
88
|
+
const name = ref.slice(21).replaceAll("~1", "/").replaceAll("~0", "~");
|
|
89
|
+
if (name in out || !model.schemas[name]) continue;
|
|
90
|
+
out[name] = model.schemas[name];
|
|
91
|
+
pending.push(name);
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
for (const root of roots) visit(root);
|
|
95
|
+
while (pending.length > 0) {
|
|
96
|
+
const name = pending.pop();
|
|
97
|
+
if (name !== void 0) visit(out[name]);
|
|
98
|
+
}
|
|
99
|
+
const sorted = {};
|
|
100
|
+
for (const name of Object.keys(out).toSorted()) {
|
|
101
|
+
const schema = out[name];
|
|
102
|
+
if (schema) sorted[name] = structuredClone(schema);
|
|
103
|
+
}
|
|
104
|
+
return sorted;
|
|
105
|
+
}
|
|
106
|
+
function lowerScheme(name, scheme, ctx) {
|
|
107
|
+
switch (scheme.type) {
|
|
108
|
+
case "http": return omitUndefined({ ...scheme });
|
|
109
|
+
case "apiKey": return omitUndefined({
|
|
110
|
+
type: "httpApiKey",
|
|
111
|
+
name: scheme.name,
|
|
112
|
+
in: scheme.in,
|
|
113
|
+
description: scheme.description
|
|
114
|
+
});
|
|
115
|
+
case "openIdConnect": return omitUndefined({ ...scheme });
|
|
116
|
+
case "oauth2": {
|
|
117
|
+
const flows = {};
|
|
118
|
+
for (const [flow, value] of Object.entries(scheme.flows)) {
|
|
119
|
+
const { scopes, ...rest } = value;
|
|
120
|
+
flows[flow] = omitUndefined({
|
|
121
|
+
...rest,
|
|
122
|
+
availableScopes: { ...scopes }
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
return omitUndefined({
|
|
126
|
+
type: "oauth2",
|
|
127
|
+
description: scheme.description,
|
|
128
|
+
flows
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
case "profile":
|
|
132
|
+
ctx.report({
|
|
133
|
+
code: "asyncapi-security-unsupported",
|
|
134
|
+
severity: "info",
|
|
135
|
+
message: `Security scheme "${name}" uses Security Profiles, which AsyncAPI cannot describe; it is left out`,
|
|
136
|
+
pointer: `/components/securitySchemes/${pointerToken(name)}`
|
|
137
|
+
});
|
|
138
|
+
return;
|
|
139
|
+
default: return scheme;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
function lowerMessage(message, prefix) {
|
|
143
|
+
return omitUndefined({
|
|
144
|
+
name: message.name,
|
|
145
|
+
title: message.title,
|
|
146
|
+
summary: message.summary,
|
|
147
|
+
description: message.description,
|
|
148
|
+
contentType: message.contentType,
|
|
149
|
+
headers: message.headers ? structuredClone(message.headers) : void 0,
|
|
150
|
+
payload: structuredClone(message.payload),
|
|
151
|
+
correlationId: message.correlationId ? { location: message.correlationId } : void 0,
|
|
152
|
+
traits: message.traits?.map((trait) => ({ $ref: `#/components/messageTraits/${safeKey(trait)}` })),
|
|
153
|
+
...Object.fromEntries(Object.entries(message.extensions ?? {}).map(([key, value]) => [key.startsWith("x-") ? key : `${prefix}${key}`, value]))
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
function lowerTrait(trait) {
|
|
157
|
+
return omitUndefined({
|
|
158
|
+
...trait,
|
|
159
|
+
headers: trait.headers ? structuredClone(trait.headers) : void 0
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
function webhookMessage(webhook) {
|
|
163
|
+
return {
|
|
164
|
+
id: `webhook${safeKey(pascal(webhook.id))}`,
|
|
165
|
+
name: webhook.id,
|
|
166
|
+
title: webhook.id,
|
|
167
|
+
...webhook.summary ? { summary: webhook.summary } : {},
|
|
168
|
+
...webhook.description ? { description: webhook.description } : {},
|
|
169
|
+
contentType: "application/json",
|
|
170
|
+
...webhook.standardWebhooks ? { headers: STANDARD_WEBHOOK_HEADERS } : {},
|
|
171
|
+
payload: webhook.payload
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
/** A server from a URL: `host` and `pathname` split, the scheme as protocol. */
|
|
175
|
+
function serverFrom(url, fields, wsDefault) {
|
|
176
|
+
let parsed;
|
|
177
|
+
try {
|
|
178
|
+
parsed = new URL(url);
|
|
179
|
+
} catch {
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
const scheme = parsed.protocol.slice(0, -1);
|
|
183
|
+
const protocol = wsDefault ? scheme === "http" || scheme === "ws" ? "ws" : "wss" : scheme;
|
|
184
|
+
const pathname = parsed.pathname === "/" ? void 0 : parsed.pathname;
|
|
185
|
+
return omitUndefined({
|
|
186
|
+
host: parsed.host,
|
|
187
|
+
protocol,
|
|
188
|
+
pathname,
|
|
189
|
+
...fields
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
function lowerAsyncApi(model, version, ctx) {
|
|
193
|
+
const prefix = model.extensionPrefix;
|
|
194
|
+
const keyOf = (id, where) => {
|
|
195
|
+
if (KEY.test(id)) return id;
|
|
196
|
+
const key = safeKey(id);
|
|
197
|
+
ctx.report({
|
|
198
|
+
code: "asyncapi-key-invalid",
|
|
199
|
+
severity: "info",
|
|
200
|
+
message: `${where} "${id}" is written as "${key}"; AsyncAPI keys allow letters, digits, "_" and "-"`
|
|
201
|
+
});
|
|
202
|
+
return key;
|
|
203
|
+
};
|
|
204
|
+
const securitySchemes = {};
|
|
205
|
+
for (const [name, scheme] of Object.entries(model.securitySchemes)) {
|
|
206
|
+
const lowered = lowerScheme(name, scheme, ctx);
|
|
207
|
+
if (lowered) securitySchemes[safeKey(name)] = lowered;
|
|
208
|
+
}
|
|
209
|
+
const security = [];
|
|
210
|
+
for (const requirement of model.security) {
|
|
211
|
+
const names = Object.keys(requirement);
|
|
212
|
+
if (names.length > 1) ctx.report({
|
|
213
|
+
code: "asyncapi-security-combined",
|
|
214
|
+
severity: "info",
|
|
215
|
+
message: `A requirement that needs ${names.join(" and ")} together is listed as alternatives; AsyncAPI security lists have no AND`,
|
|
216
|
+
pointer: "/security"
|
|
217
|
+
});
|
|
218
|
+
for (const name of names) {
|
|
219
|
+
const key = safeKey(name);
|
|
220
|
+
if (key in securitySchemes && !security.some((entry) => entry["$ref"] === `#/components/securitySchemes/${key}`)) security.push({ $ref: `#/components/securitySchemes/${key}` });
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
const webhookMessages = model.webhooks.map(webhookMessage);
|
|
224
|
+
const allMessages = { ...model.messages };
|
|
225
|
+
for (const message of webhookMessages) allMessages[message.id] = message;
|
|
226
|
+
const channels = [...model.channels];
|
|
227
|
+
if (webhookMessages.length > 0) channels.push({
|
|
228
|
+
id: "webhooks",
|
|
229
|
+
address: "",
|
|
230
|
+
title: "Outgoing webhooks",
|
|
231
|
+
description: "Webhooks the app sends to each receiver's URL, signed per Standard Webhooks when the headers are listed.",
|
|
232
|
+
protocol: "http",
|
|
233
|
+
messages: webhookMessages.map((message) => message.id),
|
|
234
|
+
operations: model.webhooks.map((webhook, index) => ({
|
|
235
|
+
id: `send${safeKey(pascal(webhook.id))}Webhook`,
|
|
236
|
+
action: "send",
|
|
237
|
+
...webhook.summary ? { summary: webhook.summary } : {},
|
|
238
|
+
messages: [webhookMessages[index]?.id ?? webhook.id]
|
|
239
|
+
}))
|
|
240
|
+
});
|
|
241
|
+
const servers = {};
|
|
242
|
+
const wsServers = [];
|
|
243
|
+
const httpServers = [];
|
|
244
|
+
const hasWs = channels.some((channel) => channel.protocol === "ws");
|
|
245
|
+
const hasHttp = channels.some((channel) => channel.protocol === "http");
|
|
246
|
+
if (hasWs && model.realtimeUrl) {
|
|
247
|
+
const server = serverFrom(model.realtimeUrl, {
|
|
248
|
+
title: "Supabase Realtime",
|
|
249
|
+
description: "The Realtime websocket. Private channels need the user's access token.",
|
|
250
|
+
security: security.length > 0 ? security : void 0
|
|
251
|
+
}, true);
|
|
252
|
+
if (server) {
|
|
253
|
+
servers["realtime"] = server;
|
|
254
|
+
wsServers.push({ $ref: "#/servers/realtime" });
|
|
255
|
+
} else ctx.report({
|
|
256
|
+
code: "asyncapi-realtime-url-invalid",
|
|
257
|
+
severity: "error",
|
|
258
|
+
message: `realtimeUrl "${model.realtimeUrl}" is not an absolute URL`,
|
|
259
|
+
pointer: "/servers/realtime"
|
|
260
|
+
});
|
|
261
|
+
} else if (hasWs) ctx.report({
|
|
262
|
+
code: "asyncapi-server-missing",
|
|
263
|
+
severity: "warning",
|
|
264
|
+
message: "Realtime channels are described without a server; set realtimeUrl to add the Realtime websocket",
|
|
265
|
+
pointer: "/servers"
|
|
266
|
+
});
|
|
267
|
+
if (hasHttp) model.servers.forEach((entry, index) => {
|
|
268
|
+
const key = safeKey(entry.name ?? (index === 0 ? "api" : `api${String(index + 1)}`));
|
|
269
|
+
const server = serverFrom(entry.url, omitUndefined({ description: entry.description }), false);
|
|
270
|
+
if (!server || key in servers) return;
|
|
271
|
+
servers[key] = server;
|
|
272
|
+
httpServers.push({ $ref: `#/servers/${key}` });
|
|
273
|
+
});
|
|
274
|
+
const messageKeys = /* @__PURE__ */ new Map();
|
|
275
|
+
const messages = {};
|
|
276
|
+
for (const [id, message] of Object.entries(allMessages)) {
|
|
277
|
+
const key = keyOf(id, "Message");
|
|
278
|
+
messageKeys.set(id, key);
|
|
279
|
+
messages[key] = lowerMessage(message, prefix);
|
|
280
|
+
if (uses2020(message.payload) || uses2020(message.headers)) ctx.report({
|
|
281
|
+
code: "asyncapi-schema-dialect",
|
|
282
|
+
severity: "warning",
|
|
283
|
+
message: `Message "${id}" uses JSON Schema 2020-12 keywords that the AsyncAPI Schema Object (draft-07) does not define`,
|
|
284
|
+
pointer: `/components/messages/${pointerToken(key)}`
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
const channelObjects = {};
|
|
288
|
+
const operations = {};
|
|
289
|
+
const placed = [];
|
|
290
|
+
const addOperation = (key, operation, pointer) => {
|
|
291
|
+
if (key in operations) {
|
|
292
|
+
ctx.report({
|
|
293
|
+
code: "asyncapi-operation-id-duplicate",
|
|
294
|
+
severity: "error",
|
|
295
|
+
message: `Two operations have the id "${key}"; the first one is kept`,
|
|
296
|
+
pointer
|
|
297
|
+
});
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
operations[key] = operation;
|
|
301
|
+
};
|
|
302
|
+
for (const channel of channels) {
|
|
303
|
+
const key = keyOf(channel.id, "Channel");
|
|
304
|
+
if (key in channelObjects) {
|
|
305
|
+
ctx.report({
|
|
306
|
+
code: "asyncapi-channel-id-duplicate",
|
|
307
|
+
severity: "error",
|
|
308
|
+
message: `Two channels have the id "${key}"; the first one is kept`,
|
|
309
|
+
pointer: `/channels/${pointerToken(key)}`
|
|
310
|
+
});
|
|
311
|
+
continue;
|
|
312
|
+
}
|
|
313
|
+
placed.push({
|
|
314
|
+
key,
|
|
315
|
+
channel
|
|
316
|
+
});
|
|
317
|
+
const channelMessages = {};
|
|
318
|
+
for (const id of channel.messages) {
|
|
319
|
+
const messageKey = messageKeys.get(id);
|
|
320
|
+
if (messageKey === void 0) {
|
|
321
|
+
ctx.report({
|
|
322
|
+
code: "asyncapi-message-unknown",
|
|
323
|
+
severity: "error",
|
|
324
|
+
message: `Channel "${channel.id}" lists an unknown message "${id}"`,
|
|
325
|
+
pointer: `/channels/${pointerToken(key)}/messages`
|
|
326
|
+
});
|
|
327
|
+
continue;
|
|
328
|
+
}
|
|
329
|
+
channelMessages[messageKey] = { $ref: `#/components/messages/${messageKey}` };
|
|
330
|
+
}
|
|
331
|
+
const names = [...channel.address.matchAll(PARAM)].map((match) => match[1] ?? "");
|
|
332
|
+
const parameters = names.length > 0 ? Object.fromEntries(names.map((name) => [name, omitUndefined({ ...channel.parameters?.[name] })])) : void 0;
|
|
333
|
+
const serverRefs = channel.protocol === "ws" ? wsServers : httpServers;
|
|
334
|
+
channelObjects[key] = omitUndefined({
|
|
335
|
+
address: channel.address === "" ? null : channel.address,
|
|
336
|
+
title: channel.title,
|
|
337
|
+
summary: channel.summary,
|
|
338
|
+
description: channel.description,
|
|
339
|
+
servers: serverRefs.length > 0 ? serverRefs.map((ref) => ({ ...ref })) : void 0,
|
|
340
|
+
parameters,
|
|
341
|
+
messages: channelMessages,
|
|
342
|
+
bindings: channel.protocol === "ws" ? structuredClone(WS_BINDING) : void 0,
|
|
343
|
+
...channel.extensions
|
|
344
|
+
});
|
|
345
|
+
for (const operation of channel.operations) {
|
|
346
|
+
const operationKey = keyOf(operation.id, "Operation");
|
|
347
|
+
const refs = [];
|
|
348
|
+
for (const id of operation.messages ?? []) {
|
|
349
|
+
const messageKey = messageKeys.get(id);
|
|
350
|
+
if (messageKey === void 0 || !channel.messages.includes(id)) {
|
|
351
|
+
ctx.report({
|
|
352
|
+
code: "asyncapi-operation-message-unknown",
|
|
353
|
+
severity: "error",
|
|
354
|
+
message: `Operation "${operation.id}" lists "${id}", which is not a message of channel "${channel.id}"`,
|
|
355
|
+
pointer: `/operations/${pointerToken(operationKey)}`
|
|
356
|
+
});
|
|
357
|
+
continue;
|
|
358
|
+
}
|
|
359
|
+
refs.push({ $ref: `#/channels/${key}/messages/${messageKey}` });
|
|
360
|
+
}
|
|
361
|
+
addOperation(operationKey, omitUndefined({
|
|
362
|
+
action: operation.action,
|
|
363
|
+
channel: { $ref: `#/channels/${key}` },
|
|
364
|
+
summary: operation.summary,
|
|
365
|
+
description: operation.description,
|
|
366
|
+
messages: operation.messages ? refs : void 0,
|
|
367
|
+
[`${prefix}permission`]: operation.permission,
|
|
368
|
+
...operation.extensions
|
|
369
|
+
}), `/operations/${pointerToken(operationKey)}`);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
for (const operation of model.operations) {
|
|
373
|
+
const emits = operation.extensions[`${prefix}emits`];
|
|
374
|
+
if (!Array.isArray(emits)) continue;
|
|
375
|
+
const byChannel = /* @__PURE__ */ new Map();
|
|
376
|
+
for (const event of emits) {
|
|
377
|
+
if (typeof event !== "string") continue;
|
|
378
|
+
const target = placed.find(({ channel }) => channel.messages.some((id) => {
|
|
379
|
+
const message = allMessages[id];
|
|
380
|
+
return id === event || message?.name === event || message?.name?.endsWith(`.${event}`) === true;
|
|
381
|
+
}));
|
|
382
|
+
const id = target?.channel.messages.find((candidate) => {
|
|
383
|
+
const message = allMessages[candidate];
|
|
384
|
+
return candidate === event || message?.name === event || message?.name?.endsWith(`.${event}`) === true;
|
|
385
|
+
});
|
|
386
|
+
if (!target || id === void 0) {
|
|
387
|
+
ctx.report({
|
|
388
|
+
code: "asyncapi-emits-unknown",
|
|
389
|
+
severity: "warning",
|
|
390
|
+
message: `Operation "${operation.id}" emits "${event}", which no message describes`,
|
|
391
|
+
pointer: `/operations/${pointerToken(operation.id)}`
|
|
392
|
+
});
|
|
393
|
+
continue;
|
|
394
|
+
}
|
|
395
|
+
const list = byChannel.get(target.key) ?? [];
|
|
396
|
+
list.push(messageKeys.get(id) ?? id);
|
|
397
|
+
byChannel.set(target.key, list);
|
|
398
|
+
}
|
|
399
|
+
const many = byChannel.size > 1;
|
|
400
|
+
for (const [channelKey, keys] of byChannel) {
|
|
401
|
+
const operationKey = safeKey(many ? `${operation.id}Emits${pascal(channelKey)}` : `${operation.id}Emits`);
|
|
402
|
+
addOperation(operationKey, {
|
|
403
|
+
action: "send",
|
|
404
|
+
channel: { $ref: `#/channels/${channelKey}` },
|
|
405
|
+
summary: `Events sent by ${operation.method.toUpperCase()} ${operation.path}`,
|
|
406
|
+
messages: [...new Set(keys)].map((messageKey) => ({ $ref: `#/channels/${channelKey}/messages/${messageKey}` })),
|
|
407
|
+
[`${prefix}operation`]: operation.id
|
|
408
|
+
}, `/operations/${pointerToken(operationKey)}`);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
const traits = {};
|
|
412
|
+
for (const [name, trait] of Object.entries(model.messageTraits ?? {})) traits[safeKey(name)] = lowerTrait(trait);
|
|
413
|
+
const schemas = referencedSchemas(model, [Object.values(messages), Object.values(traits)]);
|
|
414
|
+
const { info } = model;
|
|
415
|
+
const document = omitUndefined({
|
|
416
|
+
asyncapi: ASYNCAPI_FIELD[version],
|
|
417
|
+
info: omitUndefined({
|
|
418
|
+
title: info.title,
|
|
419
|
+
version: info.version,
|
|
420
|
+
description: info.description ?? info.summary,
|
|
421
|
+
termsOfService: info.termsOfService,
|
|
422
|
+
contact: info.contact ? omitUndefined({ ...info.contact }) : void 0,
|
|
423
|
+
license: info.license ? omitUndefined({
|
|
424
|
+
name: info.license.name,
|
|
425
|
+
url: info.license.url
|
|
426
|
+
}) : void 0
|
|
427
|
+
}),
|
|
428
|
+
defaultContentType: "application/json",
|
|
429
|
+
servers: Object.keys(servers).length > 0 ? servers : void 0,
|
|
430
|
+
channels: channelObjects,
|
|
431
|
+
operations,
|
|
432
|
+
components: omitUndefined({
|
|
433
|
+
schemas: Object.keys(schemas).length > 0 ? schemas : void 0,
|
|
434
|
+
messages: Object.keys(messages).length > 0 ? messages : void 0,
|
|
435
|
+
messageTraits: Object.keys(traits).length > 0 ? traits : void 0,
|
|
436
|
+
securitySchemes: Object.keys(securitySchemes).length > 0 ? securitySchemes : void 0
|
|
437
|
+
})
|
|
438
|
+
});
|
|
439
|
+
if (!isAsyncApiDocument(document)) throw new TypeError("better-supabase/asyncapi: lowering lost a required field");
|
|
440
|
+
return document;
|
|
441
|
+
}
|
|
442
|
+
function isAsyncApiDocument(value) {
|
|
443
|
+
return typeof value["asyncapi"] === "string" && isPlainObject(value["info"]) && isPlainObject(value["channels"]) && isPlainObject(value["operations"]) && isPlainObject(value["components"]);
|
|
444
|
+
}
|
|
445
|
+
function resolve(document, ref) {
|
|
446
|
+
if (!ref.startsWith("#/")) return void 0;
|
|
447
|
+
let node = document;
|
|
448
|
+
for (const raw of ref.slice(2).split("/")) {
|
|
449
|
+
const key = raw.replaceAll("~1", "/").replaceAll("~0", "~");
|
|
450
|
+
if (!isPlainObject(node)) return void 0;
|
|
451
|
+
node = node[key];
|
|
452
|
+
}
|
|
453
|
+
return node;
|
|
454
|
+
}
|
|
455
|
+
function refOf(value) {
|
|
456
|
+
return isPlainObject(value) && typeof value["$ref"] === "string" ? value["$ref"] : void 0;
|
|
457
|
+
}
|
|
458
|
+
function lintAsyncApi(document) {
|
|
459
|
+
const diagnostics = [];
|
|
460
|
+
const refs = /* @__PURE__ */ new Set();
|
|
461
|
+
collectRefs(document, refs);
|
|
462
|
+
for (const ref of refs) if (ref.startsWith("#") && resolve(document, ref) === void 0) diagnostics.push({
|
|
463
|
+
code: "asyncapi-ref-unresolved",
|
|
464
|
+
severity: "error",
|
|
465
|
+
message: `$ref "${ref}" does not resolve inside the document`
|
|
466
|
+
});
|
|
467
|
+
for (const [key, channel] of Object.entries(document.channels)) {
|
|
468
|
+
const pointer = `/channels/${pointerToken(key)}`;
|
|
469
|
+
if (!KEY.test(key)) diagnostics.push({
|
|
470
|
+
code: "asyncapi-key-invalid",
|
|
471
|
+
severity: "error",
|
|
472
|
+
message: `Channel id "${key}" has characters AsyncAPI keys do not allow`,
|
|
473
|
+
pointer
|
|
474
|
+
});
|
|
475
|
+
const address = channel["address"];
|
|
476
|
+
const names = new Set(typeof address === "string" ? [...address.matchAll(PARAM)].map((match) => match[1] ?? "") : []);
|
|
477
|
+
const parameters = isPlainObject(channel["parameters"]) ? Object.keys(channel["parameters"]) : [];
|
|
478
|
+
for (const name of parameters) if (!names.has(name)) diagnostics.push({
|
|
479
|
+
code: "asyncapi-parameter-unknown",
|
|
480
|
+
severity: "error",
|
|
481
|
+
message: `Parameter "${name}" is not in the address of channel "${key}"`,
|
|
482
|
+
pointer: `${pointer}/parameters`
|
|
483
|
+
});
|
|
484
|
+
for (const name of names) if (!parameters.includes(name)) diagnostics.push({
|
|
485
|
+
code: "asyncapi-parameter-missing",
|
|
486
|
+
severity: "error",
|
|
487
|
+
message: `Address expression "{${name}}" of channel "${key}" has no parameter`,
|
|
488
|
+
pointer: `${pointer}/parameters`
|
|
489
|
+
});
|
|
490
|
+
}
|
|
491
|
+
for (const [key, operation] of Object.entries(document.operations)) {
|
|
492
|
+
const pointer = `/operations/${pointerToken(key)}`;
|
|
493
|
+
const channelRef = refOf(operation["channel"]);
|
|
494
|
+
if (!channelRef?.startsWith("#/channels/")) {
|
|
495
|
+
diagnostics.push({
|
|
496
|
+
code: "asyncapi-operation-channel-unknown",
|
|
497
|
+
severity: "error",
|
|
498
|
+
message: `Operation "${key}" does not reference a root channel`,
|
|
499
|
+
pointer: `${pointer}/channel`
|
|
500
|
+
});
|
|
501
|
+
continue;
|
|
502
|
+
}
|
|
503
|
+
const list = Array.isArray(operation["messages"]) ? operation["messages"] : [];
|
|
504
|
+
for (const entry of list) if (!refOf(entry)?.startsWith(`${channelRef}/messages/`)) diagnostics.push({
|
|
505
|
+
code: "asyncapi-operation-message-unknown",
|
|
506
|
+
severity: "error",
|
|
507
|
+
message: `Operation "${key}" lists a message outside its channel`,
|
|
508
|
+
pointer: `${pointer}/messages`
|
|
509
|
+
});
|
|
510
|
+
}
|
|
511
|
+
return diagnostics;
|
|
512
|
+
}
|
|
513
|
+
/**
|
|
514
|
+
* AsyncAPI as a `DocumentFormat`, for the events the API model describes:
|
|
515
|
+
* Realtime table change signals and broadcast topics on the Supabase
|
|
516
|
+
* Realtime websocket (`ws` bindings), CloudEvents (headers as the
|
|
517
|
+
* `cloudEvent` message trait), outgoing webhooks over HTTP and the events
|
|
518
|
+
* HTTP operations emit. 3.0 is the default; 3.1 only adds `ros2` bindings,
|
|
519
|
+
* so the two documents differ in the `asyncapi` field.
|
|
520
|
+
*/
|
|
521
|
+
const asyncapiFormat = defineDocumentFormat({
|
|
522
|
+
id: "asyncapi",
|
|
523
|
+
versions: {
|
|
524
|
+
"3.0": {
|
|
525
|
+
pin: SPEC_PINS.asyncapi30,
|
|
526
|
+
status: "stable"
|
|
527
|
+
},
|
|
528
|
+
"3.1": {
|
|
529
|
+
pin: SPEC_PINS.asyncapi31,
|
|
530
|
+
status: "stable"
|
|
531
|
+
}
|
|
532
|
+
},
|
|
533
|
+
defaultVersion: "3.0",
|
|
534
|
+
lower: lowerAsyncApi,
|
|
535
|
+
lint: lintAsyncApi,
|
|
536
|
+
fileName: () => ASYNCAPI_FILE_NAME
|
|
537
|
+
});
|
|
538
|
+
//#endregion
|
|
539
|
+
//#region src/asyncapi/index.ts
|
|
540
|
+
/**
|
|
541
|
+
* An AsyncAPI document for the app's events: Realtime table change signals
|
|
542
|
+
* and broadcast topics, CloudEvents for row and block events, outgoing
|
|
543
|
+
* webhooks and the events HTTP operations emit. Pass `events` (and
|
|
544
|
+
* `realtimeUrl` for the websocket server). Throws when building or checking
|
|
545
|
+
* the document finds an error; use `defineApi(...).render(asyncapiFormat)`
|
|
546
|
+
* to read every finding instead.
|
|
547
|
+
*
|
|
548
|
+
* ```ts
|
|
549
|
+
* const doc = createAsyncApi(betterSupabase, {
|
|
550
|
+
* info: { title: "CRM events", version: "1.0.0" },
|
|
551
|
+
* realtimeUrl: "wss://example.supabase.co/realtime/v1/websocket",
|
|
552
|
+
* events: { tables: ["customers"], cloudEvents: { source: "/crm", blocks: { "support.started": true } } },
|
|
553
|
+
* });
|
|
554
|
+
* ```
|
|
555
|
+
*/
|
|
556
|
+
function createAsyncApi(betterSupabase, options) {
|
|
557
|
+
const { version, transform, overlays, onDiagnostic, ...apiOptions } = options;
|
|
558
|
+
const result = defineApi(betterSupabase, apiOptions).render(asyncapiFormat, {
|
|
559
|
+
...version === void 0 ? {} : { version },
|
|
560
|
+
...transform === void 0 ? {} : { transform: (rendered) => transform(rendered) },
|
|
561
|
+
...overlays === void 0 ? {} : { overlays }
|
|
562
|
+
});
|
|
563
|
+
const errors = result.diagnostics.filter((diagnostic) => diagnostic.severity === "error");
|
|
564
|
+
if (errors.length > 0) throw new TypeError(`createAsyncApi: ${errors.map((error) => `${error.code}: ${error.message}${error.pointer ? ` (${error.pointer})` : ""}`).join("; ")}`);
|
|
565
|
+
if (onDiagnostic) for (const diagnostic of result.diagnostics) onDiagnostic(diagnostic);
|
|
566
|
+
return result.document;
|
|
567
|
+
}
|
|
568
|
+
//#endregion
|
|
569
|
+
export { ASYNCAPI_FILE_NAME, CLOUD_EVENT_TRAIT, asyncapiFormat, createAsyncApi };
|