ref: Fix all API types after Zod migration (#34903)

This commit is contained in:
Kamil Ogórek authored and GitHub committed 2025-04-11 10:28:08 +08:00
1 parent 5e9c2a3c71
commit c3a352331a
20 files changed
+1141 -789

No files matched your search

@@ -7,7 +7,7 @@ export const getPITRRetentionDuration = (addons: ProjectSelectedAddon[]) => {
const pitrAddon = addons.find((addon) => addon.type === 'pitr')
if (!pitrAddon) return 0
return pitrAddon.variant.meta?.backup_duration_days ?? 0
return (pitrAddon.variant.meta as any)?.backup_duration_days ?? 0
}
export const getDatesBetweenRange = (startDate: dayjs.Dayjs, endDate: dayjs.Dayjs) => {
@@ -1,4 +1,4 @@
import { AddonVariantId, ProjectAddonVariantMeta } from 'data/subscriptions/types'
import { AddonVariantId } from 'data/subscriptions/types'
export type ComputeInstanceAddonVariantId =
| Extract<
@@ -26,7 +26,11 @@ import {
import { ComputeBadge } from 'ui-patterns'
import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout'
import { DiskStorageSchemaType } from '../DiskManagement.schema'
import { ComputeInstanceAddonVariantId } from '../DiskManagement.types'
import {
ComputeInstanceAddonVariantId,
ComputeInstanceSize,
InfraInstanceSize,
} from '../DiskManagement.types'
import {
calculateComputeSizePrice,
getAvailableComputeOptions,
@@ -214,9 +218,7 @@ export function ComputeSizeField({ form, disabled }: ComputeSizeFieldProps) {
<div className="relative px-3 opacity-50 group-data-[state=checked]:opacity-100 flex justify-between">
<ComputeBadge
className="inline-flex font-semibold"
infraComputeSize={
compute.name as components['schemas']['DbInstanceSize']
}
infraComputeSize={compute.name as InfraInstanceSize}
/>
<div className="flex items-center space-x-1">
{lockedOption ? (
@@ -38,7 +38,7 @@ const ProjectUsageSection = () => {
// if the project has more than 25 requests, we assume the project has usage
const hasProjectData =
usage?.result && usage.result.length > 0 ? usage.result[0].count > 25 : false
usage?.result && usage.result.length > 0 ? (usage.result[0] as any).count > 25 : false
const isNewProject = dayjs(project?.inserted_at).isAfter(dayjs().subtract(2, 'day'))
@@ -136,12 +136,15 @@ export function LogDrainDestinationSheetForm({
onSubmit: (values: z.infer<typeof formSchema>) => void
mode: 'create' | 'update'
}) {
// NOTE(kamil): This used to be `any` for a long long time, but after moving to Zod,
// it produces a correct union type of all possible configs. Unfortunately, this type was not designed correctly
// and it does not include `type` inside the config itself, so it's not trivial to create `discriminatedUnion`
// out of it, therefore for an ease of use now, we bail to `any` until the better time come.
const defaultConfig = (defaultValues?.config || {}) as any
const CREATE_DEFAULT_HEADERS = {
'Content-Type': 'application/json',
}
const DEFAULT_HEADERS =
mode === 'create' ? CREATE_DEFAULT_HEADERS : defaultValues?.config?.headers || {}
const DEFAULT_HEADERS = mode === 'create' ? CREATE_DEFAULT_HEADERS : defaultConfig?.headers || {}
const { ref } = useParams()
const { data: logDrains } = useLogDrainsQuery({
@@ -157,14 +160,14 @@ export function LogDrainDestinationSheetForm({
name: defaultValues?.name || '',
description: defaultValues?.description || '',
type: defaultType,
http: defaultValues?.config?.http || 'http2',
gzip: mode === 'create' ? true : defaultValues?.config?.gzip || false,
http: defaultConfig?.http || 'http2',
gzip: mode === 'create' ? true : defaultConfig?.gzip || false,
headers: DEFAULT_HEADERS,
url: defaultValues?.config?.url || '',
api_key: defaultValues?.config?.api_key || '',
region: defaultValues?.config?.region || '',
username: defaultValues?.config?.username || '',
password: defaultValues?.config?.password || '',
url: defaultConfig?.url || '',
api_key: defaultConfig?.api_key || '',
region: defaultConfig?.region || '',
username: defaultConfig?.username || '',
password: defaultConfig?.password || '',
},
})
@@ -1,4 +1,4 @@
import { AlertOctagon, MinusCircle, PauseCircle } from 'lucide-react'
import { MinusCircle, PauseCircle } from 'lucide-react'
import type { ProjectInfo } from 'data/projects/projects-query'
import type { OrgSubscription, ProjectAddon } from 'data/subscriptions/types'
@@ -466,7 +466,7 @@ const Addons = () => {
<p className="text-sm text-foreground-light">Current option:</p>
<p>
{pitr !== undefined
? `Point in time recovery of ${pitr.variant.meta?.backup_duration_days} days is enabled`
? `Point in time recovery of ${(pitr.variant.meta as any)?.backup_duration_days} days is enabled`
: 'Point in time recovery is not enabled'}
</p>
{!sufficientPgVersion ? (
@@ -31,7 +31,7 @@ import { useProjectAddonsQuery } from 'data/subscriptions/project-addons-query'
import { useResourceWarningsQuery } from 'data/usage/resource-warnings-query'
import { useSelectedOrganization } from 'hooks/misc/useSelectedOrganization'
import { useSelectedProject } from 'hooks/misc/useSelectedProject'
import { INSTANCE_MICRO_SPECS, INSTANCE_NANO_SPECS } from 'lib/constants'
import { INSTANCE_MICRO_SPECS, INSTANCE_NANO_SPECS, InstanceSpecs } from 'lib/constants'
import { TIME_PERIODS_BILLING, TIME_PERIODS_REPORTS } from 'lib/constants/metrics'
import { useDatabaseSelectorStateSnapshot } from 'state/database-selector'
import { Admonition } from 'ui-patterns/admonition'
@@ -72,7 +72,7 @@ const InfrastructureActivity = () => {
function getCurrentComputeInstanceSpecs() {
if (computeInstance?.variant.meta) {
// If user has a compute instance (called addons) return that
return computeInstance?.variant.meta
return computeInstance?.variant.meta as InstanceSpecs
} else {
// Otherwise, return the default specs
return project?.infra_compute_size === 'nano' ? INSTANCE_NANO_SPECS : INSTANCE_MICRO_SPECS
@@ -11,6 +11,7 @@ import { INSTANCE_MICRO_SPECS } from 'lib/constants'
import { Button, HoverCard, HoverCardContent, HoverCardTrigger, Separator } from 'ui'
import { ComputeBadge } from 'ui-patterns/ComputeBadge'
import ShimmeringLoader from './ShimmeringLoader'
import { InfraInstanceSize } from 'components/interfaces/DiskManagement/DiskManagement.types'
const Row = ({ label, stat }: { label: string; stat: React.ReactNode | string }) => {
return (
@@ -26,7 +27,7 @@ interface ComputeBadgeWrapperProps {
ref?: string
organization_slug?: string
cloud_provider?: string
infra_compute_size?: components['schemas']['DbInstanceSize']
infra_compute_size?: InfraInstanceSize
}
}
@@ -3,12 +3,8 @@ import { toast } from 'sonner'
import { handleError, post } from 'data/fetchers'
import type { ResponseError } from 'types'
import { components } from 'api-types'
import { configKeys } from './keys'
type UpdateGP3Body = components['schemas']['DiskRequestAttributesGP3']
type UpdateIO2Body = components['schemas']['DiskRequestAttributesIO2']
export const COOLDOWN_DURATION = 60 * 60 * 6
export type UpdateDiskAttributesVariables = {
@@ -20,31 +16,27 @@ export type UpdateDiskAttributesVariables = {
}
// [Joshen] Need to fix this
export async function updateDiskAttributes({
ref,
storageType,
provisionedIOPS,
throughput,
totalSize,
}: UpdateDiskAttributesVariables) {
if (!ref) throw new Error('ref is required')
export async function updateDiskAttributes(updates: UpdateDiskAttributesVariables) {
if (!updates.ref) throw new Error('ref is required')
// NOTE(kamil): This should be expressed in types as discriminated union, but it requires
// reworking of a whole form that provides data to that mutation
const attributes =
storageType === 'gp3'
? ({
iops: provisionedIOPS,
throughput_mbps: throughput,
size_gb: totalSize,
type: storageType,
} as UpdateGP3Body)
: ({
iops: provisionedIOPS,
size_gb: totalSize,
type: storageType,
} as UpdateIO2Body)
updates.storageType === 'gp3'
? {
iops: updates.provisionedIOPS,
throughput_mbps: updates.throughput!,
size_gb: updates.totalSize,
type: updates.storageType,
}
: {
iops: updates.provisionedIOPS,
size_gb: updates.totalSize,
type: updates.storageType,
}
const { data, error } = await post('/platform/projects/{ref}/disk', {
params: { path: { ref } },
params: { path: { ref: updates.ref } },
body: { attributes },
})
if (error) handleError(error)
@@ -21,7 +21,7 @@ export async function createLogDrain(payload: LogDrainCreateVariables) {
name: payload.name,
description: payload.description,
type: payload.type,
config: payload.config,
config: payload.config as any,
},
})
@@ -25,7 +25,7 @@ export async function updateLogDrain(payload: LogDrainUpdateVariables) {
body: {
name: payload.name,
description: payload.description,
config: payload.config,
config: payload.config as any,
},
})
@@ -1,7 +1,18 @@
import { components } from 'api-types'
import { PROVIDERS } from 'lib/constants'
type DesiredInstanceSize = components['schemas']['DesiredInstanceSize']
export type DesiredInstanceSize = Exclude<
components['schemas']['CreateProjectBody']['desired_instance_size'],
undefined | 'pico' | 'nano'
>
export type ReleaseChannel = Exclude<
components['schemas']['CreateProjectBody']['release_channel'],
undefined
>
export type PostgresEngine = Exclude<
components['schemas']['CreateProjectBody']['postgres_engine'],
undefined
>
export const instanceSizeSpecs: Record<
DesiredInstanceSize,
@@ -7,6 +7,7 @@ import { handleError, post } from 'data/fetchers'
import { PROVIDERS } from 'lib/constants'
import type { ResponseError } from 'types'
import { projectKeys } from './keys'
import { DesiredInstanceSize, PostgresEngine, ReleaseChannel } from './new-project.constants'
const WHITELIST_ERRORS = [
'The following organization members have reached their maximum limits for the number of active free projects',
@@ -18,10 +19,6 @@ const WHITELIST_ERRORS = [
'already exists in your organization.',
]
export type DbInstanceSize = components['schemas']['DesiredInstanceSize']
export type ReleaseChannel = components['schemas']['ReleaseChannel']
export type PostgresEngine = components['schemas']['PostgresEngine']
export type ProjectCreateVariables = {
name: string
organizationId: number
@@ -32,7 +29,7 @@ export type ProjectCreateVariables = {
cloudProvider?: string
authSiteUrl?: string
customSupabaseRequest?: object
dbInstanceSize?: DbInstanceSize
dbInstanceSize?: DesiredInstanceSize
dataApiExposedSchemas?: string[]
dataApiUseApiSchema?: boolean
postgresEngine?: PostgresEngine
+7 -5
View File
@@ -7,17 +7,17 @@ export type SubscriptionTier =
| 'tier_team'
| 'tier_enterprise'
export type AddonVariantId = components['schemas']['AddonVariantId']
export type AddonVariantId = components['schemas']['UpdateAddonBody']['addon_variant']
export type OrgSubscription = components['schemas']['GetSubscriptionResponse']
export type ProjectAddon = components['schemas']['BillingProjectAddonResponse']
export type ProjectAddon = components['schemas']['GetSubscriptionResponse']['project_addons'][0]
export type PlanId = components['schemas']['BillingPlanId']
export type OrgPlan = components['schemas']['PlansResponse']['plans'][0]
export type ProjectAddonType = components['schemas']['ProjectAddonType']
export type ProjectAddonType = components['schemas']['UpdateAddonBody']['addon_type']
export interface ProjectAddonVariantMeta {
cpu_cores?: number
@@ -31,5 +31,7 @@ export interface ProjectAddonVariantMeta {
supported_cloud_providers?: string[]
}
export type ProjectSelectedAddon = components['schemas']['SelectedAddonResponse']
export type ProjectAvailableAddon = components['schemas']['AvailableAddonResponse']
export type ProjectSelectedAddon =
components['schemas']['ProjectAddonsResponse']['selected_addons'][0]
export type ProjectAvailableAddon =
components['schemas']['ProjectAddonsResponse']['available_addons'][0]
+5 -9
View File
@@ -10,7 +10,6 @@ import { toast } from 'sonner'
import { z } from 'zod'
import { PopoverSeparator } from '@ui/components/shadcn/ui/popover'
import { components } from 'api-types'
import { useParams } from 'common'
import {
FreeProjectLimitWarning,
@@ -36,9 +35,8 @@ import { useOverdueInvoicesQuery } from 'data/invoices/invoices-overdue-query'
import { useDefaultRegionQuery } from 'data/misc/get-default-region-query'
import { useFreeProjectLimitCheckQuery } from 'data/organizations/free-project-limit-check-query'
import { useOrganizationsQuery } from 'data/organizations/organizations-query'
import { instanceSizeSpecs } from 'data/projects/new-project.constants'
import { DesiredInstanceSize, instanceSizeSpecs } from 'data/projects/new-project.constants'
import {
DbInstanceSize,
ProjectCreateVariables,
useProjectCreateMutation,
} from 'data/projects/project-create-mutation'
@@ -87,8 +85,6 @@ import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal'
import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout'
import { InfoTooltip } from 'ui-patterns/info-tooltip'
type DesiredInstanceSize = components['schemas']['DesiredInstanceSize']
const sizes: DesiredInstanceSize[] = [
'micro',
'small',
@@ -411,7 +407,7 @@ const Wizard: NextPageWithLayout = () => {
const availableComputeCredits = organizationProjects.length === 0 ? 10 : 0
const additionalMonthlySpend =
instanceSizeSpecs[instanceSize as DbInstanceSize]!.priceMonthly - availableComputeCredits
instanceSizeSpecs[instanceSize as DesiredInstanceSize]!.priceMonthly - availableComputeCredits
// TODO: Remove this after project creation experiment as it delays rendering
if (
@@ -677,7 +673,7 @@ const Wizard: NextPageWithLayout = () => {
<span className="text-foreground-lighter line-through">
$
{
instanceSizeSpecs[instanceSize as DbInstanceSize]!
instanceSizeSpecs[instanceSize as DesiredInstanceSize]!
.priceMonthly
}
</span>
@@ -997,11 +993,11 @@ const Wizard: NextPageWithLayout = () => {
* Needs to be in the API in the future [kevin]
*/
const monthlyInstancePrice = (instance: string | undefined): number => {
return instanceSizeSpecs[instance as DbInstanceSize]?.priceMonthly || 10
return instanceSizeSpecs[instance as DesiredInstanceSize]?.priceMonthly || 10
}
const instanceLabel = (instance: string | undefined): string => {
return instanceSizeSpecs[instance as DbInstanceSize]?.label || 'Micro'
return instanceSizeSpecs[instance as DesiredInstanceSize]?.label || 'Micro'
}
const PageLayout = withAuth(({ children }: PropsWithChildren) => {
+7 -10
View File
@@ -1,6 +1,5 @@
import { zodResolver } from '@hookform/resolvers/zod'
import { PermissionAction } from '@supabase/shared-types/out/constants'
import { components } from 'api-types'
import { useParams } from 'common'
import { AnimatePresence, motion } from 'framer-motion'
import { debounce } from 'lodash'
@@ -41,9 +40,8 @@ import { useOverdueInvoicesQuery } from 'data/invoices/invoices-overdue-query'
import { useDefaultRegionQuery } from 'data/misc/get-default-region-query'
import { useFreeProjectLimitCheckQuery } from 'data/organizations/free-project-limit-check-query'
import { useOrganizationsQuery } from 'data/organizations/organizations-query'
import { instanceSizeSpecs } from 'data/projects/new-project.constants'
import { DesiredInstanceSize, instanceSizeSpecs } from 'data/projects/new-project.constants'
import {
DbInstanceSize,
ProjectCreateVariables,
useProjectCreateMutation,
} from 'data/projects/project-create-mutation'
@@ -94,8 +92,6 @@ import { Input } from 'ui-patterns/DataInputs/Input'
import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout'
import { InfoTooltip } from 'ui-patterns/info-tooltip'
type DesiredInstanceSize = components['schemas']['DesiredInstanceSize']
const sizes: DesiredInstanceSize[] = [
'micro',
'small',
@@ -420,7 +416,7 @@ const WizardForm = () => {
const availableComputeCredits = organizationProjects.length === 0 ? 10 : 0
const additionalMonthlySpend =
instanceSizeSpecs[instanceSize as DbInstanceSize]!.priceMonthly - availableComputeCredits
instanceSizeSpecs[instanceSize as DesiredInstanceSize]!.priceMonthly - availableComputeCredits
const selectedRegionObject = useMemo((): {
name: string
@@ -910,8 +906,9 @@ const WizardForm = () => {
<span className="text-foreground-lighter line-through">
$
{
instanceSizeSpecs[instanceSize as DbInstanceSize]!
.priceMonthly
instanceSizeSpecs[
instanceSize as DesiredInstanceSize
]!.priceMonthly
}
</span>
<span>${additionalMonthlySpend}</span>
@@ -1242,11 +1239,11 @@ const WizardForm = () => {
* Needs to be in the API in the future [kevin]
*/
const monthlyInstancePrice = (instance: string | undefined): number => {
return instanceSizeSpecs[instance as DbInstanceSize]?.priceMonthly || 10
return instanceSizeSpecs[instance as DesiredInstanceSize]?.priceMonthly || 10
}
const instanceLabel = (instance: string | undefined): string => {
return instanceSizeSpecs[instance as DbInstanceSize]?.label || 'Micro'
return instanceSizeSpecs[instance as DesiredInstanceSize]?.label || 'Micro'
}
const Wizard: NextPageWithLayout = () => {
+370 -288
View File
@@ -244,7 +244,15 @@ export interface paths {
path?: never
cookie?: never
}
/** Gets project's logs */
/**
* Gets project's logs
* @description Executes a SQL query on the project's logs.
*
* Either the 'iso_timestamp_start' and 'iso_timestamp_end' parameters must be provided.
* If both are not provided, only the last 1 minute of logs will be queried.
* The timestamp range must be no more than 24 hours and is rounded to the nearest minute. If the range is more than 24 hours, a validation error will be thrown.
*
*/
get: operations['getLogs']
put?: never
post?: never
@@ -1344,17 +1352,6 @@ export interface components {
| ('pitr_7' | 'pitr_14' | 'pitr_28')
| 'ipv4_default'
}
AttributeMapping: {
keys: {
[key: string]: components['schemas']['AttributeValue']
}
}
AttributeValue: {
array?: boolean
default?: Record<string, never> | number | string | boolean
name?: string
names?: string[]
}
AuthConfigResponse: {
api_max_request_duration: number | null
db_max_pool_size: number | null
@@ -1527,10 +1524,6 @@ export interface components {
smtp_user: string | null
uri_allow_list: string | null
}
AuthHealthResponse: {
/** @enum {string} */
name: 'GoTrue'
}
/** @enum {string} */
BillingPlanId: 'free' | 'pro' | 'team' | 'enterprise'
BranchActionBody: {
@@ -1628,12 +1621,6 @@ export interface components {
version: number
}[]
}
CfResponse: {
errors: Record<string, never>[]
messages: Record<string, never>[]
result: components['schemas']['CustomHostnameDetails']
success: boolean
}
CreateApiKeyBody: {
description?: string | null
secret_jwt_template?: {
@@ -1679,7 +1666,16 @@ export interface components {
name: string
}
CreateProviderBody: {
attribute_mapping?: components['schemas']['AttributeMapping']
attribute_mapping?: {
keys: {
[key: string]: {
array?: boolean
default?: Record<string, never> | number | string | boolean
name?: string
names?: string[]
}
}
}
domains?: string[]
metadata_url?: string
metadata_xml?: string
@@ -1691,9 +1687,29 @@ export interface components {
}
CreateProviderResponse: {
created_at?: string
domains?: components['schemas']['Domain'][]
domains?: {
created_at?: string
domain?: string
id: string
updated_at?: string
}[]
id: string
saml?: components['schemas']['SamlDescriptor']
saml?: {
attribute_mapping?: {
keys: {
[key: string]: {
array?: boolean
default?: Record<string, never> | number | string | boolean
name?: string
names?: string[]
}
}
}
entity_id: string
id: string
metadata_url?: string
metadata_xml?: string
}
updated_at?: string
}
CreateSecretBody: {
@@ -1715,15 +1731,6 @@ export interface components {
jwks_url?: string
oidc_issuer_url?: string
}
CustomHostnameDetails: {
custom_origin_server: string
hostname: string
id: string
ownership_verification: components['schemas']['OwnershipVerification']
ssl: components['schemas']['SslValidation']
status: string
verification_errors?: string[]
}
DatabaseUpgradeStatusResponse: {
databaseUpgradeStatus: {
/** @enum {string} */
@@ -1758,9 +1765,29 @@ export interface components {
}
DeleteProviderResponse: {
created_at?: string
domains?: components['schemas']['Domain'][]
domains?: {
created_at?: string
domain?: string
id: string
updated_at?: string
}[]
id: string
saml?: components['schemas']['SamlDescriptor']
saml?: {
attribute_mapping?: {
keys: {
[key: string]: {
array?: boolean
default?: Record<string, never> | number | string | boolean
name?: string
names?: string[]
}
}
}
entity_id: string
id: string
metadata_url?: string
metadata_xml?: string
}
updated_at?: string
}
DeployFunctionResponse: {
@@ -1777,12 +1804,6 @@ export interface components {
verify_jwt?: boolean
version: number
}
Domain: {
created_at?: string
domain?: string
id: string
updated_at?: string
}
FunctionDeployBody: {
file?: string[]
metadata: {
@@ -1838,9 +1859,29 @@ export interface components {
}
GetProviderResponse: {
created_at?: string
domains?: components['schemas']['Domain'][]
domains?: {
created_at?: string
domain?: string
id: string
updated_at?: string
}[]
id: string
saml?: components['schemas']['SamlDescriptor']
saml?: {
attribute_mapping?: {
keys: {
[key: string]: {
array?: boolean
default?: Record<string, never> | number | string | boolean
name?: string
names?: string[]
}
}
}
entity_id: string
id: string
metadata_url?: string
metadata_xml?: string
}
updated_at?: string
}
ListProjectAddonsResponseDto: {
@@ -1875,9 +1916,8 @@ export interface components {
| 'auth_mfa_phone_default'
| 'auth_mfa_web_authn_default'
| 'log_drain_default'
meta?: {
[key: string]: number | boolean | string | string[]
}
/** @description Any JSON-serializable value */
meta?: unknown
name: string
price: {
amount: number
@@ -1919,9 +1959,8 @@ export interface components {
| 'auth_mfa_phone_default'
| 'auth_mfa_web_authn_default'
| 'log_drain_default'
meta?: {
[key: string]: number | boolean | string | string[]
}
/** @description Any JSON-serializable value */
meta?: unknown
name: string
price: {
amount: number
@@ -1935,7 +1974,33 @@ export interface components {
}[]
}
ListProvidersResponse: {
items: components['schemas']['Provider'][]
items: {
created_at?: string
domains?: {
created_at?: string
domain?: string
id: string
updated_at?: string
}[]
id: string
saml?: {
attribute_mapping?: {
keys: {
[key: string]: {
array?: boolean
default?: Record<string, never> | number | string | boolean
name?: string
names?: string[]
}
}
}
entity_id: string
id: string
metadata_url?: string
metadata_xml?: string
}
updated_at?: string
}[]
}
NetworkBanResponse: {
banned_ipv4_addresses: string[]
@@ -1988,11 +2053,6 @@ export interface components {
id: string
name: string
}
OwnershipVerification: {
name: string
type: string
value: string
}
PgsodiumConfigResponse: {
root_key: string
}
@@ -2064,21 +2124,11 @@ export interface components {
ProjectUpgradeInitiateResponse: {
tracking_id: string
}
Provider: {
created_at?: string
domains?: components['schemas']['Domain'][]
id: string
saml?: components['schemas']['SamlDescriptor']
updated_at?: string
}
ReadOnlyStatusResponse: {
enabled: boolean
override_active_until: string
override_enabled: boolean
}
RealtimeHealthResponse: {
connected_cluster: number
}
/** @enum {string} */
ReleaseChannel: 'internal' | 'alpha' | 'beta' | 'ga' | 'withdrawn' | 'preview'
RemoveNetworkBanRequest: {
@@ -2088,13 +2138,6 @@ export interface components {
database_identifier: string
}
RestoreProjectBodyDto: Record<string, never>
SamlDescriptor: {
attribute_mapping?: components['schemas']['AttributeMapping']
entity_id: string
id: string
metadata_url?: string
metadata_xml?: string
}
SecretResponse: {
name: string
updated_at?: string
@@ -2213,11 +2256,6 @@ export interface components {
database: boolean
}
}
SslValidation: {
status: string
validation_errors?: components['schemas']['ValidationError'][]
validation_records: components['schemas']['ValidationRecord'][]
}
StorageConfigResponse: {
features: {
imageTransformation: {
@@ -2271,180 +2309,184 @@ export interface components {
} | null
}
UpdateAuthConfigBody: {
api_max_request_duration?: number
db_max_pool_size?: number
disable_signup?: boolean
external_anonymous_users_enabled?: boolean
external_apple_additional_client_ids?: string
external_apple_client_id?: string
external_apple_enabled?: boolean
external_apple_secret?: string
external_azure_client_id?: string
external_azure_enabled?: boolean
external_azure_secret?: string
external_azure_url?: string
external_bitbucket_client_id?: string
external_bitbucket_enabled?: boolean
external_bitbucket_secret?: string
external_discord_client_id?: string
external_discord_enabled?: boolean
external_discord_secret?: string
external_email_enabled?: boolean
external_facebook_client_id?: string
external_facebook_enabled?: boolean
external_facebook_secret?: string
external_figma_client_id?: string
external_figma_enabled?: boolean
external_figma_secret?: string
external_github_client_id?: string
external_github_enabled?: boolean
external_github_secret?: string
external_gitlab_client_id?: string
external_gitlab_enabled?: boolean
external_gitlab_secret?: string
external_gitlab_url?: string
external_google_additional_client_ids?: string
external_google_client_id?: string
external_google_enabled?: boolean
external_google_secret?: string
external_google_skip_nonce_check?: boolean
external_kakao_client_id?: string
external_kakao_enabled?: boolean
external_kakao_secret?: string
external_keycloak_client_id?: string
external_keycloak_enabled?: boolean
external_keycloak_secret?: string
external_keycloak_url?: string
external_linkedin_oidc_client_id?: string
external_linkedin_oidc_enabled?: boolean
external_linkedin_oidc_secret?: string
external_notion_client_id?: string
external_notion_enabled?: boolean
external_notion_secret?: string
external_phone_enabled?: boolean
external_slack_client_id?: string
external_slack_enabled?: boolean
external_slack_oidc_client_id?: string
external_slack_oidc_enabled?: boolean
external_slack_oidc_secret?: string
external_slack_secret?: string
external_spotify_client_id?: string
external_spotify_enabled?: boolean
external_spotify_secret?: string
external_twitch_client_id?: string
external_twitch_enabled?: boolean
external_twitch_secret?: string
external_twitter_client_id?: string
external_twitter_enabled?: boolean
external_twitter_secret?: string
external_workos_client_id?: string
external_workos_enabled?: boolean
external_workos_secret?: string
external_workos_url?: string
external_zoom_client_id?: string
external_zoom_enabled?: boolean
external_zoom_secret?: string
hook_custom_access_token_enabled?: boolean
hook_custom_access_token_secrets?: string
hook_custom_access_token_uri?: string
hook_mfa_verification_attempt_enabled?: boolean
hook_mfa_verification_attempt_secrets?: string
hook_mfa_verification_attempt_uri?: string
hook_password_verification_attempt_enabled?: boolean
hook_password_verification_attempt_secrets?: string
hook_password_verification_attempt_uri?: string
hook_send_email_enabled?: boolean
hook_send_email_secrets?: string
hook_send_email_uri?: string
hook_send_sms_enabled?: boolean
hook_send_sms_secrets?: string
hook_send_sms_uri?: string
jwt_exp?: number
mailer_allow_unverified_email_sign_ins?: boolean
mailer_autoconfirm?: boolean
api_max_request_duration?: number | null
db_max_pool_size?: number | null
disable_signup?: boolean | null
external_anonymous_users_enabled?: boolean | null
external_apple_additional_client_ids?: string | null
external_apple_client_id?: string | null
external_apple_enabled?: boolean | null
external_apple_secret?: string | null
external_azure_client_id?: string | null
external_azure_enabled?: boolean | null
external_azure_secret?: string | null
external_azure_url?: string | null
external_bitbucket_client_id?: string | null
external_bitbucket_enabled?: boolean | null
external_bitbucket_secret?: string | null
external_discord_client_id?: string | null
external_discord_enabled?: boolean | null
external_discord_secret?: string | null
external_email_enabled?: boolean | null
external_facebook_client_id?: string | null
external_facebook_enabled?: boolean | null
external_facebook_secret?: string | null
external_figma_client_id?: string | null
external_figma_enabled?: boolean | null
external_figma_secret?: string | null
external_github_client_id?: string | null
external_github_enabled?: boolean | null
external_github_secret?: string | null
external_gitlab_client_id?: string | null
external_gitlab_enabled?: boolean | null
external_gitlab_secret?: string | null
external_gitlab_url?: string | null
external_google_additional_client_ids?: string | null
external_google_client_id?: string | null
external_google_enabled?: boolean | null
external_google_secret?: string | null
external_google_skip_nonce_check?: boolean | null
external_kakao_client_id?: string | null
external_kakao_enabled?: boolean | null
external_kakao_secret?: string | null
external_keycloak_client_id?: string | null
external_keycloak_enabled?: boolean | null
external_keycloak_secret?: string | null
external_keycloak_url?: string | null
external_linkedin_oidc_client_id?: string | null
external_linkedin_oidc_enabled?: boolean | null
external_linkedin_oidc_secret?: string | null
external_notion_client_id?: string | null
external_notion_enabled?: boolean | null
external_notion_secret?: string | null
external_phone_enabled?: boolean | null
external_slack_client_id?: string | null
external_slack_enabled?: boolean | null
external_slack_oidc_client_id?: string | null
external_slack_oidc_enabled?: boolean | null
external_slack_oidc_secret?: string | null
external_slack_secret?: string | null
external_spotify_client_id?: string | null
external_spotify_enabled?: boolean | null
external_spotify_secret?: string | null
external_twitch_client_id?: string | null
external_twitch_enabled?: boolean | null
external_twitch_secret?: string | null
external_twitter_client_id?: string | null
external_twitter_enabled?: boolean | null
external_twitter_secret?: string | null
external_workos_client_id?: string | null
external_workos_enabled?: boolean | null
external_workos_secret?: string | null
external_workos_url?: string | null
external_zoom_client_id?: string | null
external_zoom_enabled?: boolean | null
external_zoom_secret?: string | null
hook_custom_access_token_enabled?: boolean | null
hook_custom_access_token_secrets?: string | null
hook_custom_access_token_uri?: string | null
hook_mfa_verification_attempt_enabled?: boolean | null
hook_mfa_verification_attempt_secrets?: string | null
hook_mfa_verification_attempt_uri?: string | null
hook_password_verification_attempt_enabled?: boolean | null
hook_password_verification_attempt_secrets?: string | null
hook_password_verification_attempt_uri?: string | null
hook_send_email_enabled?: boolean | null
hook_send_email_secrets?: string | null
hook_send_email_uri?: string | null
hook_send_sms_enabled?: boolean | null
hook_send_sms_secrets?: string | null
hook_send_sms_uri?: string | null
jwt_exp?: number | null
mailer_allow_unverified_email_sign_ins?: boolean | null
mailer_autoconfirm?: boolean | null
mailer_otp_exp?: number
mailer_otp_length?: number
mailer_secure_email_change_enabled?: boolean
mailer_subjects_confirmation?: string
mailer_subjects_email_change?: string
mailer_subjects_invite?: string
mailer_subjects_magic_link?: string
mailer_subjects_reauthentication?: string
mailer_subjects_recovery?: string
mailer_templates_confirmation_content?: string
mailer_templates_email_change_content?: string
mailer_templates_invite_content?: string
mailer_templates_magic_link_content?: string
mailer_templates_reauthentication_content?: string
mailer_templates_recovery_content?: string
mfa_max_enrolled_factors?: number
mfa_phone_enroll_enabled?: boolean
mfa_phone_max_frequency?: number
mfa_phone_otp_length?: number
mfa_phone_template?: string
mfa_phone_verify_enabled?: boolean
mfa_totp_enroll_enabled?: boolean
mfa_totp_verify_enabled?: boolean
mfa_web_authn_enroll_enabled?: boolean
mfa_web_authn_verify_enabled?: boolean
password_hibp_enabled?: boolean
password_min_length?: number
/** @enum {string} */
mailer_otp_length?: number | null
mailer_secure_email_change_enabled?: boolean | null
mailer_subjects_confirmation?: string | null
mailer_subjects_email_change?: string | null
mailer_subjects_invite?: string | null
mailer_subjects_magic_link?: string | null
mailer_subjects_reauthentication?: string | null
mailer_subjects_recovery?: string | null
mailer_templates_confirmation_content?: string | null
mailer_templates_email_change_content?: string | null
mailer_templates_invite_content?: string | null
mailer_templates_magic_link_content?: string | null
mailer_templates_reauthentication_content?: string | null
mailer_templates_recovery_content?: string | null
mfa_max_enrolled_factors?: number | null
mfa_phone_enroll_enabled?: boolean | null
mfa_phone_max_frequency?: number | null
mfa_phone_otp_length?: number | null
mfa_phone_template?: string | null
mfa_phone_verify_enabled?: boolean | null
mfa_totp_enroll_enabled?: boolean | null
mfa_totp_verify_enabled?: boolean | null
mfa_web_authn_enroll_enabled?: boolean | null
mfa_web_authn_verify_enabled?: boolean | null
password_hibp_enabled?: boolean | null
password_min_length?: number | null
/** @enum {string|null} */
password_required_characters?:
| 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789'
| 'abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789'
| 'abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789:!@#$%^&*()_+-=[]{};\'\\\\:"|<>?,./`~'
| ''
rate_limit_anonymous_users?: number
rate_limit_email_sent?: number
rate_limit_otp?: number
rate_limit_sms_sent?: number
rate_limit_token_refresh?: number
rate_limit_verify?: number
refresh_token_rotation_enabled?: boolean
saml_enabled?: boolean
saml_external_url?: string
security_captcha_enabled?: boolean
security_captcha_provider?: string
security_captcha_secret?: string
security_manual_linking_enabled?: boolean
security_refresh_token_reuse_interval?: number
security_update_password_require_reauthentication?: boolean
sessions_inactivity_timeout?: number
sessions_single_per_user?: boolean
sessions_tags?: string
sessions_timebox?: number
site_url?: string
sms_autoconfirm?: boolean
sms_max_frequency?: number
sms_messagebird_access_key?: string
sms_messagebird_originator?: string
sms_otp_exp?: number
| null
rate_limit_anonymous_users?: number | null
rate_limit_email_sent?: number | null
rate_limit_otp?: number | null
rate_limit_sms_sent?: number | null
rate_limit_token_refresh?: number | null
rate_limit_verify?: number | null
refresh_token_rotation_enabled?: boolean | null
saml_enabled?: boolean | null
saml_external_url?: string | null
security_captcha_enabled?: boolean | null
/** @enum {string|null} */
security_captcha_provider?: 'turnstile' | 'hcaptcha' | null
security_captcha_secret?: string | null
security_manual_linking_enabled?: boolean | null
security_refresh_token_reuse_interval?: number | null
security_update_password_require_reauthentication?: boolean | null
sessions_inactivity_timeout?: number | null
sessions_single_per_user?: boolean | null
sessions_tags?: string | null
sessions_timebox?: number | null
site_url?: string | null
sms_autoconfirm?: boolean | null
sms_max_frequency?: number | null
sms_messagebird_access_key?: string | null
sms_messagebird_originator?: string | null
sms_otp_exp?: number | null
sms_otp_length?: number
sms_provider?: string
sms_template?: string
sms_test_otp?: string
sms_test_otp_valid_until?: string
sms_textlocal_api_key?: string
sms_textlocal_sender?: string
sms_twilio_account_sid?: string
sms_twilio_auth_token?: string
sms_twilio_content_sid?: string
sms_twilio_message_service_sid?: string
sms_twilio_verify_account_sid?: string
sms_twilio_verify_auth_token?: string
sms_twilio_verify_message_service_sid?: string
sms_vonage_api_key?: string
sms_vonage_api_secret?: string
sms_vonage_from?: string
smtp_admin_email?: string
smtp_host?: string
smtp_max_frequency?: number
smtp_pass?: string
smtp_port?: string
smtp_sender_name?: string
smtp_user?: string
uri_allow_list?: string
/** @enum {string|null} */
sms_provider?: 'messagebird' | 'textlocal' | 'twilio' | 'twilio_verify' | 'vonage' | null
sms_template?: string | null
sms_test_otp?: string | null
/** Format: date-time */
sms_test_otp_valid_until?: string | null
sms_textlocal_api_key?: string | null
sms_textlocal_sender?: string | null
sms_twilio_account_sid?: string | null
sms_twilio_auth_token?: string | null
sms_twilio_content_sid?: string | null
sms_twilio_message_service_sid?: string | null
sms_twilio_verify_account_sid?: string | null
sms_twilio_verify_auth_token?: string | null
sms_twilio_verify_message_service_sid?: string | null
sms_vonage_api_key?: string | null
sms_vonage_api_secret?: string | null
sms_vonage_from?: string | null
smtp_admin_email?: string | null
smtp_host?: string | null
smtp_max_frequency?: number | null
smtp_pass?: string | null
smtp_port?: string | null
smtp_sender_name?: string | null
smtp_user?: string | null
uri_allow_list?: string | null
}
UpdateBranchBody: {
branch_name?: string
@@ -2469,7 +2511,33 @@ export interface components {
}
UpdateCustomHostnameResponse: {
custom_hostname: string
data: components['schemas']['CfResponse']
data: {
errors: unknown[]
messages: unknown[]
result: {
custom_origin_server: string
hostname: string
id: string
ownership_verification: {
name: string
type: string
value: string
}
ssl: {
status: string
validation_errors?: {
message: string
}[]
validation_records: {
txt_name: string
txt_value: string
}[]
}
status: string
verification_errors?: string[]
}
success: boolean
}
/** @enum {string} */
status:
| '1_not_started'
@@ -2509,16 +2577,45 @@ export interface components {
work_mem?: string
}
UpdateProviderBody: {
attribute_mapping?: components['schemas']['AttributeMapping']
attribute_mapping?: {
keys: {
[key: string]: {
array?: boolean
default?: Record<string, never> | number | string | boolean
name?: string
names?: string[]
}
}
}
domains?: string[]
metadata_url?: string
metadata_xml?: string
}
UpdateProviderResponse: {
created_at?: string
domains?: components['schemas']['Domain'][]
domains?: {
created_at?: string
domain?: string
id: string
updated_at?: string
}[]
id: string
saml?: components['schemas']['SamlDescriptor']
saml?: {
attribute_mapping?: {
keys: {
[key: string]: {
array?: boolean
default?: Record<string, never> | number | string | boolean
name?: string
names?: string[]
}
}
}
entity_id: string
id: string
metadata_url?: string
metadata_xml?: string
}
updated_at?: string
}
UpdateSigningKeyBody: {
@@ -2555,20 +2652,20 @@ export interface components {
}
V1AnalyticsResponse: {
error?:
| {
code?: number
errors?: {
domain?: string
location?: string
locationType?: string
message?: string
reason?: string
}[]
message?: string
status?: string
}
| string
result?: Record<string, never>[]
| {
code: number
errors: {
domain: string
location: string
locationType: string
message: string
reason: string
}[]
message: string
status: string
}
result?: unknown[]
}
V1Backup: {
inserted_at: string
@@ -2791,8 +2888,17 @@ export interface components {
error?: string
healthy: boolean
info?:
| components['schemas']['AuthHealthResponse']
| components['schemas']['RealtimeHealthResponse']
| {
description: string
/** @enum {string} */
name: 'GoTrue'
version: string
}
| {
connected_cluster: number
db_connected: boolean
healthy: boolean
}
/** @enum {string} */
name: 'auth' | 'db' | 'pooler' | 'realtime' | 'rest' | 'storage'
/** @enum {string} */
@@ -2817,13 +2923,6 @@ export interface components {
db_schema?: string
max_rows?: number
}
ValidationError: {
message: string
}
ValidationRecord: {
txt_name: string
txt_value: string
}
VanitySubdomainBody: {
vanity_subdomain: string
}
@@ -3722,7 +3821,6 @@ export interface operations {
query?: never
header?: never
path: {
/** @description Project ref */
ref: string
}
cookie?: never
@@ -3757,7 +3855,6 @@ export interface operations {
query?: never
header?: never
path: {
/** @description Project ref */
ref: string
}
cookie?: never
@@ -3943,7 +4040,6 @@ export interface operations {
query?: never
header?: never
path: {
/** @description Project ref */
ref: string
}
cookie?: never
@@ -3978,7 +4074,6 @@ export interface operations {
query?: never
header?: never
path: {
/** @description Project ref */
ref: string
}
cookie?: never
@@ -4018,7 +4113,6 @@ export interface operations {
header?: never
path: {
provider_id: string
/** @description Project ref */
ref: string
}
cookie?: never
@@ -4054,7 +4148,6 @@ export interface operations {
header?: never
path: {
provider_id: string
/** @description Project ref */
ref: string
}
cookie?: never
@@ -4094,7 +4187,6 @@ export interface operations {
header?: never
path: {
provider_id: string
/** @description Project ref */
ref: string
}
cookie?: never
@@ -4344,7 +4436,6 @@ export interface operations {
query?: never
header?: never
path: {
/** @description Project ref */
ref: string
}
cookie?: never
@@ -4379,7 +4470,6 @@ export interface operations {
query?: never
header?: never
path: {
/** @description Project ref */
ref: string
}
cookie?: never
@@ -4418,7 +4508,6 @@ export interface operations {
query?: never
header?: never
path: {
/** @description Project ref */
ref: string
}
cookie?: never
@@ -4453,7 +4542,6 @@ export interface operations {
query?: never
header?: never
path: {
/** @description Project ref */
ref: string
}
cookie?: never
@@ -4490,7 +4578,6 @@ export interface operations {
query?: never
header?: never
path: {
/** @description Project ref */
ref: string
}
cookie?: never
@@ -4525,7 +4612,6 @@ export interface operations {
query?: never
header?: never
path: {
/** @description Project ref */
ref: string
}
cookie?: never
@@ -4558,7 +4644,6 @@ export interface operations {
query?: never
header?: never
path: {
/** @description Project ref */
ref: string
}
cookie?: never
@@ -4593,7 +4678,6 @@ export interface operations {
query?: never
header?: never
path: {
/** @description Project ref */
ref: string
}
cookie?: never
@@ -4632,7 +4716,6 @@ export interface operations {
query?: never
header?: never
path: {
/** @description Project ref */
ref: string
}
cookie?: never
@@ -5210,7 +5293,6 @@ export interface operations {
}
header?: never
path: {
/** @description Project ref */
ref: string
}
cookie?: never
+690 -421
View File
File diff suppressed because it is too large. Load diff
+1 -1
View File
@@ -2,7 +2,7 @@ import { components } from 'api-types'
import { Badge, cn } from 'ui'
interface ComputeBadgeProps extends React.ComponentProps<typeof Badge> {
infraComputeSize: components['schemas']['DbInstanceSize'] | '>16XL' | undefined
infraComputeSize: components['schemas']['ProjectInfo']['infra_compute_size'] | '>16XL' | undefined
}
export function ComputeBadge({ infraComputeSize, className, ...props }: ComputeBadgeProps) {