{"id":20182953,"url":"https://github.com/theogravity/feature-manager-wrapper","last_synced_at":"2026-06-08T11:03:00.375Z","repository":{"id":216899582,"uuid":"742176577","full_name":"theogravity/feature-manager-wrapper","owner":"theogravity","description":"A wrapper / abstraction around configuration / feature manager libraries such as LaunchDarkly.","archived":false,"fork":false,"pushed_at":"2024-01-24T02:15:59.000Z","size":464,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-11-30T19:13:18.337Z","etag":null,"topics":["abstraction","configuration","configuration-man","environment","environment-variables","feature-flags","feature-management","features","launchdarkly","settings","typescript","wrapper"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/theogravity.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-01-11T23:00:26.000Z","updated_at":"2024-01-16T17:06:22.000Z","dependencies_parsed_at":"2024-01-17T22:23:29.193Z","dependency_job_id":"5592d5be-1bfb-4db5-bf92-9c6ff409b6cc","html_url":"https://github.com/theogravity/feature-manager-wrapper","commit_stats":{"total_commits":34,"total_committers":2,"mean_commits":17.0,"dds":0.4117647058823529,"last_synced_commit":"507d46507d38c7faa795b2dda90de351c42e4126"},"previous_names":["theogravity/feature-management-wrapper","theogravity/feature-manager-wrapper"],"tags_count":0,"template":false,"template_full_name":"tomchen/example-typescript-package","purl":"pkg:github/theogravity/feature-manager-wrapper","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/theogravity%2Ffeature-manager-wrapper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/theogravity%2Ffeature-manager-wrapper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/theogravity%2Ffeature-manager-wrapper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/theogravity%2Ffeature-manager-wrapper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/theogravity","download_url":"https://codeload.github.com/theogravity/feature-manager-wrapper/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/theogravity%2Ffeature-manager-wrapper/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34059157,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-08T02:00:07.615Z","response_time":111,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["abstraction","configuration","configuration-man","environment","environment-variables","feature-flags","feature-management","features","launchdarkly","settings","typescript","wrapper"],"created_at":"2024-11-14T02:43:27.525Z","updated_at":"2026-06-08T11:03:00.354Z","avatar_url":"https://github.com/theogravity.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# feature-manager-wrapper\n\n[![NPM version](https://img.shields.io/npm/v/feature-manager-wrapper.svg?style=flat-square)](https://www.npmjs.com/package/feature-manager-wrapper) [![TypeScript](https://img.shields.io/badge/%3C%2F%3E-TypeScript-%230074c1.svg)](http://www.typescriptlang.org/)\n\nA wrapper / abstraction around configuration / feature manager libraries.\n\nUse cases:\n\n- Shift to using [`LaunchDarkly`](https://launchdarkly.com/) from `process.env` (or vice versa)\n  * Also support for other feature managers such as [`Configurity`](https://github.com/theogravity/configurity)\n- Have a common interface for interacting with feature managers so if you need to swap out the underlying implementation, minimal changes would be required(*).\n  * (*) *Feature managers use `context` data differently (or not at all) for custom features and may require adjustments.*\n\n```typescript\n// See examples in documentation for working examples\n// This example is for illustrative purposes only\nimport { AsyncFeatureManager, LaunchDarklyServerDriver } from 'feature-manager-wrapper';\n\n// By default, use process.env to maintain our feature flags\nlet driver = new EnvironmentDriver();\n\nif (process.env.USE_LAUNCH_DARKLY) {\n  // Use LaunchDarkly to maintain our feature flags\n  driver = new LaunchDarklyServerDriver(...);\n}\n\n// Note: EnvironmentDriver supports both sync and async operations, but LaunchDarklyServerDriver only supports async operations, so you'll want to only use non-async methods.\nconst featureManager = new AsyncFeatureManager(driver);\n\n// Get a feature flag\nconst myFeatureValue = await featureManager.getValue('featureFlag', {\n  // optional context to pass to LaunchDarkly\n  context: {},\n  // optional default value to return if the feature flag is not found\n  defaultValue: true,\n})\n```\n\n# Table of contents\n\n- [Installation](#installation)\n- [Getting started](#getting-started)\n  - [(For Typescript users) Map out your feature flags](#for-typescript-users-map-out-your-feature-flags)\n  - [Select the feature manager service driver to use](#select-the-feature-manager-service-driver-to-use)\n  - [Create a feature manager](#create-a-feature-manager)\n    - [Select the feature manager driver to use](#select-the-feature-manager-driver-to-use)\n    - [Create an instance of the feature manager](#create-an-instance-of-the-feature-manager)\n      - [Example: LaunchDarkly (server-side node SDK)](#example-launchdarkly-server-side-node-sdk)\n      - [Example: LaunchDarkly (client-side JS SDK)](#example-launchdarkly-client-side-js-sdk)\n      - [Example: LaunchDarkly (client-side Electron JS SDK)](#example-launchdarkly-client-side-electron-js-sdk)\n      - [Example: process.env](#example-processenv)\n      - [Example: Key / Value](#example-key--value)\n      - [Example: Configurity](#example-configurity)\n    - [Feature Managers with async initialization](#feature-managers-with-async-initialization)\n- [API](#api)\n  - [Interface: 'CommonValueParams'](#interface-commonvalueparams)\n  - [Class: `AsyncFeatureManager`](#class-asyncfeaturemanager)\n    - [`constructor()`](#constructor)\n    - [`assertGetValue()`](#assertgetvalue)\n    - [`getValue()`](#getvalue)\n    - [`assertGetRawValue()`](#assertgetrawvalue)\n    - [`getRawValue()`](#getrawvalue)\n    - [`getAllValues()`](#getallvalues)\n    - [`getAllRawValues()`](#getallrawvalues)\n    - [`close()`](#close)\n  - [Class: `SyncFeatureManager`](#class-syncfeaturemanager)\n    - [`constructor()`](#constructor)\n    - [`assertGetValueSync()`](#assertgetvaluesync)\n    - [`getValueSync()`](#getvaluesync)\n    - [`assertGetRawValueSync()`](#assertgetrawvaluesync)\n    - [`getRawValueSync()`](#getrawvaluesync)\n    - [`getAllValuesSync()`](#getallvaluessync)\n    - [`getAllRawValuesSync()`](#getallrawvaluessync)\n    - [`closeSync()`](#closesync)\n\n# Installation\n\n```bash\n$ npm install feature-manager-wrapper\n```\n\n# Getting started\n\n## (For Typescript users) Map out your feature flags\n\nCreate an interface that maps out the available feature flags. They will\nbe used for IDE autocompletion when working with the feature manager.\n\n```typescript\ninterface FeatureFlags {\n  featureFlag: boolean;\n  anotherFeatureFlag: string;\n  featureFlaggedObject: {\n    featureFlaggedProperty: number;\n  };\n}\n```\n\n## Select the feature manager service driver to use\n\n`feature-management-wrapper` currently supports the following feature managers:\n\n- `LaunchDarkly` (server): `LaunchDarklyServerDriver`\n- `LaunchDarkly` (client): `LaunchDarklyClientDriver`\n- `LaunchDarkly` (Electron client): `LaunchDarklyElectronClientDriver`\n- `process.env`: `EnvironmentDriver`\n- `configurity`: `ConfigurityDriver`\n- key / value (where you have a KV mapping from an external source): `SimpleKeyValueDriver`\n\n## Create a feature manager\n\n### Select the feature manager driver to use\n\nDetermine if the feature manager you use is async or sync-based:\n\n- If the APIs you call require `await` to get your feature flags, then it would be async-based.\n- If not, then sync-based.\n\nDrivers and their (a)sync type:\n\n- `LaunchDarklyServerDriver`: async\n- `LaunchDarklyClientDriver`: sync (+ async supported)\n- `LaunchDarklyElectronClientDriver`: sync (+async supported)\n- `EnvironmentDriver`: sync (+ async supported)\n- `ConfigurityDriver`: sync (+ async supported)\n- `SimpleKeyValueDriver`: sync (+ async supported)\n\n### Create an instance of the feature manager\n\nA feature manager uses one of the above drivers to interact with the specific feature manager service.\n\n- async (+ sync) drivers: `AsyncFeatureManager`\n  * Only exposes async operations to fetch feature flags from remote endpoints\n  * Can use both sync and async drivers (since sync drivers wrap sync operations in a promise for async operations), but operations are limited to async\n- sync drivers: `SyncFeatureManager`\n  * Exposes both sync and async operations to fetch feature flags locally\n\n*You can switch from `SyncFeatureManager` to `AsyncFeatureManager` if you need to use an async driver, but\nnot the other way around as conversion to async methods would be necessary.*\n\n#### Example: LaunchDarkly (server-side node SDK)\n\nThe [LaunchDarkly Server SDK](https://docs.launchdarkly.com/sdk/server-side/node-js) is async-based since we call remote endpoints to fetch feature flags.\n\nBecause it's async-based, we use the `AsyncFeatureManager` to create our own feature manager.\n\n```typescript\nimport { AsyncFeatureManager, LaunchDarklyServerDriver } from 'feature-manager-wrapper';\nimport { LDClient, LDContext } from \"@launchdarkly/node-server-sdk\";\n\ninterface FeatureFlags {\n  featureFlag: boolean;\n  anotherFeatureFlag: string;\n  featureFlaggedObject: {\n    featureFlaggedProperty: number;\n  };\n}\n\n// Create your LaunchDarkly client\nconst launchDarklyClient = LDClient.initialize('sdk-key')\n\nconst driver = new LaunchDarklyServerDriver\u003cFeatureFlags, LDContext\u003e(launchDarklyClient, defaultContext)\n\nconst featureManager = new AsyncFeatureManager\u003cFeatureFlags, LDContext\u003e(driver);\n\n// Get a feature flag\nconst myFeatureValue = await featureManager.getValue('featureFlag')\n\n// Get a feature flag with context\nconst myFeatureValueFromContext = await featureManager.getValue('featureFlag', {\n  context: {\n    'kind': 'user',\n    'key': 'user-key-123abc',\n    'name': 'Sandy'\n  },\n  // optional default value\n  defaultValue: true,\n})\n\n// Close the connection to the LaunchDarkly service\nawait featureManager.close()\n```\n\n#### Example: LaunchDarkly (client-side JS SDK)\n\nThe [client javascript SDK for LaunchDarkly](https://docs.launchdarkly.com/sdk/client-side/javascript) is sync-based since the flags are all fetched on client initialization.\n\nIt does not have the ability to use context data for fetching flags.\n\n```typescript\n// Can also use AsyncFeatureManager\nimport { SyncFeatureManager, LaunchDarklyClientDriver } from 'feature-manager-wrapper';\nimport * as LDClient from 'launchdarkly-js-client-sdk';\n\ninterface FeatureFlags {\n  featureFlag: boolean;\n  anotherFeatureFlag: string;\n  featureFlaggedObject: {\n    featureFlaggedProperty: number;\n  };\n}\n\nconst context = {\n  kind: 'user',\n  key: 'context-key-123abc'\n};\n\n// Create your LaunchDarkly client\nconst launchDarklyClient = LDClient.initialize('client-side-id-123abc', context);\n\nconst driver = new LaunchDarklyClientDriver\u003cFeatureFlags\u003e(launchDarklyClient)\n\nconst featureManager = new SyncFeatureManager\u003cFeatureFlags\u003e(driver);\n\n// Get a feature flag\nconst myFeatureValue = featureManager.getValueSync('featureFlag')\n\n// Close the connection to the LaunchDarkly service\nawait featureManager.close()\n```\n\n#### Example: LaunchDarkly (client-side Electron JS SDK)\n\nThe [electron client javascript SDK for LaunchDarkly](https://docs.launchdarkly.com/sdk/client-side/electron) is sync-based since the flags are all fetched on client initialization.\n\nIt does not have the ability to use context data for fetching flags.\n\n```typescript\n// Can also use AsyncFeatureManager\nimport { SyncFeatureManager, LaunchDarklyClientDriver } from 'feature-manager-wrapper';\nimport * as LDElectron from 'launchdarkly-electron-client-sdk';\n\ninterface FeatureFlags {\n  featureFlag: boolean;\n  anotherFeatureFlag: string;\n  featureFlaggedObject: {\n    featureFlaggedProperty: number;\n  };\n}\n\nconst context = {\n  kind: 'user',\n  key: 'context-key-123abc'\n};\n\n// Create your LaunchDarkly client\nconst launchDarklyClient = LDElectron.initializeInMain('client-side-id-123abc', context);\n\nconst driver = new LaunchDarklyElectronClientDriver\u003cFeatureFlags\u003e(launchDarklyClient)\n\nconst featureManager = new SyncFeatureManager\u003cFeatureFlags\u003e(driver);\n\n// Get a feature flag\nconst myFeatureValue = featureManager.getValueSync('featureFlag')\n\n// Close the connection to the LaunchDarkly service\nawait featureManager.close()\n```\n\n#### Example: process.env\n\n`process.env` is sync-based since we access the environment variables synchronously.\n\nBecause it's sync-based, we use the `SyncFeatureManager` to create our own feature manager.\n\nIt does not have the ability to use context data for fetching flags.\n\n```typescript\n// Can also use AsyncFeatureManager\nimport { SyncFeatureManager, EnvironmentDriver } from 'feature-manager-wrapper';\n\n// maps to process.env variables\ninterface FeatureFlags {\n  FEATURE_FLAG: boolean;\n  ANOTHER_FEATURE_FLAG: string;\n  FEATURE_FLAGGED_OBJECT: {\n    featureFlaggedProperty: number;\n  };\n}\n\nconst driver = new EnvironmentDriver\u003cFeatureFlags\u003e()\n\nconst featureManager = new SyncFeatureManager\u003cFeatureFlags\u003e(driver);\n\n// Get a feature flag\nconst myFeatureValue = await featureManager.getValue('FEATURE_FLAG')\n\n// sync version\nconst myFeatureValueSync = featureManager.getValueSync('FEATURE_FLAG', {\n  // optional default value\n  defaultValue: true\n})\n```\n\n#### Example: Key / Value\n\nKey / Value is sync-based since we access the key / value mapping synchronously.\n\nBecause it's sync-based, we use the `SyncFeatureManager` to create our own feature manager.\n\n- It does not have the ability to use context data for fetching flags.\n- It does have the ability to set flags from the driver via `setValueSync` and `setValuesSync` methods.\n\n```typescript\n// Can also use AsyncFeatureManager\nimport { SyncFeatureManager, SimpleKeyValueDriver } from 'feature-manager-wrapper';\n\ninterface FeatureFlags {\n  featureFlag: boolean;\n  anotherFeatureFlag: string;\n  featureFlaggedObject: {\n    featureFlaggedProperty: number;\n  };\n}\n\nconst featureFlags: FeatureFlags = {\n  featureFlag: true,\n  anotherFeatureFlag: 'hello',\n  featureFlaggedObject: {\n    featureFlaggedProperty: 123\n  }\n}\n\nconst driver = new SimpleKeyValueDriver\u003cFeatureFlags\u003e(featureFlags)\n\nconst featureManager = new SyncFeatureManager\u003cFeatureFlags\u003e(driver);\n\n// Get a feature flag\nconst myFeatureValue = await featureManager.getValue('featureFlag')\nconst myFeatureValueSync = featureManager.getValueSync('featureFlag')\n\n// Specific to this driver: set a feature flag(s)\n// const driver = manager.getDriver() as SimpleKeyValueDriver\u003cFlags\u003e\ndriver.setValueSync('featureFlag', false)\n\ndriver.setValuesSync({\n  featureFlag: false,\n  anotherFeatureFlag: 'goodbye',\n  featureFlaggedObject: {\n    featureFlaggedProperty: 456\n  }\n})\n\n```\n\n#### Example: Configurity\n\n[`Configurity`](https://github.com/theogravity/configurity) is sync-based since we access the config synchronously.\n\nBecause it's sync-based, we use the `SyncFeatureManager` to create our own feature manager.\n\n```typescript\n// Can also use AsyncFeatureManager\nimport { SyncFeatureManager, ConfigurityDriver } from 'feature-manager-wrapper';\nimport { loadConfigParser } from 'configurity'\n\ninterface FeatureFlags {\n  featureFlag: boolean;\n  anotherFeatureFlag: string;\n  featureFlaggedObject: {\n    featureFlaggedProperty: number;\n  };\n}\n\n// Your custom context definition to access custom feature flags\ninterface ConfigurityContext {\n  environment?: string\n}\n\n// Load the config file\nconst YML_PATH = path.join(__dirname, '..', '__fixtures__', 'configurity.yml')\n\n// Get the configurity config parser\nconst configParser = loadConfigParser\u003cFeatureFlags\u003e(YML_PATH)\n\nconst driver = new ConfigurityDriver\u003cFeatureFlags, ConfigurityContext\u003e(configParser)\n\nconst featureManager = new SyncFeatureManager\u003cFeatureFlags, ConfigurityContext\u003e();\n\n// Get a feature flag\nconst myFeatureValue = await featureManager.getValue('featureFlag')\nconst myFeatureValueSync = featureManager.getValueSync('featureFlag', {\n  // optional context (see Configurity documentation)\n  context: {\n    environment: 'production'\n  },\n  // optional default value\n  defaultValue: true\n})\n```\n\n### Feature Managers with async initialization\n\nYou may want to extend a feature manager to support extended functionality, and sometimes you need\nto initialize the feature manager asynchronously.\n\nYou can do this using a `DummyDriver`:\n\n```typescript\nimport { SyncFeatureManager, DummyDriver } from 'feature-manager-wrapper';\n\nclass MyFeatureManager extends SyncFeatureManager {\n  constructor() {\n    // We have to pass a driver to the constructor, so we pass a dummy driver\n    super(new DummyDriver())\n  }\n  \n  async init() {\n    // Do some async init stuff\n    \n    // Assign the actual driver here\n    this.setDriver(new MyActualDriver())\n  }\n}\n```\n\n\n# API\n\n## Interface: 'CommonValueParams'\n\nMost of the API methods in the feature manager has an optional `params` parameter that can be passed to the method.\n\n```typescript\n/**\n * Common optional parameters for retrieving a flag.\n */\ntype CommonValueParams\u003cFlags, K extends keyof Flags\u003e = {\n  /**\n   * The default value to use if the flag is not found.\n   */\n  defaultValue?: Flags[K]\n  /**\n   * The context to use when retrieving the flag.\n   */\n  context?: any\n}\n```\n\n## Class: `AsyncFeatureManager`\n\nUse this class to ensure that your feature API calls are only async-based. This is useful if you want to ensure that your codebase is consistent with async operations.\n\nIf you are switching to a driver that uses sync operations, you will need to update your feature manager to use the `SyncFeatureManager` class instead.\n\n```typescript\n/**\n * Feature manager that supports async and sync drivers.\n * Acts as a facade for the underlying driver, and only exposes async operations.\n */\nclass AsyncFeatureManager\u003c\nFlags extends Record\u003cstring, any\u003e,\nContext extends Record\u003cstring, any\u003e = Record\u003cstring, any\u003e\n```\n\nGeneric types:\n  - `Flags` (optional): the interface that maps out the available feature flags\n  - `Context` (optional): the interface that maps out the context data that can be passed when fetching feature flags. Must be supported by the underlying driver.\n\n### `constructor()`\n\n```typescript\n/**\n * @param driver The driver to use for interacting with the feature manager service.\n */\nconstructor(driver: AsyncFeatureManagerDriver\u003cFlags, Context\u003e)\n```\n\n### `assertGetValue()`\n\n```typescript\n/**\n * Asynchronously asserts and retrieves the value of a feature flag based on its key.\n *\n * - Throws an error if the value is null, undefined, or empty string.\n * - Attempts to convert the value based on its probable type (number, boolean, string, object).\n *\n * Examples:\n *\n *  - null =\u003e null\n *  - undefined =\u003e undefined\n *  - \"true\" =\u003e true\n *  - \"123\" =\u003e 123\n *  - \"{ \"foo\": \"bar\" }\" =\u003e { foo: \"bar\" }\n *\n * @param key The key of the feature flag.\n * @param params Optional parameters including default value and context.\n * @throws FeatureManagerAssertionError if the value is null, undefined, or empty string.\n * @returns A Promise resolving to the value of the flag.\n */\n  assertGetValue\u003cK extends string \u0026 keyof Flags\u003e(\n  key: K,\n  params?: CommonValueParams\u003cFlags, K\u003e\n): Promise\u003cFlags[K]\u003e\n```\n\n### `getValue()`\n\n```typescript\n  /**\n * Asynchronously retrieves the value of a feature flag based on its key.\n *\n * - Returns null if the value is null or undefined.\n * - Attempts to convert the value based on its probable type (number, boolean, string, object).\n *\n * Examples:\n *\n *  - null =\u003e null\n *  - undefined =\u003e undefined\n *  - \"true\" =\u003e true\n *  - \"123\" =\u003e 123\n *  - \"{ \"foo\": \"bar\" }\" =\u003e { foo: \"bar\" }\n *\n * @param key The key of the feature flag.\n * @param params Optional parameters including default value and context.\n * @returns A Promise resolving to the value of the flag, or null if not found.\n */\n  getValue\u003cK extends string \u0026 keyof Flags\u003e(\n  key: K,\n  params?: CommonValueParams\u003cFlags, K\u003e\n): Promise\u003cFlags[K]\u003e\n```\n\n### `assertGetRawValue()`\n\n```typescript\n/**\n * Asynchronously asserts and retrieves the raw value of a feature flag (no conversions applied) based on its key.\n * Throws an error if the value is null, undefined, or empty string.\n *\n * @param key The key of the feature flag.\n * @param params Optional parameters including default value and context.\n * @throws FeatureManagerAssertionError if the value is null, undefined, or empty string.\n * @returns A Promise resolving to the raw value of the flag.\n */\n  assertGetRawValue\u003cK extends string \u0026 keyof Flags\u003e(\n    key: K,\n    params?: CommonValueParams\u003cFlags, K\u003e\n  ): Promise\u003cFlags[K]\u003e\n```\n\n### `getRawValue()`\n\n```typescript\n  /**\n   * Asynchronously retrieves the raw value of a feature flag (no conversions applied) based on its key.\n   * \n   * @param key The key of the feature flag.\n   * @param params Optional parameters including default value and context.\n   * @returns A Promise resolving to the raw value of the flag, or null if not found.\n   */\n  getRawValue\u003cK extends string \u0026 keyof Flags\u003e(\n    key: K,\n    params?: CommonValueParams\u003cFlags, K\u003e\n  ): Promise\u003cFlags[K] | null\u003e\n```\n\n### `getAllValues()`\n\n```typescript\n  /**\n   * Asynchronously retrieves all feature flag values.\n   * - Attempts to convert the value based on its probable type (number, boolean, string, object).\n   *\n   * Examples:\n   *\n   *  - null =\u003e null\n   *  - undefined =\u003e undefined\n   *  - \"true\" =\u003e true\n   *  - \"123\" =\u003e 123\n   *  - \"{ \"foo\": \"bar\" }\" =\u003e { foo: \"bar\" }\n   *\n   * @param params Optional parameters including context.\n   * @returns A Promise resolving to an object with all flag values.\n   */\n  getAllValues(params?: { context?: Context }): Promise\u003cFlags\u003e\n```\n\n### `getAllRawValues()`\n\n```typescript\n  /**\n   * Asynchronously retrieves all feature flag raw values (no conversions applied).\n   *\n   * @param params Optional parameters including context.\n   * @returns A Promise resolving to an object with all flag raw values.\n   */\n  getAllRawValues(params?: { context?: Context }): Promise\u003cFlags\u003e\n```\n\n### `close()`\n\n```typescript\n  /**\n * Asynchronously closes the connection to the feature manager service.\n *\n * @returns A Promise that resolves when the connection is closed.\n */\n  close(): Promise\u003cvoid\u003e\n```\n\n## Class: `SyncFeatureManager`\n\nAlso includes the methods in `AsyncFeatureManager`.\n\n```typescript\n/**\n * Feature manager that only supports sync drivers. Exposes both sync and async operations since async operations are just sync operations wrapped in a promise.\n * Acts as a facade for the underlying driver.\n */\nclass SyncFeatureManager\u003c\n    Flags extends Record\u003cstring, any\u003e,\n    Context,\n  \u003e\n```\n\nGeneric types:\n  - `Flags` (optional): the interface that maps out the available feature flags\n  - `Context` (optional): the interface that maps out the context data that can be passed when fetching feature flags. Must be supported by the underlying driver.\n\n### `constructor()`\n\n```typescript\n/**\n * @param driver The driver to use for interacting with the feature manager service.\n */\nconstructor(driver: SyncFeatureManagerDriver\u003cFlags, Context\u003e)\n```\n\n### `assertGetValueSync()`\n\n```typescript\n  /**\n * Synchronously asserts and retrieves the value of a feature flag based on its key.\n *\n * - Throws an error if the value is null, undefined, or empty string.\n * - Attempts to convert the value based on its probable type (number, boolean, string, object).\n *\n * Examples:\n *\n *  - null =\u003e null\n *  - undefined =\u003e undefined\n *  - \"true\" =\u003e true\n *  - \"123\" =\u003e 123\n *  - \"{ \"foo\": \"bar\" }\" =\u003e { foo: \"bar\" }\n *\n * @param key The key of the feature flag.\n * @param params Optional parameters including default value and context.\n * @throws FeatureManagerAssertionError if the value is null, undefined, or empty string.\n * @returns The value of the flag.\n */\nassertGetValueSync\u003cK extends string \u0026 keyof Flags\u003e(\n  key: K,\n  params?: CommonValueParams\u003cFlags, K\u003e\n): Flags[K]\n```\n\n### `getValueSync()`\n\n```typescript\n/**\n * Synchronously retrieves the value of a feature flag based on its key.\n *\n * - Returns null if the value is null or undefined.\n * - Attempts to convert the value based on its probable type (number, boolean, string, object).\n *\n * Examples:\n *\n *  - null =\u003e null\n *  - undefined =\u003e undefined\n *  - \"true\" =\u003e true\n *  - \"123\" =\u003e 123\n *  - \"{ \"foo\": \"bar\" }\" =\u003e { foo: \"bar\" }\n *\n * @param key The key of the feature flag.\n * @param params Optional parameters including default value and context.\n * @returns The value of the flag, or null if not found.\n */\n  getValueSync\u003cK extends string \u0026 keyof Flags\u003e(\n    key: K,\n    params?: CommonValueParams\u003cFlags, K\u003e\n  ): Flags[K] | null\n```\n\n### `assertGetRawValueSync()`\n\n```typescript\n  /**\n * Synchronously asserts and retrieves the raw value of a feature flag (no conversions applied) based on its key.\n *\n * Throws an error if the value is null, undefined, or empty string.\n *\n * @param key The key of the feature flag.\n * @param params Optional parameters including default value and context.\n * @throws FeatureManagerAssertionError if the value is null, undefined, or empty string.\n * @returns The raw value of the flag.\n */\nassertGetRawValueSync\u003cK extends string \u0026 keyof Flags\u003e(\n  key: K,\n  params?: CommonValueParams\u003cFlags, K\u003e\n): Flags[K]\n```\n\n### `getRawValueSync()`\n\n```typescript\n/**\n * Synchronously retrieves the raw value of a feature flag (no conversions applied) based on its key.\n *\n * @param key The key of the feature flag.\n * @param params Optional parameters including default value and context.\n * @returns The raw value of the flag, or null if not found.\n */\n  getRawValueSync\u003cK extends string \u0026 keyof Flags\u003e(\n    key: K,\n    params?: CommonValueParams\u003cFlags, K\u003e\n  ): Flags[K] | null\n```\n\n### `getAllValuesSync()`\n\n```typescript\n/**\n * Synchronously retrieves all feature flag values.\n *\n * - Returns null if the value is null or undefined.\n * - Attempts to convert the value based on its probable type (number, boolean, string, object).\n *\n * Examples:\n *\n *  - null =\u003e null\n *  - undefined =\u003e undefined\n *  - \"true\" =\u003e true\n *  - \"123\" =\u003e 123\n *  - \"{ \"foo\": \"bar\" }\" =\u003e { foo: \"bar\" }\n *\n * @param params Optional parameters including context.\n * @returns An object with all flag values.\n */\n  getAllValuesSync(params?: { context?: Context }): Flags\n```\n\n### `getAllRawValuesSync()`\n\n```typescript\n/**\n * Synchronously retrieves all feature flag raw values (no conversions applied).\n *\n * @param params Optional parameters including context.\n * @returns An object with all flag raw values.\n */\n  getAllRawValuesSync(params?: { context?: Context }): Flags\n```\n\n### `closeSync()`\n\n```typescript\n  /**\n   * Closes the connection to the config manager.\n   * @returns A Promise that resolves when the connection is closed.\n   */\n  closeSync(): void\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftheogravity%2Ffeature-manager-wrapper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftheogravity%2Ffeature-manager-wrapper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftheogravity%2Ffeature-manager-wrapper/lists"}