{"version":3,"sources":["/home/runner/work/flags/flags/packages/adapter-vercel/dist/index.cjs","../src/index.ts"],"names":["flagsClient"],"mappings":"AAAA;ACAA;AACE;AAEA;AACA;AAAA,+CACK;AAkBA,SAAS,mBAAA,CAEd,mBAAA,EACA;AACA,EAAA,MAAMA,aAAAA,EACJ,OAAO,oBAAA,IAAwB,SAAA,GAAY,oBAAA,IAAwB,KAAA,EAAA,EAC/D,qCAAA,mBAAgC,EAAA,EAChC,mBAAA;AAMN,EAAA,MAAM,UAAA,kBAAY,MAAA,CAAO,eAAe,CAAA;AAExC,EAAA,MAAM,QAAA,EAAqC;AAAA,IACzC,SAAA;AAAA,IACA,MAAA,EAAQA,YAAAA,CAAY,MAAA;AAAA,IACpB,MAAA,EAAQ,EAAE,WAAA,EAAa,MAAM,CAAA;AAAA,IAC7B,MAAM,MAAA,CAAO,EAAE,GAAA,EAAK,SAAS,CAAA,EAAG;AAC9B,MAAA,MAAM,iBAAA,EAAmB,MAAMA,YAAAA,CAAY,QAAA;AAAA,QACzC,GAAA;AAAA,QACA,KAAA,CAAA;AAAA,QACA;AAAA,MACF,CAAA;AAEA,MAAA,GAAA,CAAI,gBAAA,CAAiB,MAAA,IAAU,KAAA,CAAA,EAAW;AAExC,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,gBAAA,CAAiB,OAAA,IAAW,iBAAA,CAAO,MAAA,GACjC,gBAAA,CAAiB,aAAA,EACf,CAAA,gCAAA,EAAmC,GAAG,CAAA,GAAA,EAAM,gBAAA,CAAiB,YAAY,CAAA,EAAA;AAE/E,QAAA;AACF,MAAA;AAIwB,MAAA;AAC1B,IAAA;AACsC,IAAA;AAKF,MAAA;AAChC,QAAA;AACA,QAAA;AACF,MAAA;AACsC,MAAA;AACX,MAAA;AACJ,QAAA;AAGmB,QAAA;AAC1C,MAAA;AACO,MAAA;AACT,IAAA;AACF,EAAA;AAKE,EAAA;AACO,IAAA;AACT,EAAA;AACF;AAEI;AAKwC;AACnB,EAAA;AACzB;AAUE;AAC2B,EAAA;AAC6B,IAAA;AACxD,EAAA;AAEqD,EAAA;AACvD;AAE8D;AAML;AACnB,EAAA;AACvB,EAAA;AACiB,IAAA;AACG,IAAA;AACjC,EAAA;AACO,EAAA;AACT;AAIqD;AAKA,EAAA;AAErD;AAQyB;AAGyC,EAAA;AAGpB,EAAA;AAClB,EAAA;AACM,IAAA;AACD,MAAA;AAC7B,IAAA;AACF,EAAA;AAE8D,EAAA;AAChD,EAAA;AAC8B,IAAA;AACD,MAAA;AACnC,MAAA;AACgD,QAAA;AACF,QAAA;AAC1C,MAAA;AACoC,QAAA;AACM,QAAA;AAClD,MAAA;AACD,IAAA;AACH,EAAA;AAEqE,EAAA;AAC7B,IAAA;AAEiB,IAAA;AAC1C,IAAA;AACA,MAAA;AACH,MAAA;AACI,QAAA;AACV,QAAA;AACF,MAAA;AACe,MAAA;AACC,MAAA;AACA,MAAA;AAClB,IAAA;AAEO,IAAA;AACJ,EAAA;AAE2B,EAAA;AAClC;AD3FgK;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/flags/flags/packages/adapter-vercel/dist/index.cjs","sourcesContent":[null,"import {\n  createClient,\n  type FlagsClient,\n  flagsClient,\n  Reason,\n} from '@vercel/flags-core';\nimport type {\n  Adapter,\n  FlagDeclaration,\n  FlagDefinitionsType,\n  FlagDefinitionType,\n  ProviderData,\n} from 'flags';\nimport type { KeyedFlagDefinitionType } from 'flags/next';\n\nexport type VercelAdapterDeclaration<ValueType, EntitiesType> = Omit<\n  FlagDeclaration<ValueType, EntitiesType>,\n  'decide' | 'origin'\n>;\n\n/**\n * Allows creating a custom Vercel adapter for feature flags\n */\nexport function createVercelAdapter(\n  // usually a connection string, but can also be a pre-configured FlagsClient\n  sdkKeyOrFlagsClient?: string | FlagsClient,\n) {\n  const flagsClient =\n    typeof sdkKeyOrFlagsClient === 'string' || sdkKeyOrFlagsClient === undefined\n      ? createClient(sdkKeyOrFlagsClient)\n      : sdkKeyOrFlagsClient;\n\n  // Stable identity for this adapter's underlying flagsClient. Captured in\n  // the closure so every adapter object the factory below returns shares it,\n  // letting `evaluate()` group flags from multiple `vercelAdapter()` calls\n  // into a single `bulkDecide` invocation.\n  const adapterId = Symbol('vercelAdapter');\n\n  const adapter: Adapter<unknown, unknown> = {\n    adapterId,\n    origin: flagsClient.origin,\n    config: { reportValue: false },\n    async decide({ key, entities }) {\n      const evaluationResult = await flagsClient.evaluate<unknown, unknown>(\n        key,\n        undefined,\n        entities,\n      );\n\n      if (evaluationResult.value === undefined) {\n        // if there was no defaultValue we need to throw\n        throw new Error(\n          evaluationResult.reason === Reason.ERROR &&\n            evaluationResult.errorMessage\n            ? `flags: Could not evaluate flag \"${key}\". ${evaluationResult.errorMessage}`\n            : `flags: Could not evaluate flag \"${key}\"`,\n        );\n      }\n\n      // runs when the flag evaluates successfully or\n      // when there was an error but the defaultValue was set\n      return evaluationResult.value;\n    },\n    async bulkDecide({ flags, entities }) {\n      // `flags` is typed `{ key: string; defaultValue?: unknown }[]` on\n      // `Adapter.bulkDecide` (to keep `ValueType` covariant). The client\n      // here narrows it back to `ValueType`; `defaultValue` is shuttled\n      // through opaquely so the cast is safe.\n      const results = await flagsClient.bulkEvaluate<unknown, unknown>(\n        flags as { key: string; defaultValue?: unknown }[],\n        entities,\n      );\n      const out: Record<string, unknown> = {};\n      for (const key in results) {\n        const r = results[key]!;\n        // Omit undefined so the SDK applies the per-flag `defaultValue`\n        // fallback (matches single-decide semantics).\n        if (r.value !== undefined) out[key] = r.value;\n      }\n      return out;\n    },\n  };\n\n  return function vercelAdapter<ValueType, EntitiesType>(): Adapter<\n    ValueType,\n    EntitiesType\n  > {\n    return adapter as Adapter<ValueType, EntitiesType>;\n  };\n}\n\nlet defaultVercelAdapter: ReturnType<typeof createVercelAdapter> | undefined;\n\n/**\n * Internal function for testing purposes\n */\nexport function resetDefaultVercelAdapter() {\n  defaultVercelAdapter = undefined;\n}\n\n/**\n * A default Vercel adapter for feature flags\n *\n */\n// This is initialized lazily to avoid warning when it is not actually used and env vars are missing.\nexport function vercelAdapter<ValueType, EntitiesType>(): Adapter<\n  ValueType,\n  EntitiesType\n> {\n  if (!defaultVercelAdapter) {\n    defaultVercelAdapter = createVercelAdapter(flagsClient);\n  }\n\n  return defaultVercelAdapter<ValueType, EntitiesType>();\n}\n\nconst flagsClients = new Map<string | undefined, FlagsClient>();\n\n/**\n * Ensures we only ever create a single client per SDK Key\n * When undefined is passed, due to OIDC being used, then we return a single client too.\n **/\nfunction getOrCreateClient(sdkKey?: string): FlagsClient {\n  let client = flagsClients.get(sdkKey);\n  if (!client) {\n    client = createClient(sdkKey);\n    flagsClients.set(sdkKey, client);\n  }\n  return client;\n}\n\nfunction isVercelOrigin(\n  origin: unknown,\n): origin is { provider: 'vercel'; sdkKey?: string } {\n  return (\n    typeof origin === 'object' &&\n    origin !== null &&\n    'provider' in origin &&\n    (origin as Record<string, unknown>).provider === 'vercel'\n  );\n}\n\nexport async function getProviderData(\n  flags: Record<\n    string,\n    // accept an unknown array\n    KeyedFlagDefinitionType | readonly unknown[]\n  >,\n): Promise<ProviderData> {\n  const flagDefs = Object.values(flags)\n    // filter out precomputed arrays\n    .filter((i): i is KeyedFlagDefinitionType => !Array.isArray(i));\n\n  // Collect unique sdkKeys and resolve their projectIds\n  const sdkKeys = new Set<string | undefined>();\n  for (const d of flagDefs) {\n    if (isVercelOrigin(d.origin)) {\n      sdkKeys.add(d.origin.sdkKey);\n    }\n  }\n\n  const projectIdBySdkKey = new Map<string | undefined, string>();\n  await Promise.all(\n    Array.from(sdkKeys).map(async (sdkKey) => {\n      const client = getOrCreateClient(sdkKey);\n      try {\n        const fallback = await client.getFallbackDatafile();\n        projectIdBySdkKey.set(sdkKey, fallback.projectId);\n      } catch {\n        const datafile = await client.getDatafile();\n        projectIdBySdkKey.set(sdkKey, datafile.projectId);\n      }\n    }),\n  );\n\n  const definitions = flagDefs.reduce<FlagDefinitionsType>((acc, d) => {\n    if (!isVercelOrigin(d.origin)) return acc;\n\n    const projectId = projectIdBySdkKey.get(d.origin.sdkKey)!;\n    acc[d.key] = {\n      options: d.options,\n      origin: {\n        provider: 'vercel',\n        projectId,\n      },\n      description: d.description,\n      defaultValue: d.defaultValue,\n      declaredInCode: true,\n    } satisfies FlagDefinitionType;\n\n    return acc;\n  }, {});\n\n  return { definitions, hints: [] };\n}\n"]}