From a25b1b7e5c7f53332d448b72ff3a2a0c97645357 Mon Sep 17 00:00:00 2001 From: Dominik Ferber Date: Sat, 14 Mar 2026 15:08:00 +0200 Subject: [PATCH 1/2] rm unused import --- packages/vercel-flags-core/src/types.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/vercel-flags-core/src/types.ts b/packages/vercel-flags-core/src/types.ts index 2d25fb68..829e06bf 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 */ From fb332a86687ebbc13732db975cb295ecec9418aa Mon Sep 17 00:00:00 2001 From: Dominik Ferber Date: Sat, 14 Mar 2026 15:15:08 +0200 Subject: [PATCH 2/2] [vercel-flags] allow json flags --- .changeset/bright-jars-flow.md | 5 +++++ packages/vercel-flags-core/src/black-box.test.ts | 8 ++++++++ packages/vercel-flags-core/src/index.common.ts | 4 ++++ packages/vercel-flags-core/src/types.ts | 12 +++++++++++- 4 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 .changeset/bright-jars-flow.md 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 829e06bf..0feebae3 100644 --- a/packages/vercel-flags-core/src/types.ts +++ b/packages/vercel-flags-core/src/types.ts @@ -247,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',