diff --git a/.changeset/bright-jars-flow.md b/.changeset/bright-jars-flow.md new file mode 100644 index 00000000..393dac2b --- /dev/null +++ b/.changeset/bright-jars-flow.md @@ -0,0 +1,5 @@ +--- +"@vercel/flags-core": minor +--- + +Support object/JSON flag values in addition to boolean, string, and number diff --git a/packages/vercel-flags-core/src/black-box.test.ts b/packages/vercel-flags-core/src/black-box.test.ts index 5c6c8254..f3d6cf05 100644 --- a/packages/vercel-flags-core/src/black-box.test.ts +++ b/packages/vercel-flags-core/src/black-box.test.ts @@ -2879,6 +2879,10 @@ describe('Controller (black-box)', () => { environments: { production: 0 }, variants: [42], }, + jsonFlag: { + environments: { production: 0 }, + variants: [{ color: 'red', size: 12 }], + }, }, }); @@ -2893,6 +2897,10 @@ describe('Controller (black-box)', () => { expect((await client.evaluate('boolFlag')).value).toBe(true); expect((await client.evaluate('stringFlag')).value).toBe('hello'); expect((await client.evaluate('numberFlag')).value).toBe(42); + expect((await client.evaluate('jsonFlag')).value).toEqual({ + color: 'red', + size: 12, + }); }); it('should call internalReportValue when projectId exists', async () => { diff --git a/packages/vercel-flags-core/src/index.common.ts b/packages/vercel-flags-core/src/index.common.ts index ffcebe51..fb2178ae 100644 --- a/packages/vercel-flags-core/src/index.common.ts +++ b/packages/vercel-flags-core/src/index.common.ts @@ -19,8 +19,12 @@ export { type EvaluationParams, type EvaluationResult, type FlagsClient, + type JsonArray, + type JsonObject, + type JsonValue, type Packed, type PollingOptions, ResolutionReason as Reason, type StreamOptions, + type Value, } from './types'; diff --git a/packages/vercel-flags-core/src/types.ts b/packages/vercel-flags-core/src/types.ts index 2d25fb68..0feebae3 100644 --- a/packages/vercel-flags-core/src/types.ts +++ b/packages/vercel-flags-core/src/types.ts @@ -1,5 +1,3 @@ -import type { ControllerInstance } from './controller-fns'; - /** * Options for stream connection behavior */ @@ -249,7 +247,17 @@ export type FlagKey = string; export type VariantId = string; export type EnvironmentKey = string; export type SegmentId = string; -export type Value = string | number | boolean; +export type JsonObject = { [key: string]: JsonValue }; +export type JsonArray = JsonValue[]; +export type JsonValue = + | string + | number + | boolean + | null + | JsonObject + | JsonArray; + +export type Value = string | number | boolean | JsonObject | JsonArray; export enum ResolutionReason { PAUSED = 'paused',