Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
4d204a7
maybe semi working
rgrassian-split Jun 4, 2025
1b70957
maybe working
rgrassian-split Jun 4, 2025
d629912
minor change
rgrassian-split Jun 4, 2025
ad4763d
e2e tests
rgrassian-split Jun 4, 2025
a1c460b
better constructor and isReady method
rgrassian-split Jun 16, 2025
a328c01
Fix tests and lint
ZamoraEmmanuel Sep 15, 2025
f73e11e
Fix tests
ZamoraEmmanuel Sep 15, 2025
ceb45c5
fix provider unit tests
ZamoraEmmanuel Sep 15, 2025
9803578
[FME-10128] Use split factory to initialize provider
ZamoraEmmanuel Sep 16, 2025
8d486bf
Merge pull request #3 from splitio/fme-10123
ZamoraEmmanuel Sep 17, 2025
d1fa066
Merge pull request #5 from splitio/fme-10128
ZamoraEmmanuel Sep 17, 2025
9bc6446
[FME-9857] Add evaluation with details
ZamoraEmmanuel Sep 18, 2025
647beef
Remove log
ZamoraEmmanuel Sep 18, 2025
a225496
[FME-10127] Add track method and setContext with targetingKey
ZamoraEmmanuel Sep 23, 2025
8c69645
[FME-10129] E2E tests coverage
ZamoraEmmanuel Sep 25, 2025
1aba8d3
Merge pull request #6 from splitio/fme-9857
ZamoraEmmanuel Sep 29, 2025
6392509
Merge pull request #8 from splitio/fme-10127
ZamoraEmmanuel Sep 29, 2025
b88f2c8
Merge pull request #9 from splitio/fme-10129
ZamoraEmmanuel Sep 29, 2025
084cd66
[FME-9858] Events mapping
ZamoraEmmanuel Sep 29, 2025
80cc75e
Add client ready after timeout test
ZamoraEmmanuel Sep 30, 2025
9c63a95
Remove console log and clean files
ZamoraEmmanuel Sep 30, 2025
2e180ab
Merge pull request #10 from splitio/fme-9858
ZamoraEmmanuel Sep 30, 2025
988203b
Prepare release v1.0.0
ZamoraEmmanuel Oct 1, 2025
5d22b82
Update release date
ZamoraEmmanuel Oct 1, 2025
f116e26
Merge pull request #11 from splitio/prepare-release
ZamoraEmmanuel Oct 1, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
* @splitio/sdk
32 changes: 32 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
name: test
on:
pull_request:
branches:
- '*'

concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number }}
cancel-in-progress: true

jobs:
build:
name: Run tests
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v5

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 'lts/*'
cache: 'npm'

- name: npm ci
run: npm ci

- name: npm check
run: npm run check

- name: npm test
run: npm run test
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -105,5 +105,5 @@ dist

# Build output
es/
lib/
/lib/
types/
1 change: 1 addition & 0 deletions .nvmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
22
21 changes: 3 additions & 18 deletions CHANGES.txt
Original file line number Diff line number Diff line change
@@ -1,18 +1,3 @@
1.0.0
- First release. Up to date with spec 0.4.0, and @openfeature/nodejs-sdk v0.2.0
1.0.1
- Fixes issues with flag details and error codes in negative cases, adds unit tests
- Up to date with spec 0.4.0 and @openfeature/nodejs-sdk v0.3.2
1.0.2
- Changes name from Node-specific implementation to generic JSON
- Up to date with spec 0.4.0 and @openfeature/js-sdk 0.4.0
1.0.3
- Adds types definitions for TypeScript
- Up to date with spec 0.4.0 and @openfeature/js-sdk 0.4.0
1.0.4
- Fixes issue with TS build
- Up to date with spec 0.5.0 and @openfeature/js-sdk 0.5.0
1.1.0
- Uses renamed @openfeature/js-sdk to @openfeature/server-sdk
- Up to date with spec 0.8.0 and @openfeature/server-sdk 1.18.0
- Uses split sdk 11.4.0
1.0.0 (October 1, 2025)
- First release.
- Up to date with @openfeature/web-sdk v1.6.1, and @splitsoftware/splitio-browserjs 1.4.0
108 changes: 73 additions & 35 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,67 +4,97 @@
## Overview
This Provider is designed to allow the use of OpenFeature with Split, the platform for controlled rollouts, serving features to your users via the Split feature flag to manage your complete customer experience.

## Compatibility


## Getting started
Below is a simple example that describes the instantiation of the Split Provider. Please see the [OpenFeature Documentation](https://docs.openfeature.dev/docs/reference/concepts/evaluation-api) for details on how to use the OpenFeature SDK.

### Add the Split provider

```sh
npm install @splitsoftware/openfeature-js-split-provider
npm install @splitsoftware/openfeature-web-split-provider
```

### Confirm peer dependencies are installed
```sh
npm install @splitsoftware/splitio
npm install @openfeature/server-sdk
npm install @splitsoftware/splitio-browserjs
npm install @openfeature/web-sdk
```

### Register the Split provider with OpenFeature
### Register the Split provider with OpenFeature using splitFactory
```js
const OpenFeature = require('@openfeature/server-sdk').OpenFeature;
const SplitFactory = require('@splitsoftware/splitio').SplitFactory;
const OpenFeatureSplitProvider = require('@splitsoftware/openfeature-js-split-provider').OpenFeatureSplitProvider;

const authorizationKey = 'your auth key'
const splitClient = SplitFactory({core: {authorizationKey}}).client();
const provider = new OpenFeatureSplitProvider({splitClient});
openFeature.setProvider(provider);
import { OpenFeature } from '@openfeature/web-sdk';
import { SplitFactory } from '@splitsoftware/splitio-browserjs';
import { OpenFeatureSplitProvider } from '@splitsoftware/openfeature-web-split-provider';

const splitFactory = SplitFactory({
core: {
authorizationKey: 'your auth key'
}
});
const provider = new OpenFeatureSplitProvider(splitFactory);
OpenFeature.setProvider(provider);
```

## Use of OpenFeature with Split
After the initial setup you can use OpenFeature according to their [documentation](https://docs.openfeature.dev/docs/reference/concepts/evaluation-api/).

One important note is that the Split Provider **requires a targeting key** to be set. Often times this should be set when evaluating the value of a flag by [setting an EvaluationContext](https://docs.openfeature.dev/docs/reference/concepts/evaluation-context) which contains the targeting key. An example flag evaluation is
```js
const client = openFeature.getClient('CLIENT_NAME');

const context: EvaluationContext = {
targetingKey: 'TARGETING_KEY',
trafficType: 'account'
};
const boolValue = await client.getBooleanValue('boolFlag', false, context);
OpenFeature.setContext(context)
```
If the same targeting key is used repeatedly, the evaluation context may be set at the client level

## Evaluate with details
Use the get*Details(...) APIs to get the value and rich context (variant, reason, error code, metadata). This provider includes the Split treatment config as a raw JSON string under flagMetadata["config"]

```js
const context: EvaluationContext = {
targetingKey: 'TARGETING_KEY',
};
client.setEvaluationContext(context)
const booleanTreatment = client.getBooleanDetails('boolFlag', false);

const config = booleanTreatment.flagMetadata.config;
```
or at the OpenFeatureAPI level

## Evaluate with attributes
Evaluation attributes must be set in context before evaluation

```js
const context: EvaluationContext = {
targetingKey: 'TARGETING_KEY',
trafficType: 'account',
plan: 'premium',
couppon: 'WELCOME10'
};
OpenFeatureAPI.getInstance().setCtx(context)
````
If the context was set at the client or api level, it is not required to provide it during flag evaluation.
OpenFeature.setContext(context);
const booleanTreatment = client.getBooleanDetails('boolFlag', false);
```

## Tracking

To use track(eventName, context, details) you must provide:

- A non-blank `eventName`.
- A context with:
- `targetingKey` (non-blank).
- `trafficType` (string, e.g. "user" or "account", "user" by default).

Optional:

- details with:
- `value`: numeric event value (defaults to 0).
- `properties`: map of attributes (prefer primitives: string/number/boolean/null).

Example:
```js
const context = { targetingKey: 'user-123', trafficType: 'account' }
const details = { value: 19.99, properties: { plan: 'pro', coupon: 'WELCOME10' }}

client.setEvaluationContext(context)
client.track('checkout.completed', details)
```
## Submitting issues

The Split team monitors all issues submitted to this [issue tracker](https://github.com/splitio/split-openfeature-provider-nodejs/issues). We encourage you to use this issue tracker to submit any bug reports, feedback, and feature enhancements. We'll do our best to respond in a timely manner.
The Split team monitors all issues submitted to this [issue tracker](https://github.com/splitio/split-openfeature-provider-web-js/issues). We encourage you to use this issue tracker to submit any bug reports, feedback, and feature enhancements. We'll do our best to respond in a timely manner.

## Contributing
Please see [Contributors Guide](CONTRIBUTORS-GUIDE.md) to find all you need to submit a Pull Request (PR).
Expand All @@ -80,16 +110,24 @@ To learn more about Split, contact hello@split.io, or get started with feature f

Split has built and maintains SDKs for:

* Java [Github](https://github.com/splitio/java-client) [Docs](https://help.split.io/hc/en-us/articles/360020405151-Java-SDK)
* Javascript [Github](https://github.com/splitio/javascript-client) [Docs](https://help.split.io/hc/en-us/articles/360020448791-JavaScript-SDK)
* Node [Github](https://github.com/splitio/javascript-client) [Docs](https://help.split.io/hc/en-us/articles/360020564931-Node-js-SDK)
* .NET [Github](https://github.com/splitio/dotnet-client) [Docs](https://help.split.io/hc/en-us/articles/360020240172--NET-SDK)
* Ruby [Github](https://github.com/splitio/ruby-client) [Docs](https://help.split.io/hc/en-us/articles/360020673251-Ruby-SDK)
* PHP [Github](https://github.com/splitio/php-client) [Docs](https://help.split.io/hc/en-us/articles/360020350372-PHP-SDK)
* Python [Github](https://github.com/splitio/python-client) [Docs](https://help.split.io/hc/en-us/articles/360020359652-Python-SDK)
* GO [Github](https://github.com/splitio/go-client) [Docs](https://help.split.io/hc/en-us/articles/360020093652-Go-SDK)
* Android [Github](https://github.com/splitio/android-client) [Docs](https://help.split.io/hc/en-us/articles/360020343291-Android-SDK)
* Angular [Github](https://github.com/splitio/angular-sdk-plugin) [Docs](https://help.split.io/hc/en-us/articles/6495326064397-Angular-utilities)
* Elixir thin-client [Github](https://github.com/splitio/elixir-thin-client) [Docs](https://help.split.io/hc/en-us/articles/26988707417869-Elixir-Thin-Client-SDK)
* Flutter [Github](https://github.com/splitio/flutter-sdk-plugin) [Docs](https://help.split.io/hc/en-us/articles/8096158017165-Flutter-plugin)
* GO [Github](https://github.com/splitio/go-client) [Docs](https://help.split.io/hc/en-us/articles/360020093652-Go-SDK)
* iOS [Github](https://github.com/splitio/ios-client) [Docs](https://help.split.io/hc/en-us/articles/360020401491-iOS-SDK)
* Java [Github](https://github.com/splitio/java-client) [Docs](https://help.split.io/hc/en-us/articles/360020405151-Java-SDK)
* JavaScript [Github](https://github.com/splitio/javascript-client) [Docs](https://help.split.io/hc/en-us/articles/360020448791-JavaScript-SDK)
* JavaScript for Browser [Github](https://github.com/splitio/javascript-browser-client) [Docs](https://help.split.io/hc/en-us/articles/360058730852-Browser-SDK)
* Node.js [Github](https://github.com/splitio/javascript-client) [Docs](https://help.split.io/hc/en-us/articles/360020564931-Node-js-SDK)
* PHP [Github](https://github.com/splitio/php-client) [Docs](https://help.split.io/hc/en-us/articles/360020350372-PHP-SDK)
* PHP thin-client [Github](https://github.com/splitio/php-thin-client) [Docs](https://help.split.io/hc/en-us/articles/18305128673933-PHP-Thin-Client-SDK)
* Python [Github](https://github.com/splitio/python-client) [Docs](https://help.split.io/hc/en-us/articles/360020359652-Python-SDK)
* React [Github](https://github.com/splitio/react-client) [Docs](https://help.split.io/hc/en-us/articles/360038825091-React-SDK)
* React Native [Github](https://github.com/splitio/react-native-client) [Docs](https://help.split.io/hc/en-us/articles/4406066357901-React-Native-SDK)
* Redux [Github](https://github.com/splitio/redux-client) [Docs](https://help.split.io/hc/en-us/articles/360038851551-Redux-SDK)
* Ruby [Github](https://github.com/splitio/ruby-client) [Docs](https://help.split.io/hc/en-us/articles/360020673251-Ruby-SDK)

For a comprehensive list of open source projects visit our [Github page](https://github.com/splitio?utf8=%E2%9C%93&query=%20only%3Apublic%20).

Expand Down
30 changes: 30 additions & 0 deletions eslint.config.mts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import js from "@eslint/js";
import globals from "globals";
import tseslint from "typescript-eslint";
import { defineConfig } from "eslint/config";
import jestPlugin from 'eslint-plugin-jest';

export default defineConfig([
{
files: ["**/*.{js,mjs,cjs,ts,mts,cts}"],
plugins: { js },
extends: ["js/recommended"],
languageOptions: { globals: globals.browser },
rules: {
semi: ["error", "always"],
}
},
{
files: ['**/*.{test,spec}.{js,ts,jsx,tsx}', '**/__tests__/**/*.{js,ts,jsx,tsx}'],
plugins: { jest: jestPlugin },
rules: {
...jestPlugin.configs.recommended.rules,
},
languageOptions: {
globals: {
...globals.jest,
},
},
},
tseslint.configs.recommended,
]);
18 changes: 11 additions & 7 deletions jest.config.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,18 @@
module.exports = {
displayName: 'js-split-provider',
preset: '../../jest.preset.js',
export default {
displayName: 'openfeature-web-split-provider',
testEnvironment: 'jsdom',
testMatch: ['**/*.spec.js', '**/integration/*.test.js'],
globals: {
'ts-jest': {
tsconfig: '<rootDir>/tsconfig.spec.json',
tsconfig: '<rootDir>/tsconfig.json',
},
},
transform: {
'^.+\\.[tj]s$': 'ts-jest',
'^.+\\.[tj]sx?$': 'ts-jest',
},
moduleFileExtensions: ['ts', 'js', 'html'],
coverageDirectory: '../../coverage/packages/js-split-provider',
transformIgnorePatterns: [
'node_modules/(?!(fetch-mock)/)'
],
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'html'],
coverageDirectory: './coverage',
};
Loading