@flags-sdk/vercel 1.0.3 → 1.1.1

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,5 +1,43 @@
1
1
  # @flags-sdk/vercel
2
2
 
3
+ ## 1.1.1
4
+
5
+ ### Patch Changes
6
+
7
+ - b81963d: Loosen the type restrictions on the `Evaluation` type as the previous implementation would only work with `interface` but not with `type` that lead to an accidental breaking change.
8
+ - Updated dependencies [b81963d]
9
+ - @vercel/flags-core@1.2.1
10
+
11
+ ## 1.1.0
12
+
13
+ ### Minor Changes
14
+
15
+ - 64619d7: Allow specifying entities type when creating clients
16
+
17
+ You can now create clients while specifying the entities type:
18
+
19
+ ```ts
20
+ type Entities = { user: { id: string; name?: string } };
21
+ const client = createClient<Entities>("");
22
+ client.evaluate("flagKey", undefined, { user: { id: "" } }); // uses Entities type for context
23
+ ```
24
+
25
+ You can still narrow the entities type when evaluating flags:
26
+
27
+ ```ts
28
+ client.evaluate<{ user: { id: string; name: string } }>(
29
+ "flagKey",
30
+ false,
31
+ { user: { id: "", name: "" } } // uses custom entities type
32
+ );
33
+ ```
34
+
35
+ ### Patch Changes
36
+
37
+ - Updated dependencies [64619d7]
38
+ - Updated dependencies [4a5f56a]
39
+ - @vercel/flags-core@1.2.0
40
+
3
41
  ## 1.0.3
4
42
 
5
43
  ### Patch Changes
package/dist/index.cjs CHANGED
@@ -10,7 +10,7 @@ function createVercelAdapter(sdkKeyOrFlagsClient) {
10
10
  return {
11
11
  origin: flagsClient2.origin,
12
12
  config: { reportValue: false },
13
- async decide({ key, entities, headers }) {
13
+ async decide({ key, entities }) {
14
14
  const evaluationResult = await flagsClient2.evaluate(key, void 0, entities);
15
15
  if (evaluationResult.value === void 0) {
16
16
  throw new Error(
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/flags/flags/packages/adapter-vercel/dist/index.cjs","../src/index.ts"],"names":["flagsClient","vercelAdapter"],"mappings":"AAAA;ACAA;AACE;AAEA;AACA;AAAA,+CACK;AAkBA,SAAS,mBAAA,CAEd,mBAAA,EACA;AACA,EAAA,MAAMA,aAAAA,EACJ,OAAO,oBAAA,IAAwB,SAAA,EAC3B,qCAAA,mBAAgC,EAAA,EAChC,mBAAA;AAEN,EAAA,OAAO,SAASC,cAAAA,CAAAA,EAGd;AACA,IAAA,OAAO;AAAA,MACL,MAAA,EAAQD,YAAAA,CAAY,MAAA;AAAA,MACpB,MAAA,EAAQ,EAAE,WAAA,EAAa,MAAM,CAAA;AAAA,MAC7B,MAAM,MAAA,CAAO,EAAE,GAAA,EAAK,QAAA,EAAU,QAAQ,CAAA,EAAuB;AAC3D,QAAA,MAAM,iBAAA,EAAmB,MAAMA,YAAAA,CAAY,QAAA,CAGzC,GAAA,EAAK,KAAA,CAAA,EAAW,QAAQ,CAAA;AAE1B,QAAA,GAAA,CAAI,gBAAA,CAAiB,MAAA,IAAU,KAAA,CAAA,EAAW;AAExC,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,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,UAAA;AACF,QAAA;AAIwB,QAAA;AAC1B,MAAA;AACF,IAAA;AACF,EAAA;AACF;AAEI;AAKwC;AACnB,EAAA;AACzB;AAUE;AAC2B,EAAA;AAC6B,IAAA;AACxD,EAAA;AAEqD,EAAA;AACvD;AAEkD;AAEM;AAClB,EAAA;AACvB,EAAA;AACiB,IAAA;AACG,IAAA;AACjC,EAAA;AACO,EAAA;AACT;AAIoD;AAOM,EAAA;AAE1D;AAQyB;AAGyC,EAAA;AAGhC,EAAA;AACN,EAAA;AACM,IAAA;AACD,MAAA;AAC7B,IAAA;AACF,EAAA;AAEkD,EAAA;AACpC,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;ADhFkK;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'\n ? createClient(sdkKeyOrFlagsClient)\n : sdkKeyOrFlagsClient;\n\n return function vercelAdapter<ValueType, EntitiesType>(): Adapter<\n ValueType,\n EntitiesType\n > {\n return {\n origin: flagsClient.origin,\n config: { reportValue: false },\n async decide({ key, entities, headers }): Promise<ValueType> {\n const evaluationResult = await flagsClient.evaluate<\n ValueType,\n EntitiesType\n >(key, undefined, entities);\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 };\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, FlagsClient>();\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 'sdkKey' in origin &&\n typeof (origin as Record<string, unknown>).sdkKey === 'string'\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>();\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, 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","vercelAdapter"],"mappings":"AAAA;ACAA;AACE;AAEA;AACA;AAAA,+CACK;AAkBA,SAAS,mBAAA,CAEd,mBAAA,EACA;AACA,EAAA,MAAMA,aAAAA,EACJ,OAAO,oBAAA,IAAwB,SAAA,EAC3B,qCAAA,mBAAgC,EAAA,EAChC,mBAAA;AAEN,EAAA,OAAO,SAASC,cAAAA,CAAAA,EAGd;AACA,IAAA,OAAO;AAAA,MACL,MAAA,EAAQD,YAAAA,CAAY,MAAA;AAAA,MACpB,MAAA,EAAQ,EAAE,WAAA,EAAa,MAAM,CAAA;AAAA,MAC7B,MAAM,MAAA,CAAO,EAAE,GAAA,EAAK,SAAS,CAAA,EAAuB;AAClD,QAAA,MAAM,iBAAA,EAAmB,MAAMA,YAAAA,CAAY,QAAA,CAGzC,GAAA,EAAK,KAAA,CAAA,EAAW,QAAQ,CAAA;AAE1B,QAAA,GAAA,CAAI,gBAAA,CAAiB,MAAA,IAAU,KAAA,CAAA,EAAW;AAExC,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,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,UAAA;AACF,QAAA;AAIwB,QAAA;AAC1B,MAAA;AACF,IAAA;AACF,EAAA;AACF;AAEI;AAKwC;AACnB,EAAA;AACzB;AAUE;AAC2B,EAAA;AAC6B,IAAA;AACxD,EAAA;AAEqD,EAAA;AACvD;AAEkD;AAEM;AAClB,EAAA;AACvB,EAAA;AACiB,IAAA;AACG,IAAA;AACjC,EAAA;AACO,EAAA;AACT;AAIoD;AAOM,EAAA;AAE1D;AAQyB;AAGyC,EAAA;AAGhC,EAAA;AACN,EAAA;AACM,IAAA;AACD,MAAA;AAC7B,IAAA;AACF,EAAA;AAEkD,EAAA;AACpC,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;ADhFkK;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'\n ? createClient(sdkKeyOrFlagsClient)\n : sdkKeyOrFlagsClient;\n\n return function vercelAdapter<ValueType, EntitiesType>(): Adapter<\n ValueType,\n EntitiesType\n > {\n return {\n origin: flagsClient.origin,\n config: { reportValue: false },\n async decide({ key, entities }): Promise<ValueType> {\n const evaluationResult = await flagsClient.evaluate<\n ValueType,\n EntitiesType\n >(key, undefined, entities);\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 };\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, FlagsClient>();\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 'sdkKey' in origin &&\n typeof (origin as Record<string, unknown>).sdkKey === 'string'\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>();\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, 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"]}
package/dist/index.js CHANGED
@@ -10,7 +10,7 @@ function createVercelAdapter(sdkKeyOrFlagsClient) {
10
10
  return {
11
11
  origin: flagsClient2.origin,
12
12
  config: { reportValue: false },
13
- async decide({ key, entities, headers }) {
13
+ async decide({ key, entities }) {
14
14
  const evaluationResult = await flagsClient2.evaluate(key, void 0, entities);
15
15
  if (evaluationResult.value === void 0) {
16
16
  throw new Error(
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'\n ? createClient(sdkKeyOrFlagsClient)\n : sdkKeyOrFlagsClient;\n\n return function vercelAdapter<ValueType, EntitiesType>(): Adapter<\n ValueType,\n EntitiesType\n > {\n return {\n origin: flagsClient.origin,\n config: { reportValue: false },\n async decide({ key, entities, headers }): Promise<ValueType> {\n const evaluationResult = await flagsClient.evaluate<\n ValueType,\n EntitiesType\n >(key, undefined, entities);\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 };\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, FlagsClient>();\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 'sdkKey' in origin &&\n typeof (origin as Record<string, unknown>).sdkKey === 'string'\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>();\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, 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":";AAAA;AAAA,EACE;AAAA,EAEA;AAAA,EACA;AAAA,OACK;AAkBA,SAAS,oBAEd,qBACA;AACA,QAAMA,eACJ,OAAO,wBAAwB,WAC3B,aAAa,mBAAmB,IAChC;AAEN,SAAO,SAASC,iBAGd;AACA,WAAO;AAAA,MACL,QAAQD,aAAY;AAAA,MACpB,QAAQ,EAAE,aAAa,MAAM;AAAA,MAC7B,MAAM,OAAO,EAAE,KAAK,UAAU,QAAQ,GAAuB;AAC3D,cAAM,mBAAmB,MAAMA,aAAY,SAGzC,KAAK,QAAW,QAAQ;AAE1B,YAAI,iBAAiB,UAAU,QAAW;AAExC,gBAAM,IAAI;AAAA,YACR,iBAAiB,WAAW,OAAO,SACjC,iBAAiB,eACf,mCAAmC,GAAG,MAAM,iBAAiB,YAAY,KACzE,mCAAmC,GAAG;AAAA,UAC5C;AAAA,QACF;AAIA,eAAO,iBAAiB;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAI;AAKG,SAAS,4BAA4B;AAC1C,yBAAuB;AACzB;AAOO,SAAS,gBAGd;AACA,MAAI,CAAC,sBAAsB;AACzB,2BAAuB,oBAAoB,WAAW;AAAA,EACxD;AAEA,SAAO,qBAA8C;AACvD;AAEA,IAAM,eAAe,oBAAI,IAAyB;AAElD,SAAS,kBAAkB,QAA6B;AACtD,MAAI,SAAS,aAAa,IAAI,MAAM;AACpC,MAAI,CAAC,QAAQ;AACX,aAAS,aAAa,MAAM;AAC5B,iBAAa,IAAI,QAAQ,MAAM;AAAA,EACjC;AACA,SAAO;AACT;AAEA,SAAS,eACP,QACkD;AAClD,SACE,OAAO,WAAW,YAClB,WAAW,QACX,cAAc,UACb,OAAmC,aAAa,YACjD,YAAY,UACZ,OAAQ,OAAmC,WAAW;AAE1D;AAEA,eAAsB,gBACpB,OAKuB;AACvB,QAAM,WAAW,OAAO,OAAO,KAAK,EAEjC,OAAO,CAAC,MAAoC,CAAC,MAAM,QAAQ,CAAC,CAAC;AAGhE,QAAM,UAAU,oBAAI,IAAY;AAChC,aAAW,KAAK,UAAU;AACxB,QAAI,eAAe,EAAE,MAAM,GAAG;AAC5B,cAAQ,IAAI,EAAE,OAAO,MAAM;AAAA,IAC7B;AAAA,EACF;AAEA,QAAM,oBAAoB,oBAAI,IAAoB;AAClD,QAAM,QAAQ;AAAA,IACZ,MAAM,KAAK,OAAO,EAAE,IAAI,OAAO,WAAW;AACxC,YAAM,SAAS,kBAAkB,MAAM;AACvC,UAAI;AACF,cAAM,WAAW,MAAM,OAAO,oBAAoB;AAClD,0BAAkB,IAAI,QAAQ,SAAS,SAAS;AAAA,MAClD,QAAQ;AACN,cAAM,WAAW,MAAM,OAAO,YAAY;AAC1C,0BAAkB,IAAI,QAAQ,SAAS,SAAS;AAAA,MAClD;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,cAAc,SAAS,OAA4B,CAAC,KAAK,MAAM;AACnE,QAAI,CAAC,eAAe,EAAE,MAAM,EAAG,QAAO;AAEtC,UAAM,YAAY,kBAAkB,IAAI,EAAE,OAAO,MAAM;AACvD,QAAI,EAAE,GAAG,IAAI;AAAA,MACX,SAAS,EAAE;AAAA,MACX,QAAQ;AAAA,QACN,UAAU;AAAA,QACV;AAAA,MACF;AAAA,MACA,aAAa,EAAE;AAAA,MACf,cAAc,EAAE;AAAA,MAChB,gBAAgB;AAAA,IAClB;AAEA,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AAEL,SAAO,EAAE,aAAa,OAAO,CAAC,EAAE;AAClC;","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'\n ? createClient(sdkKeyOrFlagsClient)\n : sdkKeyOrFlagsClient;\n\n return function vercelAdapter<ValueType, EntitiesType>(): Adapter<\n ValueType,\n EntitiesType\n > {\n return {\n origin: flagsClient.origin,\n config: { reportValue: false },\n async decide({ key, entities }): Promise<ValueType> {\n const evaluationResult = await flagsClient.evaluate<\n ValueType,\n EntitiesType\n >(key, undefined, entities);\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 };\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, FlagsClient>();\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 'sdkKey' in origin &&\n typeof (origin as Record<string, unknown>).sdkKey === 'string'\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>();\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, 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":";AAAA;AAAA,EACE;AAAA,EAEA;AAAA,EACA;AAAA,OACK;AAkBA,SAAS,oBAEd,qBACA;AACA,QAAMA,eACJ,OAAO,wBAAwB,WAC3B,aAAa,mBAAmB,IAChC;AAEN,SAAO,SAASC,iBAGd;AACA,WAAO;AAAA,MACL,QAAQD,aAAY;AAAA,MACpB,QAAQ,EAAE,aAAa,MAAM;AAAA,MAC7B,MAAM,OAAO,EAAE,KAAK,SAAS,GAAuB;AAClD,cAAM,mBAAmB,MAAMA,aAAY,SAGzC,KAAK,QAAW,QAAQ;AAE1B,YAAI,iBAAiB,UAAU,QAAW;AAExC,gBAAM,IAAI;AAAA,YACR,iBAAiB,WAAW,OAAO,SACjC,iBAAiB,eACf,mCAAmC,GAAG,MAAM,iBAAiB,YAAY,KACzE,mCAAmC,GAAG;AAAA,UAC5C;AAAA,QACF;AAIA,eAAO,iBAAiB;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAI;AAKG,SAAS,4BAA4B;AAC1C,yBAAuB;AACzB;AAOO,SAAS,gBAGd;AACA,MAAI,CAAC,sBAAsB;AACzB,2BAAuB,oBAAoB,WAAW;AAAA,EACxD;AAEA,SAAO,qBAA8C;AACvD;AAEA,IAAM,eAAe,oBAAI,IAAyB;AAElD,SAAS,kBAAkB,QAA6B;AACtD,MAAI,SAAS,aAAa,IAAI,MAAM;AACpC,MAAI,CAAC,QAAQ;AACX,aAAS,aAAa,MAAM;AAC5B,iBAAa,IAAI,QAAQ,MAAM;AAAA,EACjC;AACA,SAAO;AACT;AAEA,SAAS,eACP,QACkD;AAClD,SACE,OAAO,WAAW,YAClB,WAAW,QACX,cAAc,UACb,OAAmC,aAAa,YACjD,YAAY,UACZ,OAAQ,OAAmC,WAAW;AAE1D;AAEA,eAAsB,gBACpB,OAKuB;AACvB,QAAM,WAAW,OAAO,OAAO,KAAK,EAEjC,OAAO,CAAC,MAAoC,CAAC,MAAM,QAAQ,CAAC,CAAC;AAGhE,QAAM,UAAU,oBAAI,IAAY;AAChC,aAAW,KAAK,UAAU;AACxB,QAAI,eAAe,EAAE,MAAM,GAAG;AAC5B,cAAQ,IAAI,EAAE,OAAO,MAAM;AAAA,IAC7B;AAAA,EACF;AAEA,QAAM,oBAAoB,oBAAI,IAAoB;AAClD,QAAM,QAAQ;AAAA,IACZ,MAAM,KAAK,OAAO,EAAE,IAAI,OAAO,WAAW;AACxC,YAAM,SAAS,kBAAkB,MAAM;AACvC,UAAI;AACF,cAAM,WAAW,MAAM,OAAO,oBAAoB;AAClD,0BAAkB,IAAI,QAAQ,SAAS,SAAS;AAAA,MAClD,QAAQ;AACN,cAAM,WAAW,MAAM,OAAO,YAAY;AAC1C,0BAAkB,IAAI,QAAQ,SAAS,SAAS;AAAA,MAClD;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,cAAc,SAAS,OAA4B,CAAC,KAAK,MAAM;AACnE,QAAI,CAAC,eAAe,EAAE,MAAM,EAAG,QAAO;AAEtC,UAAM,YAAY,kBAAkB,IAAI,EAAE,OAAO,MAAM;AACvD,QAAI,EAAE,GAAG,IAAI;AAAA,MACX,SAAS,EAAE;AAAA,MACX,QAAQ;AAAA,QACN,UAAU;AAAA,QACV;AAAA,MACF;AAAA,MACA,aAAa,EAAE;AAAA,MACf,cAAc,EAAE;AAAA,MAChB,gBAAgB;AAAA,IAClB;AAEA,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AAEL,SAAO,EAAE,aAAa,OAAO,CAAC,EAAE;AAClC;","names":["flagsClient","vercelAdapter"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flags-sdk/vercel",
3
- "version": "1.0.3",
3
+ "version": "1.1.1",
4
4
  "description": "",
5
5
  "keywords": [],
6
6
  "license": "MIT",
@@ -27,7 +27,7 @@
27
27
  "CHANGELOG.md"
28
28
  ],
29
29
  "dependencies": {
30
- "@vercel/flags-core": "1.1.1"
30
+ "@vercel/flags-core": "1.2.1"
31
31
  },
32
32
  "devDependencies": {
33
33
  "@types/node": "20.11.17",