@web-widget/flags-kit
Version:
Flags SDK by Vercel - The feature flags toolkit for Next.js, SvelteKit, and Web Router - Enhanced fork with improved Web Router support
1 lines • 55.6 kB
Source Map (JSON)
{"version":3,"sources":["../src/web-router/index.ts","../src/web-router/overrides.ts","../src/web-router/precompute.ts","../src/web-router/html-transform.ts","../src/web-router/env.ts","../src/web-router/error-handling.ts","../src/web-router/dedupe.ts"],"names":["context","flag","serialize","deserialize","value","flagImpl","entities"],"mappings":"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","sourcesContent":["import { RequestCookies } from '@edge-runtime/cookies';\nimport { MiddlewareContext, MiddlewareHandler } from '@web-widget/schema';\nimport { context } from '@web-widget/context';\nimport {\n type ApiData,\n type FlagDefinitionType,\n type ProviderData,\n reportValue,\n safeJsonStringify,\n verifyAccess,\n type FlagDefinitionsType,\n version,\n} from '..';\nimport type {\n Decide,\n FlagDeclaration,\n Identify,\n JsonValue,\n Origin,\n} from '../types';\nimport type { Flag } from './types';\nimport { getOverrides } from './overrides';\nimport { normalizeOptions } from '../lib/normalize-options';\nimport { getPrecomputed } from './precompute';\nimport {\n type ReadonlyHeaders,\n HeadersAdapter,\n} from '../spec-extension/adapters/headers';\nimport {\n type ReadonlyRequestCookies,\n RequestCookiesAdapter,\n} from '../spec-extension/adapters/request-cookies';\nimport { setSpanAttribute, trace } from '../lib/tracing';\nimport { internalReportValue } from '../lib/report-value';\nimport { createFlagScriptInjectionTransform } from './html-transform';\nimport { tryGetSecret } from './env';\nimport { serialize } from '../lib/serialization';\nimport { safeExecute } from './error-handling';\n\nexport type { Flag } from './types';\n\nexport {\n getPrecomputed,\n combine,\n serialize,\n deserialize,\n evaluate,\n precompute,\n generatePermutations,\n} from './precompute';\n\nexport { dedupe, clearDedupeCacheForCurrentRequest } from './dedupe';\n\ndeclare module '@web-widget/schema' {\n interface State {\n _flag?: FlagContext;\n }\n}\n\nfunction hasOwnProperty<X extends {}, Y extends PropertyKey>(\n obj: X,\n prop: Y,\n): obj is X & Record<Y, unknown> {\n return obj.hasOwnProperty(prop);\n}\n\n// a map of (headers, flagKey, entitiesKey) => value\nconst evaluationCache = new WeakMap<\n Headers,\n Map</* flagKey */ string, Map</* entitiesKey */ string, any>>\n>();\n\ntype IdentifyArgs = Parameters<\n Exclude<FlagDeclaration<any, any>['identify'], undefined>\n>;\nconst identifyArgsMap = new WeakMap<Headers, IdentifyArgs>();\nconst headersMap = new WeakMap<Headers, ReadonlyHeaders>();\nconst cookiesMap = new WeakMap<Headers, ReadonlyRequestCookies>();\n\nfunction getCachedValuePromise(\n headers: Headers,\n flagKey: string,\n entitiesKey: string,\n): any {\n const map = evaluationCache.get(headers)?.get(flagKey);\n if (!map) return undefined;\n return map.get(entitiesKey);\n}\n\nfunction setCachedValuePromise(\n headers: Headers,\n flagKey: string,\n entitiesKey: string,\n flagValue: any,\n): any {\n const byHeaders = evaluationCache.get(headers);\n\n if (!byHeaders) {\n evaluationCache.set(\n headers,\n new Map([[flagKey, new Map([[entitiesKey, flagValue]])]]),\n );\n return;\n }\n\n const byFlagKey = byHeaders.get(flagKey);\n if (!byFlagKey) {\n byHeaders.set(flagKey, new Map([[entitiesKey, flagValue]]));\n return;\n }\n\n byFlagKey.set(entitiesKey, flagValue);\n}\n\nfunction sealHeaders(headers: Headers): ReadonlyHeaders {\n const cached = headersMap.get(headers);\n if (cached !== undefined) return cached;\n\n const sealed = HeadersAdapter.seal(\n headers,\n 'Headers cannot be modified in web-router. Headers are read-only during request processing.',\n );\n headersMap.set(headers, sealed);\n return sealed;\n}\n\nfunction sealCookies(headers: Headers): ReadonlyRequestCookies {\n const cached = cookiesMap.get(headers);\n if (cached !== undefined) return cached;\n\n const sealed = RequestCookiesAdapter.seal(\n new RequestCookies(headers),\n 'Cookies cannot be modified in web-router. Use Response.headers to set cookies in the response.',\n );\n cookiesMap.set(headers, sealed);\n return sealed;\n}\n\nfunction isIdentifyFunction<ValueType, EntitiesType>(\n identify: FlagDeclaration<ValueType, EntitiesType>['identify'] | EntitiesType,\n): identify is FlagDeclaration<ValueType, EntitiesType>['identify'] {\n return typeof identify === 'function';\n}\n\nasync function getEntities<ValueType, EntitiesType>(\n identify: FlagDeclaration<ValueType, EntitiesType>['identify'] | EntitiesType,\n dedupeCacheKey: Headers,\n readonlyHeaders: ReadonlyHeaders,\n readonlyCookies: ReadonlyRequestCookies,\n): Promise<EntitiesType | undefined> {\n if (!identify) return undefined;\n if (!isIdentifyFunction(identify)) return identify;\n\n const args = identifyArgsMap.get(dedupeCacheKey);\n if (args)\n return identify(\n ...(args as [\n { headers: ReadonlyHeaders; cookies: ReadonlyRequestCookies },\n ]),\n );\n\n const nextArgs: IdentifyArgs = [\n { headers: readonlyHeaders, cookies: readonlyCookies },\n ];\n identifyArgsMap.set(dedupeCacheKey, nextArgs);\n return identify(\n ...(nextArgs as [\n { headers: ReadonlyHeaders; cookies: ReadonlyRequestCookies },\n ]),\n );\n}\n\ntype PromisesMap<T> = {\n [K in keyof T]: Promise<T[K]>;\n};\n\nasync function resolveObjectPromises<T>(obj: PromisesMap<T>): Promise<T> {\n // Convert the object into an array of [key, promise] pairs\n const entries = Object.entries(obj) as [keyof T, Promise<any>][];\n\n // Use Promise.all to wait for all the promises to resolve\n const resolvedEntries = await Promise.all(\n entries.map(async ([key, promise]) => {\n const value = await promise;\n return [key, value] as [keyof T, T[keyof T]];\n }),\n );\n\n // Convert the array of resolved [key, value] pairs back into an object\n return Object.fromEntries(resolvedEntries) as T;\n}\n\nfunction getDecide<ValueType, EntitiesType>(\n definition: FlagDeclaration<ValueType, EntitiesType>,\n): Decide<ValueType, EntitiesType> {\n return function decide(params) {\n if (typeof definition.decide === 'function') {\n return definition.decide(params);\n }\n if (typeof definition.adapter?.decide === 'function') {\n return definition.adapter.decide({ key: definition.key, ...params });\n }\n throw new Error(`flags: No decide function provided for ${definition.key}`);\n };\n}\n\nfunction getIdentify<ValueType, EntitiesType>(\n definition: FlagDeclaration<ValueType, EntitiesType>,\n): Identify<EntitiesType> {\n return function identify(params) {\n if (typeof definition.identify === 'function') {\n return definition.identify(params);\n }\n if (typeof definition.adapter?.identify === 'function') {\n return definition.adapter.identify(params);\n }\n return definition.identify;\n };\n}\n\nfunction getOrigin<ValueType, EntitiesType>(\n definition: FlagDeclaration<ValueType, EntitiesType>,\n): string | Origin | undefined {\n if (definition.origin) return definition.origin;\n if (typeof definition.adapter?.origin === 'function')\n return definition.adapter.origin(definition.key);\n return definition.adapter?.origin;\n}\n\n/**\n * Used when a flag is called outside of a request context, i.e. outside of the lifecycle of the `handle` hook.\n * This could be the case when the flag is called from edge middleware.\n */\nconst requestMap = new WeakMap<Request, FlagContext>();\n\ntype Run<ValueType, EntitiesType> = (options: {\n identify: FlagDeclaration<ValueType, EntitiesType>['identify'] | EntitiesType;\n request?: Request;\n}) => Promise<ValueType>;\n\nfunction getRun<ValueType, EntitiesType>(\n definition: FlagDeclaration<ValueType, EntitiesType>,\n decide: Decide<ValueType, EntitiesType>,\n): Run<ValueType, EntitiesType> {\n return async function run(options): Promise<ValueType> {\n let store = context().state._flag;\n\n // If no store, create one from the provided request\n if (!store) {\n if (options.request) {\n const cached = requestMap.get(options.request);\n if (!cached) {\n store = createContext(options.request, await tryGetSecret());\n requestMap.set(options.request, store);\n } else {\n store = cached;\n }\n } else {\n throw new Error('flags: Neither context found nor Request provided');\n }\n }\n\n const headers = sealHeaders(store.request.headers);\n const cookies = sealCookies(store.request.headers);\n\n // Use improved overrides function with memoization\n const overridesCookie = cookies.get('vercel-flag-overrides')?.value;\n const overrides = await getOverrides(overridesCookie);\n\n let entities: EntitiesType | undefined;\n\n // Use provided identify\n if (options.identify) {\n if (typeof options.identify === 'function') {\n entities = await (options.identify as Identify<EntitiesType>)({\n headers,\n cookies,\n });\n } else {\n entities = options.identify as EntitiesType;\n }\n }\n\n // Create entities key for caching\n const entitiesKey = JSON.stringify(entities) ?? '';\n\n // Check sophisticated cache first\n const cachedValue = getCachedValuePromise(\n store.request.headers,\n definition.key,\n entitiesKey,\n );\n if (cachedValue !== undefined) {\n return await cachedValue;\n }\n\n if (overrides && hasOwnProperty(overrides, definition.key)) {\n const value = overrides[definition.key];\n if (typeof value !== 'undefined') {\n setSpanAttribute('method', 'override');\n const resolvedPromise = Promise.resolve(value as JsonValue);\n\n // Update cache\n setCachedValuePromise(\n store.request.headers,\n definition.key,\n entitiesKey,\n resolvedPromise,\n );\n\n internalReportValue(definition.key, value, {\n reason: 'override',\n });\n return value;\n }\n }\n\n // Execute decide function with improved error handling\n const valuePromise = safeExecute(\n () =>\n decide({\n headers,\n cookies,\n entities,\n }),\n definition.defaultValue,\n (error) => {\n if (process.env.NODE_ENV === 'development') {\n console.info(\n `flags: Flag \"${definition.key}\" is falling back to its defaultValue`,\n );\n } else {\n console.warn(\n `flags: Flag \"${definition.key}\" is falling back to its defaultValue after catching the following error`,\n error,\n );\n }\n },\n ).then<ValueType, ValueType>((value) => {\n if (value !== undefined) return value;\n if (definition.defaultValue !== undefined) return definition.defaultValue;\n throw new Error(\n `flags: Flag \"${definition.key}\" must have a defaultValue or a decide function that returns a value`,\n );\n });\n\n // Update cache\n setCachedValuePromise(\n store.request.headers,\n definition.key,\n entitiesKey,\n valuePromise as Promise<JsonValue>,\n );\n\n const value = await valuePromise;\n if (definition.config?.reportValue !== false) {\n reportValue(definition.key, value);\n }\n return value;\n };\n}\n\n/**\n * Declares a feature flag\n */\nexport function flag<\n ValueType extends JsonValue = boolean | string | number,\n EntitiesType = any,\n>(\n definition: FlagDeclaration<ValueType, EntitiesType>,\n): Flag<ValueType, EntitiesType> {\n const decide = getDecide<ValueType, EntitiesType>(definition);\n const identify = getIdentify(definition);\n const run = getRun<ValueType, EntitiesType>(definition, decide);\n const origin = getOrigin(definition);\n\n const flagImpl = trace(\n async function flagImpl(...args: any[]): Promise<ValueType> {\n // Default method, may be overwritten by other branches\n setSpanAttribute('method', 'decided');\n\n // Handle precomputed flags first (similar to Next.js)\n if (typeof args[0] === 'string' && Array.isArray(args[1])) {\n setSpanAttribute('method', 'precomputed');\n const [precomputedCode, precomputedGroup, secret] = args;\n // If no secret provided, try to get from context\n const effectiveSecret =\n secret ?? context().state._flag?.secret ?? (await tryGetSecret());\n // Create a temporary flag object with the key\n const tempFlag = { key: definition.key } as Flag<ValueType>;\n return getPrecomputed(\n tempFlag,\n precomputedGroup,\n precomputedCode,\n effectiveSecret,\n );\n }\n\n let store = context().state._flag;\n\n if (!store) {\n if (args[0] instanceof Request) {\n const cached = requestMap.get(args[0]);\n if (!cached) {\n store = createContext(\n args[0],\n (args[1] as string) ?? (await tryGetSecret()),\n );\n requestMap.set(args[0], store);\n } else {\n store = cached;\n }\n } else {\n throw new Error('flags: Neither context found nor Request provided');\n }\n }\n\n const headers = sealHeaders(store.request.headers);\n const cookies = sealCookies(store.request.headers);\n\n const overridesCookie = cookies.get('vercel-flag-overrides')?.value;\n const overrides = await getOverrides(overridesCookie);\n\n let entities: EntitiesType | undefined;\n if (identify) {\n // Deduplicate calls to identify, key being the function itself\n if (!store.identifiers.has(identify)) {\n const entities = identify({\n headers,\n cookies,\n });\n store.identifiers.set(identify, entities);\n }\n\n entities = (await store.identifiers.get(identify)) as EntitiesType;\n }\n\n // Create entities key for caching like Next.js\n const entitiesKey = JSON.stringify(entities) ?? '';\n\n // Check sophisticated cache first\n const cachedValue = getCachedValuePromise(\n store.request.headers,\n definition.key,\n entitiesKey,\n );\n if (cachedValue !== undefined) {\n setSpanAttribute('method', 'cached');\n const value = await cachedValue;\n return value;\n }\n\n if (overrides && hasOwnProperty(overrides, definition.key)) {\n const value = overrides[definition.key];\n if (typeof value !== 'undefined') {\n setSpanAttribute('method', 'override');\n const resolvedPromise = Promise.resolve(value as JsonValue);\n store.usedFlags[definition.key] = resolvedPromise;\n\n // Also update the sophisticated cache\n setCachedValuePromise(\n store.request.headers,\n definition.key,\n entitiesKey,\n resolvedPromise,\n );\n\n internalReportValue(definition.key, value, {\n reason: 'override',\n });\n return value;\n }\n }\n\n // Use improved error handling\n const valuePromise = safeExecute(\n () =>\n decide({\n headers,\n cookies,\n entities,\n }),\n definition.defaultValue,\n (error) => {\n if (process.env.NODE_ENV === 'development') {\n console.info(\n `flags: Flag \"${definition.key}\" is falling back to its defaultValue`,\n );\n } else {\n console.warn(\n `flags: Flag \"${definition.key}\" is falling back to its defaultValue after catching the following error`,\n error,\n );\n }\n },\n ).then<ValueType, ValueType>((value) => {\n if (value !== undefined) return value;\n if (definition.defaultValue !== undefined)\n return definition.defaultValue;\n throw new Error(\n `flags: Flag \"${definition.key}\" must have a defaultValue or a decide function that returns a value`,\n );\n });\n\n store.usedFlags[definition.key] = valuePromise as Promise<JsonValue>;\n\n // Also update the sophisticated cache\n setCachedValuePromise(\n store.request.headers,\n definition.key,\n entitiesKey,\n valuePromise as Promise<JsonValue>,\n );\n\n const value = await valuePromise;\n if (definition.config?.reportValue !== false) {\n reportValue(definition.key, value);\n }\n return value;\n },\n {\n name: 'flag',\n isVerboseTrace: false,\n attributes: { key: definition.key },\n },\n ) as any as Flag<ValueType, EntitiesType>;\n\n // Add all the properties to make it compatible with Flag<ValueType>\n flagImpl.key = definition.key;\n flagImpl.defaultValue = definition.defaultValue;\n flagImpl.origin = origin;\n flagImpl.description = definition.description;\n flagImpl.options = normalizeOptions(definition.options);\n flagImpl.decide = trace(decide, {\n isVerboseTrace: false,\n name: 'decide',\n attributes: { key: definition.key },\n });\n flagImpl.identify = identify\n ? trace(identify, {\n isVerboseTrace: false,\n name: 'identify',\n attributes: { key: definition.key },\n })\n : identify;\n flagImpl.run = trace(run, {\n isVerboseTrace: false,\n name: 'run',\n attributes: { key: definition.key },\n });\n\n return flagImpl;\n}\n\nexport type KeyedFlagDefinitionType = { key: string } & FlagDefinitionType;\n\nexport function getProviderData(\n flags: Record<\n string,\n // accept an unknown array\n KeyedFlagDefinitionType | readonly unknown[]\n >,\n): ProviderData {\n const definitions = Object.values(flags)\n // filter out precomputed arrays\n .filter((i): i is KeyedFlagDefinitionType => !Array.isArray(i))\n .reduce<FlagDefinitionsType>((acc, d) => {\n // maps the existing type from the facet definitions to the type\n // the toolbar expects\n acc[d.key] = {\n options: d.options,\n origin: d.origin,\n description: d.description,\n defaultValue: d.defaultValue,\n declaredInCode: true,\n } satisfies FlagDefinitionType;\n return acc;\n }, {});\n\n return { definitions, hints: [] };\n}\n\ninterface FlagContext {\n request: Request;\n secret: string;\n usedFlags: Record<string, Promise<JsonValue>>;\n identifiers: Map<Identify<unknown>, ReturnType<Identify<unknown>>>;\n}\n\nfunction createContext(\n request: Request,\n secret: string,\n params?: Record<string, string>,\n): FlagContext {\n return {\n request,\n secret,\n usedFlags: {},\n identifiers: new Map(),\n };\n}\n\n/**\n * Establishes context for flags, so they have access to the\n * request and cookie.\n *\n * Also registers evaluated flags, except for flags used only after `resolve` calls in other handlers.\n *\n * @example Usage example in routes/(middlewares)/global.ts\n *\n * ```ts\n * import { createHandle } from 'flags/web-router';\n * import * as flags from '#config/flags';\n *\n * export default createHandle({\n * flags,\n * secret: process.env.FLAGS_SECRET,\n * });\n * ```\n *\n * @example Usage example with other middleware handlers\n *\n * ```ts\n * import { composeMiddleware } from '@web-widget/helpers';\n * import { createHandle } from 'flags/web-router';\n * import * as flags from '#config/flags';\n *\n * const flagsMiddleware = createHandle({\n * flags,\n * secret: process.env.FLAGS_SECRET,\n * });\n *\n * export default composeMiddleware([otherMiddleware, flagsMiddleware]);\n * ```\n *\n * Note that when composing `createHandle` with other middleware, `createHandle` should come after other middleware that don't require access to flags. Only handlers after it will be able to access feature flags.\n */\nexport function createHandle({\n secret,\n flags,\n}: {\n secret?: string;\n flags?: Record<string, Flag<any>>;\n}): MiddlewareHandler {\n return async function handle({ request, params, render }, next) {\n secret ??= await tryGetSecret(secret);\n\n if (\n flags &&\n // avoid creating the URL object for every request by checking with includes() first\n request.url.includes('/.well-known/') &&\n new URL(request.url).pathname === '/.well-known/vercel/flags'\n ) {\n return handleWellKnownFlagsRoute(request.headers, secret, flags);\n }\n\n // The current route is a page to inject flag\n if (!render) {\n return next();\n }\n\n context().state._flag = createContext(request, secret, params);\n const result = await next();\n\n // Modify the HTML response stream to inject flag values script after </body>\n if (result && result instanceof Response && result.body) {\n const contentType = result.headers.get('content-type')?.toLowerCase();\n if (contentType && contentType.includes('text/html')) {\n // Only inject flag values script in Vercel environments for consistency with other frameworks\n if (isVercelEnvironment()) {\n const transformStream = createFlagScriptInjectionTransform(\n async () => {\n const store = context().state._flag;\n if (!store || Object.keys(store.usedFlags).length === 0)\n return '';\n\n // This is for reporting which flags were used when this page was generated,\n // so the value shows up in Vercel Toolbar, without the client ever being\n // aware of this feature flag.\n const flagValues = await resolveObjectPromises(store.usedFlags);\n\n // Create a serialized representation of the flag values using the same\n // signing mechanism as Next.js, rather than encryption. This ensures\n // deterministic output across server restarts.\n const flagsArray = Object.keys(flagValues).map((key) => ({\n key,\n options: undefined,\n }));\n const serializedFlagValues = await serialize(\n flagValues,\n flagsArray,\n secret!, // secret is guaranteed to be defined at this point\n );\n\n return safeJsonStringify(serializedFlagValues);\n },\n );\n const modifiedBody = result.body.pipeThrough(transformStream);\n\n return new Response(modifiedBody, {\n status: result.status,\n statusText: result.statusText,\n headers: result.headers,\n });\n }\n }\n }\n\n return result;\n };\n}\n\n/**\n * Checks if the current environment is Vercel (preview or production)\n * This ensures consistency with other frameworks that only inject flag values in Vercel environments\n */\nfunction isVercelEnvironment(): boolean {\n // Check for Vercel-specific environment variables\n return !!(process.env.VERCEL || process.env.VERCEL_ENV);\n}\n\nasync function handleWellKnownFlagsRoute(\n headers: Headers,\n secret: string,\n flags: Record<string, Flag<any>>,\n) {\n const access = await verifyAccess(headers.get('authorization'), secret);\n if (!access) return new Response(null, { status: 401 });\n const providerData = getProviderData(flags);\n return Response.json(providerData, {\n headers: { 'x-flags-sdk-version': version },\n });\n}\n\n/**\n * Creates a well-known flags endpoint for WebRouter.\n * @param getApiData a function returning the API data\n * @param options accepts a secret\n * @returns a RequestHandler\n */\nexport function createFlagsDiscoveryEndpoint(\n getApiData: (context: MiddlewareContext) => Promise<ApiData> | ApiData,\n options?: {\n secret?: string | undefined;\n },\n): MiddlewareHandler {\n return async (context) => {\n const access = await verifyAccess(\n context.request.headers.get('authorization'),\n options?.secret,\n );\n if (!access) return Response.json(null, { status: 401 });\n\n const apiData = await getApiData(context);\n return Response.json(apiData, {\n headers: { 'x-flags-sdk-version': version },\n });\n };\n}\n","import { decryptOverrides } from '..';\nimport { memoizeOne } from '../lib/async-memoize-one';\n\nconst memoizedDecrypt = memoizeOne(\n (text: string) => decryptOverrides(text),\n (a, b) => a[0] === b[0], // only the first argument gets compared\n { cachePromiseRejection: true },\n);\n\nexport async function getOverrides(cookie: string | undefined) {\n if (typeof cookie === 'string' && cookie !== '') {\n const cookieOverrides = await memoizedDecrypt(cookie);\n return cookieOverrides ?? null;\n }\n\n return null;\n}\n","import type { Flag, FlagsArray } from './types';\nimport type { JsonValue } from '..';\nimport * as s from '../lib/serialization';\n\ntype ValuesArray = readonly any[];\n\n/**\n * Resolves a list of flags\n * @param flags - list of flags\n * @returns - an array of evaluated flag values with one entry per flag\n */\nexport async function evaluate<T extends FlagsArray>(\n flags: T,\n): Promise<{ [K in keyof T]: Awaited<ReturnType<T[K]>> }> {\n return Promise.all(flags.map((flag) => flag())) as Promise<{\n [K in keyof T]: Awaited<ReturnType<T[K]>>;\n }>;\n}\n\n/**\n * Evaluate a list of feature flags and generate a signed string representing their values.\n *\n * This convenience function call combines `evaluate` and `serialize`.\n *\n * @param flags - list of flags\n * @returns - a string representing evaluated flags\n */\nexport async function precompute<T extends FlagsArray>(\n flags: T,\n): Promise<string> {\n const values = await evaluate(flags);\n // Try to get secret from context, fallback to env\n const { context } = await import('@web-widget/context');\n const store = context().state._flag;\n const secret = store?.secret ?? process.env.FLAGS_SECRET;\n return serialize(flags, values, secret);\n}\n\n/**\n * Combines flag declarations with values.\n * @param flags - flag declarations\n * @param values - flag values\n * @returns - A record where the keys are flag keys and the values are flag values.\n */\nexport function combine(flags: FlagsArray, values: ValuesArray) {\n return Object.fromEntries(flags.map((flag, i) => [flag.key, values[i]]));\n}\n\n/**\n * Takes a list of feature flag declarations and their values and turns them into a short, signed string.\n *\n * The returned string is signed to avoid enumeration attacks.\n *\n * When a feature flag's `options` contains the value the flag resolved to, then the encoding will store it's index only, leading to better compression. Boolean values and null are compressed even when the options are not declared on the flag.\n *\n * @param flags - A list of feature flags\n * @param values - A list of the values of the flags declared in ´flags`\n * @param secret - The secret to use for signing the result\n * @returns - A short string representing the values.\n */\nexport async function serialize(\n flags: FlagsArray,\n values: ValuesArray,\n secret: string | undefined = process.env.FLAGS_SECRET,\n) {\n if (!secret) {\n throw new Error('flags: Can not serialize due to missing secret');\n }\n\n return s.serialize(combine(flags, values), flags, secret);\n}\n\n/**\n * Decodes all flags given the list of flags used to encode. Returns an object consisting of each flag's key and its resolved value.\n * @param flags - Flags used when `code` was generated by `precompute` or `serialize`.\n * @param code - The code returned from `serialize`\n * @param secret - The secret to use for signing the result\n * @returns - An object consisting of each flag's key and its resolved value.\n */\nexport async function deserialize(\n flags: FlagsArray,\n code: string,\n secret: string | undefined = process.env.FLAGS_SECRET,\n) {\n if (!secret) {\n throw new Error('flags: Can not deserialize due to missing secret');\n }\n\n return s.deserialize(code, flags, secret);\n}\n\n/**\n * Decodes the value of one flag given the list of flags used to encode and the code.\n *\n * @param flag - Flag to decode\n * @param precomputeFlags - Flags used when `code` was generated by `serialize`\n * @param code - The code returned from `serialize`\n * @param secret - The secret to use for verifying the signature\n */\nexport async function getPrecomputed<T extends JsonValue>(\n flag: Flag<T>,\n precomputeFlags: FlagsArray,\n code: string,\n secret?: string,\n): Promise<T>;\n\n/**\n * Decodes the value of multiple flags given the list of flags used to encode and the code.\n *\n * @param flags - Array of flags to decode\n * @param precomputeFlags - Flags used when `code` was generated by `serialize`\n * @param code - The code returned from `serialize`\n * @param secret - The secret to use for verifying the signature\n */\nexport async function getPrecomputed<\n T extends JsonValue,\n K extends readonly Flag<T>[],\n>(\n flags: readonly [...K],\n precomputeFlags: FlagsArray,\n code: string,\n secret?: string,\n): Promise<{ [P in keyof K]: K[P] extends Flag<infer U> ? U : never }>;\n\n/**\n * Decodes the value of one or multiple flags given the list of flags used to encode and the code.\n *\n * @param flag - Flag or list of flags to decode\n * @param precomputeFlags - Flags used when `code` was generated by `serialize`\n * @param code - The code returned from `serialize`\n * @param secret - The secret to use for verifying the signature\n */\nexport async function getPrecomputed<T extends JsonValue>(\n flagOrFlags: Flag<T> | readonly Flag<T>[],\n precomputeFlags: FlagsArray,\n code: string,\n secret: string | undefined = process.env.FLAGS_SECRET,\n): Promise<any> {\n if (!secret) {\n throw new Error(\n 'flags: getPrecomputed was called without a secret. Please set FLAGS_SECRET environment variable.',\n );\n }\n\n const flagSet = await deserialize(precomputeFlags, code, secret);\n\n if (Array.isArray(flagOrFlags)) {\n // Handle case when an array of flags is passed\n return flagOrFlags.map((flag) => flagSet[flag.key]);\n } else {\n // Handle case when a single flag is passed\n return flagSet[(flagOrFlags as Flag<T>).key];\n }\n}\n\n// see https://stackoverflow.com/a/44344803\nfunction* cartesianIterator<T>(items: T[][]): Generator<T[]> {\n const remainder = items.length > 1 ? cartesianIterator(items.slice(1)) : [[]];\n for (let r of remainder) for (let h of items.at(0)!) yield [h, ...r];\n}\n\n/**\n * Generates all permutations given a list of feature flags based on the options declared on each flag.\n * @param flags - The list of feature flags\n * @param filter - An optional filter function which gets called with each permutation.\n * @param secret - The secret sign the generated permutation with\n * @returns An array of strings representing each permutation\n */\nexport async function generatePermutations(\n flags: FlagsArray,\n filter: ((permutation: Record<string, JsonValue>) => boolean) | null = null,\n secret: string = process.env.FLAGS_SECRET!,\n): Promise<string[]> {\n if (!secret) {\n throw new Error(\n 'flags: generatePermutations was called without a secret. Please set FLAGS_SECRET environment variable.',\n );\n }\n\n const options = flags.map((flag) => {\n // infer boolean permutations if you don't declare any options.\n //\n // to explicitly opt out you need to use \"filter\"\n if (!flag.options) return [false, true];\n return flag.options.map((option) => option.value);\n });\n\n const list: Record<string, JsonValue>[] = [];\n\n for (const permutation of cartesianIterator(options)) {\n const permObject = permutation.reduce<Record<string, JsonValue>>(\n (acc, value, index) => {\n acc[flags[index]!.key] = value;\n return acc;\n },\n {},\n );\n if (!filter || filter(permObject)) list.push(permObject);\n }\n\n return Promise.all(list.map((values) => s.serialize(values, flags, secret)));\n}\n","/**\n * Creates a transform stream that conditionally injects flag values script before </body> tag in HTML content\n */\nexport function createFlagScriptInjectionTransform(\n scriptContent: () => Promise<string>,\n): TransformStream {\n // State machine for tracking </body> tag matching\n let state: 'normal' | 'partial_match' = 'normal';\n let matchBuffer = '';\n const bodyEndTag = '</body>';\n let injected = false;\n\n return new TransformStream({\n async transform(chunk, controller) {\n const text = new TextDecoder().decode(chunk);\n let outputBuffer = '';\n let i = 0;\n\n while (i < text.length) {\n const char = text[i];\n\n if (state === 'normal') {\n if (char === '<') {\n // Start potential match\n state = 'partial_match';\n matchBuffer = char;\n } else {\n // Normal character, output immediately\n outputBuffer += char;\n }\n } else if (state === 'partial_match') {\n matchBuffer += char;\n\n // Check if we still have a potential match\n if (bodyEndTag.startsWith(matchBuffer)) {\n // Still matching, continue\n if (matchBuffer === bodyEndTag) {\n // Complete match found!\n if (!injected) {\n const content = await scriptContent();\n if (content) {\n const scriptTag = `<script type=\"application/json\" data-flag-values>${content}</script>`;\n outputBuffer += scriptTag;\n injected = true;\n }\n }\n outputBuffer += bodyEndTag;\n state = 'normal';\n matchBuffer = '';\n }\n } else {\n // No longer matching, output the buffer except the last char\n const bufferToOutput = matchBuffer.slice(0, -1);\n outputBuffer += bufferToOutput;\n state = 'normal';\n matchBuffer = '';\n // Reprocess current character (last char from matchBuffer) in normal state\n if (char === '<') {\n state = 'partial_match';\n matchBuffer = char;\n } else {\n outputBuffer += char;\n }\n }\n }\n\n i++;\n }\n\n // Output any accumulated content\n if (outputBuffer) {\n controller.enqueue(new TextEncoder().encode(outputBuffer));\n }\n },\n\n async flush(controller) {\n // If we have a partial match at the end, output it\n if (matchBuffer) {\n controller.enqueue(new TextEncoder().encode(matchBuffer));\n }\n },\n });\n}\n","let default_secret: string | undefined = process?.env?.FLAGS_SECRET;\n\nexport async function tryGetSecret(secret?: string): Promise<string> {\n secret = secret || default_secret;\n\n if (!secret) {\n throw new Error(\n 'flags: No secret provided. Set an environment variable FLAGS_SECRET or provide a secret to the function.',\n );\n }\n\n return secret;\n}\n","/**\n * Determines if an error should be handled gracefully by returning a default value\n * instead of throwing. This helps ensure flags don't break user applications.\n * @param error - The error to check\n * @returns True if the error should be handled gracefully\n */\nexport function isRecoverableError(error: unknown): boolean {\n // Network errors, timeout errors, and other recoverable errors\n if (error instanceof Error) {\n const message = error.message.toLowerCase();\n return (\n message.includes('network') ||\n message.includes('time