@flags-sdk/vercel 1.5.0-b67dc74-20260831122711 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,16 +1,45 @@
1
1
  # @flags-sdk/vercel
2
2
 
3
- ## 1.5.0-b67dc74-20260831122711
3
+ ## 1.5.0
4
4
 
5
5
  ### Minor Changes
6
6
 
7
- - [#486](https://github.com/vercel/flags/pull/486) [`8505d17`](https://github.com/vercel/flags/commit/8505d179b6d1e43d3401cd7d6a7b89bf5ae92854) Thanks [@dferber90](https://github.com/dferber90)! - Add randomized experiment enrollment, assignment reasons for every experiment-managed flag outcome, readiness-aware cookie override exposure reporting, and per-evaluation exposure logging controls.
7
+ - [#517](https://github.com/vercel/flags/pull/517) [`d03e4f6`](https://github.com/vercel/flags/commit/d03e4f63ed645339c6a3a312f26ee77eb4cf03ef) Thanks [@vincent-derks](https://github.com/vincent-derks)! - Accept `flags:projectId=<id>` connection strings.
8
+
9
+ - [#537](https://github.com/vercel/flags/pull/537) [`c49aab6`](https://github.com/vercel/flags/commit/c49aab65a8d5f4327552c18179b3f8d761b0f53e) Thanks [@dferber90](https://github.com/dferber90)! - Allow progressive rollouts to end at a configurable percentage using `finalPromille` (for example, `50_000` for 50%). Rollouts without this field continue to end at 100%.
10
+
11
+ ### Patch Changes
12
+
13
+ - [#396](https://github.com/vercel/flags/pull/396) [`c3026fe`](https://github.com/vercel/flags/commit/c3026fe78b527f8c4300f444751ef4f9325db50e) Thanks [@Nexory](https://github.com/Nexory)! - fix(typed-emitter): clean up empty Set from Map on last off() call
14
+ - Updated dependencies [[`d03e4f6`](https://github.com/vercel/flags/commit/d03e4f63ed645339c6a3a312f26ee77eb4cf03ef), [`c49aab6`](https://github.com/vercel/flags/commit/c49aab65a8d5f4327552c18179b3f8d761b0f53e), [`c3026fe`](https://github.com/vercel/flags/commit/c3026fe78b527f8c4300f444751ef4f9325db50e)]:
15
+ - @vercel/flags-core@1.9.0
16
+
17
+ ## 1.4.10
18
+
19
+ ### Patch Changes
20
+
21
+ - Updated dependencies [[`c43b9d9`](https://github.com/vercel/flags/commit/c43b9d9076009a6a70ca2de55020ebcb15b1a4cc), [`7027cb2`](https://github.com/vercel/flags/commit/7027cb271183566ee224c6a96d36cb12ce7cf2fa)]:
22
+ - @vercel/flags-core@1.8.3
23
+
24
+ ## 1.4.9
25
+
26
+ ### Patch Changes
27
+
28
+ - Updated dependencies [[`4848877`](https://github.com/vercel/flags/commit/4848877ca60c8595745b7759e351e936d7fe5889), [`186ea50`](https://github.com/vercel/flags/commit/186ea5092b22cd3eadf136824ecb2d7293a047fd)]:
29
+ - @vercel/flags-core@1.8.2
30
+
31
+ ## 1.4.8
8
32
 
9
33
  ### Patch Changes
10
34
 
11
- - Updated dependencies [[`8505d17`](https://github.com/vercel/flags/commit/8505d179b6d1e43d3401cd7d6a7b89bf5ae92854)]:
12
- - @vercel/flags-core@1.9.0-b67dc74-20260831122711
13
- - flags@4.4.0-b67dc74-20260831122711
35
+ - [#486](https://github.com/vercel/flags/pull/486) [`c9d2811`](https://github.com/vercel/flags/commit/c9d28116ebca661f4e3c73f301d4b2d35310c823) Thanks [@dferber90](https://github.com/dferber90)! - Implement the `experimental_reportOverride` adapter hook to forward override
36
+ values to the underlying Vercel Flags client.
37
+
38
+ This API is not supported for general use yet. Do not use it unless Vercel has
39
+ explicitly enabled it for you.
40
+ - Updated dependencies [[`c9d2811`](https://github.com/vercel/flags/commit/c9d28116ebca661f4e3c73f301d4b2d35310c823), [`c9d2811`](https://github.com/vercel/flags/commit/c9d28116ebca661f4e3c73f301d4b2d35310c823), [`e0eebe6`](https://github.com/vercel/flags/commit/e0eebe6fbc296636761eb3dc31f2c4be01a398bf)]:
41
+ - flags@4.3.1
42
+ - @vercel/flags-core@1.8.1
14
43
 
15
44
  ## 1.4.7
16
45
 
package/dist/index.cjs CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/index.ts
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }// src/index.ts
2
2
 
3
3
 
4
4
 
@@ -11,9 +11,7 @@ function createVercelAdapter(sdkKeyOrFlagsClient) {
11
11
  adapterId,
12
12
  origin: flagsClient2.origin,
13
13
  config: { reportValue: false },
14
- async reportOverride({ key, value, entities }) {
15
- await flagsClient2.reportOverride(key, value, entities);
16
- },
14
+ experimental_reportOverride: flagsClient2.experimental_reportOverride,
17
15
  async decide({ key, entities }) {
18
16
  const evaluationResult = await flagsClient2.evaluate(
19
17
  key,
@@ -70,7 +68,7 @@ async function getProviderData(flags) {
70
68
  const flagDefs = Object.values(flags).filter((i) => !Array.isArray(i));
71
69
  const sdkKeys = /* @__PURE__ */ new Set();
72
70
  for (const d of flagDefs) {
73
- if (isVercelOrigin(d.origin)) {
71
+ if (isVercelOrigin(d.origin) && !d.origin.projectId) {
74
72
  sdkKeys.add(d.origin.sdkKey);
75
73
  }
76
74
  }
@@ -89,7 +87,7 @@ async function getProviderData(flags) {
89
87
  );
90
88
  const definitions = flagDefs.reduce((acc, d) => {
91
89
  if (!isVercelOrigin(d.origin)) return acc;
92
- const projectId = projectIdBySdkKey.get(d.origin.sdkKey);
90
+ const projectId = _nullishCoalesce(d.origin.projectId, () => ( projectIdBySdkKey.get(d.origin.sdkKey)));
93
91
  acc[d.key] = {
94
92
  options: d.options,
95
93
  origin: {
@@ -1 +1 @@
1
- {"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,cAAA,CAAe,EAAE,GAAA,EAAK,KAAA,EAAO,SAAS,CAAA,EAAG;AAC7C,MAAA,MAAMA,YAAAA,CAAY,cAAA,CAAe,GAAA,EAAK,KAAA,EAAO,QAAQ,CAAA;AAAA,IACvD,CAAA;AAAA,IACA,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 reportOverride({ key, value, entities }) {\n await flagsClient.reportOverride(key, value, entities);\n },\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"]}
1
+ {"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,2BAAA,EAA6BA,YAAAA,CAAY,2BAAA;AAAA,IACzC,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;AAIyE;AAKpB,EAAA;AAErD;AAQyB;AAGyC,EAAA;AAIpB,EAAA;AAClB,EAAA;AAC6B,IAAA;AACxB,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;AAGuB,IAAA;AAChD,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;AD7FgK;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 experimental_reportOverride: flagsClient.experimental_reportOverride,\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; projectId?: 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. Origins that already\n // name a project need no lookup.\n const sdkKeys = new Set<string | undefined>();\n for (const d of flagDefs) {\n if (isVercelOrigin(d.origin) && !d.origin.projectId) {\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 =\n d.origin.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"]}
package/dist/index.js CHANGED
@@ -11,9 +11,7 @@ function createVercelAdapter(sdkKeyOrFlagsClient) {
11
11
  adapterId,
12
12
  origin: flagsClient2.origin,
13
13
  config: { reportValue: false },
14
- async reportOverride({ key, value, entities }) {
15
- await flagsClient2.reportOverride(key, value, entities);
16
- },
14
+ experimental_reportOverride: flagsClient2.experimental_reportOverride,
17
15
  async decide({ key, entities }) {
18
16
  const evaluationResult = await flagsClient2.evaluate(
19
17
  key,
@@ -70,7 +68,7 @@ async function getProviderData(flags) {
70
68
  const flagDefs = Object.values(flags).filter((i) => !Array.isArray(i));
71
69
  const sdkKeys = /* @__PURE__ */ new Set();
72
70
  for (const d of flagDefs) {
73
- if (isVercelOrigin(d.origin)) {
71
+ if (isVercelOrigin(d.origin) && !d.origin.projectId) {
74
72
  sdkKeys.add(d.origin.sdkKey);
75
73
  }
76
74
  }
@@ -89,7 +87,7 @@ async function getProviderData(flags) {
89
87
  );
90
88
  const definitions = flagDefs.reduce((acc, d) => {
91
89
  if (!isVercelOrigin(d.origin)) return acc;
92
- const projectId = projectIdBySdkKey.get(d.origin.sdkKey);
90
+ const projectId = d.origin.projectId ?? projectIdBySdkKey.get(d.origin.sdkKey);
93
91
  acc[d.key] = {
94
92
  options: d.options,
95
93
  origin: {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["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 reportOverride({ key, value, entities }) {\n await flagsClient.reportOverride(key, value, entities);\n },\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"],"mappings":"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","names":["flagsClient","vercelAdapter"]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["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 experimental_reportOverride: flagsClient.experimental_reportOverride,\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; projectId?: 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. Origins that already\n // name a project need no lookup.\n const sdkKeys = new Set<string | undefined>();\n for (const d of flagDefs) {\n if (isVercelOrigin(d.origin) && !d.origin.projectId) {\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 =\n d.origin.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"],"mappings":"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","names":["flagsClient","vercelAdapter"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flags-sdk/vercel",
3
- "version": "1.5.0-b67dc74-20260831122711",
3
+ "version": "1.5.0",
4
4
  "description": "A Flags SDK adapter for Vercel Flags",
5
5
  "keywords": [
6
6
  "vercel",
@@ -37,20 +37,20 @@
37
37
  "CHANGELOG.md"
38
38
  ],
39
39
  "dependencies": {
40
- "@vercel/flags-core": "1.9.0-b67dc74-20260831122711"
40
+ "@vercel/flags-core": "1.9.0"
41
41
  },
42
42
  "devDependencies": {
43
43
  "@types/node": "22.14.0",
44
44
  "msw": "2.6.4",
45
- "next": "16.2.12",
45
+ "next": "16.3.6",
46
46
  "tsup": "8.5.1",
47
- "typescript": "5.6.3",
47
+ "typescript": "^5.9.3",
48
48
  "vite": "8.1.5",
49
49
  "vitest": "4.1.10",
50
- "flags": "4.4.0-b67dc74-20260831122711"
50
+ "flags": "4.3.1"
51
51
  },
52
52
  "peerDependencies": {
53
- "flags": "4.4.0-b67dc74-20260831122711"
53
+ "flags": "*"
54
54
  },
55
55
  "publishConfig": {
56
56
  "access": "public"