better-supabase 0.8.0 → 0.10.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 +147 -83
- package/bin/better-supabase.js +14 -2
- package/dist/access-sql-DUSSMaC3.js +201 -0
- package/dist/actor-BAhb-d1S.d.ts +104 -0
- package/dist/actor-KHDOKGb1.js +151 -0
- package/dist/adapter-rmWaLNe3.js +1984 -0
- package/dist/agents-ByYUSZxT.d.ts +111 -0
- package/dist/ai-cache-CkxtAt4P.d.ts +70 -0
- package/dist/ai-cache-DPiuJ-zJ.js +84 -0
- package/dist/ai-chat-al8b3spK.d.ts +608 -0
- package/dist/ai-files-BXtV3ygd.js +331 -0
- package/dist/ai-sdk/agents/index.d.ts +154 -10
- package/dist/ai-sdk/agents/index.js +172 -17
- package/dist/ai-sdk/batches/index.d.ts +4 -4
- package/dist/ai-sdk/batches/index.js +5 -5
- package/dist/ai-sdk/cache/index.d.ts +2 -2
- package/dist/ai-sdk/cache/index.js +1 -1
- package/dist/ai-sdk/chat/index.d.ts +1 -1
- package/dist/ai-sdk/chat/index.js +7 -6
- package/dist/ai-sdk/embeddings/index.d.ts +3 -3
- package/dist/ai-sdk/embeddings/index.js +1 -2
- package/dist/ai-sdk/files/index.d.ts +2 -2
- package/dist/ai-sdk/files/index.js +4 -4
- package/dist/ai-sdk/index.d.ts +7 -6
- package/dist/ai-sdk/index.js +4 -3
- package/dist/ai-sdk/mcp/index.d.ts +4 -4
- package/dist/ai-sdk/mcp/index.js +6 -6
- package/dist/ai-sdk/memory/index.d.ts +5 -2
- package/dist/ai-sdk/memory/index.js +2 -2
- package/dist/ai-sdk/react/index.js +1 -2
- package/dist/ai-sdk/workflow/index.d.ts +5 -4
- package/dist/ai-sdk/workflow/index.js +8 -8
- package/dist/ai-tasks-Di0gmJOX.d.ts +157 -0
- package/dist/announcements-HF7LuFw5.js +128 -0
- package/dist/api-CFjuYKFY.js +680 -0
- package/dist/api-XJcQON_7.d.ts +411 -0
- package/dist/api-keys-C1IZF7p8.js +318 -0
- package/dist/api-keys-EdSNjGIZ.d.ts +205 -0
- package/dist/app-tables-BRjMcWhW.js +819 -0
- package/dist/app-tables-DVidEHOI.d.ts +35 -0
- package/dist/approvals-DqlPHBHI.d.ts +124 -0
- package/dist/arazzo/index.d.ts +5 -5
- package/dist/arazzo/index.js +6 -6
- package/dist/assistant-BZyhQ8bd.d.ts +148 -0
- package/dist/astro/index.d.ts +9 -8
- package/dist/astro/index.js +10 -7
- package/dist/asyncapi/index.d.ts +4 -4
- package/dist/asyncapi/index.js +6 -6
- package/dist/attachments-C8FEBBKE.js +264 -0
- package/dist/attributes-D4mA7WhI.js +38 -0
- package/dist/audit-log-CRgiHlRh.js +786 -0
- package/dist/auth-CdBKt0CS.js +20 -0
- package/dist/auth-reply-B_dW4jHJ.js +31 -0
- package/dist/auth-reply-Dj124sbX.d.ts +11 -0
- package/dist/authorization-CdJRoZgV.d.ts +1435 -0
- package/dist/authorization-hooks-Do5djkpz.d.ts +214 -0
- package/dist/authorizer-dVVN05Un.js +126 -0
- package/dist/base64-BmeCBgGo.js +42 -0
- package/dist/batch-limit-DKVQDz4o.js +5 -0
- package/dist/before-route-B98js9m_.js +30 -0
- package/dist/better-result/index.d.ts +5 -5
- package/dist/better-result/index.js +1 -1
- package/dist/bind-DkaP_0iS.d.ts +70 -0
- package/dist/block-env-CBd_SoL5.js +29 -0
- package/dist/block-env-Dxl7rsI0.d.ts +10 -0
- package/dist/block-events-DD9Q_NUz.js +96 -0
- package/dist/block-fields-5UA84ZUg.d.ts +55 -0
- package/dist/block-fields-BANwJ9Y_.js +139 -0
- package/dist/block-helpers-7pMBVsE6.d.ts +37 -0
- package/dist/block-helpers-BfVCR5Fc.js +264 -0
- package/dist/block-hooks-ByKlh8Qy.js +114 -0
- package/dist/block-hooks-C_WaodoA.d.ts +107 -0
- package/dist/block-transport-G4t1umrR.js +85 -0
- package/dist/block-transport-NbUJygA7.d.ts +70 -0
- package/dist/blocks/access-requests/index.d.ts +98 -0
- package/dist/blocks/access-requests/index.js +99 -0
- package/dist/blocks/agents/index.d.ts +21 -3
- package/dist/blocks/agents/index.js +64 -18
- package/dist/blocks/ai-cache/index.d.ts +7 -2
- package/dist/blocks/ai-cache/index.js +15 -3
- package/dist/blocks/ai-chat/index.d.ts +22 -3
- package/dist/blocks/ai-chat/index.js +29 -3
- package/dist/blocks/ai-chat/react/index.d.ts +12 -46
- package/dist/blocks/ai-chat/react/index.js +43 -335
- package/dist/blocks/ai-chat/solid/index.d.ts +34 -0
- package/dist/blocks/ai-chat/solid/index.js +41 -0
- package/dist/blocks/ai-chat/svelte/index.d.ts +34 -0
- package/dist/blocks/ai-chat/svelte/index.js +41 -0
- package/dist/blocks/ai-chat/vue/index.d.ts +34 -0
- package/dist/blocks/ai-chat/vue/index.js +41 -0
- package/dist/blocks/ai-files/index.d.ts +10 -3
- package/dist/blocks/ai-files/index.js +16 -3
- package/dist/blocks/ai-providers/index.d.ts +18 -3
- package/dist/blocks/ai-providers/index.js +40 -15
- package/dist/blocks/ai-tasks/index.d.ts +9 -2
- package/dist/blocks/ai-tasks/index.js +70 -21
- package/dist/blocks/announcements/index.d.ts +18 -3
- package/dist/blocks/announcements/index.js +27 -3
- package/dist/blocks/announcements/react/index.d.ts +4 -14
- package/dist/blocks/announcements/react/index.js +22 -70
- package/dist/blocks/announcements/solid/index.d.ts +13 -0
- package/dist/blocks/announcements/solid/index.js +14 -0
- package/dist/blocks/announcements/svelte/index.d.ts +13 -0
- package/dist/blocks/announcements/svelte/index.js +14 -0
- package/dist/blocks/announcements/vue/index.d.ts +13 -0
- package/dist/blocks/announcements/vue/index.js +14 -0
- package/dist/blocks/api-keys/index.d.ts +24 -7
- package/dist/blocks/api-keys/index.js +29 -294
- package/dist/blocks/api-keys/react/index.d.ts +29 -0
- package/dist/blocks/api-keys/react/index.js +43 -0
- package/dist/blocks/api-keys/react/server.d.ts +7 -0
- package/dist/blocks/api-keys/react/server.js +7 -0
- package/dist/blocks/api-keys/solid/index.d.ts +13 -0
- package/dist/blocks/api-keys/solid/index.js +14 -0
- package/dist/blocks/api-keys/svelte/index.d.ts +13 -0
- package/dist/blocks/api-keys/svelte/index.js +14 -0
- package/dist/blocks/api-keys/vue/index.d.ts +13 -0
- package/dist/blocks/api-keys/vue/index.js +14 -0
- package/dist/blocks/approvals/index.d.ts +22 -0
- package/dist/blocks/approvals/index.js +189 -0
- package/dist/blocks/attachments/index.d.ts +18 -227
- package/dist/blocks/attachments/index.js +26 -242
- package/dist/blocks/audit/index.d.ts +72 -365
- package/dist/blocks/audit/index.js +91 -714
- package/dist/blocks/audit/react/index.d.ts +26 -0
- package/dist/blocks/audit/react/index.js +44 -0
- package/dist/blocks/audit/react/server.d.ts +7 -0
- package/dist/blocks/audit/react/server.js +7 -0
- package/dist/blocks/audit/solid/index.d.ts +13 -0
- package/dist/blocks/audit/solid/index.js +14 -0
- package/dist/blocks/audit/svelte/index.d.ts +13 -0
- package/dist/blocks/audit/svelte/index.js +14 -0
- package/dist/blocks/audit/vue/index.d.ts +13 -0
- package/dist/blocks/audit/vue/index.js +14 -0
- package/dist/blocks/billing/index.d.ts +37 -12
- package/dist/blocks/billing/index.js +43 -12
- package/dist/blocks/billing/react/index.d.ts +34 -0
- package/dist/blocks/billing/react/index.js +36 -0
- package/dist/blocks/billing/react/server.d.ts +7 -0
- package/dist/blocks/billing/react/server.js +7 -0
- package/dist/blocks/billing/solid/index.d.ts +15 -0
- package/dist/blocks/billing/solid/index.js +14 -0
- package/dist/blocks/billing/svelte/index.d.ts +15 -0
- package/dist/blocks/billing/svelte/index.js +14 -0
- package/dist/blocks/billing/vue/index.d.ts +15 -0
- package/dist/blocks/billing/vue/index.js +14 -0
- package/dist/blocks/bookings/index.d.ts +36 -0
- package/dist/blocks/bookings/index.js +28 -0
- package/dist/blocks/bookings/react/index.d.ts +31 -0
- package/dist/blocks/bookings/react/index.js +59 -0
- package/dist/blocks/bookings/react/server.d.ts +6 -0
- package/dist/blocks/bookings/react/server.js +7 -0
- package/dist/blocks/bookings/solid/index.d.ts +13 -0
- package/dist/blocks/bookings/solid/index.js +14 -0
- package/dist/blocks/bookings/svelte/index.d.ts +13 -0
- package/dist/blocks/bookings/svelte/index.js +14 -0
- package/dist/blocks/bookings/vue/index.d.ts +13 -0
- package/dist/blocks/bookings/vue/index.js +14 -0
- package/dist/blocks/bulk/index.d.ts +146 -0
- package/dist/blocks/bulk/index.js +154 -0
- package/dist/blocks/calendar/index.d.ts +20 -0
- package/dist/blocks/calendar/index.js +33 -0
- package/dist/blocks/calendar/react/index.d.ts +26 -0
- package/dist/blocks/calendar/react/index.js +58 -0
- package/dist/blocks/calendar/react/server.d.ts +6 -0
- package/dist/blocks/calendar/react/server.js +7 -0
- package/dist/blocks/calendar/solid/index.d.ts +13 -0
- package/dist/blocks/calendar/solid/index.js +14 -0
- package/dist/blocks/calendar/svelte/index.d.ts +13 -0
- package/dist/blocks/calendar/svelte/index.js +14 -0
- package/dist/blocks/calendar/vue/index.d.ts +13 -0
- package/dist/blocks/calendar/vue/index.js +14 -0
- package/dist/blocks/catalog/index.d.ts +224 -0
- package/dist/blocks/catalog/index.js +292 -0
- package/dist/blocks/collections/index.d.ts +184 -0
- package/dist/blocks/collections/index.js +208 -0
- package/dist/blocks/comments/index.d.ts +19 -166
- package/dist/blocks/comments/index.js +26 -207
- package/dist/blocks/comments/react/index.d.ts +27 -0
- package/dist/blocks/comments/react/index.js +45 -0
- package/dist/blocks/comments/react/server.d.ts +7 -0
- package/dist/blocks/comments/react/server.js +7 -0
- package/dist/blocks/comments/solid/index.d.ts +13 -0
- package/dist/blocks/comments/solid/index.js +14 -0
- package/dist/blocks/comments/svelte/index.d.ts +13 -0
- package/dist/blocks/comments/svelte/index.js +14 -0
- package/dist/blocks/comments/vue/index.d.ts +13 -0
- package/dist/blocks/comments/vue/index.js +14 -0
- package/dist/blocks/connectors/index.d.ts +21 -3
- package/dist/blocks/connectors/index.js +53 -18
- package/dist/blocks/custom-fields/index.d.ts +62 -0
- package/dist/blocks/custom-fields/index.js +85 -0
- package/dist/blocks/data-lifecycle/index.d.ts +114 -9
- package/dist/blocks/data-lifecycle/index.js +98 -12
- package/dist/blocks/deals/index.d.ts +262 -0
- package/dist/blocks/deals/index.js +380 -0
- package/dist/blocks/documents/index.d.ts +17 -0
- package/dist/blocks/documents/index.js +118 -0
- package/dist/blocks/domains/index.d.ts +117 -0
- package/dist/blocks/domains/index.js +118 -0
- package/dist/blocks/drive/index.d.ts +296 -0
- package/dist/blocks/drive/index.js +483 -0
- package/dist/blocks/employees/index.d.ts +205 -0
- package/dist/blocks/employees/index.js +289 -0
- package/dist/blocks/engagements/index.d.ts +125 -0
- package/dist/blocks/engagements/index.js +143 -0
- package/dist/blocks/entitlements/index.d.ts +40 -4
- package/dist/blocks/entitlements/index.js +14 -24
- package/dist/blocks/entitlements/react/index.d.ts +24 -0
- package/dist/blocks/entitlements/react/index.js +35 -0
- package/dist/blocks/entitlements/react/server.d.ts +6 -0
- package/dist/blocks/entitlements/react/server.js +7 -0
- package/dist/blocks/entitlements/solid/index.d.ts +13 -0
- package/dist/blocks/entitlements/solid/index.js +14 -0
- package/dist/blocks/entitlements/svelte/index.d.ts +13 -0
- package/dist/blocks/entitlements/svelte/index.js +14 -0
- package/dist/blocks/entitlements/vue/index.d.ts +13 -0
- package/dist/blocks/entitlements/vue/index.js +14 -0
- package/dist/blocks/flags/index.d.ts +61 -187
- package/dist/blocks/flags/index.js +65 -253
- package/dist/blocks/forms/index.d.ts +302 -0
- package/dist/blocks/forms/index.js +341 -0
- package/dist/blocks/forms/react/index.d.ts +16 -0
- package/dist/blocks/forms/react/index.js +25 -0
- package/dist/blocks/forms/react/server.d.ts +6 -0
- package/dist/blocks/forms/react/server.js +7 -0
- package/dist/blocks/forms/solid/index.d.ts +13 -0
- package/dist/blocks/forms/solid/index.js +14 -0
- package/dist/blocks/forms/svelte/index.d.ts +13 -0
- package/dist/blocks/forms/svelte/index.js +14 -0
- package/dist/blocks/forms/vue/index.d.ts +13 -0
- package/dist/blocks/forms/vue/index.js +14 -0
- package/dist/blocks/hiring/index.d.ts +154 -0
- package/dist/blocks/hiring/index.js +180 -0
- package/dist/blocks/identities/index.d.ts +83 -0
- package/dist/blocks/identities/index.js +103 -0
- package/dist/blocks/imports/index.d.ts +159 -0
- package/dist/blocks/imports/index.js +227 -0
- package/dist/blocks/inbox/index.d.ts +22 -3
- package/dist/blocks/inbox/index.js +77 -4
- package/dist/blocks/inbox/react/index.d.ts +3 -2
- package/dist/blocks/inbox/react/index.js +55 -199
- package/dist/blocks/inbox/react/server.d.ts +2 -1
- package/dist/blocks/inbox/solid/index.d.ts +27 -0
- package/dist/blocks/inbox/solid/index.js +32 -0
- package/dist/blocks/inbox/svelte/index.d.ts +27 -0
- package/dist/blocks/inbox/svelte/index.js +32 -0
- package/dist/blocks/inbox/vue/index.d.ts +27 -0
- package/dist/blocks/inbox/vue/index.js +32 -0
- package/dist/blocks/index.d.ts +25 -61
- package/dist/blocks/index.js +192 -56
- package/dist/blocks/inventory/index.d.ts +181 -0
- package/dist/blocks/inventory/index.js +219 -0
- package/dist/blocks/invoices/index.d.ts +154 -0
- package/dist/blocks/invoices/index.js +216 -0
- package/dist/blocks/jobs/index.d.ts +156 -33
- package/dist/blocks/jobs/index.js +675 -261
- package/dist/blocks/knowledge/index.d.ts +10 -3
- package/dist/blocks/knowledge/index.js +17 -3
- package/dist/blocks/leave/index.d.ts +241 -0
- package/dist/blocks/leave/index.js +209 -0
- package/dist/blocks/memory/index.d.ts +9 -4
- package/dist/blocks/memory/index.js +48 -12
- package/dist/blocks/metrics/index.d.ts +174 -0
- package/dist/blocks/metrics/index.js +217 -0
- package/dist/blocks/mfa/index.d.ts +7 -0
- package/dist/blocks/mfa/index.js +12 -0
- package/dist/blocks/mfa/react/index.d.ts +30 -0
- package/dist/blocks/mfa/react/index.js +45 -0
- package/dist/blocks/mfa/react/server.d.ts +9 -0
- package/dist/blocks/mfa/react/server.js +12 -0
- package/dist/blocks/mfa/solid/index.d.ts +20 -0
- package/dist/blocks/mfa/solid/index.js +23 -0
- package/dist/blocks/mfa/svelte/index.d.ts +20 -0
- package/dist/blocks/mfa/svelte/index.js +23 -0
- package/dist/blocks/mfa/vue/index.d.ts +20 -0
- package/dist/blocks/mfa/vue/index.js +23 -0
- package/dist/blocks/notifications/index.d.ts +342 -25
- package/dist/blocks/notifications/index.js +733 -104
- package/dist/blocks/notifications/react/index.d.ts +7 -32
- package/dist/blocks/notifications/react/index.js +23 -49
- package/dist/blocks/notifications/react/server.d.ts +2 -1
- package/dist/blocks/notifications/solid/index.d.ts +13 -0
- package/dist/blocks/notifications/solid/index.js +14 -0
- package/dist/blocks/notifications/svelte/index.d.ts +13 -0
- package/dist/blocks/notifications/svelte/index.js +14 -0
- package/dist/blocks/notifications/vue/index.d.ts +13 -0
- package/dist/blocks/notifications/vue/index.js +14 -0
- package/dist/blocks/number-sequences/index.d.ts +45 -0
- package/dist/blocks/number-sequences/index.js +49 -0
- package/dist/blocks/oauth-server/index.d.ts +228 -0
- package/dist/blocks/oauth-server/index.js +309 -0
- package/dist/blocks/onboarding/index.d.ts +8 -3
- package/dist/blocks/onboarding/index.js +17 -63
- package/dist/blocks/onboarding/react/index.d.ts +3 -12
- package/dist/blocks/onboarding/react/index.js +18 -60
- package/dist/blocks/onboarding/react/server.d.ts +2 -2
- package/dist/blocks/onboarding/react/server.js +2 -2
- package/dist/blocks/onboarding/solid/index.d.ts +13 -0
- package/dist/blocks/onboarding/solid/index.js +14 -0
- package/dist/blocks/onboarding/svelte/index.d.ts +13 -0
- package/dist/blocks/onboarding/svelte/index.js +14 -0
- package/dist/blocks/onboarding/vue/index.d.ts +13 -0
- package/dist/blocks/onboarding/vue/index.js +14 -0
- package/dist/blocks/orders/index.d.ts +264 -0
- package/dist/blocks/orders/index.js +589 -0
- package/dist/blocks/organizations/index.d.ts +31 -238
- package/dist/blocks/organizations/index.js +49 -392
- package/dist/blocks/organizations/react/index.d.ts +108 -0
- package/dist/blocks/organizations/react/index.js +113 -0
- package/dist/blocks/organizations/react/server.d.ts +11 -0
- package/dist/blocks/organizations/react/server.js +15 -0
- package/dist/blocks/organizations/solid/index.d.ts +34 -0
- package/dist/blocks/organizations/solid/index.js +32 -0
- package/dist/blocks/organizations/svelte/index.d.ts +34 -0
- package/dist/blocks/organizations/svelte/index.js +32 -0
- package/dist/blocks/organizations/vue/index.d.ts +34 -0
- package/dist/blocks/organizations/vue/index.js +32 -0
- package/dist/blocks/outbox/index.d.ts +12 -3
- package/dist/blocks/outbox/index.js +85 -46
- package/dist/blocks/parties/index.d.ts +181 -0
- package/dist/blocks/parties/index.js +258 -0
- package/dist/blocks/pipelines/index.d.ts +189 -0
- package/dist/blocks/pipelines/index.js +204 -0
- package/dist/blocks/profiles/index.d.ts +13 -8
- package/dist/blocks/profiles/index.js +19 -6
- package/dist/blocks/promotions/index.d.ts +125 -0
- package/dist/blocks/promotions/index.js +123 -0
- package/dist/blocks/push/index.d.ts +48 -28
- package/dist/blocks/push/index.js +45 -16
- package/dist/blocks/quotes/index.d.ts +152 -0
- package/dist/blocks/quotes/index.js +209 -0
- package/dist/blocks/rank/index.d.ts +71 -0
- package/dist/blocks/rank/index.js +53 -0
- package/dist/blocks/reactions/index.d.ts +18 -0
- package/dist/blocks/reactions/index.js +26 -0
- package/dist/blocks/reactions/react/index.d.ts +23 -0
- package/dist/blocks/reactions/react/index.js +46 -0
- package/dist/blocks/reactions/react/server.d.ts +6 -0
- package/dist/blocks/reactions/react/server.js +7 -0
- package/dist/blocks/reactions/solid/index.d.ts +13 -0
- package/dist/blocks/reactions/solid/index.js +14 -0
- package/dist/blocks/reactions/svelte/index.d.ts +13 -0
- package/dist/blocks/reactions/svelte/index.js +14 -0
- package/dist/blocks/reactions/vue/index.d.ts +13 -0
- package/dist/blocks/reactions/vue/index.js +14 -0
- package/dist/blocks/relations/index.d.ts +180 -0
- package/dist/blocks/relations/index.js +254 -0
- package/dist/blocks/reminders/index.d.ts +177 -0
- package/dist/blocks/reminders/index.js +171 -0
- package/dist/blocks/reviews/index.d.ts +148 -0
- package/dist/blocks/reviews/index.js +139 -0
- package/dist/blocks/rules/index.d.ts +169 -0
- package/dist/blocks/rules/index.js +163 -0
- package/dist/blocks/rules/react/index.d.ts +34 -0
- package/dist/blocks/rules/react/index.js +55 -0
- package/dist/blocks/rules/react/server.d.ts +6 -0
- package/dist/blocks/rules/react/server.js +7 -0
- package/dist/blocks/rules/solid/index.d.ts +13 -0
- package/dist/blocks/rules/solid/index.js +14 -0
- package/dist/blocks/rules/svelte/index.d.ts +13 -0
- package/dist/blocks/rules/svelte/index.js +14 -0
- package/dist/blocks/rules/vue/index.d.ts +13 -0
- package/dist/blocks/rules/vue/index.js +14 -0
- package/dist/blocks/saved-views/index.d.ts +17 -0
- package/dist/blocks/saved-views/index.js +29 -0
- package/dist/blocks/saved-views/react/index.d.ts +34 -0
- package/dist/blocks/saved-views/react/index.js +57 -0
- package/dist/blocks/saved-views/react/server.d.ts +7 -0
- package/dist/blocks/saved-views/react/server.js +7 -0
- package/dist/blocks/saved-views/solid/index.d.ts +13 -0
- package/dist/blocks/saved-views/solid/index.js +14 -0
- package/dist/blocks/saved-views/svelte/index.d.ts +13 -0
- package/dist/blocks/saved-views/svelte/index.js +14 -0
- package/dist/blocks/saved-views/vue/index.d.ts +13 -0
- package/dist/blocks/saved-views/vue/index.js +14 -0
- package/dist/blocks/search/index.d.ts +31 -0
- package/dist/blocks/search/index.js +61 -0
- package/dist/blocks/search/react/index.d.ts +36 -0
- package/dist/blocks/search/react/index.js +49 -0
- package/dist/blocks/search/react/server.d.ts +7 -0
- package/dist/blocks/search/react/server.js +8 -0
- package/dist/blocks/search/solid/index.d.ts +13 -0
- package/dist/blocks/search/solid/index.js +14 -0
- package/dist/blocks/search/svelte/index.d.ts +13 -0
- package/dist/blocks/search/svelte/index.js +14 -0
- package/dist/blocks/search/vue/index.d.ts +13 -0
- package/dist/blocks/search/vue/index.js +14 -0
- package/dist/blocks/service-principals/index.d.ts +126 -0
- package/dist/blocks/service-principals/index.js +107 -0
- package/dist/blocks/sessions/index.d.ts +7 -0
- package/dist/blocks/sessions/index.js +14 -0
- package/dist/blocks/sessions/react/index.d.ts +31 -0
- package/dist/blocks/sessions/react/index.js +51 -0
- package/dist/blocks/sessions/react/server.d.ts +9 -0
- package/dist/blocks/sessions/react/server.js +11 -0
- package/dist/blocks/sessions/solid/index.d.ts +20 -0
- package/dist/blocks/sessions/solid/index.js +23 -0
- package/dist/blocks/sessions/svelte/index.d.ts +20 -0
- package/dist/blocks/sessions/svelte/index.js +23 -0
- package/dist/blocks/sessions/vue/index.d.ts +20 -0
- package/dist/blocks/sessions/vue/index.js +23 -0
- package/dist/blocks/settings/index.d.ts +20 -86
- package/dist/blocks/settings/index.js +28 -102
- package/dist/blocks/settings/react/index.d.ts +25 -0
- package/dist/blocks/settings/react/index.js +37 -0
- package/dist/blocks/settings/react/server.d.ts +7 -0
- package/dist/blocks/settings/react/server.js +7 -0
- package/dist/blocks/settings/solid/index.d.ts +13 -0
- package/dist/blocks/settings/solid/index.js +14 -0
- package/dist/blocks/settings/svelte/index.d.ts +13 -0
- package/dist/blocks/settings/svelte/index.js +14 -0
- package/dist/blocks/settings/vue/index.d.ts +13 -0
- package/dist/blocks/settings/vue/index.js +14 -0
- package/dist/blocks/share-links/index.d.ts +106 -0
- package/dist/blocks/share-links/index.js +102 -0
- package/dist/blocks/shared-signals/index.d.ts +395 -0
- package/dist/blocks/shared-signals/index.js +880 -0
- package/dist/blocks/signing-keys/index.d.ts +29 -0
- package/dist/blocks/signing-keys/index.js +161 -0
- package/dist/blocks/sla/index.d.ts +114 -0
- package/dist/blocks/sla/index.js +122 -0
- package/dist/blocks/sso/index.d.ts +169 -147
- package/dist/blocks/sso/index.js +258 -321
- package/dist/blocks/state-machine/index.d.ts +105 -0
- package/dist/blocks/state-machine/index.js +116 -0
- package/dist/blocks/tags/index.d.ts +20 -0
- package/dist/blocks/tags/index.js +28 -0
- package/dist/blocks/tags/react/index.d.ts +28 -0
- package/dist/blocks/tags/react/index.js +47 -0
- package/dist/blocks/tags/react/server.d.ts +7 -0
- package/dist/blocks/tags/react/server.js +7 -0
- package/dist/blocks/tags/solid/index.d.ts +13 -0
- package/dist/blocks/tags/solid/index.js +14 -0
- package/dist/blocks/tags/svelte/index.d.ts +13 -0
- package/dist/blocks/tags/svelte/index.js +14 -0
- package/dist/blocks/tags/vue/index.d.ts +13 -0
- package/dist/blocks/tags/vue/index.js +14 -0
- package/dist/blocks/targets/index.d.ts +82 -0
- package/dist/blocks/targets/index.js +73 -0
- package/dist/blocks/teams/index.d.ts +61 -0
- package/dist/blocks/teams/index.js +83 -0
- package/dist/blocks/templates/index.d.ts +362 -0
- package/dist/blocks/templates/index.js +483 -0
- package/dist/blocks/time-tracking/index.d.ts +250 -0
- package/dist/blocks/time-tracking/index.js +317 -0
- package/dist/blocks/trash/index.d.ts +78 -0
- package/dist/blocks/trash/index.js +79 -0
- package/dist/blocks/undo/index.d.ts +9 -0
- package/dist/blocks/undo/index.js +14 -0
- package/dist/blocks/undo/react/index.d.ts +17 -0
- package/dist/blocks/undo/react/index.js +24 -0
- package/dist/blocks/undo/react/server.d.ts +7 -0
- package/dist/blocks/undo/react/server.js +7 -0
- package/dist/blocks/undo/solid/index.d.ts +13 -0
- package/dist/blocks/undo/solid/index.js +14 -0
- package/dist/blocks/undo/svelte/index.d.ts +13 -0
- package/dist/blocks/undo/svelte/index.js +14 -0
- package/dist/blocks/undo/vue/index.d.ts +13 -0
- package/dist/blocks/undo/vue/index.js +14 -0
- package/dist/blocks/usage/index.d.ts +10 -4
- package/dist/blocks/usage/index.js +16 -233
- package/dist/blocks/usage/react/index.d.ts +23 -0
- package/dist/blocks/usage/react/index.js +38 -0
- package/dist/blocks/usage/react/server.d.ts +7 -0
- package/dist/blocks/usage/react/server.js +7 -0
- package/dist/blocks/usage/solid/index.d.ts +13 -0
- package/dist/blocks/usage/solid/index.js +14 -0
- package/dist/blocks/usage/svelte/index.d.ts +13 -0
- package/dist/blocks/usage/svelte/index.js +14 -0
- package/dist/blocks/usage/vue/index.d.ts +13 -0
- package/dist/blocks/usage/vue/index.js +14 -0
- package/dist/blocks/versions/index.d.ts +169 -0
- package/dist/blocks/versions/index.js +288 -0
- package/dist/blocks/waitlist/index.d.ts +57 -19
- package/dist/blocks/waitlist/index.js +46 -12
- package/dist/blocks/webhooks/index.d.ts +269 -137
- package/dist/blocks/webhooks/index.js +752 -179
- package/dist/blocks/work-items/index.d.ts +208 -0
- package/dist/blocks/work-items/index.js +305 -0
- package/dist/blocks/workflow-builder/index.d.ts +26 -6
- package/dist/blocks/workflow-builder/index.js +30 -5
- package/dist/blocks/workflow-builder/react/index.d.ts +4 -19
- package/dist/blocks/workflow-builder/react/index.js +45 -89
- package/dist/blocks/workflow-builder/solid/index.d.ts +20 -0
- package/dist/blocks/workflow-builder/solid/index.js +23 -0
- package/dist/blocks/workflow-builder/svelte/index.d.ts +20 -0
- package/dist/blocks/workflow-builder/svelte/index.js +23 -0
- package/dist/blocks/workflow-builder/vue/index.d.ts +20 -0
- package/dist/blocks/workflow-builder/vue/index.js +23 -0
- package/dist/blocks/workflows/index.d.ts +20 -3
- package/dist/blocks/workflows/index.js +27 -3
- package/dist/blocks/workflows/react/index.d.ts +5 -20
- package/dist/blocks/workflows/react/index.js +41 -113
- package/dist/blocks/workflows/solid/index.d.ts +20 -0
- package/dist/blocks/workflows/solid/index.js +23 -0
- package/dist/blocks/workflows/svelte/index.d.ts +20 -0
- package/dist/blocks/workflows/svelte/index.js +23 -0
- package/dist/blocks/workflows/vue/index.d.ts +20 -0
- package/dist/blocks/workflows/vue/index.js +23 -0
- package/dist/blocks-D2WQ63PI.js +84 -0
- package/dist/bookings-EJAVAuVz.js +181 -0
- package/dist/build-6jmaPAgx.js +689 -0
- package/dist/build-Cm0T5MVG.js +1815 -0
- package/dist/calendar-1J1E5dLq.js +801 -0
- package/dist/channel-D-LHCY11.d.ts +78 -0
- package/dist/channels-C-GCoNLd.js +114 -0
- package/dist/chat-sdk/index.d.ts +131 -7
- package/dist/chat-sdk/index.js +154 -6
- package/dist/chat-sdk/react/index.d.ts +2 -1
- package/dist/chat-sdk/react/index.js +1 -2
- package/dist/chat-sdk/react/server.d.ts +2 -1
- package/dist/chat-sdk/react/server.js +1 -2
- package/dist/cli/add-BhI_nXAo.js +75 -0
- package/dist/cli/add-CUS0AiBh.js +651 -0
- package/dist/cli/add-ojbcMxyp.js +1 -0
- package/dist/cli/adopt-D0ASVx2G.js +1 -0
- package/dist/cli/adopt-DwcU6CJd.js +412 -0
- package/dist/cli/agent-CCrTYK3W.js +176 -0
- package/dist/cli/apply-DBXC0Z5I.js +332 -0
- package/dist/cli/bin.js +40 -20
- package/dist/cli/blocks-B15ltTFn.js +124 -0
- package/dist/cli/blocks-BXeqIzWN.js +1 -0
- package/dist/cli/cache-CPBYJAkb.js +502 -0
- package/dist/cli/catalog-Di15TkM2.js +187 -0
- package/dist/cli/codemod-CrI33UR2.js +985 -0
- package/dist/cli/command-D_HI1mp1.js +853 -0
- package/dist/cli/completion-DzYo025z.js +205 -0
- package/dist/cli/completion-En43UcyJ.js +30 -0
- package/dist/cli/completion-Vry-Wjw8.js +1 -0
- package/dist/cli/config-Bi_UBxXl.js +1451 -0
- package/dist/cli/config-DsqQr5z3.js +1 -0
- package/dist/cli/config-DyJgo2d9.js +39 -0
- package/dist/cli/config-edit-Ct1lXe8a.js +603 -0
- package/dist/cli/db-DT1bGB02.js +78 -0
- package/dist/cli/design-edit-B-WsnhUF.js +175 -0
- package/dist/cli/detect-BeLVeNpA.js +84 -0
- package/dist/cli/dist-D_VbPAMR.js +129 -0
- package/dist/cli/dist-DuiMMRbJ.js +1112 -0
- package/dist/cli/doctor-wACp5w6N.js +3508 -0
- package/dist/cli/emit-j0zZ6NE_.js +1061 -0
- package/dist/cli/env-2v9JrxSr.js +142 -0
- package/dist/cli/env-Cf5OTqbK.js +1087 -0
- package/dist/cli/env-Ch99nTQw.js +1 -0
- package/dist/cli/env-DkBe35Rv.js +1 -0
- package/dist/cli/errors-Caiz_0so.js +98 -0
- package/dist/cli/fastest-levenshtein-dhRRvrM2.js +120 -0
- package/dist/cli/files-DDvAwTko.js +963 -0
- package/dist/cli/gen-BhquLu7l.js +304 -0
- package/dist/cli/guards-CUlDNYZs.js +8 -0
- package/dist/cli/index.d.ts +260 -129
- package/dist/cli/index.js +13 -10
- package/dist/cli/init-BwLTO6XG.js +400 -0
- package/dist/cli/introspect-B-gXAIqs.js +51 -0
- package/dist/cli/io-BiPX-_J1.js +37 -0
- package/dist/cli/jsonc-C8M0EhHB.js +1 -0
- package/dist/cli/keys-hwtdwdkT.js +106 -0
- package/dist/cli/live-BFfYoE0_.js +329 -0
- package/dist/cli/mcp-Bdm2oGmL.js +237 -0
- package/dist/cli/metadata-DikbSOE0.js +138 -0
- package/dist/cli/migration-safety-LaGVPPuD.js +206 -0
- package/dist/cli/module-migration-CLkZ8jpw.js +592 -0
- package/dist/cli/moved-B7UFO_OM.js +152 -0
- package/dist/cli/parse-CwV5a6dA.js +170 -0
- package/dist/cli/preset-DQ1DxMtI.js +129 -0
- package/dist/cli/prompts-Bvg_DBpe.js +1137 -0
- package/dist/cli/redact-PjNswZOs.js +35 -0
- package/dist/cli/rolldown-runtime-kJ_i4yPo.js +26 -0
- package/dist/cli/run-BLJj7SuM.js +685 -0
- package/dist/cli/run-DliGNdjI.js +1507 -0
- package/dist/cli/scaffold-6bv24GSP.js +898 -0
- package/dist/cli/scaffold-DUz5fa-k.js +1 -0
- package/dist/cli/seed-CIJaL1Ao.js +113 -0
- package/dist/cli/seed-ClGWseBT.js +1 -0
- package/dist/cli/shared-CNcvDOLt.js +145 -0
- package/dist/cli/shell-Btv_4Yhe.js +10 -0
- package/dist/cli/skills-CaxIQhzW.js +121 -0
- package/dist/cli/snapshot-Dvcx0BSl.js +347 -0
- package/dist/cli/source-args-BNhagtpw.js +47 -0
- package/dist/cli/spec-BewE6r6J.js +7501 -0
- package/dist/cli/spec-DRDaIq8f.js +1 -0
- package/dist/cli/sql-BBkchli4.js +326 -0
- package/dist/cli/sql-BCQt5TDs.js +2 -0
- package/dist/cli/stack-status-LeEoCtV1.js +456 -0
- package/dist/cli/style-2JfIPVMQ.js +29 -0
- package/dist/cli/supabase-toml-DjLgBYEo.js +1153 -0
- package/dist/cli/sync-CJ-ft-tl.js +88 -0
- package/dist/cli/topics-BBE1-Vrg.js +30 -0
- package/dist/cli/trace-VbdO6bcN.js +7 -0
- package/dist/cli/typegen--TfvOPLh.js +494 -0
- package/dist/cli/typegen-version-BNBPI4Eu.js +9 -0
- package/dist/cli/validate-BfWNKvxy.js +7522 -0
- package/dist/cli/version-D1wM9DNb.js +4 -0
- package/dist/cli/write-Dp1XlAVM.js +198 -0
- package/dist/client/index.d.ts +7 -4
- package/dist/client/index.js +152 -6
- package/dist/client/native/index.d.ts +71 -4
- package/dist/client/native/index.js +65 -6
- package/dist/client-13Ii0c0P.js +84 -0
- package/dist/client-9zIKhf5D.d.ts +58 -0
- package/dist/client-AxwF58Eo.js +98 -0
- package/dist/client-B0rvMvA8.d.ts +52 -0
- package/dist/client-B5nnqDmz.d.ts +39 -0
- package/dist/client-B7LCXnnY.d.ts +59 -0
- package/dist/client-B9CqzgPO.js +75 -0
- package/dist/client-B9H4BZJh.d.ts +455 -0
- package/dist/client-BGnJ5WJi.js +438 -0
- package/dist/client-BLKpcAs0.d.ts +34 -0
- package/dist/client-BO9fQgBB.d.ts +155 -0
- package/dist/client-B_r4denm.d.ts +135 -0
- package/dist/client-BaynD5V-.d.ts +388 -0
- package/dist/client-BfgwocyT.js +155 -0
- package/dist/client-BpS8a6Fm.js +51 -0
- package/dist/client-BtBkVSk2.d.ts +108 -0
- package/dist/client-ByGlM0YF.d.ts +101 -0
- package/dist/client-BzCv4kKE.js +65 -0
- package/dist/client-C-2ajnhM.js +89 -0
- package/dist/client-C3dLIsJv.d.ts +122 -0
- package/dist/client-C597NIlL.d.ts +277 -0
- package/dist/client-C5mUEb2n.js +55 -0
- package/dist/client-CFeWXNXy.js +133 -0
- package/dist/client-CWs3X4g1.js +120 -0
- package/dist/client-Cgxj38RS.d.ts +419 -0
- package/dist/client-CjyTNdt1.d.ts +65 -0
- package/dist/client-CmHsfDHU.js +438 -0
- package/dist/client-CpMv4-v5.d.ts +100 -0
- package/dist/client-CsRpAyIv.d.ts +68 -0
- package/dist/client-CvITjt-9.js +310 -0
- package/dist/client-D0502FgY.js +1051 -0
- package/dist/client-D727oIVC.js +169 -0
- package/dist/client-D9zBl9PT.d.ts +103 -0
- package/dist/client-DG7FwgZD.js +104 -0
- package/dist/client-DNq8xYb-.js +52 -0
- package/dist/client-DR_YEGnc.d.ts +130 -0
- package/dist/client-DZXFDaQE.d.ts +157 -0
- package/dist/client-Diu2lPbg.d.ts +218 -0
- package/dist/client-Dk8gY9hi.d.ts +34 -0
- package/dist/client-Ezlbskjq.js +60 -0
- package/dist/client-Fi8CoJcs.d.ts +263 -0
- package/dist/client-LVa6yC9u.d.ts +107 -0
- package/dist/client-WXJwUhr1.d.ts +162 -0
- package/dist/client-WgrPIHH-.js +213 -0
- package/dist/client-ZTtSV3l8.js +40 -0
- package/dist/client-ckXfdy1k.js +38 -0
- package/dist/client-fpvgtQKE.js +128 -0
- package/dist/client-iB5axfa0.js +209 -0
- package/dist/client-jvtwGFy4.js +137 -0
- package/dist/client-kI6vCKVI.js +288 -0
- package/dist/client-kKdkLGPB.d.ts +131 -0
- package/dist/client-pxjbgOz6.js +376 -0
- package/dist/client-rp7YfOg1.js +67 -0
- package/dist/cloud-event-bwsBwVNG.d.ts +64 -0
- package/dist/codecs-Bm46sVxr.d.ts +215 -0
- package/dist/codecs-C7E_OoiC.js +358 -0
- package/dist/codegen-2m4SKVdi.d.ts +1654 -0
- package/dist/comments-N7Bi-oTW.js +230 -0
- package/dist/commerce/index.d.ts +211 -0
- package/dist/commerce/index.js +517 -0
- package/dist/compiler-C6E3WwIi.d.ts +14 -0
- package/dist/compose-CO_cljl3.js +53 -0
- package/dist/composite-CPV0thLs.js +130 -0
- package/dist/composite-DMMA_Whg.d.ts +67 -0
- package/dist/config/index.d.ts +7 -5
- package/dist/config/index.js +7 -4
- package/dist/config-C4RQDF6t.js +3896 -0
- package/dist/config-CkyahUjo.js +558 -0
- package/dist/connector-Cp8CqssJ.d.ts +107 -0
- package/dist/connectors-CZdfZcIg.d.ts +141 -0
- package/dist/context-B8_p3MXo.js +11 -0
- package/dist/context-BDDgjoxz.js +41 -0
- package/dist/context-C-bHOtoD.js +5 -0
- package/dist/context-CCfX2szU.d.ts +377 -0
- package/dist/context-D6ZMKc2L.js +19 -0
- package/dist/context-wDKxSl9x.js +9 -0
- package/dist/controller-CCb9tHw_.d.ts +46 -0
- package/dist/controller-D6NyNrlZ.js +79 -0
- package/dist/create/index.d.ts +597 -0
- package/dist/create/index.js +2049 -0
- package/dist/create/lite/index.d.ts +85 -0
- package/dist/create/lite/index.js +126 -0
- package/dist/create/supabase/index.d.ts +68 -0
- package/dist/create/supabase/index.js +312 -0
- package/dist/credentials/index.d.ts +15 -5
- package/dist/credentials/index.js +16 -8
- package/dist/cron-CUaKTjWC.js +145 -0
- package/dist/cron-route-BsgbJ-g4.js +24 -0
- package/dist/csv-CVfXqaAu.js +89 -0
- package/dist/csv-D3eKxV1T.d.ts +28 -0
- package/dist/define-CMcokcZz.js +1896 -0
- package/dist/define-DXTC706J.d.ts +1005 -0
- package/dist/define-block-B6Gjs57G.js +52 -0
- package/dist/define-block-BlHQxDIQ.d.ts +256 -0
- package/dist/delegation-Dt8hMJWu.js +140 -0
- package/dist/delivery-B1mKaOen.js +30 -0
- package/dist/delivery-BeHgwS3k.d.ts +69 -0
- package/dist/documents-BYM2viS0.d.ts +96 -0
- package/dist/edge/index.d.ts +16 -14
- package/dist/edge/index.js +24 -18
- package/dist/elysia/index.d.ts +1 -1
- package/dist/elysia/index.js +2 -2
- package/dist/email-BcmbIWOX.d.ts +42 -0
- package/dist/embeddings-CVeOoufZ.js +128 -0
- package/dist/embeddings-Da0w4A_0.d.ts +78 -0
- package/dist/ended-EcTtzzQJ.d.ts +70 -0
- package/dist/entitlements-AmYp2KHX.js +45 -0
- package/dist/entitlements-Bn7BTnbg.d.ts +53 -0
- package/dist/env/index.d.ts +1 -1
- package/dist/env/index.js +9 -4
- package/dist/envelope--7d0Q3Se.js +90 -0
- package/dist/errors-7MqM7bbV.js +44 -0
- package/dist/errors-8i6tSICm.js +301 -0
- package/dist/escape-like-AUEPn-C5.d.ts +15 -0
- package/dist/eve/index.d.ts +5 -5
- package/dist/eve/index.js +9 -9
- package/dist/eve-BcEr_hPo.d.ts +151 -0
- package/dist/event-calendar-DJXXMJ3x.d.ts +217 -0
- package/dist/event-map-Dy2vKHai.js +19 -0
- package/dist/events/index.d.ts +4 -4
- package/dist/events/index.js +10 -7
- package/dist/events-CtAHxPal.d.ts +800 -0
- package/dist/events-xbpHkcK9.js +82 -0
- package/dist/executor-BicyP8Nl.d.ts +272 -0
- package/dist/executor-CHRwEYqt.d.ts +95 -0
- package/dist/executor-CIxyatuB.d.ts +174 -0
- package/dist/executor-Cex-1PFp.js +735 -0
- package/dist/executor-D3K3tycZ.js +147 -0
- package/dist/executor-DzJQVTE2.d.ts +39 -0
- package/dist/executor-aKUo_Xyb.js +206 -0
- 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/field-errors-nFnYWvB0.d.ts +113 -0
- package/dist/field-formats-Cif5gr7c.js +102 -0
- package/dist/field-formats-DCvOQlOy.d.ts +39 -0
- package/dist/filter-evaluate-C0ULNfS7.js +214 -0
- package/dist/filter-evaluate-CEm52E5s.d.ts +34 -0
- package/dist/filter-query-B3lhckKX.js +518 -0
- package/dist/filter-query-D3wOD1P_.d.ts +121 -0
- package/dist/flags-CtSrkVuW.js +279 -0
- package/dist/flags-Dz5PIzFU.d.ts +230 -0
- package/dist/flags-sdk/index.d.ts +143 -0
- package/dist/flags-sdk/index.js +175 -0
- package/dist/form-definition-GVZTILhS.js +311 -0
- package/dist/form-definition-sagoefQr.d.ts +95 -0
- package/dist/format-CNwSjXUU.d.ts +70 -0
- package/dist/framework-C2oL4OaO.d.ts +26 -0
- package/dist/framework-Cfm0IspZ.js +51 -0
- package/dist/function-contract-B4c0XuTU.d.ts +21 -0
- package/dist/function-contract-DmkBg19r.js +5 -0
- package/dist/gateway-CJL6ZG17.d.ts +109 -0
- package/dist/gateway-options-ClvvfuuU.d.ts +29 -0
- package/dist/gateway-options-DcLcWL5_.js +27 -0
- package/dist/graph-Cs28bOlK.js +360 -0
- package/dist/groups-CxonH3u5.js +16 -0
- package/dist/h3/index.d.ts +7 -3
- package/dist/h3/index.js +3 -3
- package/dist/h3/v1/index.d.ts +1 -1
- package/dist/h3/v1/index.js +2 -2
- package/dist/hono/index.d.ts +24 -10
- package/dist/hono/index.js +50 -22
- package/dist/http-BF-V0CUF.js +25 -0
- package/dist/impersonation-CDeCzZP6.js +62 -0
- package/dist/impersonation-D5chOkrO.d.ts +25 -0
- package/dist/inbox-BaUJgHOF.d.ts +400 -0
- package/dist/index-8xwnaWHY.d.ts +344 -0
- package/dist/index-BurdFUXr.d.ts +131 -0
- package/dist/index-Cckxs8IE.d.ts +206 -0
- package/dist/index-Ck4oK5vV.d.ts +258 -0
- package/dist/index-Co0YsJTk.d.ts +58 -0
- package/dist/index-CxmVzT-3.d.ts +86 -0
- package/dist/index-D1kMyNc7.d.ts +245 -0
- package/dist/index-DL8z_oDo.d.ts +227 -0
- package/dist/index-DMONTkSf.d.ts +202 -0
- package/dist/index-DTQbC3CW.d.ts +58 -0
- package/dist/index-DcijDfh1.d.ts +97 -0
- package/dist/index-MCXVzkXs.d.ts +722 -0
- package/dist/index-gXy3R1Uq.d.ts +138 -0
- package/dist/index.d.ts +15 -15
- package/dist/index.js +15 -14
- package/dist/iso4217-A8ev-CNW.js +176 -0
- package/dist/json-schema-CpYINXG8.js +548 -0
- package/dist/jws-35a8VhFV.d.ts +60 -0
- package/dist/jws-milwSg7E.js +191 -0
- package/dist/kit-BlcEFQql.d.ts +66 -0
- package/dist/kit-gqwkVhGU.js +104 -0
- package/dist/knowledge-BYtgA52P.d.ts +187 -0
- package/dist/knowledge-CSNKLX-s.js +272 -0
- package/dist/lint/index.js +9 -9
- package/dist/list/index.d.ts +4 -2
- package/dist/list/index.js +4 -2
- package/dist/list-query-CBXNfJt4.js +549 -0
- package/dist/list-query-DWJIiVz_.d.ts +194 -0
- package/dist/live-DwDreq1n.js +239 -0
- package/dist/management-D1gG89z2.d.ts +53 -0
- package/dist/mcp/index.d.ts +59 -17
- package/dist/mcp/index.js +202 -98
- package/dist/mcp/sdk/index.d.ts +6 -6
- package/dist/mcp/sdk/index.js +7 -7
- package/dist/messages-Cx4ttLJJ.js +493 -0
- package/dist/methods-7u6vSgz_.js +11 -0
- package/dist/metric-definition-95HFoW1V.d.ts +70 -0
- package/dist/metric-definition-BjxVn4R5.js +117 -0
- package/dist/mfa-DtflCXEt.d.ts +30 -0
- package/dist/model-lUafmeBQ.d.ts +311 -0
- package/dist/model-messages-CTu-6kBu.js +206 -0
- package/dist/money-95Rff2vT.js +185 -0
- package/dist/money-DFpWzQvk.d.ts +76 -0
- package/dist/money-codec-DCGgzO26.js +41 -0
- package/dist/nestjs/index.d.ts +2 -2
- package/dist/nestjs/index.js +2 -2
- package/dist/next/index.d.ts +26 -16
- package/dist/next/index.js +17 -16
- package/dist/node/index.d.ts +2 -2
- package/dist/node/index.js +3 -3
- package/dist/nuxt/index.d.ts +2 -2
- package/dist/nuxt/index.js +3 -2
- package/dist/onboarding-viTTNWUp.js +68 -0
- package/dist/openapi/index.d.ts +3 -3
- package/dist/openapi/index.js +2 -2
- package/dist/operations-BtuQRwTJ.d.ts +6 -0
- package/dist/operations-CsIfMED7.js +29 -0
- package/dist/optional-peer-Dx8TaYXw.js +29 -0
- package/dist/options-B0FcEKtH.js +5 -0
- package/dist/options-B5BU2Yg7.js +11 -0
- package/dist/options-B5woz53h.js +5 -0
- package/dist/options-B7EJaOX-.js +5 -0
- package/dist/options-B9q8CROT.js +9 -0
- package/dist/options-BA6jV6py.js +10 -0
- package/dist/options-BAW2ZlZ8.js +8 -0
- package/dist/options-BMjcVuaI.js +82 -0
- package/dist/options-BOOEzor9.js +5 -0
- package/dist/options-BZsoPJGX.js +5 -0
- package/dist/options-BesyRBnM.js +16 -0
- package/dist/options-Bf96aVk5.js +10 -0
- package/dist/options-BlOPivzq.js +8 -0
- package/dist/options-Blg8lAkz.js +9 -0
- package/dist/options-Bn4cu0gt.js +5 -0
- package/dist/options-BnoJOwXK.js +8 -0
- package/dist/options-Bp7sgKvl.js +30 -0
- package/dist/options-BxcFLL1G.js +8 -0
- package/dist/options-C1HR4UZd.js +13 -0
- package/dist/options-C239TLRF.js +14 -0
- package/dist/options-C2HesT4A.js +9 -0
- package/dist/options-C3EzJATk.js +10 -0
- package/dist/options-C3hZ1fbC.js +10 -0
- package/dist/options-C6rEL6U5.js +8 -0
- package/dist/options-CAzVf-1T.js +8 -0
- package/dist/options-CGKSUFUq.js +5 -0
- package/dist/options-CGjGE8xS.js +12 -0
- package/dist/options-CK5WiFwG.js +11 -0
- package/dist/options-CN7PHkhU.js +8 -0
- package/dist/options-CTZNpb2n.js +5 -0
- package/dist/options-CUqQ9pm7.js +9 -0
- package/dist/options-CVSWgZpY.js +8 -0
- package/dist/options-CXFz0xxS.js +8 -0
- package/dist/options-CZk_fbbg.js +9 -0
- package/dist/options-C_pb1Nd3.js +5 -0
- package/dist/options-CbSOj53r.d.ts +52 -0
- package/dist/options-ChD15QxJ.js +9 -0
- package/dist/options-CkScQRJR.js +12 -0
- package/dist/options-CljDnQt2.js +25 -0
- package/dist/options-CmraJhd9.js +5 -0
- package/dist/options-CoX6VKGb.js +8 -0
- package/dist/options-CrC78Tee.js +5 -0
- package/dist/options-Ctac2R0Q.js +11 -0
- package/dist/options-CyD7OObW.js +17 -0
- package/dist/options-D1blDihM.js +9 -0
- package/dist/options-D2Gd6VfS.js +8 -0
- package/dist/options-D2d1fFuw.js +11 -0
- package/dist/options-D40CQzji.js +8 -0
- package/dist/options-D7f2VKzj.js +25 -0
- package/dist/options-DARkpk2P.js +8 -0
- package/dist/options-DCduTMST.js +17 -0
- package/dist/options-DDzggjN7.js +8 -0
- package/dist/options-DMR68VAC.js +5 -0
- package/dist/options-DNKyN5uq.js +20 -0
- package/dist/options-DTDxFT6J.js +13 -0
- package/dist/options-DWpz3V3F.js +8 -0
- package/dist/options-DXqcJyOP.js +10 -0
- package/dist/options-DYBQ973I.js +8 -0
- package/dist/options-Dh4wu9Ks.js +15 -0
- package/dist/options-Dmg1Da9P.js +25 -0
- package/dist/options-DsUgamiy.js +5 -0
- package/dist/options-EsUh744F.js +13 -0
- package/dist/options-Fz6xqu-b.js +5 -0
- package/dist/options-HSv8R6h5.js +13 -0
- package/dist/options-I8zVkB_y.js +8 -0
- package/dist/options-MHhjOoWz.js +5 -0
- package/dist/options-MLxMkd5B.js +11 -0
- package/dist/options-OJ5zmgr8.js +10 -0
- package/dist/options-QKP9FFcK.js +8 -0
- package/dist/options-SViK_2x2.js +12 -0
- package/dist/options-XgfTctbI.js +5 -0
- package/dist/options-_9arpsX9.js +11 -0
- package/dist/options-eBPsk4WI.js +11 -0
- package/dist/options-kLKILdIu.js +10 -0
- package/dist/options-n22NK3PL.js +8 -0
- package/dist/options-oeAq4Ho5.js +12 -0
- package/dist/options-qU8vgxhO.js +18 -0
- package/dist/options-vXMBEWSH.js +5 -0
- package/dist/options-wFnK3qWl.js +9 -0
- package/dist/options-xVAy3UsV.js +9 -0
- package/dist/organizations-Bxrm32IG.js +398 -0
- package/dist/orpc/index.d.ts +26 -10
- package/dist/orpc/index.js +54 -33
- package/dist/otel/index.d.ts +3 -3
- package/dist/otel/index.js +42 -7
- package/dist/outbox-BCGHl9X6.d.ts +181 -0
- package/dist/overlay/index.d.ts +1 -1
- package/dist/overlay/index.js +3 -3
- package/dist/payments-h45bswA-.js +16 -0
- package/dist/pg-error-BV_X8Isq.js +26 -0
- package/dist/plugin-D5OIaP93.d.ts +190 -0
- 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 +2 -2
- package/dist/plugins/soft-delete/index.d.ts +3 -3
- package/dist/plugins/soft-delete/index.js +4 -4
- package/dist/plugins/tenant/index.d.ts +4 -3
- package/dist/plugins/tenant/index.js +3 -3
- package/dist/plugins/timestamps/index.d.ts +1 -1
- package/dist/plugins/timestamps/index.js +1 -1
- package/dist/plugins/validation/index.d.ts +2 -2
- package/dist/plugins/validation/index.js +3 -3
- package/dist/pool-BBi4mot3.d.ts +117 -0
- package/dist/pool-errors-C94tPR_G.js +27 -0
- package/dist/ports-B53rB7zg.d.ts +285 -0
- package/dist/ports-Bcdppx0G.js +133 -0
- package/dist/ports-Dcnuo3HT.d.ts +86 -0
- package/dist/postgres/index.d.ts +28 -6
- package/dist/postgres/index.js +62 -25
- package/dist/postgrest-D6fEMsp4.d.ts +53 -0
- package/dist/powersync/index.d.ts +4 -4
- package/dist/powersync/index.js +4 -4
- package/dist/powersync/react/index.d.ts +8 -3
- package/dist/powersync/react/index.js +11 -3
- package/dist/preset/index.d.ts +4 -0
- package/dist/preset/index.js +4 -0
- package/dist/preset-BBrL6_Ln.js +648 -0
- package/dist/problem-CEjyhV5T.d.ts +76 -0
- package/dist/problem-pIiL3WbE.js +159 -0
- package/dist/provider-CQ1SrhLa.d.ts +113 -0
- package/dist/provider-DKh2xFZb.js +57 -0
- package/dist/push-token-CDMgWT13.d.ts +24 -0
- package/dist/push-token-D6REHMMw.js +16 -0
- package/dist/query/index.d.ts +2 -2
- package/dist/range-DwpWe8e7.js +7 -0
- package/dist/range-p5V4rBhZ.d.ts +8 -0
- package/dist/rank-keys-DcPMt_Jk.js +60 -0
- package/dist/rank-result-Dngpt2n5.d.ts +14 -0
- package/dist/rank-result-oUF1DYBm.js +18 -0
- package/dist/rate-limit-BtbddDnE.js +49 -0
- package/dist/rate-limit-ByfWNX9N.js +325 -0
- package/dist/rate-limit-C88MEAOm.d.ts +41 -0
- package/dist/ratelimit-headers-Bsxx0Tj2.js +62 -0
- package/dist/react/index.d.ts +9 -9
- package/dist/react/index.js +3 -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-BcKACxsj.js +410 -0
- package/dist/react-controller-Xn-IU44p.js +40 -0
- package/dist/react-env-Cc7Vf6eb.js +13 -0
- package/dist/react-router/index.d.ts +6 -6
- package/dist/react-router/index.js +7 -7
- package/dist/read-set-PWiJfv6S.js +314 -0
- package/dist/realtime/index.d.ts +8 -4
- package/dist/realtime/index.js +5 -327
- package/dist/realtime-status-D2dw1hOE.js +12 -0
- package/dist/realtime-status-DcsO00Gw.d.ts +8 -0
- package/dist/refusal-Bdr1k47u.d.ts +18 -0
- package/dist/refusal-Ch-u9dVd.js +61 -0
- package/dist/replicas-BvIL4_jL.js +94 -0
- package/dist/resolve-7atr-wWr.d.ts +266 -0
- package/dist/resolve-CAR9oaKW.js +869 -0
- package/dist/resource-CHGOmg1O.js +463 -0
- package/dist/resource-DO4gbVi5.js +91 -0
- package/dist/resource-DxcgtHq6.d.ts +106 -0
- package/dist/resource-execute-C45ICrN9.d.ts +12 -0
- package/dist/resource-types-CC59gMHE.d.ts +141 -0
- package/dist/resources-B71O7EVQ.d.ts +7 -0
- package/dist/resources-B7htXQeg.js +64 -0
- package/dist/respond-Cdg5ibH5.d.ts +93 -0
- package/dist/respond-Dpx48ATq.js +95 -0
- package/dist/result-COkvI9t5.js +134 -0
- package/dist/result-Cj3yWhjH.d.ts +298 -0
- package/dist/rrule-zBh3CA1r.js +290 -0
- package/dist/rules-4of_Fq-6.js +287 -0
- package/dist/run-watch-CQRdpy-f.js +53 -0
- package/dist/runtime-BOXURhEW.js +45 -0
- package/dist/sales-lines-C6gafAwg.d.ts +28 -0
- package/dist/sales-lines-CymdiwYd.js +41 -0
- package/dist/sales-shared-DAAGwQwN.d.ts +8 -0
- package/dist/sales-shared-DjCuN8xG.js +22 -0
- package/dist/scope-DgWjuXUw.js +90 -0
- package/dist/search-BtoWY6n_.js +9 -0
- package/dist/search-LbjCylX5.js +106 -0
- package/dist/server/index.d.ts +157 -51
- package/dist/server/index.js +295 -20
- package/dist/server-types-fXwJoFjt.d.ts +737 -0
- package/dist/session-Djo5t4KQ.d.ts +95 -0
- package/dist/settings-DxXfDUmh.js +90 -0
- package/dist/shared-9B02lczf.js +14 -0
- package/dist/shared-BmMcMoW9.js +89 -0
- package/dist/shared-as0EG51f.js +60 -0
- package/dist/sign-in-D0xN6E_l.js +360 -0
- package/dist/signatures-BMdJ7neI.d.ts +43 -0
- package/dist/signatures-C9CGYZS1.js +145 -0
- package/dist/signers-BjSgNAXP.d.ts +385 -0
- package/dist/signing-keys-Ccr86Y2C.d.ts +90 -0
- package/dist/solid/index.d.ts +8 -8
- package/dist/solid/index.js +3 -8
- package/dist/solid-controller-CZrt1Tg6.d.ts +11 -0
- package/dist/solid-controller-DLsmrczT.js +33 -0
- package/dist/solid-start/index.d.ts +8 -12
- package/dist/solid-start/index.js +8 -7
- package/dist/spec/index.d.ts +25 -5
- package/dist/spec/index.js +37 -4
- package/dist/spec-pins-Dqpml2dZ.d.ts +84 -0
- package/dist/spec-pins-S4PymRxp.js +60 -0
- package/dist/sql/index.d.ts +5 -548
- package/dist/sql/index.js +5 -38398
- package/dist/sql-BQshMgmB.js +422 -0
- package/dist/sql-CgTZOQZ7.js +87439 -0
- package/dist/sso-B5ZoEsXE.d.ts +131 -0
- package/dist/sso-CwAnve68.js +217 -0
- package/dist/ssr/index.d.ts +5 -6
- package/dist/ssr/index.js +4 -4
- package/dist/standard-C3_AAF3g.d.ts +7 -0
- package/dist/standard-DZmwmIhV.js +25 -0
- package/dist/stats-CUhqw6Ev.js +1128 -0
- package/dist/storage/index.d.ts +3 -3
- package/dist/storage/index.js +14 -10
- package/dist/storage-api-B4Ib2Zpo.d.ts +582 -0
- package/dist/store-B5qYKsTh.d.ts +68 -0
- package/dist/streams/index.d.ts +4 -4
- package/dist/streams/index.js +4 -4
- package/dist/streams/redis/index.d.ts +1 -1
- package/dist/streams/redis/index.js +4 -4
- package/dist/stripe/index.d.ts +16 -0
- package/dist/stripe/index.js +14 -0
- package/dist/stripe-NVcNOhHy.d.ts +140 -0
- package/dist/stripe-XZrSmDTf.js +32 -0
- package/dist/subject-readers-81xiWh4M.d.ts +21 -0
- package/dist/subject-readers-DDyPTIOr.js +46 -0
- package/dist/subjects-DP-fvFkk.d.ts +77 -0
- package/dist/subscribers-Cq--DL1E.js +34 -0
- package/dist/supabase-mcp-DomZ-amK.js +28 -0
- package/dist/support-BsqhV6jP.js +522 -0
- package/dist/support-view-CznLe4jq.d.ts +17 -0
- package/dist/svelte/index.d.ts +7 -7
- package/dist/svelte/index.js +2 -2
- package/dist/svelte-controller-CDAujo-_.js +50 -0
- package/dist/svelte-controller-DDbju9CW.d.ts +10 -0
- package/dist/sveltekit/index.d.ts +11 -13
- package/dist/sveltekit/index.js +9 -9
- package/dist/table-schema-pQlER3jj.js +283 -0
- package/dist/tags-7NHyD1P8.d.ts +30 -0
- package/dist/tags-DGldvcA4.js +84 -0
- package/dist/tanstack-db/index.d.ts +2 -2
- package/dist/tanstack-db/index.js +1 -1
- package/dist/tanstack-db/supabase/index.d.ts +5 -6
- package/dist/tanstack-db/supabase/index.js +180 -9
- package/dist/tanstack-start/index.d.ts +7 -7
- package/dist/tanstack-start/index.js +6 -6
- package/dist/tax-DDZUB_oc.d.ts +273 -0
- package/dist/tax-DZDpMMRw.js +140 -0
- package/dist/tee-CdRV1tcj.js +101 -0
- package/dist/template-DdgYjIZ5.js +123 -0
- package/dist/temporal-CB5Fpo5d.js +79 -0
- package/dist/temporal-required-DqRzr7i0.js +20 -0
- package/dist/tenant-B-fiItlJ.js +27 -0
- package/dist/tenant-DW_GmsW4.d.ts +17 -0
- package/dist/tenant-naming-Bsj3Uvap.js +27 -0
- package/dist/testing/index.d.ts +235 -32
- package/dist/testing/index.js +1133 -76
- package/dist/timing-BMCWgpdZ.js +92 -0
- package/dist/topic-DB-1YTMj.js +561 -0
- package/dist/topic-Dgs-eSYQ.d.ts +373 -0
- package/dist/types-BO8lVTun.d.ts +363 -0
- package/dist/types-C_GN-4ed.d.ts +162 -0
- package/dist/types-DGHfTW8_.d.ts +9 -0
- package/dist/types-DM8q3IOr.d.ts +240 -0
- package/dist/types-DOaUIJxW.d.ts +205 -0
- package/dist/types-DZj8CZMH.d.ts +649 -0
- package/dist/types-P1S1cj6N.d.ts +564 -0
- package/dist/types-R6syp1el.js +29 -0
- package/dist/undo-0qM13zul.js +44 -0
- package/dist/undo-D42sPjCf.d.ts +43 -0
- package/dist/usage-BrJGPvCq.js +250 -0
- package/dist/usage-CnQHSM_r.d.ts +202 -0
- package/dist/vault-EnOQJWjn.d.ts +50 -0
- package/dist/vercel-connect/index.d.ts +1 -1
- package/dist/vercel-connect/index.js +4 -4
- package/dist/verify-3NLjUIER.d.ts +142 -0
- package/dist/verify-C9D_jjsQ.js +126 -0
- package/dist/version-Bxj_xcUY.js +4 -0
- package/dist/view-DZ63nqwt.js +105 -0
- package/dist/view-SuASaomx.d.ts +90 -0
- package/dist/vue/index.d.ts +8 -8
- package/dist/vue/index.js +3 -16
- package/dist/vue-controller-C9tFzqAc.js +32 -0
- package/dist/vue-controller-D_ohttBZ.d.ts +11 -0
- package/dist/watch-Blj1mQ9n.js +139 -0
- package/dist/watch-D1wwzZ04.d.ts +84 -0
- package/dist/watch-topic-D-rpUg5n.d.ts +28 -0
- package/dist/watch-topic-miuymrli.js +57 -0
- package/dist/wire-DEY0ajW9.js +45 -0
- package/dist/workflow-builder-C5DBN7yq.js +697 -0
- package/dist/workflow-sdk/builder/index.d.ts +46 -15
- package/dist/workflow-sdk/builder/index.js +69 -21
- package/dist/workflow-sdk/index.d.ts +75 -2
- package/dist/workflow-sdk/index.js +83 -3
- package/dist/workflow-sdk/world/index.d.ts +29 -4
- package/dist/workflow-sdk/world/index.js +137 -59
- package/dist/workflow-sdk-Di5pmCAu.d.ts +161 -0
- package/dist/workflow-sdk-vjDWlnfX.js +243 -0
- package/dist/workflow-sdk-world-DPMdBfzn.js +2103 -0
- package/dist/workflows-DJXoxDZH.d.ts +243 -0
- package/dist/workflows-DzdX28KN.js +282 -0
- package/dist/yjs/index.d.ts +67 -0
- package/dist/yjs/index.js +212 -0
- package/package.json +800 -46
- package/schemas/cli-commands-v1.json +220 -0
- package/schemas/cli-result-v1.json +138 -0
- package/schemas/config-v1.json +4503 -909
- package/schemas/doctor-report-v1.json +30 -0
- package/schemas/snapshot-v2.json +271 -0
- package/skills/better-supabase/SKILL.md +12 -4
- package/skills/better-supabase/references/plugins.md +2 -2
- package/skills/better-supabase/references/ui-recipes.md +19324 -0
- package/skills/better-supabase-api/SKILL.md +14 -14
- package/skills/better-supabase-api/references/adapters.md +12 -2
- package/skills/better-supabase-api/references/ai.md +4 -4
- package/skills/better-supabase-api/references/expo.md +1 -1
- package/skills/better-supabase-api/references/powersync.md +1 -1
- package/skills/better-supabase-api/references/streams-credentials.md +8 -5
- package/skills/better-supabase-auth/SKILL.md +18 -11
- package/skills/better-supabase-auth/references/authorization-providers.md +5 -5
- package/skills/better-supabase-testing/SKILL.md +2 -2
- package/testing/act-cases.json +370 -0
- package/dist/access-sql-CrSbK1q-.js +0 -181
- package/dist/actor-CQTlc1Hh.d.ts +0 -43
- package/dist/adapter-CN45ibbV.js +0 -1691
- package/dist/agents-BY_LQXtQ.d.ts +0 -94
- package/dist/ai-cache-Dfgk8nBT.js +0 -81
- package/dist/ai-cache-DrUMMgp6.d.ts +0 -64
- package/dist/ai-chat-CVLRWbtS.js +0 -744
- package/dist/ai-chat-DXkMy74O.d.ts +0 -590
- package/dist/ai-files-CioLu5du.js +0 -320
- package/dist/ai-tasks-BRQ6iQLc.d.ts +0 -131
- package/dist/announcements-Bouy0Ski.d.ts +0 -72
- package/dist/announcements-p_BFofiR.js +0 -107
- package/dist/api-Dnf2q-Ht.d.ts +0 -370
- package/dist/api-DtHFC037.js +0 -676
- package/dist/api-keys-C8BlF3L2.d.ts +0 -156
- package/dist/assistant-DBlFDZsi.d.ts +0 -147
- package/dist/attributes-5dYul0u0.js +0 -13
- package/dist/authorization-BFCqamMs.d.ts +0 -172
- package/dist/authorizer-ayxUDXXP.js +0 -126
- package/dist/base64-D2gsioCY.js +0 -42
- package/dist/before-route-CnR0C0Jr.js +0 -30
- package/dist/bind-ButSzrHe.js +0 -97
- package/dist/bind-CQ5mPyX1.d.ts +0 -62
- package/dist/block-events-DTxU5tfr.js +0 -91
- package/dist/block-fields-CroxUuF2.js +0 -49
- package/dist/block-fields-D1pfrcIY.d.ts +0 -31
- package/dist/block-helpers-C0Xj8War.d.ts +0 -37
- package/dist/block-helpers-Cy3pB96I.js +0 -222
- package/dist/block-hooks-BPNMIlLl.js +0 -114
- package/dist/block-hooks-DaOVC7SC.d.ts +0 -107
- package/dist/block-transport-bAKh-dGc.js +0 -85
- package/dist/block-transport-inD4fFq-.d.ts +0 -70
- package/dist/build-hPwk3_X5.js +0 -1296
- package/dist/build-meLuYGri.js +0 -689
- package/dist/channel-_2Mx1Oyu.d.ts +0 -70
- package/dist/channels-CkgQ_X60.js +0 -114
- package/dist/cli/add-1dc5wM5k.js +0 -69
- package/dist/cli/bin.d.ts +0 -1
- package/dist/cli/cache-CIfA-jBV.js +0 -483
- package/dist/cli/codemod-JVlTQQG2.js +0 -491
- package/dist/cli/command-DV-StG1x.js +0 -507
- package/dist/cli/config-C2Pz2_4A.js +0 -52
- package/dist/cli/config-DpbF8ML3.js +0 -2
- package/dist/cli/config-M-WzL9O2.js +0 -1175
- package/dist/cli/db-BkcfOlyB.js +0 -53
- package/dist/cli/diff-D1jGdb3Y.js +0 -752
- package/dist/cli/dist-DBPdlPYK.js +0 -1112
- package/dist/cli/dist-DRAVaE6w.js +0 -842
- package/dist/cli/dist-DreZ24Sz.js +0 -129
- package/dist/cli/doctor-VcDtuusV.js +0 -3686
- package/dist/cli/emit-BHHfwUoT.js +0 -1136
- package/dist/cli/env-B--LMhEe.js +0 -514
- package/dist/cli/env-vzBG90Um.js +0 -2
- package/dist/cli/env-zHJtMIBo.js +0 -116
- package/dist/cli/errors-CqTLXe2M.js +0 -72
- package/dist/cli/fastest-levenshtein-CF7BCi9l.js +0 -120
- package/dist/cli/files-BVupXPIC.js +0 -34
- package/dist/cli/gen-DmVj3u4L.js +0 -322
- package/dist/cli/glue-C1UE8gQN.js +0 -468
- package/dist/cli/init-CVZ3s5kl.js +0 -258
- package/dist/cli/introspect-BToGNfm-.js +0 -81
- package/dist/cli/io-CFzJVJ68.js +0 -37
- package/dist/cli/jsonc-BUniUpOk.js +0 -2
- package/dist/cli/keys-CJhtIxJ3.js +0 -85
- package/dist/cli/metadata-DSRKCaf-.js +0 -133
- package/dist/cli/openapi-DWa4Ir1q.js +0 -60
- package/dist/cli/project-DZRaBaY7.js +0 -75
- package/dist/cli/prompts-BdeVmVpg.js +0 -2
- package/dist/cli/prompts-DZJB1nTw.js +0 -1142
- package/dist/cli/read-sets-DjJrm8Wj.js +0 -223
- package/dist/cli/rolldown-runtime-CMFfr-1z.js +0 -26
- package/dist/cli/run-DA6_lg3w.js +0 -389
- package/dist/cli/run-DuN1MX-7.js +0 -705
- package/dist/cli/scaffold-5DenHSxF.js +0 -292
- package/dist/cli/scaffold-CwQUMFRb.js +0 -2
- package/dist/cli/seed-CzBmrGON.js +0 -96
- package/dist/cli/seed-DOmit9Hq.js +0 -2
- package/dist/cli/skills-CnO8QFS7.js +0 -139
- package/dist/cli/snapshot-Bstk6ulj.js +0 -287
- package/dist/cli/source-args-BYfq6imV.js +0 -31
- package/dist/cli/spec-CzosTYm3.js +0 -7438
- package/dist/cli/spec-T_0Bcyw7.js +0 -2
- package/dist/cli/sql-BKOOQAX3.js +0 -517
- package/dist/cli/sql-DJrNDxQm.js +0 -3
- package/dist/cli/sql-layout-D6cphHT3.js +0 -69
- package/dist/cli/style-CB3vxgh0.js +0 -29
- package/dist/cli/supabase-toml-B-bIukQF.js +0 -1095
- package/dist/cli/typegen-Demi5-VQ.js +0 -486
- package/dist/cli/typegen-version-DeFbtzYI.js +0 -8
- package/dist/cli/validate-Ca13ktgz.js +0 -7522
- package/dist/cli/version-B4k0aUxS.js +0 -4
- package/dist/client-wxeTQFtB.js +0 -310
- package/dist/cloud-event-Dune0KI7.d.ts +0 -64
- package/dist/compiler-V1qvcST1.d.ts +0 -14
- package/dist/compose-BHej1acw.js +0 -53
- package/dist/composite-CWAJTRBF.d.ts +0 -146
- package/dist/composite-zTe0TCqj.js +0 -130
- package/dist/config-DlKvtt95.js +0 -540
- package/dist/connector-CySQEFcW.d.ts +0 -107
- package/dist/connectors--PGhmiu0.d.ts +0 -120
- package/dist/context-DsV2SueA.d.ts +0 -246
- package/dist/context-nPDvQ-Zl.js +0 -41
- package/dist/cron-D25Ukpxy.js +0 -145
- package/dist/cron-route-D2AN9SA1.js +0 -24
- package/dist/csv-BZnHA1Py.js +0 -25
- package/dist/define-CFQcvM20.js +0 -1949
- package/dist/define-DmcfoNXB.d.ts +0 -1005
- package/dist/embeddings-4ZvFzjsU.js +0 -127
- package/dist/embeddings-B4vhS-dY.d.ts +0 -68
- package/dist/ended-CcvcRqEd.d.ts +0 -69
- package/dist/entitlements-BYFf0Cdh.js +0 -24
- package/dist/entitlements-Ds8qoYZ-.d.ts +0 -51
- package/dist/envelope-DqnYGRw7.js +0 -47
- package/dist/errors-2M6CKMP4.js +0 -271
- package/dist/errors-rZ7VIqp6.js +0 -44
- package/dist/escape-like-DDWoHzh_.d.ts +0 -15
- package/dist/eve-CoAIcCkq.d.ts +0 -151
- package/dist/events-D1BOCll8.d.ts +0 -551
- package/dist/executor-B-fD7DLt.js +0 -735
- package/dist/executor-B_Hfobee.js +0 -162
- package/dist/executor-C-R4pucm.js +0 -83
- package/dist/executor-CpxLPCiz.d.ts +0 -36
- package/dist/executor-DfEtf0cq.d.ts +0 -164
- package/dist/executor-Drzu3dBK.d.ts +0 -261
- package/dist/executor-ngjKL_Pe.d.ts +0 -30
- package/dist/field-errors-DIe9XYWL.d.ts +0 -109
- package/dist/format-DTXdu8ya.d.ts +0 -70
- package/dist/framework-148t1m3C.d.ts +0 -25
- package/dist/framework-3ey3QmrO.js +0 -51
- package/dist/function-contract-BcZenXMO.d.ts +0 -8
- package/dist/gateway-S9vicgeo.d.ts +0 -130
- package/dist/graph-BGyLLFLX.js +0 -265
- package/dist/hooks-Bhza9Hnr.js +0 -277
- package/dist/http-sbmBe5d2.js +0 -25
- package/dist/impersonation-DcqaTBHx.js +0 -148
- package/dist/inbox-Cd1KCEBL.d.ts +0 -384
- package/dist/index-B72Rvv_j.d.ts +0 -89
- package/dist/index-BCHR4Ucl.d.ts +0 -300
- package/dist/index-BUK7jUzR.d.ts +0 -82
- package/dist/index-Ba1SI-uO.d.ts +0 -1331
- package/dist/index-BfxOaOYs.d.ts +0 -245
- package/dist/index-CicIyqOe.d.ts +0 -55
- package/dist/index-D69h4QqD.d.ts +0 -74
- package/dist/index-DG2SUXDQ.d.ts +0 -58
- package/dist/index-DoNVLHOU.d.ts +0 -206
- package/dist/index-R274XFlg.d.ts +0 -138
- package/dist/index-_4R4b01v.d.ts +0 -257
- package/dist/json-schema-CT4tvrkA.js +0 -548
- package/dist/kit-BhHr9T9v.js +0 -104
- package/dist/kit-W99LCPBS.d.ts +0 -66
- package/dist/knowledge-CAReFpRA.d.ts +0 -176
- package/dist/knowledge-DnHtb64A.js +0 -256
- package/dist/list-query-D3JQeEL7.d.ts +0 -164
- package/dist/list-query-gl808ac1.js +0 -459
- package/dist/live-CTAZQkwl.js +0 -257
- package/dist/messages-CJoHHCWT.js +0 -514
- package/dist/mfa-SZc9YYyb.d.ts +0 -54
- package/dist/model-OgBxvk3N.d.ts +0 -300
- package/dist/model-messages-Cxw_Up4f.js +0 -206
- package/dist/modules-DksjZyMW.js +0 -77
- package/dist/modules-DpPwzC7E.d.ts +0 -192
- package/dist/onboarding-LZvlK1P4.d.ts +0 -62
- package/dist/optional-peer-D1pi-skw.js +0 -24
- package/dist/outbox-DZfAvfzC.d.ts +0 -161
- package/dist/plugin-CPK2HsbY.d.ts +0 -190
- package/dist/pool-gkhbGp2E.d.ts +0 -89
- package/dist/postgrest-BUqLag2Q.d.ts +0 -53
- package/dist/problem-CJvFeGu7.js +0 -126
- package/dist/problem-TvGdxO1t.d.ts +0 -73
- package/dist/provider-DxRTex4x.js +0 -57
- package/dist/provider-ib9wzUDz.d.ts +0 -113
- package/dist/rate-limit-Bw7HgmFj.js +0 -260
- package/dist/react-Bmpo59D7.js +0 -409
- package/dist/react-topic-seAWjL3_.js +0 -38
- package/dist/read-set-DAeWhqPf.js +0 -314
- package/dist/refusal-CFI8-5nf.d.ts +0 -18
- package/dist/refusal-K78A1Vmq.js +0 -61
- package/dist/replicas-CwrYp5Zj.js +0 -94
- package/dist/resolve-Bvgf3ut_.js +0 -786
- package/dist/resolve-MxXVWyhd.d.ts +0 -173
- package/dist/resource--vTrBe6I.d.ts +0 -103
- package/dist/resource-BqNqlYg9.js +0 -91
- package/dist/resource-DA811u_4.js +0 -463
- package/dist/resource-execute-rbKvuCsY.d.ts +0 -12
- package/dist/resource-types-CqB6GWGT.d.ts +0 -141
- package/dist/resources-BVYPnuLo.js +0 -56
- package/dist/resources-DZSk8tXJ.d.ts +0 -7
- package/dist/respond-Cw-zanCm.d.ts +0 -93
- package/dist/respond-volM3ByS.js +0 -91
- package/dist/result-BchM1XZn.d.ts +0 -288
- package/dist/result-DEqHCMKP.js +0 -128
- package/dist/scope-CDHcS7dE.js +0 -90
- package/dist/search-CUWCRYKL.js +0 -9
- package/dist/server-types-CrAmZ8jv.d.ts +0 -614
- package/dist/session-ChiXDZdZ.d.ts +0 -72
- package/dist/shared-CBxosKK3.js +0 -75
- package/dist/shared-DHjhfRdV.js +0 -60
- package/dist/shared-DTneRoxi.js +0 -14
- package/dist/sign-in-D_yoP0PF.js +0 -86
- package/dist/signatures-BRS_p3WD.d.ts +0 -34
- package/dist/signatures-DsWv_bYR.js +0 -103
- package/dist/signers-cpdmZYrv.d.ts +0 -166
- package/dist/spec-pins-CwzDY25w.d.ts +0 -44
- package/dist/spec-pins-DsLfUH7l.js +0 -40
- package/dist/sql-CwuqaQ4Y.js +0 -388
- package/dist/standard-DkzZUneg.js +0 -25
- package/dist/standard-lmkbOtPB.d.ts +0 -7
- package/dist/stats-DhU78Ctf.js +0 -1127
- package/dist/storage-api-CB7Zl1Ci.d.ts +0 -582
- package/dist/store-DsIYEBnv.d.ts +0 -68
- package/dist/stripe-D04h-QBT.d.ts +0 -136
- package/dist/stripe-v-Y2lmop.js +0 -32
- package/dist/supabase-mcp-Cpn5A4i-.js +0 -28
- package/dist/support-D1pFFouF.js +0 -350
- package/dist/support-view-scqMgtOo.d.ts +0 -17
- package/dist/table-schema-htM_SbCW.js +0 -286
- package/dist/tags-BO9LjtWG.d.ts +0 -30
- package/dist/tee-Cb98Vn3b.js +0 -101
- package/dist/template-lPVh-EwW.js +0 -123
- package/dist/temporal-BJGitm-h.js +0 -79
- package/dist/temporal-required-BtynQtM-.js +0 -20
- package/dist/tenant-CM368LXb.d.ts +0 -17
- package/dist/tenant-I1TEZ_BX.js +0 -27
- package/dist/timing-CyTQPubY.js +0 -92
- package/dist/types-6cYK9pbJ.js +0 -29
- package/dist/types-Bb_4-vdW.d.ts +0 -220
- package/dist/types-CD6yCDx3.d.ts +0 -359
- package/dist/types-CbOUc5IH.d.ts +0 -156
- package/dist/types-CoE5Zwy4.d.ts +0 -348
- package/dist/types-DSJ3-m9X.d.ts +0 -192
- package/dist/types-D__3EN0q.d.ts +0 -425
- package/dist/usage-D0NNUFfr.d.ts +0 -177
- package/dist/vault-BpmApxxW.d.ts +0 -50
- package/dist/verify-C91Wyp40.d.ts +0 -142
- package/dist/verify-CJbYfADA.js +0 -124
- package/dist/version-Cq8gfDbd.js +0 -4
- package/dist/view-D5ryq3gz.js +0 -99
- package/dist/view-TpXEUcVN.d.ts +0 -87
- package/dist/watch-BcvtAHOd.js +0 -122
- package/dist/watch-COzRWvVN.d.ts +0 -74
- package/dist/wire-Df3EWkG8.js +0 -45
- package/dist/workflow-builder-CHqHpAVt.js +0 -399
- package/dist/workflow-sdk-C2WJ_G2O.js +0 -173
- package/dist/workflow-sdk-DTZyrvNo.d.ts +0 -98
- package/dist/workflow-sdk-world-CMV1ahFW.js +0 -1399
- package/dist/workflows-CcpCBfIe.d.ts +0 -185
- package/dist/workflows-IvxzG2cl.js +0 -217
|
@@ -0,0 +1,2049 @@
|
|
|
1
|
+
import { c as PRESET_CATALOG, i as presetOf, s as resolvePreset } from "../config-C4RQDF6t.js";
|
|
2
|
+
import { a as appDefaultError, c as appReservedColumns, o as appIdentifierError, p as isAppDefault, s as appNameLengthError, x as APP_ON_DELETE_ACTIONS } from "../app-tables-BRjMcWhW.js";
|
|
3
|
+
import { o as resolveConfig } from "../config-CkyahUjo.js";
|
|
4
|
+
import { c as designConfig, n as diffDesigns } from "../preset-BBrL6_Ln.js";
|
|
5
|
+
import { E as SQL_MODULES, i as moduleLayout, m as renderModules } from "../sql-CgTZOQZ7.js";
|
|
6
|
+
//#region src/create/column-keys.ts
|
|
7
|
+
/** The most options a select takes, and the longest option. */
|
|
8
|
+
const MAX_OPTIONS = 100;
|
|
9
|
+
const MAX_OPTION = 100;
|
|
10
|
+
const AUTH_USERS$2 = "auth.users";
|
|
11
|
+
/** The column types each format fits, as `appTables` checks them. */
|
|
12
|
+
const FORMAT_TYPES = {
|
|
13
|
+
email: ["text"],
|
|
14
|
+
url: ["text"],
|
|
15
|
+
phone: ["text"],
|
|
16
|
+
long_text: ["text"],
|
|
17
|
+
color: ["text"],
|
|
18
|
+
rating: ["integer", "bigint"],
|
|
19
|
+
percent: ["integer", "numeric"],
|
|
20
|
+
currency: ["bigint"]
|
|
21
|
+
};
|
|
22
|
+
const FORMAT_LABELS = {
|
|
23
|
+
email: "email",
|
|
24
|
+
url: "url",
|
|
25
|
+
phone: "phone",
|
|
26
|
+
long_text: "long text",
|
|
27
|
+
color: "color",
|
|
28
|
+
rating: "rating",
|
|
29
|
+
percent: "percent",
|
|
30
|
+
currency: "money"
|
|
31
|
+
};
|
|
32
|
+
const NUMBER_TYPES = /* @__PURE__ */ new Set([
|
|
33
|
+
"integer",
|
|
34
|
+
"bigint",
|
|
35
|
+
"numeric"
|
|
36
|
+
]);
|
|
37
|
+
const CONTROL = /\p{Cc}/u;
|
|
38
|
+
/**
|
|
39
|
+
* Whether a column signed-in users can't write is required with no default,
|
|
40
|
+
* which `appTables` refuses: nobody but the server could insert a row.
|
|
41
|
+
*/
|
|
42
|
+
function lockedWithoutDefault(column) {
|
|
43
|
+
return column.access !== void 0 && column.nullable === false && column.default === void 0 && column.identity !== true;
|
|
44
|
+
}
|
|
45
|
+
/** Whether `min` and `max` apply to a `type` column, as a value or a length. */
|
|
46
|
+
function takesBounds(type) {
|
|
47
|
+
return type === "text" || NUMBER_TYPES.has(type);
|
|
48
|
+
}
|
|
49
|
+
/** Whether a bound of a `type` column has to be a whole number. */
|
|
50
|
+
function wholeBounds(type) {
|
|
51
|
+
return type !== "numeric";
|
|
52
|
+
}
|
|
53
|
+
function fitsBound(type, value) {
|
|
54
|
+
return value !== void 0 && takesBounds(type) && (!wholeBounds(type) || Number.isInteger(value)) && (type !== "text" || value >= 0);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* A column without the keys its type can't take: a format of another type,
|
|
58
|
+
* options outside text and text[], bounds that don't apply, an identity
|
|
59
|
+
* outside integer and bigint, and a default an identity or the type refuses.
|
|
60
|
+
*/
|
|
61
|
+
function fitted(column) {
|
|
62
|
+
const { format, options, min, max, identity, default: fallback, nullable, ...rest } = column;
|
|
63
|
+
const { type } = column;
|
|
64
|
+
const counted = identity === true && (type === "integer" || type === "bigint");
|
|
65
|
+
const next = { ...rest };
|
|
66
|
+
if (nullable !== void 0 && !(counted && nullable)) next.nullable = nullable;
|
|
67
|
+
if (fallback !== void 0 && !counted && isAppDefault(type, fallback)) next.default = fallback;
|
|
68
|
+
if (format !== void 0 && FORMAT_TYPES[format].includes(type)) next.format = format;
|
|
69
|
+
if (options !== void 0 && (type === "text" || type === "text[]")) next.options = options;
|
|
70
|
+
if (fitsBound(type, min)) next.min = min;
|
|
71
|
+
if (fitsBound(type, max)) next.max = max;
|
|
72
|
+
if (counted) next.identity = true;
|
|
73
|
+
return next;
|
|
74
|
+
}
|
|
75
|
+
/** Why `option` can't join a select's `options`, or `undefined` when it can. */
|
|
76
|
+
function optionError(options, option) {
|
|
77
|
+
if (option === "") return "Enter an option.";
|
|
78
|
+
if (option.length > MAX_OPTION) return `Use at most ${MAX_OPTION} characters.`;
|
|
79
|
+
if (CONTROL.test(option)) return "Leave out line breaks and tabs.";
|
|
80
|
+
if (options.includes(option)) return `${option} is already an option.`;
|
|
81
|
+
if (options.length >= MAX_OPTIONS) return `A select takes at most ${MAX_OPTIONS} options.`;
|
|
82
|
+
}
|
|
83
|
+
/** Why `value` can't be a bound of `column`, or `undefined` when it can (an empty value clears it). */
|
|
84
|
+
function boundError(column, side, value) {
|
|
85
|
+
const trimmed = value.trim();
|
|
86
|
+
if (trimmed === "") return;
|
|
87
|
+
const number = Number(trimmed);
|
|
88
|
+
if (!Number.isFinite(number)) return "Enter a number.";
|
|
89
|
+
if (column.type === "text" && (!Number.isInteger(number) || number < 0)) return "A length is a whole number of 0 or more.";
|
|
90
|
+
if (wholeBounds(column.type) && !Number.isInteger(number)) return `A ${column.type} bound is a whole number.`;
|
|
91
|
+
if (side === "min" && column.max !== void 0 && number > column.max) return `Keep it at or below the largest value, ${column.max}.`;
|
|
92
|
+
if (side === "max" && column.min !== void 0 && number < column.min) return `Keep it at or above the smallest value, ${column.min}.`;
|
|
93
|
+
}
|
|
94
|
+
/** `column` with its bounds replaced; a bound left out is removed. */
|
|
95
|
+
function withBounds(column, bounds) {
|
|
96
|
+
const { min: _min, max: _max, ...rest } = column;
|
|
97
|
+
const next = { ...rest };
|
|
98
|
+
if (bounds.min !== void 0) next.min = bounds.min;
|
|
99
|
+
if (bounds.max !== void 0) next.max = bounds.max;
|
|
100
|
+
return next;
|
|
101
|
+
}
|
|
102
|
+
/** What the canvas shows for a column that is more than its type, such as an email or a select. */
|
|
103
|
+
function columnLabel(column) {
|
|
104
|
+
if (column.identity === true) return "autonumber";
|
|
105
|
+
if (column.options !== void 0) return column.type === "text[]" ? "multi-select" : "select";
|
|
106
|
+
if (column.references?.block === void 0 && column.references?.table === AUTH_USERS$2) return "person";
|
|
107
|
+
return column.format === void 0 ? void 0 : FORMAT_LABELS[column.format];
|
|
108
|
+
}
|
|
109
|
+
//#endregion
|
|
110
|
+
//#region src/create/design-computed.ts
|
|
111
|
+
/** The aggregates a rollup takes (`APP_ROLLUP_AGGREGATES`). */
|
|
112
|
+
const ROLLUP_AGGREGATES = [
|
|
113
|
+
"count",
|
|
114
|
+
"sum",
|
|
115
|
+
"min",
|
|
116
|
+
"max",
|
|
117
|
+
"avg"
|
|
118
|
+
];
|
|
119
|
+
const NUMBERS = /* @__PURE__ */ new Set([
|
|
120
|
+
"integer",
|
|
121
|
+
"bigint",
|
|
122
|
+
"numeric"
|
|
123
|
+
]);
|
|
124
|
+
const ORDERED = /* @__PURE__ */ new Set([
|
|
125
|
+
...NUMBERS,
|
|
126
|
+
"date",
|
|
127
|
+
"timestamptz",
|
|
128
|
+
"text"
|
|
129
|
+
]);
|
|
130
|
+
function isRollupAggregate(value) {
|
|
131
|
+
return ROLLUP_AGGREGATES.some((each) => each === value);
|
|
132
|
+
}
|
|
133
|
+
/** The columns of `table` a rollup or lookup can read, with their types. */
|
|
134
|
+
function readableColumns(table) {
|
|
135
|
+
return [...Object.entries(table.columns ?? {}).map(([name, column]) => [name, column.type]), ...table.timestamps === false ? [] : [["created_at", "timestamptz"], ["updated_at", "timestamptz"]]];
|
|
136
|
+
}
|
|
137
|
+
/** The columns `aggregate` can read: numbers for sum and avg, ordered types for min and max, none for count. */
|
|
138
|
+
function rollupColumns(child, aggregate) {
|
|
139
|
+
if (aggregate === "count") return [];
|
|
140
|
+
const fits = aggregate === "sum" || aggregate === "avg" ? NUMBERS : ORDERED;
|
|
141
|
+
return readableColumns(child).filter(([, type]) => fits.has(type)).map(([name]) => name);
|
|
142
|
+
}
|
|
143
|
+
/** The select columns of `child` (text with options) a rollup can filter on. */
|
|
144
|
+
function filterColumns(child) {
|
|
145
|
+
return Object.entries(child.columns ?? {}).flatMap(([name, column]) => column.type === "text" && column.options !== void 0 ? [[name, column.options]] : []);
|
|
146
|
+
}
|
|
147
|
+
/** Each app table column that references `parent`, as `{ table, via }`: what a rollup on `parent` can aggregate. */
|
|
148
|
+
function rollupSources(tables, parent) {
|
|
149
|
+
return Object.entries(tables).flatMap(([table, config]) => Object.entries(config.columns ?? {}).filter(([, column]) => column.references !== void 0 && column.references.block === void 0 && column.references.table === parent).map(([via]) => ({
|
|
150
|
+
table,
|
|
151
|
+
via
|
|
152
|
+
})));
|
|
153
|
+
}
|
|
154
|
+
/** Each column of `name` that references another app table, with that table: what a lookup can follow. */
|
|
155
|
+
function lookupSources(tables, name) {
|
|
156
|
+
return Object.entries(tables[name]?.columns ?? {}).flatMap(([via, column]) => column.references !== void 0 && column.references.block === void 0 && Object.hasOwn(tables, column.references.table) ? [{
|
|
157
|
+
via,
|
|
158
|
+
target: column.references.table
|
|
159
|
+
}] : []);
|
|
160
|
+
}
|
|
161
|
+
function rollupValid(tables, parent, rollup) {
|
|
162
|
+
const child = tables[rollup.table];
|
|
163
|
+
if (child === void 0 || !rollupSources(tables, parent).some((each) => each.table === rollup.table && each.via === rollup.via)) return false;
|
|
164
|
+
const column = rollup.aggregate === "count" ? rollup.column === void 0 : rollup.column !== void 0 && rollupColumns(child, rollup.aggregate).includes(rollup.column);
|
|
165
|
+
const where = rollup.where === void 0 || filterColumns(child).some(([name, options]) => name === rollup.where?.column && options.includes(rollup.where.equals));
|
|
166
|
+
return column && where;
|
|
167
|
+
}
|
|
168
|
+
function lookupValid(tables, name, lookup) {
|
|
169
|
+
const source = lookupSources(tables, name).find((each) => each.via === lookup.via);
|
|
170
|
+
const target = source === void 0 ? void 0 : tables[source.target];
|
|
171
|
+
return target !== void 0 && readableColumns(target).some(([column]) => column === lookup.column);
|
|
172
|
+
}
|
|
173
|
+
function kept(record, keep) {
|
|
174
|
+
if (record === void 0) return;
|
|
175
|
+
const entries = Object.entries(record).filter(([name, value]) => keep(name, value));
|
|
176
|
+
return entries.length === 0 ? void 0 : Object.fromEntries(entries);
|
|
177
|
+
}
|
|
178
|
+
/** `table` with its rollups and lookups replaced, leaving out an empty set. */
|
|
179
|
+
function withComputed(table, rollups, lookups) {
|
|
180
|
+
const { rollups: _rollups, lookups: _lookups, ...rest } = table;
|
|
181
|
+
const next = { ...rest };
|
|
182
|
+
if (rollups !== void 0 && Object.keys(rollups).length > 0) next.rollups = rollups;
|
|
183
|
+
if (lookups !== void 0 && Object.keys(lookups).length > 0) next.lookups = lookups;
|
|
184
|
+
return next;
|
|
185
|
+
}
|
|
186
|
+
/** `table` with a rollup or lookup set under `name`, replacing `previous` in its place. */
|
|
187
|
+
function tableWithComputed(table, name, computed, previous) {
|
|
188
|
+
const placed = (record, value) => {
|
|
189
|
+
const entries = Object.entries(record ?? {});
|
|
190
|
+
const added = [name, value];
|
|
191
|
+
return Object.fromEntries(entries.some(([each]) => each === previous) ? entries.map(([each, config]) => each === previous ? added : [each, config]) : [...entries, added]);
|
|
192
|
+
};
|
|
193
|
+
return "rollup" in computed ? withComputed(table, placed(table.rollups, computed.rollup), table.lookups) : withComputed(table, table.rollups, placed(table.lookups, computed.lookup));
|
|
194
|
+
}
|
|
195
|
+
/** `table` without the rollup or lookup `name`. */
|
|
196
|
+
function tableWithoutComputed(table, name) {
|
|
197
|
+
return withComputed(table, kept(table.rollups, (each) => each !== name), kept(table.lookups, (each) => each !== name));
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* The tables with every rollup and lookup that no longer fits dropped: one
|
|
201
|
+
* whose table, link or column was deleted or retyped, or whose name a
|
|
202
|
+
* column now uses. `sql sync` would refuse them, and the design code would
|
|
203
|
+
* not encode.
|
|
204
|
+
*/
|
|
205
|
+
function prunedComputed(tables) {
|
|
206
|
+
return Object.fromEntries(Object.entries(tables).map(([name, table]) => {
|
|
207
|
+
const own = new Set(Object.keys(table.columns ?? {}));
|
|
208
|
+
const rollups = kept(table.rollups, (column, rollup) => !own.has(column) && rollupValid(tables, name, rollup));
|
|
209
|
+
return [name, withComputed(table, rollups, kept(table.lookups, (column, lookup) => !own.has(column) && rollups?.[column] === void 0 && lookupValid(tables, name, lookup)))];
|
|
210
|
+
}));
|
|
211
|
+
}
|
|
212
|
+
/** The rollups that aggregate `from`, pointed at `to`. */
|
|
213
|
+
function computedTableRenamed(tables, from, to) {
|
|
214
|
+
return Object.fromEntries(Object.entries(tables).map(([name, table]) => [name, table.rollups === void 0 ? table : {
|
|
215
|
+
...table,
|
|
216
|
+
rollups: Object.fromEntries(Object.entries(table.rollups).map(([column, rollup]) => [column, rollup.table === from ? {
|
|
217
|
+
...rollup,
|
|
218
|
+
table: to
|
|
219
|
+
} : rollup]))
|
|
220
|
+
}]));
|
|
221
|
+
}
|
|
222
|
+
/** The rollup fitted to a new source or aggregate: a column the aggregate can read, and a filter the child still has. */
|
|
223
|
+
function fittedRollup(tables, rollup) {
|
|
224
|
+
const child = tables[rollup.table] ?? {};
|
|
225
|
+
const columns = rollupColumns(child, rollup.aggregate);
|
|
226
|
+
const aggregate = rollup.aggregate !== "count" && columns.length === 0 ? "count" : rollup.aggregate;
|
|
227
|
+
const column = aggregate === "count" ? void 0 : rollup.column !== void 0 && columns.includes(rollup.column) ? rollup.column : columns[0];
|
|
228
|
+
const where = rollup.where !== void 0 && filterColumns(child).some(([name, options]) => name === rollup.where?.column && options.includes(rollup.where.equals)) ? rollup.where : void 0;
|
|
229
|
+
const next = {
|
|
230
|
+
table: rollup.table,
|
|
231
|
+
via: rollup.via,
|
|
232
|
+
aggregate
|
|
233
|
+
};
|
|
234
|
+
if (column !== void 0) next.column = column;
|
|
235
|
+
if (where !== void 0) next.where = where;
|
|
236
|
+
return next;
|
|
237
|
+
}
|
|
238
|
+
function rollupRenamed(rollup, swap) {
|
|
239
|
+
const next = {
|
|
240
|
+
...rollup,
|
|
241
|
+
via: swap(rollup.via)
|
|
242
|
+
};
|
|
243
|
+
if (rollup.column !== void 0) next.column = swap(rollup.column);
|
|
244
|
+
if (rollup.where !== void 0) next.where = {
|
|
245
|
+
...rollup.where,
|
|
246
|
+
column: swap(rollup.where.column)
|
|
247
|
+
};
|
|
248
|
+
return next;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Every rollup and lookup that reads `table.from`, reading `table.to`. The
|
|
252
|
+
* tables already have the column renamed, so a lookup finds its target
|
|
253
|
+
* through the renamed link.
|
|
254
|
+
*/
|
|
255
|
+
function computedColumnRenamed(tables, table, from, to) {
|
|
256
|
+
const swap = (column) => column === from ? to : column;
|
|
257
|
+
const lookupTarget = (owner, via) => {
|
|
258
|
+
const reference = tables[owner]?.columns?.[via]?.references;
|
|
259
|
+
return reference?.block === void 0 ? reference?.table : void 0;
|
|
260
|
+
};
|
|
261
|
+
return Object.fromEntries(Object.entries(tables).map(([name, config]) => {
|
|
262
|
+
return [name, withComputed(config, config.rollups === void 0 ? void 0 : Object.fromEntries(Object.entries(config.rollups).map(([column, rollup]) => [column, rollup.table === table ? rollupRenamed(rollup, swap) : rollup])), config.lookups === void 0 ? void 0 : Object.fromEntries(Object.entries(config.lookups).map(([column, lookup]) => {
|
|
263
|
+
const via = name === table ? swap(lookup.via) : lookup.via;
|
|
264
|
+
return [column, {
|
|
265
|
+
via,
|
|
266
|
+
column: lookupTarget(name, via) === table ? swap(lookup.column) : lookup.column
|
|
267
|
+
}];
|
|
268
|
+
})))];
|
|
269
|
+
}));
|
|
270
|
+
}
|
|
271
|
+
function rollupSummary(rollup) {
|
|
272
|
+
const what = rollup.aggregate === "count" ? `count of ${rollup.table}` : `${rollup.aggregate} of ${rollup.table}.${rollup.column ?? ""}`;
|
|
273
|
+
return rollup.where === void 0 ? what : `${what} where ${rollup.where.column} = ${rollup.where.equals}`;
|
|
274
|
+
}
|
|
275
|
+
/** The rollups and lookups of an app table, in the view's column order. */
|
|
276
|
+
function computedRows(table) {
|
|
277
|
+
return [...Object.entries(table.rollups ?? {}).map(([name, rollup]) => ({
|
|
278
|
+
name,
|
|
279
|
+
kind: "rollup",
|
|
280
|
+
summary: rollupSummary(rollup),
|
|
281
|
+
label: rollup.aggregate
|
|
282
|
+
})), ...Object.entries(table.lookups ?? {}).map(([name, lookup]) => {
|
|
283
|
+
return {
|
|
284
|
+
name,
|
|
285
|
+
kind: "lookup",
|
|
286
|
+
summary: `${table.columns?.[lookup.via]?.references?.table ?? lookup.via}.${lookup.column} through ${lookup.via}`,
|
|
287
|
+
label: "lookup"
|
|
288
|
+
};
|
|
289
|
+
})];
|
|
290
|
+
}
|
|
291
|
+
//#endregion
|
|
292
|
+
//#region src/create/design-subject.ts
|
|
293
|
+
/** The columns `subject` adds: `rank` for manual order and `deleted_at` for trash. */
|
|
294
|
+
function subjectColumns(subject) {
|
|
295
|
+
const columns = [];
|
|
296
|
+
if (subject?.rank !== void 0) columns.push({
|
|
297
|
+
name: "rank",
|
|
298
|
+
type: "text",
|
|
299
|
+
nullable: false,
|
|
300
|
+
default: "'V'",
|
|
301
|
+
unique: false
|
|
302
|
+
});
|
|
303
|
+
if (subject?.softDelete === true) columns.push({
|
|
304
|
+
name: "deleted_at",
|
|
305
|
+
type: "timestamptz",
|
|
306
|
+
nullable: true,
|
|
307
|
+
default: null,
|
|
308
|
+
unique: false
|
|
309
|
+
});
|
|
310
|
+
return columns;
|
|
311
|
+
}
|
|
312
|
+
/** The subject with the columns it names renamed or dropped by `edit`. */
|
|
313
|
+
function subjectColumnsEdited(subject, edit) {
|
|
314
|
+
const { title, search, rank, versions, ...rest } = subject;
|
|
315
|
+
const next = { ...rest };
|
|
316
|
+
const [nextTitle] = title === void 0 ? [] : edit([title]);
|
|
317
|
+
if (nextTitle !== void 0) next.title = nextTitle;
|
|
318
|
+
if (search !== void 0) {
|
|
319
|
+
const nextSearch = {};
|
|
320
|
+
const [searchTitle] = search.title === void 0 ? [] : edit([search.title]);
|
|
321
|
+
const body = edit(search.body ?? []);
|
|
322
|
+
if (searchTitle !== void 0) nextSearch.title = searchTitle;
|
|
323
|
+
if (body.length > 0) nextSearch.body = body;
|
|
324
|
+
next.search = nextSearch;
|
|
325
|
+
}
|
|
326
|
+
if (versions === true) next.versions = true;
|
|
327
|
+
else if (versions !== void 0) {
|
|
328
|
+
const { columns, ...options } = versions;
|
|
329
|
+
const kept = columns === void 0 ? void 0 : edit(columns);
|
|
330
|
+
next.versions = kept === void 0 || kept.length === 0 ? options : {
|
|
331
|
+
...options,
|
|
332
|
+
columns: kept
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
if (rank === true) next.rank = true;
|
|
336
|
+
else if (rank !== void 0) {
|
|
337
|
+
const [group] = rank.group === void 0 ? [] : edit([rank.group]);
|
|
338
|
+
next.rank = group === void 0 ? true : { group };
|
|
339
|
+
}
|
|
340
|
+
return next;
|
|
341
|
+
}
|
|
342
|
+
const SUBJECT_TYPE = /^[a-z][a-z0-9_]*$/u;
|
|
343
|
+
/** Why `type` can't be the subject type of the app table `table`, or `undefined` when it can. */
|
|
344
|
+
function subjectTypeError(design, table, type) {
|
|
345
|
+
if (!SUBJECT_TYPE.test(type)) return "Use lowercase letters, digits and underscores, starting with a letter.";
|
|
346
|
+
const owner = Object.entries(design.appTables ?? {}).find(([name, each]) => name !== table && each.subject?.type === type)?.[0];
|
|
347
|
+
return owner === void 0 ? void 0 : `${owner} already has the subject type ${type}.`;
|
|
348
|
+
}
|
|
349
|
+
/** App table events with `edit` applied to the payload columns, dropping an empty list. */
|
|
350
|
+
function eventsColumnsEdited(events, edit) {
|
|
351
|
+
if (events === true) return true;
|
|
352
|
+
const { include, ...rest } = events;
|
|
353
|
+
const kept = include === void 0 ? [] : edit(include);
|
|
354
|
+
return kept.length === 0 ? rest : {
|
|
355
|
+
...rest,
|
|
356
|
+
include: kept
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
//#endregion
|
|
360
|
+
//#region src/create/design.ts
|
|
361
|
+
const EMPTY_DESIGN = {};
|
|
362
|
+
/** The schema app tables go in. */
|
|
363
|
+
const APP_SCHEMA = "public";
|
|
364
|
+
/** The module name app tables carry in the diagram. */
|
|
365
|
+
const APP_MODULE = "app-tables";
|
|
366
|
+
/** Column names every app table creates itself. */
|
|
367
|
+
const IMPLICIT_COLUMNS = /* @__PURE__ */ new Set([
|
|
368
|
+
"id",
|
|
369
|
+
"created_at",
|
|
370
|
+
"updated_at"
|
|
371
|
+
]);
|
|
372
|
+
function appTableId(name) {
|
|
373
|
+
return `${APP_SCHEMA}.${name}`;
|
|
374
|
+
}
|
|
375
|
+
function isAppTable(table) {
|
|
376
|
+
return table.module === APP_MODULE;
|
|
377
|
+
}
|
|
378
|
+
function isEmptyDesign(design) {
|
|
379
|
+
return Object.keys(design.appTables ?? {}).length === 0 && Object.keys(design.extraColumns ?? {}).length === 0 && Object.keys(design.positions ?? {}).length === 0;
|
|
380
|
+
}
|
|
381
|
+
/** The column that scopes an app table's rows, or `null` for `scope: "none"` and unscoped presets. */
|
|
382
|
+
function scopeColumnOf(table, preset) {
|
|
383
|
+
const scope = table.scope ?? "inherit";
|
|
384
|
+
if (scope === "none") return null;
|
|
385
|
+
if (scope === "inherit" && preset.scope === "tenant") return {
|
|
386
|
+
name: `${preset.tenantName}_id`,
|
|
387
|
+
type: preset.idType,
|
|
388
|
+
nullable: false,
|
|
389
|
+
default: null,
|
|
390
|
+
unique: false
|
|
391
|
+
};
|
|
392
|
+
if (scope === "user" || preset.scope === "user") return {
|
|
393
|
+
name: "user_id",
|
|
394
|
+
type: "uuid",
|
|
395
|
+
nullable: false,
|
|
396
|
+
default: "auth.uid()",
|
|
397
|
+
unique: false
|
|
398
|
+
};
|
|
399
|
+
return null;
|
|
400
|
+
}
|
|
401
|
+
/** Why `name` can't name an app table or column, by the library's rules. */
|
|
402
|
+
function identifierError(name) {
|
|
403
|
+
return appIdentifierError(name);
|
|
404
|
+
}
|
|
405
|
+
/** The names of an app table's columns, its implicit ones included. */
|
|
406
|
+
function columnNamesOf(table, preset) {
|
|
407
|
+
const scope = scopeColumnOf(table, preset);
|
|
408
|
+
return [
|
|
409
|
+
"id",
|
|
410
|
+
...scope === null ? [] : [scope.name],
|
|
411
|
+
...Object.keys(table.columns ?? {}),
|
|
412
|
+
...table.timestamps === false ? [] : ["created_at", "updated_at"],
|
|
413
|
+
...computedRows(table).map((row) => row.name)
|
|
414
|
+
];
|
|
415
|
+
}
|
|
416
|
+
/** Why a column can't be added to an app table, or `undefined` when it can. */
|
|
417
|
+
function columnError(table, name, preset) {
|
|
418
|
+
const invalid = identifierError(name);
|
|
419
|
+
if (invalid !== void 0) return invalid;
|
|
420
|
+
if (IMPLICIT_COLUMNS.has(name) || columnNamesOf(table, preset).includes(name)) return `The table already has a ${name} column.`;
|
|
421
|
+
if (appReservedColumns(preset.tenantName).includes(name)) return `${name} is a column every app table can get from its scope. Choose another name.`;
|
|
422
|
+
}
|
|
423
|
+
/**
|
|
424
|
+
* Why `value` can't be the default of `column` (its type, options and
|
|
425
|
+
* bounds), or `undefined` when it can or is empty.
|
|
426
|
+
*/
|
|
427
|
+
function defaultError(column, value) {
|
|
428
|
+
const trimmed = value.trim();
|
|
429
|
+
return trimmed === "" ? void 0 : appDefaultError(column, trimmed);
|
|
430
|
+
}
|
|
431
|
+
/** A column with its type changed, dropping the keys the new type can't take. */
|
|
432
|
+
function retyped(column, type) {
|
|
433
|
+
return fitted({
|
|
434
|
+
...column,
|
|
435
|
+
type
|
|
436
|
+
});
|
|
437
|
+
}
|
|
438
|
+
/** A free app table name: `base`, then `base_2`, `base_3` and so on. */
|
|
439
|
+
function freeTableName(design, taken, base = "items") {
|
|
440
|
+
const used = (name) => taken.has(appTableId(name)) || design.appTables?.[name] !== void 0;
|
|
441
|
+
if (!used(base)) return base;
|
|
442
|
+
let index = 2;
|
|
443
|
+
while (used(`${base}_${index}`)) index += 1;
|
|
444
|
+
return `${base}_${index}`;
|
|
445
|
+
}
|
|
446
|
+
function withAppTables(design, appTables) {
|
|
447
|
+
const { appTables: _drop, ...rest } = design;
|
|
448
|
+
return Object.keys(appTables).length === 0 ? rest : {
|
|
449
|
+
...rest,
|
|
450
|
+
appTables: prunedComputed(appTables)
|
|
451
|
+
};
|
|
452
|
+
}
|
|
453
|
+
function withPositions(design, positions) {
|
|
454
|
+
const { positions: _drop, ...rest } = design;
|
|
455
|
+
return Object.keys(positions).length === 0 ? rest : {
|
|
456
|
+
...rest,
|
|
457
|
+
positions
|
|
458
|
+
};
|
|
459
|
+
}
|
|
460
|
+
function omitKey(record, key) {
|
|
461
|
+
const { [key]: _drop, ...rest } = record ?? {};
|
|
462
|
+
return rest;
|
|
463
|
+
}
|
|
464
|
+
/** Adds an app table, placed at `position` when given. */
|
|
465
|
+
function addTable(design, name, table = {}, position) {
|
|
466
|
+
const next = withAppTables(design, {
|
|
467
|
+
...design.appTables,
|
|
468
|
+
[name]: table
|
|
469
|
+
});
|
|
470
|
+
return position === void 0 ? next : withPositions(next, {
|
|
471
|
+
...next.positions,
|
|
472
|
+
[appTableId(name)]: position
|
|
473
|
+
});
|
|
474
|
+
}
|
|
475
|
+
/**
|
|
476
|
+
* Removes an app table, every app table column that references it (and
|
|
477
|
+
* those columns from key sets), and the rollups and lookups that read it.
|
|
478
|
+
*/
|
|
479
|
+
function deleteTable(design, name) {
|
|
480
|
+
const rest = omitKey(design.appTables, name);
|
|
481
|
+
return withPositions(withAppTables(design, Object.fromEntries(Object.entries(rest).map(([key, table]) => {
|
|
482
|
+
const dropped = new Set(Object.entries(table.columns ?? {}).filter(([, column]) => column.references?.block === void 0 && column.references?.table === name).map(([column]) => column));
|
|
483
|
+
return [key, dropped.size === 0 ? table : withKeySets({
|
|
484
|
+
...table,
|
|
485
|
+
columns: Object.fromEntries(Object.entries(table.columns ?? {}).filter(([column]) => !dropped.has(column)))
|
|
486
|
+
}, (columns) => columns.filter((column) => !dropped.has(column)))];
|
|
487
|
+
}))), omitKey(design.positions, appTableId(name)));
|
|
488
|
+
}
|
|
489
|
+
/** Renames an app table and the references to it. */
|
|
490
|
+
function renameTable(design, from, to) {
|
|
491
|
+
if (from === to || design.appTables?.[from] === void 0) return design;
|
|
492
|
+
const appTables = Object.fromEntries(Object.entries(design.appTables).map(([key, table]) => [key === from ? to : key, {
|
|
493
|
+
...table,
|
|
494
|
+
columns: Object.fromEntries(Object.entries(table.columns ?? {}).map(([name, column]) => [name, column.references?.block === void 0 && column.references?.table === from ? {
|
|
495
|
+
...column,
|
|
496
|
+
references: {
|
|
497
|
+
...column.references,
|
|
498
|
+
table: to
|
|
499
|
+
}
|
|
500
|
+
} : column]))
|
|
501
|
+
}]));
|
|
502
|
+
const position = design.positions?.[appTableId(from)];
|
|
503
|
+
const positions = omitKey(design.positions, appTableId(from));
|
|
504
|
+
return withPositions(withAppTables(design, computedTableRenamed(appTables, from, to)), position === void 0 ? positions : {
|
|
505
|
+
...positions,
|
|
506
|
+
[appTableId(to)]: position
|
|
507
|
+
});
|
|
508
|
+
}
|
|
509
|
+
const TABLE_PATCH_KEYS = [
|
|
510
|
+
"scope",
|
|
511
|
+
"timestamps",
|
|
512
|
+
"id",
|
|
513
|
+
"unique",
|
|
514
|
+
"indexes",
|
|
515
|
+
"comment",
|
|
516
|
+
"subject",
|
|
517
|
+
"events"
|
|
518
|
+
];
|
|
519
|
+
function patchKey(next, patch, key) {
|
|
520
|
+
if (!(key in patch)) return;
|
|
521
|
+
const value = patch[key];
|
|
522
|
+
if (value === void 0) delete next[key];
|
|
523
|
+
else next[key] = value;
|
|
524
|
+
}
|
|
525
|
+
/** Updates an app table's options; a key set to `undefined` is removed. */
|
|
526
|
+
function updateTable(design, name, patch) {
|
|
527
|
+
const table = design.appTables?.[name];
|
|
528
|
+
if (table === void 0) return design;
|
|
529
|
+
const next = { ...table };
|
|
530
|
+
for (const key of TABLE_PATCH_KEYS) patchKey(next, patch, key);
|
|
531
|
+
return withAppTables(design, {
|
|
532
|
+
...design.appTables,
|
|
533
|
+
[name]: next
|
|
534
|
+
});
|
|
535
|
+
}
|
|
536
|
+
/**
|
|
537
|
+
* Sets an app table's id type and retypes the app table columns that
|
|
538
|
+
* reference it, since a key has the type of the id it points at.
|
|
539
|
+
*/
|
|
540
|
+
function setTableId(design, name, id) {
|
|
541
|
+
const next = updateTable(design, name, { id: id === "uuid" ? void 0 : id });
|
|
542
|
+
return withAppTables(next, Object.fromEntries(Object.entries(next.appTables ?? {}).map(([key, table]) => [key, {
|
|
543
|
+
...table,
|
|
544
|
+
columns: Object.fromEntries(Object.entries(table.columns ?? {}).map(([column, config]) => [column, config.references?.block === void 0 && config.references?.table === name ? retyped(config, id) : config]))
|
|
545
|
+
}])));
|
|
546
|
+
}
|
|
547
|
+
/** A table's composite key sets with `edit` applied to each, dropping empty sets and an empty list. */
|
|
548
|
+
function withKeySets(table, edit) {
|
|
549
|
+
const { unique, indexes, ...rest } = table;
|
|
550
|
+
const sets = (list) => {
|
|
551
|
+
const next = (list ?? []).map(edit).filter((columns) => columns.length > 0);
|
|
552
|
+
return next.length === 0 ? void 0 : next;
|
|
553
|
+
};
|
|
554
|
+
const next = { ...rest };
|
|
555
|
+
const nextUnique = sets(unique);
|
|
556
|
+
if (rest.subject !== void 0) next.subject = subjectColumnsEdited(rest.subject, edit);
|
|
557
|
+
if (rest.events !== void 0) next.events = eventsColumnsEdited(rest.events, edit);
|
|
558
|
+
const nextIndexes = sets(indexes);
|
|
559
|
+
if (nextUnique !== void 0) next.unique = nextUnique;
|
|
560
|
+
if (nextIndexes !== void 0) next.indexes = nextIndexes;
|
|
561
|
+
return next;
|
|
562
|
+
}
|
|
563
|
+
/** Sets (adds or replaces) an app table column. */
|
|
564
|
+
function setColumn(design, table, name, column) {
|
|
565
|
+
const current = design.appTables?.[table];
|
|
566
|
+
return current === void 0 ? design : withAppTables(design, {
|
|
567
|
+
...design.appTables,
|
|
568
|
+
[table]: {
|
|
569
|
+
...current,
|
|
570
|
+
columns: {
|
|
571
|
+
...current.columns,
|
|
572
|
+
[name]: column
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
});
|
|
576
|
+
}
|
|
577
|
+
/** Renames an app table column, keeping its place. */
|
|
578
|
+
function renameColumn(design, table, from, to) {
|
|
579
|
+
const current = design.appTables?.[table];
|
|
580
|
+
if (current === void 0 || from === to) return design;
|
|
581
|
+
return withAppTables(design, computedColumnRenamed({
|
|
582
|
+
...design.appTables,
|
|
583
|
+
[table]: withKeySets({
|
|
584
|
+
...current,
|
|
585
|
+
columns: Object.fromEntries(Object.entries(current.columns ?? {}).map(([name, column]) => [name === from ? to : name, column]))
|
|
586
|
+
}, (columns) => columns.map((column) => column === from ? to : column))
|
|
587
|
+
}, table, from, to));
|
|
588
|
+
}
|
|
589
|
+
/** Replaces an app table with `edit` applied to it, such as `tableWithComputed`. */
|
|
590
|
+
function editTable(design, table, edit) {
|
|
591
|
+
const current = design.appTables?.[table];
|
|
592
|
+
return current === void 0 ? design : withAppTables(design, {
|
|
593
|
+
...design.appTables,
|
|
594
|
+
[table]: edit(current)
|
|
595
|
+
});
|
|
596
|
+
}
|
|
597
|
+
function deleteColumn(design, table, name) {
|
|
598
|
+
const current = design.appTables?.[table];
|
|
599
|
+
return current === void 0 ? design : withAppTables(design, {
|
|
600
|
+
...design.appTables,
|
|
601
|
+
[table]: withKeySets({
|
|
602
|
+
...current,
|
|
603
|
+
columns: omitKey(current.columns, name)
|
|
604
|
+
}, (columns) => columns.filter((column) => column !== name))
|
|
605
|
+
});
|
|
606
|
+
}
|
|
607
|
+
/** Sets an extra column on a block table (`blocks.<module>.options.extraColumns`). */
|
|
608
|
+
function setExtraColumn(design, module, name, type) {
|
|
609
|
+
return {
|
|
610
|
+
...design,
|
|
611
|
+
extraColumns: {
|
|
612
|
+
...design.extraColumns,
|
|
613
|
+
[module]: {
|
|
614
|
+
...design.extraColumns?.[module],
|
|
615
|
+
[name]: type
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
};
|
|
619
|
+
}
|
|
620
|
+
function deleteExtraColumn(design, module, name) {
|
|
621
|
+
const columns = omitKey(design.extraColumns?.[module], name);
|
|
622
|
+
const { extraColumns: _drop, ...rest } = design;
|
|
623
|
+
const extraColumns = Object.keys(columns).length === 0 ? omitKey(design.extraColumns, module) : {
|
|
624
|
+
...design.extraColumns,
|
|
625
|
+
[module]: columns
|
|
626
|
+
};
|
|
627
|
+
return Object.keys(extraColumns).length === 0 ? rest : {
|
|
628
|
+
...rest,
|
|
629
|
+
extraColumns
|
|
630
|
+
};
|
|
631
|
+
}
|
|
632
|
+
/** Copies an app table under a free name, next to the original. */
|
|
633
|
+
function duplicateTable(design, name, taken) {
|
|
634
|
+
const table = design.appTables?.[name];
|
|
635
|
+
if (table === void 0) return {
|
|
636
|
+
design,
|
|
637
|
+
name
|
|
638
|
+
};
|
|
639
|
+
const copy = freeTableName(design, taken, `${name}_copy`);
|
|
640
|
+
const position = design.positions?.[appTableId(name)];
|
|
641
|
+
return {
|
|
642
|
+
design: addTable(design, copy, table.subject === void 0 ? table : {
|
|
643
|
+
...table,
|
|
644
|
+
subject: {
|
|
645
|
+
...table.subject,
|
|
646
|
+
type: singular(copy)
|
|
647
|
+
}
|
|
648
|
+
}, position === void 0 ? void 0 : [position[0] + 40, position[1] + 40]),
|
|
649
|
+
name: copy
|
|
650
|
+
};
|
|
651
|
+
}
|
|
652
|
+
/** Moves tables (table id to its new top-left corner). */
|
|
653
|
+
function moveTables(design, moves) {
|
|
654
|
+
return withPositions(design, {
|
|
655
|
+
...design.positions,
|
|
656
|
+
...moves
|
|
657
|
+
});
|
|
658
|
+
}
|
|
659
|
+
/**
|
|
660
|
+
* The app table column behind a foreign key from `tableId`, when the canvas
|
|
661
|
+
* added it, or `undefined` when a block or the preset owns the key.
|
|
662
|
+
*/
|
|
663
|
+
function userConnection(design, tableId, column) {
|
|
664
|
+
const name = Object.keys(design.appTables ?? {}).find((each) => appTableId(each) === tableId);
|
|
665
|
+
if (name === void 0 || column === null) return;
|
|
666
|
+
return design.appTables?.[name]?.columns?.[column]?.references === void 0 ? void 0 : {
|
|
667
|
+
table: name,
|
|
668
|
+
column
|
|
669
|
+
};
|
|
670
|
+
}
|
|
671
|
+
/** Drops every saved position, so the automatic layout places every table again. */
|
|
672
|
+
function tidy(design) {
|
|
673
|
+
return withPositions(design, {});
|
|
674
|
+
}
|
|
675
|
+
const SINGULAR_ENDINGS = [
|
|
676
|
+
[/ies$/u, "y"],
|
|
677
|
+
[/(ss|us)$/u, "$1"],
|
|
678
|
+
[/s$/u, ""]
|
|
679
|
+
];
|
|
680
|
+
/** A naive English singular for a table name: `organizations` to `organization`. */
|
|
681
|
+
function singular(name) {
|
|
682
|
+
for (const [ending, replacement] of SINGULAR_ENDINGS) if (ending.test(name)) return name.replace(ending, replacement);
|
|
683
|
+
return name;
|
|
684
|
+
}
|
|
685
|
+
const AUTH_USERS$1 = "auth.users";
|
|
686
|
+
/** The column types a foreign key can point at, from the target's primary key type. */
|
|
687
|
+
function referenceType(type) {
|
|
688
|
+
const normal = type.toLowerCase();
|
|
689
|
+
switch (normal) {
|
|
690
|
+
case "uuid":
|
|
691
|
+
case "text":
|
|
692
|
+
case "bigint":
|
|
693
|
+
case "integer": return normal;
|
|
694
|
+
case "int8":
|
|
695
|
+
case "bigserial": return "bigint";
|
|
696
|
+
case "int":
|
|
697
|
+
case "int4":
|
|
698
|
+
case "serial": return "integer";
|
|
699
|
+
default: return;
|
|
700
|
+
}
|
|
701
|
+
}
|
|
702
|
+
/**
|
|
703
|
+
* Adds a foreign key column from an app table to `target`. Only app tables
|
|
704
|
+
* get new columns. A self reference gets `parent_id`, and a second
|
|
705
|
+
* reference to the same table gets a role name (`owner_id`, `<target>_2_id`)
|
|
706
|
+
* the user can rename. A target without a single-column primary key, and
|
|
707
|
+
* the tenant table the scope column already references, are refused with a
|
|
708
|
+
* message.
|
|
709
|
+
*/
|
|
710
|
+
function connect(design, data, preset, connection) {
|
|
711
|
+
const source = data.tables.find((table) => table.id === connection.source);
|
|
712
|
+
if (source === void 0 || !isAppTable(source)) return {
|
|
713
|
+
ok: false,
|
|
714
|
+
error: "Block tables only accept connections. Drag from an app table."
|
|
715
|
+
};
|
|
716
|
+
if (design.appTables?.[source.name] === void 0) return {
|
|
717
|
+
ok: false,
|
|
718
|
+
error: `${source.name} is not in the design.`
|
|
719
|
+
};
|
|
720
|
+
if (source.tenantColumn !== null && connection.target === data.tenantTable) return {
|
|
721
|
+
ok: false,
|
|
722
|
+
error: `${source.name} already references ${connection.target} through ${source.tenantColumn}.`
|
|
723
|
+
};
|
|
724
|
+
return referenceFrom(design, data, preset, source.name, connection.target);
|
|
725
|
+
}
|
|
726
|
+
/** Second references to `auth.users`, in the order they are offered. */
|
|
727
|
+
const USER_ROLES = [
|
|
728
|
+
"owner_id",
|
|
729
|
+
"assignee_id",
|
|
730
|
+
"reviewer_id",
|
|
731
|
+
"approver_id"
|
|
732
|
+
];
|
|
733
|
+
/** The first column name for a reference that the table can still take. */
|
|
734
|
+
function referenceColumn(table, base, roles, preset) {
|
|
735
|
+
const stem = base.replace(/_id$/u, "");
|
|
736
|
+
return [
|
|
737
|
+
base,
|
|
738
|
+
...roles,
|
|
739
|
+
...Array.from({ length: 8 }, (_, index) => `${stem}_${index + 2}_id`)
|
|
740
|
+
].find((candidate) => columnError(table, candidate, preset) === void 0);
|
|
741
|
+
}
|
|
742
|
+
/**
|
|
743
|
+
* Adds a key to `targetId` on the app table `name` in the design, which can
|
|
744
|
+
* be a table the schema doesn't have yet: `<target>_id`, `parent_id` for a
|
|
745
|
+
* self reference, or a free role name when that column is taken.
|
|
746
|
+
*/
|
|
747
|
+
function referenceFrom(design, data, preset, name, targetId) {
|
|
748
|
+
const table = design.appTables?.[name];
|
|
749
|
+
if (table === void 0) return {
|
|
750
|
+
ok: false,
|
|
751
|
+
error: `${name} is not in the design.`
|
|
752
|
+
};
|
|
753
|
+
const target = targetId === AUTH_USERS$1 ? void 0 : data.tables.find((each) => each.id === targetId);
|
|
754
|
+
if (targetId !== AUTH_USERS$1 && target === void 0) return {
|
|
755
|
+
ok: false,
|
|
756
|
+
error: "That table is not in the schema."
|
|
757
|
+
};
|
|
758
|
+
const keyType = target === void 0 ? "uuid" : target.primaryKey.length === 1 ? target.columns.find((column) => column.name === target.primaryKey[0])?.type : void 0;
|
|
759
|
+
const type = keyType === void 0 ? void 0 : referenceType(keyType);
|
|
760
|
+
if (type === void 0) return {
|
|
761
|
+
ok: false,
|
|
762
|
+
error: `${targetId} has no single uuid, text or integer key to reference.`
|
|
763
|
+
};
|
|
764
|
+
const references = target === void 0 ? { table: AUTH_USERS$1 } : isAppTable(target) ? { table: target.name } : data.blockTables[target.id];
|
|
765
|
+
if (references === void 0) return {
|
|
766
|
+
ok: false,
|
|
767
|
+
error: `${targetId} can't be referenced from an app table.`
|
|
768
|
+
};
|
|
769
|
+
const self = targetId === appTableId(name);
|
|
770
|
+
const user = target === void 0;
|
|
771
|
+
const column = referenceColumn(table, self ? "parent_id" : `${singular(user ? "user" : target.name)}_id`, user ? USER_ROLES : [], preset);
|
|
772
|
+
if (column === void 0) return {
|
|
773
|
+
ok: false,
|
|
774
|
+
error: `${name} already has every column name a reference to ${targetId} gets. Rename one first.`
|
|
775
|
+
};
|
|
776
|
+
return {
|
|
777
|
+
ok: true,
|
|
778
|
+
column,
|
|
779
|
+
design: setColumn(design, name, column, {
|
|
780
|
+
type,
|
|
781
|
+
nullable: true,
|
|
782
|
+
references: {
|
|
783
|
+
...references,
|
|
784
|
+
onDelete: self || user ? "set null" : "cascade"
|
|
785
|
+
}
|
|
786
|
+
})
|
|
787
|
+
};
|
|
788
|
+
}
|
|
789
|
+
/**
|
|
790
|
+
* What would stop `sql sync` from writing the design: a table name a block
|
|
791
|
+
* already uses, a reference to a table the preset no longer installs, a
|
|
792
|
+
* set-null delete on a required column, a composite key on a column the
|
|
793
|
+
* table doesn't have, and extra columns for a block that is gone or no
|
|
794
|
+
* longer takes them.
|
|
795
|
+
*/
|
|
796
|
+
function designIssues(design, data, preset) {
|
|
797
|
+
const issues = [];
|
|
798
|
+
const names = new Set(data.tables.filter((table) => !isAppTable(table)).map((table) => table.name));
|
|
799
|
+
const logical = new Set(Object.values(data.blockTables).map((each) => `${each.block}.${each.table}`));
|
|
800
|
+
const modules = new Set(data.tables.filter((table) => data.extraColumns.includes(table.id)).map((table) => table.module));
|
|
801
|
+
const subjectTypes = /* @__PURE__ */ new Map();
|
|
802
|
+
for (const [name, table] of Object.entries(design.appTables ?? {})) {
|
|
803
|
+
const type = table.subject?.type;
|
|
804
|
+
if (type !== void 0 && !subjectTypes.has(type)) subjectTypes.set(type, name);
|
|
805
|
+
}
|
|
806
|
+
for (const [name, table] of Object.entries(design.appTables ?? {})) {
|
|
807
|
+
const invalid = identifierError(name);
|
|
808
|
+
if (invalid !== void 0) issues.push({
|
|
809
|
+
table: name,
|
|
810
|
+
message: `The name ${name} is invalid. ${invalid}`
|
|
811
|
+
});
|
|
812
|
+
if (names.has(name)) issues.push({
|
|
813
|
+
table: name,
|
|
814
|
+
message: `A block already creates a ${name} table. Rename this one.`
|
|
815
|
+
});
|
|
816
|
+
const long = appNameLengthError(name, table);
|
|
817
|
+
if (long !== void 0) issues.push({
|
|
818
|
+
table: name,
|
|
819
|
+
message: `${long}.`
|
|
820
|
+
});
|
|
821
|
+
const type = table.subject?.type;
|
|
822
|
+
if (type !== void 0 && subjectTypes.get(type) !== name) issues.push({
|
|
823
|
+
table: name,
|
|
824
|
+
message: `${subjectTypes.get(type)} already has the subject type ${type}. Choose another.`
|
|
825
|
+
});
|
|
826
|
+
for (const [column, config] of Object.entries(table.columns ?? {})) {
|
|
827
|
+
const fallback = config.default === void 0 ? void 0 : defaultError(config, config.default);
|
|
828
|
+
if (fallback !== void 0) issues.push({
|
|
829
|
+
table: name,
|
|
830
|
+
message: `${name}.${column}: ${fallback}`
|
|
831
|
+
});
|
|
832
|
+
if (lockedWithoutDefault(config)) issues.push({
|
|
833
|
+
table: name,
|
|
834
|
+
message: `${name}.${column} is required, and signed-in users can't write it, so give it a default.`
|
|
835
|
+
});
|
|
836
|
+
}
|
|
837
|
+
for (const column of subjectColumns(table.subject)) if (Object.hasOwn(table.columns ?? {}, column.name)) issues.push({
|
|
838
|
+
table: name,
|
|
839
|
+
message: `${name}.${column.name} clashes with the column its record features add. Rename it.`
|
|
840
|
+
});
|
|
841
|
+
const known = /* @__PURE__ */ new Set([
|
|
842
|
+
"id",
|
|
843
|
+
...Object.keys(table.columns ?? {}),
|
|
844
|
+
...table.timestamps === false ? [] : ["created_at", "updated_at"]
|
|
845
|
+
]);
|
|
846
|
+
const scope = scopeColumnOf(table, preset);
|
|
847
|
+
if (scope !== null) known.add(scope.name);
|
|
848
|
+
for (const [key, sets] of [["unique key", table.unique], ["index", table.indexes]]) for (const columns of sets ?? []) {
|
|
849
|
+
const gone = columns.filter((column) => !known.has(column));
|
|
850
|
+
if (gone.length > 0) issues.push({
|
|
851
|
+
table: name,
|
|
852
|
+
message: `The ${key} on ${columns.join(", ")} names ${gone.join(", ")}, which ${name} doesn't have.`
|
|
853
|
+
});
|
|
854
|
+
}
|
|
855
|
+
for (const [column, config] of Object.entries(table.columns ?? {})) {
|
|
856
|
+
const reference = config.references;
|
|
857
|
+
if (reference === void 0) continue;
|
|
858
|
+
if (reference.block === void 0 ? reference.table !== AUTH_USERS$1 && design.appTables?.[reference.table] === void 0 : !logical.has(`${reference.block}.${reference.table}`)) issues.push({
|
|
859
|
+
table: name,
|
|
860
|
+
message: `${name}.${column} references ${reference.block === void 0 ? reference.table : `${reference.block}.${reference.table}`}, which the preset does not install.`
|
|
861
|
+
});
|
|
862
|
+
if (reference.onDelete === "set null" && config.nullable === false) issues.push({
|
|
863
|
+
table: name,
|
|
864
|
+
message: `${name}.${column} is required, so deleting the row it references can't set it to null.`
|
|
865
|
+
});
|
|
866
|
+
}
|
|
867
|
+
}
|
|
868
|
+
for (const block of Object.keys(design.extraColumns ?? {})) if (!modules.has(block)) issues.push({
|
|
869
|
+
table: block,
|
|
870
|
+
message: `The extra columns for ${block} have no table: the block is not installed or takes no extra columns.`
|
|
871
|
+
});
|
|
872
|
+
return issues;
|
|
873
|
+
}
|
|
874
|
+
function appColumn(name, column) {
|
|
875
|
+
const label = columnLabel(column);
|
|
876
|
+
const schemaColumn = {
|
|
877
|
+
name,
|
|
878
|
+
type: column.type,
|
|
879
|
+
nullable: column.identity === true ? false : column.nullable ?? true,
|
|
880
|
+
default: column.identity === true ? "identity" : column.default ?? null,
|
|
881
|
+
unique: column.unique ?? false
|
|
882
|
+
};
|
|
883
|
+
return label === void 0 ? schemaColumn : {
|
|
884
|
+
...schemaColumn,
|
|
885
|
+
label
|
|
886
|
+
};
|
|
887
|
+
}
|
|
888
|
+
const TIMESTAMP = {
|
|
889
|
+
type: "timestamptz",
|
|
890
|
+
nullable: false,
|
|
891
|
+
default: "now()",
|
|
892
|
+
unique: false
|
|
893
|
+
};
|
|
894
|
+
/** The id of the table a reference points at, or `undefined` when it is not in the schema. */
|
|
895
|
+
function referencedId(reference, data) {
|
|
896
|
+
if (reference.block === void 0) return reference.table === AUTH_USERS$1 ? AUTH_USERS$1 : appTableId(reference.table);
|
|
897
|
+
return Object.entries(data.blockTables).find(([, each]) => each.block === reference.block && each.table === reference.table)?.[0];
|
|
898
|
+
}
|
|
899
|
+
function foreignKey(column, to, onDelete = "no action") {
|
|
900
|
+
const [schema = "", target = ""] = to.split(".");
|
|
901
|
+
return {
|
|
902
|
+
columns: [column],
|
|
903
|
+
target: {
|
|
904
|
+
schema,
|
|
905
|
+
table: target,
|
|
906
|
+
columns: []
|
|
907
|
+
},
|
|
908
|
+
onDelete
|
|
909
|
+
};
|
|
910
|
+
}
|
|
911
|
+
/** An app table as the diagram reads it. */
|
|
912
|
+
function appSchemaTable(name, table, data, preset) {
|
|
913
|
+
const scope = scopeColumnOf(table, preset);
|
|
914
|
+
const scopeTo = scope === null ? void 0 : scope.name === "user_id" ? AUTH_USERS$1 : data.tenantTable ?? void 0;
|
|
915
|
+
const columns = [
|
|
916
|
+
table.id === "bigint" ? {
|
|
917
|
+
name: "id",
|
|
918
|
+
type: "bigint",
|
|
919
|
+
nullable: false,
|
|
920
|
+
default: "identity",
|
|
921
|
+
unique: false
|
|
922
|
+
} : {
|
|
923
|
+
name: "id",
|
|
924
|
+
type: "uuid",
|
|
925
|
+
nullable: false,
|
|
926
|
+
default: "gen_random_uuid()",
|
|
927
|
+
unique: false
|
|
928
|
+
},
|
|
929
|
+
...scope === null ? [] : [scope],
|
|
930
|
+
...Object.entries(table.columns ?? {}).map(([key, column]) => appColumn(key, column)),
|
|
931
|
+
...subjectColumns(table.subject),
|
|
932
|
+
...table.timestamps === false ? [] : [{
|
|
933
|
+
name: "created_at",
|
|
934
|
+
...TIMESTAMP
|
|
935
|
+
}, {
|
|
936
|
+
name: "updated_at",
|
|
937
|
+
...TIMESTAMP
|
|
938
|
+
}]
|
|
939
|
+
];
|
|
940
|
+
const scopeKeys = scope === null || scopeTo === void 0 ? [] : [foreignKey(scope.name, scopeTo, "cascade")];
|
|
941
|
+
const columnKeys = Object.entries(table.columns ?? {}).flatMap(([key, column]) => {
|
|
942
|
+
const to = column.references === void 0 ? void 0 : referencedId(column.references, data);
|
|
943
|
+
return to === void 0 ? [] : [foreignKey(key, to, column.references?.onDelete)];
|
|
944
|
+
});
|
|
945
|
+
const schemaTable = {
|
|
946
|
+
id: appTableId(name),
|
|
947
|
+
schema: APP_SCHEMA,
|
|
948
|
+
name,
|
|
949
|
+
module: APP_MODULE,
|
|
950
|
+
primaryKey: ["id"],
|
|
951
|
+
foreignKeys: [...scopeKeys, ...columnKeys],
|
|
952
|
+
tenantColumn: scope !== null && scope.name !== "user_id" ? scope.name : null,
|
|
953
|
+
columns
|
|
954
|
+
};
|
|
955
|
+
const computed = computedRows(table);
|
|
956
|
+
return computed.length === 0 ? schemaTable : {
|
|
957
|
+
...schemaTable,
|
|
958
|
+
computed
|
|
959
|
+
};
|
|
960
|
+
}
|
|
961
|
+
/** The extra column names a block table got from the design. */
|
|
962
|
+
function extraColumnsOf(design, table, data) {
|
|
963
|
+
return data.extraColumns.includes(table.id) ? design.extraColumns?.[table.module] ?? {} : {};
|
|
964
|
+
}
|
|
965
|
+
/**
|
|
966
|
+
* The schema with the design applied: app tables added, extra columns
|
|
967
|
+
* appended to the block tables that accept them.
|
|
968
|
+
*/
|
|
969
|
+
function withDesign(data, design, preset) {
|
|
970
|
+
const tables = data.tables.map((table) => {
|
|
971
|
+
const extra = extraColumnsOf(design, table, data);
|
|
972
|
+
const names = new Set(table.columns.map((column) => column.name));
|
|
973
|
+
const added = Object.entries(extra).filter(([name]) => !names.has(name)).map(([name, type]) => ({
|
|
974
|
+
name,
|
|
975
|
+
type,
|
|
976
|
+
nullable: !/\bnot\s+null\b/iu.test(type),
|
|
977
|
+
default: null,
|
|
978
|
+
unique: false
|
|
979
|
+
}));
|
|
980
|
+
return added.length === 0 ? table : {
|
|
981
|
+
...table,
|
|
982
|
+
columns: [...table.columns, ...added]
|
|
983
|
+
};
|
|
984
|
+
});
|
|
985
|
+
const appTables = Object.entries(design.appTables ?? {}).map(([name, table]) => appSchemaTable(name, table, data, preset));
|
|
986
|
+
return {
|
|
987
|
+
...data,
|
|
988
|
+
tables: [...tables, ...appTables],
|
|
989
|
+
manifests: {
|
|
990
|
+
...data.manifests,
|
|
991
|
+
...Object.fromEntries(appTables.map((table) => [table.id, APP_MODULE]))
|
|
992
|
+
}
|
|
993
|
+
};
|
|
994
|
+
}
|
|
995
|
+
//#endregion
|
|
996
|
+
//#region src/create/column-kinds.ts
|
|
997
|
+
/** The groups of the column type picker, in the order it shows them. */
|
|
998
|
+
const KIND_GROUPS = [
|
|
999
|
+
"Text",
|
|
1000
|
+
"Number",
|
|
1001
|
+
"Date and time",
|
|
1002
|
+
"Choice",
|
|
1003
|
+
"Relation",
|
|
1004
|
+
"Other"
|
|
1005
|
+
];
|
|
1006
|
+
const USERS$1 = "auth.users";
|
|
1007
|
+
/** The first options a new select gets, for the user to rename. */
|
|
1008
|
+
const STARTER_OPTIONS = ["Option A", "Option B"];
|
|
1009
|
+
const COLUMN_KINDS = [
|
|
1010
|
+
{
|
|
1011
|
+
id: "text",
|
|
1012
|
+
label: "Text",
|
|
1013
|
+
group: "Text",
|
|
1014
|
+
short: "text",
|
|
1015
|
+
column: { type: "text" }
|
|
1016
|
+
},
|
|
1017
|
+
{
|
|
1018
|
+
id: "long_text",
|
|
1019
|
+
label: "Long text",
|
|
1020
|
+
group: "Text",
|
|
1021
|
+
short: "long text",
|
|
1022
|
+
column: {
|
|
1023
|
+
type: "text",
|
|
1024
|
+
format: "long_text"
|
|
1025
|
+
}
|
|
1026
|
+
},
|
|
1027
|
+
{
|
|
1028
|
+
id: "email",
|
|
1029
|
+
label: "Email",
|
|
1030
|
+
group: "Text",
|
|
1031
|
+
short: "email",
|
|
1032
|
+
column: {
|
|
1033
|
+
type: "text",
|
|
1034
|
+
format: "email"
|
|
1035
|
+
}
|
|
1036
|
+
},
|
|
1037
|
+
{
|
|
1038
|
+
id: "url",
|
|
1039
|
+
label: "URL",
|
|
1040
|
+
group: "Text",
|
|
1041
|
+
short: "url",
|
|
1042
|
+
column: {
|
|
1043
|
+
type: "text",
|
|
1044
|
+
format: "url"
|
|
1045
|
+
}
|
|
1046
|
+
},
|
|
1047
|
+
{
|
|
1048
|
+
id: "phone",
|
|
1049
|
+
label: "Phone",
|
|
1050
|
+
group: "Text",
|
|
1051
|
+
short: "phone",
|
|
1052
|
+
column: {
|
|
1053
|
+
type: "text",
|
|
1054
|
+
format: "phone"
|
|
1055
|
+
}
|
|
1056
|
+
},
|
|
1057
|
+
{
|
|
1058
|
+
id: "color",
|
|
1059
|
+
label: "Color",
|
|
1060
|
+
group: "Text",
|
|
1061
|
+
short: "color",
|
|
1062
|
+
column: {
|
|
1063
|
+
type: "text",
|
|
1064
|
+
format: "color"
|
|
1065
|
+
}
|
|
1066
|
+
},
|
|
1067
|
+
{
|
|
1068
|
+
id: "integer",
|
|
1069
|
+
label: "Whole number",
|
|
1070
|
+
group: "Number",
|
|
1071
|
+
short: "integer",
|
|
1072
|
+
column: { type: "integer" }
|
|
1073
|
+
},
|
|
1074
|
+
{
|
|
1075
|
+
id: "bigint",
|
|
1076
|
+
label: "Large whole number",
|
|
1077
|
+
group: "Number",
|
|
1078
|
+
short: "bigint",
|
|
1079
|
+
column: { type: "bigint" }
|
|
1080
|
+
},
|
|
1081
|
+
{
|
|
1082
|
+
id: "numeric",
|
|
1083
|
+
label: "Decimal",
|
|
1084
|
+
group: "Number",
|
|
1085
|
+
short: "numeric",
|
|
1086
|
+
column: { type: "numeric" }
|
|
1087
|
+
},
|
|
1088
|
+
{
|
|
1089
|
+
id: "rating",
|
|
1090
|
+
label: "Rating",
|
|
1091
|
+
group: "Number",
|
|
1092
|
+
short: "rating",
|
|
1093
|
+
column: {
|
|
1094
|
+
type: "integer",
|
|
1095
|
+
format: "rating"
|
|
1096
|
+
}
|
|
1097
|
+
},
|
|
1098
|
+
{
|
|
1099
|
+
id: "percent",
|
|
1100
|
+
label: "Percent",
|
|
1101
|
+
group: "Number",
|
|
1102
|
+
short: "percent",
|
|
1103
|
+
column: {
|
|
1104
|
+
type: "numeric",
|
|
1105
|
+
format: "percent"
|
|
1106
|
+
}
|
|
1107
|
+
},
|
|
1108
|
+
{
|
|
1109
|
+
id: "currency",
|
|
1110
|
+
label: "Currency",
|
|
1111
|
+
group: "Number",
|
|
1112
|
+
short: "money",
|
|
1113
|
+
column: {
|
|
1114
|
+
type: "bigint",
|
|
1115
|
+
format: "currency"
|
|
1116
|
+
}
|
|
1117
|
+
},
|
|
1118
|
+
{
|
|
1119
|
+
id: "autonumber",
|
|
1120
|
+
label: "Autonumber",
|
|
1121
|
+
group: "Number",
|
|
1122
|
+
short: "autonumber",
|
|
1123
|
+
column: {
|
|
1124
|
+
type: "bigint",
|
|
1125
|
+
identity: true
|
|
1126
|
+
}
|
|
1127
|
+
},
|
|
1128
|
+
{
|
|
1129
|
+
id: "date",
|
|
1130
|
+
label: "Date",
|
|
1131
|
+
group: "Date and time",
|
|
1132
|
+
short: "date",
|
|
1133
|
+
column: { type: "date" }
|
|
1134
|
+
},
|
|
1135
|
+
{
|
|
1136
|
+
id: "timestamptz",
|
|
1137
|
+
label: "Date and time",
|
|
1138
|
+
group: "Date and time",
|
|
1139
|
+
short: "timestamptz",
|
|
1140
|
+
column: { type: "timestamptz" }
|
|
1141
|
+
},
|
|
1142
|
+
{
|
|
1143
|
+
id: "boolean",
|
|
1144
|
+
label: "Yes or no",
|
|
1145
|
+
group: "Choice",
|
|
1146
|
+
short: "boolean",
|
|
1147
|
+
column: { type: "boolean" }
|
|
1148
|
+
},
|
|
1149
|
+
{
|
|
1150
|
+
id: "single_select",
|
|
1151
|
+
label: "Single select",
|
|
1152
|
+
group: "Choice",
|
|
1153
|
+
short: "select",
|
|
1154
|
+
column: {
|
|
1155
|
+
type: "text",
|
|
1156
|
+
options: STARTER_OPTIONS
|
|
1157
|
+
}
|
|
1158
|
+
},
|
|
1159
|
+
{
|
|
1160
|
+
id: "multi_select",
|
|
1161
|
+
label: "Multi-select",
|
|
1162
|
+
group: "Choice",
|
|
1163
|
+
short: "multi-select",
|
|
1164
|
+
column: {
|
|
1165
|
+
type: "text[]",
|
|
1166
|
+
options: STARTER_OPTIONS
|
|
1167
|
+
}
|
|
1168
|
+
},
|
|
1169
|
+
{
|
|
1170
|
+
id: "person",
|
|
1171
|
+
label: "Person",
|
|
1172
|
+
group: "Relation",
|
|
1173
|
+
short: "person",
|
|
1174
|
+
column: {
|
|
1175
|
+
type: "uuid",
|
|
1176
|
+
nullable: true,
|
|
1177
|
+
references: {
|
|
1178
|
+
table: USERS$1,
|
|
1179
|
+
onDelete: "set null"
|
|
1180
|
+
}
|
|
1181
|
+
}
|
|
1182
|
+
},
|
|
1183
|
+
{
|
|
1184
|
+
id: "reference",
|
|
1185
|
+
label: "Link to a table",
|
|
1186
|
+
group: "Relation",
|
|
1187
|
+
short: "link",
|
|
1188
|
+
column: { type: "uuid" },
|
|
1189
|
+
drawn: true
|
|
1190
|
+
},
|
|
1191
|
+
{
|
|
1192
|
+
id: "uuid",
|
|
1193
|
+
label: "UUID",
|
|
1194
|
+
group: "Other",
|
|
1195
|
+
short: "uuid",
|
|
1196
|
+
column: { type: "uuid" }
|
|
1197
|
+
},
|
|
1198
|
+
{
|
|
1199
|
+
id: "jsonb",
|
|
1200
|
+
label: "JSON",
|
|
1201
|
+
group: "Other",
|
|
1202
|
+
short: "jsonb",
|
|
1203
|
+
column: { type: "jsonb" }
|
|
1204
|
+
},
|
|
1205
|
+
{
|
|
1206
|
+
id: "text_list",
|
|
1207
|
+
label: "List of text",
|
|
1208
|
+
group: "Other",
|
|
1209
|
+
short: "text[]",
|
|
1210
|
+
column: { type: "text[]" }
|
|
1211
|
+
}
|
|
1212
|
+
];
|
|
1213
|
+
const BY_ID = new Map(COLUMN_KINDS.map((kind) => [kind.id, kind]));
|
|
1214
|
+
const BY_FORMAT = new Map(COLUMN_KINDS.filter((kind) => kind.column.format !== void 0).map((kind) => [kind.column.format, kind]));
|
|
1215
|
+
const PLAIN = {
|
|
1216
|
+
text: "text",
|
|
1217
|
+
uuid: "uuid",
|
|
1218
|
+
integer: "integer",
|
|
1219
|
+
bigint: "bigint",
|
|
1220
|
+
numeric: "numeric",
|
|
1221
|
+
boolean: "boolean",
|
|
1222
|
+
timestamptz: "timestamptz",
|
|
1223
|
+
date: "date",
|
|
1224
|
+
jsonb: "jsonb",
|
|
1225
|
+
"text[]": "text_list"
|
|
1226
|
+
};
|
|
1227
|
+
function kindById(id) {
|
|
1228
|
+
return BY_ID.get(id);
|
|
1229
|
+
}
|
|
1230
|
+
/** The kind a column's identity, reference or options make it, before its format and type. */
|
|
1231
|
+
function structuralKind(column) {
|
|
1232
|
+
if (column.identity === true) return "autonumber";
|
|
1233
|
+
if (column.references !== void 0) return column.references.block === void 0 && column.references.table === USERS$1 ? "person" : "reference";
|
|
1234
|
+
if (column.options === void 0) return;
|
|
1235
|
+
return column.type === "text[]" ? "multi_select" : "single_select";
|
|
1236
|
+
}
|
|
1237
|
+
/** The picker choice a column reads as. */
|
|
1238
|
+
function kindOf(column) {
|
|
1239
|
+
const id = structuralKind(column);
|
|
1240
|
+
return (id === void 0 ? void 0 : BY_ID.get(id)) ?? (column.format === void 0 ? void 0 : BY_FORMAT.get(column.format)) ?? BY_ID.get(PLAIN[column.type]);
|
|
1241
|
+
}
|
|
1242
|
+
/**
|
|
1243
|
+
* `column` as `kind`: the kind's keys, with the column's name-independent
|
|
1244
|
+
* settings (required, unique, comment, a default and bounds that still fit)
|
|
1245
|
+
* kept, and a select's options kept when it turns into the other select.
|
|
1246
|
+
*/
|
|
1247
|
+
function withKind(column, kind) {
|
|
1248
|
+
const { format: _format, options, identity: _identity, references: _references, min, max, ...rest } = column;
|
|
1249
|
+
const kept = kind.column.options === void 0 || options === void 0 ? kind.column : {
|
|
1250
|
+
...kind.column,
|
|
1251
|
+
options
|
|
1252
|
+
};
|
|
1253
|
+
return fitted(withBounds({
|
|
1254
|
+
...rest,
|
|
1255
|
+
...kept
|
|
1256
|
+
}, column.type === kind.column.type ? {
|
|
1257
|
+
min,
|
|
1258
|
+
max
|
|
1259
|
+
} : {}));
|
|
1260
|
+
}
|
|
1261
|
+
/** The money columns of `name`: `<stem>_minor` and `<stem>_currency`. */
|
|
1262
|
+
function moneyColumns(name) {
|
|
1263
|
+
const stem = name.replace(/_minor$/u, "");
|
|
1264
|
+
return {
|
|
1265
|
+
minor: `${stem}_minor`,
|
|
1266
|
+
currency: `${stem}_currency`
|
|
1267
|
+
};
|
|
1268
|
+
}
|
|
1269
|
+
/**
|
|
1270
|
+
* Sets an app table column to `kind`. Currency keeps money as two columns:
|
|
1271
|
+
* the column becomes `<name>_minor` (unless the name is taken) and a
|
|
1272
|
+
* `<name>_currency` text column of 3 characters joins it. Returns the
|
|
1273
|
+
* column's name after the change.
|
|
1274
|
+
*/
|
|
1275
|
+
function setColumnKind(design, table, name, kind) {
|
|
1276
|
+
const columns = design.appTables?.[table]?.columns ?? {};
|
|
1277
|
+
const column = columns[name];
|
|
1278
|
+
if (column === void 0) return {
|
|
1279
|
+
design,
|
|
1280
|
+
name
|
|
1281
|
+
};
|
|
1282
|
+
const next = withKind(column, kind);
|
|
1283
|
+
if (kind.id !== "currency") return {
|
|
1284
|
+
design: setColumn(design, table, name, next),
|
|
1285
|
+
name
|
|
1286
|
+
};
|
|
1287
|
+
const { minor, currency } = moneyColumns(name);
|
|
1288
|
+
const renamed = minor === name || columns[minor] === void 0 ? minor : name;
|
|
1289
|
+
const moved = setColumn(renameColumn(design, table, name, renamed), table, renamed, next);
|
|
1290
|
+
if (columns[currency] !== void 0) return {
|
|
1291
|
+
design: moved,
|
|
1292
|
+
name: renamed
|
|
1293
|
+
};
|
|
1294
|
+
return {
|
|
1295
|
+
design: setColumn(moved, table, currency, next.nullable === false ? {
|
|
1296
|
+
type: "text",
|
|
1297
|
+
nullable: false,
|
|
1298
|
+
min: 3,
|
|
1299
|
+
max: 3
|
|
1300
|
+
} : {
|
|
1301
|
+
type: "text",
|
|
1302
|
+
min: 3,
|
|
1303
|
+
max: 3
|
|
1304
|
+
}),
|
|
1305
|
+
name: renamed
|
|
1306
|
+
};
|
|
1307
|
+
}
|
|
1308
|
+
//#endregion
|
|
1309
|
+
//#region src/create/deploy.ts
|
|
1310
|
+
/** The name the deploy gives its migration in `supabase_migrations`. */
|
|
1311
|
+
const MIGRATION_NAME = "better_supabase_blocks";
|
|
1312
|
+
/**
|
|
1313
|
+
* Why this preset can't be deployed, or `undefined` when it can. With
|
|
1314
|
+
* `access: "provider"` the preview renders a stand-in provider whose
|
|
1315
|
+
* functions no real project has.
|
|
1316
|
+
*/
|
|
1317
|
+
function deployBlocker(preset) {
|
|
1318
|
+
return preset.access === "provider" ? "Bring your own authorization provider: its SQL comes from the provider, so deploy it with the CLI." : void 0;
|
|
1319
|
+
}
|
|
1320
|
+
/**
|
|
1321
|
+
* The SQL of one migration for the rendered files: every schema file, then
|
|
1322
|
+
* every data file, each in render order, which is the order `sql sync` and
|
|
1323
|
+
* `sql data` apply them. pgTAP tests stay out.
|
|
1324
|
+
*/
|
|
1325
|
+
function deployQuery(files) {
|
|
1326
|
+
const schema = files.filter((file) => file.path.includes("/schemas/"));
|
|
1327
|
+
const data = files.filter((file) => file.path.includes("/better-supabase-data/"));
|
|
1328
|
+
return [...schema, ...data].map((file) => `-- ${file.path}\n${file.contents.trim()}\n`).join("\n");
|
|
1329
|
+
}
|
|
1330
|
+
/** A database password for a new project: 32 base64url characters. */
|
|
1331
|
+
function generatePassword() {
|
|
1332
|
+
const bytes = crypto.getRandomValues(/* @__PURE__ */ new Uint8Array(24));
|
|
1333
|
+
let binary = "";
|
|
1334
|
+
for (const byte of bytes) binary += String.fromCodePoint(byte);
|
|
1335
|
+
return btoa(binary).replaceAll("+", "-").replaceAll("/", "_").replace(/=+$/u, "");
|
|
1336
|
+
}
|
|
1337
|
+
/** The project name the dialog suggests: the preset's name, or `my-app`. */
|
|
1338
|
+
function suggestedProjectName(named) {
|
|
1339
|
+
return named === void 0 ? "my-app" : `my-${named}-app`;
|
|
1340
|
+
}
|
|
1341
|
+
const DASHBOARD = "https://supabase.com/dashboard";
|
|
1342
|
+
function dashboardUrl(ref, page = "") {
|
|
1343
|
+
return `${DASHBOARD}/project/${encodeURIComponent(ref)}${page}`;
|
|
1344
|
+
}
|
|
1345
|
+
//#endregion
|
|
1346
|
+
//#region src/create/design-history.ts
|
|
1347
|
+
/** How many steps Undo can go back. */
|
|
1348
|
+
const HISTORY_LIMIT = 50;
|
|
1349
|
+
function initialHistory(value) {
|
|
1350
|
+
return {
|
|
1351
|
+
past: [],
|
|
1352
|
+
present: value,
|
|
1353
|
+
future: [],
|
|
1354
|
+
dragStart: null
|
|
1355
|
+
};
|
|
1356
|
+
}
|
|
1357
|
+
function record(history, previous, next) {
|
|
1358
|
+
return {
|
|
1359
|
+
past: [...history.past, previous].slice(-50),
|
|
1360
|
+
present: next,
|
|
1361
|
+
future: [],
|
|
1362
|
+
dragStart: null
|
|
1363
|
+
};
|
|
1364
|
+
}
|
|
1365
|
+
/**
|
|
1366
|
+
* An undo history. `drag` updates the value without a step while the
|
|
1367
|
+
* pointer moves; `commitDrag` records the whole drag as one step. `amend`
|
|
1368
|
+
* replaces the value in the current step, so a follow-up such as placing a
|
|
1369
|
+
* dropped block stays part of the step that added it. `reset` replaces the
|
|
1370
|
+
* value and clears the history, as loading a link does.
|
|
1371
|
+
*/
|
|
1372
|
+
function undoHistory(current, action) {
|
|
1373
|
+
switch (action.type) {
|
|
1374
|
+
case "apply": return action.value === current.present ? current : record(current, current.dragStart ?? current.present, action.value);
|
|
1375
|
+
case "drag": return {
|
|
1376
|
+
...current,
|
|
1377
|
+
present: action.value,
|
|
1378
|
+
dragStart: current.dragStart ?? current.present
|
|
1379
|
+
};
|
|
1380
|
+
case "commitDrag": return current.dragStart === null ? current : record(current, current.dragStart, current.present);
|
|
1381
|
+
case "amend": return {
|
|
1382
|
+
...current,
|
|
1383
|
+
present: action.value
|
|
1384
|
+
};
|
|
1385
|
+
case "undo": {
|
|
1386
|
+
const previous = current.past.at(-1);
|
|
1387
|
+
return previous === void 0 ? current : {
|
|
1388
|
+
past: current.past.slice(0, -1),
|
|
1389
|
+
present: previous,
|
|
1390
|
+
future: [current.present, ...current.future],
|
|
1391
|
+
dragStart: null
|
|
1392
|
+
};
|
|
1393
|
+
}
|
|
1394
|
+
case "redo": {
|
|
1395
|
+
const [next, ...future] = current.future;
|
|
1396
|
+
return next === void 0 ? current : {
|
|
1397
|
+
past: [...current.past, current.present].slice(-50),
|
|
1398
|
+
present: next,
|
|
1399
|
+
future,
|
|
1400
|
+
dragStart: null
|
|
1401
|
+
};
|
|
1402
|
+
}
|
|
1403
|
+
case "reset": return initialHistory(action.value);
|
|
1404
|
+
default: return action;
|
|
1405
|
+
}
|
|
1406
|
+
}
|
|
1407
|
+
//#endregion
|
|
1408
|
+
//#region src/create/preview-provider.ts
|
|
1409
|
+
/**
|
|
1410
|
+
* A stand-in for the app's authorization provider, so `/create` can render
|
|
1411
|
+
* the SQL and the diagram for `access: "provider"`. Its templates call
|
|
1412
|
+
* functions in a `provider` schema that no real project has: the preview
|
|
1413
|
+
* says so next to the output.
|
|
1414
|
+
*/
|
|
1415
|
+
function previewAccessProvider(preset) {
|
|
1416
|
+
return {
|
|
1417
|
+
name: "your authorization provider",
|
|
1418
|
+
scope: preset.tenantName,
|
|
1419
|
+
idType: preset.idType,
|
|
1420
|
+
functions: {
|
|
1421
|
+
idsWith: "provider.ids_with('{scope}', {permission})",
|
|
1422
|
+
idsWithFor: "provider.ids_with_for({user}, '{scope}', {permission})",
|
|
1423
|
+
isPlatform: "provider.is_platform({permission})",
|
|
1424
|
+
isPlatformFor: "provider.is_platform_for({user}, {permission})",
|
|
1425
|
+
memberIds: "provider.member_ids('{scope}')",
|
|
1426
|
+
memberIdsFor: "provider.member_ids_for({user}, '{scope}')"
|
|
1427
|
+
}
|
|
1428
|
+
};
|
|
1429
|
+
}
|
|
1430
|
+
/**
|
|
1431
|
+
* The files `sql sync` writes for a config with only this preset and its
|
|
1432
|
+
* `/create` design (app tables and extra columns). With
|
|
1433
|
+
* `access: "provider"` the access functions come from
|
|
1434
|
+
* `previewAccessProvider`.
|
|
1435
|
+
*/
|
|
1436
|
+
function previewFiles(code, design = {}) {
|
|
1437
|
+
const preset = presetOf(code);
|
|
1438
|
+
const config = resolveConfig(Object.keys(design).length === 0 ? { preset: code } : designConfig(resolvePreset(preset), design), "/");
|
|
1439
|
+
const provider = preset.access === "provider" ? previewAccessProvider(preset) : void 0;
|
|
1440
|
+
return renderModules(config.blockNames, moduleLayout(config, config.sql.testsDir, [], void 0, provider)).map((file) => ({
|
|
1441
|
+
path: file.path,
|
|
1442
|
+
module: file.module,
|
|
1443
|
+
contents: file.contents
|
|
1444
|
+
}));
|
|
1445
|
+
}
|
|
1446
|
+
//#endregion
|
|
1447
|
+
//#region src/create/sample-rows.ts
|
|
1448
|
+
const SAMPLE_ROW_COUNT = 8;
|
|
1449
|
+
/** The columns of `table` a `viewer` can't select: `access: "server"` ones for a member. */
|
|
1450
|
+
function hiddenColumns(table, viewer) {
|
|
1451
|
+
if (viewer === "server") return [];
|
|
1452
|
+
return Object.entries(table?.columns ?? {}).filter(([, column]) => column.access === "server").map(([key]) => key);
|
|
1453
|
+
}
|
|
1454
|
+
const USERS = "auth.users";
|
|
1455
|
+
const PEOPLE = [
|
|
1456
|
+
"Ada Lovelace",
|
|
1457
|
+
"Grace Hopper",
|
|
1458
|
+
"Alan Turing",
|
|
1459
|
+
"Katherine Johnson",
|
|
1460
|
+
"Edsger Dijkstra",
|
|
1461
|
+
"Barbara Liskov",
|
|
1462
|
+
"Donald Knuth",
|
|
1463
|
+
"Frances Allen"
|
|
1464
|
+
];
|
|
1465
|
+
const SENTENCES = [
|
|
1466
|
+
"A short note that explains the row.",
|
|
1467
|
+
"Longer text, such as a description or the body of a post.",
|
|
1468
|
+
"Written by the team and edited later.",
|
|
1469
|
+
"Kept for reference."
|
|
1470
|
+
];
|
|
1471
|
+
const COLORS = [
|
|
1472
|
+
"#2563eb",
|
|
1473
|
+
"#16a34a",
|
|
1474
|
+
"#d97706",
|
|
1475
|
+
"#dc2626",
|
|
1476
|
+
"#7c3aed"
|
|
1477
|
+
];
|
|
1478
|
+
const TITLE_COLUMNS = [
|
|
1479
|
+
"name",
|
|
1480
|
+
"title",
|
|
1481
|
+
"label",
|
|
1482
|
+
"subject"
|
|
1483
|
+
];
|
|
1484
|
+
function capitalized(value) {
|
|
1485
|
+
return `${value.charAt(0).toUpperCase()}${value.slice(1)}`.replaceAll("_", " ");
|
|
1486
|
+
}
|
|
1487
|
+
/** The column a table's rows are named by: its subject title, then a likely name column. */
|
|
1488
|
+
function titleColumnOf(table) {
|
|
1489
|
+
const text = new Set(Object.entries(table.columns ?? {}).filter(([, column]) => column.type === "text" && column.format === void 0).map(([key]) => key));
|
|
1490
|
+
return table.subject?.title ?? TITLE_COLUMNS.find((key) => text.has(key));
|
|
1491
|
+
}
|
|
1492
|
+
/** The name of row `index` of `table`, so a reference shows the row it points at. */
|
|
1493
|
+
function rowTitle(table, index) {
|
|
1494
|
+
return `${capitalized(singular(table))} ${String(index + 1)}`;
|
|
1495
|
+
}
|
|
1496
|
+
function pad(value) {
|
|
1497
|
+
return String(value).padStart(2, "0");
|
|
1498
|
+
}
|
|
1499
|
+
/** A date `days` after 5 January 2026, as `YYYY-MM-DD`. */
|
|
1500
|
+
function dayAfter(days) {
|
|
1501
|
+
const date = new Date(Date.UTC(2026, 0, 5 + days));
|
|
1502
|
+
return `${String(date.getUTCFullYear())}-${pad(date.getUTCMonth() + 1)}-${pad(date.getUTCDate())}`;
|
|
1503
|
+
}
|
|
1504
|
+
function numberIn(column, index, step) {
|
|
1505
|
+
const value = (column.min ?? 0) + index * step;
|
|
1506
|
+
return column.max === void 0 ? value : Math.min(value, column.max);
|
|
1507
|
+
}
|
|
1508
|
+
function formatted(column, index, slug) {
|
|
1509
|
+
switch (column.format) {
|
|
1510
|
+
case void 0: return;
|
|
1511
|
+
case "email": return `${(PEOPLE[index % PEOPLE.length] ?? "user").split(" ")[0]?.toLowerCase() ?? "user"}@example.com`;
|
|
1512
|
+
case "url": return `https://example.com/${slug}/${String(index + 1)}`;
|
|
1513
|
+
case "phone": return `+1 555 01${pad(index + 10)}`;
|
|
1514
|
+
case "long_text": return SENTENCES[index % SENTENCES.length] ?? "";
|
|
1515
|
+
case "color": return COLORS[index % COLORS.length] ?? "#000000";
|
|
1516
|
+
case "rating": {
|
|
1517
|
+
const min = column.min ?? 1;
|
|
1518
|
+
const max = column.max ?? 5;
|
|
1519
|
+
return String(min + index % (max - min + 1));
|
|
1520
|
+
}
|
|
1521
|
+
case "percent": return String(index * 17 % 101);
|
|
1522
|
+
case "currency": return ((index + 1) * 1250 / 100).toFixed(2);
|
|
1523
|
+
default: return column.format;
|
|
1524
|
+
}
|
|
1525
|
+
}
|
|
1526
|
+
function referenceValue(column, index) {
|
|
1527
|
+
const reference = column.references;
|
|
1528
|
+
if (reference === void 0) return;
|
|
1529
|
+
if (reference.block === void 0 && reference.table === USERS) return PEOPLE[index % PEOPLE.length] ?? "";
|
|
1530
|
+
return rowTitle(reference.table, index % 3);
|
|
1531
|
+
}
|
|
1532
|
+
function typedValue(column, index, slug) {
|
|
1533
|
+
switch (column.type) {
|
|
1534
|
+
case "text": return `${capitalized(slug)} ${String(index + 1)}`;
|
|
1535
|
+
case "uuid": return `00000000-0000-4000-8000-${String(index + 1).padStart(12, "0")}`;
|
|
1536
|
+
case "integer":
|
|
1537
|
+
case "bigint": return String(column.identity === true ? index + 1 : numberIn(column, index, 3));
|
|
1538
|
+
case "numeric": return numberIn(column, index, 2.5).toFixed(2);
|
|
1539
|
+
case "boolean": return String(index % 2 === 0);
|
|
1540
|
+
case "timestamptz": return `${dayAfter(index * 2)} ${pad(9 + index % 8)}:00`;
|
|
1541
|
+
case "date": return dayAfter(index * 3);
|
|
1542
|
+
case "jsonb": return "{}";
|
|
1543
|
+
case "text[]": return "{}";
|
|
1544
|
+
default: return column.type;
|
|
1545
|
+
}
|
|
1546
|
+
}
|
|
1547
|
+
function cell(table, key, column, index, title) {
|
|
1548
|
+
if (key === title) return rowTitle(table, index);
|
|
1549
|
+
if (column.nullable !== false && index % 4 === 3) return null;
|
|
1550
|
+
if (column.options !== void 0 && column.options.length > 0) return column.options[index % column.options.length] ?? null;
|
|
1551
|
+
return referenceValue(column, index) ?? formatted(column, index, key) ?? typedValue(column, index, key);
|
|
1552
|
+
}
|
|
1553
|
+
/**
|
|
1554
|
+
* Deterministic sample rows for app table `name`, from its columns' types,
|
|
1555
|
+
* formats, options, bounds and references. A reference shows the name of the
|
|
1556
|
+
* row it points at, so rows of related tables line up. A `member` viewer
|
|
1557
|
+
* doesn't get the columns `hiddenColumns` lists.
|
|
1558
|
+
*/
|
|
1559
|
+
function sampleRows(design, name, count = 8, viewer = "server") {
|
|
1560
|
+
const table = design.appTables?.[name];
|
|
1561
|
+
if (table === void 0) return {
|
|
1562
|
+
columns: [],
|
|
1563
|
+
rows: []
|
|
1564
|
+
};
|
|
1565
|
+
const hidden = new Set(hiddenColumns(table, viewer));
|
|
1566
|
+
const entries = Object.entries(table.columns ?? {}).filter(([key]) => !hidden.has(key));
|
|
1567
|
+
const title = titleColumnOf(table);
|
|
1568
|
+
return {
|
|
1569
|
+
columns: entries.map(([key]) => key),
|
|
1570
|
+
rows: Array.from({ length: count }, (_, index) => Object.fromEntries(entries.map(([key, column]) => [key, cell(name, key, column, index, title)])))
|
|
1571
|
+
};
|
|
1572
|
+
}
|
|
1573
|
+
//#endregion
|
|
1574
|
+
//#region src/create/schema-meta.ts
|
|
1575
|
+
const AUTH_USERS = "auth.users";
|
|
1576
|
+
/** The tenant name the module defaults use, which a preset's tenant name replaces. */
|
|
1577
|
+
const DEFAULT_TENANT = "organization";
|
|
1578
|
+
/**
|
|
1579
|
+
* Finds the parsed table for a module's logical table by its default name,
|
|
1580
|
+
* or by that name with the tenant renamed (`organizations` is `workspaces`
|
|
1581
|
+
* for the `workspace` tenant).
|
|
1582
|
+
*/
|
|
1583
|
+
function indexTables(tables, tenantName) {
|
|
1584
|
+
const byName = new Map(tables.map((table) => [`${table.module}:${table.name}`, table]));
|
|
1585
|
+
return (module, name) => byName.get(`${module}:${name}`) ?? byName.get(`${module}:${name.replaceAll(DEFAULT_TENANT, tenantName)}`);
|
|
1586
|
+
}
|
|
1587
|
+
function moduleTables(module) {
|
|
1588
|
+
return Object.entries(SQL_MODULES[module]?.names?.tables ?? {});
|
|
1589
|
+
}
|
|
1590
|
+
/**
|
|
1591
|
+
* The table the tenant columns point at: the target most foreign keys on a
|
|
1592
|
+
* tenant column share. `null` when no table has a tenant foreign key.
|
|
1593
|
+
*/
|
|
1594
|
+
function tenantTable(tables) {
|
|
1595
|
+
const counts = /* @__PURE__ */ new Map();
|
|
1596
|
+
for (const table of tables) for (const key of table.foreignKeys) if (table.tenantColumn !== null && key.columns.length === 1 && key.columns[0] === table.tenantColumn) {
|
|
1597
|
+
const to = `${key.target.schema}.${key.target.table}`;
|
|
1598
|
+
counts.set(to, (counts.get(to) ?? 0) + 1);
|
|
1599
|
+
}
|
|
1600
|
+
let best = null;
|
|
1601
|
+
let most = 0;
|
|
1602
|
+
for (const [id, count] of counts) if (count > most) {
|
|
1603
|
+
best = id;
|
|
1604
|
+
most = count;
|
|
1605
|
+
}
|
|
1606
|
+
return best;
|
|
1607
|
+
}
|
|
1608
|
+
/**
|
|
1609
|
+
* The physical column a logical lifecycle column maps to. A tenant name
|
|
1610
|
+
* renames `organization_id`, so a default name the table lacks falls back to
|
|
1611
|
+
* the table's tenant column.
|
|
1612
|
+
*/
|
|
1613
|
+
function physicalColumn(table, name, tenant) {
|
|
1614
|
+
if (name === void 0) return;
|
|
1615
|
+
if (table.columns.some((column) => column.name === name)) return name;
|
|
1616
|
+
return tenant && table.tenantColumn !== null ? table.tenantColumn : void 0;
|
|
1617
|
+
}
|
|
1618
|
+
function hasForeignKey(table, column) {
|
|
1619
|
+
return table.foreignKeys.some((key) => key.columns.length === 1 && key.columns[0] === column);
|
|
1620
|
+
}
|
|
1621
|
+
/**
|
|
1622
|
+
* The soft references in the tables: lifecycle tenant and user columns
|
|
1623
|
+
* without a foreign key, and `regclass` columns, which name any table.
|
|
1624
|
+
*/
|
|
1625
|
+
function softReferences(tables, tenantName = DEFAULT_TENANT) {
|
|
1626
|
+
const lookup = indexTables(tables, tenantName);
|
|
1627
|
+
const tenantTo = tenantTable(tables);
|
|
1628
|
+
const refs = [];
|
|
1629
|
+
const seen = /* @__PURE__ */ new Set();
|
|
1630
|
+
const add = (ref) => {
|
|
1631
|
+
const key = `${ref.from}.${ref.column}`;
|
|
1632
|
+
if (!seen.has(key)) {
|
|
1633
|
+
seen.add(key);
|
|
1634
|
+
refs.push(ref);
|
|
1635
|
+
}
|
|
1636
|
+
};
|
|
1637
|
+
for (const block of new Set(tables.map((table) => table.module))) for (const [, spec] of moduleTables(block)) {
|
|
1638
|
+
const table = lookup(block, spec.name);
|
|
1639
|
+
const lifecycle = spec.lifecycle;
|
|
1640
|
+
if (table === void 0 || lifecycle === void 0) continue;
|
|
1641
|
+
const tenant = physicalColumn(table, lifecycle.tenant === void 0 ? void 0 : spec.columns[lifecycle.tenant], true);
|
|
1642
|
+
if (tenant !== void 0 && tenantTo !== null && tenantTo !== table.id && !hasForeignKey(table, tenant)) add({
|
|
1643
|
+
from: table.id,
|
|
1644
|
+
column: tenant,
|
|
1645
|
+
to: tenantTo,
|
|
1646
|
+
kind: "tenant"
|
|
1647
|
+
});
|
|
1648
|
+
const user = physicalColumn(table, lifecycle.user === void 0 ? void 0 : spec.columns[lifecycle.user], false);
|
|
1649
|
+
if (user !== void 0 && !hasForeignKey(table, user)) add({
|
|
1650
|
+
from: table.id,
|
|
1651
|
+
column: user,
|
|
1652
|
+
to: AUTH_USERS,
|
|
1653
|
+
kind: "user"
|
|
1654
|
+
});
|
|
1655
|
+
}
|
|
1656
|
+
for (const table of tables) for (const column of table.columns) if (column.type.toLowerCase() === "regclass") add({
|
|
1657
|
+
from: table.id,
|
|
1658
|
+
column: column.name,
|
|
1659
|
+
to: null,
|
|
1660
|
+
kind: "any"
|
|
1661
|
+
});
|
|
1662
|
+
return refs;
|
|
1663
|
+
}
|
|
1664
|
+
const MANIFEST_BY_MODULE = new Map(PRESET_CATALOG.blocks.map((block) => [block.name, block.manifest]));
|
|
1665
|
+
const EXTRA_TABLE_BY_MODULE = new Map(PRESET_CATALOG.blocks.flatMap((block) => block.extraColumns === void 0 ? [] : [[block.name, block.extraColumns]]));
|
|
1666
|
+
/** Each table's module and logical table name. */
|
|
1667
|
+
function blockTables(tables, lookup) {
|
|
1668
|
+
return Object.fromEntries(tables.flatMap((table) => {
|
|
1669
|
+
const logical = moduleTables(table.module).find(([, spec]) => lookup(table.module, spec.name) === table)?.[0];
|
|
1670
|
+
return logical === void 0 ? [] : [[table.id, {
|
|
1671
|
+
block: table.module,
|
|
1672
|
+
table: logical
|
|
1673
|
+
}]];
|
|
1674
|
+
}));
|
|
1675
|
+
}
|
|
1676
|
+
/** The table ids `blocks.<module>.options.extraColumns` adds columns to. */
|
|
1677
|
+
function extraColumnTables(tables, lookup) {
|
|
1678
|
+
const installed = new Set(tables.map((table) => table.module));
|
|
1679
|
+
return [...EXTRA_TABLE_BY_MODULE].flatMap(([module, logical]) => {
|
|
1680
|
+
const spec = SQL_MODULES[module]?.names?.tables[logical];
|
|
1681
|
+
const table = !installed.has(module) || spec === void 0 ? void 0 : lookup(module, spec.name);
|
|
1682
|
+
return table === void 0 ? [] : [table.id];
|
|
1683
|
+
});
|
|
1684
|
+
}
|
|
1685
|
+
/** The tables plus the soft references, manifests and extra-column tables the canvas draws. */
|
|
1686
|
+
function schemaData(tables, tenantName = DEFAULT_TENANT) {
|
|
1687
|
+
const lookup = indexTables(tables, tenantName);
|
|
1688
|
+
return {
|
|
1689
|
+
tables,
|
|
1690
|
+
softRefs: softReferences(tables, tenantName),
|
|
1691
|
+
manifests: Object.fromEntries(tables.map((table) => [table.id, MANIFEST_BY_MODULE.get(table.module) ?? table.module])),
|
|
1692
|
+
extraColumns: extraColumnTables(tables, lookup),
|
|
1693
|
+
blockTables: blockTables(tables, lookup),
|
|
1694
|
+
tenantTable: tenantTable(tables)
|
|
1695
|
+
};
|
|
1696
|
+
}
|
|
1697
|
+
//#endregion
|
|
1698
|
+
//#region src/create/schema.ts
|
|
1699
|
+
/** The columns a diagram shows before a table is expanded: keys, tenant and soft references. */
|
|
1700
|
+
function keyColumnsOf(table, softColumns = /* @__PURE__ */ new Set()) {
|
|
1701
|
+
const keys = /* @__PURE__ */ new Set([
|
|
1702
|
+
...table.primaryKey,
|
|
1703
|
+
...table.foreignKeys.flatMap((key) => key.columns),
|
|
1704
|
+
...table.tenantColumn === null ? [] : [table.tenantColumn],
|
|
1705
|
+
...softColumns
|
|
1706
|
+
]);
|
|
1707
|
+
return table.columns.filter((column) => keys.has(column.name));
|
|
1708
|
+
}
|
|
1709
|
+
/** The column the tenant blocks key rows by, from the preset's tenant name; `null` without tenants. */
|
|
1710
|
+
function tenantColumnOf(preset) {
|
|
1711
|
+
return preset.scope === "tenant" ? `${preset.tenantName}_id` : null;
|
|
1712
|
+
}
|
|
1713
|
+
/**
|
|
1714
|
+
* Every module's file creates this table to record the installed modules.
|
|
1715
|
+
* It holds no app data, so the diagram leaves it out.
|
|
1716
|
+
*/
|
|
1717
|
+
const BOOKKEEPING_TABLES = /* @__PURE__ */ new Set(["better_supabase.modules"]);
|
|
1718
|
+
const IDENT = String.raw`(?:"(?:[^"]|"")+"|[A-Za-z_][A-Za-z0-9_$]*)`;
|
|
1719
|
+
const QNAME = String.raw`${IDENT}(?:\s*\.\s*${IDENT})?`;
|
|
1720
|
+
const CREATE_TABLE = /\bcreate\s+(?:(?:global\s+|local\s+)?(?:temp|temporary)\s+|unlogged\s+)?table\b/giu;
|
|
1721
|
+
const CREATE_HEAD = new RegExp(String.raw`^create\s+(?:(?:global\s+|local\s+)?(?:temp|temporary)\s+|unlogged\s+)?table\s+(?:if\s+not\s+exists\s+)?(${QNAME})\s*\(`, "iu");
|
|
1722
|
+
const ALTER_TABLE = new RegExp(String.raw`\balter\s+table\s+(?:if\s+exists\s+)?(?:only\s+)?(${QNAME})\s+([^;]*);`, "giu");
|
|
1723
|
+
const REFERENCES = new RegExp(String.raw`\breferences\s+(${QNAME})\s*(?:\(([^)]*)\))?`, "iu");
|
|
1724
|
+
const LEADING_IDENT = new RegExp(String.raw`^(${IDENT})\s*`, "u");
|
|
1725
|
+
const CONSTRAINT_NAME = new RegExp(String.raw`^constraint\s+${IDENT}\s+`, "iu");
|
|
1726
|
+
/** Words that end a column's type in its definition. */
|
|
1727
|
+
const TYPE_END = /\s+(?:not\b|null\b|primary\b|references\b|default\b|generated\b|unique\b|check\b|constraint\b|collate\b)/iu;
|
|
1728
|
+
function unquote(ident) {
|
|
1729
|
+
const trimmed = ident.trim();
|
|
1730
|
+
return trimmed.startsWith("\"") ? trimmed.slice(1, -1).replaceAll("\"\"", "\"") : trimmed.toLowerCase();
|
|
1731
|
+
}
|
|
1732
|
+
function qualified(name) {
|
|
1733
|
+
const [first = "", second] = (name.match(new RegExp(IDENT, "gu")) ?? []).map((each) => unquote(each));
|
|
1734
|
+
return second === void 0 ? {
|
|
1735
|
+
schema: "public",
|
|
1736
|
+
table: first
|
|
1737
|
+
} : {
|
|
1738
|
+
schema: first,
|
|
1739
|
+
table: second
|
|
1740
|
+
};
|
|
1741
|
+
}
|
|
1742
|
+
function identList(list) {
|
|
1743
|
+
return (list ?? "").split(",").map((each) => each.trim()).filter((each) => each !== "").map((each) => unquote(each));
|
|
1744
|
+
}
|
|
1745
|
+
/**
|
|
1746
|
+
* The SQL with comments removed and the inside of every single-quoted string
|
|
1747
|
+
* blanked, so a `create table` inside a string or a comment is not read and
|
|
1748
|
+
* the offsets still match the original text.
|
|
1749
|
+
*/
|
|
1750
|
+
function codeOnly(sql) {
|
|
1751
|
+
let out = "";
|
|
1752
|
+
let index = 0;
|
|
1753
|
+
while (index < sql.length) {
|
|
1754
|
+
const char = sql[index];
|
|
1755
|
+
const next = sql[index + 1];
|
|
1756
|
+
if (char === "-" && next === "-") {
|
|
1757
|
+
const end = sql.indexOf("\n", index);
|
|
1758
|
+
const stop = end === -1 ? sql.length : end;
|
|
1759
|
+
out += " ".repeat(stop - index);
|
|
1760
|
+
index = stop;
|
|
1761
|
+
} else if (char === "/" && next === "*") {
|
|
1762
|
+
const end = sql.indexOf("*/", index + 2);
|
|
1763
|
+
const stop = end === -1 ? sql.length : end + 2;
|
|
1764
|
+
out += sql.slice(index, stop).replaceAll(/[^\n]/gu, " ");
|
|
1765
|
+
index = stop;
|
|
1766
|
+
} else if (char === "'") {
|
|
1767
|
+
let stop = index + 1;
|
|
1768
|
+
while (stop < sql.length) if (sql[stop] === "'" && sql[stop + 1] === "'") stop += 2;
|
|
1769
|
+
else if (sql[stop] === "'") break;
|
|
1770
|
+
else stop += 1;
|
|
1771
|
+
out += `'${sql.slice(index + 1, stop).replaceAll(/[^\n]/gu, " ")}'`;
|
|
1772
|
+
index = stop + 1;
|
|
1773
|
+
} else {
|
|
1774
|
+
out += char;
|
|
1775
|
+
index += 1;
|
|
1776
|
+
}
|
|
1777
|
+
}
|
|
1778
|
+
return out;
|
|
1779
|
+
}
|
|
1780
|
+
/** The text between the `(` at `open` and its matching `)`, or undefined when it never closes. */
|
|
1781
|
+
function balanced(text, open) {
|
|
1782
|
+
let depth = 0;
|
|
1783
|
+
for (let index = open; index < text.length; index += 1) if (text[index] === "(") depth += 1;
|
|
1784
|
+
else if (text[index] === ")") {
|
|
1785
|
+
depth -= 1;
|
|
1786
|
+
if (depth === 0) return text.slice(open + 1, index);
|
|
1787
|
+
}
|
|
1788
|
+
}
|
|
1789
|
+
/** The comma-separated elements of `text` at depth 0, with `original` sliced at the same offsets. */
|
|
1790
|
+
function splitTopLevel(text, original = text) {
|
|
1791
|
+
const parts = [];
|
|
1792
|
+
let depth = 0;
|
|
1793
|
+
let start = 0;
|
|
1794
|
+
const push = (end) => {
|
|
1795
|
+
const code = text.slice(start, end);
|
|
1796
|
+
const lead = code.length - code.trimStart().length;
|
|
1797
|
+
const trimmed = code.trim();
|
|
1798
|
+
if (trimmed !== "") parts.push({
|
|
1799
|
+
code: trimmed,
|
|
1800
|
+
original: original.slice(start + lead, start + lead + trimmed.length)
|
|
1801
|
+
});
|
|
1802
|
+
};
|
|
1803
|
+
for (let index = 0; index < text.length; index += 1) {
|
|
1804
|
+
const char = text[index];
|
|
1805
|
+
if (char === "(") depth += 1;
|
|
1806
|
+
else if (char === ")") depth -= 1;
|
|
1807
|
+
else if (char === "," && depth === 0) {
|
|
1808
|
+
push(index);
|
|
1809
|
+
start = index + 1;
|
|
1810
|
+
}
|
|
1811
|
+
}
|
|
1812
|
+
push(text.length);
|
|
1813
|
+
return parts;
|
|
1814
|
+
}
|
|
1815
|
+
function lineOf(text, offset) {
|
|
1816
|
+
return text.slice(0, offset).split("\n").length;
|
|
1817
|
+
}
|
|
1818
|
+
function target(match) {
|
|
1819
|
+
const { schema, table } = qualified(match[1] ?? "");
|
|
1820
|
+
return {
|
|
1821
|
+
schema,
|
|
1822
|
+
table,
|
|
1823
|
+
columns: identList(match[2])
|
|
1824
|
+
};
|
|
1825
|
+
}
|
|
1826
|
+
const ON_DELETE = /\bon\s+delete\s+(cascade|restrict|set\s+null|set\s+default|no\s+action)\b/iu;
|
|
1827
|
+
/** The `on delete` action of a reference, `no action` when it names none. */
|
|
1828
|
+
function onDeleteOf(text) {
|
|
1829
|
+
return (ON_DELETE.exec(text)?.[1] ?? "no action").toLowerCase().replaceAll(/\s+/gu, " ");
|
|
1830
|
+
}
|
|
1831
|
+
/** Words that end a column's default expression at the top level. */
|
|
1832
|
+
const DEFAULT_END = /^(?:not\s+null|null|primary\s+key|references|unique|check|constraint|generated|collate)\b/iu;
|
|
1833
|
+
/**
|
|
1834
|
+
* The `default` expression of a column definition. `definition` is the code
|
|
1835
|
+
* with strings blanked and `original` the same text as written, so a keyword
|
|
1836
|
+
* inside a string never ends the expression.
|
|
1837
|
+
*/
|
|
1838
|
+
function defaultOf(definition, original) {
|
|
1839
|
+
const start = /\bdefault\s+/iu.exec(definition);
|
|
1840
|
+
if (start === null) return null;
|
|
1841
|
+
const from = start.index + start[0].length;
|
|
1842
|
+
let depth = 0;
|
|
1843
|
+
let end = definition.length;
|
|
1844
|
+
for (let index = from; index < definition.length; index += 1) {
|
|
1845
|
+
const char = definition[index];
|
|
1846
|
+
if (char === "(") depth += 1;
|
|
1847
|
+
else if (char === ")") depth -= 1;
|
|
1848
|
+
else if (depth === 0 && /\s/u.test(char ?? "") && DEFAULT_END.test(definition.slice(index).trimStart())) {
|
|
1849
|
+
end = index;
|
|
1850
|
+
break;
|
|
1851
|
+
}
|
|
1852
|
+
}
|
|
1853
|
+
return original.slice(from, end).trim();
|
|
1854
|
+
}
|
|
1855
|
+
/** Adds a column definition (`"name" type ...`) to the draft. */
|
|
1856
|
+
function addColumn(draft, definition, original = definition) {
|
|
1857
|
+
const head = definition.match(LEADING_IDENT);
|
|
1858
|
+
if (head === null) return;
|
|
1859
|
+
const name = unquote(head[1] ?? "");
|
|
1860
|
+
const rest = definition.slice(head[0].length);
|
|
1861
|
+
const typeEnd = rest.search(TYPE_END);
|
|
1862
|
+
const type = (typeEnd === -1 ? rest : rest.slice(0, typeEnd)).trim();
|
|
1863
|
+
if (draft.columns.some((column) => column.name === name)) return;
|
|
1864
|
+
const primary = /\bprimary\s+key\b/iu.test(rest);
|
|
1865
|
+
draft.columns.push({
|
|
1866
|
+
name,
|
|
1867
|
+
type,
|
|
1868
|
+
nullable: !primary && !/\bnot\s+null\b/iu.test(rest),
|
|
1869
|
+
default: defaultOf(definition, original),
|
|
1870
|
+
unique: /\bunique\b/iu.test(rest)
|
|
1871
|
+
});
|
|
1872
|
+
if (primary) draft.primaryKey = [name];
|
|
1873
|
+
const references = rest.match(REFERENCES);
|
|
1874
|
+
if (references !== null) draft.foreignKeys.push({
|
|
1875
|
+
columns: [name],
|
|
1876
|
+
target: target(references),
|
|
1877
|
+
onDelete: onDeleteOf(rest)
|
|
1878
|
+
});
|
|
1879
|
+
}
|
|
1880
|
+
/**
|
|
1881
|
+
* Adds a table constraint (`primary key (...)`, `foreign key (...)
|
|
1882
|
+
* references ...`). Returns false when the element is not a constraint.
|
|
1883
|
+
*/
|
|
1884
|
+
function addConstraint(draft, element) {
|
|
1885
|
+
const body = element.replace(CONSTRAINT_NAME, "");
|
|
1886
|
+
const named = body !== element;
|
|
1887
|
+
const primary = /^primary\s+key\s*\(([^)]*)\)/iu.exec(body);
|
|
1888
|
+
if (primary !== null) {
|
|
1889
|
+
draft.primaryKey = identList(primary[1]);
|
|
1890
|
+
return true;
|
|
1891
|
+
}
|
|
1892
|
+
const foreign = /^foreign\s+key\s*\(([^)]*)\)\s*([\s\S]*)$/iu.exec(body);
|
|
1893
|
+
if (foreign !== null) {
|
|
1894
|
+
const references = (foreign[2] ?? "").match(REFERENCES);
|
|
1895
|
+
if (references !== null) draft.foreignKeys.push({
|
|
1896
|
+
columns: identList(foreign[1]),
|
|
1897
|
+
target: target(references),
|
|
1898
|
+
onDelete: onDeleteOf(foreign[2] ?? "")
|
|
1899
|
+
});
|
|
1900
|
+
return true;
|
|
1901
|
+
}
|
|
1902
|
+
return named || /^(?:unique|check|exclude)\b/iu.test(body);
|
|
1903
|
+
}
|
|
1904
|
+
function finish(draft, tenantColumn) {
|
|
1905
|
+
const tenant = tenantColumn !== null && draft.columns.some((column) => column.name === tenantColumn) ? tenantColumn : null;
|
|
1906
|
+
const primary = new Set(draft.primaryKey);
|
|
1907
|
+
return {
|
|
1908
|
+
id: `${draft.schema}.${draft.name}`,
|
|
1909
|
+
schema: draft.schema,
|
|
1910
|
+
name: draft.name,
|
|
1911
|
+
module: draft.module,
|
|
1912
|
+
primaryKey: draft.primaryKey,
|
|
1913
|
+
foreignKeys: draft.foreignKeys,
|
|
1914
|
+
tenantColumn: tenant,
|
|
1915
|
+
columns: draft.columns.map((column) => primary.has(column.name) ? {
|
|
1916
|
+
...column,
|
|
1917
|
+
nullable: false
|
|
1918
|
+
} : column)
|
|
1919
|
+
};
|
|
1920
|
+
}
|
|
1921
|
+
/**
|
|
1922
|
+
* The tables in rendered module SQL: every `create table`, plus the columns
|
|
1923
|
+
* and foreign keys later `alter table ... add` statements give them. A
|
|
1924
|
+
* `create table` it can't read throws with the file and line, so a new SQL
|
|
1925
|
+
* shape fails the tests instead of dropping a table from the diagram.
|
|
1926
|
+
*/
|
|
1927
|
+
function parseSchema(files, options = {}) {
|
|
1928
|
+
const drafts = /* @__PURE__ */ new Map();
|
|
1929
|
+
const code = files.map((file) => ({
|
|
1930
|
+
file,
|
|
1931
|
+
text: codeOnly(file.contents)
|
|
1932
|
+
}));
|
|
1933
|
+
for (const { file, text } of code) for (const match of text.matchAll(CREATE_TABLE)) {
|
|
1934
|
+
const offset = match.index;
|
|
1935
|
+
const head = text.slice(offset).match(CREATE_HEAD);
|
|
1936
|
+
const open = head === null ? -1 : offset + head[0].length - 1;
|
|
1937
|
+
const body = open === -1 ? void 0 : balanced(text, open);
|
|
1938
|
+
const original = body === void 0 ? "" : file.contents.slice(open + 1, open + 1 + body.length);
|
|
1939
|
+
if (head === null || body === void 0) throw new Error(`parseSchema can't read the create table at ${file.path}:${lineOf(text, offset)}.`);
|
|
1940
|
+
const { schema, table } = qualified(head[1] ?? "");
|
|
1941
|
+
const id = `${schema}.${table}`;
|
|
1942
|
+
if (drafts.has(id)) continue;
|
|
1943
|
+
const draft = {
|
|
1944
|
+
schema,
|
|
1945
|
+
name: table,
|
|
1946
|
+
module: file.module,
|
|
1947
|
+
columns: [],
|
|
1948
|
+
primaryKey: [],
|
|
1949
|
+
foreignKeys: []
|
|
1950
|
+
};
|
|
1951
|
+
for (const element of splitTopLevel(body, original)) if (!addConstraint(draft, element.code)) addColumn(draft, element.code, element.original);
|
|
1952
|
+
drafts.set(id, draft);
|
|
1953
|
+
}
|
|
1954
|
+
for (const { file, text } of code) for (const match of text.matchAll(ALTER_TABLE)) {
|
|
1955
|
+
const { schema, table } = qualified(match[1] ?? "");
|
|
1956
|
+
const draft = drafts.get(`${schema}.${table}`);
|
|
1957
|
+
if (draft === void 0) continue;
|
|
1958
|
+
const actions = match[2] ?? "";
|
|
1959
|
+
const start = match.index + match[0].lastIndexOf(actions);
|
|
1960
|
+
const original = file.contents.slice(start, start + actions.length);
|
|
1961
|
+
for (const action of splitTopLevel(actions, original)) {
|
|
1962
|
+
const column = /^add\s+column\s+(?:if\s+not\s+exists\s+)?/iu.exec(action.code);
|
|
1963
|
+
if (column !== null) addColumn(draft, action.code.slice(column[0].length), action.original.slice(column[0].length));
|
|
1964
|
+
else if (/^add\s+/iu.test(action.code)) addConstraint(draft, action.code.replace(/^add\s+/iu, ""));
|
|
1965
|
+
}
|
|
1966
|
+
}
|
|
1967
|
+
const tenantColumn = options.tenantColumn ?? null;
|
|
1968
|
+
return [...drafts.entries()].filter(([id]) => !BOOKKEEPING_TABLES.has(id)).map(([, draft]) => finish(draft, tenantColumn));
|
|
1969
|
+
}
|
|
1970
|
+
/**
|
|
1971
|
+
* The statements that shape one table, as written: its `create table` and
|
|
1972
|
+
* the `alter table` statements after it. Empty when no file creates it.
|
|
1973
|
+
*/
|
|
1974
|
+
function tableStatements(files, id) {
|
|
1975
|
+
const statements = [];
|
|
1976
|
+
for (const file of files) {
|
|
1977
|
+
const text = codeOnly(file.contents);
|
|
1978
|
+
for (const match of text.matchAll(CREATE_TABLE)) {
|
|
1979
|
+
const head = text.slice(match.index).match(CREATE_HEAD);
|
|
1980
|
+
if (head === null) continue;
|
|
1981
|
+
const { schema, table } = qualified(head[1] ?? "");
|
|
1982
|
+
const open = match.index + head[0].length - 1;
|
|
1983
|
+
const body = balanced(text, open);
|
|
1984
|
+
if (`${schema}.${table}` !== id || body === void 0) continue;
|
|
1985
|
+
const end = text.indexOf(";", open + body.length + 1);
|
|
1986
|
+
statements.push(file.contents.slice(match.index, end === -1 ? text.length : end + 1));
|
|
1987
|
+
}
|
|
1988
|
+
for (const match of text.matchAll(ALTER_TABLE)) {
|
|
1989
|
+
const { schema, table } = qualified(match[1] ?? "");
|
|
1990
|
+
if (`${schema}.${table}` === id) statements.push(file.contents.slice(match.index, match.index + match[0].length));
|
|
1991
|
+
}
|
|
1992
|
+
}
|
|
1993
|
+
return statements;
|
|
1994
|
+
}
|
|
1995
|
+
/** The foreign keys between tables, one per pair, with the targets outside the schema named by id. */
|
|
1996
|
+
function schemaRelations(tables) {
|
|
1997
|
+
const seen = /* @__PURE__ */ new Set();
|
|
1998
|
+
return tables.flatMap((table) => table.foreignKeys.flatMap((key) => {
|
|
1999
|
+
const to = `${key.target.schema}.${key.target.table}`;
|
|
2000
|
+
const pair = `${table.id}>${to}`;
|
|
2001
|
+
if (to === table.id || seen.has(pair)) return [];
|
|
2002
|
+
seen.add(pair);
|
|
2003
|
+
return [{
|
|
2004
|
+
from: table.id,
|
|
2005
|
+
to
|
|
2006
|
+
}];
|
|
2007
|
+
}));
|
|
2008
|
+
}
|
|
2009
|
+
//#endregion
|
|
2010
|
+
//#region src/create/migration.ts
|
|
2011
|
+
/** The module whose file holds the app's own tables. */
|
|
2012
|
+
const APP_TABLES_MODULE = "app-tables";
|
|
2013
|
+
/**
|
|
2014
|
+
* The migration that takes a project deployed from `base` to `next`, for
|
|
2015
|
+
* added tables and added columns only. The rendered app-table SQL is
|
|
2016
|
+
* idempotent (`create table if not exists`, `add column if not exists`,
|
|
2017
|
+
* `drop policy if exists`), so the migration is the re-rendered file.
|
|
2018
|
+
* Anything else, such as a rename, a retype, a changed default or a change
|
|
2019
|
+
* outside `appTables`, is refused so a deploy never guesses.
|
|
2020
|
+
*/
|
|
2021
|
+
function migrationBetween(code, base, next) {
|
|
2022
|
+
const changes = diffDesigns(base, next);
|
|
2023
|
+
const breaking = changes.filter((change) => change.breaking);
|
|
2024
|
+
if (breaking.length > 0) return {
|
|
2025
|
+
ok: false,
|
|
2026
|
+
reason: "breaking",
|
|
2027
|
+
changes: breaking
|
|
2028
|
+
};
|
|
2029
|
+
const unsupported = changes.filter((change) => change.kind !== "table.added" && change.kind !== "column.added");
|
|
2030
|
+
if (unsupported.length > 0) return {
|
|
2031
|
+
ok: false,
|
|
2032
|
+
reason: "unsupported",
|
|
2033
|
+
changes: unsupported
|
|
2034
|
+
};
|
|
2035
|
+
const before = new Map(previewFiles(code, base).map((file) => [file.path, file.contents]));
|
|
2036
|
+
const differing = previewFiles(code, next).filter((file) => before.get(file.path) !== file.contents);
|
|
2037
|
+
if (differing.some((file) => file.module !== APP_TABLES_MODULE)) return {
|
|
2038
|
+
ok: false,
|
|
2039
|
+
reason: "unsupported",
|
|
2040
|
+
changes
|
|
2041
|
+
};
|
|
2042
|
+
return {
|
|
2043
|
+
ok: true,
|
|
2044
|
+
sql: differing.map((file) => `-- ${file.path}\n${file.contents.trim()}\n`).join("\n"),
|
|
2045
|
+
changes
|
|
2046
|
+
};
|
|
2047
|
+
}
|
|
2048
|
+
//#endregion
|
|
2049
|
+
export { APP_MODULE, COLUMN_KINDS, EMPTY_DESIGN, HISTORY_LIMIT, KIND_GROUPS, MIGRATION_NAME, APP_ON_DELETE_ACTIONS as ON_DELETE_ACTIONS, ROLLUP_AGGREGATES, SAMPLE_ROW_COUNT, addTable, appTableId, boundError, columnError, columnLabel, computedColumnRenamed, computedRows, computedTableRenamed, connect, dashboardUrl, defaultError, deleteColumn, deleteExtraColumn, deleteTable, deployBlocker, deployQuery, designIssues, duplicateTable, editTable, eventsColumnsEdited, filterColumns, fitted, fittedRollup, freeTableName, generatePassword, hiddenColumns, identifierError, initialHistory, isAppTable, isEmptyDesign, isRollupAggregate, keyColumnsOf, kindById, kindOf, lockedWithoutDefault, lookupSources, migrationBetween, moveTables, optionError, parseSchema, previewAccessProvider, previewFiles, prunedComputed, readableColumns, referenceFrom, renameColumn, renameTable, rollupColumns, rollupSources, sampleRows, schemaData, schemaRelations, setColumn, setColumnKind, setExtraColumn, setTableId, singular, subjectColumns, subjectColumnsEdited, subjectTypeError, suggestedProjectName, tableStatements, tableWithComputed, tableWithoutComputed, takesBounds, tenantColumnOf, tidy, undoHistory, updateTable, userConnection, withBounds, withDesign, withKind };
|