diff --git a/packages/web/src/generic.ts b/packages/web/src/generic.ts index a05c6d6..75ab74c 100644 --- a/packages/web/src/generic.ts +++ b/packages/web/src/generic.ts @@ -91,7 +91,7 @@ function track( name: string, properties?: Record, options?: { - flagKeys?: string[]; + flags?: (string | Record)[] | Record; } ): void { if (!isBrowser()) { diff --git a/packages/web/src/server/index.ts b/packages/web/src/server/index.ts index 3cba8de..bca8787 100644 --- a/packages/web/src/server/index.ts +++ b/packages/web/src/server/index.ts @@ -11,7 +11,7 @@ function isHeaders(headers?: AllowedHeaders): headers is Headers { } interface Options { - flagKeys?: string[]; + flags?: (string | Record)[] | Record; headers?: AllowedHeaders; request?: { headers: AllowedHeaders }; } @@ -28,6 +28,8 @@ interface RequestContext { }; } +const MAX_FLAG_KEYS = 5; + const symbol = Symbol.for('@vercel/request-context'); const logPrefix = '[Vercel Web Analytics]'; @@ -99,11 +101,21 @@ export async function track( const url = new URL(origin); + const flags = options?.flags; const flagValuesToReport: Record = {}; - const allFlagValues = requestContext?.flags?.getValues(); + const allFlagValues = requestContext?.flags?.getValues() ?? {}; + + if (flags) { + const list = Array.isArray(flags) ? flags : [flags]; + + const keys = list.flatMap((keyOrObject) => { + if (typeof keyOrObject === 'string') return keyOrObject; + Object.assign(allFlagValues, keyOrObject); // Add values to global list + return Object.keys(keyOrObject); // Retrieve the keys + }); - if (options?.flagKeys && allFlagValues) { - options.flagKeys.forEach((key) => { + // Only report the first MAX_FLAG_KEYS flags + keys.slice(0, MAX_FLAG_KEYS).forEach((key) => { flagValuesToReport[key] = allFlagValues[key]; }); }