mirror of
https://github.com/supabase/supabase.git
synced 2026-10-05 01:15:03 +03:00
fix(common): restore narrow Feature type (#50850)
The platform API now types `ProfileResponse.disabled_features` as `string[]` (since #48981), which collapsed the `Feature` union to plain `string`, so `isFeatureEnabled` accepted any string and typos went uncaught. **Changed:** - `Feature` is now a local `RuntimeFeature` union (the profile-driven flags) plus the keys of `enabled-features.json`, instead of deriving from the API type - `useIsFeatureEnabled` casts the merged runtime disabled list to `Feature[]`, since the profile field is now `string[]` The runtime feature list duplicates what the backend knows. Once the enum is restored in the API spec, `Feature` can go back to deriving from the generated type. ## To test - `pnpm typecheck` passes - Passing a bogus string to `useIsFeatureEnabled` / `isFeatureEnabled` is now a type error - Nothing behavioral changes, so a quick sanity check that the sidebar / billing / org settings still render is enough <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **No user-facing changes** * This update does not change the app’s visible features or behavior. It includes internal typing adjustments only. <!-- end of auto-generated comment: release notes by coderabbit.ai --> Co-authored-by: Alaister Young <10985857+alaister@users.noreply.github.com>
This commit is contained in:
1 parent
e273d2b818
commit
a47397d5fe
2 files changed
+21
-8
No files matched your search
@@ -1,14 +1,27 @@
|
||||
import type { components } from 'api-types'
|
||||
|
||||
import enabledFeaturesRaw from './enabled-features.json' with { type: 'json' }
|
||||
|
||||
const enabledFeaturesStaticObj = enabledFeaturesRaw as Omit<typeof enabledFeaturesRaw, '$schema'>
|
||||
|
||||
type Profile = components['schemas']['ProfileResponse_Output']
|
||||
// Features the platform can disable per-user via the profile's `disabled_features`.
|
||||
// The API types this as `string[]`, so the known values are listed here to keep `Feature` narrow.
|
||||
type RuntimeFeature =
|
||||
| 'organizations:create'
|
||||
| 'organizations:delete'
|
||||
| 'organization_members:create'
|
||||
| 'organization_members:delete'
|
||||
| 'projects:create'
|
||||
| 'projects:transfer'
|
||||
| 'project_auth:all'
|
||||
| 'project_storage:all'
|
||||
| 'project_edge_function:all'
|
||||
| 'profile:update'
|
||||
| 'billing:account_data'
|
||||
| 'billing:credits'
|
||||
| 'billing:invoices'
|
||||
| 'billing:payment_methods'
|
||||
| 'realtime:all'
|
||||
|
||||
export type Feature =
|
||||
| NonNullable<Profile['disabled_features']>[number]
|
||||
| keyof typeof enabledFeaturesStaticObj
|
||||
export type Feature = RuntimeFeature | keyof typeof enabledFeaturesStaticObj
|
||||
|
||||
const disabledFeaturesStaticArray = Object.entries(enabledFeaturesStaticObj)
|
||||
.filter(([_, value]) => !value)
|
||||
|
||||
Reference in new issue
Block a user