UNPKG

@flags-sdk/openfeature

Version:

OpenFeature provider for the Flags SDK

1 lines 5.56 kB
{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";AAoDO,SAAS,yBACd,MACmD;AACnD,MAAI,SAAwB,OAAO,SAAS,aAAa,OAAO;AAEhE,MAAI;AACJ,iBAAe,aAAa;AAC1B,QAAI;AAAQ,aAAO;AACnB,QAAI;AAAe,aAAO;AAC1B,oBAAgB,OAAO,SAAS,aAAa,KAAK,IAAI,QAAQ,QAAQ,IAAI;AAC1E,aAAS,MAAM;AACf,WAAO;AAAA,EACT;AAEA,WAAS,aACP,SACqC;AACrC,WAAO;AAAA,MACL,MAAM,OAAO,EAAE,KAAK,UAAU,aAAa,GAAqB;AAC9D,cAAM,WAAW;AACjB,YAAI,CAAC;AAAQ,iBAAO;AACpB,eAAO,OAAO;AAAA,UACZ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,WAAS,YACP,SACoC;AACpC,WAAO;AAAA,MACL,MAAM,OAAO,EAAE,KAAK,UAAU,aAAa,GAAoB;AAC7D,cAAM,WAAW;AACjB,YAAI,CAAC;AAAQ,iBAAO;AACpB,eAAO,OAAO;AAAA,UACZ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,WAAS,YACP,SACoC;AACpC,WAAO;AAAA,MACL,MAAM,OAAO,EAAE,KAAK,UAAU,aAAa,GAAoB;AAC7D,cAAM,WAAW;AACjB,YAAI,CAAC;AAAQ,iBAAO;AACpB,eAAO,OAAO;AAAA,UACZ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,WAAS,YACP,SACuC;AACvC,WAAO;AAAA,MACL,MAAM,OAAO,EAAE,KAAK,UAAU,aAAa,GAAuB;AAChE,cAAM,WAAW;AACjB,YAAI,CAAC;AAAQ,iBAAO;AACpB,eAAO,OAAO;AAAA,UACZ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QACE,OAAO,SAAS,aACZ,YAAY;AACV,YAAM,WAAW;AACjB,UAAI,CAAC;AACH,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AACF,aAAO;AAAA,IACT,IACA;AAAA,EACR;AACF","sourcesContent":["import type { Adapter } from 'flags';\nimport type {\n Client,\n EvaluationContext,\n FlagEvaluationOptions,\n JsonValue,\n} from '@openfeature/server-sdk';\n\ntype AdapterResponse<ClientType> = {\n booleanValue: (\n options?: FlagEvaluationOptions,\n ) => Adapter<boolean, EvaluationContext>;\n stringValue: (\n options?: FlagEvaluationOptions,\n ) => Adapter<string, EvaluationContext>;\n numberValue: (\n options?: FlagEvaluationOptions,\n ) => Adapter<number, EvaluationContext>;\n objectValue: <ValueType>(\n options?: FlagEvaluationOptions,\n ) => Adapter<ValueType, EvaluationContext>;\n client: ClientType;\n};\n\n/**\n * Creates a sync OpenFeature adapter.\n * @param init Client\n * @example\n * ```\n * const openFeatureAdapter = createOpenFeatureAdapter(async () => {\n * await OpenFeature.setProviderAndWait(\n * new LaunchDarklyProvider(\"sdk-3eb98afb-a6ff-4d8c-a648-ddd35cad4140\")\n * );\n * return OpenFeature.getClient();\n * });\n * ```\n */\nexport function createOpenFeatureAdapter(init: Client): AdapterResponse<Client>;\n\n/**\n * Creates an async OpenFeature adapter.\n *\n * @param init () => Promise<Client>\n * @example\n * ```\n * OpenFeature.setProvider(someProvider);\n * const openFeatureAdapter = createOpenFeatureAdapter(OpenFeature.getClient());\n * ```\n */\nexport function createOpenFeatureAdapter(\n init: () => Promise<Client>,\n): AdapterResponse<() => Promise<Client>>;\nexport function createOpenFeatureAdapter(\n init: Client | (() => Promise<Client>),\n): AdapterResponse<Client | (() => Promise<Client>)> {\n let client: Client | null = typeof init === 'function' ? null : init;\n\n let clientPromise: Promise<Client>;\n async function initialize() {\n if (client) return client;\n if (clientPromise) return clientPromise;\n clientPromise = typeof init === 'function' ? init() : Promise.resolve(init);\n client = await clientPromise;\n return clientPromise;\n }\n\n function booleanValue(\n options?: FlagEvaluationOptions,\n ): Adapter<boolean, EvaluationContext> {\n return {\n async decide({ key, entities, defaultValue }): Promise<boolean> {\n await initialize();\n if (!client) return defaultValue as boolean;\n return client.getBooleanValue(\n key,\n defaultValue as boolean,\n entities,\n options,\n );\n },\n };\n }\n\n function stringValue(\n options?: FlagEvaluationOptions,\n ): Adapter<string, EvaluationContext> {\n return {\n async decide({ key, entities, defaultValue }): Promise<string> {\n await initialize();\n if (!client) return defaultValue as string;\n return client.getStringValue(\n key,\n defaultValue as string,\n entities,\n options,\n );\n },\n };\n }\n\n function numberValue(\n options?: FlagEvaluationOptions,\n ): Adapter<number, EvaluationContext> {\n return {\n async decide({ key, entities, defaultValue }): Promise<number> {\n await initialize();\n if (!client) return defaultValue as number;\n return client.getNumberValue(\n key,\n defaultValue as number,\n entities,\n options,\n );\n },\n };\n }\n\n function objectValue<ValueType>(\n options?: FlagEvaluationOptions,\n ): Adapter<ValueType, EvaluationContext> {\n return {\n async decide({ key, entities, defaultValue }): Promise<ValueType> {\n await initialize();\n if (!client) return defaultValue as ValueType;\n return client.getObjectValue(\n key,\n defaultValue as JsonValue,\n entities,\n options,\n ) as ValueType;\n },\n };\n }\n\n return {\n booleanValue,\n stringValue,\n numberValue,\n objectValue,\n client:\n typeof init === 'function'\n ? async () => {\n await initialize();\n if (!client)\n throw new Error(\n '@flags-sdk/openfeature: OpenFeature client failed to initialize',\n );\n return client;\n }\n : init,\n };\n}\n"]}