diff --git a/.changeset/bumpy-gifts-peel.md b/.changeset/bumpy-gifts-peel.md new file mode 100644 index 00000000..5616391e --- /dev/null +++ b/.changeset/bumpy-gifts-peel.md @@ -0,0 +1,24 @@ +--- +"@vercel/flags-core": minor +"@flags-sdk/vercel": minor +--- + +Allow specifying entities type when creating clients + +You can now create clients while specifying the entities type: + +```ts +type Entities = { user: { id: string, name?: string } } +const client = createClient('') +client.evaluate('flagKey', undefined, { user: { id: '' } }) // uses Entities type for context +``` + +You can still narrow the entities type when evaluating flags: + +```ts +client.evaluate<{ user: { id: string, name: string } }>( + 'flagKey', + false, + { user: { id: '', name: '' } } // uses custom entities type +) +``` diff --git a/packages/adapter-vercel/src/index.ts b/packages/adapter-vercel/src/index.ts index 732d6eaf..a9e6bae0 100644 --- a/packages/adapter-vercel/src/index.ts +++ b/packages/adapter-vercel/src/index.ts @@ -30,14 +30,14 @@ export function createVercelAdapter( ? createClient(sdkKeyOrFlagsClient) : sdkKeyOrFlagsClient; - return function vercelAdapter(): Adapter< + return function vercelAdapter< ValueType, - EntitiesType - > { + EntitiesType extends Record, + >(): Adapter { return { origin: flagsClient.origin, config: { reportValue: false }, - async decide({ key, entities, headers }): Promise { + async decide({ key, entities }): Promise { const evaluationResult = await flagsClient.evaluate< ValueType, EntitiesType @@ -75,10 +75,10 @@ export function resetDefaultVercelAdapter() { * */ // This is initialized lazily to avoid warning when it is not actually used and env vars are missing. -export function vercelAdapter(): Adapter< +export function vercelAdapter< ValueType, - EntitiesType -> { + EntitiesType extends Record, +>(): Adapter { if (!defaultVercelAdapter) { defaultVercelAdapter = createVercelAdapter(flagsClient); } diff --git a/packages/vercel-flags-core/src/create-raw-client.ts b/packages/vercel-flags-core/src/create-raw-client.ts index 105e64eb..a9d2494d 100644 --- a/packages/vercel-flags-core/src/create-raw-client.ts +++ b/packages/vercel-flags-core/src/create-raw-client.ts @@ -40,13 +40,13 @@ export function createCreateRawClient(fns: { evaluate: typeof evaluate; getDatafile: typeof getDatafile; }) { - return function createRawClient({ + return function createRawClient>({ controller, origin, }: { controller: ControllerInterface; origin?: { provider: string; sdkKey: string }; - }): FlagsClient { + }): FlagsClient { const id = idCount++; controllerInstanceMap.set(id, { controller, @@ -92,7 +92,7 @@ export function createCreateRawClient(fns: { getFallbackDatafile: (): Promise => { return fns.getFallbackDatafile(id); }, - evaluate: async >( + evaluate: async ( flagKey: string, defaultValue?: T, entities?: E, diff --git a/packages/vercel-flags-core/src/index.make.ts b/packages/vercel-flags-core/src/index.make.ts index e1af5d93..bdb0aef2 100644 --- a/packages/vercel-flags-core/src/index.make.ts +++ b/packages/vercel-flags-core/src/index.make.ts @@ -17,20 +17,20 @@ export function make( ): { flagsClient: FlagsClient; resetDefaultFlagsClient: () => void; - createClient: ( + createClient: >( sdkKeyOrConnectionString: string, options?: CreateClientOptions, - ) => FlagsClient; + ) => FlagsClient; } { let _defaultFlagsClient: FlagsClient | null = null; // Insights // - data source must specify the environment & projectId as sdkKey has that info // - "reuse" functionality relies on the data source having the data for all envs - function createClient( + function createClient>( sdkKeyOrConnectionString: string, options?: CreateClientOptions, - ): FlagsClient { + ): FlagsClient { if (!sdkKeyOrConnectionString) throw new Error('@vercel/flags-core: Missing sdkKey'); @@ -51,7 +51,7 @@ export function make( // sdk key contains the environment const controller = new Controller({ sdkKey, ...options }); - return createRawClient({ + return createRawClient({ controller, origin: { provider: 'vercel', sdkKey }, }); diff --git a/packages/vercel-flags-core/src/types.ts b/packages/vercel-flags-core/src/types.ts index 35eead92..2d25fb68 100644 --- a/packages/vercel-flags-core/src/types.ts +++ b/packages/vercel-flags-core/src/types.ts @@ -120,7 +120,7 @@ export type Source = { /** * A client for Vercel Flags */ -export type FlagsClient = { +export type FlagsClient> = { /** * Origin information for this client (provider and sdkKey) */ @@ -138,7 +138,7 @@ export type FlagsClient = { * @param entities * @returns */ - evaluate: >( + evaluate: ( flagKey: string, defaultValue?: T, entities?: E,