mirror of
https://github.com/supabase/supabase.git
synced 2026-10-06 09:55:06 +03:00
## Problem platform, v1 and v2 have been already completely migrated and introduced some changes. Some types have been renamed, some outputs and inputs updated. ## Solution - Update the API types - Fix the TS errors ## Update Taking this over to unblock #50134, which needs the new scoped token permission ids from the regenerated types. - Merged `master`. - Regenerated `api-v2.d.ts` from the production spec. The previous files came from a local API that exposed a webhook events endpoint production doesn't have yet. Production has since added standardized 400 error responses on the v2 organization endpoints. `api-v1.d.ts` and `platform.d.ts` already matched production. - Fixed `verify-production-types`. It formatted the regenerated files in a temp directory outside the repository, so Prettier fell back to its defaults and the comparison could never match the committed files. It now passes the repository config explicitly. `pnpm api:verify-types` passes on this branch. - Verified locally: `pnpm typecheck`, `pnpm api:verify-types`, Studio unit tests. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Bug Fixes** * Preserved descriptions when saving, sharing, moving, or unsharing notebooks, reports, SQL snippets, and saved queries. * Improved handling of empty or null values across notebook descriptions, billing usage, pooler settings, and infrastructure fields. * Improved read-replica connection handling, including read-only connection strings. * Updated storage configuration and capability handling to match current settings. * **API and Compatibility** * Updated organization, project, storage, OAuth, billing, and infrastructure data handling to match current API responses. * OAuth app creation and updates now require scopes. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: Alaister Young <10985857+alaister@users.noreply.github.com>
102 lines
2.8 KiB
TypeScript
102 lines
2.8 KiB
TypeScript
import { PricingMetric } from '@/data/analytics/org-daily-stats-query'
|
|
|
|
const pricingMetricBytes = [
|
|
PricingMetric.DATABASE_SIZE,
|
|
PricingMetric.EGRESS,
|
|
PricingMetric.CACHED_EGRESS,
|
|
PricingMetric.STORAGE_SIZE,
|
|
PricingMetric.LOG_INGESTION,
|
|
PricingMetric.LOG_QUERYING,
|
|
PricingMetric.ETL_COPY_BACKFILL_DATA,
|
|
PricingMetric.ETL_REPLICATED_DATA,
|
|
]
|
|
|
|
const pricingMetricNotHrs = [
|
|
PricingMetric.FUNCTION_INVOCATIONS,
|
|
PricingMetric.LOG_DRAIN_EVENTS,
|
|
PricingMetric.MONTHLY_ACTIVE_USERS,
|
|
PricingMetric.MONTHLY_ACTIVE_SSO_USERS,
|
|
PricingMetric.MONTHLY_ACTIVE_THIRD_PARTY_USERS,
|
|
PricingMetric.REALTIME_MESSAGE_COUNT,
|
|
PricingMetric.REALTIME_PEAK_CONNECTIONS,
|
|
PricingMetric.STORAGE_IMAGES_TRANSFORMED,
|
|
]
|
|
|
|
export const formatUsage = (
|
|
pricingMetric: PricingMetric,
|
|
allocation: { usage: number; hours?: number | null }
|
|
) => {
|
|
if (pricingMetricBytes.includes(pricingMetric)) {
|
|
const formattedUsage = +(allocation.usage / 1e9).toFixed(2).toLocaleString()
|
|
|
|
// To avoid very low usage displaying as "0", we will show "<0.01" instead
|
|
if (allocation.usage > 0 && formattedUsage === 0) {
|
|
return '<0.01'
|
|
} else {
|
|
return formattedUsage
|
|
}
|
|
}
|
|
|
|
if (allocation.hours && !pricingMetricNotHrs.includes(pricingMetric)) {
|
|
return (
|
|
allocation.usage.toLocaleString() +
|
|
' (' +
|
|
Math.round(allocation.usage / allocation.hours).toLocaleString() +
|
|
'x' +
|
|
allocation.hours.toLocaleString() +
|
|
' hours)'
|
|
)
|
|
} else {
|
|
return allocation.usage.toLocaleString()
|
|
}
|
|
}
|
|
|
|
export const billingMetricUnit = (pricingMetric: PricingMetric) => {
|
|
if (pricingMetricBytes.includes(pricingMetric)) {
|
|
return 'GB'
|
|
} else if (
|
|
pricingMetric.startsWith('COMPUTE_HOURS') ||
|
|
[
|
|
PricingMetric.CUSTOM_DOMAIN,
|
|
PricingMetric.IPV4,
|
|
PricingMetric.PITR_7,
|
|
PricingMetric.PITR_14,
|
|
PricingMetric.PITR_28,
|
|
PricingMetric.LOG_DRAIN,
|
|
PricingMetric.ETL_PIPELINE,
|
|
PricingMetric.AUTH_MFA_PHONE,
|
|
PricingMetric.AUTH_MFA_WEB_AUTHN,
|
|
].includes(pricingMetric)
|
|
) {
|
|
return 'Hours'
|
|
} else {
|
|
return null
|
|
}
|
|
}
|
|
|
|
export const generateUpgradeReasons = (originalPlan?: string | null, upgradedPlan?: string) => {
|
|
const reasons = [
|
|
'Current plan limits are not enough for me',
|
|
'I want better customer support from Supabase',
|
|
'I am migrating from a previous project',
|
|
]
|
|
|
|
if (originalPlan === undefined || upgradedPlan === undefined) {
|
|
reasons.push('None of the above')
|
|
return reasons
|
|
}
|
|
|
|
if (originalPlan === 'free' && upgradedPlan === 'pro') {
|
|
reasons.push('Need more compute')
|
|
reasons.push(
|
|
'I want access to additional features like branching, daily backups, custom domain and PITR'
|
|
)
|
|
} else if (upgradedPlan === 'team') {
|
|
reasons.push('I want access to SOC2 and HIPAA compliance')
|
|
}
|
|
|
|
reasons.push('None of the above')
|
|
|
|
return reasons
|
|
}
|