better-supabase 0.11.0 → 0.13.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 +1 -0
- package/dist/access-sql-BpOdJvfj.js +205 -0
- package/dist/actor-C9pwyCVz.js +150 -0
- package/dist/actor-CoveJgya.d.ts +106 -0
- package/dist/adapter-D8dW6p2A.js +2190 -0
- package/dist/agents-CuxuXVWv.d.ts +117 -0
- package/dist/ai-cache-BXMXRhkx.d.ts +82 -0
- package/dist/ai-cache-Byy5q6EZ.js +87 -0
- package/dist/ai-chat-B00sIOjY.d.ts +619 -0
- package/dist/ai-files-DTbIJcxQ.js +339 -0
- package/dist/ai-sdk/agents/index.d.ts +64 -52
- package/dist/ai-sdk/agents/index.js +34 -26
- package/dist/ai-sdk/batches/index.d.ts +16 -7
- package/dist/ai-sdk/batches/index.js +5 -5
- package/dist/ai-sdk/cache/index.d.ts +6 -3
- 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 +10 -10
- package/dist/ai-sdk/embeddings/index.d.ts +2 -2
- package/dist/ai-sdk/embeddings/index.js +1 -1
- package/dist/ai-sdk/files/index.d.ts +9 -9
- package/dist/ai-sdk/files/index.js +10 -10
- package/dist/ai-sdk/index.d.ts +25 -22
- package/dist/ai-sdk/index.js +11 -8
- package/dist/ai-sdk/mcp/index.d.ts +32 -26
- package/dist/ai-sdk/mcp/index.js +19 -19
- package/dist/ai-sdk/memory/index.d.ts +9 -9
- package/dist/ai-sdk/memory/index.js +5 -5
- package/dist/ai-sdk/react/index.d.ts +1 -1
- package/dist/ai-sdk/react/index.js +1 -1
- package/dist/ai-sdk/react/server.d.ts +5 -2
- package/dist/ai-sdk/react/server.js +4 -1
- package/dist/ai-sdk/workflow/index.d.ts +57 -36
- package/dist/ai-sdk/workflow/index.js +29 -23
- package/dist/ai-sdk/workflow/react/index.d.ts +7 -8
- package/dist/ai-sdk/workflow/react/index.js +7 -8
- package/dist/ai-sdk/workflow/react/server.d.ts +1 -1
- package/dist/ai-tasks-DN-AV7qB.d.ts +166 -0
- package/dist/announcements-DqiLxtKK.js +128 -0
- package/dist/api-CmcTYuFT.js +685 -0
- package/dist/api-DwLhJS1j.d.ts +444 -0
- package/dist/api-keys-Bade6Qtl.d.ts +213 -0
- package/dist/api-keys-CO24Ffil.js +318 -0
- package/dist/app-tables-0YZ9IskE.js +831 -0
- package/dist/app-tables-CbWUI7h_.d.ts +35 -0
- package/dist/approvals-C-4MOWdV.d.ts +127 -0
- package/dist/arazzo/index.d.ts +58 -36
- package/dist/arazzo/index.js +49 -41
- package/dist/assistant-CcP_kpu7.d.ts +157 -0
- package/dist/astro/index.d.ts +39 -20
- package/dist/astro/index.js +14 -11
- package/dist/asyncapi/index.d.ts +22 -16
- package/dist/asyncapi/index.js +23 -20
- package/dist/attachments-CPkGJVfk.js +270 -0
- package/dist/attributes-BOFl922R.js +44 -0
- package/dist/audit-log-5aTnl7W2.js +788 -0
- package/dist/auth-DyF_LRxd.js +20 -0
- package/dist/auth-link-B4NL84XU.d.ts +104 -0
- package/dist/auth-link-D3-bU6yz.js +118 -0
- package/dist/auth-module-CwCIY97x.js +10 -0
- package/dist/auth-reply-D02x5NSv.js +31 -0
- package/dist/authorization-CB69cvnA.d.ts +1504 -0
- package/dist/authorization-hooks-HXVZXxUk.d.ts +217 -0
- package/dist/authorizer-BVR2vPGA.js +125 -0
- package/dist/authorizer-DFP3gHv8.d.ts +82 -0
- package/dist/base64-B9Wlsdj7.js +42 -0
- package/dist/before-route-B23K2zYU.js +30 -0
- package/dist/better-result/index.d.ts +26 -18
- package/dist/better-result/index.js +13 -9
- package/dist/bind-DcXLU1ul.d.ts +76 -0
- package/dist/block-env-YfPmSNa1.js +32 -0
- package/dist/block-env-kFcaaJLM.d.ts +10 -0
- package/dist/block-events-BURaqwyp.js +96 -0
- package/dist/block-fields-Cwd4c8m-.js +139 -0
- package/dist/block-fields-DnXkMney.d.ts +58 -0
- package/dist/block-helpers-DwE32_gT.js +272 -0
- package/dist/block-helpers-DyA5BAW4.d.ts +43 -0
- package/dist/block-hooks-BadAniNI.d.ts +117 -0
- package/dist/block-hooks-C1r-R2r0.js +130 -0
- package/dist/block-transport-DBPhgF3W.d.ts +69 -0
- package/dist/block-transport-Ds0C2mUf.js +84 -0
- package/dist/blocks/access-requests/index.d.ts +21 -15
- package/dist/blocks/access-requests/index.js +11 -8
- package/dist/blocks/agents/index.d.ts +4 -4
- package/dist/blocks/agents/index.js +6 -6
- package/dist/blocks/ai-cache/index.d.ts +3 -3
- package/dist/blocks/ai-cache/index.js +2 -2
- package/dist/blocks/ai-chat/index.d.ts +10 -7
- package/dist/blocks/ai-chat/index.js +3 -3
- package/dist/blocks/ai-chat/react/index.d.ts +18 -9
- package/dist/blocks/ai-chat/react/index.js +8 -8
- package/dist/blocks/ai-chat/react/server.d.ts +12 -3
- package/dist/blocks/ai-chat/react/server.js +12 -3
- package/dist/blocks/ai-chat/solid/index.d.ts +3 -3
- package/dist/blocks/ai-chat/solid/index.js +2 -2
- package/dist/blocks/ai-chat/svelte/index.d.ts +3 -3
- package/dist/blocks/ai-chat/svelte/index.js +2 -2
- package/dist/blocks/ai-chat/vue/index.d.ts +3 -3
- package/dist/blocks/ai-chat/vue/index.js +2 -2
- package/dist/blocks/ai-files/index.d.ts +5 -5
- package/dist/blocks/ai-files/index.js +2 -2
- package/dist/blocks/ai-providers/index.d.ts +4 -4
- package/dist/blocks/ai-providers/index.js +8 -8
- package/dist/blocks/ai-tasks/index.d.ts +3 -3
- package/dist/blocks/ai-tasks/index.js +8 -8
- package/dist/blocks/announcements/index.d.ts +4 -4
- package/dist/blocks/announcements/index.js +4 -4
- package/dist/blocks/announcements/react/index.d.ts +12 -5
- package/dist/blocks/announcements/react/index.js +7 -7
- package/dist/blocks/announcements/react/server.d.ts +4 -1
- package/dist/blocks/announcements/react/server.js +4 -1
- package/dist/blocks/announcements/solid/index.d.ts +3 -3
- package/dist/blocks/announcements/solid/index.js +2 -2
- package/dist/blocks/announcements/svelte/index.d.ts +3 -3
- package/dist/blocks/announcements/svelte/index.js +2 -2
- package/dist/blocks/announcements/vue/index.d.ts +3 -3
- package/dist/blocks/announcements/vue/index.js +2 -2
- package/dist/blocks/api-keys/index.d.ts +11 -8
- package/dist/blocks/api-keys/index.js +7 -7
- package/dist/blocks/api-keys/react/index.d.ts +11 -8
- package/dist/blocks/api-keys/react/index.js +9 -9
- package/dist/blocks/api-keys/react/server.d.ts +1 -1
- package/dist/blocks/api-keys/solid/index.d.ts +3 -3
- package/dist/blocks/api-keys/solid/index.js +2 -2
- package/dist/blocks/api-keys/svelte/index.d.ts +3 -3
- package/dist/blocks/api-keys/svelte/index.js +2 -2
- package/dist/blocks/api-keys/vue/index.d.ts +3 -3
- package/dist/blocks/api-keys/vue/index.js +2 -2
- package/dist/blocks/approvals/index.d.ts +4 -4
- package/dist/blocks/approvals/index.js +11 -8
- package/dist/blocks/attachments/index.d.ts +4 -4
- package/dist/blocks/attachments/index.js +3 -3
- package/dist/blocks/audit/index.d.ts +14 -8
- package/dist/blocks/audit/index.js +9 -9
- package/dist/blocks/audit/react/index.d.ts +12 -7
- package/dist/blocks/audit/react/index.js +12 -10
- package/dist/blocks/audit/react/server.d.ts +1 -1
- package/dist/blocks/audit/solid/index.d.ts +3 -3
- package/dist/blocks/audit/solid/index.js +2 -2
- package/dist/blocks/audit/svelte/index.d.ts +3 -3
- package/dist/blocks/audit/svelte/index.js +2 -2
- package/dist/blocks/audit/vue/index.d.ts +3 -3
- package/dist/blocks/audit/vue/index.js +2 -2
- package/dist/blocks/billing/index.d.ts +83 -51
- package/dist/blocks/billing/index.js +30 -18
- package/dist/blocks/billing/react/index.d.ts +19 -9
- package/dist/blocks/billing/react/index.js +12 -8
- package/dist/blocks/billing/react/server.d.ts +5 -2
- package/dist/blocks/billing/react/server.js +4 -1
- package/dist/blocks/billing/solid/index.d.ts +3 -3
- package/dist/blocks/billing/solid/index.js +2 -2
- package/dist/blocks/billing/svelte/index.d.ts +3 -3
- package/dist/blocks/billing/svelte/index.js +2 -2
- package/dist/blocks/billing/vue/index.d.ts +3 -3
- package/dist/blocks/billing/vue/index.js +2 -2
- package/dist/blocks/bookings/index.d.ts +11 -8
- package/dist/blocks/bookings/index.js +3 -3
- package/dist/blocks/bookings/react/index.d.ts +8 -4
- package/dist/blocks/bookings/react/index.js +12 -8
- package/dist/blocks/bookings/react/server.d.ts +4 -1
- package/dist/blocks/bookings/react/server.js +4 -1
- package/dist/blocks/bookings/solid/index.d.ts +3 -3
- package/dist/blocks/bookings/solid/index.js +2 -2
- package/dist/blocks/bookings/svelte/index.d.ts +3 -3
- package/dist/blocks/bookings/svelte/index.js +2 -2
- package/dist/blocks/bookings/vue/index.d.ts +3 -3
- package/dist/blocks/bookings/vue/index.js +2 -2
- package/dist/blocks/bulk/index.d.ts +27 -12
- package/dist/blocks/bulk/index.js +4 -4
- package/dist/blocks/calendar/index.d.ts +4 -4
- package/dist/blocks/calendar/index.js +3 -3
- package/dist/blocks/calendar/react/index.d.ts +5 -5
- package/dist/blocks/calendar/react/index.js +8 -8
- package/dist/blocks/calendar/react/server.d.ts +4 -1
- package/dist/blocks/calendar/react/server.js +4 -1
- package/dist/blocks/calendar/solid/index.d.ts +3 -3
- package/dist/blocks/calendar/solid/index.js +2 -2
- package/dist/blocks/calendar/svelte/index.d.ts +3 -3
- package/dist/blocks/calendar/svelte/index.js +2 -2
- package/dist/blocks/calendar/vue/index.d.ts +3 -3
- package/dist/blocks/calendar/vue/index.js +2 -2
- package/dist/blocks/catalog/index.d.ts +48 -27
- package/dist/blocks/catalog/index.js +16 -13
- package/dist/blocks/collections/index.d.ts +26 -21
- package/dist/blocks/collections/index.js +10 -10
- package/dist/blocks/comments/index.d.ts +11 -11
- package/dist/blocks/comments/index.js +4 -4
- package/dist/blocks/comments/react/index.d.ts +13 -6
- package/dist/blocks/comments/react/index.js +13 -9
- package/dist/blocks/comments/react/server.d.ts +1 -1
- package/dist/blocks/comments/solid/index.d.ts +3 -3
- package/dist/blocks/comments/solid/index.js +2 -2
- package/dist/blocks/comments/svelte/index.d.ts +3 -3
- package/dist/blocks/comments/svelte/index.js +2 -2
- package/dist/blocks/comments/vue/index.d.ts +3 -3
- package/dist/blocks/comments/vue/index.js +2 -2
- package/dist/blocks/connectors/index.d.ts +4 -4
- package/dist/blocks/connectors/index.js +8 -8
- package/dist/blocks/custom-fields/index.d.ts +13 -10
- package/dist/blocks/custom-fields/index.js +6 -6
- package/dist/blocks/data-lifecycle/index.d.ts +75 -51
- package/dist/blocks/data-lifecycle/index.js +17 -11
- package/dist/blocks/deals/index.d.ts +16 -16
- package/dist/blocks/deals/index.js +14 -14
- package/dist/blocks/documents/index.d.ts +4 -4
- package/dist/blocks/documents/index.js +5 -5
- package/dist/blocks/domains/index.d.ts +35 -20
- package/dist/blocks/domains/index.js +9 -9
- package/dist/blocks/drive/index.d.ts +45 -28
- package/dist/blocks/drive/index.js +29 -17
- package/dist/blocks/employees/index.d.ts +26 -21
- package/dist/blocks/employees/index.js +16 -13
- package/dist/blocks/engagements/index.d.ts +26 -17
- package/dist/blocks/engagements/index.js +9 -9
- package/dist/blocks/entitlements/index.d.ts +20 -14
- package/dist/blocks/entitlements/index.js +3 -3
- package/dist/blocks/entitlements/react/index.d.ts +10 -7
- package/dist/blocks/entitlements/react/index.js +7 -7
- package/dist/blocks/entitlements/react/server.d.ts +4 -1
- package/dist/blocks/entitlements/react/server.js +4 -1
- package/dist/blocks/entitlements/solid/index.d.ts +3 -3
- package/dist/blocks/entitlements/solid/index.js +2 -2
- package/dist/blocks/entitlements/svelte/index.d.ts +3 -3
- package/dist/blocks/entitlements/svelte/index.js +2 -2
- package/dist/blocks/entitlements/vue/index.d.ts +3 -3
- package/dist/blocks/entitlements/vue/index.js +2 -2
- package/dist/blocks/flags/index.d.ts +20 -14
- package/dist/blocks/flags/index.js +9 -9
- package/dist/blocks/forms/index.d.ts +28 -16
- package/dist/blocks/forms/index.js +12 -9
- package/dist/blocks/forms/react/index.d.ts +9 -6
- package/dist/blocks/forms/react/index.js +10 -7
- package/dist/blocks/forms/react/server.d.ts +4 -1
- package/dist/blocks/forms/react/server.js +4 -1
- package/dist/blocks/forms/solid/index.d.ts +3 -3
- package/dist/blocks/forms/solid/index.js +2 -2
- package/dist/blocks/forms/svelte/index.d.ts +3 -3
- package/dist/blocks/forms/svelte/index.js +2 -2
- package/dist/blocks/forms/vue/index.d.ts +3 -3
- package/dist/blocks/forms/vue/index.js +2 -2
- package/dist/blocks/hiring/index.d.ts +13 -13
- package/dist/blocks/hiring/index.js +9 -9
- package/dist/blocks/identities/index.d.ts +38 -20
- package/dist/blocks/identities/index.js +16 -10
- package/dist/blocks/imports/index.d.ts +30 -25
- package/dist/blocks/imports/index.js +18 -18
- package/dist/blocks/inbox/index.d.ts +5 -5
- package/dist/blocks/inbox/index.js +7 -7
- package/dist/blocks/inbox/react/index.d.ts +2 -2
- package/dist/blocks/inbox/react/index.js +7 -7
- package/dist/blocks/inbox/react/server.d.ts +10 -4
- package/dist/blocks/inbox/react/server.js +8 -2
- package/dist/blocks/inbox/solid/index.d.ts +3 -3
- package/dist/blocks/inbox/solid/index.js +2 -2
- package/dist/blocks/inbox/svelte/index.d.ts +3 -3
- package/dist/blocks/inbox/svelte/index.js +2 -2
- package/dist/blocks/inbox/vue/index.d.ts +3 -3
- package/dist/blocks/inbox/vue/index.js +2 -2
- package/dist/blocks/index.d.ts +10 -10
- package/dist/blocks/index.js +41 -39
- package/dist/blocks/inventory/index.d.ts +36 -19
- package/dist/blocks/inventory/index.js +15 -9
- package/dist/blocks/invoices/index.d.ts +13 -13
- package/dist/blocks/invoices/index.js +11 -11
- package/dist/blocks/jobs/index.d.ts +123 -86
- package/dist/blocks/jobs/index.js +58 -47
- package/dist/blocks/knowledge/index.d.ts +3 -3
- package/dist/blocks/knowledge/index.js +2 -2
- package/dist/blocks/leave/index.d.ts +30 -15
- package/dist/blocks/leave/index.js +6 -6
- package/dist/blocks/memory/index.d.ts +4 -4
- package/dist/blocks/memory/index.js +7 -7
- package/dist/blocks/metrics/index.d.ts +36 -30
- package/dist/blocks/metrics/index.js +19 -19
- package/dist/blocks/mfa/index.d.ts +2 -2
- package/dist/blocks/mfa/index.js +1 -1
- package/dist/blocks/mfa/react/index.d.ts +7 -7
- package/dist/blocks/mfa/react/index.js +9 -9
- package/dist/blocks/mfa/react/server.d.ts +1 -1
- package/dist/blocks/mfa/react/server.js +1 -1
- package/dist/blocks/mfa/solid/index.d.ts +3 -3
- package/dist/blocks/mfa/solid/index.js +2 -2
- package/dist/blocks/mfa/svelte/index.d.ts +3 -3
- package/dist/blocks/mfa/svelte/index.js +2 -2
- package/dist/blocks/mfa/vue/index.d.ts +3 -3
- package/dist/blocks/mfa/vue/index.js +2 -2
- package/dist/blocks/notifications/index.d.ts +132 -103
- package/dist/blocks/notifications/index.js +61 -46
- package/dist/blocks/notifications/react/index.d.ts +3 -3
- package/dist/blocks/notifications/react/index.js +5 -5
- package/dist/blocks/notifications/react/server.d.ts +5 -2
- package/dist/blocks/notifications/react/server.js +4 -1
- package/dist/blocks/notifications/solid/index.d.ts +3 -3
- package/dist/blocks/notifications/solid/index.js +2 -2
- package/dist/blocks/notifications/svelte/index.d.ts +3 -3
- package/dist/blocks/notifications/svelte/index.js +2 -2
- package/dist/blocks/notifications/vue/index.d.ts +3 -3
- package/dist/blocks/notifications/vue/index.js +2 -2
- package/dist/blocks/number-sequences/index.d.ts +15 -12
- package/dist/blocks/number-sequences/index.js +7 -4
- package/dist/blocks/oauth-server/index.d.ts +42 -21
- package/dist/blocks/oauth-server/index.js +16 -13
- package/dist/blocks/onboarding/index.d.ts +3 -3
- package/dist/blocks/onboarding/index.js +3 -3
- package/dist/blocks/onboarding/react/index.d.ts +10 -5
- package/dist/blocks/onboarding/react/index.js +10 -8
- package/dist/blocks/onboarding/react/server.d.ts +5 -2
- package/dist/blocks/onboarding/react/server.js +4 -1
- package/dist/blocks/onboarding/solid/index.d.ts +3 -3
- package/dist/blocks/onboarding/solid/index.js +2 -2
- package/dist/blocks/onboarding/svelte/index.d.ts +3 -3
- package/dist/blocks/onboarding/svelte/index.js +2 -2
- package/dist/blocks/onboarding/vue/index.d.ts +3 -3
- package/dist/blocks/onboarding/vue/index.js +2 -2
- package/dist/blocks/orders/index.d.ts +57 -30
- package/dist/blocks/orders/index.js +26 -17
- package/dist/blocks/organizations/index.d.ts +5 -5
- package/dist/blocks/organizations/index.js +5 -27
- package/dist/blocks/organizations/react/index.d.ts +40 -21
- package/dist/blocks/organizations/react/index.js +5 -5
- package/dist/blocks/organizations/react/server.d.ts +13 -4
- package/dist/blocks/organizations/react/server.js +12 -3
- package/dist/blocks/organizations/solid/index.d.ts +3 -3
- package/dist/blocks/organizations/solid/index.js +2 -2
- package/dist/blocks/organizations/svelte/index.d.ts +3 -3
- package/dist/blocks/organizations/svelte/index.js +2 -2
- package/dist/blocks/organizations/vue/index.d.ts +3 -3
- package/dist/blocks/organizations/vue/index.js +2 -2
- package/dist/blocks/outbox/index.d.ts +4 -4
- package/dist/blocks/outbox/index.js +20 -16
- package/dist/blocks/parties/index.d.ts +29 -20
- package/dist/blocks/parties/index.js +12 -9
- package/dist/blocks/pipelines/index.d.ts +26 -17
- package/dist/blocks/pipelines/index.js +11 -11
- package/dist/blocks/profiles/index.d.ts +23 -14
- package/dist/blocks/profiles/index.js +5 -5
- package/dist/blocks/promotions/index.d.ts +34 -16
- package/dist/blocks/promotions/index.js +12 -9
- package/dist/blocks/push/index.d.ts +43 -25
- package/dist/blocks/push/index.js +16 -16
- package/dist/blocks/quotes/index.d.ts +15 -12
- package/dist/blocks/quotes/index.js +9 -9
- package/dist/blocks/rank/index.d.ts +12 -12
- package/dist/blocks/rank/index.js +3 -3
- package/dist/blocks/reactions/index.d.ts +4 -4
- package/dist/blocks/reactions/index.js +3 -3
- package/dist/blocks/reactions/react/index.d.ts +14 -4
- package/dist/blocks/reactions/react/index.js +9 -5
- package/dist/blocks/reactions/react/server.d.ts +4 -1
- package/dist/blocks/reactions/react/server.js +4 -1
- package/dist/blocks/reactions/solid/index.d.ts +3 -3
- package/dist/blocks/reactions/solid/index.js +2 -2
- package/dist/blocks/reactions/svelte/index.d.ts +3 -3
- package/dist/blocks/reactions/svelte/index.js +2 -2
- package/dist/blocks/reactions/vue/index.d.ts +3 -3
- package/dist/blocks/reactions/vue/index.js +2 -2
- package/dist/blocks/relations/index.d.ts +40 -23
- package/dist/blocks/relations/index.js +8 -9
- package/dist/blocks/reminders/index.d.ts +35 -26
- package/dist/blocks/reminders/index.js +20 -14
- package/dist/blocks/reviews/index.d.ts +32 -17
- package/dist/blocks/reviews/index.js +6 -6
- package/dist/blocks/rules/index.d.ts +26 -24
- package/dist/blocks/rules/index.js +10 -11
- package/dist/blocks/rules/react/index.d.ts +9 -5
- package/dist/blocks/rules/react/index.js +12 -8
- package/dist/blocks/rules/solid/index.d.ts +3 -3
- package/dist/blocks/rules/solid/index.js +2 -2
- package/dist/blocks/rules/svelte/index.d.ts +3 -3
- package/dist/blocks/rules/svelte/index.js +2 -2
- package/dist/blocks/rules/vue/index.d.ts +3 -3
- package/dist/blocks/rules/vue/index.js +2 -2
- package/dist/blocks/saved-views/index.d.ts +3 -3
- package/dist/blocks/saved-views/index.js +2 -2
- package/dist/blocks/saved-views/react/index.d.ts +14 -8
- package/dist/blocks/saved-views/react/index.js +11 -8
- package/dist/blocks/saved-views/react/server.d.ts +5 -2
- package/dist/blocks/saved-views/react/server.js +4 -1
- package/dist/blocks/saved-views/solid/index.d.ts +3 -3
- package/dist/blocks/saved-views/solid/index.js +2 -2
- package/dist/blocks/saved-views/svelte/index.d.ts +3 -3
- package/dist/blocks/saved-views/svelte/index.js +2 -2
- package/dist/blocks/saved-views/vue/index.d.ts +3 -3
- package/dist/blocks/saved-views/vue/index.js +2 -2
- package/dist/blocks/search/index.d.ts +12 -9
- package/dist/blocks/search/index.js +9 -9
- package/dist/blocks/search/react/index.d.ts +8 -5
- package/dist/blocks/search/react/index.js +6 -6
- package/dist/blocks/search/react/server.d.ts +5 -2
- package/dist/blocks/search/react/server.js +4 -1
- package/dist/blocks/search/solid/index.d.ts +3 -3
- package/dist/blocks/search/solid/index.js +2 -2
- package/dist/blocks/search/svelte/index.d.ts +3 -3
- package/dist/blocks/search/svelte/index.js +2 -2
- package/dist/blocks/search/vue/index.d.ts +3 -3
- package/dist/blocks/search/vue/index.js +2 -2
- package/dist/blocks/service-principals/index.d.ts +24 -18
- package/dist/blocks/service-principals/index.js +11 -8
- package/dist/blocks/sessions/index.d.ts +2 -2
- package/dist/blocks/sessions/index.js +1 -1
- package/dist/blocks/sessions/react/index.d.ts +10 -5
- package/dist/blocks/sessions/react/index.js +8 -6
- package/dist/blocks/sessions/react/server.d.ts +9 -3
- package/dist/blocks/sessions/react/server.js +8 -2
- package/dist/blocks/sessions/solid/index.d.ts +3 -3
- package/dist/blocks/sessions/solid/index.js +2 -2
- package/dist/blocks/sessions/svelte/index.d.ts +3 -3
- package/dist/blocks/sessions/svelte/index.js +2 -2
- package/dist/blocks/sessions/vue/index.d.ts +3 -3
- package/dist/blocks/sessions/vue/index.js +2 -2
- package/dist/blocks/settings/index.d.ts +6 -5
- package/dist/blocks/settings/index.js +6 -5
- package/dist/blocks/settings/react/index.d.ts +13 -7
- package/dist/blocks/settings/react/index.js +5 -5
- package/dist/blocks/settings/react/server.d.ts +5 -2
- package/dist/blocks/settings/react/server.js +4 -1
- package/dist/blocks/settings/solid/index.d.ts +3 -3
- package/dist/blocks/settings/solid/index.js +2 -2
- package/dist/blocks/settings/svelte/index.d.ts +3 -3
- package/dist/blocks/settings/svelte/index.js +2 -2
- package/dist/blocks/settings/vue/index.d.ts +3 -3
- package/dist/blocks/settings/vue/index.js +2 -2
- package/dist/blocks/share-links/index.d.ts +19 -13
- package/dist/blocks/share-links/index.js +4 -4
- package/dist/blocks/shared-signals/index.d.ts +82 -37
- package/dist/blocks/shared-signals/index.js +24 -18
- package/dist/blocks/signing-keys/index.d.ts +5 -5
- package/dist/blocks/signing-keys/index.js +15 -15
- package/dist/blocks/sla/index.d.ts +13 -13
- package/dist/blocks/sla/index.js +8 -8
- package/dist/blocks/sso/index.d.ts +35 -30
- package/dist/blocks/sso/index.js +31 -17
- package/dist/blocks/state-machine/index.d.ts +22 -13
- package/dist/blocks/state-machine/index.js +3 -3
- package/dist/blocks/tags/index.d.ts +3 -3
- package/dist/blocks/tags/index.js +3 -3
- package/dist/blocks/tags/react/index.d.ts +15 -7
- package/dist/blocks/tags/react/index.js +15 -10
- package/dist/blocks/tags/react/server.d.ts +1 -1
- package/dist/blocks/tags/solid/index.d.ts +3 -3
- package/dist/blocks/tags/solid/index.js +2 -2
- package/dist/blocks/tags/svelte/index.d.ts +3 -3
- package/dist/blocks/tags/svelte/index.js +2 -2
- package/dist/blocks/tags/vue/index.d.ts +3 -3
- package/dist/blocks/tags/vue/index.js +2 -2
- package/dist/blocks/targets/index.d.ts +13 -13
- package/dist/blocks/targets/index.js +7 -7
- package/dist/blocks/teams/index.d.ts +9 -9
- package/dist/blocks/teams/index.js +4 -4
- package/dist/blocks/templates/index.d.ts +67 -51
- package/dist/blocks/templates/index.js +22 -23
- package/dist/blocks/time-tracking/index.d.ts +32 -22
- package/dist/blocks/time-tracking/index.js +19 -16
- package/dist/blocks/trash/index.d.ts +13 -11
- package/dist/blocks/trash/index.js +5 -5
- package/dist/blocks/undo/index.d.ts +4 -4
- package/dist/blocks/undo/index.js +3 -3
- package/dist/blocks/undo/react/index.d.ts +3 -3
- package/dist/blocks/undo/react/index.js +4 -4
- package/dist/blocks/undo/react/server.d.ts +5 -2
- package/dist/blocks/undo/react/server.js +4 -1
- package/dist/blocks/undo/solid/index.d.ts +3 -3
- package/dist/blocks/undo/solid/index.js +2 -2
- package/dist/blocks/undo/svelte/index.d.ts +3 -3
- package/dist/blocks/undo/svelte/index.js +2 -2
- package/dist/blocks/undo/vue/index.d.ts +3 -3
- package/dist/blocks/undo/vue/index.js +2 -2
- package/dist/blocks/usage/index.d.ts +5 -5
- package/dist/blocks/usage/index.js +3 -3
- package/dist/blocks/usage/react/index.d.ts +12 -6
- package/dist/blocks/usage/react/index.js +8 -8
- package/dist/blocks/usage/react/server.d.ts +1 -1
- package/dist/blocks/usage/solid/index.d.ts +3 -3
- package/dist/blocks/usage/solid/index.js +2 -2
- package/dist/blocks/usage/svelte/index.d.ts +3 -3
- package/dist/blocks/usage/svelte/index.js +2 -2
- package/dist/blocks/usage/vue/index.d.ts +3 -3
- package/dist/blocks/usage/vue/index.js +2 -2
- package/dist/blocks/vercel-marketplace/index.d.ts +252 -17
- package/dist/blocks/vercel-marketplace/index.js +489 -56
- package/dist/blocks/versions/index.d.ts +24 -21
- package/dist/blocks/versions/index.js +14 -16
- package/dist/blocks/waitlist/index.d.ts +31 -18
- package/dist/blocks/waitlist/index.js +10 -7
- package/dist/blocks/webhooks/index.d.ts +126 -89
- package/dist/blocks/webhooks/index.js +71 -60
- package/dist/blocks/work-items/index.d.ts +18 -16
- package/dist/blocks/work-items/index.js +11 -12
- package/dist/blocks/workflow-builder/index.d.ts +15 -13
- package/dist/blocks/workflow-builder/index.js +10 -7
- package/dist/blocks/workflow-builder/react/index.d.ts +4 -4
- package/dist/blocks/workflow-builder/react/index.js +8 -8
- package/dist/blocks/workflow-builder/react/server.d.ts +8 -2
- package/dist/blocks/workflow-builder/react/server.js +8 -2
- package/dist/blocks/workflow-builder/solid/index.d.ts +3 -3
- package/dist/blocks/workflow-builder/solid/index.js +2 -2
- package/dist/blocks/workflow-builder/svelte/index.d.ts +3 -3
- package/dist/blocks/workflow-builder/svelte/index.js +2 -2
- package/dist/blocks/workflow-builder/vue/index.d.ts +3 -3
- package/dist/blocks/workflow-builder/vue/index.js +2 -2
- package/dist/blocks/workflows/index.d.ts +5 -5
- package/dist/blocks/workflows/index.js +4 -4
- package/dist/blocks/workflows/react/index.d.ts +13 -6
- package/dist/blocks/workflows/react/index.js +7 -7
- package/dist/blocks/workflows/react/server.d.ts +8 -2
- package/dist/blocks/workflows/react/server.js +8 -2
- package/dist/blocks/workflows/solid/index.d.ts +3 -3
- package/dist/blocks/workflows/solid/index.js +2 -2
- package/dist/blocks/workflows/svelte/index.d.ts +3 -3
- package/dist/blocks/workflows/svelte/index.js +2 -2
- package/dist/blocks/workflows/vue/index.d.ts +3 -3
- package/dist/blocks/workflows/vue/index.js +2 -2
- package/dist/blocks-CR3vCYhj.js +88 -0
- package/dist/bookings-DJflcGqs.js +184 -0
- package/dist/bucket-DBay-ICp.d.ts +667 -0
- package/dist/build-DxzJf79X.js +1839 -0
- package/dist/build-UqJeGtsH.js +703 -0
- package/dist/calendar-DvbYFkrh.js +801 -0
- package/dist/channel-BjvGO39m.d.ts +77 -0
- package/dist/channels-CfcFPuo_.js +114 -0
- package/dist/chat-sdk/index.d.ts +154 -78
- package/dist/chat-sdk/index.js +57 -39
- package/dist/chat-sdk/react/index.d.ts +2 -2
- package/dist/chat-sdk/react/server.d.ts +2 -2
- package/dist/claims-Bp9My7XP.js +88 -0
- package/dist/claims-T8TWZ53E.js +63 -0
- package/dist/cli/add-BRjL7LuG.js +1 -0
- package/dist/cli/add-Cf0uxfZ2.js +672 -0
- package/dist/cli/add-DPfdDRq7.js +75 -0
- package/dist/cli/adopt-B28iUeGg.js +1 -0
- package/dist/cli/adopt-C0VugVMu.js +421 -0
- package/dist/cli/agent-CbuPvI2x.js +185 -0
- package/dist/cli/apply-BlxtZPxe.js +329 -0
- package/dist/cli/bin.js +3 -3
- package/dist/cli/blocks-CHQ7K8Yz.js +1 -0
- package/dist/cli/blocks-D3tsq-mR.js +124 -0
- package/dist/cli/cache-DdgzhoaL.js +516 -0
- package/dist/cli/catalog-DwTUdJaQ.js +188 -0
- package/dist/cli/codemod-Dz4R-tVY.js +1127 -0
- package/dist/cli/command-33pu13LT.js +963 -0
- package/dist/cli/completion-6M6Hr8TL.js +211 -0
- package/dist/cli/completion-Bqu8yq0q.js +1 -0
- package/dist/cli/completion-Ddr3yqd3.js +30 -0
- package/dist/cli/config-2qlSTi2o.js +1503 -0
- package/dist/cli/config-B31tIvAl.js +42 -0
- package/dist/cli/config-DVksOjSr.js +1 -0
- package/dist/cli/config-edit-D46H0UHp.js +613 -0
- package/dist/cli/db-CQCLx7cx.js +78 -0
- package/dist/cli/db-D8iId4R8.js +473 -0
- package/dist/cli/design-edit-B2aBiarJ.js +205 -0
- package/dist/cli/detect-D9JaAX20.js +84 -0
- package/dist/cli/doctor-pIek4vIO.js +3897 -0
- package/dist/cli/emit-CJKf47Bi.js +1078 -0
- package/dist/cli/env-BrLZfqsL.js +143 -0
- package/dist/cli/env-C-Bl6Awn.js +1 -0
- package/dist/cli/env-DMgjB_4y.js +1114 -0
- package/dist/cli/env-cbCEa79W.js +1 -0
- package/dist/cli/errors-BTe6A15O.js +98 -0
- package/dist/cli/exec--Q1ZEWUW.js +463 -0
- package/dist/cli/files-C5JfVnj5.js +972 -0
- package/dist/cli/fresh-import-DzgsGHkX.js +40 -0
- package/dist/cli/gen-DquZzY5a.js +307 -0
- package/dist/cli/index.d.ts +239 -175
- package/dist/cli/index.js +16 -16
- package/dist/cli/init-Dd-UdrE0.js +397 -0
- package/dist/cli/introspect-IMQCji2l.js +51 -0
- package/dist/cli/io-DH1kcmmP.js +37 -0
- package/dist/cli/keys-iJs_1WT8.js +106 -0
- package/dist/cli/live-BfAO5YRX.js +344 -0
- package/dist/cli/mcp-D8Az0FNn.js +240 -0
- package/dist/cli/metadata-CTStQPfV.js +144 -0
- package/dist/cli/migration-safety-Dg1lxomi.js +305 -0
- package/dist/cli/module-migration-CbX-jRhV.js +606 -0
- package/dist/cli/moved-CdNtCf4t.js +161 -0
- package/dist/cli/parse-CRZLku1b.js +182 -0
- package/dist/cli/preset-DEvwDc7U.js +129 -0
- package/dist/cli/prompts-jqnr94b9.js +1140 -0
- package/dist/cli/redact-KGAk2Ul9.js +38 -0
- package/dist/cli/run-BXhJoghZ.js +1602 -0
- package/dist/cli/run-DdxNRTr0.js +63 -0
- package/dist/cli/run-dTu_PD4I.js +711 -0
- package/dist/cli/scaffold-Bx3bcy2R.js +901 -0
- package/dist/cli/scaffold-mbNAQE19.js +1 -0
- package/dist/cli/seed-CLseQdXQ.js +188 -0
- package/dist/cli/seed-DSHSUsYy.js +1 -0
- package/dist/cli/shared-CAdIkTR7.js +151 -0
- package/dist/cli/skills-Bz4INB8f.js +121 -0
- package/dist/cli/snapshot-GfdB9Cjl.js +350 -0
- package/dist/cli/source-args-Dy3j1-H-.js +59 -0
- package/dist/cli/spec-BfEK0_04.js +1 -0
- package/dist/cli/spec-DXTdodlO.js +7534 -0
- package/dist/cli/sql-BUhpAvrW.js +2 -0
- package/dist/cli/sql-CLbWk3Yb.js +332 -0
- package/dist/cli/stack-_F_JhllX.js +135 -0
- package/dist/cli/stack-env-6hS-WEmh.js +93 -0
- package/dist/cli/stack-status-B_Ipd_-z.js +46 -0
- package/dist/cli/stacks-BYlQ96WS.js +232 -0
- package/dist/cli/style-Bm2X5JrN.js +35 -0
- package/dist/cli/supabase-toml-CncmQbO0.js +1164 -0
- package/dist/cli/sync-BBzNO-v9.js +91 -0
- package/dist/cli/topics-BpdnYmWb.js +30 -0
- package/dist/cli/typegen-F9GEjpvD.js +502 -0
- package/dist/cli/validate-B3lF3-jB.js +7522 -0
- package/dist/cli/version-DiwcIKOL.js +4 -0
- package/dist/cli/write-DZKk5rSF.js +201 -0
- package/dist/client/index.d.ts +6 -6
- package/dist/client/index.js +16 -11
- package/dist/client/native/index.d.ts +87 -53
- package/dist/client/native/index.js +65 -43
- package/dist/client--tyFmxDT.js +52 -0
- package/dist/client-0qFNkNhT.js +1060 -0
- package/dist/client-2z1aHG57.d.ts +475 -0
- package/dist/client-5IVhjmtl.d.ts +74 -0
- package/dist/client-B3WBilR2.d.ts +69 -0
- package/dist/client-B4JPQgf-.d.ts +165 -0
- package/dist/client-BAYh7P2h.js +211 -0
- package/dist/client-BKGVUgo7.js +380 -0
- package/dist/client-BNaOcfeH.js +58 -0
- package/dist/client-BOuaQA0h.js +173 -0
- package/dist/client-BP-8vn9G.d.ts +37 -0
- package/dist/client-BU5Yd0yO.d.ts +103 -0
- package/dist/client-Bb_Pj9wL.js +137 -0
- package/dist/client-BkH-Vh3s.d.ts +112 -0
- package/dist/client-BsfsRHae.d.ts +136 -0
- package/dist/client-Bta7yl1C.d.ts +451 -0
- package/dist/client-BwKXlohx.js +121 -0
- package/dist/client-C1zOmnS8.js +89 -0
- package/dist/client-CMqO1gCn.d.ts +64 -0
- package/dist/client-CPirbPPi.js +85 -0
- package/dist/client-CQPB-VJx.d.ts +110 -0
- package/dist/client-CXbP_p02.d.ts +156 -0
- package/dist/client-C_S9avzV.d.ts +420 -0
- package/dist/client-Cb1g45Hc.js +99 -0
- package/dist/client-CebKlRU7.js +157 -0
- package/dist/client-Ch-dDfTB.js +437 -0
- package/dist/client-CuFD4o56.d.ts +111 -0
- package/dist/client-D2y_CfhU.d.ts +137 -0
- package/dist/client-DAcVF-YJ.js +134 -0
- package/dist/client-DCuE1rFm.js +441 -0
- package/dist/client-DD02cst6.d.ts +245 -0
- package/dist/client-DD3EcytK.js +65 -0
- package/dist/client-DEE57s9m.d.ts +132 -0
- package/dist/client-DScMvaty.js +38 -0
- package/dist/client-DVRFa59w.d.ts +309 -0
- package/dist/client-DXb1Nmr3.js +111 -0
- package/dist/client-DkI0oyR7.js +76 -0
- package/dist/client-DkQcRKhm.js +67 -0
- package/dist/client-DoXBX3vS.d.ts +116 -0
- package/dist/client-Dsuy9wfA.d.ts +59 -0
- package/dist/client-EQvEzUQg.d.ts +276 -0
- package/dist/client-G7NGXZKe.d.ts +43 -0
- package/dist/client-OhTiAol1.js +213 -0
- package/dist/client-Wt19DaEb.js +291 -0
- package/dist/client-Y-kaHabc.d.ts +46 -0
- package/dist/client-YASsOslj.js +321 -0
- package/dist/client-Y_HnZGF4.js +51 -0
- package/dist/client-_mL998Gl.js +129 -0
- package/dist/client-i_u1e0Kf.d.ts +144 -0
- package/dist/client-kRvHKAKS.js +60 -0
- package/dist/client-nieeGXdg.d.ts +178 -0
- package/dist/client-pxXoQOdC.js +40 -0
- package/dist/client-ysVOUgxM.d.ts +54 -0
- package/dist/clone-CkG0-hlI.js +33 -0
- package/dist/cloud-event-CidL9jiw.d.ts +64 -0
- package/dist/cloud-event-XsM53POL.js +63 -0
- package/dist/codecs-Du_zE1xu.js +358 -0
- package/dist/codecs-WHpM3Byy.d.ts +221 -0
- package/dist/codegen-DGtOsqz9.d.ts +1809 -0
- package/dist/comments-Ceqo9bwE.js +230 -0
- package/dist/commerce/index.d.ts +38 -33
- package/dist/commerce/index.js +38 -28
- package/dist/compiler-DCotQWcs.d.ts +14 -0
- package/dist/compose-VBQL7zIO.js +53 -0
- package/dist/composite-BgBzdYP-.d.ts +82 -0
- package/dist/composite-BgSdL5tk.js +130 -0
- package/dist/config/index.d.ts +6 -6
- package/dist/config/index.js +7 -7
- package/dist/config-V6HMvce5.js +3930 -0
- package/dist/config-xUf0dj0t.js +562 -0
- package/dist/connector-CKcTPJRV.d.ts +107 -0
- package/dist/connectors-CgWuPQks.d.ts +147 -0
- package/dist/context-CCz6ZgyI.js +19 -0
- package/dist/context-CMxVnPMY.js +9 -0
- package/dist/context-CrojkPNC.js +41 -0
- package/dist/context-DvBEhsXX.d.ts +403 -0
- package/dist/controller-BEliOBOv.js +79 -0
- package/dist/controller-lWRcKqCl.d.ts +52 -0
- package/dist/create/index.d.ts +309 -166
- package/dist/create/index.js +1376 -1156
- package/dist/create/lite/index.d.ts +19 -12
- package/dist/create/lite/index.js +10 -9
- package/dist/create/oauth/index.d.ts +2 -0
- package/dist/create/oauth/index.js +101 -0
- package/dist/create/supabase/index.d.ts +13 -34
- package/dist/create/supabase/index.js +16 -84
- package/dist/credentials/index.d.ts +12 -12
- package/dist/credentials/index.js +13 -13
- package/dist/cron-CI1kP-t5.js +148 -0
- package/dist/cron-route-BbVtwXZz.js +24 -0
- package/dist/csv-2rXGPNtP.js +89 -0
- package/dist/csv-DhHQS2x_.d.ts +28 -0
- package/dist/define-D0LSXmUP.d.ts +1117 -0
- package/dist/define-DwZ_LQVO.js +2011 -0
- package/dist/define-block-MyM4lH42.d.ts +281 -0
- package/dist/delegation-DeAJehLk.js +146 -0
- package/dist/delivery-Bm0jxmzI.js +29 -0
- package/dist/delivery-n6lZGuGx.d.ts +71 -0
- package/dist/documents-BijGGIjr.d.ts +99 -0
- package/dist/edge/index.d.ts +65 -38
- package/dist/edge/index.js +20 -17
- package/dist/elysia/index.d.ts +16 -14
- package/dist/elysia/index.js +11 -9
- package/dist/email-tt2QqiSc.d.ts +42 -0
- package/dist/embeddings-DRGIc8ti.js +128 -0
- package/dist/embeddings-Deusi99x.d.ts +78 -0
- package/dist/ended-D_Twxl8v.d.ts +76 -0
- package/dist/entitlements-CMGsO4gL.d.ts +54 -0
- package/dist/entitlements-_tw0V3BY.js +45 -0
- package/dist/env/index.d.ts +1 -1
- package/dist/env/index.js +16 -4
- package/dist/envelope-BDShQQ7-.js +90 -0
- package/dist/errors-Cq72lONT.js +44 -0
- package/dist/errors-D7u24ZJH.js +321 -0
- package/dist/escape-like-DuKupGUV.d.ts +15 -0
- package/dist/eve/index.d.ts +40 -22
- package/dist/eve/index.js +34 -25
- package/dist/eve-dWNqpd9Z.d.ts +157 -0
- package/dist/event-calendar-E6AI-dgg.d.ts +217 -0
- package/dist/event-map-CtPFhcOp.js +19 -0
- package/dist/events/index.d.ts +3 -3
- package/dist/events/index.js +10 -10
- package/dist/events-D6IZ5CE8.js +82 -0
- package/dist/events-DhGgwqQA.d.ts +842 -0
- package/dist/events-SqJLbb8q.js +24 -0
- package/dist/executor-C29668fO.d.ts +281 -0
- package/dist/executor-C5uyGttm.js +207 -0
- package/dist/executor-Cy1nk4MZ.d.ts +104 -0
- package/dist/executor-DK2F9Zis.js +746 -0
- package/dist/executor-DXfgDsKd.d.ts +37 -0
- package/dist/executor-D_viYkhf.d.ts +179 -0
- package/dist/executor-QtVn0axs.js +147 -0
- package/dist/expo/index.d.ts +37 -26
- package/dist/expo/index.js +17 -14
- package/dist/expo-sqlite/index.d.ts +20 -17
- package/dist/expo-sqlite/index.js +19 -13
- package/dist/field-errors-CKEqR38q.d.ts +119 -0
- package/dist/field-formats-BX2FqLle.d.ts +39 -0
- package/dist/field-formats-C6QKA3UR.js +102 -0
- package/dist/filter-evaluate-CRDXv0Dl.js +217 -0
- package/dist/filter-evaluate-CSWhzYWN.d.ts +37 -0
- package/dist/filter-query-C7qgRYYv.d.ts +133 -0
- package/dist/filter-query-D4ZSwbcJ.js +524 -0
- package/dist/flags-C--SBMT9.js +279 -0
- package/dist/flags-CJFDNAvL.d.ts +246 -0
- package/dist/flags-sdk/index.d.ts +13 -13
- package/dist/flags-sdk/index.js +18 -15
- package/dist/form-definition-BjeElHsB.js +311 -0
- package/dist/form-definition-DcVnFzl4.d.ts +95 -0
- package/dist/format-AYHceC2m.d.ts +79 -0
- package/dist/framework-BpEnOfAo.js +57 -0
- package/dist/framework-CMeAuJts.d.ts +41 -0
- package/dist/function-contract-4vfi93Y5.d.ts +27 -0
- package/dist/function-contract-pEmsaUIf.js +8 -0
- package/dist/gateway-Dar9C0uP.d.ts +115 -0
- package/dist/gateway-options-BlVCqgb8.d.ts +29 -0
- package/dist/gateway-options-Cl74B7k6.js +27 -0
- package/dist/graph-B4eubUQG.js +365 -0
- package/dist/h3/index.d.ts +19 -12
- package/dist/h3/index.js +15 -11
- package/dist/h3/v1/index.d.ts +34 -24
- package/dist/h3/v1/index.js +23 -19
- package/dist/hmac-B3CTTlfv.js +23 -0
- package/dist/hono/index.d.ts +54 -36
- package/dist/hono/index.js +18 -18
- package/dist/http-AkLjqOuB.js +28 -0
- package/dist/http-BjjojWg3.js +40 -0
- package/dist/http-DzbloBR-.js +141 -0
- package/dist/image-url-_d7xYsXK.js +84 -0
- package/dist/impersonation-DFfDVJHk.js +62 -0
- package/dist/impersonation-YTa9dZUv.d.ts +28 -0
- package/dist/inbox-CLsIrPXs.d.ts +417 -0
- package/dist/index-B5XcM3VY.d.ts +230 -0
- package/dist/index-B5dVVZtW.d.ts +142 -0
- package/dist/index-Brm8I8iZ.d.ts +232 -0
- package/dist/index-C7-2ZS9f.d.ts +127 -0
- package/dist/index-CE0p3st5.d.ts +227 -0
- package/dist/index-CcpGT2GI.d.ts +151 -0
- package/dist/index-CrAKHNJF.d.ts +287 -0
- package/dist/index-DLjs7j_z.d.ts +61 -0
- package/dist/index-DbyDZZlc.d.ts +53 -0
- package/dist/index-DdZcWH6q.d.ts +820 -0
- package/dist/index-Dh5ZFCtu.d.ts +61 -0
- package/dist/index-NRMMhhEi.d.ts +104 -0
- package/dist/index-PADpaDku.d.ts +447 -0
- package/dist/index-X2fkPUwb.d.ts +51 -0
- package/dist/index-eoAU_QaY.d.ts +357 -0
- package/dist/index.d.ts +34 -23
- package/dist/index.js +22 -18
- package/dist/invalidate-BLiBFbLy.d.ts +19 -0
- package/dist/iso4217-B-durg_y.js +176 -0
- package/dist/json-DaByVJpw.js +22 -0
- package/dist/json-schema-Bu4YCRbZ.js +551 -0
- package/dist/jwks-cache-DbgNmSgV.js +49 -0
- package/dist/jws-D0toeQlA.d.ts +66 -0
- package/dist/jws-DOgHJKHb.js +205 -0
- package/dist/kit-BeXTrlZn.js +127 -0
- package/dist/kit-LeQGMzLH.d.ts +94 -0
- package/dist/knowledge-Bx_qehoZ.js +272 -0
- package/dist/knowledge-CYdNJasZ.d.ts +202 -0
- package/dist/lint/index.d.ts +6 -6
- package/dist/lint/index.js +9 -6
- package/dist/list/index.d.ts +3 -3
- package/dist/list/index.js +3 -3
- package/dist/list-query-CuS1w2Af.js +559 -0
- package/dist/list-query-Dx5cAqG6.d.ts +223 -0
- package/dist/live-CZtRMh62.js +246 -0
- package/dist/management-wtecfrNf.d.ts +57 -0
- package/dist/mcp/index.d.ts +70 -42
- package/dist/mcp/index.js +53 -45
- package/dist/mcp/sdk/index.d.ts +37 -25
- package/dist/mcp/sdk/index.js +16 -13
- package/dist/message-Bg4TKA12.d.ts +99 -0
- package/dist/messages-Bd5-5ZjP.js +492 -0
- package/dist/metric-definition-EAYI1r2n.d.ts +69 -0
- package/dist/mfa-Dt8AdWht.d.ts +36 -0
- package/dist/model-Btl8X9cs.d.ts +326 -0
- package/dist/model-messages-BWyXXA4s.js +206 -0
- package/dist/model-messages-DrR4lZ_c.d.ts +34 -0
- package/dist/money-BNRdJQzA.d.ts +91 -0
- package/dist/money-BZl985O-.js +197 -0
- package/dist/money-codec-BdnIiFFX.js +41 -0
- package/dist/nestjs/index.d.ts +32 -17
- package/dist/nestjs/index.js +27 -18
- package/dist/next/client/index.d.ts +8 -7
- package/dist/next/client/index.js +8 -7
- package/dist/next/image/index.d.ts +8 -6
- package/dist/next/image/index.js +7 -5
- package/dist/next/index.d.ts +142 -110
- package/dist/next/index.js +57 -42
- package/dist/node/index.d.ts +3 -3
- package/dist/node/index.js +33 -23
- package/dist/node-headers-BPtMP4_V.d.ts +27 -0
- package/dist/nuxt/index.d.ts +7 -6
- package/dist/nuxt/index.js +7 -6
- package/dist/onboarding-DjXV4rgO.js +68 -0
- package/dist/openapi/index.d.ts +3 -3
- package/dist/openapi/index.js +10 -7
- package/dist/operations-Cc27HkTG.d.ts +6 -0
- package/dist/operations-DVHRHvv6.js +29 -0
- package/dist/optional-peer-C1NbBRJm.js +32 -0
- package/dist/options-CIf3xni7.d.ts +52 -0
- package/dist/organizations-R98kfFwF.js +401 -0
- package/dist/orpc/index.d.ts +50 -37
- package/dist/orpc/index.js +22 -18
- package/dist/otel/index.d.ts +19 -16
- package/dist/otel/index.js +22 -19
- package/dist/outbox-Bsk-HJnq.d.ts +199 -0
- package/dist/overlay/index.d.ts +71 -55
- package/dist/overlay/index.js +48 -41
- package/dist/payments-6uuergov.js +16 -0
- package/dist/pg-error-B5QLDcbG.js +26 -0
- package/dist/plugin-D9bYbYli.js +45 -0
- package/dist/plugin-DouW0Kvg.d.ts +203 -0
- package/dist/plugins/actor/index.d.ts +9 -6
- package/dist/plugins/actor/index.js +6 -6
- package/dist/plugins/rules/index.d.ts +15 -15
- package/dist/plugins/rules/index.js +12 -6
- package/dist/plugins/soft-delete/index.d.ts +7 -7
- package/dist/plugins/soft-delete/index.js +7 -7
- package/dist/plugins/tenant/index.d.ts +16 -11
- package/dist/plugins/tenant/index.js +8 -9
- package/dist/plugins/timestamps/index.d.ts +3 -3
- package/dist/plugins/timestamps/index.js +4 -4
- package/dist/plugins/validation/index.d.ts +4 -4
- package/dist/plugins/validation/index.js +4 -4
- package/dist/pool-Bu8zXGzI.d.ts +123 -0
- package/dist/pool-errors-DOZ3oDeS.js +27 -0
- package/dist/ports-BltcWsHf.d.ts +312 -0
- package/dist/ports-CM3aG3zn.js +137 -0
- package/dist/ports-n3ZWSS_I.d.ts +89 -0
- package/dist/postgres/index.d.ts +15 -15
- package/dist/postgres/index.js +14 -8
- package/dist/postgrest-DGjrW4sK.d.ts +53 -0
- package/dist/powersync/index.d.ts +12 -13
- package/dist/powersync/index.js +18 -19
- package/dist/powersync/react/index.d.ts +13 -12
- package/dist/powersync/react/index.js +15 -11
- package/dist/preset/index.d.ts +4 -4
- package/dist/preset/index.js +4 -4
- package/dist/preset-HNFqCWaD.js +838 -0
- package/dist/problem-D0KDiYPk.js +162 -0
- package/dist/problem-D_DEBfMn.d.ts +79 -0
- package/dist/provider-BhIkKBOh.js +57 -0
- package/dist/provider-Dmsbl8ug.d.ts +112 -0
- package/dist/push-token-8lvtOEv4.d.ts +24 -0
- package/dist/query/index.d.ts +3 -3
- package/dist/query/index.js +2 -2
- package/dist/query-DgPYlU82.js +311 -0
- package/dist/rank-result-C6vsw27N.js +18 -0
- package/dist/rank-result-DHflCNwo.d.ts +14 -0
- package/dist/rate-limit-B7N1ZGl6.d.ts +50 -0
- package/dist/rate-limit-CXpPm4_l.js +49 -0
- package/dist/rate-limit-CpTD_WHm.js +328 -0
- package/dist/ratelimit-headers-kEcXyO3H.js +62 -0
- package/dist/react/index.d.ts +11 -11
- package/dist/react/index.js +4 -4
- package/dist/react/native/index.d.ts +36 -21
- package/dist/react/native/index.js +32 -20
- package/dist/react/server.d.ts +50 -21
- package/dist/react/server.js +42 -13
- package/dist/react/session.d.ts +9 -7
- package/dist/react/session.js +7 -5
- package/dist/react-BKCnIuZs.js +79 -0
- package/dist/react-controller-CKSdtJ10.js +43 -0
- package/dist/react-env-CodKZgPk.js +16 -0
- package/dist/react-router/index.d.ts +30 -23
- package/dist/react-router/index.js +14 -13
- package/dist/react-uvu_KcVY.js +599 -0
- package/dist/read-set-DP6fm21F.js +316 -0
- package/dist/realtime/index.d.ts +7 -7
- package/dist/realtime/index.js +4 -4
- package/dist/realtime-status-BhNkb-Ow.d.ts +8 -0
- package/dist/realtime-status-asHvhiOh.js +11 -0
- package/dist/refusal-BEyNVFy7.d.ts +32 -0
- package/dist/refusal-Ce2p81VW.js +64 -0
- package/dist/resolve-D57oDWNr.d.ts +289 -0
- package/dist/resolve-sy3_Gz0i.js +892 -0
- package/dist/resource-BRRU-A7j.js +91 -0
- package/dist/resource-BVvIiuX_.js +469 -0
- package/dist/resource-DxQOPkZ5.d.ts +115 -0
- package/dist/resource-execute-BbjuiXwD.d.ts +15 -0
- package/dist/resource-schemas-up6bKOUi.js +82 -0
- package/dist/resource-types-NXau9LJE.d.ts +153 -0
- package/dist/resources-CIi7sw1T.js +64 -0
- package/dist/resources-CZ60Vqwq.d.ts +7 -0
- package/dist/respond-DjEmE_DN.js +100 -0
- package/dist/respond-QW-f1yio.d.ts +101 -0
- package/dist/result-DIT_qp4G.js +146 -0
- package/dist/result-mijqfoJN.d.ts +346 -0
- package/dist/rrule-CesB9Rxd.js +290 -0
- package/dist/rules-D75V7dAE.js +286 -0
- package/dist/run-watch-B-LoK5m1.js +53 -0
- package/dist/runtime-CoKxZibd.js +45 -0
- package/dist/sales-lines-9HsX89aO.d.ts +28 -0
- package/dist/sales-lines-DgXeOEar.js +41 -0
- package/dist/sales-shared-CjXsy0NJ.js +22 -0
- package/dist/search-9hoZ8rN1.js +106 -0
- package/dist/search-Cn_DGluL.js +9 -0
- package/dist/server/index.d.ts +154 -109
- package/dist/server/index.js +49 -40
- package/dist/server-types-D_cQ6OxZ.d.ts +809 -0
- package/dist/session-DNRYXIOU.d.ts +97 -0
- package/dist/settings-DzQtMwfl.js +93 -0
- package/dist/shared-Bf-I13Ht.js +91 -0
- package/dist/shared-C80IHf4B.js +60 -0
- package/dist/shared-CRRfQAKG.d.ts +11 -0
- package/dist/shared-D11SWNLx.js +17 -0
- package/dist/sign-in-B_QJ2u62.js +386 -0
- package/dist/sign-in-D54FLMQy.d.ts +55 -0
- package/dist/signatures-CzqfLlfV.d.ts +43 -0
- package/dist/signatures-D8IoN3Rw.js +145 -0
- package/dist/signers-BuVQKDfK.d.ts +390 -0
- package/dist/signing-keys-i2Rsll6L.d.ts +119 -0
- package/dist/solid/index.d.ts +50 -23
- package/dist/solid/index.js +35 -14
- package/dist/solid-controller-7TxGaJNy.js +33 -0
- package/dist/solid-controller-BnF3ovwV.d.ts +11 -0
- package/dist/solid-start/index.d.ts +22 -18
- package/dist/solid-start/index.js +9 -9
- package/dist/spec/index.d.ts +39 -25
- package/dist/spec/index.js +26 -21
- package/dist/spec-pins-CZ2CL8YZ.d.ts +120 -0
- package/dist/spec-pins-D3Tm6HJi.js +60 -0
- package/dist/sql/index.d.ts +5 -5
- package/dist/sql/index.js +5 -5
- package/dist/sql-CQIikLnQ.js +421 -0
- package/dist/sql-frpIs51D.js +89308 -0
- package/dist/sso-C86TPpZr.js +217 -0
- package/dist/sso-D_am-gBz.d.ts +161 -0
- package/dist/ssr/index.d.ts +4 -4
- package/dist/ssr/index.js +3 -3
- package/dist/standard-16AIDny5.d.ts +7 -0
- package/dist/standard-l10kE0yS.js +25 -0
- package/dist/stats-Bt1RyT-F.js +1147 -0
- package/dist/storage/index.d.ts +4 -4
- package/dist/storage/index.js +147 -72
- package/dist/store-DKqbuNvw.d.ts +83 -0
- package/dist/store-McN-2esd.js +69 -0
- package/dist/streams/index.d.ts +24 -18
- package/dist/streams/index.js +4 -4
- package/dist/streams/redis/index.d.ts +10 -7
- package/dist/streams/redis/index.js +9 -9
- package/dist/stripe/index.d.ts +5 -2
- package/dist/stripe/index.js +2 -2
- package/dist/stripe-BJUfp5jM.js +32 -0
- package/dist/stripe-BSEwKCni.d.ts +140 -0
- package/dist/subject-readers-BJzh7WF7.js +49 -0
- package/dist/subject-readers-Bbq1i0Ol.d.ts +21 -0
- package/dist/subjects-DQ2SU4cA.d.ts +77 -0
- package/dist/subscribers-BvZxcd63.js +33 -0
- package/dist/supabase-mcp-Dz9DgrKP.js +28 -0
- package/dist/supabase-mcp-Z4vtsuoO.d.ts +46 -0
- package/dist/support-CWVTM2AB.js +534 -0
- package/dist/support-view-BOJJSZKv.d.ts +17 -0
- package/dist/svelte/index.d.ts +32 -14
- package/dist/svelte/index.js +22 -10
- package/dist/svelte-controller-BmRhHvFz.js +50 -0
- package/dist/svelte-controller-DXO7gsmS.d.ts +13 -0
- package/dist/sveltekit/index.d.ts +45 -33
- package/dist/sveltekit/index.js +18 -17
- package/dist/table-schema-xqSXrjCN.js +284 -0
- package/dist/tags-C_ym1yDM.js +39 -0
- package/dist/tags-Co-QIHeK.js +84 -0
- package/dist/tags-tbiuHHMV.d.ts +30 -0
- package/dist/tanstack-db/index.d.ts +17 -11
- package/dist/tanstack-db/index.js +6 -6
- package/dist/tanstack-db/supabase/index.d.ts +24 -9
- package/dist/tanstack-db/supabase/index.js +6 -3
- package/dist/tanstack-start/index.d.ts +40 -29
- package/dist/tanstack-start/index.js +33 -19
- package/dist/tax-BHSCb5Rw.d.ts +280 -0
- package/dist/tax-keSd-q_1.js +140 -0
- package/dist/tee-1fsH3bEz.js +101 -0
- package/dist/template-DXsGm_R0.js +126 -0
- package/dist/temporal-DLZlWbOi.js +85 -0
- package/dist/temporal-required-Dt4mcPsi.js +20 -0
- package/dist/tenant-DnMqeNIM.js +27 -0
- package/dist/tenant-l3H2ouv7.d.ts +17 -0
- package/dist/testing/index.d.ts +484 -270
- package/dist/testing/index.js +333 -196
- package/dist/timing-C5NzaEgy.js +95 -0
- package/dist/topic-CZvLXFND.d.ts +415 -0
- package/dist/topic-Cr01EHZy.js +643 -0
- package/dist/ttl-cache-Bhr9swjT.js +32 -0
- package/dist/types-BTK75521.js +8 -0
- package/dist/types-Bzm0OgJk.d.ts +177 -0
- package/dist/types-CB5MvzuE.d.ts +624 -0
- package/dist/types-DYXhFhmQ.d.ts +251 -0
- package/dist/types-DmshMaXz.d.ts +421 -0
- package/dist/types-EUrisY2U.d.ts +217 -0
- package/dist/types-vVsLvOUJ.d.ts +700 -0
- package/dist/undo-CClrTbm9.d.ts +46 -0
- package/dist/undo-HHonvNeg.js +44 -0
- package/dist/upload-claim-DCuklVyh.js +33 -0
- package/dist/usage-BFwuH7GK.d.ts +232 -0
- package/dist/usage-CJmmCGzd.js +264 -0
- package/dist/user-change-CSR_prhd.js +133 -0
- package/dist/variants-Bat9zU8l.js +53 -0
- package/dist/vault-BQThkbws.d.ts +62 -0
- package/dist/vercel-connect/index.d.ts +3 -3
- package/dist/vercel-connect/index.js +8 -8
- package/dist/verify-BCmBaHlN.js +130 -0
- package/dist/verify-BTAEsJbF.d.ts +146 -0
- package/dist/view-CKzCp8FW.d.ts +90 -0
- package/dist/view-CfUd5vI9.js +108 -0
- package/dist/vue/index.d.ts +51 -27
- package/dist/vue/index.js +41 -20
- package/dist/vue-controller-DCOtUOA_.d.ts +11 -0
- package/dist/vue-controller-EzyTjqca.js +32 -0
- package/dist/watch-CYeMXFtj.d.ts +92 -0
- package/dist/watch-Cnd6XDnU.js +139 -0
- package/dist/watch-topic-CloXeDTO.d.ts +31 -0
- package/dist/watch-topic-CuaWfCuv.js +57 -0
- package/dist/wire-BJhepFbv.js +66 -0
- package/dist/workflow-builder-DzZNlI45.js +699 -0
- package/dist/workflow-sdk/builder/index.d.ts +51 -37
- package/dist/workflow-sdk/builder/index.js +30 -24
- package/dist/workflow-sdk/index.d.ts +24 -15
- package/dist/workflow-sdk/index.js +9 -6
- package/dist/workflow-sdk/world/index.d.ts +56 -24
- package/dist/workflow-sdk/world/index.js +47 -24
- package/dist/workflow-sdk-BXwl1THQ.d.ts +163 -0
- package/dist/workflow-sdk-CPGiFE1B.js +242 -0
- package/dist/workflow-sdk-world-BOEsvWmx.js +2123 -0
- package/dist/workflows-BHyYAR6c.d.ts +258 -0
- package/dist/workflows-otOMN33L.js +285 -0
- package/dist/yjs/index.d.ts +14 -11
- package/dist/yjs/index.js +13 -13
- package/package.json +7 -3
- package/schemas/cli-commands-v1.json +33 -0
- package/schemas/config-v1.json +10 -2
- package/schemas/design-v1.json +345 -0
- package/schemas/doctor-report-v1.json +6 -1
- package/skills/better-supabase/SKILL.md +4 -4
- package/skills/better-supabase/references/frontend.md +3 -2
- package/skills/better-supabase/references/ui-recipes.md +242 -245
- package/skills/better-supabase-api/references/adapters.md +3 -6
- package/skills/better-supabase-api/references/expo.md +1 -0
- package/skills/better-supabase-testing/SKILL.md +2 -3
- package/dist/access-sql-CTJPHjCL.js +0 -201
- package/dist/actor-BAhb-d1S.d.ts +0 -104
- package/dist/actor-CAL8mMih.js +0 -151
- package/dist/adapter-B2WRsRIg.js +0 -1998
- package/dist/agents-CbUIrH-w.d.ts +0 -111
- package/dist/ai-cache-BdeJKlrV.d.ts +0 -70
- package/dist/ai-cache-CLninP-F.js +0 -84
- package/dist/ai-chat-D-2MH1sU.d.ts +0 -608
- package/dist/ai-files-DXbgWA5M.js +0 -331
- package/dist/ai-tasks-BJJChl-D.d.ts +0 -157
- package/dist/announcements-BNxTW5HJ.js +0 -128
- package/dist/api-C43_FYDp.js +0 -680
- package/dist/api-DoWK3dTw.d.ts +0 -411
- package/dist/api-keys-BSXwI2jF.js +0 -318
- package/dist/api-keys-qnM63qjS.d.ts +0 -205
- package/dist/app-tables-BRjMcWhW.js +0 -819
- package/dist/app-tables-BrMBjyuq.d.ts +0 -35
- package/dist/approvals-CRZtzxNt.d.ts +0 -124
- package/dist/assistant-DZsHsYIx.d.ts +0 -148
- package/dist/attachments-Bk3tyeUF.js +0 -264
- package/dist/attributes-D4mA7WhI.js +0 -38
- package/dist/audit-log-ovUlF4Mk.js +0 -786
- package/dist/auth-CdBKt0CS.js +0 -20
- package/dist/auth-link-BjFPqwLz.d.ts +0 -97
- package/dist/auth-link-DrDX9KOT.js +0 -114
- package/dist/auth-module-DbZv2WrR.js +0 -10
- package/dist/auth-reply-Daq72lY4.js +0 -31
- package/dist/authorization-ClWBcXJi.d.ts +0 -1456
- package/dist/authorization-hooks-mLi894KH.d.ts +0 -214
- package/dist/authorizer-B3yyCVUF.js +0 -126
- package/dist/authorizer-eiOjo-3l.d.ts +0 -73
- package/dist/base64-D4aqdnDR.js +0 -42
- package/dist/before-route-B98js9m_.js +0 -30
- package/dist/bind-CTNKpBM6.d.ts +0 -70
- package/dist/block-env-CBd_SoL5.js +0 -29
- package/dist/block-env-Dxl7rsI0.d.ts +0 -10
- package/dist/block-events-DD9Q_NUz.js +0 -96
- package/dist/block-fields-Bv1hV855.js +0 -139
- package/dist/block-fields-DnaDbgZS.d.ts +0 -55
- package/dist/block-helpers-CjcQM1yA.d.ts +0 -37
- package/dist/block-helpers-DkVZNDrj.js +0 -264
- package/dist/block-hooks-C22vuIUd.js +0 -114
- package/dist/block-hooks-DcPJHztl.d.ts +0 -107
- package/dist/block-transport-DezJPPA0.d.ts +0 -70
- package/dist/block-transport-J7ZepTq2.js +0 -85
- package/dist/blocks-D2WQ63PI.js +0 -84
- package/dist/bookings-DQ7P888X.js +0 -181
- package/dist/bucket-BBSNDFNH.d.ts +0 -582
- package/dist/build-C-D_vn0U.js +0 -694
- package/dist/build-CT6SPZkI.js +0 -1815
- package/dist/calendar-eqyuQAoy.js +0 -801
- package/dist/channel-D-LHCY11.d.ts +0 -78
- package/dist/channels-C-GCoNLd.js +0 -114
- package/dist/claims-0KZVT804.js +0 -61
- package/dist/claims-PqzCxaTD.js +0 -85
- package/dist/cli/add-B5V6uokQ.js +0 -651
- package/dist/cli/add-BcOHumvq.js +0 -75
- package/dist/cli/add-DzRJEHzD.js +0 -1
- package/dist/cli/adopt-DDy50yz9.js +0 -1
- package/dist/cli/adopt-Ht34C3QD.js +0 -412
- package/dist/cli/agent-CCrTYK3W.js +0 -176
- package/dist/cli/apply-4BmTvj2A.js +0 -332
- package/dist/cli/blocks-bBI050w6.js +0 -1
- package/dist/cli/blocks-jIvPqPtw.js +0 -124
- package/dist/cli/cache-CVJmPGpd.js +0 -507
- package/dist/cli/catalog-Cm6BtquM.js +0 -188
- package/dist/cli/codemod-vsknM1Ue.js +0 -985
- package/dist/cli/command-DLCZeHdo.js +0 -876
- package/dist/cli/completion-BAm8SwGQ.js +0 -205
- package/dist/cli/completion-CEZ-c3ja.js +0 -1
- package/dist/cli/completion-D2BObVth.js +0 -30
- package/dist/cli/config-C4e_RrmL.js +0 -1463
- package/dist/cli/config-CC5DXgKX.js +0 -39
- package/dist/cli/config-CynctXbc.js +0 -1
- package/dist/cli/config-edit-Ct1lXe8a.js +0 -603
- package/dist/cli/db-BxMRcHrY.js +0 -90
- package/dist/cli/db-DT1bGB02.js +0 -78
- package/dist/cli/design-edit-B-WsnhUF.js +0 -175
- package/dist/cli/detect-DQsVeBHg.js +0 -84
- package/dist/cli/doctor-D47sFjh9.js +0 -3683
- package/dist/cli/emit-56LAG_Px.js +0 -1067
- package/dist/cli/env--JFvv45k.js +0 -142
- package/dist/cli/env-B7TWPEt0.js +0 -1
- package/dist/cli/env-C8R7Nf0a.js +0 -1088
- package/dist/cli/env-D-O91RK1.js +0 -1
- package/dist/cli/errors-Caiz_0so.js +0 -98
- package/dist/cli/files-DDvAwTko.js +0 -963
- package/dist/cli/fresh-import-BeYf9I3x.js +0 -40
- package/dist/cli/gen-D2E8osBE.js +0 -304
- package/dist/cli/init-Cx7DDAdQ.js +0 -400
- package/dist/cli/introspect-Ck7aa6v0.js +0 -51
- package/dist/cli/io-BiPX-_J1.js +0 -37
- package/dist/cli/keys-6ufnWeZl.js +0 -106
- package/dist/cli/live-CLxJNC0r.js +0 -329
- package/dist/cli/mcp-BVWvEoKo.js +0 -237
- package/dist/cli/metadata-BRywyPvv.js +0 -138
- package/dist/cli/migration-safety-DjVpz2D6.js +0 -206
- package/dist/cli/module-migration-CPhuiY8C.js +0 -592
- package/dist/cli/moved-BmtFuMK3.js +0 -152
- package/dist/cli/parse-ksnw4phM.js +0 -170
- package/dist/cli/preset-B1o6KbFp.js +0 -129
- package/dist/cli/prompts-Bvg_DBpe.js +0 -1137
- package/dist/cli/redact-PjNswZOs.js +0 -35
- package/dist/cli/run-Bb8Nn8Ax.js +0 -1528
- package/dist/cli/run-nX5ffQM_.js +0 -686
- package/dist/cli/scaffold-DcXr4z7M.js +0 -898
- package/dist/cli/scaffold-fO-FJGoO.js +0 -1
- package/dist/cli/seed-BmOC6_iz.js +0 -114
- package/dist/cli/seed-C_BmN498.js +0 -1
- package/dist/cli/shared-DKLuA1Tp.js +0 -145
- package/dist/cli/skills-CUx7S0bk.js +0 -121
- package/dist/cli/snapshot-ClgWGd-b.js +0 -347
- package/dist/cli/source-args-BDiUhsH8.js +0 -53
- package/dist/cli/spec-CM7iyRnE.js +0 -7501
- package/dist/cli/spec-DjHpWZJM.js +0 -1
- package/dist/cli/sql-C4ymac2h.js +0 -2
- package/dist/cli/sql-ybcjbz20.js +0 -326
- package/dist/cli/stack-status-Cb_D79ZR.js +0 -456
- package/dist/cli/style-2JfIPVMQ.js +0 -29
- package/dist/cli/supabase-toml-BC5sNVKU.js +0 -1153
- package/dist/cli/sync-DBvknfOK.js +0 -88
- package/dist/cli/topics-BBE1-Vrg.js +0 -30
- package/dist/cli/typegen--TfvOPLh.js +0 -494
- package/dist/cli/validate-BfWNKvxy.js +0 -7522
- package/dist/cli/version-CUKjFbNd.js +0 -4
- package/dist/cli/write-VZljwoTB.js +0 -198
- package/dist/client-5YAtJjyT.d.ts +0 -68
- package/dist/client-9ZOirdtr.d.ts +0 -122
- package/dist/client-B4a7f5ma.d.ts +0 -277
- package/dist/client-B9CqzgPO.js +0 -75
- package/dist/client-B9_8yzct.d.ts +0 -34
- package/dist/client-BDO6i2Oe.js +0 -128
- package/dist/client-BGnJ5WJi.js +0 -438
- package/dist/client-BNy-K6XT.d.ts +0 -135
- package/dist/client-BXv09wO1.d.ts +0 -162
- package/dist/client-B_vHBwB6.d.ts +0 -455
- package/dist/client-BfgwocyT.js +0 -155
- package/dist/client-Bovn6-M9.d.ts +0 -108
- package/dist/client-BpS8a6Fm.js +0 -51
- package/dist/client-BqoYuTK3.d.ts +0 -58
- package/dist/client-BzCv4kKE.js +0 -65
- package/dist/client-C-2ajnhM.js +0 -89
- package/dist/client-C3rmP3b0.d.ts +0 -59
- package/dist/client-C5mUEb2n.js +0 -55
- package/dist/client-CBQ2TV0r.d.ts +0 -218
- package/dist/client-CCGSn7m5.d.ts +0 -100
- package/dist/client-CFKONrrU.js +0 -1051
- package/dist/client-CHR8IBNG.js +0 -318
- package/dist/client-CJT3xiuI.d.ts +0 -103
- package/dist/client-CNh-pjkT.d.ts +0 -107
- package/dist/client-CXTDJCIs.d.ts +0 -34
- package/dist/client-C_-NZRrg.js +0 -120
- package/dist/client-CcPxbHeT.js +0 -288
- package/dist/client-CeH7vd-g.d.ts +0 -39
- package/dist/client-CosiUrUb.js +0 -98
- package/dist/client-CrZKZVbb.d.ts +0 -155
- package/dist/client-D7T7OLiw.js +0 -169
- package/dist/client-DLz68Qga.d.ts +0 -130
- package/dist/client-DNq8xYb-.js +0 -52
- package/dist/client-DarDYaQj.d.ts +0 -419
- package/dist/client-DbxvLC9Y.d.ts +0 -131
- package/dist/client-Dft5Vq6m.d.ts +0 -388
- package/dist/client-DyfWYU8S.js +0 -84
- package/dist/client-Dz1jWDA2.js +0 -209
- package/dist/client-DzTtOVRR.js +0 -137
- package/dist/client-Ezlbskjq.js +0 -60
- package/dist/client-GdJH4XJM.d.ts +0 -101
- package/dist/client-QvuCfO4b.d.ts +0 -263
- package/dist/client-UnM3e32l.js +0 -133
- package/dist/client-WgrPIHH-.js +0 -213
- package/dist/client-ZTtSV3l8.js +0 -40
- package/dist/client-arq4daO_.js +0 -104
- package/dist/client-cWUWrgis.d.ts +0 -157
- package/dist/client-ckXfdy1k.js +0 -38
- package/dist/client-eCDPjOMo.js +0 -438
- package/dist/client-eCtwzCbQ.d.ts +0 -65
- package/dist/client-ehjQ2tIT.d.ts +0 -52
- package/dist/client-iaFm0aVf.js +0 -67
- package/dist/client-pxjbgOz6.js +0 -376
- package/dist/clone-dN9XOL1K.js +0 -29
- package/dist/cloud-event-CTh9Sr5w.js +0 -60
- package/dist/cloud-event-DXkNoI6v.d.ts +0 -64
- package/dist/codecs-D-rpDifG.js +0 -358
- package/dist/codecs-RwFNK8Jh.d.ts +0 -215
- package/dist/codegen-C64C0NZG.d.ts +0 -1665
- package/dist/comments-CV5O8q50.js +0 -230
- package/dist/compiler-D_Gjpw_O.d.ts +0 -14
- package/dist/compose-CP0ss-cQ.js +0 -53
- package/dist/composite-B1Mmo4TU.d.ts +0 -67
- package/dist/composite-BFatHqOU.js +0 -130
- package/dist/config-DHhQmmuD.js +0 -3917
- package/dist/config-NQmw_wsk.js +0 -558
- package/dist/connector-D9NMNkv0.d.ts +0 -107
- package/dist/connectors-CR9FJGzV.d.ts +0 -141
- package/dist/context-BiwgsycK.js +0 -41
- package/dist/context-Cv3KlxWY.d.ts +0 -377
- package/dist/context-D6ZMKc2L.js +0 -19
- package/dist/context-wDKxSl9x.js +0 -9
- package/dist/controller-BBXX1RMw.d.ts +0 -46
- package/dist/controller-D6NyNrlZ.js +0 -79
- package/dist/cron-BHdXZFsJ.js +0 -145
- package/dist/cron-route-mTvWhork.js +0 -24
- package/dist/csv-CVfXqaAu.js +0 -89
- package/dist/csv-D3eKxV1T.d.ts +0 -28
- package/dist/define-Bu1v781m.js +0 -1962
- package/dist/define-M_r1d2AT.d.ts +0 -1058
- package/dist/define-block-CPyJ95rq.d.ts +0 -256
- package/dist/delegation-B7uNnz6z.js +0 -140
- package/dist/delivery-B1mKaOen.js +0 -30
- package/dist/delivery-BeHgwS3k.d.ts +0 -69
- package/dist/documents-CqtVr2fg.d.ts +0 -96
- package/dist/email-BcmbIWOX.d.ts +0 -42
- package/dist/embeddings-CVeOoufZ.js +0 -128
- package/dist/embeddings-lTUwzvW4.d.ts +0 -78
- package/dist/ended-DQmwYosO.d.ts +0 -70
- package/dist/entitlements-C8UvF1Rz.js +0 -45
- package/dist/entitlements-DgkeStXd.d.ts +0 -53
- package/dist/envelope-C4Z55LKW.js +0 -90
- package/dist/errors-BV1SKTVs.js +0 -315
- package/dist/errors-D3BR8iUk.js +0 -44
- package/dist/escape-like-B339PlP-.d.ts +0 -15
- package/dist/eve-C_Onyk_j.d.ts +0 -151
- package/dist/event-calendar-DJXXMJ3x.d.ts +0 -217
- package/dist/event-map-Dy2vKHai.js +0 -19
- package/dist/events-P3raDX2E.d.ts +0 -800
- package/dist/events-xbpHkcK9.js +0 -82
- package/dist/executor-BiB0wMBA.js +0 -735
- package/dist/executor-BnMC0lj3.d.ts +0 -272
- package/dist/executor-CvsNcQsa.d.ts +0 -174
- package/dist/executor-CxGQiQN_.js +0 -206
- package/dist/executor-D1hECPGG.d.ts +0 -39
- package/dist/executor-D3K3tycZ.js +0 -147
- package/dist/executor-DfdC00xr.d.ts +0 -95
- package/dist/field-errors-DmJICh93.d.ts +0 -113
- package/dist/field-formats-Cif5gr7c.js +0 -102
- package/dist/field-formats-DCvOQlOy.d.ts +0 -39
- package/dist/filter-evaluate-BJcaL3o1.d.ts +0 -34
- package/dist/filter-evaluate-C0ULNfS7.js +0 -214
- package/dist/filter-query-B3lhckKX.js +0 -518
- package/dist/filter-query-Bc_Qa8V_.d.ts +0 -121
- package/dist/flags-6KK6Vqkr.d.ts +0 -230
- package/dist/flags-aUR7Rod6.js +0 -279
- package/dist/form-definition-GVZTILhS.js +0 -311
- package/dist/form-definition-sagoefQr.d.ts +0 -95
- package/dist/format-CNwSjXUU.d.ts +0 -70
- package/dist/framework-Ch8bMmQY.js +0 -51
- package/dist/framework-D6IFkuAg.d.ts +0 -26
- package/dist/function-contract-DWqFl_QO.d.ts +0 -21
- package/dist/function-contract-DmkBg19r.js +0 -5
- package/dist/gateway-Bq_tWwxE.d.ts +0 -109
- package/dist/gateway-options-ClvvfuuU.d.ts +0 -29
- package/dist/gateway-options-DcLcWL5_.js +0 -27
- package/dist/graph-Cs28bOlK.js +0 -360
- package/dist/hmac-BgpThYQW.js +0 -23
- package/dist/http-C7trc6uN.js +0 -25
- package/dist/http-Cv4T29xh.js +0 -40
- package/dist/http-DdYadv-o.js +0 -126
- package/dist/image-url-pIVlO6R1.js +0 -41
- package/dist/impersonation-D5chOkrO.d.ts +0 -25
- package/dist/impersonation-DxU6yHJV.js +0 -62
- package/dist/inbox-Du5aPwKB.d.ts +0 -400
- package/dist/index-BpFYMsi0.d.ts +0 -53
- package/dist/index-BpyBH5O2.d.ts +0 -227
- package/dist/index-Bq409YZn.d.ts +0 -138
- package/dist/index-CEcDqDhc.d.ts +0 -722
- package/dist/index-CK0Sxx57.d.ts +0 -258
- package/dist/index-Csi8jD-m.d.ts +0 -206
- package/dist/index-CxmVzT-3.d.ts +0 -86
- package/dist/index-D8yhOz_4.d.ts +0 -344
- package/dist/index-DHReeV74.d.ts +0 -245
- package/dist/index-DgobXyil.d.ts +0 -58
- package/dist/index-F6XTTkC9.d.ts +0 -131
- package/dist/index-k-rrfG1g.d.ts +0 -202
- package/dist/index-qCG78-Rf.d.ts +0 -97
- package/dist/index-wTnPJUhv.d.ts +0 -58
- package/dist/invalidate-BBqhpxyB.d.ts +0 -19
- package/dist/iso4217-A8ev-CNW.js +0 -176
- package/dist/json-CEnpTHlZ.js +0 -16
- package/dist/json-schema-CpYINXG8.js +0 -548
- package/dist/jwks-cache-C4rA69hD.js +0 -49
- package/dist/jws-35a8VhFV.d.ts +0 -60
- package/dist/jws-CwBB5QAT.js +0 -193
- package/dist/kit-BeZX2pR_.d.ts +0 -66
- package/dist/kit-LTbHrWWD.js +0 -104
- package/dist/knowledge-BbdXOJvY.js +0 -272
- package/dist/knowledge-CRk1jOAJ.d.ts +0 -187
- package/dist/list-query-CBXNfJt4.js +0 -549
- package/dist/list-query-FhFXzObg.d.ts +0 -194
- package/dist/live-DwDreq1n.js +0 -239
- package/dist/management-D1gG89z2.d.ts +0 -53
- package/dist/message-B0fNJgq8.d.ts +0 -93
- package/dist/messages-D5nIfCCf.js +0 -493
- package/dist/metric-definition-95HFoW1V.d.ts +0 -70
- package/dist/mfa-YzkRjNad.d.ts +0 -30
- package/dist/model-lUafmeBQ.d.ts +0 -311
- package/dist/model-messages-CIdqdUtk.js +0 -206
- package/dist/model-messages-D4GZllOD.d.ts +0 -34
- package/dist/money-95Rff2vT.js +0 -185
- package/dist/money-DFpWzQvk.d.ts +0 -76
- package/dist/money-codec-C21MWw50.js +0 -41
- package/dist/node-headers-AO06VhqH.d.ts +0 -24
- package/dist/onboarding-Du6kCmhF.js +0 -68
- package/dist/operations-CsIfMED7.js +0 -29
- package/dist/operations-DQCWqkt3.d.ts +0 -6
- package/dist/optional-peer-Dx8TaYXw.js +0 -29
- package/dist/options-ZQzNKKBS.d.ts +0 -52
- package/dist/organizations-CO2qg44D.js +0 -398
- package/dist/outbox-njgoVzFA.d.ts +0 -181
- package/dist/payments-CzjCdIcz.js +0 -16
- package/dist/pg-error-BV_X8Isq.js +0 -26
- package/dist/plugin-D-95Q0w0.d.ts +0 -190
- package/dist/plugin-tfXW1-qO.js +0 -45
- package/dist/pool-cM3rpOQr.d.ts +0 -117
- package/dist/pool-errors-CGqvTQOC.js +0 -27
- package/dist/ports-DCAcG26M.d.ts +0 -86
- package/dist/ports-DGe1vzF2.d.ts +0 -285
- package/dist/ports-aALjot-D.js +0 -137
- package/dist/postgrest-CjnO1hbr.d.ts +0 -53
- package/dist/preset-Cqwlwx6G.js +0 -648
- package/dist/problem-DCDIQiTA.d.ts +0 -76
- package/dist/problem-JRCohp1j.js +0 -159
- package/dist/provider-C-Ti38J6.js +0 -57
- package/dist/provider-CNs0Jx0I.d.ts +0 -113
- package/dist/push-token-D2sDxSNN.d.ts +0 -24
- package/dist/query-Ctz-qKRx.js +0 -303
- package/dist/rank-result-BcYfDA0x.d.ts +0 -14
- package/dist/rank-result-DtQuIvob.js +0 -18
- package/dist/rate-limit-DVZ7qIzW.js +0 -49
- package/dist/rate-limit-I3AncmM8.js +0 -325
- package/dist/rate-limit-c6c1mB6R.d.ts +0 -41
- package/dist/ratelimit-headers-Bsxx0Tj2.js +0 -62
- package/dist/react-4ZqkP8da.js +0 -79
- package/dist/react-DzukE6Wp.js +0 -410
- package/dist/react-controller-Xn-IU44p.js +0 -40
- package/dist/react-env-Cc7Vf6eb.js +0 -13
- package/dist/read-set-DeesfeL_.js +0 -314
- package/dist/realtime-status-D2dw1hOE.js +0 -12
- package/dist/realtime-status-DcsO00Gw.d.ts +0 -8
- package/dist/refusal-CFpfmjcS.js +0 -61
- package/dist/refusal-CufncwaN.d.ts +0 -18
- package/dist/resolve-Bqb8TMTt.d.ts +0 -266
- package/dist/resolve-f8QNuYI3.js +0 -870
- package/dist/resource-Bdkqi8jo.js +0 -463
- package/dist/resource-DO4gbVi5.js +0 -91
- package/dist/resource-DYEtc-KN.d.ts +0 -106
- package/dist/resource-execute-ruP2L1op.d.ts +0 -12
- package/dist/resource-schemas-BJ518zFH.js +0 -79
- package/dist/resource-types-CGr0BbL-.d.ts +0 -141
- package/dist/resources-BiQpsM6O.d.ts +0 -7
- package/dist/resources-Ck7itNeX.js +0 -64
- package/dist/respond-Bhp3G__q.js +0 -95
- package/dist/respond-CEBC6KUX.d.ts +0 -93
- package/dist/result-BREt7qOh.d.ts +0 -312
- package/dist/result-DIeYscA3.js +0 -134
- package/dist/rrule-Cw4x4Pf_.js +0 -290
- package/dist/rules-BiQgmZ_U.js +0 -287
- package/dist/run-watch-CQRdpy-f.js +0 -53
- package/dist/runtime-BOXURhEW.js +0 -45
- package/dist/sales-lines-C6gafAwg.d.ts +0 -28
- package/dist/sales-lines-CQ1iC6QM.js +0 -41
- package/dist/sales-shared-CDSytDEn.js +0 -22
- package/dist/search-BtoWY6n_.js +0 -9
- package/dist/search-ZP13UTT4.js +0 -106
- package/dist/server-types-BKN_R4Ws.d.ts +0 -755
- package/dist/session-CwpfitmI.d.ts +0 -95
- package/dist/settings-BiHDFglz.js +0 -90
- package/dist/shared-BmMcMoW9.js +0 -89
- package/dist/shared-C9zvURqC.js +0 -14
- package/dist/shared-D5Djh43x.js +0 -60
- package/dist/shared-DDSjEGDR.d.ts +0 -11
- package/dist/sign-in-BCV5S2WZ.d.ts +0 -49
- package/dist/sign-in-z2BaBdps.js +0 -367
- package/dist/signatures-BXlDXV3D.d.ts +0 -43
- package/dist/signatures-CeIoAelK.js +0 -145
- package/dist/signers-BwKV-9S6.d.ts +0 -385
- package/dist/signing-keys-v2MRYkDF.d.ts +0 -105
- package/dist/solid-controller-DLsmrczT.js +0 -33
- package/dist/solid-controller-Uqi5ef6z.d.ts +0 -11
- package/dist/spec-pins-Dqpml2dZ.d.ts +0 -84
- package/dist/spec-pins-S4PymRxp.js +0 -60
- package/dist/sql-BPKRNutj.js +0 -422
- package/dist/sql-DCfCbS2j.js +0 -88660
- package/dist/sso-BaU_6ePE.js +0 -217
- package/dist/sso-Bu0mVh0V.d.ts +0 -131
- package/dist/standard-B1BigegP.js +0 -25
- package/dist/standard-BcUQuUgu.d.ts +0 -7
- package/dist/stats-Di5VAsYU.js +0 -1128
- package/dist/store-B18bIvKc.d.ts +0 -68
- package/dist/store-BdH5ruDx.js +0 -66
- package/dist/stripe-NVcNOhHy.d.ts +0 -140
- package/dist/stripe-XZrSmDTf.js +0 -32
- package/dist/subject-readers-BNQzBDN9.d.ts +0 -21
- package/dist/subject-readers-BpwUFJtp.js +0 -46
- package/dist/subjects-DP-fvFkk.d.ts +0 -77
- package/dist/subscribers-Cq--DL1E.js +0 -34
- package/dist/supabase-mcp-C6tMoEjn.d.ts +0 -43
- package/dist/supabase-mcp-DomZ-amK.js +0 -28
- package/dist/support-BAhTqI7y.js +0 -522
- package/dist/support-view-IRnDLuGN.d.ts +0 -17
- package/dist/svelte-controller-BQOIXWEw.d.ts +0 -10
- package/dist/svelte-controller-CDAujo-_.js +0 -50
- package/dist/table-schema-pQlER3jj.js +0 -283
- package/dist/tags-AUpl4Ob9.d.ts +0 -30
- package/dist/tags-B99_U9Pp.js +0 -39
- package/dist/tags-BqgaxCnv.js +0 -84
- package/dist/tax-DMWDUzKt.d.ts +0 -273
- package/dist/tax-wm9g2mD2.js +0 -140
- package/dist/tee-Cw-iJAWL.js +0 -101
- package/dist/template-Dw3dTmKe.js +0 -123
- package/dist/temporal-CB5Fpo5d.js +0 -79
- package/dist/temporal-required-nfZ87U-0.js +0 -20
- package/dist/tenant-B-fiItlJ.js +0 -27
- package/dist/tenant-BNp3kBAG.d.ts +0 -17
- package/dist/timing-BMCWgpdZ.js +0 -92
- package/dist/topic-1WTkDnPd.d.ts +0 -387
- package/dist/topic-mee21pux.js +0 -629
- package/dist/ttl-Hr34gRu8.js +0 -12
- package/dist/ttl-cache-XzZ-Q2eX.js +0 -29
- package/dist/types-B4zhT6dq.d.ts +0 -205
- package/dist/types-BEEFkNFY.d.ts +0 -564
- package/dist/types-BRTSpOIh.js +0 -5
- package/dist/types-Bq64h5nY.d.ts +0 -649
- package/dist/types-BrpW5ixT.d.ts +0 -370
- package/dist/types-DDQ-Rsep.d.ts +0 -162
- package/dist/types-DO9xWsGC.d.ts +0 -240
- package/dist/undo-B5LgpGLy.js +0 -44
- package/dist/undo-BsdYRox7.d.ts +0 -43
- package/dist/usage-C504GF55.d.ts +0 -220
- package/dist/usage-DdqT13_X.js +0 -261
- package/dist/user-change-XzvgafU4.js +0 -130
- package/dist/vault-DR2-zOjz.d.ts +0 -50
- package/dist/verify-BucYsoKq.d.ts +0 -142
- package/dist/verify-DnU-uWU2.js +0 -126
- package/dist/version-TXpQEfh1.js +0 -4
- package/dist/view-Bf7e07rQ.d.ts +0 -90
- package/dist/view-CYX1wsgp.js +0 -105
- package/dist/vue-controller-C9tFzqAc.js +0 -32
- package/dist/vue-controller-Cav6Wt_r.d.ts +0 -11
- package/dist/watch-BAuIzC2r.js +0 -139
- package/dist/watch-ry70AEm6.d.ts +0 -84
- package/dist/watch-topic-DWHy63ZJ.d.ts +0 -28
- package/dist/watch-topic-miuymrli.js +0 -57
- package/dist/wire-BCJxCtHS.js +0 -45
- package/dist/workflow-builder-CynLqc6H.js +0 -697
- package/dist/workflow-sdk-DM7T3sF4.d.ts +0 -161
- package/dist/workflow-sdk-QnnzIQRc.js +0 -243
- package/dist/workflow-sdk-world-QzcxaaCD.js +0 -2103
- package/dist/workflows-DQBCzrHC.d.ts +0 -243
- package/dist/workflows-H9qJge3f.js +0 -282
package/dist/create/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { c as PRESET_CATALOG, i as presetOf, s as resolvePreset } from "../config-
|
|
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-
|
|
3
|
-
import { o as resolveConfig } from "../config-
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
1
|
+
import { c as PRESET_CATALOG, i as presetOf, s as resolvePreset, v as encodePreset } from "../config-V6HMvce5.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-0YZ9IskE.js";
|
|
3
|
+
import { o as resolveConfig } from "../config-xUf0dj0t.js";
|
|
4
|
+
import { _ as encodeDesign, a as DesignParseError, b as parseDesign, h as designOf, n as diffDesigns, o as DesignTooLongError, u as designConfig, y as jsonPointer } from "../preset-HNFqCWaD.js";
|
|
5
|
+
import { D as SQL_MODULES, h as renderModules, i as moduleLayout } from "../sql-frpIs51D.js";
|
|
6
6
|
//#region src/create/column-keys.ts
|
|
7
7
|
/** The most options a select takes, and the longest option. */
|
|
8
8
|
const MAX_OPTIONS = 100;
|
|
@@ -55,8 +55,8 @@ function fitsBound(type, value) {
|
|
|
55
55
|
}
|
|
56
56
|
/**
|
|
57
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
|
-
*
|
|
58
|
+
* options outside text and text[], bounds that don't apply, an identity outside
|
|
59
|
+
* integer and bigint, and a default an identity or the type refuses.
|
|
60
60
|
*/
|
|
61
61
|
function fitted(column) {
|
|
62
62
|
const { format, options, min, max, identity, default: fallback, nullable, ...rest } = column;
|
|
@@ -80,7 +80,10 @@ function optionError(options, option) {
|
|
|
80
80
|
if (options.includes(option)) return `${option} is already an option.`;
|
|
81
81
|
if (options.length >= MAX_OPTIONS) return `A select takes at most ${MAX_OPTIONS} options.`;
|
|
82
82
|
}
|
|
83
|
-
/**
|
|
83
|
+
/**
|
|
84
|
+
* Why `value` can't be a bound of `column`, or `undefined` when it can (an
|
|
85
|
+
* empty value clears it).
|
|
86
|
+
*/
|
|
84
87
|
function boundError(column, side, value) {
|
|
85
88
|
const trimmed = value.trim();
|
|
86
89
|
if (trimmed === "") return;
|
|
@@ -99,7 +102,10 @@ function withBounds(column, bounds) {
|
|
|
99
102
|
if (bounds.max !== void 0) next.max = bounds.max;
|
|
100
103
|
return next;
|
|
101
104
|
}
|
|
102
|
-
/**
|
|
105
|
+
/**
|
|
106
|
+
* What the canvas shows for a column that is more than its type, such as an
|
|
107
|
+
* email or a select.
|
|
108
|
+
*/
|
|
103
109
|
function columnLabel(column) {
|
|
104
110
|
if (column.identity === true) return "autonumber";
|
|
105
111
|
if (column.options !== void 0) return column.type === "text[]" ? "multi-select" : "select";
|
|
@@ -107,6 +113,109 @@ function columnLabel(column) {
|
|
|
107
113
|
return column.format === void 0 ? void 0 : FORMAT_LABELS[column.format];
|
|
108
114
|
}
|
|
109
115
|
//#endregion
|
|
116
|
+
//#region src/create/design-scope.ts
|
|
117
|
+
const AUTH_USERS$1 = "auth.users";
|
|
118
|
+
/**
|
|
119
|
+
* The column that scopes an app table's rows, or `null` for `scope: "none"` and
|
|
120
|
+
* unscoped presets.
|
|
121
|
+
*/
|
|
122
|
+
function scopeColumnOf(table, preset) {
|
|
123
|
+
const scope = table.scope ?? "inherit";
|
|
124
|
+
if (scope === "none") return null;
|
|
125
|
+
if (scope === "inherit" && preset.scope === "tenant") return {
|
|
126
|
+
name: `${preset.tenantName}_id`,
|
|
127
|
+
type: preset.idType,
|
|
128
|
+
nullable: false,
|
|
129
|
+
default: null,
|
|
130
|
+
unique: false
|
|
131
|
+
};
|
|
132
|
+
if (scope === "user" || preset.scope === "user") return {
|
|
133
|
+
name: "user_id",
|
|
134
|
+
type: "uuid",
|
|
135
|
+
nullable: false,
|
|
136
|
+
default: "auth.uid()",
|
|
137
|
+
unique: false
|
|
138
|
+
};
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
//#endregion
|
|
142
|
+
//#region src/create/design-subject.ts
|
|
143
|
+
/**
|
|
144
|
+
* The columns `subject` adds: `rank` for manual order and `deleted_at` for
|
|
145
|
+
* trash.
|
|
146
|
+
*/
|
|
147
|
+
function subjectColumns(subject) {
|
|
148
|
+
const columns = [];
|
|
149
|
+
if (subject?.rank !== void 0) columns.push({
|
|
150
|
+
name: "rank",
|
|
151
|
+
type: "text",
|
|
152
|
+
nullable: false,
|
|
153
|
+
default: "'V'",
|
|
154
|
+
unique: false
|
|
155
|
+
});
|
|
156
|
+
if (subject?.softDelete === true) columns.push({
|
|
157
|
+
name: "deleted_at",
|
|
158
|
+
type: "timestamptz",
|
|
159
|
+
nullable: true,
|
|
160
|
+
default: null,
|
|
161
|
+
unique: false
|
|
162
|
+
});
|
|
163
|
+
return columns;
|
|
164
|
+
}
|
|
165
|
+
/** The subject with the columns it names renamed or dropped by `edit`. */
|
|
166
|
+
function subjectColumnsEdited(subject, edit) {
|
|
167
|
+
const { title, search, rank, versions, ...rest } = subject;
|
|
168
|
+
const next = { ...rest };
|
|
169
|
+
const [nextTitle] = title === void 0 ? [] : edit([title]);
|
|
170
|
+
if (nextTitle !== void 0) next.title = nextTitle;
|
|
171
|
+
if (search !== void 0) {
|
|
172
|
+
const nextSearch = {};
|
|
173
|
+
const [searchTitle] = search.title === void 0 ? [] : edit([search.title]);
|
|
174
|
+
const body = edit(search.body ?? []);
|
|
175
|
+
if (searchTitle !== void 0) nextSearch.title = searchTitle;
|
|
176
|
+
if (body.length > 0) nextSearch.body = body;
|
|
177
|
+
next.search = nextSearch;
|
|
178
|
+
}
|
|
179
|
+
if (versions === true) next.versions = true;
|
|
180
|
+
else if (versions !== void 0) {
|
|
181
|
+
const { columns, ...options } = versions;
|
|
182
|
+
const kept = columns === void 0 ? void 0 : edit(columns);
|
|
183
|
+
next.versions = kept === void 0 || kept.length === 0 ? options : {
|
|
184
|
+
...options,
|
|
185
|
+
columns: kept
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
if (rank === true) next.rank = true;
|
|
189
|
+
else if (rank !== void 0) {
|
|
190
|
+
const [group] = rank.group === void 0 ? [] : edit([rank.group]);
|
|
191
|
+
next.rank = group === void 0 ? true : { group };
|
|
192
|
+
}
|
|
193
|
+
return next;
|
|
194
|
+
}
|
|
195
|
+
const SUBJECT_TYPE = /^[a-z][a-z0-9_]*$/u;
|
|
196
|
+
/**
|
|
197
|
+
* Why `type` can't be the subject type of the app table `table`, or `undefined`
|
|
198
|
+
* when it can.
|
|
199
|
+
*/
|
|
200
|
+
function subjectTypeError(design, table, type) {
|
|
201
|
+
if (!SUBJECT_TYPE.test(type)) return "Use lowercase letters, digits and underscores, starting with a letter.";
|
|
202
|
+
const owner = Object.entries(design.appTables ?? {}).find(([name, each]) => name !== table && each.subject?.type === type)?.[0];
|
|
203
|
+
return owner === void 0 ? void 0 : `${owner} already has the subject type ${type}.`;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* App table events with `edit` applied to the payload columns, dropping an
|
|
207
|
+
* empty list.
|
|
208
|
+
*/
|
|
209
|
+
function eventsColumnsEdited(events, edit) {
|
|
210
|
+
if (events === true) return true;
|
|
211
|
+
const { include, ...rest } = events;
|
|
212
|
+
const kept = include === void 0 ? [] : edit(include);
|
|
213
|
+
return kept.length === 0 ? rest : {
|
|
214
|
+
...rest,
|
|
215
|
+
include: kept
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
//#endregion
|
|
110
219
|
//#region src/create/design-computed.ts
|
|
111
220
|
/** The aggregates a rollup takes (`APP_ROLLUP_AGGREGATES`). */
|
|
112
221
|
const ROLLUP_AGGREGATES = [
|
|
@@ -134,7 +243,10 @@ function isRollupAggregate(value) {
|
|
|
134
243
|
function readableColumns(table) {
|
|
135
244
|
return [...Object.entries(table.columns ?? {}).map(([name, column]) => [name, column.type]), ...table.timestamps === false ? [] : [["created_at", "timestamptz"], ["updated_at", "timestamptz"]]];
|
|
136
245
|
}
|
|
137
|
-
/**
|
|
246
|
+
/**
|
|
247
|
+
* The columns `aggregate` can read: numbers for sum and avg, ordered types for
|
|
248
|
+
* min and max, none for count.
|
|
249
|
+
*/
|
|
138
250
|
function rollupColumns(child, aggregate) {
|
|
139
251
|
if (aggregate === "count") return [];
|
|
140
252
|
const fits = aggregate === "sum" || aggregate === "avg" ? NUMBERS : ORDERED;
|
|
@@ -144,14 +256,20 @@ function rollupColumns(child, aggregate) {
|
|
|
144
256
|
function filterColumns(child) {
|
|
145
257
|
return Object.entries(child.columns ?? {}).flatMap(([name, column]) => column.type === "text" && column.options !== void 0 ? [[name, column.options]] : []);
|
|
146
258
|
}
|
|
147
|
-
/**
|
|
259
|
+
/**
|
|
260
|
+
* Each app table column that references `parent`, as `{ table, via }`: what a
|
|
261
|
+
* rollup on `parent` can aggregate.
|
|
262
|
+
*/
|
|
148
263
|
function rollupSources(tables, parent) {
|
|
149
264
|
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
265
|
table,
|
|
151
266
|
via
|
|
152
267
|
})));
|
|
153
268
|
}
|
|
154
|
-
/**
|
|
269
|
+
/**
|
|
270
|
+
* Each column of `name` that references another app table, with that table:
|
|
271
|
+
* what a lookup can follow.
|
|
272
|
+
*/
|
|
155
273
|
function lookupSources(tables, name) {
|
|
156
274
|
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
275
|
via,
|
|
@@ -183,7 +301,10 @@ function withComputed(table, rollups, lookups) {
|
|
|
183
301
|
if (lookups !== void 0 && Object.keys(lookups).length > 0) next.lookups = lookups;
|
|
184
302
|
return next;
|
|
185
303
|
}
|
|
186
|
-
/**
|
|
304
|
+
/**
|
|
305
|
+
* `table` with a rollup or lookup set under `name`, replacing `previous` in its
|
|
306
|
+
* place.
|
|
307
|
+
*/
|
|
187
308
|
function tableWithComputed(table, name, computed, previous) {
|
|
188
309
|
const placed = (record, value) => {
|
|
189
310
|
const entries = Object.entries(record ?? {});
|
|
@@ -198,9 +319,9 @@ function tableWithoutComputed(table, name) {
|
|
|
198
319
|
}
|
|
199
320
|
/**
|
|
200
321
|
* 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
|
-
*
|
|
203
|
-
*
|
|
322
|
+
* whose table, link or column was deleted or retyped, or whose name a column
|
|
323
|
+
* now uses. `sql sync` would refuse them, and the design code would not
|
|
324
|
+
* encode.
|
|
204
325
|
*/
|
|
205
326
|
function prunedComputed(tables) {
|
|
206
327
|
return Object.fromEntries(Object.entries(tables).map(([name, table]) => {
|
|
@@ -219,7 +340,10 @@ function computedTableRenamed(tables, from, to) {
|
|
|
219
340
|
} : rollup]))
|
|
220
341
|
}]));
|
|
221
342
|
}
|
|
222
|
-
/**
|
|
343
|
+
/**
|
|
344
|
+
* The rollup fitted to a new source or aggregate: a column the aggregate can
|
|
345
|
+
* read, and a filter the child still has.
|
|
346
|
+
*/
|
|
223
347
|
function fittedRollup(tables, rollup) {
|
|
224
348
|
const child = tables[rollup.table] ?? {};
|
|
225
349
|
const columns = rollupColumns(child, rollup.aggregate);
|
|
@@ -249,8 +373,8 @@ function rollupRenamed(rollup, swap) {
|
|
|
249
373
|
}
|
|
250
374
|
/**
|
|
251
375
|
* 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
|
-
*
|
|
376
|
+
* tables already have the column renamed, so a lookup finds its target through
|
|
377
|
+
* the renamed link.
|
|
254
378
|
*/
|
|
255
379
|
function computedColumnRenamed(tables, table, from, to) {
|
|
256
380
|
const swap = (column) => column === from ? to : column;
|
|
@@ -289,74 +413,6 @@ function computedRows(table) {
|
|
|
289
413
|
})];
|
|
290
414
|
}
|
|
291
415
|
//#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
416
|
//#region src/create/design.ts
|
|
361
417
|
const EMPTY_DESIGN = {};
|
|
362
418
|
/** The schema app tables go in. */
|
|
@@ -378,26 +434,6 @@ function isAppTable(table) {
|
|
|
378
434
|
function isEmptyDesign(design) {
|
|
379
435
|
return Object.keys(design.appTables ?? {}).length === 0 && Object.keys(design.extraColumns ?? {}).length === 0 && Object.keys(design.positions ?? {}).length === 0;
|
|
380
436
|
}
|
|
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
437
|
/** Why `name` can't name an app table or column, by the library's rules. */
|
|
402
438
|
function identifierError(name) {
|
|
403
439
|
return appIdentifierError(name);
|
|
@@ -421,8 +457,8 @@ function columnError(table, name, preset) {
|
|
|
421
457
|
if (appReservedColumns(preset.tenantName).includes(name)) return `${name} is a column every app table can get from its scope. Choose another name.`;
|
|
422
458
|
}
|
|
423
459
|
/**
|
|
424
|
-
* Why `value` can't be the default of `column` (its type, options and
|
|
425
|
-
*
|
|
460
|
+
* Why `value` can't be the default of `column` (its type, options and bounds),
|
|
461
|
+
* or `undefined` when it can or is empty.
|
|
426
462
|
*/
|
|
427
463
|
function defaultError(column, value) {
|
|
428
464
|
const trimmed = value.trim();
|
|
@@ -473,8 +509,8 @@ function addTable(design, name, table = {}, position) {
|
|
|
473
509
|
});
|
|
474
510
|
}
|
|
475
511
|
/**
|
|
476
|
-
* Removes an app table, every app table column that references it (and
|
|
477
|
-
*
|
|
512
|
+
* Removes an app table, every app table column that references it (and those
|
|
513
|
+
* columns from key sets), and the rollups and lookups that read it.
|
|
478
514
|
*/
|
|
479
515
|
function deleteTable(design, name) {
|
|
480
516
|
const rest = omitKey(design.appTables, name);
|
|
@@ -534,8 +570,8 @@ function updateTable(design, name, patch) {
|
|
|
534
570
|
});
|
|
535
571
|
}
|
|
536
572
|
/**
|
|
537
|
-
* Sets an app table's id type and retypes the app table columns that
|
|
538
|
-
*
|
|
573
|
+
* Sets an app table's id type and retypes the app table columns that reference
|
|
574
|
+
* it, since a key has the type of the id it points at.
|
|
539
575
|
*/
|
|
540
576
|
function setTableId(design, name, id) {
|
|
541
577
|
const next = updateTable(design, name, { id: id === "uuid" ? void 0 : id });
|
|
@@ -544,7 +580,10 @@ function setTableId(design, name, id) {
|
|
|
544
580
|
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
581
|
}])));
|
|
546
582
|
}
|
|
547
|
-
/**
|
|
583
|
+
/**
|
|
584
|
+
* A table's composite key sets with `edit` applied to each, dropping empty sets
|
|
585
|
+
* and an empty list.
|
|
586
|
+
*/
|
|
548
587
|
function withKeySets(table, edit) {
|
|
549
588
|
const { unique, indexes, ...rest } = table;
|
|
550
589
|
const sets = (list) => {
|
|
@@ -604,7 +643,10 @@ function deleteColumn(design, table, name) {
|
|
|
604
643
|
}, (columns) => columns.filter((column) => column !== name))
|
|
605
644
|
});
|
|
606
645
|
}
|
|
607
|
-
/**
|
|
646
|
+
/**
|
|
647
|
+
* Sets an extra column on a block table
|
|
648
|
+
* (`blocks.<module>.options.extraColumns`).
|
|
649
|
+
*/
|
|
608
650
|
function setExtraColumn(design, module, name, type) {
|
|
609
651
|
return {
|
|
610
652
|
...design,
|
|
@@ -682,8 +724,10 @@ function singular(name) {
|
|
|
682
724
|
for (const [ending, replacement] of SINGULAR_ENDINGS) if (ending.test(name)) return name.replace(ending, replacement);
|
|
683
725
|
return name;
|
|
684
726
|
}
|
|
685
|
-
|
|
686
|
-
|
|
727
|
+
/**
|
|
728
|
+
* The column types a foreign key can point at, from the target's primary key
|
|
729
|
+
* type.
|
|
730
|
+
*/
|
|
687
731
|
function referenceType(type) {
|
|
688
732
|
const normal = type.toLowerCase();
|
|
689
733
|
switch (normal) {
|
|
@@ -700,12 +744,11 @@ function referenceType(type) {
|
|
|
700
744
|
}
|
|
701
745
|
}
|
|
702
746
|
/**
|
|
703
|
-
* Adds a foreign key column from an app table to `target`. Only app tables
|
|
704
|
-
*
|
|
705
|
-
*
|
|
706
|
-
*
|
|
707
|
-
* the
|
|
708
|
-
* message.
|
|
747
|
+
* Adds a foreign key column from an app table to `target`. Only app tables get
|
|
748
|
+
* new columns. A self reference gets `parent_id`, and a second reference to the
|
|
749
|
+
* same table gets a role name (`owner_id`, `<target>_2_id`) the user can
|
|
750
|
+
* rename. A target without a single-column primary key, and the tenant table
|
|
751
|
+
* the scope column already references, are refused with a message.
|
|
709
752
|
*/
|
|
710
753
|
function connect(design, data, preset, connection) {
|
|
711
754
|
const source = data.tables.find((table) => table.id === connection.source);
|
|
@@ -740,9 +783,9 @@ function referenceColumn(table, base, roles, preset) {
|
|
|
740
783
|
].find((candidate) => columnError(table, candidate, preset) === void 0);
|
|
741
784
|
}
|
|
742
785
|
/**
|
|
743
|
-
* Adds a key to `targetId` on the app table `name` in the design, which can
|
|
744
|
-
*
|
|
745
|
-
*
|
|
786
|
+
* Adds a key to `targetId` on the app table `name` in the design, which can be
|
|
787
|
+
* a table the schema doesn't have yet: `<target>_id`, `parent_id` for a self
|
|
788
|
+
* reference, or a free role name when that column is taken.
|
|
746
789
|
*/
|
|
747
790
|
function referenceFrom(design, data, preset, name, targetId) {
|
|
748
791
|
const table = design.appTables?.[name];
|
|
@@ -750,8 +793,8 @@ function referenceFrom(design, data, preset, name, targetId) {
|
|
|
750
793
|
ok: false,
|
|
751
794
|
error: `${name} is not in the design.`
|
|
752
795
|
};
|
|
753
|
-
const target = targetId ===
|
|
754
|
-
if (targetId !==
|
|
796
|
+
const target = targetId === "auth.users" ? void 0 : data.tables.find((each) => each.id === targetId);
|
|
797
|
+
if (targetId !== "auth.users" && target === void 0) return {
|
|
755
798
|
ok: false,
|
|
756
799
|
error: "That table is not in the schema."
|
|
757
800
|
};
|
|
@@ -786,114 +829,32 @@ function referenceFrom(design, data, preset, name, targetId) {
|
|
|
786
829
|
})
|
|
787
830
|
};
|
|
788
831
|
}
|
|
832
|
+
function appColumn(name, column) {
|
|
833
|
+
const label = columnLabel(column);
|
|
834
|
+
const schemaColumn = {
|
|
835
|
+
name,
|
|
836
|
+
type: column.type,
|
|
837
|
+
nullable: column.identity === true ? false : column.nullable ?? true,
|
|
838
|
+
default: column.identity === true ? "identity" : column.default ?? null,
|
|
839
|
+
unique: column.unique ?? false
|
|
840
|
+
};
|
|
841
|
+
return label === void 0 ? schemaColumn : {
|
|
842
|
+
...schemaColumn,
|
|
843
|
+
label
|
|
844
|
+
};
|
|
845
|
+
}
|
|
846
|
+
const TIMESTAMP = {
|
|
847
|
+
type: "timestamptz",
|
|
848
|
+
nullable: false,
|
|
849
|
+
default: "now()",
|
|
850
|
+
unique: false
|
|
851
|
+
};
|
|
789
852
|
/**
|
|
790
|
-
*
|
|
791
|
-
*
|
|
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.
|
|
853
|
+
* The id of the table a reference points at, or `undefined` when it is not in
|
|
854
|
+
* the schema.
|
|
795
855
|
*/
|
|
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
856
|
function referencedId(reference, data) {
|
|
896
|
-
if (reference.block === void 0) return reference.table ===
|
|
857
|
+
if (reference.block === void 0) return reference.table === "auth.users" ? AUTH_USERS$1 : appTableId(reference.table);
|
|
897
858
|
return Object.entries(data.blockTables).find(([, each]) => each.block === reference.block && each.table === reference.table)?.[0];
|
|
898
859
|
}
|
|
899
860
|
function foreignKey(column, to, onDelete = "no action") {
|
|
@@ -963,8 +924,8 @@ function extraColumnsOf(design, table, data) {
|
|
|
963
924
|
return data.extraColumns.includes(table.id) ? design.extraColumns?.[table.module] ?? {} : {};
|
|
964
925
|
}
|
|
965
926
|
/**
|
|
966
|
-
* The schema with the design applied: app tables added, extra columns
|
|
967
|
-
*
|
|
927
|
+
* The schema with the design applied: app tables added, extra columns appended
|
|
928
|
+
* to the block tables that accept them.
|
|
968
929
|
*/
|
|
969
930
|
function withDesign(data, design, preset) {
|
|
970
931
|
const tables = data.tables.map((table) => {
|
|
@@ -993,1030 +954,1289 @@ function withDesign(data, design, preset) {
|
|
|
993
954
|
};
|
|
994
955
|
}
|
|
995
956
|
//#endregion
|
|
996
|
-
//#region src/create/
|
|
997
|
-
/**
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
];
|
|
1006
|
-
const
|
|
1007
|
-
|
|
1008
|
-
const
|
|
1009
|
-
const
|
|
1010
|
-
{
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
column
|
|
1043
|
-
|
|
1044
|
-
|
|
957
|
+
//#region src/create/design-issues.ts
|
|
958
|
+
/**
|
|
959
|
+
* What would stop `sql sync` from writing the design: a table name a block
|
|
960
|
+
* already uses, a reference to a table the preset no longer installs, a
|
|
961
|
+
* set-null delete on a required column, a composite key on a column the table
|
|
962
|
+
* doesn't have, and extra columns for a block that is gone or no longer takes
|
|
963
|
+
* them.
|
|
964
|
+
*/
|
|
965
|
+
function designIssues(design, data, preset) {
|
|
966
|
+
const issues = [];
|
|
967
|
+
const names = new Set(data.tables.filter((table) => !isAppTable(table)).map((table) => table.name));
|
|
968
|
+
const logical = new Set(Object.values(data.blockTables).map((each) => `${each.block}.${each.table}`));
|
|
969
|
+
const modules = new Set(data.tables.filter((table) => data.extraColumns.includes(table.id)).map((table) => table.module));
|
|
970
|
+
const subjectTypes = /* @__PURE__ */ new Map();
|
|
971
|
+
for (const [name, table] of Object.entries(design.appTables ?? {})) {
|
|
972
|
+
const type = table.subject?.type;
|
|
973
|
+
if (type !== void 0 && !subjectTypes.has(type)) subjectTypes.set(type, name);
|
|
974
|
+
}
|
|
975
|
+
for (const [name, table] of Object.entries(design.appTables ?? {})) {
|
|
976
|
+
const invalid = identifierError(name);
|
|
977
|
+
if (invalid !== void 0) issues.push({
|
|
978
|
+
code: "invalid_name",
|
|
979
|
+
path: jsonPointer("appTables", name),
|
|
980
|
+
table: name,
|
|
981
|
+
message: `The name ${name} is invalid. ${invalid}`
|
|
982
|
+
});
|
|
983
|
+
if (names.has(name)) issues.push({
|
|
984
|
+
code: "table_name_taken",
|
|
985
|
+
path: jsonPointer("appTables", name),
|
|
986
|
+
table: name,
|
|
987
|
+
message: `A block already creates a ${name} table. Rename this one.`
|
|
988
|
+
});
|
|
989
|
+
const long = appNameLengthError(name, table);
|
|
990
|
+
if (long !== void 0) issues.push({
|
|
991
|
+
code: "name_too_long",
|
|
992
|
+
path: jsonPointer("appTables", name),
|
|
993
|
+
table: name,
|
|
994
|
+
message: `${long}.`
|
|
995
|
+
});
|
|
996
|
+
const type = table.subject?.type;
|
|
997
|
+
if (type !== void 0 && subjectTypes.get(type) !== name) issues.push({
|
|
998
|
+
code: "subject_type_taken",
|
|
999
|
+
path: jsonPointer("appTables", name, "subject", "type"),
|
|
1000
|
+
table: name,
|
|
1001
|
+
message: `${subjectTypes.get(type)} already has the subject type ${type}. Choose another.`
|
|
1002
|
+
});
|
|
1003
|
+
for (const [column, config] of Object.entries(table.columns ?? {})) {
|
|
1004
|
+
const fallback = config.default === void 0 ? void 0 : defaultError(config, config.default);
|
|
1005
|
+
if (fallback !== void 0) issues.push({
|
|
1006
|
+
code: "invalid_default",
|
|
1007
|
+
path: jsonPointer("appTables", name, "columns", column, "default"),
|
|
1008
|
+
table: name,
|
|
1009
|
+
message: `${name}.${column}: ${fallback}`
|
|
1010
|
+
});
|
|
1011
|
+
if (lockedWithoutDefault(config)) issues.push({
|
|
1012
|
+
code: "default_required",
|
|
1013
|
+
path: jsonPointer("appTables", name, "columns", column),
|
|
1014
|
+
table: name,
|
|
1015
|
+
message: `${name}.${column} is required, and signed-in users can't write it, so give it a default.`
|
|
1016
|
+
});
|
|
1045
1017
|
}
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1018
|
+
for (const column of subjectColumns(table.subject)) if (Object.hasOwn(table.columns ?? {}, column.name)) issues.push({
|
|
1019
|
+
code: "column_clash",
|
|
1020
|
+
path: jsonPointer("appTables", name, "columns", column.name),
|
|
1021
|
+
table: name,
|
|
1022
|
+
message: `${name}.${column.name} clashes with the column its record features add. Rename it.`
|
|
1023
|
+
});
|
|
1024
|
+
const known = /* @__PURE__ */ new Set([
|
|
1025
|
+
"id",
|
|
1026
|
+
...Object.keys(table.columns ?? {}),
|
|
1027
|
+
...table.timestamps === false ? [] : ["created_at", "updated_at"]
|
|
1028
|
+
]);
|
|
1029
|
+
const scope = scopeColumnOf(table, preset);
|
|
1030
|
+
if (scope !== null) known.add(scope.name);
|
|
1031
|
+
for (const [key, field, sets] of [[
|
|
1032
|
+
"unique key",
|
|
1033
|
+
"unique",
|
|
1034
|
+
table.unique
|
|
1035
|
+
], [
|
|
1036
|
+
"index",
|
|
1037
|
+
"indexes",
|
|
1038
|
+
table.indexes
|
|
1039
|
+
]]) for (const [index, columns] of (sets ?? []).entries()) {
|
|
1040
|
+
const gone = columns.filter((column) => !known.has(column));
|
|
1041
|
+
if (gone.length > 0) issues.push({
|
|
1042
|
+
code: "unknown_column",
|
|
1043
|
+
path: jsonPointer("appTables", name, field, index),
|
|
1044
|
+
table: name,
|
|
1045
|
+
message: `The ${key} on ${columns.join(", ")} names ${gone.join(", ")}, which ${name} doesn't have.`
|
|
1046
|
+
});
|
|
1055
1047
|
}
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1048
|
+
for (const [column, config] of Object.entries(table.columns ?? {})) {
|
|
1049
|
+
const reference = config.references;
|
|
1050
|
+
if (reference === void 0) continue;
|
|
1051
|
+
if (reference.block === void 0 ? reference.table !== "auth.users" && design.appTables?.[reference.table] === void 0 : !logical.has(`${reference.block}.${reference.table}`)) issues.push({
|
|
1052
|
+
code: "missing_reference",
|
|
1053
|
+
path: jsonPointer("appTables", name, "columns", column, "references"),
|
|
1054
|
+
table: name,
|
|
1055
|
+
message: `${name}.${column} references ${reference.block === void 0 ? reference.table : `${reference.block}.${reference.table}`}, which the preset does not install.`
|
|
1056
|
+
});
|
|
1057
|
+
if (reference.onDelete === "set null" && config.nullable === false) issues.push({
|
|
1058
|
+
code: "set_null_required",
|
|
1059
|
+
path: jsonPointer("appTables", name, "columns", column, "references", "onDelete"),
|
|
1060
|
+
table: name,
|
|
1061
|
+
message: `${name}.${column} is required, so deleting the row it references can't set it to null.`
|
|
1062
|
+
});
|
|
1065
1063
|
}
|
|
1066
|
-
}
|
|
1067
|
-
{
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
format: "rating"
|
|
1064
|
+
}
|
|
1065
|
+
for (const block of Object.keys(design.extraColumns ?? {})) if (!modules.has(block)) issues.push({
|
|
1066
|
+
code: "block_not_installed",
|
|
1067
|
+
path: jsonPointer("extraColumns", block),
|
|
1068
|
+
table: block,
|
|
1069
|
+
message: `The extra columns for ${block} have no table: the block is not installed or takes no extra columns.`
|
|
1070
|
+
});
|
|
1071
|
+
return issues;
|
|
1072
|
+
}
|
|
1073
|
+
//#endregion
|
|
1074
|
+
//#region src/create/preview-provider.ts
|
|
1075
|
+
/**
|
|
1076
|
+
* A stand-in for the app's authorization provider, so `/create` can render the
|
|
1077
|
+
* SQL and the diagram for `access: "provider"`. Its templates call functions in
|
|
1078
|
+
* a `provider` schema that no real project has: the preview says so next to the
|
|
1079
|
+
* output.
|
|
1080
|
+
*/
|
|
1081
|
+
function previewAccessProvider(preset) {
|
|
1082
|
+
return {
|
|
1083
|
+
name: "your authorization provider",
|
|
1084
|
+
scope: preset.tenantName,
|
|
1085
|
+
idType: preset.idType,
|
|
1086
|
+
functions: {
|
|
1087
|
+
idsWith: "provider.ids_with('{scope}', {permission})",
|
|
1088
|
+
idsWithFor: "provider.ids_with_for({user}, '{scope}', {permission})",
|
|
1089
|
+
isPlatform: "provider.is_platform({permission})",
|
|
1090
|
+
isPlatformFor: "provider.is_platform_for({user}, {permission})",
|
|
1091
|
+
memberIds: "provider.member_ids('{scope}')",
|
|
1092
|
+
memberIdsFor: "provider.member_ids_for({user}, '{scope}')"
|
|
1096
1093
|
}
|
|
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
1094
|
};
|
|
1268
1095
|
}
|
|
1269
1096
|
/**
|
|
1270
|
-
*
|
|
1271
|
-
*
|
|
1272
|
-
*
|
|
1273
|
-
* column's name after the change.
|
|
1097
|
+
* The files `sql sync` writes for a config with only this preset and its
|
|
1098
|
+
* `/create` design (app tables and extra columns). With `access: "provider"`
|
|
1099
|
+
* the access functions come from `previewAccessProvider`.
|
|
1274
1100
|
*/
|
|
1275
|
-
function
|
|
1276
|
-
const
|
|
1277
|
-
const
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
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
|
-
};
|
|
1101
|
+
function previewFiles(code, design = {}) {
|
|
1102
|
+
const preset = presetOf(code);
|
|
1103
|
+
const config = resolveConfig(Object.keys(design).length === 0 ? { preset: code } : designConfig(resolvePreset(preset), design), "/");
|
|
1104
|
+
const provider = preset.access === "provider" ? previewAccessProvider(preset) : void 0;
|
|
1105
|
+
return renderModules(config.blockNames, moduleLayout(config, config.sql.testsDir, [], void 0, provider)).map((file) => ({
|
|
1106
|
+
path: file.path,
|
|
1107
|
+
module: file.module,
|
|
1108
|
+
contents: file.contents
|
|
1109
|
+
}));
|
|
1307
1110
|
}
|
|
1308
1111
|
//#endregion
|
|
1309
|
-
//#region src/create/
|
|
1310
|
-
|
|
1311
|
-
const MIGRATION_NAME = "better_supabase_blocks";
|
|
1112
|
+
//#region src/create/schema-meta.ts
|
|
1113
|
+
const AUTH_USERS = "auth.users";
|
|
1312
1114
|
/**
|
|
1313
|
-
*
|
|
1314
|
-
*
|
|
1315
|
-
* functions no real project has.
|
|
1115
|
+
* The tenant name the module defaults use, which a preset's tenant name
|
|
1116
|
+
* replaces.
|
|
1316
1117
|
*/
|
|
1317
|
-
|
|
1318
|
-
|
|
1118
|
+
const DEFAULT_TENANT = "organization";
|
|
1119
|
+
/**
|
|
1120
|
+
* Finds the parsed table for a module's logical table by its default name, or
|
|
1121
|
+
* by that name with the tenant renamed (`organizations` is `workspaces` for the
|
|
1122
|
+
* `workspace` tenant).
|
|
1123
|
+
*/
|
|
1124
|
+
function indexTables(tables, tenantName) {
|
|
1125
|
+
const byName = new Map(tables.map((table) => [`${table.module}:${table.name}`, table]));
|
|
1126
|
+
return (module, name) => byName.get(`${module}:${name}`) ?? byName.get(`${module}:${name.replaceAll(DEFAULT_TENANT, tenantName)}`);
|
|
1127
|
+
}
|
|
1128
|
+
function moduleTables(module) {
|
|
1129
|
+
return Object.entries(SQL_MODULES[module]?.names?.tables ?? {});
|
|
1319
1130
|
}
|
|
1320
1131
|
/**
|
|
1321
|
-
* The
|
|
1322
|
-
*
|
|
1323
|
-
* `sql data` apply them. pgTAP tests stay out.
|
|
1132
|
+
* The table the tenant columns point at: the target most foreign keys on a
|
|
1133
|
+
* tenant column share. `null` when no table has a tenant foreign key.
|
|
1324
1134
|
*/
|
|
1325
|
-
function
|
|
1326
|
-
const
|
|
1327
|
-
const
|
|
1328
|
-
|
|
1135
|
+
function tenantTable(tables) {
|
|
1136
|
+
const counts = /* @__PURE__ */ new Map();
|
|
1137
|
+
for (const table of tables) for (const key of table.foreignKeys) if (table.tenantColumn !== null && key.columns.length === 1 && key.columns[0] === table.tenantColumn) {
|
|
1138
|
+
const to = `${key.target.schema}.${key.target.table}`;
|
|
1139
|
+
counts.set(to, (counts.get(to) ?? 0) + 1);
|
|
1140
|
+
}
|
|
1141
|
+
let best = null;
|
|
1142
|
+
let most = 0;
|
|
1143
|
+
for (const [id, count] of counts) if (count > most) {
|
|
1144
|
+
best = id;
|
|
1145
|
+
most = count;
|
|
1146
|
+
}
|
|
1147
|
+
return best;
|
|
1329
1148
|
}
|
|
1330
|
-
/**
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1149
|
+
/**
|
|
1150
|
+
* The physical column a logical lifecycle column maps to. A tenant name renames
|
|
1151
|
+
* `organization_id`, so a default name the table lacks falls back to the
|
|
1152
|
+
* table's tenant column.
|
|
1153
|
+
*/
|
|
1154
|
+
function physicalColumn(table, name, tenant) {
|
|
1155
|
+
if (name === void 0) return;
|
|
1156
|
+
if (table.columns.some((column) => column.name === name)) return name;
|
|
1157
|
+
return tenant && table.tenantColumn !== null ? table.tenantColumn : void 0;
|
|
1336
1158
|
}
|
|
1337
|
-
|
|
1338
|
-
|
|
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
|
-
};
|
|
1159
|
+
function hasForeignKey(table, column) {
|
|
1160
|
+
return table.foreignKeys.some((key) => key.columns.length === 1 && key.columns[0] === column);
|
|
1364
1161
|
}
|
|
1365
1162
|
/**
|
|
1366
|
-
*
|
|
1367
|
-
*
|
|
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.
|
|
1163
|
+
* The soft references in the tables: lifecycle tenant and user columns without
|
|
1164
|
+
* a foreign key, and `regclass` columns, which name any table.
|
|
1371
1165
|
*/
|
|
1372
|
-
function
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
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
|
-
};
|
|
1166
|
+
function softReferences(tables, tenantName = DEFAULT_TENANT) {
|
|
1167
|
+
const lookup = indexTables(tables, tenantName);
|
|
1168
|
+
const tenantTo = tenantTable(tables);
|
|
1169
|
+
const refs = [];
|
|
1170
|
+
const seen = /* @__PURE__ */ new Set();
|
|
1171
|
+
const add = (ref) => {
|
|
1172
|
+
const key = `${ref.from}.${ref.column}`;
|
|
1173
|
+
if (!seen.has(key)) {
|
|
1174
|
+
seen.add(key);
|
|
1175
|
+
refs.push(ref);
|
|
1402
1176
|
}
|
|
1403
|
-
|
|
1404
|
-
|
|
1177
|
+
};
|
|
1178
|
+
for (const block of new Set(tables.map((table) => table.module))) for (const [, spec] of moduleTables(block)) {
|
|
1179
|
+
const table = lookup(block, spec.name);
|
|
1180
|
+
const lifecycle = spec.lifecycle;
|
|
1181
|
+
if (table === void 0 || lifecycle === void 0) continue;
|
|
1182
|
+
const tenant = physicalColumn(table, lifecycle.tenant === void 0 ? void 0 : spec.columns[lifecycle.tenant], true);
|
|
1183
|
+
if (tenant !== void 0 && tenantTo !== null && tenantTo !== table.id && !hasForeignKey(table, tenant)) add({
|
|
1184
|
+
from: table.id,
|
|
1185
|
+
column: tenant,
|
|
1186
|
+
to: tenantTo,
|
|
1187
|
+
kind: "tenant"
|
|
1188
|
+
});
|
|
1189
|
+
const user = physicalColumn(table, lifecycle.user === void 0 ? void 0 : spec.columns[lifecycle.user], false);
|
|
1190
|
+
if (user !== void 0 && !hasForeignKey(table, user)) add({
|
|
1191
|
+
from: table.id,
|
|
1192
|
+
column: user,
|
|
1193
|
+
to: AUTH_USERS,
|
|
1194
|
+
kind: "user"
|
|
1195
|
+
});
|
|
1405
1196
|
}
|
|
1197
|
+
for (const table of tables) for (const column of table.columns) if (column.type.toLowerCase() === "regclass") add({
|
|
1198
|
+
from: table.id,
|
|
1199
|
+
column: column.name,
|
|
1200
|
+
to: null,
|
|
1201
|
+
kind: "any"
|
|
1202
|
+
});
|
|
1203
|
+
return refs;
|
|
1204
|
+
}
|
|
1205
|
+
const MANIFEST_BY_MODULE = new Map(PRESET_CATALOG.blocks.map((block) => [block.name, block.manifest]));
|
|
1206
|
+
const EXTRA_TABLE_BY_MODULE = new Map(PRESET_CATALOG.blocks.flatMap((block) => block.extraColumns === void 0 ? [] : [[block.name, block.extraColumns]]));
|
|
1207
|
+
/** Each table's module and logical table name. */
|
|
1208
|
+
function blockTables(tables, lookup) {
|
|
1209
|
+
return Object.fromEntries(tables.flatMap((table) => {
|
|
1210
|
+
const logical = moduleTables(table.module).find(([, spec]) => lookup(table.module, spec.name) === table)?.[0];
|
|
1211
|
+
return logical === void 0 ? [] : [[table.id, {
|
|
1212
|
+
block: table.module,
|
|
1213
|
+
table: logical
|
|
1214
|
+
}]];
|
|
1215
|
+
}));
|
|
1216
|
+
}
|
|
1217
|
+
/** The table ids `blocks.<module>.options.extraColumns` adds columns to. */
|
|
1218
|
+
function extraColumnTables(tables, lookup) {
|
|
1219
|
+
const installed = new Set(tables.map((table) => table.module));
|
|
1220
|
+
return [...EXTRA_TABLE_BY_MODULE].flatMap(([module, logical]) => {
|
|
1221
|
+
const spec = SQL_MODULES[module]?.names?.tables[logical];
|
|
1222
|
+
const table = !installed.has(module) || spec === void 0 ? void 0 : lookup(module, spec.name);
|
|
1223
|
+
return table === void 0 ? [] : [table.id];
|
|
1224
|
+
});
|
|
1406
1225
|
}
|
|
1407
|
-
//#endregion
|
|
1408
|
-
//#region src/create/preview-provider.ts
|
|
1409
1226
|
/**
|
|
1410
|
-
*
|
|
1411
|
-
*
|
|
1412
|
-
* functions in a `provider` schema that no real project has: the preview
|
|
1413
|
-
* says so next to the output.
|
|
1227
|
+
* The tables plus the soft references, manifests and extra-column tables the
|
|
1228
|
+
* canvas draws.
|
|
1414
1229
|
*/
|
|
1415
|
-
function
|
|
1230
|
+
function schemaData(tables, tenantName = DEFAULT_TENANT) {
|
|
1231
|
+
const lookup = indexTables(tables, tenantName);
|
|
1416
1232
|
return {
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
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
|
-
}
|
|
1233
|
+
tables,
|
|
1234
|
+
softRefs: softReferences(tables, tenantName),
|
|
1235
|
+
manifests: Object.fromEntries(tables.map((table) => [table.id, MANIFEST_BY_MODULE.get(table.module) ?? table.module])),
|
|
1236
|
+
extraColumns: extraColumnTables(tables, lookup),
|
|
1237
|
+
blockTables: blockTables(tables, lookup),
|
|
1238
|
+
tenantTable: tenantTable(tables)
|
|
1428
1239
|
};
|
|
1429
1240
|
}
|
|
1241
|
+
//#endregion
|
|
1242
|
+
//#region src/create/schema.ts
|
|
1430
1243
|
/**
|
|
1431
|
-
* The
|
|
1432
|
-
*
|
|
1433
|
-
* `access: "provider"` the access functions come from
|
|
1434
|
-
* `previewAccessProvider`.
|
|
1244
|
+
* The columns a diagram shows before a table is expanded: keys, tenant and soft
|
|
1245
|
+
* references.
|
|
1435
1246
|
*/
|
|
1436
|
-
function
|
|
1437
|
-
const
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
|
|
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));
|
|
1247
|
+
function keyColumnsOf(table, softColumns = /* @__PURE__ */ new Set()) {
|
|
1248
|
+
const keys = /* @__PURE__ */ new Set([
|
|
1249
|
+
...table.primaryKey,
|
|
1250
|
+
...table.foreignKeys.flatMap((key) => key.columns),
|
|
1251
|
+
...table.tenantColumn === null ? [] : [table.tenantColumn],
|
|
1252
|
+
...softColumns
|
|
1253
|
+
]);
|
|
1254
|
+
return table.columns.filter((column) => keys.has(column.name));
|
|
1491
1255
|
}
|
|
1492
|
-
/**
|
|
1493
|
-
|
|
1494
|
-
|
|
1256
|
+
/**
|
|
1257
|
+
* The column the tenant blocks key rows by, from the preset's tenant name;
|
|
1258
|
+
* `null` without tenants.
|
|
1259
|
+
*/
|
|
1260
|
+
function tenantColumnOf(preset) {
|
|
1261
|
+
return preset.scope === "tenant" ? `${preset.tenantName}_id` : null;
|
|
1495
1262
|
}
|
|
1496
|
-
|
|
1497
|
-
|
|
1263
|
+
/**
|
|
1264
|
+
* Every module's file creates this table to record the installed modules. It
|
|
1265
|
+
* holds no app data, so the diagram leaves it out.
|
|
1266
|
+
*/
|
|
1267
|
+
const BOOKKEEPING_TABLES = /* @__PURE__ */ new Set(["better_supabase.modules"]);
|
|
1268
|
+
const IDENT = String.raw`(?:"(?:[^"]|"")+"|[A-Za-z_][A-Za-z0-9_$]*)`;
|
|
1269
|
+
const QNAME = String.raw`${IDENT}(?:\s*\.\s*${IDENT})?`;
|
|
1270
|
+
const CREATE_TABLE = /\bcreate\s+(?:(?:global\s+|local\s+)?(?:temp|temporary)\s+|unlogged\s+)?table\b/giu;
|
|
1271
|
+
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");
|
|
1272
|
+
const ALTER_TABLE = new RegExp(String.raw`\balter\s+table\s+(?:if\s+exists\s+)?(?:only\s+)?(${QNAME})\s+([^;]*);`, "giu");
|
|
1273
|
+
const REFERENCES = new RegExp(String.raw`\breferences\s+(${QNAME})\s*(?:\(([^)]*)\))?`, "iu");
|
|
1274
|
+
const LEADING_IDENT = new RegExp(String.raw`^(${IDENT})\s*`, "u");
|
|
1275
|
+
const CONSTRAINT_NAME = new RegExp(String.raw`^constraint\s+${IDENT}\s+`, "iu");
|
|
1276
|
+
/** Words that end a column's type in its definition. */
|
|
1277
|
+
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;
|
|
1278
|
+
function unquote(ident) {
|
|
1279
|
+
const trimmed = ident.trim();
|
|
1280
|
+
return trimmed.startsWith("\"") ? trimmed.slice(1, -1).replaceAll("\"\"", "\"") : trimmed.toLowerCase();
|
|
1498
1281
|
}
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
|
|
1282
|
+
function qualified(name) {
|
|
1283
|
+
const [first = "", second] = (name.match(new RegExp(IDENT, "gu")) ?? []).map((each) => unquote(each));
|
|
1284
|
+
return second === void 0 ? {
|
|
1285
|
+
schema: "public",
|
|
1286
|
+
table: first
|
|
1287
|
+
} : {
|
|
1288
|
+
schema: first,
|
|
1289
|
+
table: second
|
|
1290
|
+
};
|
|
1503
1291
|
}
|
|
1504
|
-
function
|
|
1505
|
-
|
|
1506
|
-
return column.max === void 0 ? value : Math.min(value, column.max);
|
|
1292
|
+
function identList(list) {
|
|
1293
|
+
return (list ?? "").split(",").map((each) => each.trim()).filter((each) => each !== "").map((each) => unquote(each));
|
|
1507
1294
|
}
|
|
1508
|
-
|
|
1509
|
-
|
|
1510
|
-
|
|
1511
|
-
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
|
|
1520
|
-
|
|
1521
|
-
|
|
1522
|
-
|
|
1523
|
-
|
|
1295
|
+
/**
|
|
1296
|
+
* The SQL with comments removed and the inside of every single-quoted string
|
|
1297
|
+
* blanked, so a `create table` inside a string or a comment is not read and the
|
|
1298
|
+
* offsets still match the original text.
|
|
1299
|
+
*/
|
|
1300
|
+
function codeOnly(sql) {
|
|
1301
|
+
let out = "";
|
|
1302
|
+
let index = 0;
|
|
1303
|
+
while (index < sql.length) {
|
|
1304
|
+
const char = sql[index];
|
|
1305
|
+
const next = sql[index + 1];
|
|
1306
|
+
if (char === "-" && next === "-") {
|
|
1307
|
+
const end = sql.indexOf("\n", index);
|
|
1308
|
+
const stop = end === -1 ? sql.length : end;
|
|
1309
|
+
out += " ".repeat(stop - index);
|
|
1310
|
+
index = stop;
|
|
1311
|
+
} else if (char === "/" && next === "*") {
|
|
1312
|
+
const end = sql.indexOf("*/", index + 2);
|
|
1313
|
+
const stop = end === -1 ? sql.length : end + 2;
|
|
1314
|
+
out += sql.slice(index, stop).replaceAll(/[^\n]/gu, " ");
|
|
1315
|
+
index = stop;
|
|
1316
|
+
} else if (char === "'") {
|
|
1317
|
+
let stop = index + 1;
|
|
1318
|
+
while (stop < sql.length) if (sql[stop] === "'" && sql[stop + 1] === "'") stop += 2;
|
|
1319
|
+
else if (sql[stop] === "'") break;
|
|
1320
|
+
else stop += 1;
|
|
1321
|
+
out += `'${sql.slice(index + 1, stop).replaceAll(/[^\n]/gu, " ")}'`;
|
|
1322
|
+
index = stop + 1;
|
|
1323
|
+
} else {
|
|
1324
|
+
out += char;
|
|
1325
|
+
index += 1;
|
|
1326
|
+
}
|
|
1524
1327
|
}
|
|
1328
|
+
return out;
|
|
1525
1329
|
}
|
|
1526
|
-
|
|
1527
|
-
|
|
1528
|
-
|
|
1529
|
-
|
|
1530
|
-
|
|
1531
|
-
|
|
1532
|
-
|
|
1533
|
-
|
|
1534
|
-
|
|
1535
|
-
|
|
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;
|
|
1330
|
+
/**
|
|
1331
|
+
* The text between the `(` at `open` and its matching `)`, or undefined when it
|
|
1332
|
+
* never closes.
|
|
1333
|
+
*/
|
|
1334
|
+
function balanced(text, open) {
|
|
1335
|
+
let depth = 0;
|
|
1336
|
+
for (let index = open; index < text.length; index += 1) if (text[index] === "(") depth += 1;
|
|
1337
|
+
else if (text[index] === ")") {
|
|
1338
|
+
depth -= 1;
|
|
1339
|
+
if (depth === 0) return text.slice(open + 1, index);
|
|
1545
1340
|
}
|
|
1546
1341
|
}
|
|
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
1342
|
/**
|
|
1554
|
-
*
|
|
1555
|
-
*
|
|
1556
|
-
* row it points at, so rows of related tables line up. A `member` viewer
|
|
1557
|
-
* doesn't get the columns `hiddenColumns` lists.
|
|
1343
|
+
* The comma-separated elements of `text` at depth 0, with `original` sliced at
|
|
1344
|
+
* the same offsets.
|
|
1558
1345
|
*/
|
|
1559
|
-
function
|
|
1560
|
-
const
|
|
1561
|
-
|
|
1562
|
-
|
|
1563
|
-
|
|
1346
|
+
function splitTopLevel(text, original = text) {
|
|
1347
|
+
const parts = [];
|
|
1348
|
+
let depth = 0;
|
|
1349
|
+
let start = 0;
|
|
1350
|
+
const push = (end) => {
|
|
1351
|
+
const code = text.slice(start, end);
|
|
1352
|
+
const lead = code.length - code.trimStart().length;
|
|
1353
|
+
const trimmed = code.trim();
|
|
1354
|
+
if (trimmed !== "") parts.push({
|
|
1355
|
+
code: trimmed,
|
|
1356
|
+
original: original.slice(start + lead, start + lead + trimmed.length)
|
|
1357
|
+
});
|
|
1564
1358
|
};
|
|
1565
|
-
|
|
1566
|
-
|
|
1567
|
-
|
|
1359
|
+
for (let index = 0; index < text.length; index += 1) {
|
|
1360
|
+
const char = text[index];
|
|
1361
|
+
if (char === "(") depth += 1;
|
|
1362
|
+
else if (char === ")") depth -= 1;
|
|
1363
|
+
else if (char === "," && depth === 0) {
|
|
1364
|
+
push(index);
|
|
1365
|
+
start = index + 1;
|
|
1366
|
+
}
|
|
1367
|
+
}
|
|
1368
|
+
push(text.length);
|
|
1369
|
+
return parts;
|
|
1370
|
+
}
|
|
1371
|
+
function lineOf(text, offset) {
|
|
1372
|
+
return text.slice(0, offset).split("\n").length;
|
|
1373
|
+
}
|
|
1374
|
+
function target(match) {
|
|
1375
|
+
const { schema, table } = qualified(match[1] ?? "");
|
|
1568
1376
|
return {
|
|
1569
|
-
|
|
1570
|
-
|
|
1377
|
+
schema,
|
|
1378
|
+
table,
|
|
1379
|
+
columns: identList(match[2])
|
|
1571
1380
|
};
|
|
1572
1381
|
}
|
|
1573
|
-
|
|
1574
|
-
|
|
1575
|
-
|
|
1576
|
-
|
|
1577
|
-
|
|
1382
|
+
const ON_DELETE = /\bon\s+delete\s+(cascade|restrict|set\s+null|set\s+default|no\s+action)\b/iu;
|
|
1383
|
+
/** The `on delete` action of a reference, `no action` when it names none. */
|
|
1384
|
+
function onDeleteOf(text) {
|
|
1385
|
+
return (ON_DELETE.exec(text)?.[1] ?? "no action").toLowerCase().replaceAll(/\s+/gu, " ");
|
|
1386
|
+
}
|
|
1387
|
+
/** Words that end a column's default expression at the top level. */
|
|
1388
|
+
const DEFAULT_END = /^(?:not\s+null|null|primary\s+key|references|unique|check|constraint|generated|collate)\b/iu;
|
|
1578
1389
|
/**
|
|
1579
|
-
*
|
|
1580
|
-
*
|
|
1581
|
-
*
|
|
1390
|
+
* The `default` expression of a column definition. `definition` is the code
|
|
1391
|
+
* with strings blanked and `original` the same text as written, so a keyword
|
|
1392
|
+
* inside a string never ends the expression.
|
|
1582
1393
|
*/
|
|
1583
|
-
function
|
|
1584
|
-
const
|
|
1585
|
-
|
|
1394
|
+
function defaultOf(definition, original) {
|
|
1395
|
+
const start = /\bdefault\s+/iu.exec(definition);
|
|
1396
|
+
if (start === null) return null;
|
|
1397
|
+
const from = start.index + start[0].length;
|
|
1398
|
+
let depth = 0;
|
|
1399
|
+
let end = definition.length;
|
|
1400
|
+
for (let index = from; index < definition.length; index += 1) {
|
|
1401
|
+
const char = definition[index];
|
|
1402
|
+
if (char === "(") depth += 1;
|
|
1403
|
+
else if (char === ")") depth -= 1;
|
|
1404
|
+
else if (depth === 0 && /\s/u.test(char ?? "") && DEFAULT_END.test(definition.slice(index).trimStart())) {
|
|
1405
|
+
end = index;
|
|
1406
|
+
break;
|
|
1407
|
+
}
|
|
1408
|
+
}
|
|
1409
|
+
return original.slice(from, end).trim();
|
|
1586
1410
|
}
|
|
1587
|
-
|
|
1588
|
-
|
|
1411
|
+
/** Adds a column definition (`"name" type ...`) to the draft. */
|
|
1412
|
+
function addColumn(draft, definition, original = definition) {
|
|
1413
|
+
const head = definition.match(LEADING_IDENT);
|
|
1414
|
+
if (head === null) return;
|
|
1415
|
+
const name = unquote(head[1] ?? "");
|
|
1416
|
+
const rest = definition.slice(head[0].length);
|
|
1417
|
+
const typeEnd = rest.search(TYPE_END);
|
|
1418
|
+
const type = (typeEnd === -1 ? rest : rest.slice(0, typeEnd)).trim();
|
|
1419
|
+
if (draft.columns.some((column) => column.name === name)) return;
|
|
1420
|
+
const primary = /\bprimary\s+key\b/iu.test(rest);
|
|
1421
|
+
draft.columns.push({
|
|
1422
|
+
name,
|
|
1423
|
+
type,
|
|
1424
|
+
nullable: !primary && !/\bnot\s+null\b/iu.test(rest),
|
|
1425
|
+
default: defaultOf(definition, original),
|
|
1426
|
+
unique: /\bunique\b/iu.test(rest)
|
|
1427
|
+
});
|
|
1428
|
+
if (primary) draft.primaryKey = [name];
|
|
1429
|
+
const references = rest.match(REFERENCES);
|
|
1430
|
+
if (references !== null) draft.foreignKeys.push({
|
|
1431
|
+
columns: [name],
|
|
1432
|
+
target: target(references),
|
|
1433
|
+
onDelete: onDeleteOf(rest)
|
|
1434
|
+
});
|
|
1589
1435
|
}
|
|
1590
1436
|
/**
|
|
1591
|
-
*
|
|
1592
|
-
*
|
|
1437
|
+
* Adds a table constraint (`primary key (...)`, `foreign key (...) references
|
|
1438
|
+
* ...`). Returns false when the element is not a constraint.
|
|
1593
1439
|
*/
|
|
1594
|
-
function
|
|
1595
|
-
const
|
|
1596
|
-
|
|
1597
|
-
|
|
1598
|
-
|
|
1440
|
+
function addConstraint(draft, element) {
|
|
1441
|
+
const body = element.replace(CONSTRAINT_NAME, "");
|
|
1442
|
+
const named = body !== element;
|
|
1443
|
+
const primary = /^primary\s+key\s*\(([^)]*)\)/iu.exec(body);
|
|
1444
|
+
if (primary !== null) {
|
|
1445
|
+
draft.primaryKey = identList(primary[1]);
|
|
1446
|
+
return true;
|
|
1599
1447
|
}
|
|
1600
|
-
|
|
1601
|
-
|
|
1602
|
-
|
|
1603
|
-
|
|
1604
|
-
|
|
1448
|
+
const foreign = /^foreign\s+key\s*\(([^)]*)\)\s*([\s\S]*)$/iu.exec(body);
|
|
1449
|
+
if (foreign !== null) {
|
|
1450
|
+
const references = (foreign[2] ?? "").match(REFERENCES);
|
|
1451
|
+
if (references !== null) draft.foreignKeys.push({
|
|
1452
|
+
columns: identList(foreign[1]),
|
|
1453
|
+
target: target(references),
|
|
1454
|
+
onDelete: onDeleteOf(foreign[2] ?? "")
|
|
1455
|
+
});
|
|
1456
|
+
return true;
|
|
1605
1457
|
}
|
|
1606
|
-
return
|
|
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;
|
|
1458
|
+
return named || /^(?:unique|check|exclude)\b/iu.test(body);
|
|
1617
1459
|
}
|
|
1618
|
-
function
|
|
1619
|
-
|
|
1460
|
+
function finish(draft, tenantColumn) {
|
|
1461
|
+
const tenant = tenantColumn !== null && draft.columns.some((column) => column.name === tenantColumn) ? tenantColumn : null;
|
|
1462
|
+
const primary = new Set(draft.primaryKey);
|
|
1463
|
+
return {
|
|
1464
|
+
id: `${draft.schema}.${draft.name}`,
|
|
1465
|
+
schema: draft.schema,
|
|
1466
|
+
name: draft.name,
|
|
1467
|
+
module: draft.module,
|
|
1468
|
+
primaryKey: draft.primaryKey,
|
|
1469
|
+
foreignKeys: draft.foreignKeys,
|
|
1470
|
+
tenantColumn: tenant,
|
|
1471
|
+
columns: draft.columns.map((column) => primary.has(column.name) ? {
|
|
1472
|
+
...column,
|
|
1473
|
+
nullable: false
|
|
1474
|
+
} : column)
|
|
1475
|
+
};
|
|
1620
1476
|
}
|
|
1621
1477
|
/**
|
|
1622
|
-
* The
|
|
1623
|
-
*
|
|
1478
|
+
* The tables in rendered module SQL: every `create table`, plus the columns and
|
|
1479
|
+
* foreign keys later `alter table ... add` statements give them. A `create
|
|
1480
|
+
* table` it can't read throws with the file and line, so a new SQL shape fails
|
|
1481
|
+
* the tests instead of dropping a table from the diagram.
|
|
1624
1482
|
*/
|
|
1625
|
-
function
|
|
1626
|
-
const
|
|
1627
|
-
const
|
|
1628
|
-
|
|
1629
|
-
|
|
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
|
-
}]];
|
|
1483
|
+
function parseSchema(files, options = {}) {
|
|
1484
|
+
const drafts = /* @__PURE__ */ new Map();
|
|
1485
|
+
const code = files.map((file) => ({
|
|
1486
|
+
file,
|
|
1487
|
+
text: codeOnly(file.contents)
|
|
1674
1488
|
}));
|
|
1489
|
+
for (const { file, text } of code) for (const match of text.matchAll(CREATE_TABLE)) {
|
|
1490
|
+
const offset = match.index;
|
|
1491
|
+
const head = text.slice(offset).match(CREATE_HEAD);
|
|
1492
|
+
const open = head === null ? -1 : offset + head[0].length - 1;
|
|
1493
|
+
const body = open === -1 ? void 0 : balanced(text, open);
|
|
1494
|
+
const original = body === void 0 ? "" : file.contents.slice(open + 1, open + 1 + body.length);
|
|
1495
|
+
if (head === null || body === void 0) throw new Error(`parseSchema can't read the create table at ${file.path}:${lineOf(text, offset)}.`);
|
|
1496
|
+
const { schema, table } = qualified(head[1] ?? "");
|
|
1497
|
+
const id = `${schema}.${table}`;
|
|
1498
|
+
if (drafts.has(id)) continue;
|
|
1499
|
+
const draft = {
|
|
1500
|
+
schema,
|
|
1501
|
+
name: table,
|
|
1502
|
+
module: file.module,
|
|
1503
|
+
columns: [],
|
|
1504
|
+
primaryKey: [],
|
|
1505
|
+
foreignKeys: []
|
|
1506
|
+
};
|
|
1507
|
+
for (const element of splitTopLevel(body, original)) if (!addConstraint(draft, element.code)) addColumn(draft, element.code, element.original);
|
|
1508
|
+
drafts.set(id, draft);
|
|
1509
|
+
}
|
|
1510
|
+
for (const { file, text } of code) for (const match of text.matchAll(ALTER_TABLE)) {
|
|
1511
|
+
const { schema, table } = qualified(match[1] ?? "");
|
|
1512
|
+
const draft = drafts.get(`${schema}.${table}`);
|
|
1513
|
+
if (draft === void 0) continue;
|
|
1514
|
+
const actions = match[2] ?? "";
|
|
1515
|
+
const start = match.index + match[0].lastIndexOf(actions);
|
|
1516
|
+
const original = file.contents.slice(start, start + actions.length);
|
|
1517
|
+
for (const action of splitTopLevel(actions, original)) {
|
|
1518
|
+
const column = /^add\s+column\s+(?:if\s+not\s+exists\s+)?/iu.exec(action.code);
|
|
1519
|
+
if (column !== null) addColumn(draft, action.code.slice(column[0].length), action.original.slice(column[0].length));
|
|
1520
|
+
else if (/^add\s+/iu.test(action.code)) addConstraint(draft, action.code.replace(/^add\s+/iu, ""));
|
|
1521
|
+
}
|
|
1522
|
+
}
|
|
1523
|
+
const tenantColumn = options.tenantColumn ?? null;
|
|
1524
|
+
return [...drafts.entries()].filter(([id]) => !BOOKKEEPING_TABLES.has(id)).map(([, draft]) => finish(draft, tenantColumn));
|
|
1675
1525
|
}
|
|
1676
|
-
/**
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
|
|
1681
|
-
|
|
1682
|
-
|
|
1683
|
-
|
|
1526
|
+
/**
|
|
1527
|
+
* The statements that shape one table, as written: its `create table` and the
|
|
1528
|
+
* `alter table` statements after it. Empty when no file creates it.
|
|
1529
|
+
*/
|
|
1530
|
+
function tableStatements(files, id) {
|
|
1531
|
+
const statements = [];
|
|
1532
|
+
for (const file of files) {
|
|
1533
|
+
const text = codeOnly(file.contents);
|
|
1534
|
+
for (const match of text.matchAll(CREATE_TABLE)) {
|
|
1535
|
+
const head = text.slice(match.index).match(CREATE_HEAD);
|
|
1536
|
+
if (head === null) continue;
|
|
1537
|
+
const { schema, table } = qualified(head[1] ?? "");
|
|
1538
|
+
const open = match.index + head[0].length - 1;
|
|
1539
|
+
const body = balanced(text, open);
|
|
1540
|
+
if (`${schema}.${table}` !== id || body === void 0) continue;
|
|
1541
|
+
const end = text.indexOf(";", open + body.length + 1);
|
|
1542
|
+
statements.push(file.contents.slice(match.index, end === -1 ? text.length : end + 1));
|
|
1543
|
+
}
|
|
1544
|
+
for (const match of text.matchAll(ALTER_TABLE)) {
|
|
1545
|
+
const { schema, table } = qualified(match[1] ?? "");
|
|
1546
|
+
if (`${schema}.${table}` === id) statements.push(file.contents.slice(match.index, match.index + match[0].length));
|
|
1547
|
+
}
|
|
1548
|
+
}
|
|
1549
|
+
return statements;
|
|
1684
1550
|
}
|
|
1685
|
-
/**
|
|
1686
|
-
|
|
1687
|
-
|
|
1551
|
+
/**
|
|
1552
|
+
* The foreign keys between tables, one per pair, with the targets outside the
|
|
1553
|
+
* schema named by id.
|
|
1554
|
+
*/
|
|
1555
|
+
function schemaRelations(tables) {
|
|
1556
|
+
const seen = /* @__PURE__ */ new Set();
|
|
1557
|
+
return tables.flatMap((table) => table.foreignKeys.flatMap((key) => {
|
|
1558
|
+
const to = `${key.target.schema}.${key.target.table}`;
|
|
1559
|
+
const pair = `${table.id}>${to}`;
|
|
1560
|
+
if (to === table.id || seen.has(pair)) return [];
|
|
1561
|
+
seen.add(pair);
|
|
1562
|
+
return [{
|
|
1563
|
+
from: table.id,
|
|
1564
|
+
to
|
|
1565
|
+
}];
|
|
1566
|
+
}));
|
|
1567
|
+
}
|
|
1568
|
+
//#endregion
|
|
1569
|
+
//#region src/create/check.ts
|
|
1570
|
+
const messageOf = (error) => error instanceof Error ? error.message : String(error);
|
|
1571
|
+
/** The issue for a design that failed to parse, with its code and path. */
|
|
1572
|
+
function parseIssue(error) {
|
|
1573
|
+
const { code, path } = error instanceof DesignParseError ? error : {
|
|
1574
|
+
code: "invalid_design",
|
|
1575
|
+
path: ""
|
|
1576
|
+
};
|
|
1688
1577
|
return {
|
|
1689
|
-
|
|
1690
|
-
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
blockTables: blockTables(tables, lookup),
|
|
1694
|
-
tenantTable: tenantTable(tables)
|
|
1578
|
+
code,
|
|
1579
|
+
path,
|
|
1580
|
+
table: tableAt(path),
|
|
1581
|
+
message: messageOf(error)
|
|
1695
1582
|
};
|
|
1696
1583
|
}
|
|
1697
|
-
|
|
1698
|
-
|
|
1699
|
-
|
|
1700
|
-
|
|
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));
|
|
1584
|
+
/** The app table or block module a design path is in, or `design`. */
|
|
1585
|
+
function tableAt(path) {
|
|
1586
|
+
const [, key, name] = path.split("/");
|
|
1587
|
+
return (key === "appTables" || key === "extraColumns") && name !== void 0 ? name.replaceAll("~1", "/").replaceAll("~0", "~") : "design";
|
|
1708
1588
|
}
|
|
1709
|
-
|
|
1710
|
-
|
|
1711
|
-
|
|
1589
|
+
async function designFrom(input) {
|
|
1590
|
+
if (typeof input !== "string") return parseDesign(input);
|
|
1591
|
+
const design = await designOf(input);
|
|
1592
|
+
if (design === void 0) throw new DesignParseError("invalid_code", "", `design: "${input.slice(0, 40)}" is neither a design code nor a /create URL with &design=`);
|
|
1593
|
+
return design;
|
|
1594
|
+
}
|
|
1595
|
+
/**
|
|
1596
|
+
* Checks a design against a preset with every rule the canvas and `sql sync`
|
|
1597
|
+
* apply, so a server, an MCP tool and the canvas share one answer. `input` is a
|
|
1598
|
+
* design object, a design code or a `/create` URL with `&design=`. It never
|
|
1599
|
+
* throws for a bad design or preset: each problem is an issue.
|
|
1600
|
+
*/
|
|
1601
|
+
async function checkDesign(input, preset) {
|
|
1602
|
+
let design;
|
|
1603
|
+
try {
|
|
1604
|
+
design = await designFrom(input);
|
|
1605
|
+
} catch (error) {
|
|
1606
|
+
return {
|
|
1607
|
+
ok: false,
|
|
1608
|
+
issues: [parseIssue(error)]
|
|
1609
|
+
};
|
|
1610
|
+
}
|
|
1611
|
+
let resolvedPreset;
|
|
1612
|
+
try {
|
|
1613
|
+
resolvedPreset = presetOf(preset);
|
|
1614
|
+
} catch (error) {
|
|
1615
|
+
return {
|
|
1616
|
+
ok: false,
|
|
1617
|
+
issues: [{
|
|
1618
|
+
code: "invalid_preset",
|
|
1619
|
+
path: "",
|
|
1620
|
+
table: "preset",
|
|
1621
|
+
message: messageOf(error)
|
|
1622
|
+
}]
|
|
1623
|
+
};
|
|
1624
|
+
}
|
|
1625
|
+
const resolved = resolvePreset(resolvedPreset);
|
|
1626
|
+
if (resolved.conflicts.length > 0) return {
|
|
1627
|
+
ok: false,
|
|
1628
|
+
issues: resolved.conflicts.map((conflict) => ({
|
|
1629
|
+
code: "preset_conflict",
|
|
1630
|
+
path: "",
|
|
1631
|
+
table: "preset",
|
|
1632
|
+
message: `${conflict.block ?? conflict.field ?? "preset"}: ${conflict.reason}`
|
|
1633
|
+
}))
|
|
1634
|
+
};
|
|
1635
|
+
try {
|
|
1636
|
+
designConfig(resolved, design);
|
|
1637
|
+
} catch (error) {
|
|
1638
|
+
return {
|
|
1639
|
+
ok: false,
|
|
1640
|
+
issues: [parseIssue(error)]
|
|
1641
|
+
};
|
|
1642
|
+
}
|
|
1643
|
+
const data = schemaData(parseSchema(previewFiles(encodePreset(resolvedPreset)), { tenantColumn: tenantColumnOf(resolvedPreset) }), resolvedPreset.tenantName);
|
|
1644
|
+
const issues = designIssues(design, data, resolvedPreset);
|
|
1645
|
+
if (issues.length > 0) return {
|
|
1646
|
+
ok: false,
|
|
1647
|
+
issues
|
|
1648
|
+
};
|
|
1649
|
+
try {
|
|
1650
|
+
return {
|
|
1651
|
+
ok: true,
|
|
1652
|
+
design,
|
|
1653
|
+
fitsUrl: true,
|
|
1654
|
+
code: await encodeDesign(design)
|
|
1655
|
+
};
|
|
1656
|
+
} catch (error) {
|
|
1657
|
+
if (error instanceof DesignTooLongError) return {
|
|
1658
|
+
ok: true,
|
|
1659
|
+
design,
|
|
1660
|
+
fitsUrl: false,
|
|
1661
|
+
code: null
|
|
1662
|
+
};
|
|
1663
|
+
return {
|
|
1664
|
+
ok: false,
|
|
1665
|
+
issues: [parseIssue(error)]
|
|
1666
|
+
};
|
|
1667
|
+
}
|
|
1668
|
+
}
|
|
1669
|
+
//#endregion
|
|
1670
|
+
//#region src/create/column-kinds.ts
|
|
1671
|
+
/** The groups of the column type picker, in the order it shows them. */
|
|
1672
|
+
const KIND_GROUPS = [
|
|
1673
|
+
"Text",
|
|
1674
|
+
"Number",
|
|
1675
|
+
"Date and time",
|
|
1676
|
+
"Choice",
|
|
1677
|
+
"Relation",
|
|
1678
|
+
"Other"
|
|
1679
|
+
];
|
|
1680
|
+
const USERS$1 = "auth.users";
|
|
1681
|
+
/** The first options a new select gets, for the user to rename. */
|
|
1682
|
+
const STARTER_OPTIONS = ["Option A", "Option B"];
|
|
1683
|
+
const COLUMN_KINDS = [
|
|
1684
|
+
{
|
|
1685
|
+
id: "text",
|
|
1686
|
+
label: "Text",
|
|
1687
|
+
group: "Text",
|
|
1688
|
+
short: "text",
|
|
1689
|
+
column: { type: "text" }
|
|
1690
|
+
},
|
|
1691
|
+
{
|
|
1692
|
+
id: "long_text",
|
|
1693
|
+
label: "Long text",
|
|
1694
|
+
group: "Text",
|
|
1695
|
+
short: "long text",
|
|
1696
|
+
column: {
|
|
1697
|
+
type: "text",
|
|
1698
|
+
format: "long_text"
|
|
1699
|
+
}
|
|
1700
|
+
},
|
|
1701
|
+
{
|
|
1702
|
+
id: "email",
|
|
1703
|
+
label: "Email",
|
|
1704
|
+
group: "Text",
|
|
1705
|
+
short: "email",
|
|
1706
|
+
column: {
|
|
1707
|
+
type: "text",
|
|
1708
|
+
format: "email"
|
|
1709
|
+
}
|
|
1710
|
+
},
|
|
1711
|
+
{
|
|
1712
|
+
id: "url",
|
|
1713
|
+
label: "URL",
|
|
1714
|
+
group: "Text",
|
|
1715
|
+
short: "url",
|
|
1716
|
+
column: {
|
|
1717
|
+
type: "text",
|
|
1718
|
+
format: "url"
|
|
1719
|
+
}
|
|
1720
|
+
},
|
|
1721
|
+
{
|
|
1722
|
+
id: "phone",
|
|
1723
|
+
label: "Phone",
|
|
1724
|
+
group: "Text",
|
|
1725
|
+
short: "phone",
|
|
1726
|
+
column: {
|
|
1727
|
+
type: "text",
|
|
1728
|
+
format: "phone"
|
|
1729
|
+
}
|
|
1730
|
+
},
|
|
1731
|
+
{
|
|
1732
|
+
id: "color",
|
|
1733
|
+
label: "Color",
|
|
1734
|
+
group: "Text",
|
|
1735
|
+
short: "color",
|
|
1736
|
+
column: {
|
|
1737
|
+
type: "text",
|
|
1738
|
+
format: "color"
|
|
1739
|
+
}
|
|
1740
|
+
},
|
|
1741
|
+
{
|
|
1742
|
+
id: "integer",
|
|
1743
|
+
label: "Whole number",
|
|
1744
|
+
group: "Number",
|
|
1745
|
+
short: "integer",
|
|
1746
|
+
column: { type: "integer" }
|
|
1747
|
+
},
|
|
1748
|
+
{
|
|
1749
|
+
id: "bigint",
|
|
1750
|
+
label: "Large whole number",
|
|
1751
|
+
group: "Number",
|
|
1752
|
+
short: "bigint",
|
|
1753
|
+
column: { type: "bigint" }
|
|
1754
|
+
},
|
|
1755
|
+
{
|
|
1756
|
+
id: "numeric",
|
|
1757
|
+
label: "Decimal",
|
|
1758
|
+
group: "Number",
|
|
1759
|
+
short: "numeric",
|
|
1760
|
+
column: { type: "numeric" }
|
|
1761
|
+
},
|
|
1762
|
+
{
|
|
1763
|
+
id: "rating",
|
|
1764
|
+
label: "Rating",
|
|
1765
|
+
group: "Number",
|
|
1766
|
+
short: "rating",
|
|
1767
|
+
column: {
|
|
1768
|
+
type: "integer",
|
|
1769
|
+
format: "rating"
|
|
1770
|
+
}
|
|
1771
|
+
},
|
|
1772
|
+
{
|
|
1773
|
+
id: "percent",
|
|
1774
|
+
label: "Percent",
|
|
1775
|
+
group: "Number",
|
|
1776
|
+
short: "percent",
|
|
1777
|
+
column: {
|
|
1778
|
+
type: "numeric",
|
|
1779
|
+
format: "percent"
|
|
1780
|
+
}
|
|
1781
|
+
},
|
|
1782
|
+
{
|
|
1783
|
+
id: "currency",
|
|
1784
|
+
label: "Currency",
|
|
1785
|
+
group: "Number",
|
|
1786
|
+
short: "money",
|
|
1787
|
+
column: {
|
|
1788
|
+
type: "bigint",
|
|
1789
|
+
format: "currency"
|
|
1790
|
+
}
|
|
1791
|
+
},
|
|
1792
|
+
{
|
|
1793
|
+
id: "autonumber",
|
|
1794
|
+
label: "Autonumber",
|
|
1795
|
+
group: "Number",
|
|
1796
|
+
short: "autonumber",
|
|
1797
|
+
column: {
|
|
1798
|
+
type: "bigint",
|
|
1799
|
+
identity: true
|
|
1800
|
+
}
|
|
1801
|
+
},
|
|
1802
|
+
{
|
|
1803
|
+
id: "date",
|
|
1804
|
+
label: "Date",
|
|
1805
|
+
group: "Date and time",
|
|
1806
|
+
short: "date",
|
|
1807
|
+
column: { type: "date" }
|
|
1808
|
+
},
|
|
1809
|
+
{
|
|
1810
|
+
id: "timestamptz",
|
|
1811
|
+
label: "Date and time",
|
|
1812
|
+
group: "Date and time",
|
|
1813
|
+
short: "timestamptz",
|
|
1814
|
+
column: { type: "timestamptz" }
|
|
1815
|
+
},
|
|
1816
|
+
{
|
|
1817
|
+
id: "boolean",
|
|
1818
|
+
label: "Yes or no",
|
|
1819
|
+
group: "Choice",
|
|
1820
|
+
short: "boolean",
|
|
1821
|
+
column: { type: "boolean" }
|
|
1822
|
+
},
|
|
1823
|
+
{
|
|
1824
|
+
id: "single_select",
|
|
1825
|
+
label: "Single select",
|
|
1826
|
+
group: "Choice",
|
|
1827
|
+
short: "select",
|
|
1828
|
+
column: {
|
|
1829
|
+
type: "text",
|
|
1830
|
+
options: STARTER_OPTIONS
|
|
1831
|
+
}
|
|
1832
|
+
},
|
|
1833
|
+
{
|
|
1834
|
+
id: "multi_select",
|
|
1835
|
+
label: "Multi-select",
|
|
1836
|
+
group: "Choice",
|
|
1837
|
+
short: "multi-select",
|
|
1838
|
+
column: {
|
|
1839
|
+
type: "text[]",
|
|
1840
|
+
options: STARTER_OPTIONS
|
|
1841
|
+
}
|
|
1842
|
+
},
|
|
1843
|
+
{
|
|
1844
|
+
id: "person",
|
|
1845
|
+
label: "Person",
|
|
1846
|
+
group: "Relation",
|
|
1847
|
+
short: "person",
|
|
1848
|
+
column: {
|
|
1849
|
+
type: "uuid",
|
|
1850
|
+
nullable: true,
|
|
1851
|
+
references: {
|
|
1852
|
+
table: USERS$1,
|
|
1853
|
+
onDelete: "set null"
|
|
1854
|
+
}
|
|
1855
|
+
}
|
|
1856
|
+
},
|
|
1857
|
+
{
|
|
1858
|
+
id: "reference",
|
|
1859
|
+
label: "Link to a table",
|
|
1860
|
+
group: "Relation",
|
|
1861
|
+
short: "link",
|
|
1862
|
+
column: { type: "uuid" },
|
|
1863
|
+
drawn: true
|
|
1864
|
+
},
|
|
1865
|
+
{
|
|
1866
|
+
id: "uuid",
|
|
1867
|
+
label: "UUID",
|
|
1868
|
+
group: "Other",
|
|
1869
|
+
short: "uuid",
|
|
1870
|
+
column: { type: "uuid" }
|
|
1871
|
+
},
|
|
1872
|
+
{
|
|
1873
|
+
id: "jsonb",
|
|
1874
|
+
label: "JSON",
|
|
1875
|
+
group: "Other",
|
|
1876
|
+
short: "jsonb",
|
|
1877
|
+
column: { type: "jsonb" }
|
|
1878
|
+
},
|
|
1879
|
+
{
|
|
1880
|
+
id: "text_list",
|
|
1881
|
+
label: "List of text",
|
|
1882
|
+
group: "Other",
|
|
1883
|
+
short: "text[]",
|
|
1884
|
+
column: { type: "text[]" }
|
|
1885
|
+
}
|
|
1886
|
+
];
|
|
1887
|
+
const BY_ID = new Map(COLUMN_KINDS.map((kind) => [kind.id, kind]));
|
|
1888
|
+
const BY_FORMAT = new Map(COLUMN_KINDS.filter((kind) => kind.column.format !== void 0).map((kind) => [kind.column.format, kind]));
|
|
1889
|
+
const PLAIN = {
|
|
1890
|
+
text: "text",
|
|
1891
|
+
uuid: "uuid",
|
|
1892
|
+
integer: "integer",
|
|
1893
|
+
bigint: "bigint",
|
|
1894
|
+
numeric: "numeric",
|
|
1895
|
+
boolean: "boolean",
|
|
1896
|
+
timestamptz: "timestamptz",
|
|
1897
|
+
date: "date",
|
|
1898
|
+
jsonb: "jsonb",
|
|
1899
|
+
"text[]": "text_list"
|
|
1900
|
+
};
|
|
1901
|
+
function kindById(id) {
|
|
1902
|
+
return BY_ID.get(id);
|
|
1712
1903
|
}
|
|
1713
1904
|
/**
|
|
1714
|
-
*
|
|
1715
|
-
*
|
|
1905
|
+
* The kind a column's identity, reference or options make it, before its format
|
|
1906
|
+
* and type.
|
|
1716
1907
|
*/
|
|
1717
|
-
|
|
1718
|
-
|
|
1719
|
-
|
|
1720
|
-
|
|
1721
|
-
|
|
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
|
-
};
|
|
1908
|
+
function structuralKind(column) {
|
|
1909
|
+
if (column.identity === true) return "autonumber";
|
|
1910
|
+
if (column.references !== void 0) return column.references.block === void 0 && column.references.table === USERS$1 ? "person" : "reference";
|
|
1911
|
+
if (column.options === void 0) return;
|
|
1912
|
+
return column.type === "text[]" ? "multi_select" : "single_select";
|
|
1741
1913
|
}
|
|
1742
|
-
|
|
1743
|
-
|
|
1914
|
+
/** The picker choice a column reads as. */
|
|
1915
|
+
function kindOf(column) {
|
|
1916
|
+
const id = structuralKind(column);
|
|
1917
|
+
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]);
|
|
1744
1918
|
}
|
|
1745
1919
|
/**
|
|
1746
|
-
*
|
|
1747
|
-
*
|
|
1748
|
-
*
|
|
1920
|
+
* `column` as `kind`: the kind's keys, with the column's name-independent
|
|
1921
|
+
* settings (required, unique, comment, a default and bounds that still fit)
|
|
1922
|
+
* kept, and a select's options kept when it turns into the other select.
|
|
1749
1923
|
*/
|
|
1750
|
-
function
|
|
1751
|
-
|
|
1752
|
-
|
|
1753
|
-
|
|
1754
|
-
|
|
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
|
-
});
|
|
1924
|
+
function withKind(column, kind) {
|
|
1925
|
+
const { format: _format, options, identity: _identity, references: _references, min, max, ...rest } = column;
|
|
1926
|
+
const kept = kind.column.options === void 0 || options === void 0 ? kind.column : {
|
|
1927
|
+
...kind.column,
|
|
1928
|
+
options
|
|
1802
1929
|
};
|
|
1803
|
-
|
|
1804
|
-
|
|
1805
|
-
|
|
1806
|
-
|
|
1807
|
-
|
|
1808
|
-
|
|
1809
|
-
|
|
1810
|
-
}
|
|
1811
|
-
}
|
|
1812
|
-
push(text.length);
|
|
1813
|
-
return parts;
|
|
1814
|
-
}
|
|
1815
|
-
function lineOf(text, offset) {
|
|
1816
|
-
return text.slice(0, offset).split("\n").length;
|
|
1930
|
+
return fitted(withBounds({
|
|
1931
|
+
...rest,
|
|
1932
|
+
...kept
|
|
1933
|
+
}, column.type === kind.column.type ? {
|
|
1934
|
+
min,
|
|
1935
|
+
max
|
|
1936
|
+
} : {}));
|
|
1817
1937
|
}
|
|
1818
|
-
|
|
1819
|
-
|
|
1938
|
+
/** The money columns of `name`: `<stem>_minor` and `<stem>_currency`. */
|
|
1939
|
+
function moneyColumns(name) {
|
|
1940
|
+
const stem = name.replace(/_minor$/u, "");
|
|
1820
1941
|
return {
|
|
1821
|
-
|
|
1822
|
-
|
|
1823
|
-
columns: identList(match[2])
|
|
1942
|
+
minor: `${stem}_minor`,
|
|
1943
|
+
currency: `${stem}_currency`
|
|
1824
1944
|
};
|
|
1825
1945
|
}
|
|
1826
|
-
|
|
1827
|
-
|
|
1828
|
-
|
|
1829
|
-
|
|
1946
|
+
/**
|
|
1947
|
+
* Sets an app table column to `kind`. Currency keeps money as two columns: the
|
|
1948
|
+
* column becomes `<name>_minor` (unless the name is taken) and a
|
|
1949
|
+
* `<name>_currency` text column of 3 characters joins it. Returns the column's
|
|
1950
|
+
* name after the change.
|
|
1951
|
+
*/
|
|
1952
|
+
function setColumnKind(design, table, name, kind) {
|
|
1953
|
+
const columns = design.appTables?.[table]?.columns ?? {};
|
|
1954
|
+
const column = columns[name];
|
|
1955
|
+
if (column === void 0) return {
|
|
1956
|
+
design,
|
|
1957
|
+
name
|
|
1958
|
+
};
|
|
1959
|
+
const next = withKind(column, kind);
|
|
1960
|
+
if (kind.id !== "currency") return {
|
|
1961
|
+
design: setColumn(design, table, name, next),
|
|
1962
|
+
name
|
|
1963
|
+
};
|
|
1964
|
+
const { minor, currency } = moneyColumns(name);
|
|
1965
|
+
const renamed = minor === name || columns[minor] === void 0 ? minor : name;
|
|
1966
|
+
const moved = setColumn(renameColumn(design, table, name, renamed), table, renamed, next);
|
|
1967
|
+
if (columns[currency] !== void 0) return {
|
|
1968
|
+
design: moved,
|
|
1969
|
+
name: renamed
|
|
1970
|
+
};
|
|
1971
|
+
return {
|
|
1972
|
+
design: setColumn(moved, table, currency, next.nullable === false ? {
|
|
1973
|
+
type: "text",
|
|
1974
|
+
nullable: false,
|
|
1975
|
+
min: 3,
|
|
1976
|
+
max: 3
|
|
1977
|
+
} : {
|
|
1978
|
+
type: "text",
|
|
1979
|
+
min: 3,
|
|
1980
|
+
max: 3
|
|
1981
|
+
}),
|
|
1982
|
+
name: renamed
|
|
1983
|
+
};
|
|
1830
1984
|
}
|
|
1831
|
-
|
|
1832
|
-
|
|
1985
|
+
//#endregion
|
|
1986
|
+
//#region src/create/deploy.ts
|
|
1987
|
+
/** The name the deploy gives its migration in `supabase_migrations`. */
|
|
1988
|
+
const MIGRATION_NAME = "better_supabase_blocks";
|
|
1833
1989
|
/**
|
|
1834
|
-
*
|
|
1835
|
-
*
|
|
1836
|
-
*
|
|
1990
|
+
* Why this preset can't be deployed, or `undefined` when it can. With `access:
|
|
1991
|
+
* "provider"` the preview renders a stand-in provider whose functions no real
|
|
1992
|
+
* project has.
|
|
1837
1993
|
*/
|
|
1838
|
-
function
|
|
1839
|
-
|
|
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();
|
|
1994
|
+
function deployBlocker(preset) {
|
|
1995
|
+
return preset.access === "provider" ? "Bring your own authorization provider: its SQL comes from the provider, so deploy it with the CLI." : void 0;
|
|
1854
1996
|
}
|
|
1855
|
-
/**
|
|
1856
|
-
function
|
|
1857
|
-
|
|
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
|
-
});
|
|
1997
|
+
/** A new deploy id: a random UUID. */
|
|
1998
|
+
function newDeployId() {
|
|
1999
|
+
return crypto.randomUUID();
|
|
1879
2000
|
}
|
|
2001
|
+
const DEPLOY_ID = /^[\w-]{1,64}$/u;
|
|
1880
2002
|
/**
|
|
1881
|
-
*
|
|
1882
|
-
*
|
|
2003
|
+
* The SQL of one migration for the rendered files: every schema file, then
|
|
2004
|
+
* every data file, each in render order, which is the order `sql sync` and `sql
|
|
2005
|
+
* data` apply them. pgTAP tests stay out. Throws a `TypeError` when `id` holds
|
|
2006
|
+
* anything but letters, digits, `_` and `-`.
|
|
1883
2007
|
*/
|
|
1884
|
-
function
|
|
1885
|
-
const
|
|
1886
|
-
|
|
1887
|
-
const
|
|
1888
|
-
|
|
1889
|
-
|
|
1890
|
-
|
|
1891
|
-
|
|
1892
|
-
|
|
1893
|
-
|
|
1894
|
-
|
|
1895
|
-
|
|
1896
|
-
|
|
1897
|
-
|
|
1898
|
-
|
|
1899
|
-
|
|
1900
|
-
|
|
1901
|
-
}
|
|
1902
|
-
|
|
2008
|
+
function deployQuery(files, options = {}) {
|
|
2009
|
+
const { id } = options;
|
|
2010
|
+
if (id !== void 0 && !DEPLOY_ID.test(id)) throw new TypeError("A deploy id holds 1 to 64 letters, digits, '_' or '-'.");
|
|
2011
|
+
const schema = files.filter((file) => file.path.includes("/schemas/"));
|
|
2012
|
+
const data = files.filter((file) => file.path.includes("/better-supabase-data/"));
|
|
2013
|
+
const body = [...schema, ...data].map((file) => `-- ${file.path}\n${file.contents.trim()}\n`).join("\n");
|
|
2014
|
+
return id === void 0 ? body : `-- better-supabase deploy ${id}\n\n${body}`;
|
|
2015
|
+
}
|
|
2016
|
+
/** A database password for a new project: 32 base64url characters. */
|
|
2017
|
+
function generatePassword() {
|
|
2018
|
+
const bytes = crypto.getRandomValues(/* @__PURE__ */ new Uint8Array(24));
|
|
2019
|
+
let binary = "";
|
|
2020
|
+
for (const byte of bytes) binary += String.fromCodePoint(byte);
|
|
2021
|
+
return btoa(binary).replaceAll("+", "-").replaceAll("/", "_").replace(/[=]+$/u, "");
|
|
2022
|
+
}
|
|
2023
|
+
/** The project name the dialog suggests: the preset's name, or `my-app`. */
|
|
2024
|
+
function suggestedProjectName(named) {
|
|
2025
|
+
return named === void 0 ? "my-app" : `my-${named}-app`;
|
|
2026
|
+
}
|
|
2027
|
+
const DASHBOARD = "https://supabase.com/dashboard";
|
|
2028
|
+
function dashboardUrl(ref, page = "") {
|
|
2029
|
+
return `${DASHBOARD}/project/${encodeURIComponent(ref)}${page}`;
|
|
1903
2030
|
}
|
|
1904
|
-
|
|
1905
|
-
|
|
1906
|
-
|
|
2031
|
+
//#endregion
|
|
2032
|
+
//#region src/create/design-history.ts
|
|
2033
|
+
/** How many steps Undo can go back. */
|
|
2034
|
+
const HISTORY_LIMIT = 50;
|
|
2035
|
+
function initialHistory(value) {
|
|
1907
2036
|
return {
|
|
1908
|
-
|
|
1909
|
-
|
|
1910
|
-
|
|
1911
|
-
|
|
1912
|
-
|
|
1913
|
-
|
|
1914
|
-
|
|
1915
|
-
|
|
1916
|
-
|
|
1917
|
-
|
|
1918
|
-
|
|
2037
|
+
past: [],
|
|
2038
|
+
present: value,
|
|
2039
|
+
future: [],
|
|
2040
|
+
dragStart: null
|
|
2041
|
+
};
|
|
2042
|
+
}
|
|
2043
|
+
function record(history, previous, next) {
|
|
2044
|
+
return {
|
|
2045
|
+
past: [...history.past, previous].slice(-50),
|
|
2046
|
+
present: next,
|
|
2047
|
+
future: [],
|
|
2048
|
+
dragStart: null
|
|
1919
2049
|
};
|
|
1920
2050
|
}
|
|
1921
2051
|
/**
|
|
1922
|
-
*
|
|
1923
|
-
*
|
|
1924
|
-
*
|
|
1925
|
-
*
|
|
2052
|
+
* An undo history. `drag` updates the value without a step while the pointer
|
|
2053
|
+
* moves; `commitDrag` records the whole drag as one step. `amend` replaces the
|
|
2054
|
+
* value in the current step, so a follow-up such as placing a dropped block
|
|
2055
|
+
* stays part of the step that added it. `reset` replaces the value and clears
|
|
2056
|
+
* the history, as loading a link does.
|
|
1926
2057
|
*/
|
|
1927
|
-
function
|
|
1928
|
-
|
|
1929
|
-
|
|
1930
|
-
|
|
1931
|
-
|
|
1932
|
-
|
|
1933
|
-
|
|
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: []
|
|
2058
|
+
function undoHistory(current, action) {
|
|
2059
|
+
switch (action.type) {
|
|
2060
|
+
case "apply": return action.value === current.present ? current : record(current, current.dragStart ?? current.present, action.value);
|
|
2061
|
+
case "drag": return {
|
|
2062
|
+
...current,
|
|
2063
|
+
present: action.value,
|
|
2064
|
+
dragStart: current.dragStart ?? current.present
|
|
1950
2065
|
};
|
|
1951
|
-
|
|
1952
|
-
|
|
1953
|
-
|
|
1954
|
-
|
|
1955
|
-
|
|
1956
|
-
|
|
1957
|
-
|
|
1958
|
-
|
|
1959
|
-
|
|
1960
|
-
|
|
1961
|
-
|
|
1962
|
-
|
|
1963
|
-
|
|
1964
|
-
|
|
2066
|
+
case "commitDrag": return current.dragStart === null ? current : record(current, current.dragStart, current.present);
|
|
2067
|
+
case "amend": return {
|
|
2068
|
+
...current,
|
|
2069
|
+
present: action.value
|
|
2070
|
+
};
|
|
2071
|
+
case "undo": {
|
|
2072
|
+
const previous = current.past.at(-1);
|
|
2073
|
+
return previous === void 0 ? current : {
|
|
2074
|
+
past: current.past.slice(0, -1),
|
|
2075
|
+
present: previous,
|
|
2076
|
+
future: [current.present, ...current.future],
|
|
2077
|
+
dragStart: null
|
|
2078
|
+
};
|
|
2079
|
+
}
|
|
2080
|
+
case "redo": {
|
|
2081
|
+
const [next, ...future] = current.future;
|
|
2082
|
+
return next === void 0 ? current : {
|
|
2083
|
+
past: [...current.past, current.present].slice(-50),
|
|
2084
|
+
present: next,
|
|
2085
|
+
future,
|
|
2086
|
+
dragStart: null
|
|
2087
|
+
};
|
|
1965
2088
|
}
|
|
2089
|
+
case "reset": return initialHistory(action.value);
|
|
2090
|
+
default: return action;
|
|
1966
2091
|
}
|
|
1967
|
-
const tenantColumn = options.tenantColumn ?? null;
|
|
1968
|
-
return [...drafts.entries()].filter(([id]) => !BOOKKEEPING_TABLES.has(id)).map(([, draft]) => finish(draft, tenantColumn));
|
|
1969
2092
|
}
|
|
2093
|
+
//#endregion
|
|
2094
|
+
//#region src/create/sample-rows.ts
|
|
2095
|
+
const SAMPLE_ROW_COUNT = 8;
|
|
1970
2096
|
/**
|
|
1971
|
-
* The
|
|
1972
|
-
*
|
|
2097
|
+
* The columns of `table` a `viewer` can't select: `access: "server"` ones for a
|
|
2098
|
+
* member.
|
|
1973
2099
|
*/
|
|
1974
|
-
function
|
|
1975
|
-
|
|
1976
|
-
|
|
1977
|
-
|
|
1978
|
-
|
|
1979
|
-
|
|
1980
|
-
|
|
1981
|
-
|
|
1982
|
-
|
|
1983
|
-
|
|
1984
|
-
|
|
1985
|
-
|
|
1986
|
-
|
|
1987
|
-
|
|
1988
|
-
|
|
1989
|
-
|
|
1990
|
-
|
|
2100
|
+
function hiddenColumns(table, viewer) {
|
|
2101
|
+
if (viewer === "server") return [];
|
|
2102
|
+
return Object.entries(table?.columns ?? {}).filter(([, column]) => column.access === "server").map(([key]) => key);
|
|
2103
|
+
}
|
|
2104
|
+
const USERS = "auth.users";
|
|
2105
|
+
const PEOPLE = [
|
|
2106
|
+
"Ada Lovelace",
|
|
2107
|
+
"Grace Hopper",
|
|
2108
|
+
"Alan Turing",
|
|
2109
|
+
"Katherine Johnson",
|
|
2110
|
+
"Edsger Dijkstra",
|
|
2111
|
+
"Barbara Liskov",
|
|
2112
|
+
"Donald Knuth",
|
|
2113
|
+
"Frances Allen"
|
|
2114
|
+
];
|
|
2115
|
+
const SENTENCES = [
|
|
2116
|
+
"A short note that explains the row.",
|
|
2117
|
+
"Longer text, such as a description or the body of a post.",
|
|
2118
|
+
"Written by the team and edited later.",
|
|
2119
|
+
"Kept for reference."
|
|
2120
|
+
];
|
|
2121
|
+
const COLORS = [
|
|
2122
|
+
"#2563eb",
|
|
2123
|
+
"#16a34a",
|
|
2124
|
+
"#d97706",
|
|
2125
|
+
"#dc2626",
|
|
2126
|
+
"#7c3aed"
|
|
2127
|
+
];
|
|
2128
|
+
const TITLE_COLUMNS = [
|
|
2129
|
+
"name",
|
|
2130
|
+
"title",
|
|
2131
|
+
"label",
|
|
2132
|
+
"subject"
|
|
2133
|
+
];
|
|
2134
|
+
function capitalized(value) {
|
|
2135
|
+
return `${value.charAt(0).toUpperCase()}${value.slice(1)}`.replaceAll("_", " ");
|
|
2136
|
+
}
|
|
2137
|
+
/**
|
|
2138
|
+
* The column a table's rows are named by: its subject title, then a likely name
|
|
2139
|
+
* column.
|
|
2140
|
+
*/
|
|
2141
|
+
function titleColumnOf(table) {
|
|
2142
|
+
const text = new Set(Object.entries(table.columns ?? {}).filter(([, column]) => column.type === "text" && column.format === void 0).map(([key]) => key));
|
|
2143
|
+
return table.subject?.title ?? TITLE_COLUMNS.find((key) => text.has(key));
|
|
2144
|
+
}
|
|
2145
|
+
/**
|
|
2146
|
+
* The name of row `index` of `table`, so a reference shows the row it points
|
|
2147
|
+
* at.
|
|
2148
|
+
*/
|
|
2149
|
+
function rowTitle(table, index) {
|
|
2150
|
+
return `${capitalized(singular(table))} ${String(index + 1)}`;
|
|
2151
|
+
}
|
|
2152
|
+
function pad(value) {
|
|
2153
|
+
return String(value).padStart(2, "0");
|
|
2154
|
+
}
|
|
2155
|
+
/** A date `days` after 5 January 2026, as `YYYY-MM-DD`. */
|
|
2156
|
+
function dayAfter(days) {
|
|
2157
|
+
const date = new Date(Date.UTC(2026, 0, 5 + days));
|
|
2158
|
+
return `${String(date.getUTCFullYear())}-${pad(date.getUTCMonth() + 1)}-${pad(date.getUTCDate())}`;
|
|
2159
|
+
}
|
|
2160
|
+
function numberIn(column, index, step) {
|
|
2161
|
+
const value = (column.min ?? 0) + index * step;
|
|
2162
|
+
return column.max === void 0 ? value : Math.min(value, column.max);
|
|
2163
|
+
}
|
|
2164
|
+
function formatted(column, index, slug) {
|
|
2165
|
+
switch (column.format) {
|
|
2166
|
+
case void 0: return;
|
|
2167
|
+
case "email": return `${(PEOPLE[index % PEOPLE.length] ?? "user").split(" ")[0]?.toLowerCase() ?? "user"}@example.com`;
|
|
2168
|
+
case "url": return `https://example.com/${slug}/${String(index + 1)}`;
|
|
2169
|
+
case "phone": return `+1 555 01${pad(index + 10)}`;
|
|
2170
|
+
case "long_text": return SENTENCES[index % SENTENCES.length] ?? "";
|
|
2171
|
+
case "color": return COLORS[index % COLORS.length] ?? "#000000";
|
|
2172
|
+
case "rating": {
|
|
2173
|
+
const min = column.min ?? 1;
|
|
2174
|
+
const max = column.max ?? 5;
|
|
2175
|
+
return String(min + index % (max - min + 1));
|
|
1991
2176
|
}
|
|
2177
|
+
case "percent": return String(index * 17 % 101);
|
|
2178
|
+
case "currency": return ((index + 1) * 1250 / 100).toFixed(2);
|
|
2179
|
+
default: return column.format;
|
|
1992
2180
|
}
|
|
1993
|
-
return statements;
|
|
1994
2181
|
}
|
|
1995
|
-
|
|
1996
|
-
|
|
1997
|
-
|
|
1998
|
-
|
|
1999
|
-
|
|
2000
|
-
|
|
2001
|
-
|
|
2002
|
-
|
|
2003
|
-
return
|
|
2004
|
-
|
|
2005
|
-
|
|
2006
|
-
|
|
2007
|
-
|
|
2182
|
+
function referenceValue(column, index) {
|
|
2183
|
+
const reference = column.references;
|
|
2184
|
+
if (reference === void 0) return;
|
|
2185
|
+
if (reference.block === void 0 && reference.table === USERS) return PEOPLE[index % PEOPLE.length] ?? "";
|
|
2186
|
+
return rowTitle(reference.table, index % 3);
|
|
2187
|
+
}
|
|
2188
|
+
function typedValue(column, index, slug) {
|
|
2189
|
+
switch (column.type) {
|
|
2190
|
+
case "text": return `${capitalized(slug)} ${String(index + 1)}`;
|
|
2191
|
+
case "uuid": return `00000000-0000-4000-8000-${String(index + 1).padStart(12, "0")}`;
|
|
2192
|
+
case "integer":
|
|
2193
|
+
case "bigint": return String(column.identity === true ? index + 1 : numberIn(column, index, 3));
|
|
2194
|
+
case "numeric": return numberIn(column, index, 2.5).toFixed(2);
|
|
2195
|
+
case "boolean": return String(index % 2 === 0);
|
|
2196
|
+
case "timestamptz": return `${dayAfter(index * 2)} ${pad(9 + index % 8)}:00`;
|
|
2197
|
+
case "date": return dayAfter(index * 3);
|
|
2198
|
+
case "jsonb": return "{}";
|
|
2199
|
+
case "text[]": return "{}";
|
|
2200
|
+
default: return column.type;
|
|
2201
|
+
}
|
|
2202
|
+
}
|
|
2203
|
+
function cell(table, key, column, index, title) {
|
|
2204
|
+
if (key === title) return rowTitle(table, index);
|
|
2205
|
+
if (column.nullable !== false && index % 4 === 3) return null;
|
|
2206
|
+
if (column.options !== void 0 && column.options.length > 0) return column.options[index % column.options.length] ?? null;
|
|
2207
|
+
return referenceValue(column, index) ?? formatted(column, index, key) ?? typedValue(column, index, key);
|
|
2208
|
+
}
|
|
2209
|
+
/**
|
|
2210
|
+
* Deterministic sample rows for app table `name`, from its columns' types,
|
|
2211
|
+
* formats, options, bounds and references. A reference shows the name of the
|
|
2212
|
+
* row it points at, so rows of related tables line up. A `member` viewer
|
|
2213
|
+
* doesn't get the columns `hiddenColumns` lists.
|
|
2214
|
+
*/
|
|
2215
|
+
function sampleRows(design, name, count = 8, viewer = "server") {
|
|
2216
|
+
const table = design.appTables?.[name];
|
|
2217
|
+
if (table === void 0) return {
|
|
2218
|
+
columns: [],
|
|
2219
|
+
rows: []
|
|
2220
|
+
};
|
|
2221
|
+
const hidden = new Set(hiddenColumns(table, viewer));
|
|
2222
|
+
const entries = Object.entries(table.columns ?? {}).filter(([key]) => !hidden.has(key));
|
|
2223
|
+
const title = titleColumnOf(table);
|
|
2224
|
+
return {
|
|
2225
|
+
columns: entries.map(([key]) => key),
|
|
2226
|
+
rows: Array.from({ length: count }, (_, index) => Object.fromEntries(entries.map(([key, column]) => [key, cell(name, key, column, index, title)])))
|
|
2227
|
+
};
|
|
2008
2228
|
}
|
|
2009
2229
|
//#endregion
|
|
2010
2230
|
//#region src/create/migration.ts
|
|
2011
2231
|
/** The module whose file holds the app's own tables. */
|
|
2012
2232
|
const APP_TABLES_MODULE = "app-tables";
|
|
2013
2233
|
/**
|
|
2014
|
-
* The migration that takes a project deployed from `base` to `next`, for
|
|
2015
|
-
*
|
|
2016
|
-
*
|
|
2017
|
-
*
|
|
2018
|
-
*
|
|
2019
|
-
*
|
|
2234
|
+
* The migration that takes a project deployed from `base` to `next`, for added
|
|
2235
|
+
* tables and added columns only. The rendered app-table SQL is idempotent
|
|
2236
|
+
* (`create table if not exists`, `add column if not exists`, `drop policy if
|
|
2237
|
+
* exists`), so the migration is the re-rendered file. Anything else, such as a
|
|
2238
|
+
* rename, a retype, a changed default or a change outside `appTables`, is
|
|
2239
|
+
* refused so a deploy never guesses.
|
|
2020
2240
|
*/
|
|
2021
2241
|
function migrationBetween(code, base, next) {
|
|
2022
2242
|
const changes = diffDesigns(base, next);
|
|
@@ -2046,4 +2266,4 @@ function migrationBetween(code, base, next) {
|
|
|
2046
2266
|
};
|
|
2047
2267
|
}
|
|
2048
2268
|
//#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 };
|
|
2269
|
+
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, checkDesign, 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, newDeployId, 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 };
|