Skip to content

Commit 63edc40

Browse files
authored
Adds Flagsmith adapter (#103)
adds tests fix README fix documentation remove asdf file implements getFeature pattern update README Update packages/adapter-flagsmith/README.md Co-authored-by: Aaron Morris <aaron@vercel.com> address changes implements provider adds different methods for different types of flags fix tests changeset
1 parent 12d153d commit 63edc40

File tree

12 files changed

+693
-0
lines changed

12 files changed

+693
-0
lines changed

.changeset/dull-kings-pump.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
'@flags-sdk/flagsmith': major
3+
'flags': minor
4+
---
5+
6+
Adds Flagsmith Adapter
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
module.exports = {
2+
root: true,
3+
extends: [require.resolve('@pyra/eslint-config/components')],
4+
};
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
.vercel
2+
.env*.local
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
# Flags SDK - Flagsmith Provider
2+
3+
A provider adapter for the Flags SDK that integrates with [Flagsmith](https://flagsmith.com/), allowing you to use Flagsmith's feature flags and remote configuration in your application.
4+
5+
## Installation
6+
7+
```bash
8+
npm install @flags-sdk/flagsmith
9+
```
10+
11+
## Usage
12+
13+
An Environment ID must be provided using the `FLAGSMITH_ENVIRONMENT_ID` environment variable.
14+
15+
```typescript
16+
import { flagsmithAdapter } from '@flags-sdk/flagsmith';
17+
import { flag } from 'flags';
18+
19+
// Boolean flags - returns flagState.enabled
20+
const myBooleanFlag = flag({
21+
key: 'my-boolean-feature',
22+
adapter: flagsmithAdapter.booleanValue(),
23+
});
24+
25+
// String flags - returns flagState.value when enabled
26+
const myStringFlag = flag({
27+
key: 'my-string-feature',
28+
adapter: flagsmithAdapter.stringValue(),
29+
});
30+
31+
// Number flags - returns flagState.value when enabled
32+
const myNumberFlag = flag({
33+
key: 'my-number-feature',
34+
adapter: flagsmithAdapter.numberValue(),
35+
});
36+
```
37+
38+
## API
39+
40+
The adapter provides three methods for different flag types:
41+
42+
### `booleanValue()`
43+
44+
Returns an adapter for boolean flags. Uses `flagState.enabled` directly.
45+
46+
```typescript
47+
const booleanAdapter = flagsmithAdapter.booleanValue();
48+
const value = await booleanAdapter.decide({
49+
key: 'my-flag',
50+
defaultValue: false,
51+
entities: { identifier: 'user-123' },
52+
});
53+
```
54+
55+
### `stringValue()`
56+
57+
Returns an adapter for string flags. Returns `flagState.value` when the flag is enabled, otherwise returns the default value.
58+
59+
```typescript
60+
const stringAdapter = flagsmithAdapter.stringValue();
61+
const value = await stringAdapter.decide({
62+
key: 'my-flag',
63+
defaultValue: 'default',
64+
entities: { identifier: 'user-123' },
65+
});
66+
```
67+
68+
### `numberValue()`
69+
70+
Returns an adapter for number flags. Returns `flagState.value` when the flag is enabled, otherwise returns the default value.
71+
72+
```typescript
73+
const numberAdapter = flagsmithAdapter.numberValue();
74+
const value = await numberAdapter.decide({
75+
key: 'my-flag',
76+
defaultValue: 0,
77+
entities: { identifier: 'user-123' },
78+
});
79+
```
80+
81+
## Identity Handling
82+
83+
The adapter supports Flagsmith identity management. Pass an `IIdentity` object to the `entities` parameter:
84+
85+
```typescript
86+
const identity: IIdentity = {
87+
identifier: 'user-123',
88+
traits: {
89+
email: 'user@example.com',
90+
plan: 'premium',
91+
},
92+
};
93+
94+
const value = await adapter.decide({
95+
key: 'my-flag',
96+
defaultValue: false,
97+
entities: identity,
98+
});
99+
```
100+
101+
## Configuration
102+
103+
The adapter automatically initializes Flagsmith with the following configuration:
104+
105+
- `environmentId`: From `FLAGSMITH_ENVIRONMENT_ID` environment variable
106+
107+
## Features
108+
109+
- **Type-safe flag definitions**: Each method returns a properly typed adapter
110+
- **Automatic initialization**: Flagsmith client can be lazily initialized
111+
- **Identity support**: Full support for Flagsmith identity and traits
112+
- **Default value handling**: Proper fallback to default values when flags are disabled or not found
113+
- **Boolean flag optimization**: Boolean flags use the `enabled` state directly for better performance
114+
115+
## Environment Variables
116+
117+
- `FLAGSMITH_ENVIRONMENT_ID` (required): Your Flagsmith environment ID
118+
119+
## License
120+
121+
MIT
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
{
2+
"name": "@flags-sdk/flagsmith",
3+
"version": "0.1.0",
4+
"description": "Flagsmith provider for the Flags SDK",
5+
"keywords": [
6+
"flags-sdk",
7+
"flagsmith-nodejs",
8+
"vercel",
9+
"feature flags",
10+
"flags"
11+
],
12+
"homepage": "https://flags-sdk.dev",
13+
"bugs": {
14+
"url": "https://github.com/vercel/flags/issues"
15+
},
16+
"repository": {
17+
"type": "git",
18+
"url": "git+https://github.com/vercel/flags.git"
19+
},
20+
"license": "MIT",
21+
"author": "",
22+
"sideEffects": false,
23+
"type": "module",
24+
"exports": {
25+
".": {
26+
"import": "./dist/index.js",
27+
"require": "./dist/index.cjs"
28+
}
29+
},
30+
"main": "./dist/index.js",
31+
"typesVersions": {
32+
"*": {
33+
".": [
34+
"dist/*.d.ts",
35+
"dist/*.d.cts"
36+
]
37+
}
38+
},
39+
"files": [
40+
"dist",
41+
"CHANGELOG.md"
42+
],
43+
"scripts": {
44+
"build": "rimraf dist && tsup",
45+
"dev": "tsup --watch --clean=false",
46+
"eslint": "eslint-runner",
47+
"eslint:fix": "eslint-runner --fix",
48+
"test": "vitest --run",
49+
"test:watch": "vitest",
50+
"type-check": "tsc --noEmit"
51+
},
52+
"dependencies": {
53+
"flagsmith": "^9.0.5"
54+
},
55+
"devDependencies": {
56+
"@types/node": "20.11.17",
57+
"eslint-config-custom": "workspace:*",
58+
"flags": "workspace:*",
59+
"msw": "2.6.4",
60+
"rimraf": "6.0.1",
61+
"tsconfig": "workspace:*",
62+
"tsup": "8.0.1",
63+
"typescript": "5.6.3",
64+
"vite": "5.1.1",
65+
"vitest": "1.4.0"
66+
},
67+
"publishConfig": {
68+
"access": "public"
69+
}
70+
}

0 commit comments

Comments
 (0)