better-supabase 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +299 -41
- package/dist/access-sql-B0dF-SoF.js +181 -0
- package/dist/actor-CQTlc1Hh.d.ts +43 -0
- package/dist/adapter-Bc1o3zyy.js +1106 -0
- package/dist/agents-CVHGd7It.d.ts +94 -0
- package/dist/ai-cache-CBWs1W0k.js +80 -0
- package/dist/ai-cache-DaDu_G5L.d.ts +64 -0
- package/dist/ai-chat-7amvXjmQ.d.ts +590 -0
- package/dist/ai-chat-B24UI962.js +743 -0
- package/dist/ai-files-CSPNswUY.js +319 -0
- package/dist/ai-sdk/agents/index.d.ts +74 -0
- package/dist/ai-sdk/agents/index.js +159 -0
- package/dist/ai-sdk/batches/index.d.ts +74 -0
- package/dist/ai-sdk/batches/index.js +180 -0
- package/dist/ai-sdk/cache/index.d.ts +38 -0
- package/dist/ai-sdk/cache/index.js +127 -0
- package/dist/ai-sdk/chat/index.d.ts +2 -0
- package/dist/ai-sdk/chat/index.js +246 -0
- package/dist/ai-sdk/embeddings/index.d.ts +3 -0
- package/dist/ai-sdk/embeddings/index.js +2 -0
- package/dist/ai-sdk/files/index.d.ts +61 -0
- package/dist/ai-sdk/files/index.js +111 -0
- package/dist/ai-sdk/index.d.ts +145 -0
- package/dist/ai-sdk/index.js +174 -0
- package/dist/ai-sdk/mcp/index.d.ts +102 -0
- package/dist/ai-sdk/mcp/index.js +362 -0
- package/dist/ai-sdk/memory/index.d.ts +67 -0
- package/dist/ai-sdk/memory/index.js +175 -0
- package/dist/ai-sdk/react/index.d.ts +2 -0
- package/dist/ai-sdk/react/index.js +3 -0
- package/dist/ai-sdk/react/server.d.ts +6 -0
- package/dist/ai-sdk/react/server.js +7 -0
- package/dist/ai-sdk/workflow/index.d.ts +249 -0
- package/dist/ai-sdk/workflow/index.js +575 -0
- package/dist/ai-sdk/workflow/react/index.d.ts +20 -0
- package/dist/ai-sdk/workflow/react/index.js +66 -0
- package/dist/ai-sdk/workflow/react/server.d.ts +10 -0
- package/dist/ai-sdk/workflow/react/server.js +12 -0
- package/dist/ai-tasks-Cd1HMFvB.d.ts +131 -0
- package/dist/announcements-CiyOs-xP.js +107 -0
- package/dist/announcements-ZRGnScWI.d.ts +72 -0
- package/dist/api-keys-rCGtKaZA.d.ts +156 -0
- package/dist/assistant-DwdpDH1q.d.ts +147 -0
- package/dist/astro/index.d.ts +86 -0
- package/dist/astro/index.js +93 -0
- package/dist/attributes-5dYul0u0.js +13 -0
- package/dist/auth-link-BjFPqwLz.d.ts +97 -0
- package/dist/auth-link-DrDX9KOT.js +114 -0
- package/dist/authorization-BFCqamMs.d.ts +172 -0
- package/dist/before-route-CnR0C0Jr.js +30 -0
- package/dist/bind-Bu_ZNa3W.d.ts +62 -0
- package/dist/bind-l4kAvYSv.js +97 -0
- package/dist/block-events-CrT8r7Fe.js +76 -0
- package/dist/block-fields-GFkxl4dP.js +49 -0
- package/dist/block-fields-SJ6fEf3o.d.ts +31 -0
- package/dist/block-helpers-CKtbFcRv.d.ts +37 -0
- package/dist/block-helpers-DWHxHsEQ.js +190 -0
- package/dist/block-hooks-BmjMyXTa.js +114 -0
- package/dist/block-hooks-plbZ0AbJ.d.ts +107 -0
- package/dist/{kit-transport-DJlHQUBU.js → block-transport-BLr-ZgLc.js} +11 -7
- package/dist/block-transport-DvaoPuZ9.d.ts +48 -0
- package/dist/blocks/agents/index.d.ts +3 -0
- package/dist/blocks/agents/index.js +123 -0
- package/dist/blocks/ai-cache/index.d.ts +3 -0
- package/dist/blocks/ai-cache/index.js +3 -0
- package/dist/blocks/ai-chat/index.d.ts +31 -0
- package/dist/blocks/ai-chat/index.js +5 -0
- package/dist/blocks/ai-chat/react/index.d.ts +77 -0
- package/dist/blocks/ai-chat/react/index.js +387 -0
- package/dist/blocks/ai-chat/react/server.d.ts +16 -0
- package/dist/blocks/ai-chat/react/server.js +14 -0
- package/dist/blocks/ai-files/index.d.ts +14 -0
- package/dist/blocks/ai-files/index.js +3 -0
- package/dist/blocks/ai-providers/index.d.ts +7 -0
- package/dist/blocks/ai-providers/index.js +211 -0
- package/dist/blocks/ai-tasks/index.d.ts +3 -0
- package/dist/blocks/ai-tasks/index.js +203 -0
- package/dist/blocks/announcements/index.d.ts +3 -0
- package/dist/blocks/announcements/index.js +3 -0
- package/dist/blocks/announcements/react/index.d.ts +31 -0
- package/dist/blocks/announcements/react/index.js +86 -0
- package/dist/blocks/announcements/react/server.d.ts +6 -0
- package/dist/blocks/announcements/react/server.js +7 -0
- package/dist/blocks/api-keys/index.d.ts +35 -0
- package/dist/blocks/api-keys/index.js +334 -0
- package/dist/blocks/attachments/index.d.ts +210 -0
- package/dist/blocks/attachments/index.js +222 -0
- package/dist/blocks/audit/index.d.ts +366 -0
- package/dist/blocks/audit/index.js +714 -0
- package/dist/blocks/billing/index.d.ts +265 -0
- package/dist/blocks/billing/index.js +400 -0
- package/dist/blocks/comments/index.d.ts +200 -0
- package/dist/blocks/comments/index.js +207 -0
- package/dist/blocks/connectors/index.d.ts +3 -0
- package/dist/blocks/connectors/index.js +164 -0
- package/dist/blocks/data-lifecycle/index.d.ts +251 -0
- package/dist/blocks/data-lifecycle/index.js +353 -0
- package/dist/blocks/entitlements/index.d.ts +14 -0
- package/dist/blocks/entitlements/index.js +25 -0
- package/dist/blocks/flags/index.d.ts +226 -0
- package/dist/blocks/flags/index.js +282 -0
- package/dist/blocks/inbox/index.d.ts +6 -0
- package/dist/blocks/inbox/index.js +499 -0
- package/dist/blocks/inbox/react/index.d.ts +2 -0
- package/dist/blocks/inbox/react/index.js +225 -0
- package/dist/blocks/inbox/react/server.d.ts +10 -0
- package/dist/blocks/inbox/react/server.js +12 -0
- package/dist/blocks/index.d.ts +65 -0
- package/dist/blocks/index.js +77 -0
- package/dist/blocks/jobs/index.d.ts +297 -0
- package/dist/blocks/jobs/index.js +1051 -0
- package/dist/blocks/knowledge/index.d.ts +3 -0
- package/dist/blocks/knowledge/index.js +3 -0
- package/dist/blocks/memory/index.d.ts +8 -0
- package/dist/blocks/memory/index.js +289 -0
- package/dist/blocks/notifications/index.d.ts +297 -0
- package/dist/blocks/notifications/index.js +425 -0
- package/dist/blocks/notifications/react/index.d.ts +44 -0
- package/dist/blocks/notifications/react/index.js +67 -0
- package/dist/blocks/notifications/react/server.d.ts +6 -0
- package/dist/blocks/notifications/react/server.js +7 -0
- package/dist/blocks/onboarding/index.d.ts +3 -0
- package/dist/blocks/onboarding/index.js +64 -0
- package/dist/blocks/onboarding/react/index.d.ts +28 -0
- package/dist/blocks/onboarding/react/index.js +78 -0
- package/dist/blocks/onboarding/react/server.d.ts +7 -0
- package/dist/blocks/onboarding/react/server.js +7 -0
- package/dist/blocks/organizations/index.d.ts +241 -0
- package/dist/blocks/organizations/index.js +400 -0
- package/dist/blocks/outbox/index.d.ts +3 -0
- package/dist/blocks/outbox/index.js +266 -0
- package/dist/blocks/profiles/index.d.ts +40 -0
- package/dist/blocks/profiles/index.js +28 -0
- package/dist/blocks/push/index.d.ts +185 -0
- package/dist/blocks/push/index.js +258 -0
- package/dist/blocks/settings/index.d.ts +89 -0
- package/dist/blocks/settings/index.js +104 -0
- package/dist/blocks/sso/index.d.ts +198 -0
- package/dist/blocks/sso/index.js +1297 -0
- package/dist/blocks/usage/index.d.ts +4 -0
- package/dist/blocks/usage/index.js +233 -0
- package/dist/blocks/waitlist/index.d.ts +117 -0
- package/dist/blocks/waitlist/index.js +132 -0
- package/dist/blocks/webhooks/index.d.ts +304 -0
- package/dist/{webhooks → blocks/webhooks}/index.js +468 -148
- package/dist/blocks/workflow-builder/index.d.ts +21 -0
- package/dist/blocks/workflow-builder/index.js +5 -0
- package/dist/blocks/workflow-builder/react/index.d.ts +47 -0
- package/dist/blocks/workflow-builder/react/index.js +119 -0
- package/dist/blocks/workflow-builder/react/server.d.ts +8 -0
- package/dist/blocks/workflow-builder/react/server.js +11 -0
- package/dist/blocks/workflows/index.d.ts +3 -0
- package/dist/blocks/workflows/index.js +3 -0
- package/dist/blocks/workflows/react/index.d.ts +47 -0
- package/dist/blocks/workflows/react/index.js +137 -0
- package/dist/blocks/workflows/react/server.d.ts +8 -0
- package/dist/blocks/workflows/react/server.js +11 -0
- package/dist/{index-SaTsEfGP.d.ts → bucket-Cl46E3jS.d.ts} +134 -91
- package/dist/{simplify-_0oUKqCd.js → build-BXIzE6Xv.js} +222 -124
- package/dist/{channel-FQW-CnGR.d.ts → channel-_2Mx1Oyu.d.ts} +2 -2
- package/dist/channels-CkgQ_X60.js +114 -0
- package/dist/chat-sdk/index.d.ts +303 -0
- package/dist/chat-sdk/index.js +733 -0
- package/dist/chat-sdk/react/index.d.ts +2 -0
- package/dist/chat-sdk/react/index.js +3 -0
- package/dist/chat-sdk/react/server.d.ts +3 -0
- package/dist/chat-sdk/react/server.js +2 -0
- package/dist/claims-DDBQT6BK.js +61 -0
- package/dist/{claims-BAf6c7is.js → claims-PqzCxaTD.js} +39 -2
- package/dist/cli/bin.js +1 -1
- package/dist/cli/{codemod-DqV7612m.js → codemod-Bl_tQpHn.js} +105 -2
- package/dist/cli/config-B9HkL8nF.js +2 -0
- package/dist/cli/config-DU7EJImt.js +49 -0
- package/dist/cli/config-NiPxAmUF.js +1077 -0
- package/dist/cli/{dist-xn4wlboc.js → dist-DRAVaE6w.js} +111 -1
- package/dist/cli/{doctor-L7Z8mYTx.js → doctor-B4JOm_ox.js} +992 -316
- package/dist/cli/{env-DmKv_G4A.js → env-CJLbUVPB.js} +1 -1
- package/dist/cli/{env-jIFUADLY.js → env-qXgyMV6r.js} +2 -2
- package/dist/cli/fresh-import-BeYf9I3x.js +40 -0
- package/dist/cli/gen-BGLb_zou.js +3100 -0
- package/dist/cli/gen-DAH8FM2W.js +2 -0
- package/dist/cli/index.d.ts +44 -5
- package/dist/cli/index.js +7 -7
- package/dist/cli/{init-Saf5-R9T.js → init-BIIwclPg.js} +242 -27
- package/dist/cli/{introspect--H7oGmcd.js → introspect-DNUTuNvb.js} +5 -5
- package/dist/cli/{io-k41_z-jT.js → io-DI1mTdSA.js} +12 -3
- package/dist/cli/{keys-ByKHnvP9.js → keys-BGCnnb-s.js} +8 -6
- package/dist/cli/{ohash-D7bG_EOb.js → ohash-BjQY1cBb.js} +1 -1
- package/dist/cli/{openapi-Cp5Fyta-.js → openapi-BlRJ18s3.js} +2 -2
- package/dist/cli/{project-B_GeXyHh.js → project-DZRaBaY7.js} +11 -6
- package/dist/cli/read-sets-CETOSFx4.js +223 -0
- package/dist/cli/{run-BKR2W_79.js → run-DNWxHynX.js} +33 -23
- package/dist/cli/{seed-CUlqWh-8.js → seed-DQzqT7LP.js} +8 -6
- package/dist/cli/{skills-LJJIhLFR.js → skills-QQs4q68J.js} +3 -2
- package/dist/cli/sql-D0GUtUPp.js +536 -0
- package/dist/cli/{config-CPVpXP5I.js → supabase-toml-B-bIukQF.js} +72 -942
- package/dist/cli/typegen-version-DeFbtzYI.js +8 -0
- package/dist/cli/{version-BDJuO0UR.js → version-hr88OZG0.js} +1 -1
- package/dist/client/index.d.ts +3 -2
- package/dist/client/index.js +11 -71
- package/dist/client/native/index.d.ts +228 -0
- package/dist/client/native/index.js +361 -0
- package/dist/client-CI0Z2zWX.js +277 -0
- package/dist/cloud-event-BnmD5fb9.js +46 -0
- package/dist/cloud-event-C1JCc1bH.d.ts +50 -0
- package/dist/{compiler-BXH_aZ7N.d.ts → compiler-DY_wkj4R.d.ts} +2 -2
- package/dist/compose-BIBNgAnq.js +53 -0
- package/dist/composite-Bt1YK3Ke.d.ts +146 -0
- package/dist/composite-DhE66P5u.js +130 -0
- package/dist/config/index.d.ts +6 -4
- package/dist/config/index.js +5 -5
- package/dist/{config-T_ejwyd3.d.ts → config-D44Y7PAv.d.ts} +406 -205
- package/dist/{config-DreERlKo.js → config-Dn7F5k9A.js} +62 -14
- package/dist/connector-Dv8kK0MO.d.ts +107 -0
- package/dist/connectors-hkLCwyEz.d.ts +120 -0
- package/dist/context-BCrWe7ow.d.ts +237 -0
- package/dist/credentials/index.d.ts +31 -0
- package/dist/credentials/index.js +168 -0
- package/dist/cron-DVPUg5k3.js +145 -0
- package/dist/csv-CPAzEmB6.js +25 -0
- package/dist/db-exception-CnWcYPxL.js +15 -0
- package/dist/{define-cNKzqwL_.js → define-B-TVjC25.js} +784 -227
- package/dist/{define-Bp_BZa5h.d.ts → define-CJJkkr1-.d.ts} +353 -61
- package/dist/edge/index.d.ts +69 -11
- package/dist/edge/index.js +191 -75
- package/dist/elysia/index.d.ts +59 -0
- package/dist/elysia/index.js +62 -0
- package/dist/embeddings-4ZvFzjsU.js +127 -0
- package/dist/embeddings-C9KGQnXt.d.ts +68 -0
- package/dist/{refresh-BTrQ_ZTp.d.ts → ended-jLfvw8h-.d.ts} +20 -2
- package/dist/{entitlements-DUxU4oHe.d.ts → entitlements-DHrY2UDZ.d.ts} +16 -7
- package/dist/entitlements-DRl6ZJUm.js +24 -0
- package/dist/envelope-DqnYGRw7.js +47 -0
- package/dist/{errors-DtwXa6b8.js → errors-B11Duf73.js} +82 -13
- package/dist/errors-DLjJHPLK.js +44 -0
- package/dist/escape-like-DHfx6jRr.js +7 -0
- package/dist/escape-like-ImTK0ps_.d.ts +15 -0
- package/dist/eve/index.d.ts +220 -0
- package/dist/eve/index.js +504 -0
- package/dist/eve-gT2Fpjut.d.ts +151 -0
- package/dist/events/index.d.ts +4 -3
- package/dist/events/index.js +9 -50
- package/dist/events-DWDhx77e.d.ts +549 -0
- package/dist/executor-Bq28caBo.js +718 -0
- package/dist/executor-C-R4pucm.js +83 -0
- package/dist/executor-CaWigTyR.d.ts +148 -0
- package/dist/executor-D14tGopJ.d.ts +36 -0
- package/dist/{executor-Cghdstwu.d.ts → executor-DbvExCFC.d.ts} +7 -1
- package/dist/{sql-Coh6n4cC.js → executor-De1Of3m3.js} +210 -11
- package/dist/executor-DvsBbNBS.d.ts +261 -0
- package/dist/expo/index.d.ts +79 -0
- package/dist/expo/index.js +129 -0
- package/dist/expo-sqlite/index.d.ts +58 -0
- package/dist/expo-sqlite/index.js +104 -0
- package/dist/field-errors-BFOa7WhB.d.ts +99 -0
- package/dist/field-errors-VF1yb8yI.js +13 -0
- package/dist/framework-CONDyPYx.js +51 -0
- package/dist/framework-DuVb4Xa8.d.ts +25 -0
- package/dist/gateway-C1ssRHnf.d.ts +130 -0
- package/dist/graph-BGyLLFLX.js +265 -0
- package/dist/h3/index.d.ts +59 -0
- package/dist/h3/index.js +55 -0
- package/dist/h3/v1/index.d.ts +63 -0
- package/dist/h3/v1/index.js +49 -0
- package/dist/history-BZih6SFP.js +64 -0
- package/dist/hono/index.d.ts +56 -7
- package/dist/hono/index.js +97 -45
- package/dist/{react-C_s7kiNz.js → hooks-1BTCJsiw.js} +104 -133
- package/dist/http-Cv4T29xh.js +40 -0
- package/dist/http-DdYadv-o.js +126 -0
- package/dist/image-url-pIVlO6R1.js +41 -0
- package/dist/impersonation-DcqaTBHx.js +148 -0
- package/dist/inbox-i7E1ppo6.d.ts +384 -0
- package/dist/index-ACiNPN4Z.d.ts +74 -0
- package/dist/{index-DgILJRXj.d.ts → index-Bepi-Hgg.d.ts} +91 -28
- package/dist/index-BkWT_uBO.d.ts +51 -0
- package/dist/index-BpFYMsi0.d.ts +53 -0
- package/dist/{index-C7f8cOBM.d.ts → index-Bxih3l0u.d.ts} +2 -2
- package/dist/index-CaxrMD1A.d.ts +1 -0
- package/dist/index-ClmjK_o-.d.ts +55 -0
- package/dist/index-CtuakVRc.d.ts +267 -0
- package/dist/index-D48jVS-N.d.ts +246 -0
- package/dist/index-DDrYaUcq.d.ts +138 -0
- package/dist/index-DQh4VCc9.d.ts +98 -0
- package/dist/{live-D9W2M5aO.d.ts → index-DunNRdnT.d.ts} +136 -38
- package/dist/index.d.ts +65 -18
- package/dist/index.js +42 -14
- package/dist/invalidate-BBqhpxyB.d.ts +19 -0
- package/dist/json-CEnpTHlZ.js +16 -0
- package/dist/json-schema-CvER4kgT.js +502 -0
- package/dist/keys-4MnkWTTh.js +35 -0
- package/dist/kit-B5tid-q5.d.ts +60 -0
- package/dist/kit-Fm-Fv7q5.js +78 -0
- package/dist/knowledge-BXBbT0Tr.d.ts +176 -0
- package/dist/knowledge-CDmiMLew.js +255 -0
- package/dist/lint/index.d.ts +1 -1
- package/dist/lint/index.js +37 -0
- package/dist/list/index.d.ts +3 -2
- package/dist/list/index.js +1 -444
- package/dist/{index-fag8VJZ2.d.ts → list-query-BRt-zDF7.d.ts} +20 -12
- package/dist/list-query-gl808ac1.js +459 -0
- package/dist/{live-CdJBOc4f.js → live-CTAZQkwl.js} +99 -14
- package/dist/logger-DWVYUmwi.d.ts +18 -0
- package/dist/mcp/index.d.ts +38 -11
- package/dist/mcp/index.js +82 -46
- package/dist/mcp/sdk/index.d.ts +105 -0
- package/dist/mcp/sdk/index.js +126 -0
- package/dist/message-CaKlqdsX.js +219 -0
- package/dist/message-CfDoR0Y6.d.ts +94 -0
- package/dist/messages-B9-5887d.js +715 -0
- package/dist/messages-DYP0sUTe.d.ts +59 -0
- package/dist/{mfa-CusDgPaD.d.ts → mfa-Daak8ukG.d.ts} +8 -2
- package/dist/modules-DpPwzC7E.d.ts +192 -0
- package/dist/modules-dxrVK3ID.js +228 -0
- package/dist/nestjs/index.d.ts +68 -0
- package/dist/nestjs/index.js +164 -0
- package/dist/next/client/index.d.ts +35 -0
- package/dist/next/client/index.js +36 -0
- package/dist/next/image/index.js +3 -24
- package/dist/next/index.d.ts +150 -51
- package/dist/next/index.js +261 -107
- package/dist/node/index.d.ts +4 -0
- package/dist/node/index.js +210 -0
- package/dist/node-headers-AO06VhqH.d.ts +24 -0
- package/dist/node-headers-C71zNQHe.js +55 -0
- package/dist/nuxt/index.d.ts +60 -0
- package/dist/nuxt/index.js +64 -0
- package/dist/onboarding-BZGHYJks.d.ts +62 -0
- package/dist/openapi/index.d.ts +1 -1
- package/dist/openapi/index.js +3 -3
- package/dist/orpc/index.d.ts +70 -11
- package/dist/orpc/index.js +73 -24
- package/dist/otel/index.d.ts +7 -7
- package/dist/otel/index.js +87 -57
- package/dist/outbox-Cq7pPYvl.d.ts +161 -0
- package/dist/{plugin-o144f322.d.ts → plugin-FGY8UhYm.d.ts} +30 -10
- package/dist/plugin-tfXW1-qO.js +45 -0
- package/dist/plugins/actor/index.d.ts +2 -2
- package/dist/plugins/actor/index.js +3 -3
- package/dist/plugins/rules/index.d.ts +11 -4
- package/dist/plugins/rules/index.js +40 -13
- package/dist/plugins/soft-delete/index.d.ts +5 -4
- package/dist/plugins/soft-delete/index.js +10 -5
- package/dist/plugins/tenant/index.d.ts +2 -2
- package/dist/plugins/tenant/index.js +18 -11
- package/dist/plugins/timestamps/index.d.ts +5 -3
- package/dist/plugins/timestamps/index.js +6 -4
- package/dist/plugins/validation/index.d.ts +2 -2
- package/dist/plugins/validation/index.js +10 -6
- package/dist/{pool-C9voM4Kw.d.ts → pool-CAu2nLrL.d.ts} +2 -2
- package/dist/postgres/index.d.ts +4 -4
- package/dist/postgres/index.js +1 -2
- package/dist/{postgrest-CruYKAvV.d.ts → postgrest-BLVdEnfe.d.ts} +13 -3
- package/dist/powersync/index.d.ts +43 -0
- package/dist/powersync/index.js +199 -0
- package/dist/powersync/react/index.d.ts +87 -0
- package/dist/powersync/react/index.js +108 -0
- package/dist/{problem-BW1KhzSG.js → problem-BreOl8b8.js} +14 -3
- package/dist/{problem-Blxe8S31.d.ts → problem-DD8LZFjc.d.ts} +21 -3
- package/dist/provider-BH5UWZJ6.d.ts +113 -0
- package/dist/provider-Di3sRutW.js +57 -0
- package/dist/query/index.d.ts +4 -2
- package/dist/query/index.js +4 -3
- package/dist/{query-CCbo44lG.js → query-BQ-NaZon.js} +141 -24
- package/dist/{queue-BYUCjr59.d.ts → queue-CLJurhdy.d.ts} +258 -83
- package/dist/react/index.d.ts +11 -7
- package/dist/react/index.js +7 -3
- package/dist/react/native/index.d.ts +116 -0
- package/dist/react/native/index.js +130 -0
- package/dist/react/server.d.ts +28 -10
- package/dist/react/server.js +22 -5
- package/dist/react/session.d.ts +2 -2
- package/dist/react-4ZqkP8da.js +79 -0
- package/dist/react-F80mF4-t.js +409 -0
- package/dist/react-router/index.d.ts +83 -0
- package/dist/react-router/index.js +89 -0
- package/dist/react-topic-seAWjL3_.js +38 -0
- package/dist/{read-set-DQFt1N_Y.js → read-set-DuKWC9Mj.js} +67 -25
- package/dist/realtime/index.d.ts +4 -5
- package/dist/realtime/index.js +144 -82
- package/dist/refusal-CeJWxmkH.js +61 -0
- package/dist/refusal-D1rgbzNq.d.ts +15 -0
- package/dist/replicas-CwrYp5Zj.js +94 -0
- package/dist/{view-Bq64ki8-.js → resolve-D_IcnvFd.js} +239 -289
- package/dist/{resolve-C15TJq77.d.ts → resolve-KW8nCeL6.d.ts} +29 -45
- package/dist/{resource-CRxxwkQq.js → resource-BsvzCMlX.js} +4 -4
- package/dist/{resource-D8iqWMr-.d.ts → resource-D6Uc7Sk7.d.ts} +5 -5
- package/dist/respond-BUgsXNgk.js +91 -0
- package/dist/respond-DoBijysA.d.ts +93 -0
- package/dist/result-D7y2fT87.d.ts +282 -0
- package/dist/{result-BKiliPY7.js → result-DzUbqgdW.js} +27 -2
- package/dist/run-state-CPo-1X2B.d.ts +12 -0
- package/dist/run-state-CgBKzYMW.js +13 -0
- package/dist/search-CUWCRYKL.js +9 -0
- package/dist/server/index.d.ts +143 -21
- package/dist/server/index.js +46 -14
- package/dist/{respond-D2OQl62-.d.ts → server-CeVeeXwz.d.ts} +225 -80
- package/dist/session-ChiXDZdZ.d.ts +72 -0
- package/dist/shared-CBxosKK3.js +75 -0
- package/dist/{shared-D1dRUrAg.js → shared-CxWmcyqB.js} +2 -1
- package/dist/shared-DDSjEGDR.d.ts +11 -0
- package/dist/sign-in-BCV5S2WZ.d.ts +49 -0
- package/dist/sign-in-Cb1mwv6X.js +86 -0
- package/dist/{signers-Cc6r98SW.d.ts → signers-4y62_VIi.d.ts} +13 -9
- package/dist/simplify-DDO0j0LI.js +83 -0
- package/dist/solid/index.d.ts +131 -0
- package/dist/solid/index.js +344 -0
- package/dist/solid-start/index.d.ts +75 -0
- package/dist/solid-start/index.js +58 -0
- package/dist/{spec-pins-C3oc-Tdp.js → spec-pins--j6mTok4.js} +8 -1
- package/dist/{spec-pins-CqorWDnO.d.ts → spec-pins-C89s6DyW.d.ts} +7 -0
- package/dist/sql/index.d.ts +330 -194
- package/dist/sql/index.js +34901 -6489
- package/dist/ssr/index.d.ts +6 -5
- package/dist/ssr/index.js +3 -3
- package/dist/{standard-D7r6dMUu.js → standard-BK0cqJ7y.js} +4 -3
- package/dist/{standard-J4YgMOLm.d.ts → standard-CYsm7xpT.d.ts} +1 -1
- package/dist/stats-D_AD9GGu.js +1123 -0
- package/dist/storage/index.d.ts +5 -5
- package/dist/storage/index.js +1027 -368
- package/dist/store-BdH5ruDx.js +66 -0
- package/dist/store-CGjgWu5n.d.ts +68 -0
- package/dist/streams/index.d.ts +76 -0
- package/dist/streams/index.js +77 -0
- package/dist/streams/redis/index.d.ts +52 -0
- package/dist/streams/redis/index.js +185 -0
- package/dist/stripe-BMj5LtsT.js +38 -0
- package/dist/stripe-D04h-QBT.d.ts +136 -0
- package/dist/{support-Dk6vdmEw.js → support-BivNqSpK.js} +35 -12
- package/dist/{support-view-Da5peKFg.d.ts → support-view-33Oi07TT.d.ts} +1 -1
- package/dist/svelte/index.d.ts +114 -0
- package/dist/svelte/index.js +344 -0
- package/dist/sveltekit/index.d.ts +116 -0
- package/dist/sveltekit/index.js +106 -0
- package/dist/tags-B99_U9Pp.js +39 -0
- package/dist/tags-Cx-LnIQP.d.ts +30 -0
- package/dist/tanstack-db/index.d.ts +71 -0
- package/dist/tanstack-db/index.js +72 -0
- package/dist/tanstack-start/index.d.ts +75 -0
- package/dist/tanstack-start/index.js +95 -0
- package/dist/tee-CoEppCER.js +101 -0
- package/dist/{template-TxrGI5jR.js → template--jDkl3UP.js} +34 -13
- package/dist/template-CwO38Do8.d.ts +6 -0
- package/dist/temporal-BJGitm-h.js +79 -0
- package/dist/{temporal-required-CAt4Dc9Z.js → temporal-required-BVvW7SYJ.js} +3 -2
- package/dist/tenant-I1TEZ_BX.js +27 -0
- package/dist/tenant-icPeuUBN.d.ts +17 -0
- package/dist/testing/index.d.ts +343 -37
- package/dist/testing/index.js +1186 -79
- package/dist/timing-CyTQPubY.js +92 -0
- package/dist/ttl-Hr34gRu8.js +12 -0
- package/dist/{types-Dnf_wRDz.d.ts → types-6BdhkmZe.d.ts} +111 -45
- package/dist/types-BI-0Sl2v.d.ts +359 -0
- package/dist/types-C05bxW-W.d.ts +220 -0
- package/dist/types-DGs5L0VN.d.ts +192 -0
- package/dist/types-TaiEeBGA.d.ts +156 -0
- package/dist/usage-CrvrL2vw.d.ts +177 -0
- package/dist/user-change-XzvgafU4.js +130 -0
- package/dist/vault-CSO7ss5C.d.ts +50 -0
- package/dist/vercel-connect/index.d.ts +47 -0
- package/dist/vercel-connect/index.js +119 -0
- package/dist/{verify-Ce49ETPz.js → verify-DL41hbvY.js} +85 -13
- package/dist/verify-DPuWngD4.d.ts +172 -0
- package/dist/{version-DM_Roffb.js → version-Bvv6aLjZ.js} +1 -1
- package/dist/view-BeFcRV6G.js +99 -0
- package/dist/{view-BEf0diC5.d.ts → view-DbxLNu8L.d.ts} +35 -32
- package/dist/vue/index.d.ts +141 -0
- package/dist/vue/index.js +362 -0
- package/dist/watch-DI34G86j.d.ts +60 -0
- package/dist/watch-Xuxrvxq-.js +122 -0
- package/dist/{wire-D2dT86vi.js → wire-DtZQ4sdE.js} +15 -5
- package/dist/workflow-builder-DJ1oHn8g.js +398 -0
- package/dist/workflow-sdk/builder/index.d.ts +85 -0
- package/dist/workflow-sdk/builder/index.js +250 -0
- package/dist/workflow-sdk/index.d.ts +14 -0
- package/dist/workflow-sdk/index.js +3 -0
- package/dist/workflow-sdk/world/index.d.ts +107 -0
- package/dist/workflow-sdk/world/index.js +702 -0
- package/dist/workflow-sdk-B3yLD6Br.d.ts +98 -0
- package/dist/workflow-sdk-C2WJ_G2O.js +173 -0
- package/dist/workflow-sdk-world-D-prir6O.js +1397 -0
- package/dist/workflows-B0j9WKPu.d.ts +185 -0
- package/dist/workflows-wu1WWBn7.js +216 -0
- package/package.json +470 -29
- package/schemas/ai-message-v1.json +258 -0
- package/schemas/config-v1.json +1074 -140
- package/schemas/doctor-report-v1.json +21 -1
- package/schemas/snapshot-v2.json +8 -0
- package/skills/better-supabase/SKILL.md +41 -12
- package/skills/better-supabase/references/frontend.md +96 -0
- package/skills/better-supabase/references/plugins.md +10 -6
- package/skills/better-supabase/references/troubleshooting.md +2 -1
- package/skills/better-supabase-api/SKILL.md +76 -22
- package/skills/better-supabase-api/references/adapters.md +207 -0
- package/skills/better-supabase-api/references/ai.md +125 -0
- package/skills/better-supabase-api/references/expo.md +65 -0
- package/skills/better-supabase-api/references/powersync.md +35 -0
- package/skills/better-supabase-api/references/streams-credentials.md +105 -0
- package/skills/better-supabase-auth/SKILL.md +62 -18
- package/skills/better-supabase-auth/references/authorization-providers.md +51 -0
- package/skills/better-supabase-testing/SKILL.md +3 -1
- package/dist/cli/config-dtoekM0v.js +0 -2
- package/dist/cli/gen-BJc9vdyu.js +0 -2
- package/dist/cli/gen-C2osRcr5.js +0 -2204
- package/dist/cli/read-sets-BfMQcKy8.js +0 -289
- package/dist/cli/sql-DzPbfngx.js +0 -348
- package/dist/entitlements-CTEBm7IB.js +0 -20
- package/dist/events-aIO7vsIk.d.ts +0 -230
- package/dist/executor-BunPOO-k.d.ts +0 -402
- package/dist/executor-XycESQPH.js +0 -94
- package/dist/impersonation-VfaGc4Q_.js +0 -41
- package/dist/index-BGdgBPdf.d.ts +0 -161
- package/dist/index-DOESKG27.d.ts +0 -100
- package/dist/index-DmXSxbLi.d.ts +0 -62
- package/dist/index-Dxn2a5cw.d.ts +0 -50
- package/dist/jobs/index.d.ts +0 -226
- package/dist/jobs/index.js +0 -1007
- package/dist/json-schema-m1fiwKgN.js +0 -208
- package/dist/kit-events-CTFDfSwb.js +0 -60
- package/dist/kit-transport-B82k1djG.d.ts +0 -33
- package/dist/kits-CGLLrNPd.js +0 -157
- package/dist/notifications/index.d.ts +0 -162
- package/dist/notifications/index.js +0 -264
- package/dist/orgs/index.d.ts +0 -132
- package/dist/orgs/index.js +0 -245
- package/dist/permdock-sql-C2Inc6Xc.d.ts +0 -29
- package/dist/permdock-sql-DgOfeixi.js +0 -51
- package/dist/plugin-DwARMuQp.js +0 -59
- package/dist/server-Csx2sRjg.js +0 -655
- package/dist/stats-Bqob3WqT.js +0 -592
- package/dist/support-DT-OhSxD.d.ts +0 -88
- package/dist/template-mbvlysOo.d.ts +0 -6
- package/dist/temporal-CVlIV2DZ.js +0 -40
- package/dist/user-change-CHFEUro1.js +0 -49
- package/dist/webhooks/index.d.ts +0 -285
- package/skills/better-supabase-auth/references/permdock.md +0 -100
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
/// <reference lib="esnext.temporal" />
|
|
2
|
+
import { t as AsyncResult, w as ErrorMapper } from "../../result-D7y2fT87.js";
|
|
3
|
+
import { i as sqlTransport, r as rpcTransport, t as BlockTransport } from "../../block-transport-DvaoPuZ9.js";
|
|
4
|
+
import { a as CredentialSubject, i as CredentialRef, r as CredentialProvider } from "../../provider-BH5UWZJ6.js";
|
|
5
|
+
import { r as BlockTemporalOptions } from "../../block-helpers-CKtbFcRv.js";
|
|
6
|
+
import { m as JobHandler } from "../../queue-CLJurhdy.js";
|
|
7
|
+
import { r as EventSink } from "../../cloud-event-C1JCc1bH.js";
|
|
8
|
+
//#region src/blocks/data-lifecycle/data-lifecycle.d.ts
|
|
9
|
+
interface StorageReply<T> {
|
|
10
|
+
readonly data: T | null;
|
|
11
|
+
readonly error: unknown;
|
|
12
|
+
}
|
|
13
|
+
/** An entry of `storage.from(bucket).list(prefix)`; folders have no `id`. */
|
|
14
|
+
interface StorageEntry {
|
|
15
|
+
readonly name: string;
|
|
16
|
+
readonly id: string | null;
|
|
17
|
+
}
|
|
18
|
+
/** The `supabase.storage.from(bucket)` methods the lifecycle blocks use. */
|
|
19
|
+
interface LifecycleBucket {
|
|
20
|
+
upload(path: string, body: Blob, options?: {
|
|
21
|
+
contentType?: string;
|
|
22
|
+
upsert?: boolean;
|
|
23
|
+
}): PromiseLike<StorageReply<unknown>>;
|
|
24
|
+
createSignedUrl(path: string, expiresIn: number, options?: {
|
|
25
|
+
download?: string | boolean;
|
|
26
|
+
}): PromiseLike<StorageReply<{
|
|
27
|
+
readonly signedUrl: string;
|
|
28
|
+
}>>;
|
|
29
|
+
list(path?: string, options?: {
|
|
30
|
+
limit?: number;
|
|
31
|
+
offset?: number;
|
|
32
|
+
}): PromiseLike<StorageReply<readonly StorageEntry[]>>;
|
|
33
|
+
remove(paths: string[]): PromiseLike<StorageReply<unknown>>;
|
|
34
|
+
}
|
|
35
|
+
/** `supabase.storage`, typed structurally. */
|
|
36
|
+
interface LifecycleStorage {
|
|
37
|
+
from(bucket: string): LifecycleBucket;
|
|
38
|
+
}
|
|
39
|
+
type DataExportStatus = "pending" | "running" | "ready" | "failed";
|
|
40
|
+
interface DataExport {
|
|
41
|
+
readonly id: string;
|
|
42
|
+
readonly subject: "user" | "organization";
|
|
43
|
+
readonly userId: string | undefined;
|
|
44
|
+
readonly organizationId: string | undefined;
|
|
45
|
+
readonly status: DataExportStatus;
|
|
46
|
+
readonly bucket: string;
|
|
47
|
+
/** Object paths, one file per table: `{id}/{schema.table}.ndjson` (or `.csv`). */
|
|
48
|
+
readonly files: readonly string[];
|
|
49
|
+
readonly error: string | undefined;
|
|
50
|
+
readonly requestedBy: string | undefined;
|
|
51
|
+
readonly requestedAt: Temporal.Instant;
|
|
52
|
+
readonly completedAt: Temporal.Instant | undefined;
|
|
53
|
+
/** After this the files are no longer served. */
|
|
54
|
+
readonly expiresAt: Temporal.Instant | undefined;
|
|
55
|
+
}
|
|
56
|
+
interface OrganizationDeletion {
|
|
57
|
+
readonly organizationId: string;
|
|
58
|
+
readonly requestedBy: string | undefined;
|
|
59
|
+
readonly requestedAt: Temporal.Instant;
|
|
60
|
+
readonly purgeAfter: Temporal.Instant;
|
|
61
|
+
readonly cancelledAt: Temporal.Instant | undefined;
|
|
62
|
+
readonly purgedAt: Temporal.Instant | undefined;
|
|
63
|
+
}
|
|
64
|
+
interface DataExportDownload {
|
|
65
|
+
readonly export: DataExport;
|
|
66
|
+
/** One signed URL per file, keyed by the table it holds. */
|
|
67
|
+
readonly files: readonly {
|
|
68
|
+
readonly table: string;
|
|
69
|
+
readonly url: string;
|
|
70
|
+
}[];
|
|
71
|
+
}
|
|
72
|
+
interface DataLifecycleOptions extends BlockTemporalOptions {
|
|
73
|
+
/** The caller's transport (`rpcTransport(supabase)`). */
|
|
74
|
+
readonly transport: BlockTransport;
|
|
75
|
+
/** The caller's `supabase.storage`, for `download`. */
|
|
76
|
+
readonly storage?: LifecycleStorage;
|
|
77
|
+
/** The module schema (`sql.modules.data-lifecycle.schema`), default `better_supabase`. */
|
|
78
|
+
readonly schema?: string;
|
|
79
|
+
readonly mappers?: readonly ErrorMapper[];
|
|
80
|
+
/** Lifetime of a signed download URL in seconds. Default 300. */
|
|
81
|
+
readonly downloadTtl?: number;
|
|
82
|
+
}
|
|
83
|
+
interface DataLifecycle {
|
|
84
|
+
/** Exports the caller's data, or a tenant's with `organizationId` (needs `organization.export`). */
|
|
85
|
+
requestExport(options?: {
|
|
86
|
+
readonly organizationId?: string;
|
|
87
|
+
}): AsyncResult<DataExport>;
|
|
88
|
+
/** The caller's exports, or a tenant's, newest first. */
|
|
89
|
+
exports(organizationId?: string): AsyncResult<readonly DataExport[]>;
|
|
90
|
+
/** Signed URLs for a ready export's files. */
|
|
91
|
+
download(exportId: string): AsyncResult<DataExportDownload>;
|
|
92
|
+
/**
|
|
93
|
+
* Disables the tenant and schedules its purge after `grace` (an
|
|
94
|
+
* interval such as `30 days` or a `Temporal.Duration`; default the
|
|
95
|
+
* module's `grace` option). Needs `organization.delete`.
|
|
96
|
+
*/
|
|
97
|
+
requestOrganizationDeletion(organizationId: string, options?: {
|
|
98
|
+
readonly grace?: Temporal.Duration | string;
|
|
99
|
+
}): AsyncResult<OrganizationDeletion>;
|
|
100
|
+
/** The requester or an owner cancels; `undefined` when nothing is pending. */
|
|
101
|
+
cancelOrganizationDeletion(organizationId: string): AsyncResult<OrganizationDeletion | undefined>;
|
|
102
|
+
/** The pending deletion, for members of the organization. */
|
|
103
|
+
organizationDeletion(organizationId: string): AsyncResult<OrganizationDeletion | undefined>;
|
|
104
|
+
}
|
|
105
|
+
/** Exports and organization deletion as the caller. */
|
|
106
|
+
export declare function createDataLifecycle(options: DataLifecycleOptions): DataLifecycle;
|
|
107
|
+
interface DataExporterOptions extends BlockTemporalOptions {
|
|
108
|
+
/** A service-role transport: the export functions are granted to `service_role` only. */
|
|
109
|
+
readonly transport: BlockTransport;
|
|
110
|
+
/** A service-role `supabase.storage`, to write the files. */
|
|
111
|
+
readonly storage: LifecycleStorage;
|
|
112
|
+
readonly schema?: string;
|
|
113
|
+
/** Rows read per call. Default 1000. */
|
|
114
|
+
readonly pageSize?: number;
|
|
115
|
+
/** The outbox `typePrefix`. Default `dev.better-supabase`. */
|
|
116
|
+
readonly typePrefix?: string;
|
|
117
|
+
/**
|
|
118
|
+
* `ndjson` (default) writes one JSON object per line; `csv` writes RFC
|
|
119
|
+
* 4180 CSV with a header row, nested values as JSON and formula-looking
|
|
120
|
+
* text prefixed with `'`, for people who open exports in a spreadsheet.
|
|
121
|
+
*/
|
|
122
|
+
readonly format?: "ndjson" | "csv";
|
|
123
|
+
readonly concurrency?: number;
|
|
124
|
+
}
|
|
125
|
+
/** The payload `job` expects. */
|
|
126
|
+
interface DataExportJob {
|
|
127
|
+
readonly exportId: string;
|
|
128
|
+
}
|
|
129
|
+
interface DataExporter {
|
|
130
|
+
/**
|
|
131
|
+
* Writes one NDJSON file per table, then marks the export ready (which
|
|
132
|
+
* emits `data_export.completed`). A failure marks it failed and returns the error.
|
|
133
|
+
*/
|
|
134
|
+
run(exportId: string, signal?: AbortSignal): AsyncResult<DataExport>;
|
|
135
|
+
/** A jobs handler: `queue.work('data-exports', exporter.job)`. */
|
|
136
|
+
readonly job: JobHandler<DataExportJob>;
|
|
137
|
+
/** An outbox sink that runs each `data_export.requested` export. */
|
|
138
|
+
sink(): EventSink;
|
|
139
|
+
}
|
|
140
|
+
/** Runs requested exports with a service-role client. */
|
|
141
|
+
export declare function createDataExporter(options: DataExporterOptions): DataExporter;
|
|
142
|
+
interface OrganizationPurgerOptions extends BlockTemporalOptions {
|
|
143
|
+
/** A service-role transport: `purge_organization()` is granted to `service_role` only. */
|
|
144
|
+
readonly transport: BlockTransport;
|
|
145
|
+
/** A service-role `supabase.storage`, to remove each bucket's organization prefix. */
|
|
146
|
+
readonly storage?: LifecycleStorage;
|
|
147
|
+
/**
|
|
148
|
+
* Buckets to clear: a name, for a bucket whose paths start with the
|
|
149
|
+
* organization id (`attachments`), or `{ bucket, path }` with a path
|
|
150
|
+
* template such as `orgs/{organizationId}/files`, or a function that
|
|
151
|
+
* returns the prefixes, for buckets laid out another way.
|
|
152
|
+
*/
|
|
153
|
+
readonly buckets?: readonly PurgeBucket[];
|
|
154
|
+
/** `createBilling(...)`, to cancel the subscription first. */
|
|
155
|
+
readonly billing?: {
|
|
156
|
+
cancelSubscription(organizationId: string): AsyncResult<unknown>;
|
|
157
|
+
};
|
|
158
|
+
/**
|
|
159
|
+
* Revokes the `credential_ref`s in the rows the purge deletes (provider
|
|
160
|
+
* keys, connector servers and grants, workflow credentials) before it
|
|
161
|
+
* deletes them. Only refs that carry the organization as their `tenant`
|
|
162
|
+
* are revoked; the rest are returned in `credentials.unrevoked`.
|
|
163
|
+
*/
|
|
164
|
+
readonly credentials?: CredentialProvider;
|
|
165
|
+
/**
|
|
166
|
+
* Also run the `sql.modules.data-lifecycle.options.anonymize` rules in
|
|
167
|
+
* `job`, after the due purges. Default false.
|
|
168
|
+
*/
|
|
169
|
+
readonly anonymize?: boolean;
|
|
170
|
+
readonly schema?: string;
|
|
171
|
+
}
|
|
172
|
+
/** A bucket the purger clears, and where the organization's objects are. */
|
|
173
|
+
type PurgeBucket = string | {
|
|
174
|
+
readonly bucket: string;
|
|
175
|
+
/** A prefix template with `{organizationId}`, or the prefixes for an id. */
|
|
176
|
+
readonly path: string | ((organizationId: string) => string | readonly string[]);
|
|
177
|
+
};
|
|
178
|
+
/** A `credential_ref` the purge deleted without revoking it. */
|
|
179
|
+
interface UnrevokedCredential {
|
|
180
|
+
/** `schema.table`. */
|
|
181
|
+
readonly table: string;
|
|
182
|
+
readonly column: string;
|
|
183
|
+
readonly ref: CredentialRef;
|
|
184
|
+
readonly subject: CredentialSubject;
|
|
185
|
+
/**
|
|
186
|
+
* `foreign`: the ref doesn't carry the organization as its tenant, so it
|
|
187
|
+
* may name a credential that someone else still uses; `no_provider`: the
|
|
188
|
+
* purger has no `credentials`; `not_revocable`: the provider can't revoke it.
|
|
189
|
+
*/
|
|
190
|
+
readonly reason: "foreign" | "no_provider" | "not_revocable";
|
|
191
|
+
}
|
|
192
|
+
interface OrganizationPurge {
|
|
193
|
+
readonly organizationId: string;
|
|
194
|
+
/** Rows deleted per table. */
|
|
195
|
+
readonly deleted: Readonly<Record<string, number>>;
|
|
196
|
+
/** Objects removed per bucket. */
|
|
197
|
+
readonly removed: Readonly<Record<string, number>>;
|
|
198
|
+
readonly credentials: {
|
|
199
|
+
/** Refs revoked through `credentials`. */
|
|
200
|
+
readonly revoked: number;
|
|
201
|
+
/** Refs in the purged rows the provider still holds, for the app to handle. */
|
|
202
|
+
readonly unrevoked: readonly UnrevokedCredential[];
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
interface OrganizationPurger {
|
|
206
|
+
/**
|
|
207
|
+
* Checks that the deletion is due, cancels billing, revokes the
|
|
208
|
+
* organization's credentials, removes the Storage prefixes, then deletes
|
|
209
|
+
* the rows.
|
|
210
|
+
*/
|
|
211
|
+
purge(organizationId: string): AsyncResult<OrganizationPurge>;
|
|
212
|
+
/** Purges every deletion past its grace period, oldest first; stops at the first error. */
|
|
213
|
+
purgeDue(options?: {
|
|
214
|
+
readonly limit?: number;
|
|
215
|
+
}): AsyncResult<readonly OrganizationPurge[]>;
|
|
216
|
+
/** A jobs handler for a cron queue: purges what is due. */
|
|
217
|
+
readonly job: JobHandler<{
|
|
218
|
+
readonly limit?: number;
|
|
219
|
+
}>;
|
|
220
|
+
/**
|
|
221
|
+
* Removes the files of exports past their `expiresAt` from Storage, then
|
|
222
|
+
* their rows; returns how many exports it removed. Needs `storage`.
|
|
223
|
+
*/
|
|
224
|
+
purgeExports(options?: {
|
|
225
|
+
readonly limit?: number;
|
|
226
|
+
}): AsyncResult<number>;
|
|
227
|
+
/**
|
|
228
|
+
* Applies the `options.anonymize` rules to the rows whose time is up, at
|
|
229
|
+
* most `limit` (1000) per rule; returns the rows anonymized per table.
|
|
230
|
+
*/
|
|
231
|
+
anonymizeDue(options?: {
|
|
232
|
+
readonly limit?: number;
|
|
233
|
+
}): AsyncResult<Readonly<Record<string, number>>>;
|
|
234
|
+
}
|
|
235
|
+
/** Purges organizations whose deletion grace period is over. */
|
|
236
|
+
export declare function createOrganizationPurger(options: OrganizationPurgerOptions): OrganizationPurger;
|
|
237
|
+
//#endregion
|
|
238
|
+
//#region src/sql/modules/data-lifecycle.d.ts
|
|
239
|
+
/** An app table in `options.tables`: its user and tenant columns. */
|
|
240
|
+
interface LifecycleTable {
|
|
241
|
+
/** The column holding the user id, for user exports. */
|
|
242
|
+
readonly user?: string;
|
|
243
|
+
/** The tenant column, for organization exports and the purge. */
|
|
244
|
+
readonly tenant?: string;
|
|
245
|
+
/** Delete its tenant rows in the purge. Default true. */
|
|
246
|
+
readonly purge?: boolean;
|
|
247
|
+
readonly omit?: readonly string[];
|
|
248
|
+
readonly export?: boolean;
|
|
249
|
+
}
|
|
250
|
+
//#endregion
|
|
251
|
+
export { type BlockTransport, type DataExport, type DataExportDownload, type DataExportJob, type DataExportStatus, type DataExporter, type DataExporterOptions, type DataLifecycle, type DataLifecycleOptions, type LifecycleBucket, type LifecycleStorage, type LifecycleTable, type OrganizationDeletion, type OrganizationPurge, type OrganizationPurger, type OrganizationPurgerOptions, type PurgeBucket, type StorageEntry, type UnrevokedCredential, rpcTransport, sqlTransport };
|
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
import { n as dbError } from "../../errors-B11Duf73.js";
|
|
2
|
+
import { a as ok, r as err, t as AsyncResult } from "../../result-DzUbqgdW.js";
|
|
3
|
+
import { n as credentialRefInTenant } from "../../provider-Di3sRutW.js";
|
|
4
|
+
import { n as rpcTransport, r as sqlTransport } from "../../block-transport-BLr-ZgLc.js";
|
|
5
|
+
import { D as stringsOf, O as textOf, c as errorText, d as isRecord, h as optionalText, i as blockCall, k as toInstant, m as optionalInstant, n as applyTemporal, x as recordsOf, y as recordOf } from "../../block-helpers-DWHxHsEQ.js";
|
|
6
|
+
import { t as toCsv } from "../../csv-CPAzEmB6.js";
|
|
7
|
+
import { t as fromStorageError } from "../../errors-DLjJHPLK.js";
|
|
8
|
+
//#region src/blocks/data-lifecycle/data-lifecycle.ts
|
|
9
|
+
const EXPORT_STATUSES = [
|
|
10
|
+
"pending",
|
|
11
|
+
"running",
|
|
12
|
+
"ready",
|
|
13
|
+
"failed"
|
|
14
|
+
];
|
|
15
|
+
function exportOf(value) {
|
|
16
|
+
const row = recordOf(value, "data_exports");
|
|
17
|
+
const status = EXPORT_STATUSES.find((candidate) => candidate === row["status"]);
|
|
18
|
+
if (status === void 0) throw new TypeError(`Unknown export status ${JSON.stringify(row["status"])}`);
|
|
19
|
+
return {
|
|
20
|
+
id: textOf(row["id"]),
|
|
21
|
+
subject: row["subject"] === "organization" ? "organization" : "user",
|
|
22
|
+
userId: optionalText(row["user_id"]),
|
|
23
|
+
organizationId: optionalText(row["organization_id"]),
|
|
24
|
+
status,
|
|
25
|
+
bucket: textOf(row["bucket"]),
|
|
26
|
+
files: stringsOf(row["files"]),
|
|
27
|
+
error: optionalText(row["error"]),
|
|
28
|
+
requestedBy: optionalText(row["requested_by"]),
|
|
29
|
+
requestedAt: toInstant(textOf(row["requested_at"])),
|
|
30
|
+
completedAt: optionalInstant(row["completed_at"]),
|
|
31
|
+
expiresAt: optionalInstant(row["expires_at"])
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
function deletionOf(value) {
|
|
35
|
+
const row = recordOf(value, "organization_deletions");
|
|
36
|
+
return {
|
|
37
|
+
organizationId: textOf(row["organization_id"]),
|
|
38
|
+
requestedBy: optionalText(row["requested_by"]),
|
|
39
|
+
requestedAt: toInstant(textOf(row["requested_at"])),
|
|
40
|
+
purgeAfter: toInstant(textOf(row["purge_after"])),
|
|
41
|
+
cancelledAt: optionalInstant(row["cancelled_at"]),
|
|
42
|
+
purgedAt: optionalInstant(row["purged_at"])
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
const optionalDeletion = (value) => isRecord(value) ? deletionOf(value) : void 0;
|
|
46
|
+
function stored(reply) {
|
|
47
|
+
return AsyncResult.from(async () => {
|
|
48
|
+
try {
|
|
49
|
+
const { data, error } = await reply;
|
|
50
|
+
if (error) return err(fromStorageError(error, "storage.objects"));
|
|
51
|
+
if (data === null || data === void 0) return err(dbError("network", "Storage returned no data"));
|
|
52
|
+
return ok(data);
|
|
53
|
+
} catch (cause) {
|
|
54
|
+
return err(fromStorageError(cause, "storage.objects"));
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
/** The table a file holds: `{id}/public.projects.ndjson` gives `public.projects`. */
|
|
59
|
+
const tableOf = (path) => path.slice(path.lastIndexOf("/") + 1).replace(/\.(ndjson|csv)$/, "");
|
|
60
|
+
/** Exports and organization deletion as the caller. */
|
|
61
|
+
function createDataLifecycle(options) {
|
|
62
|
+
applyTemporal(options);
|
|
63
|
+
const call = blockCall(options.transport, options.schema, options.mappers);
|
|
64
|
+
const ttl = options.downloadTtl ?? 300;
|
|
65
|
+
return {
|
|
66
|
+
requestExport: (request = {}) => call("request_data_export", request.organizationId === void 0 ? { subject: "user" } : {
|
|
67
|
+
subject: "organization",
|
|
68
|
+
tenant: request.organizationId
|
|
69
|
+
}, exportOf),
|
|
70
|
+
exports: (organizationId) => call("list_data_exports", { tenant: organizationId }, (value) => recordsOf(value, "list_data_exports").map(exportOf)),
|
|
71
|
+
download: (exportId) => call("get_data_export", { id: exportId }, (value) => value).andThen(async (value) => {
|
|
72
|
+
if (!isRecord(value)) return err(dbError("not_found", "No export you can see has this id", { hint: "DATA_EXPORT_NOT_FOUND" }));
|
|
73
|
+
const found = exportOf(value);
|
|
74
|
+
if (found.status !== "ready") return err(dbError("invalid_request", "The export is not ready", { hint: "DATA_EXPORT_NOT_READY" }));
|
|
75
|
+
if (!options.storage) return err(dbError("invalid_request", "Pass storage to createDataLifecycle to download exports"));
|
|
76
|
+
const bucket = options.storage.from(found.bucket);
|
|
77
|
+
const files = [];
|
|
78
|
+
for (const path of found.files) {
|
|
79
|
+
const signed = await stored(bucket.createSignedUrl(path, ttl, { download: true }));
|
|
80
|
+
if (!signed.ok) return signed;
|
|
81
|
+
files.push({
|
|
82
|
+
table: tableOf(path),
|
|
83
|
+
url: signed.data.signedUrl
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
return ok({
|
|
87
|
+
export: found,
|
|
88
|
+
files
|
|
89
|
+
});
|
|
90
|
+
}),
|
|
91
|
+
requestOrganizationDeletion: (organizationId, request = {}) => call("request_organization_deletion", {
|
|
92
|
+
tenant: organizationId,
|
|
93
|
+
grace: request.grace === void 0 ? void 0 : String(request.grace)
|
|
94
|
+
}, deletionOf),
|
|
95
|
+
cancelOrganizationDeletion: (organizationId) => call("cancel_organization_deletion", { tenant: organizationId }, optionalDeletion),
|
|
96
|
+
organizationDeletion: (organizationId) => call("organization_deletion", { tenant: organizationId }, optionalDeletion)
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/** Runs requested exports with a service-role client. */
|
|
100
|
+
function createDataExporter(options) {
|
|
101
|
+
applyTemporal(options);
|
|
102
|
+
const call = blockCall(options.transport, options.schema);
|
|
103
|
+
const pageSize = options.pageSize ?? 1e3;
|
|
104
|
+
const concurrency = options.concurrency ?? 4;
|
|
105
|
+
if (!Number.isInteger(concurrency) || concurrency < 1) throw new TypeError("createDataExporter: concurrency must be a whole number above zero");
|
|
106
|
+
const prefix = `${options.typePrefix ?? "dev.better-supabase"}.`;
|
|
107
|
+
const write = async (claimed, tables, signal) => {
|
|
108
|
+
const bucket = options.storage.from(claimed.bucket);
|
|
109
|
+
const csv = options.format === "csv";
|
|
110
|
+
const exportTable = async (table) => {
|
|
111
|
+
const lines = [];
|
|
112
|
+
const records = [];
|
|
113
|
+
let after;
|
|
114
|
+
do {
|
|
115
|
+
signal?.throwIfAborted();
|
|
116
|
+
const page = await call("data_export_rows", {
|
|
117
|
+
id: claimed.id,
|
|
118
|
+
table_name: table,
|
|
119
|
+
after,
|
|
120
|
+
page_size: pageSize
|
|
121
|
+
}, (value) => recordOf(value, "data_export_rows"));
|
|
122
|
+
if (!page.ok) return page;
|
|
123
|
+
const rows = Array.isArray(page.data["rows"]) ? page.data["rows"] : [];
|
|
124
|
+
for (const row of rows) if (csv) records.push(isRecord(row) ? row : { value: row });
|
|
125
|
+
else lines.push(JSON.stringify(row));
|
|
126
|
+
after = optionalText(page.data["after"]);
|
|
127
|
+
} while (after !== void 0);
|
|
128
|
+
const path = `${claimed.id}/${table}.${csv ? "csv" : "ndjson"}`;
|
|
129
|
+
const contentType = csv ? "text/csv" : "application/x-ndjson";
|
|
130
|
+
const body = new Blob(csv ? records.length === 0 ? [] : [toCsv(records)] : lines.length === 0 ? [] : [`${lines.join("\n")}\n`], { type: contentType });
|
|
131
|
+
const uploaded = await stored(bucket.upload(path, body, {
|
|
132
|
+
contentType,
|
|
133
|
+
upsert: true
|
|
134
|
+
}));
|
|
135
|
+
return uploaded.ok ? ok(path) : uploaded;
|
|
136
|
+
};
|
|
137
|
+
const files = [];
|
|
138
|
+
let failed;
|
|
139
|
+
let next = 0;
|
|
140
|
+
let stopped = false;
|
|
141
|
+
const worker = async () => {
|
|
142
|
+
while (!stopped && failed === void 0 && next < tables.length) {
|
|
143
|
+
const index = next;
|
|
144
|
+
next += 1;
|
|
145
|
+
let written;
|
|
146
|
+
try {
|
|
147
|
+
written = await exportTable(tables[index]);
|
|
148
|
+
} catch (cause) {
|
|
149
|
+
stopped = true;
|
|
150
|
+
throw cause;
|
|
151
|
+
}
|
|
152
|
+
if (!written.ok) {
|
|
153
|
+
failed ??= written;
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
files[index] = written.data;
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
await Promise.all(Array.from({ length: Math.min(concurrency, tables.length) }, worker));
|
|
160
|
+
return failed ?? ok(files);
|
|
161
|
+
};
|
|
162
|
+
const run = (exportId, signal) => call("claim_data_export", { id: exportId }, (value) => value).andThen(async (value) => {
|
|
163
|
+
if (!isRecord(value)) return err(dbError("not_found", "No pending export has this id", { hint: "DATA_EXPORT_NOT_FOUND" }));
|
|
164
|
+
const claimed = exportOf(value);
|
|
165
|
+
let written;
|
|
166
|
+
try {
|
|
167
|
+
written = await write(claimed, stringsOf(value["tables"]), signal);
|
|
168
|
+
} catch (cause) {
|
|
169
|
+
written = err(dbError(signal?.aborted ? "aborted" : "raised", errorText(cause), { hint: "DATA_EXPORT_FAILED" }));
|
|
170
|
+
}
|
|
171
|
+
if (!written.ok) {
|
|
172
|
+
await call("fail_data_export", {
|
|
173
|
+
id: claimed.id,
|
|
174
|
+
error: written.error.message
|
|
175
|
+
}, () => void 0);
|
|
176
|
+
return written;
|
|
177
|
+
}
|
|
178
|
+
return call("complete_data_export", {
|
|
179
|
+
id: claimed.id,
|
|
180
|
+
files: written.data
|
|
181
|
+
}, exportOf);
|
|
182
|
+
});
|
|
183
|
+
return {
|
|
184
|
+
run,
|
|
185
|
+
job: async (payload, _job, signal) => {
|
|
186
|
+
await run(payload.exportId, signal).orThrow();
|
|
187
|
+
},
|
|
188
|
+
sink: () => ({ async send(events) {
|
|
189
|
+
for (const event of events) {
|
|
190
|
+
if ((event.type.startsWith(prefix) ? event.type.slice(prefix.length) : event.type) !== "data_export.requested" || !isRecord(event.data)) continue;
|
|
191
|
+
const id = optionalText(event.data["exportId"]);
|
|
192
|
+
if (id !== void 0) await run(id).orThrow();
|
|
193
|
+
}
|
|
194
|
+
} })
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
/** The prefixes an entry of `buckets` clears for an organization. */
|
|
198
|
+
function bucketPrefixes(entry, organizationId) {
|
|
199
|
+
if (typeof entry === "string") return ok({
|
|
200
|
+
bucket: entry,
|
|
201
|
+
prefixes: [organizationId]
|
|
202
|
+
});
|
|
203
|
+
const paths = typeof entry.path === "function" ? entry.path(organizationId) : entry.path.replaceAll("{organizationId}", organizationId);
|
|
204
|
+
const prefixes = (typeof paths === "string" ? [paths] : [...paths]).map((path) => path.replace(/\/+$/, ""));
|
|
205
|
+
const unsafe = prefixes.find((prefix) => !prefix.includes(organizationId));
|
|
206
|
+
if (unsafe !== void 0) return err(dbError("invalid_request", `buckets.${entry.bucket}: the prefix "${unsafe}" doesn't contain the organization id, so it could clear other tenants' objects`));
|
|
207
|
+
return ok({
|
|
208
|
+
bucket: entry.bucket,
|
|
209
|
+
prefixes
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
const REMOVE_BATCH = 1e3;
|
|
213
|
+
async function removePrefix(bucket, prefix) {
|
|
214
|
+
const files = [];
|
|
215
|
+
const folders = [prefix];
|
|
216
|
+
while (folders.length > 0) {
|
|
217
|
+
const folder = folders.pop() ?? prefix;
|
|
218
|
+
for (let offset = 0;; offset += REMOVE_BATCH) {
|
|
219
|
+
const page = await stored(bucket.list(folder, {
|
|
220
|
+
limit: REMOVE_BATCH,
|
|
221
|
+
offset
|
|
222
|
+
}));
|
|
223
|
+
if (!page.ok) return page;
|
|
224
|
+
for (const entry of page.data) {
|
|
225
|
+
const path = `${folder}/${entry.name}`;
|
|
226
|
+
if (entry.id === null) folders.push(path);
|
|
227
|
+
else files.push(path);
|
|
228
|
+
}
|
|
229
|
+
if (page.data.length < REMOVE_BATCH) break;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
for (let start = 0; start < files.length; start += REMOVE_BATCH) {
|
|
233
|
+
const removed = await stored(bucket.remove(files.slice(start, start + REMOVE_BATCH)));
|
|
234
|
+
if (!removed.ok) return removed;
|
|
235
|
+
}
|
|
236
|
+
return ok(files.length);
|
|
237
|
+
}
|
|
238
|
+
function purgeCredentialOf(value) {
|
|
239
|
+
if (!isRecord(value)) return void 0;
|
|
240
|
+
const ref = value["ref"];
|
|
241
|
+
if (!isRecord(ref) || typeof ref["provider"] !== "string") return void 0;
|
|
242
|
+
const userId = optionalText(value["user_id"]);
|
|
243
|
+
return {
|
|
244
|
+
table: textOf(value["table"]),
|
|
245
|
+
column: textOf(value["column"]),
|
|
246
|
+
ref,
|
|
247
|
+
subject: userId === void 0 ? { type: "app" } : {
|
|
248
|
+
type: "user",
|
|
249
|
+
id: userId
|
|
250
|
+
},
|
|
251
|
+
inTenant: value["in_tenant"] === true
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
/** Purges organizations whose deletion grace period is over. */
|
|
255
|
+
function createOrganizationPurger(options) {
|
|
256
|
+
applyTemporal(options);
|
|
257
|
+
const call = blockCall(options.transport, options.schema);
|
|
258
|
+
const revokeCredentials = (organizationId, rows) => AsyncResult.from(async () => {
|
|
259
|
+
let revoked = 0;
|
|
260
|
+
const unrevoked = [];
|
|
261
|
+
const keep = (row, reason) => {
|
|
262
|
+
unrevoked.push({
|
|
263
|
+
table: row.table,
|
|
264
|
+
column: row.column,
|
|
265
|
+
ref: row.ref,
|
|
266
|
+
subject: row.subject,
|
|
267
|
+
reason
|
|
268
|
+
});
|
|
269
|
+
};
|
|
270
|
+
for (const row of rows) if (!row.inTenant || !credentialRefInTenant(row.ref, organizationId)) keep(row, "foreign");
|
|
271
|
+
else if (options.credentials === void 0) keep(row, "no_provider");
|
|
272
|
+
else if (options.credentials.capabilities(row.ref).revoke) {
|
|
273
|
+
const result = await options.credentials.revoke(row.ref, { subject: row.subject });
|
|
274
|
+
if (!result.ok) return result;
|
|
275
|
+
revoked += 1;
|
|
276
|
+
} else keep(row, "not_revocable");
|
|
277
|
+
return ok({
|
|
278
|
+
revoked,
|
|
279
|
+
unrevoked
|
|
280
|
+
});
|
|
281
|
+
});
|
|
282
|
+
const purge = (organizationId) => AsyncResult.from(async () => {
|
|
283
|
+
const refs = await call("organization_credential_refs", { tenant: organizationId }, (value) => Array.isArray(value) ? value.flatMap((row) => {
|
|
284
|
+
const parsed = purgeCredentialOf(row);
|
|
285
|
+
return parsed ? [parsed] : [];
|
|
286
|
+
}) : []);
|
|
287
|
+
if (!refs.ok) return refs;
|
|
288
|
+
if (options.billing) {
|
|
289
|
+
const cancelled = await options.billing.cancelSubscription(organizationId);
|
|
290
|
+
if (!cancelled.ok) return cancelled;
|
|
291
|
+
}
|
|
292
|
+
const credentials = await revokeCredentials(organizationId, refs.data);
|
|
293
|
+
if (!credentials.ok) return credentials;
|
|
294
|
+
const removed = {};
|
|
295
|
+
for (const entry of options.buckets ?? []) {
|
|
296
|
+
if (!options.storage) return err(dbError("invalid_request", "Pass storage to clear buckets"));
|
|
297
|
+
const target = bucketPrefixes(entry, organizationId);
|
|
298
|
+
if (!target.ok) return target;
|
|
299
|
+
const { bucket, prefixes } = target.data;
|
|
300
|
+
for (const prefix of prefixes) {
|
|
301
|
+
const count = await removePrefix(options.storage.from(bucket), prefix);
|
|
302
|
+
if (!count.ok) return count;
|
|
303
|
+
removed[bucket] = (removed[bucket] ?? 0) + count.data;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
return call("purge_organization", { tenant: organizationId }, (value) => {
|
|
307
|
+
const row = recordOf(value, "purge_organization");
|
|
308
|
+
const deleted = isRecord(row["deleted"]) ? row["deleted"] : {};
|
|
309
|
+
return {
|
|
310
|
+
organizationId: textOf(row["organizationId"]),
|
|
311
|
+
deleted: Object.fromEntries(Object.entries(deleted).map(([table, count]) => [table, Number(count)])),
|
|
312
|
+
removed,
|
|
313
|
+
credentials: credentials.data
|
|
314
|
+
};
|
|
315
|
+
});
|
|
316
|
+
});
|
|
317
|
+
const purgeDue = (due = {}) => call("due_organization_deletions", { max_rows: due.limit }, (value) => recordsOf(value, "due_organization_deletions").map(deletionOf)).andThen(async (deletions) => {
|
|
318
|
+
const purged = [];
|
|
319
|
+
for (const deletion of deletions) {
|
|
320
|
+
const result = await purge(deletion.organizationId);
|
|
321
|
+
if (!result.ok) return result;
|
|
322
|
+
purged.push(result.data);
|
|
323
|
+
}
|
|
324
|
+
return ok(purged);
|
|
325
|
+
});
|
|
326
|
+
const purgeExports = (expired = {}) => call("expired_data_exports", { max_rows: expired.limit ?? 100 }, (value) => recordsOf(value, "expired_data_exports").map((row) => ({
|
|
327
|
+
id: textOf(row["id"]),
|
|
328
|
+
bucket: textOf(row["bucket"]),
|
|
329
|
+
files: Array.isArray(row["files"]) ? row["files"].filter((file) => typeof file === "string") : []
|
|
330
|
+
}))).andThen(async (exports) => {
|
|
331
|
+
if (exports.length === 0) return ok(0);
|
|
332
|
+
const storage = options.storage;
|
|
333
|
+
if (!storage) return err(dbError("invalid_request", "Pass storage to remove export files"));
|
|
334
|
+
for (const entry of exports) for (let start = 0; start < entry.files.length; start += REMOVE_BATCH) {
|
|
335
|
+
const removed = await stored(storage.from(entry.bucket).remove(entry.files.slice(start, start + REMOVE_BATCH)));
|
|
336
|
+
if (!removed.ok) return removed;
|
|
337
|
+
}
|
|
338
|
+
return call("forget_data_exports", { ids: exports.map((entry) => entry.id) }, (value) => Number(value ?? 0));
|
|
339
|
+
});
|
|
340
|
+
const anonymizeDue = (due = {}) => call("anonymize_due", { max_rows: due.limit }, (value) => Object.fromEntries(Object.entries(isRecord(value) ? value : {}).map(([table, count]) => [table, Number(count)])));
|
|
341
|
+
return {
|
|
342
|
+
purgeExports,
|
|
343
|
+
purge,
|
|
344
|
+
purgeDue,
|
|
345
|
+
anonymizeDue,
|
|
346
|
+
job: async (payload) => {
|
|
347
|
+
await purgeDue(payload).orThrow();
|
|
348
|
+
if (options.anonymize) await anonymizeDue().orThrow();
|
|
349
|
+
}
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
//#endregion
|
|
353
|
+
export { createDataExporter, createDataLifecycle, createOrganizationPurger, rpcTransport, sqlTransport };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { t as AsyncResult } from "../../result-D7y2fT87.js";
|
|
2
|
+
import { t as SqlClient } from "../../executor-DbvExCFC.js";
|
|
3
|
+
import { i as hasEntitlement, n as EntitlementKey, t as EntitlementClaimOptions } from "../../entitlements-DHrY2UDZ.js";
|
|
4
|
+
//#region src/blocks/entitlements/entitlements.d.ts
|
|
5
|
+
/** The Stripe event sent when a customer's active entitlements change. */
|
|
6
|
+
export declare const ENTITLEMENTS_UPDATED = "entitlements.active_entitlement_summary.updated";
|
|
7
|
+
/**
|
|
8
|
+
* Users whose `memberships` claim carries the entitlements of the Stripe
|
|
9
|
+
* customer in an `entitlements.active_entitlement_summary.updated` event, so
|
|
10
|
+
* a job can invalidate their sessions. Empty for other payloads.
|
|
11
|
+
*/
|
|
12
|
+
export declare function entitlementMembers(sql: SqlClient, payload: unknown): AsyncResult<readonly string[]>;
|
|
13
|
+
//#endregion
|
|
14
|
+
export { type EntitlementClaimOptions, type EntitlementKey, hasEntitlement };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { n as entitlementMembers, t as ENTITLEMENTS_UPDATED } from "../../entitlements-DRl6ZJUm.js";
|
|
2
|
+
//#region src/auth/entitlements.ts
|
|
3
|
+
/**
|
|
4
|
+
* Whether the session's plan-features claim grants `key` in `tenantId`.
|
|
5
|
+
* `claim` is `config.claims.features` (default `features`), the claim
|
|
6
|
+
* `better_supabase.feature_claims()` fills, or `{ claim, keys }` when
|
|
7
|
+
* `entitlements.claim.keys` writes short codes. The claim is as fresh as the
|
|
8
|
+
* token: enforce it in RLS with `better_supabase.has_entitlement()`, and
|
|
9
|
+
* refresh the session after checkout. A tenant left out by
|
|
10
|
+
* `entitlements.claim.maxTenants` reads as not granted.
|
|
11
|
+
*/
|
|
12
|
+
function hasEntitlement(session, tenantId, key, claim = "features") {
|
|
13
|
+
if (session.kind !== "user") return false;
|
|
14
|
+
const options = typeof claim === "string" ? { claim } : claim;
|
|
15
|
+
const claims = session.claims;
|
|
16
|
+
if (!isRecord(claims)) return false;
|
|
17
|
+
const features = claims[options.claim ?? "features"];
|
|
18
|
+
if (!isRecord(features) || !Object.hasOwn(features, tenantId)) return false;
|
|
19
|
+
const keys = features[tenantId];
|
|
20
|
+
const code = options.keys?.[key] ?? key;
|
|
21
|
+
return Array.isArray(keys) && keys.includes(code);
|
|
22
|
+
}
|
|
23
|
+
const isRecord = (value) => typeof value === "object" && value !== null;
|
|
24
|
+
//#endregion
|
|
25
|
+
export { ENTITLEMENTS_UPDATED, entitlementMembers, hasEntitlement };
|