@@ -25,14 +25,14 @@ export type FlagsOptions<T extends FeatureFlagKey> = {
2525 overrides ?: Record < string , unknown > ;
2626} ;
2727
28- export function makeFlags ( _prisma : PrismaClientOrTransaction = prisma ) {
29- function flags < T extends FeatureFlagKey > (
28+ export function makeFlag ( _prisma : PrismaClientOrTransaction = prisma ) {
29+ function flag < T extends FeatureFlagKey > (
3030 opts : FlagsOptions < T > & { defaultValue : z . infer < ( typeof FeatureFlagCatalog ) [ T ] > }
3131 ) : Promise < z . infer < ( typeof FeatureFlagCatalog ) [ T ] > > ;
32- function flags < T extends FeatureFlagKey > (
32+ function flag < T extends FeatureFlagKey > (
3333 opts : FlagsOptions < T >
3434 ) : Promise < z . infer < ( typeof FeatureFlagCatalog ) [ T ] > | undefined > ;
35- async function flags < T extends FeatureFlagKey > (
35+ async function flag < T extends FeatureFlagKey > (
3636 opts : FlagsOptions < T >
3737 ) : Promise < z . infer < ( typeof FeatureFlagCatalog ) [ T ] > | undefined > {
3838 const value = await _prisma . featureFlag . findUnique ( {
@@ -60,11 +60,11 @@ export function makeFlags(_prisma: PrismaClientOrTransaction = prisma) {
6060 return parsed . data ;
6161 }
6262
63- return flags ;
63+ return flag ;
6464}
6565
66- export function makeSetFlags ( _prisma : PrismaClientOrTransaction = prisma ) {
67- return async function setFlags < T extends FeatureFlagKey > (
66+ export function makeSetFlag ( _prisma : PrismaClientOrTransaction = prisma ) {
67+ return async function setFlag < T extends FeatureFlagKey > (
6868 opts : FlagsOptions < T > & { value : z . infer < ( typeof FeatureFlagCatalog ) [ T ] > }
6969 ) : Promise < void > {
7070 await _prisma . featureFlag . upsert ( {
@@ -82,8 +82,59 @@ export function makeSetFlags(_prisma: PrismaClientOrTransaction = prisma) {
8282 } ;
8383}
8484
85+ export type AllFlagsOptions = {
86+ defaultValues ?: Partial < FeatureFlagCatalog > ;
87+ overrides ?: Record < string , unknown > ;
88+ } ;
89+
90+ export function makeFlags ( _prisma : PrismaClientOrTransaction = prisma ) {
91+ return async function flags ( options ?: AllFlagsOptions ) : Promise < Partial < FeatureFlagCatalog > > {
92+ const rows = await _prisma . featureFlag . findMany ( ) ;
93+
94+ // Build a map of key -> value from database
95+ const dbValues = new Map < string , unknown > ( ) ;
96+ for ( const row of rows ) {
97+ dbValues . set ( row . key , row . value ) ;
98+ }
99+
100+ const result : Partial < FeatureFlagCatalog > = { } ;
101+
102+ // Process each flag in the catalog
103+ for ( const key of Object . keys ( FeatureFlagCatalog ) as FeatureFlagKey [ ] ) {
104+ const schema = FeatureFlagCatalog [ key ] ;
105+
106+ // Priority: overrides > database > defaultValues
107+ if ( options ?. overrides ?. [ key ] !== undefined ) {
108+ const parsed = schema . safeParse ( options . overrides [ key ] ) ;
109+ if ( parsed . success ) {
110+ ( result as any ) [ key ] = parsed . data ;
111+ continue ;
112+ }
113+ }
114+
115+ if ( dbValues . has ( key ) ) {
116+ const parsed = schema . safeParse ( dbValues . get ( key ) ) ;
117+ if ( parsed . success ) {
118+ ( result as any ) [ key ] = parsed . data ;
119+ continue ;
120+ }
121+ }
122+
123+ if ( options ?. defaultValues ?. [ key ] !== undefined ) {
124+ const parsed = schema . safeParse ( options . defaultValues [ key ] ) ;
125+ if ( parsed . success ) {
126+ ( result as any ) [ key ] = parsed . data ;
127+ }
128+ }
129+ }
130+
131+ return result ;
132+ } ;
133+ }
134+
135+ export const flag = makeFlag ( ) ;
85136export const flags = makeFlags ( ) ;
86- export const setFlags = makeSetFlags ( ) ;
137+ export const setFlag = makeSetFlag ( ) ;
87138
88139// Create a Zod schema from the existing catalog
89140export const FeatureFlagCatalogSchema = z . object ( FeatureFlagCatalog ) ;
@@ -112,7 +163,7 @@ export function makeSetMultipleFlags(_prisma: PrismaClientOrTransaction = prisma
112163 return async function setMultipleFlags (
113164 flags : Partial < z . infer < typeof FeatureFlagCatalogSchema > >
114165 ) : Promise < { key : string ; value : any } [ ] > {
115- const setFlag = makeSetFlags ( _prisma ) ;
166+ const setFlag = makeSetFlag ( _prisma ) ;
116167 const updatedFlags : { key : string ; value : any } [ ] = [ ] ;
117168
118169 for ( const [ key , value ] of Object . entries ( flags ) ) {
0 commit comments