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
|
@@ -1,53 +1,18 @@
|
|
|
1
|
-
import { r as defineCliCommand } from "./command-
|
|
2
|
-
import {
|
|
3
|
-
import { i as plain, r as painter } from "./style-
|
|
4
|
-
import { a as entitlementsMode, n as accessProviderMode, o as moduleKeyProblems, s as providerLabel, t as compiledReadSets } from "./read-sets-
|
|
1
|
+
import { r as defineCliCommand } from "./command-DV-StG1x.js";
|
|
2
|
+
import { a as writeIfChanged, i as sameText, t as display } from "./io-CFzJVJ68.js";
|
|
3
|
+
import { i as plain, r as painter } from "./style-CB3vxgh0.js";
|
|
4
|
+
import { a as entitlementsMode, n as accessProviderMode, o as moduleKeyProblems, s as providerLabel, t as compiledReadSets } from "./read-sets-DjJrm8Wj.js";
|
|
5
5
|
import { t as importFresh } from "./fresh-import-BeYf9I3x.js";
|
|
6
6
|
import { c as migrationCommand, d as schemaPaths, n as declarativeSchemasDir, u as readSupabaseToml } from "./supabase-toml-B-bIukQF.js";
|
|
7
|
-
import { t as fileDiff } from "./diff-
|
|
7
|
+
import { t as fileDiff } from "./diff-D1jGdb3Y.js";
|
|
8
8
|
import { n as moduleLayoutFor, t as migrationsDir } from "./sql-layout-D6cphHT3.js";
|
|
9
|
+
import { r as writeLine } from "./files-BVupXPIC.js";
|
|
9
10
|
import { resolve } from "node:path";
|
|
10
11
|
import { existsSync } from "node:fs";
|
|
11
12
|
import { readFile, readdir, rm } from "node:fs/promises";
|
|
13
|
+
import { CONFIG_DEFAULTS } from "better-supabase/config";
|
|
12
14
|
import { SQL_MODULES, contractSignature, customContracts, moduleBody, moduleFilePaths, moduleFileVersion, moduleLayout, modulePermissionKeys, moduleSchemaExtensions, moduleTopics, renderModules, resolveModules, sameModuleFile, upgradePlan } from "better-supabase/sql";
|
|
13
|
-
//#region src/cli/
|
|
14
|
-
const isTopic = (value) => typeof value === "object" && value !== null && "template" in value && typeof value.template === "string" && "sql" in value && typeof value.sql === "function" && "triggerSql" in value;
|
|
15
|
-
const literalParts = (template) => template.replaceAll(/\{[^}]+\}/g, "{}");
|
|
16
|
-
const owns = (owned, template) => owned.endsWith("*") ? template.startsWith(owned.slice(0, -1)) : literalParts(owned) === literalParts(template);
|
|
17
|
-
const receivesOnly = (sql) => !sql.includes(" for insert ") && !sql.includes("'presence'");
|
|
18
|
-
/** The file `realtime.policies` writes, or `undefined` when it isn't set. */
|
|
19
|
-
async function topicPolicyFile(config, owned = []) {
|
|
20
|
-
const policies = config.realtime.policies;
|
|
21
|
-
if (policies === void 0) return void 0;
|
|
22
|
-
const topics = [];
|
|
23
|
-
for (const entry of policies.from) {
|
|
24
|
-
const loaded = await importFresh(resolve(config.root, entry));
|
|
25
|
-
const found = Object.values(loaded).filter(isTopic);
|
|
26
|
-
if (found.length === 0) throw new Error(`${entry} exports no topic (defineTopic)`);
|
|
27
|
-
for (const topic of found) if (!topics.includes(topic)) topics.push(topic);
|
|
28
|
-
}
|
|
29
|
-
topics.sort((a, b) => a.template < b.template ? -1 : a.template > b.template ? 1 : 0);
|
|
30
|
-
const functions = config.authorization?.functions;
|
|
31
|
-
const sqlOf = (topic) => topic.sql(functions === void 0 ? void 0 : { functions });
|
|
32
|
-
const skipped = [];
|
|
33
|
-
const written = topics.filter((topic) => {
|
|
34
|
-
const owner = owned.find((entry) => owns(entry.topic, topic.template));
|
|
35
|
-
if (owner === void 0 || !receivesOnly(sqlOf(topic))) return true;
|
|
36
|
-
skipped.push(`-- Skipped topic ${topic.template}: the ${owner.module} module writes its receive policy.`);
|
|
37
|
-
return false;
|
|
38
|
-
});
|
|
39
|
-
const header = [
|
|
40
|
-
"-- better-supabase: realtime topic policies",
|
|
41
|
-
`-- Written by \`better-supabase sql sync\` from ${policies.from.join(", ")}; edit the topics, not this file.`,
|
|
42
|
-
...skipped
|
|
43
|
-
].join("\n");
|
|
44
|
-
return {
|
|
45
|
-
path: policies.output,
|
|
46
|
-
contents: `${header}\n\n${written.map(sqlOf).join("\n")}`
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
//#endregion
|
|
50
|
-
//#region src/cli/commands/sql.ts
|
|
15
|
+
//#region src/cli/sql/args.ts
|
|
51
16
|
const SQL_ARGS = {
|
|
52
17
|
action: {
|
|
53
18
|
type: "positional",
|
|
@@ -73,6 +38,8 @@ const SQL_ARGS = {
|
|
|
73
38
|
}
|
|
74
39
|
};
|
|
75
40
|
const USAGE = "Run `better-supabase sql --help` for the actions.";
|
|
41
|
+
//#endregion
|
|
42
|
+
//#region src/cli/sql/providers.ts
|
|
76
43
|
/** Modules that fill the `memberships` claim, which a provider's hook may own. */
|
|
77
44
|
const MEMBERSHIP_CLAIM_MODULES = /* @__PURE__ */ new Set(["tenant"]);
|
|
78
45
|
/** Whether the provider's access token hook writes the `memberships` claim itself. */
|
|
@@ -142,26 +109,8 @@ async function layoutFor(config, args, names) {
|
|
|
142
109
|
permissionCatalog: permissionKeysFor(config)
|
|
143
110
|
});
|
|
144
111
|
}
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
* Test files a SQL module wrote for an earlier layout (a table that is no
|
|
148
|
-
* longer audited), for the modules in `names`.
|
|
149
|
-
*/
|
|
150
|
-
async function staleModuleTests(config, names, sqlLayout, files) {
|
|
151
|
-
const dir = (sqlLayout.testsDir ?? "supabase/tests").replace(/\/$/, "");
|
|
152
|
-
const entries = await readdir(resolve(config.root, dir)).catch(() => []);
|
|
153
|
-
const current = new Set(files.map((file) => file.path));
|
|
154
|
-
const modules = new Set(resolveModules(names, sqlLayout).map((module) => module.name));
|
|
155
|
-
const stale = [];
|
|
156
|
-
for (const name of entries.toSorted()) {
|
|
157
|
-
const path = `${dir}/${name}`;
|
|
158
|
-
if (!name.endsWith(".test.sql") || current.has(path)) continue;
|
|
159
|
-
const text = await readFile(resolve(config.root, path), "utf8");
|
|
160
|
-
const module = MODULE_TEST_MARKER.exec(text)?.[1];
|
|
161
|
-
if (module !== void 0 && modules.has(module)) stale.push(path);
|
|
162
|
-
}
|
|
163
|
-
return stale;
|
|
164
|
-
}
|
|
112
|
+
//#endregion
|
|
113
|
+
//#region src/cli/sql/migrations.ts
|
|
165
114
|
/** `YYYYMMDDHHMMSS` in UTC, the Supabase CLI's migration prefix. */
|
|
166
115
|
const migrationStamp = (now) => now.toISOString().replaceAll(/[-:T]/g, "").slice(0, 14);
|
|
167
116
|
/**
|
|
@@ -174,35 +123,6 @@ function stampAfter(migrations, now) {
|
|
|
174
123
|
const at = Math.floor(now.getTime() / 1e3) * 1e3;
|
|
175
124
|
return migrationStamp(new Date(Math.max(at, newest + 1e3)));
|
|
176
125
|
}
|
|
177
|
-
async function write(config, args, names, sqlLayout, only) {
|
|
178
|
-
const lines = [];
|
|
179
|
-
const dryRun = args["dry-run"] === true;
|
|
180
|
-
let data = false;
|
|
181
|
-
const files = renderModules(names, sqlLayout).filter((file) => only === void 0 || only.includes(file.module));
|
|
182
|
-
for (const path of await staleModuleTests(config, only ?? names, sqlLayout, files)) {
|
|
183
|
-
const shown = display(config.root, path);
|
|
184
|
-
if (dryRun) {
|
|
185
|
-
lines.push(`Would remove ${shown}`);
|
|
186
|
-
continue;
|
|
187
|
-
}
|
|
188
|
-
await rm(resolve(config.root, path));
|
|
189
|
-
lines.push(`Removed ${shown}`);
|
|
190
|
-
}
|
|
191
|
-
for (const file of files) {
|
|
192
|
-
const path = resolve(config.root, file.path);
|
|
193
|
-
const shown = display(config.root, file.path);
|
|
194
|
-
if (dryRun) {
|
|
195
|
-
lines.push(`Would write ${shown} (${file.module})`);
|
|
196
|
-
continue;
|
|
197
|
-
}
|
|
198
|
-
const wrote = await writeIfChanged(path, file.contents);
|
|
199
|
-
if (wrote && file.kind === "data") data = true;
|
|
200
|
-
lines.push(`${wrote ? "Wrote" : "Unchanged"} ${shown} (${file.module})`);
|
|
201
|
-
}
|
|
202
|
-
lines.push(...await writeExtensionsMigration(config, files, dryRun));
|
|
203
|
-
if (data) lines.push("", DATA_NEXT);
|
|
204
|
-
return lines;
|
|
205
|
-
}
|
|
206
126
|
const EXTENSIONS_SUFFIX = "_better_supabase_extensions.sql";
|
|
207
127
|
const MIGRATION_EXTENSION = /^\s*create\s+extension\s+(?:if\s+not\s+exists\s+)?"?([a-z_][a-z0-9_]*)"?/gim;
|
|
208
128
|
async function unmigratedExtensions(config, files) {
|
|
@@ -220,10 +140,10 @@ async function unmigratedExtensions(config, files) {
|
|
|
220
140
|
missing: moduleSchemaExtensions(files).filter((extension) => !created.has(extension.name))
|
|
221
141
|
};
|
|
222
142
|
}
|
|
223
|
-
async function writeExtensionsMigration(config, files, dryRun) {
|
|
143
|
+
async function writeExtensionsMigration(config, files, dryRun, now) {
|
|
224
144
|
const { dir, existing, missing } = await unmigratedExtensions(config, files);
|
|
225
145
|
if (missing.length === 0) return [];
|
|
226
|
-
const path = `${dir}/${stampAfter(existing, /* @__PURE__ */ new Date(
|
|
146
|
+
const path = `${dir}/${stampAfter(existing, /* @__PURE__ */ new Date(now().getTime() - 1e3))}${EXTENSIONS_SUFFIX}`;
|
|
227
147
|
if (dryRun) return [`Would write ${path}`];
|
|
228
148
|
await writeIfChanged(resolve(config.root, path), `-- better-supabase sql: the extensions of ${missing.map((extension) => extension.name).join(", ")}, created before the schema migration that needs them.\n\n${missing.map((extension) => extension.statement).join("\n")}\n`);
|
|
229
149
|
return [`Wrote ${path}`, "It creates the extensions the module schemas need, so create the schema migration after it."];
|
|
@@ -235,7 +155,7 @@ const DATA_SUFFIX = "_better_supabase_module_data.sql";
|
|
|
235
155
|
* the schema migration that creates their tables. Every statement is
|
|
236
156
|
* idempotent, so the migration carries all of them, not only the changes.
|
|
237
157
|
*/
|
|
238
|
-
async function dataMigration(config, args) {
|
|
158
|
+
async function dataMigration(config, args, now) {
|
|
239
159
|
if (config.sql.moduleNames.length === 0) return {
|
|
240
160
|
code: 0,
|
|
241
161
|
output: "sql.modules is empty; nothing to write."
|
|
@@ -255,7 +175,7 @@ async function dataMigration(config, args) {
|
|
|
255
175
|
code: 0,
|
|
256
176
|
output: `${dir}/${latest} already has these rows; nothing to write.`
|
|
257
177
|
};
|
|
258
|
-
const path = `${dir}/${stampAfter(existing,
|
|
178
|
+
const path = `${dir}/${stampAfter(existing, now())}${DATA_SUFFIX}`;
|
|
259
179
|
if (args["dry-run"] === true) return {
|
|
260
180
|
code: 0,
|
|
261
181
|
output: `Would write ${path}`
|
|
@@ -266,6 +186,57 @@ async function dataMigration(config, args) {
|
|
|
266
186
|
output: `Wrote ${path}`
|
|
267
187
|
};
|
|
268
188
|
}
|
|
189
|
+
//#endregion
|
|
190
|
+
//#region src/cli/sql/write.ts
|
|
191
|
+
const MODULE_TEST_MARKER = /^-- @bs-module-test ([a-z0-9-]+)$/m;
|
|
192
|
+
/**
|
|
193
|
+
* Test files a SQL module wrote for an earlier layout (a table that is no
|
|
194
|
+
* longer audited), for the modules in `names`.
|
|
195
|
+
*/
|
|
196
|
+
async function staleModuleTests(config, names, sqlLayout, files) {
|
|
197
|
+
const dir = (sqlLayout.testsDir ?? CONFIG_DEFAULTS.sql.testsDir).replace(/\/$/, "");
|
|
198
|
+
const entries = await readdir(resolve(config.root, dir)).catch(() => []);
|
|
199
|
+
const current = new Set(files.map((file) => file.path));
|
|
200
|
+
const modules = new Set(resolveModules(names, sqlLayout).map((module) => module.name));
|
|
201
|
+
const stale = [];
|
|
202
|
+
for (const name of entries.toSorted()) {
|
|
203
|
+
const path = `${dir}/${name}`;
|
|
204
|
+
if (!name.endsWith(".test.sql") || current.has(path)) continue;
|
|
205
|
+
const text = await readFile(resolve(config.root, path), "utf8");
|
|
206
|
+
const module = MODULE_TEST_MARKER.exec(text)?.[1];
|
|
207
|
+
if (module !== void 0 && modules.has(module)) stale.push(path);
|
|
208
|
+
}
|
|
209
|
+
return stale;
|
|
210
|
+
}
|
|
211
|
+
async function write(config, args, names, sqlLayout, now, only) {
|
|
212
|
+
const lines = [];
|
|
213
|
+
const dryRun = args["dry-run"] === true;
|
|
214
|
+
let data = false;
|
|
215
|
+
const files = renderModules(names, sqlLayout).filter((file) => only === void 0 || only.includes(file.module));
|
|
216
|
+
for (const path of await staleModuleTests(config, only ?? names, sqlLayout, files)) {
|
|
217
|
+
const shown = display(config.root, path);
|
|
218
|
+
if (dryRun) {
|
|
219
|
+
lines.push(`Would remove ${shown}`);
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
await rm(resolve(config.root, path));
|
|
223
|
+
lines.push(`Removed ${shown}`);
|
|
224
|
+
}
|
|
225
|
+
for (const file of files) {
|
|
226
|
+
const path = resolve(config.root, file.path);
|
|
227
|
+
const shown = display(config.root, file.path);
|
|
228
|
+
if (dryRun) {
|
|
229
|
+
lines.push(`Would write ${shown} (${file.module})`);
|
|
230
|
+
continue;
|
|
231
|
+
}
|
|
232
|
+
const { wrote, line } = await writeLine(path, file.contents, shown, ` (${file.module})`);
|
|
233
|
+
if (wrote && file.kind === "data") data = true;
|
|
234
|
+
lines.push(line);
|
|
235
|
+
}
|
|
236
|
+
lines.push(...await writeExtensionsMigration(config, files, dryRun, now));
|
|
237
|
+
if (data) lines.push("", DATA_NEXT);
|
|
238
|
+
return lines;
|
|
239
|
+
}
|
|
269
240
|
/** A note when migra's `schema_paths` is set and misses module files, which `supabase db diff` would then skip. */
|
|
270
241
|
async function unlistedModuleFiles(config, names, sqlLayout) {
|
|
271
242
|
const toml = await readSupabaseToml(config.root);
|
|
@@ -285,12 +256,170 @@ async function unlistedModuleFiles(config, names, sqlLayout) {
|
|
|
285
256
|
"Or switch to pg-delta, which orders the files by dependency: add [experimental.pgdelta] with enabled = true and remove schema_paths (doctor BS316)."
|
|
286
257
|
];
|
|
287
258
|
}
|
|
259
|
+
//#endregion
|
|
260
|
+
//#region src/cli/sql/add.ts
|
|
261
|
+
async function addModules(config, args, names, now) {
|
|
262
|
+
if (names.length === 0) return {
|
|
263
|
+
code: 2,
|
|
264
|
+
error: `Name at least one module.\n${USAGE}`
|
|
265
|
+
};
|
|
266
|
+
const unknown = names.filter((name) => !(name in SQL_MODULES));
|
|
267
|
+
if (unknown.length > 0) return {
|
|
268
|
+
code: 2,
|
|
269
|
+
error: `Unknown module ${unknown.join(", ")}. Available: ${Object.keys(SQL_MODULES).join(", ")}`
|
|
270
|
+
};
|
|
271
|
+
const owner = config.authorization && providerOwnsMemberships(config) ? providerLabel(config.authorization) : void 0;
|
|
272
|
+
const hookModules = names.filter((name) => MEMBERSHIP_CLAIM_MODULES.has(name));
|
|
273
|
+
if (owner && hookModules.length > 0 && args.force !== true) return {
|
|
274
|
+
code: 1,
|
|
275
|
+
error: [
|
|
276
|
+
`The access token hook of ${owner} writes the memberships claim.`,
|
|
277
|
+
`${hookModules.join(" and ")} would add a second source for it. Use the provider's hook instead,`,
|
|
278
|
+
"or pass --force to write the modules anyway."
|
|
279
|
+
].join("\n")
|
|
280
|
+
};
|
|
281
|
+
const listed = [...config.sql.moduleNames, ...names.filter((name) => !config.sql.moduleNames.includes(name))];
|
|
282
|
+
const sqlLayout = await layoutFor(config, args, listed);
|
|
283
|
+
const lines = await write(config, args, listed, sqlLayout, now, resolveModules(names, sqlLayout).map((module) => module.name));
|
|
284
|
+
const pulledIn = resolveModules(names, sqlLayout).map((module) => module.name).filter((name) => MEMBERSHIP_CLAIM_MODULES.has(name) && !names.includes(name));
|
|
285
|
+
if (owner && pulledIn.length > 0) lines.push("", `${pulledIn.join(" and ")} came along as a dependency: its memberships table backs has_organization_role() and has_entitlement().`, `The hook of ${owner} still writes the memberships claim, so don't call better_supabase.membership_claims from a hook.`, "Make better_supabase.memberships one of the provider's membership sources if both should agree.");
|
|
286
|
+
const untracked = resolveModules(names, sqlLayout).map((module) => module.name).filter((name) => !config.sql.moduleNames.includes(name));
|
|
287
|
+
if (untracked.length > 0) lines.push("", `Add them to your config so \`sql sync --check\` keeps them current:`, ` sql: { modules: [${[...config.sql.moduleNames, ...untracked].map((name) => `'${name}'`).join(", ")}] }`);
|
|
288
|
+
if (args["dry-run"] !== true) lines.push(...await unlistedModuleFiles(config, names, sqlLayout));
|
|
289
|
+
lines.push("", `Then create a migration: ${migrationCommand(await readSupabaseToml(config.root), "better_supabase_module")}`);
|
|
290
|
+
return {
|
|
291
|
+
code: 0,
|
|
292
|
+
output: lines.join("\n")
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
//#endregion
|
|
296
|
+
//#region src/cli/sql/list.ts
|
|
297
|
+
async function listModules(config, args) {
|
|
298
|
+
const sqlLayout = await layout(config, args);
|
|
299
|
+
const files = moduleFilePaths(Object.keys(SQL_MODULES), sqlLayout);
|
|
300
|
+
return {
|
|
301
|
+
code: 0,
|
|
302
|
+
output: `${Object.values(SQL_MODULES).map((module) => {
|
|
303
|
+
const path = files.get(module.name);
|
|
304
|
+
const installed = path !== void 0 && existsSync(resolve(config.root, path));
|
|
305
|
+
const tracked = config.sql.moduleNames.includes(module.name);
|
|
306
|
+
const mark = path === void 0 ? "◇" : installed ? tracked ? "●" : "○" : " ";
|
|
307
|
+
const requires = sqlLayout.entitlementsProvider && module.providerRequires ? module.providerRequires : module.requires;
|
|
308
|
+
const needs = requires.length > 0 ? ` (needs ${requires.join(", ")})` : "";
|
|
309
|
+
const integrates = module.integrates ?? [];
|
|
310
|
+
const works = integrates.includes("*") ? " (works with every installed module)" : integrates.length > 0 ? ` (works with ${integrates.join(", ")})` : "";
|
|
311
|
+
return `${mark} ${module.name.padEnd(15)} ${module.description}${needs}${works}`;
|
|
312
|
+
}).join("\n")}\n\n● installed and in sql.modules ○ installed, not in sql.modules ◇ custom mode (the app implements it)`
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
//#endregion
|
|
316
|
+
//#region src/cli/sql/print.ts
|
|
317
|
+
async function printModule(config, args, names) {
|
|
318
|
+
const [name] = names;
|
|
319
|
+
const module = name ? SQL_MODULES[name] : void 0;
|
|
320
|
+
if (!module) return {
|
|
321
|
+
code: 2,
|
|
322
|
+
error: `Name one module: ${Object.keys(SQL_MODULES).join(", ")}`
|
|
323
|
+
};
|
|
324
|
+
const body = moduleBody(module.name, await layout(config, args, [module.name]));
|
|
325
|
+
if (body === void 0) return {
|
|
326
|
+
code: 0,
|
|
327
|
+
output: `-- sql.modules.${module.name} is in custom mode: the app writes these functions.\n${customContracts([module.name], await layout(config, args, [module.name])).flatMap((contract) => contract.functions.map((fn) => `-- ${contract.schema}.${fn.name}(${contractSignature(fn, contract.idType)}) returns ${fn.returns.replaceAll("{id}", contract.idType)}`)).join("\n")}`
|
|
328
|
+
};
|
|
329
|
+
return {
|
|
330
|
+
code: 0,
|
|
331
|
+
output: body
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
//#endregion
|
|
335
|
+
//#region src/cli/topic-policies.ts
|
|
336
|
+
const isTopic = (value) => typeof value === "object" && value !== null && "template" in value && typeof value.template === "string" && "sql" in value && typeof value.sql === "function" && "triggerSql" in value;
|
|
337
|
+
const literalParts = (template) => template.replaceAll(/\{[^}]+\}/g, "{}");
|
|
338
|
+
const owns = (owned, template) => owned.endsWith("*") ? template.startsWith(owned.slice(0, -1)) : literalParts(owned) === literalParts(template);
|
|
339
|
+
const receivesOnly = (sql) => !sql.includes(" for insert ") && !sql.includes("'presence'");
|
|
340
|
+
/** The file `realtime.policies` writes, or `undefined` when it isn't set. */
|
|
341
|
+
async function topicPolicyFile(config, owned = []) {
|
|
342
|
+
const policies = config.realtime.policies;
|
|
343
|
+
if (policies === void 0) return void 0;
|
|
344
|
+
const topics = [];
|
|
345
|
+
for (const entry of policies.from) {
|
|
346
|
+
const loaded = await importFresh(resolve(config.root, entry));
|
|
347
|
+
const found = Object.values(loaded).filter(isTopic);
|
|
348
|
+
if (found.length === 0) throw new Error(`${entry} exports no topic (defineTopic)`);
|
|
349
|
+
for (const topic of found) if (!topics.includes(topic)) topics.push(topic);
|
|
350
|
+
}
|
|
351
|
+
topics.sort((a, b) => a.template < b.template ? -1 : a.template > b.template ? 1 : 0);
|
|
352
|
+
const functions = config.authorization?.functions;
|
|
353
|
+
const sqlOf = (topic) => topic.sql(functions === void 0 ? void 0 : { functions });
|
|
354
|
+
const skipped = [];
|
|
355
|
+
const written = topics.filter((topic) => {
|
|
356
|
+
const owner = owned.find((entry) => owns(entry.topic, topic.template));
|
|
357
|
+
if (owner === void 0 || !receivesOnly(sqlOf(topic))) return true;
|
|
358
|
+
skipped.push(`-- Skipped topic ${topic.template}: the ${owner.module} module writes its receive policy.`);
|
|
359
|
+
return false;
|
|
360
|
+
});
|
|
361
|
+
const header = [
|
|
362
|
+
"-- better-supabase: realtime topic policies",
|
|
363
|
+
`-- Written by \`better-supabase sql sync\` from ${policies.from.join(", ")}; edit the topics, not this file.`,
|
|
364
|
+
...skipped
|
|
365
|
+
].join("\n");
|
|
366
|
+
return {
|
|
367
|
+
path: policies.output,
|
|
368
|
+
contents: `${header}\n\n${written.map(sqlOf).join("\n")}`
|
|
369
|
+
};
|
|
370
|
+
}
|
|
371
|
+
//#endregion
|
|
372
|
+
//#region src/cli/sql/sync.ts
|
|
373
|
+
async function syncModules(config, args, paint, now) {
|
|
374
|
+
const topics = await topicPolicyFile(config, config.sql.moduleNames.length === 0 ? [] : moduleTopics(config.sql.moduleNames, await layoutFor(config, args, config.sql.moduleNames)));
|
|
375
|
+
if (config.sql.moduleNames.length === 0 && topics === void 0) return {
|
|
376
|
+
code: 0,
|
|
377
|
+
output: "sql.modules is empty; nothing to sync."
|
|
378
|
+
};
|
|
379
|
+
if (args.check !== true) {
|
|
380
|
+
const lines = config.sql.moduleNames.length === 0 ? [] : await write(config, args, config.sql.moduleNames, await layoutFor(config, args, config.sql.moduleNames), now);
|
|
381
|
+
if (topics !== void 0) {
|
|
382
|
+
const shown = display(config.root, topics.path);
|
|
383
|
+
if (args["dry-run"] === true) lines.push(`Would write ${shown} (topics)`);
|
|
384
|
+
else lines.push((await writeLine(resolve(config.root, topics.path), topics.contents, shown, " (topics)")).line);
|
|
385
|
+
}
|
|
386
|
+
return {
|
|
387
|
+
code: 0,
|
|
388
|
+
output: lines.join("\n")
|
|
389
|
+
};
|
|
390
|
+
}
|
|
391
|
+
const sqlLayout = await layoutFor(config, args, config.sql.moduleNames);
|
|
392
|
+
const files = [...renderModules(config.sql.moduleNames, sqlLayout), ...topics === void 0 ? [] : [{
|
|
393
|
+
...topics,
|
|
394
|
+
topics: true
|
|
395
|
+
}]];
|
|
396
|
+
const stale = (await staleModuleTests(config, config.sql.moduleNames, sqlLayout, renderModules(config.sql.moduleNames, sqlLayout))).map((path) => display(config.root, path));
|
|
397
|
+
const diffs = stale.map((path) => `${path} is no longer written; \`sql sync\` removes it.`);
|
|
398
|
+
for (const file of files) {
|
|
399
|
+
const current = await readFile(resolve(config.root, file.path), "utf8").catch(() => void 0);
|
|
400
|
+
if (file.topics ? !sameText(current, file.contents) : !sameModuleFile(current, file.contents)) {
|
|
401
|
+
const shown = display(config.root, file.path);
|
|
402
|
+
stale.push(shown);
|
|
403
|
+
diffs.push(fileDiff(shown, current, file.contents, paint));
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
return stale.length === 0 ? {
|
|
407
|
+
code: 0,
|
|
408
|
+
output: "SQL module files are up to date."
|
|
409
|
+
} : {
|
|
410
|
+
code: 1,
|
|
411
|
+
output: diffs.join("\n\n"),
|
|
412
|
+
error: `Out of date: ${stale.join(", ")}. Run \`better-supabase sql sync\`.`
|
|
413
|
+
};
|
|
414
|
+
}
|
|
415
|
+
//#endregion
|
|
416
|
+
//#region src/cli/sql/upgrade.ts
|
|
288
417
|
/**
|
|
289
418
|
* Rewrites the module files of modules behind the current version, and writes
|
|
290
419
|
* their upgrade steps (renames, backfills) as a migration that runs before
|
|
291
420
|
* the one the schema diff creates.
|
|
292
421
|
*/
|
|
293
|
-
async function upgrade(config, args, paint) {
|
|
422
|
+
async function upgrade(config, args, paint, now) {
|
|
294
423
|
if (config.sql.moduleNames.length === 0) return {
|
|
295
424
|
code: 0,
|
|
296
425
|
output: "sql.modules is empty; nothing to upgrade."
|
|
@@ -339,7 +468,7 @@ async function upgrade(config, args, paint) {
|
|
|
339
468
|
const steps = plan.flatMap((entry) => entry.steps.filter((step) => step.sql !== "").map((step) => `-- ${entry.module}: version ${String(step.from)} to ${String(step.from + 1)}. ${step.description}\n${step.sql}`));
|
|
340
469
|
const dryRun = args["dry-run"] === true;
|
|
341
470
|
if (steps.length > 0) {
|
|
342
|
-
const path = `${migrationsDir(config)}/${migrationStamp(
|
|
471
|
+
const path = `${migrationsDir(config)}/${migrationStamp(now())}_better_supabase_block_upgrade.sql`;
|
|
343
472
|
const contents = `-- better-supabase sql upgrade: steps that run before the schema diff.\n\n${steps.join("\n\n")}\n`;
|
|
344
473
|
if (dryRun) lines.push(`Would write ${path}`);
|
|
345
474
|
else {
|
|
@@ -348,131 +477,24 @@ async function upgrade(config, args, paint) {
|
|
|
348
477
|
}
|
|
349
478
|
}
|
|
350
479
|
for (const entry of plan) lines.push(`${entry.module}: version ${String(entry.from)} to ${String(entry.to)}`, ...entry.steps.map((step) => ` ${step.description}`));
|
|
351
|
-
lines.push(...await write(config, args, config.sql.moduleNames, sqlLayout), "", `Then create a migration: ${migrationCommand(await readSupabaseToml(config.root), "better_supabase_module")}`);
|
|
480
|
+
lines.push(...await write(config, args, config.sql.moduleNames, sqlLayout, now), "", `Then create a migration: ${migrationCommand(await readSupabaseToml(config.root), "better_supabase_module")}`);
|
|
352
481
|
return {
|
|
353
482
|
code: 0,
|
|
354
483
|
output: lines.join("\n")
|
|
355
484
|
};
|
|
356
485
|
}
|
|
357
|
-
|
|
358
|
-
|
|
486
|
+
//#endregion
|
|
487
|
+
//#region src/cli/commands/sql.ts
|
|
488
|
+
const SYSTEM_DEPS = { now: () => /* @__PURE__ */ new Date() };
|
|
489
|
+
async function runSql(config, args, paint = plain, deps = SYSTEM_DEPS) {
|
|
490
|
+
const [action, ...names] = args._ ?? [];
|
|
359
491
|
switch (action) {
|
|
360
|
-
case "list":
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
const path = files.get(module.name);
|
|
367
|
-
const installed = path !== void 0 && existsSync(resolve(config.root, path));
|
|
368
|
-
const tracked = config.sql.moduleNames.includes(module.name);
|
|
369
|
-
const mark = path === void 0 ? "◇" : installed ? tracked ? "●" : "○" : " ";
|
|
370
|
-
const requires = sqlLayout.entitlementsProvider && module.providerRequires ? module.providerRequires : module.requires;
|
|
371
|
-
const needs = requires.length > 0 ? ` (needs ${requires.join(", ")})` : "";
|
|
372
|
-
const integrates = module.integrates ?? [];
|
|
373
|
-
const works = integrates.includes("*") ? " (works with every installed module)" : integrates.length > 0 ? ` (works with ${integrates.join(", ")})` : "";
|
|
374
|
-
return `${mark} ${module.name.padEnd(15)} ${module.description}${needs}${works}`;
|
|
375
|
-
}).join("\n")}\n\n● installed and in sql.modules ○ installed, not in sql.modules ◇ custom mode (the app implements it)`
|
|
376
|
-
};
|
|
377
|
-
}
|
|
378
|
-
case "add": {
|
|
379
|
-
if (names.length === 0) return {
|
|
380
|
-
code: 2,
|
|
381
|
-
error: `Name at least one module.\n${USAGE}`
|
|
382
|
-
};
|
|
383
|
-
const unknown = names.filter((name) => !(name in SQL_MODULES));
|
|
384
|
-
if (unknown.length > 0) return {
|
|
385
|
-
code: 2,
|
|
386
|
-
error: `Unknown module ${unknown.join(", ")}. Available: ${Object.keys(SQL_MODULES).join(", ")}`
|
|
387
|
-
};
|
|
388
|
-
const owner = config.authorization && providerOwnsMemberships(config) ? providerLabel(config.authorization) : void 0;
|
|
389
|
-
const hookModules = names.filter((name) => MEMBERSHIP_CLAIM_MODULES.has(name));
|
|
390
|
-
if (owner && hookModules.length > 0 && args.force !== true) return {
|
|
391
|
-
code: 1,
|
|
392
|
-
error: [
|
|
393
|
-
`The access token hook of ${owner} writes the memberships claim.`,
|
|
394
|
-
`${hookModules.join(" and ")} would add a second source for it. Use the provider's hook instead,`,
|
|
395
|
-
"or pass --force to write the modules anyway."
|
|
396
|
-
].join("\n")
|
|
397
|
-
};
|
|
398
|
-
const listed = [...config.sql.moduleNames, ...names.filter((name) => !config.sql.moduleNames.includes(name))];
|
|
399
|
-
const sqlLayout = await layoutFor(config, args, listed);
|
|
400
|
-
const lines = await write(config, args, listed, sqlLayout, resolveModules(names, sqlLayout).map((module) => module.name));
|
|
401
|
-
const pulledIn = resolveModules(names, sqlLayout).map((module) => module.name).filter((name) => MEMBERSHIP_CLAIM_MODULES.has(name) && !names.includes(name));
|
|
402
|
-
if (owner && pulledIn.length > 0) lines.push("", `${pulledIn.join(" and ")} came along as a dependency: its memberships table backs has_organization_role() and has_entitlement().`, `The hook of ${owner} still writes the memberships claim, so don't call better_supabase.membership_claims from a hook.`, "Make better_supabase.memberships one of the provider's membership sources if both should agree.");
|
|
403
|
-
const untracked = resolveModules(names, sqlLayout).map((module) => module.name).filter((name) => !config.sql.moduleNames.includes(name));
|
|
404
|
-
if (untracked.length > 0) lines.push("", `Add them to your config so \`sql sync --check\` keeps them current:`, ` sql: { modules: [${[...config.sql.moduleNames, ...untracked].map((name) => `'${name}'`).join(", ")}] }`);
|
|
405
|
-
if (args["dry-run"] !== true) lines.push(...await unlistedModuleFiles(config, names, sqlLayout));
|
|
406
|
-
lines.push("", `Then create a migration: ${migrationCommand(await readSupabaseToml(config.root), "better_supabase_module")}`);
|
|
407
|
-
return {
|
|
408
|
-
code: 0,
|
|
409
|
-
output: lines.join("\n")
|
|
410
|
-
};
|
|
411
|
-
}
|
|
412
|
-
case "sync": {
|
|
413
|
-
const topics = await topicPolicyFile(config, config.sql.moduleNames.length === 0 ? [] : moduleTopics(config.sql.moduleNames, await layoutFor(config, args, config.sql.moduleNames)));
|
|
414
|
-
if (config.sql.moduleNames.length === 0 && topics === void 0) return {
|
|
415
|
-
code: 0,
|
|
416
|
-
output: "sql.modules is empty; nothing to sync."
|
|
417
|
-
};
|
|
418
|
-
if (args.check !== true) {
|
|
419
|
-
const lines = config.sql.moduleNames.length === 0 ? [] : await write(config, args, config.sql.moduleNames, await layoutFor(config, args, config.sql.moduleNames));
|
|
420
|
-
if (topics !== void 0) {
|
|
421
|
-
const shown = display(config.root, topics.path);
|
|
422
|
-
if (args["dry-run"] === true) lines.push(`Would write ${shown} (topics)`);
|
|
423
|
-
else {
|
|
424
|
-
const wrote = await writeIfChanged(resolve(config.root, topics.path), topics.contents);
|
|
425
|
-
lines.push(`${wrote ? "Wrote" : "Unchanged"} ${shown} (topics)`);
|
|
426
|
-
}
|
|
427
|
-
}
|
|
428
|
-
return {
|
|
429
|
-
code: 0,
|
|
430
|
-
output: lines.join("\n")
|
|
431
|
-
};
|
|
432
|
-
}
|
|
433
|
-
const sqlLayout = await layoutFor(config, args, config.sql.moduleNames);
|
|
434
|
-
const files = [...renderModules(config.sql.moduleNames, sqlLayout), ...topics === void 0 ? [] : [{
|
|
435
|
-
...topics,
|
|
436
|
-
topics: true
|
|
437
|
-
}]];
|
|
438
|
-
const stale = (await staleModuleTests(config, config.sql.moduleNames, sqlLayout, renderModules(config.sql.moduleNames, sqlLayout))).map((path) => display(config.root, path));
|
|
439
|
-
const diffs = stale.map((path) => `${path} is no longer written; \`sql sync\` removes it.`);
|
|
440
|
-
for (const file of files) {
|
|
441
|
-
const current = await readFile(resolve(config.root, file.path), "utf8").catch(() => void 0);
|
|
442
|
-
if (file.topics ? !sameText(current, file.contents) : !sameModuleFile(current, file.contents)) {
|
|
443
|
-
const shown = display(config.root, file.path);
|
|
444
|
-
stale.push(shown);
|
|
445
|
-
diffs.push(fileDiff(shown, current, file.contents, paint));
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
return stale.length === 0 ? {
|
|
449
|
-
code: 0,
|
|
450
|
-
output: "SQL module files are up to date."
|
|
451
|
-
} : {
|
|
452
|
-
code: 1,
|
|
453
|
-
output: diffs.join("\n\n"),
|
|
454
|
-
error: `Out of date: ${stale.join(", ")}. Run \`better-supabase sql sync\`.`
|
|
455
|
-
};
|
|
456
|
-
}
|
|
457
|
-
case "upgrade": return upgrade(config, args, paint);
|
|
458
|
-
case "data": return dataMigration(config, args);
|
|
459
|
-
case "print": {
|
|
460
|
-
const [name] = names;
|
|
461
|
-
const module = name ? SQL_MODULES[name] : void 0;
|
|
462
|
-
if (!module) return {
|
|
463
|
-
code: 2,
|
|
464
|
-
error: `Name one module: ${Object.keys(SQL_MODULES).join(", ")}`
|
|
465
|
-
};
|
|
466
|
-
const body = moduleBody(module.name, await layout(config, args, [module.name]));
|
|
467
|
-
if (body === void 0) return {
|
|
468
|
-
code: 0,
|
|
469
|
-
output: `-- sql.modules.${module.name} is in custom mode: the app writes these functions.\n${customContracts([module.name], await layout(config, args, [module.name])).flatMap((contract) => contract.functions.map((fn) => `-- ${contract.schema}.${fn.name}(${contractSignature(fn, contract.idType)}) returns ${fn.returns.replaceAll("{id}", contract.idType)}`)).join("\n")}`
|
|
470
|
-
};
|
|
471
|
-
return {
|
|
472
|
-
code: 0,
|
|
473
|
-
output: body
|
|
474
|
-
};
|
|
475
|
-
}
|
|
492
|
+
case "list": return listModules(config, args);
|
|
493
|
+
case "add": return addModules(config, args, names, deps.now);
|
|
494
|
+
case "sync": return syncModules(config, args, paint, deps.now);
|
|
495
|
+
case "upgrade": return upgrade(config, args, paint, deps.now);
|
|
496
|
+
case "data": return dataMigration(config, args, deps.now);
|
|
497
|
+
case "print": return printModule(config, args, names);
|
|
476
498
|
case void 0: return {
|
|
477
499
|
code: 2,
|
|
478
500
|
error: `Name an action.\n${USAGE}`
|
|
@@ -492,4 +514,4 @@ const sqlCommand = defineCliCommand({
|
|
|
492
514
|
run: (args, { config, io }) => runSql(config, args, painter(io.color))
|
|
493
515
|
});
|
|
494
516
|
//#endregion
|
|
495
|
-
export { sqlCommand };
|
|
517
|
+
export { sqlCommand as n, runSql as t };
|
|
@@ -5,9 +5,9 @@ const colored = (format, text) => styleText(format, text, { validateStream: fals
|
|
|
5
5
|
function painter(color) {
|
|
6
6
|
return color === true ? colored : plain;
|
|
7
7
|
}
|
|
8
|
-
/** Whether
|
|
9
|
-
function colorEnabled() {
|
|
10
|
-
return styleText("red", "x", { stream
|
|
8
|
+
/** Whether `stream` takes colors: a TTY, and neither `NO_COLOR` nor `NODE_DISABLE_COLORS` set (`FORCE_COLOR` overrides). */
|
|
9
|
+
function colorEnabled(stream) {
|
|
10
|
+
return styleText("red", "x", { stream }) !== "x";
|
|
11
11
|
}
|
|
12
12
|
const VERBS = [
|
|
13
13
|
[/^(?:Wrote|Updated)\b/, "green"],
|