Files
Dominik Ferber 5fa72581f7 add @flags-sdk/flagsmith (#167)
* Revert "Revert "Adds Flagsmith adapter (#103)""

This reverts commit bf85f9729a.

* prepare flagsmith adapter for release

* adjust changeset

* update lockfile

* shrink readme

* provider @flags-sdk/flagsmith with correct options for Flag Explorer (#182)

* Revert "Revert "Adds Flagsmith adapter (#103)""

This reverts commit bf85f9729a.

* prepare flagsmith adapter for release

* adjust changeset

* update lockfile

* shrink readme

* feat: get-mv-options-to-build-possible-values

---------

Co-authored-by: Dominik Ferber <dominik.ferber@gmail.com>

* update lockfile

* Flagsmith (#186)

* Revert "Revert "Adds Flagsmith adapter (#103)""

This reverts commit bf85f9729a.

* prepare flagsmith adapter for release

* adjust changeset

* update lockfile

* shrink readme

* feat: get-mv-options-to-build-possible-values

* feat: reworked-decide-signature-and-readme

* feat: rebase

* adjust changeset

* update lockfile

* feat: reworked-decide-signature-and-readme

* feat: updated-tests

* feat: fix-pnpm-lok

---------

Co-authored-by: Dominik Ferber <dominik.ferber@gmail.com>

* Flagsmith (#190)

* Revert "Revert "Adds Flagsmith adapter (#103)""

This reverts commit bf85f9729a.

* prepare flagsmith adapter for release

* adjust changeset

* update lockfile

* shrink readme

* feat: get-mv-options-to-build-possible-values

* feat: reworked-decide-signature-and-readme

* feat: rebase

* adjust changeset

* update lockfile

* feat: reworked-decide-signature-and-readme

* feat: updated-tests

* feat: fix-pnpm-lok

* feat: added-documentation-for-identify

* feat: added-full-example

---------

Co-authored-by: Dominik Ferber <dominik.ferber@gmail.com>

* rewrite changeset

* Feat/flagsmith coercion method (#194)

* Revert "Revert "Adds Flagsmith adapter (#103)""

This reverts commit bf85f9729a.

* prepare flagsmith adapter for release

* adjust changeset

* update lockfile

* shrink readme

* feat: get-mv-options-to-build-possible-values

* feat: reworked-decide-signature-and-readme

* feat: rebase

* adjust changeset

* update lockfile

* feat: reworked-decide-signature-and-readme

* feat: updated-tests

* feat: fix-pnpm-lok

* feat: added-documentation-for-identify

* feat: added-full-example

* feat: added-type-free-coercion-method

* feat: removed-per-type-functions-in-favor-of-get-value

---------

Co-authored-by: Dominik Ferber <dominik.ferber@gmail.com>

* rm next-13

* esm

---------

Co-authored-by: Zaimwa9 <wadii.zaim@gmail.com>
2025-10-30 11:19:06 +02:00

3.5 KiB

Flags SDK - Flagsmith Provider

The Flagsmith provider for the Flags SDK contains support for Flagsmith's Feature Flags and Remote Configuration.

Setup

The Flagsmith provider is available in the @flags-sdk/flagsmith module. You can install it with

npm i @flags-sdk/flagsmith

Set the required environment variable:

export FLAGSMITH_ENVIRONMENT_ID="your-environment-id"

Usage

The Flagsmith adapter provides a getValue() method with optional type coercion:

import { flag } from "flags/next";
import { flagsmithAdapter } from "@flags-sdk/flagsmith";

// No coercion - returns the raw value from Flagsmith
export const rawFlag = flag({
  key: "raw-value",
  defaultValue: "default",
  adapter: flagsmithAdapter.getValue(),
});

// Coerce to string type
export const buttonColor = flag<string>({
  key: "button-color",
  defaultValue: "blue",
  adapter: flagsmithAdapter.getValue({ coerce: "string" }),
});

// Coerce to number type
export const maxItems = flag<number>({
  key: "max-items",
  defaultValue: 10,
  adapter: flagsmithAdapter.getValue({ coerce: "number" }),
});

// Coerce to boolean type
export const showBanner = flag<boolean>({
  key: "show-banner",
  defaultValue: false,
  adapter: flagsmithAdapter.getValue({ coerce: "boolean" }),
});

Type Coercion Behavior

  • Without coerce: Returns the raw value from Flagsmith (empty/null/undefined values return default)
  • coerce: "string": Converts any value to string (returns default for null/undefined/NaN)
  • coerce: "number": Converts strings to numbers (returns default if result is NaN or invalid)
  • coerce: "boolean":
    • Converts "true"/"false" strings (case-insensitive) to boolean
    • Converts 0 to false and 1 to true
    • Falls back to the flag's enabled state for other values
    • Returns default when flag is disabled

Custom Adapter

Create a custom adapter by using the createFlagsmithAdapter function:

import { createFlagsmithAdapter, EntitiesType } from "@flags-sdk/flagsmith";

const identify: Identify<EntitiesType> = dedupe(async () => {
  return {
    targetingKey: "user",
    traits: {
      id: "e23cc9a8-0287-40aa-8500-6802df91e56a",
      name: "John Doe",
      email: "johndoe@flagsmith.com",
    },
  };
});

const adapter = createFlagsmithAdapter({
  environmentID: "your-environment-id",
  // Additional Flagsmith config options
});

export const showBanner = flag<boolean, EntitiesType>({
  key: "show-banner",
  identify,
  adapter: adapter.getValue({ coerce: "boolean" }),
});

Flags Discovery Endpoint

To enable the Flags Explorer, create a discovery endpoint at app/.well-known/vercel/flags/route.ts:

import { createFlagsDiscoveryEndpoint } from "flags/next";
import { getProviderData } from "@flags-sdk/flagsmith";

export const GET = createFlagsDiscoveryEndpoint(async () => {
  return getProviderData({
    environmentKey: process.env.FLAGSMITH_ENVIRONMENT_ID,
    projectId: process.env.FLAGSMITH_PROJECT_ID,
  });
});

This endpoint fetches flag definitions directly from Flagsmith's API and returns them to the Flags Explorer.

Environment Variables

  • FLAGSMITH_ENVIRONMENT_ID (required): Your Flagsmith environment ID
  • FLAGSMITH_PROJECT_ID (optional): Required for the Flags Discovery Endpoint

Documentation

Please check out the Flagsmith provider documentation for more information.

License

MIT