diff --git a/docs/reference/sdks/client/kotlin.mdx b/docs/reference/sdks/client/kotlin.mdx index de0bf441b..3454beec6 100644 --- a/docs/reference/sdks/client/kotlin.mdx +++ b/docs/reference/sdks/client/kotlin.mdx @@ -10,7 +10,7 @@ This content has been automatically generated from kotlin-sdk. Edits should be made here: https://github.com/open-feature/kotlin-sdk Once a repo has been updated, docs can be generated by running: yarn update:sdk-docs -Last updated at Thu Dec 04 2025 17:46:52 GMT+0000 (Coordinated Universal Time) +Last updated at Fri Dec 12 2025 08:11:53 GMT+0000 (Coordinated Universal Time) --> import MCPInstall from '@site/src/partials/mcp-install'; diff --git a/docs/reference/sdks/client/swift.mdx b/docs/reference/sdks/client/swift.mdx index a45c2b9f9..f9af0b8f3 100644 --- a/docs/reference/sdks/client/swift.mdx +++ b/docs/reference/sdks/client/swift.mdx @@ -10,7 +10,7 @@ This content has been automatically generated from swift-sdk. Edits should be made here: https://github.com/open-feature/swift-sdk Once a repo has been updated, docs can be generated by running: yarn update:sdk-docs -Last updated at Thu Dec 04 2025 17:46:52 GMT+0000 (Coordinated Universal Time) +Last updated at Fri Dec 12 2025 08:11:53 GMT+0000 (Coordinated Universal Time) --> import MCPInstall from '@site/src/partials/mcp-install'; diff --git a/docs/reference/sdks/client/web/angular.mdx b/docs/reference/sdks/client/web/angular.mdx index 54bb572cf..afe2a2bab 100644 --- a/docs/reference/sdks/client/web/angular.mdx +++ b/docs/reference/sdks/client/web/angular.mdx @@ -10,7 +10,7 @@ This content has been automatically generated from js-sdk. Edits should be made here: https://github.com/open-feature/js-sdk Once a repo has been updated, docs can be generated by running: yarn update:sdk-docs -Last updated at Thu Dec 04 2025 17:46:52 GMT+0000 (Coordinated Universal Time) +Last updated at Fri Dec 12 2025 08:11:53 GMT+0000 (Coordinated Universal Time) -->

@@ -94,9 +94,9 @@ yarn add @openfeature/angular-sdk @openfeature/web-sdk @openfeature/core The following list contains the peer dependencies of `@openfeature/angular-sdk`. See the [package.json](https://github.com/open-feature/js-sdk/blob/main/packages/angular/projects/angular-sdk/package.json) for the required versions. -* `@openfeature/web-sdk` -* `@angular/common` -* `@angular/core` +- `@openfeature/web-sdk` +- `@angular/common` +- `@angular/core` ### Usage @@ -123,11 +123,10 @@ import { OpenFeatureModule } from '@openfeature/angular-sdk'; domain1: new YourOpenFeatureProvider(), domain2: new YourOtherOpenFeatureProvider(), }, - }) + }), ], }) -export class AppModule { -} +export class AppModule {} ``` ##### Minimal Example @@ -138,9 +137,7 @@ If `initializing` and `reconciling` are not given, the feature flag value that i determine what will be rendered. ```html -

- This is shown when the feature flag is enabled. -
+
This is shown when the feature flag is enabled.
``` This example shows content when the feature flag `isFeatureEnabled` is true with a default value of true. @@ -182,72 +179,58 @@ This parameter is _optional_, if omitted, the `then` and `else` templates will b ```html
+ *booleanFeatureFlag="'isFeatureEnabled'; default: true; domain: 'userDomain'; else: booleanFeatureElse; initializing: booleanFeatureInitializing; reconciling: booleanFeatureReconciling" +> This is shown when the feature flag is enabled.
- - This is shown when the feature flag is disabled. - - - This is shown when the feature flag is initializing. - - - This is shown when the feature flag is reconciling. - + This is shown when the feature flag is disabled. + This is shown when the feature flag is initializing. + This is shown when the feature flag is reconciling. ``` ###### Number Feature Flag ```html
+ *numberFeatureFlag="'discountRate'; value: 10; default: 5; domain: 'userDomain'; else: numberFeatureElse; initializing: numberFeatureInitializing; reconciling: numberFeatureReconciling" +> This is shown when the feature flag matches the specified discount rate.
This is shown when the feature flag does not match the specified discount rate. - - This is shown when the feature flag is initializing. - - - This is shown when the feature flag is reconciling. - + This is shown when the feature flag is initializing. + This is shown when the feature flag is reconciling. ``` ###### String Feature Flag ```html
+ *stringFeatureFlag="'themeColor'; value: 'dark'; default: 'light'; domain: 'userDomain'; else: stringFeatureElse; initializing: stringFeatureInitializing; reconciling: stringFeatureReconciling" +> This is shown when the feature flag matches the specified theme color.
This is shown when the feature flag does not match the specified theme color. - - This is shown when the feature flag is initializing. - - - This is shown when the feature flag is reconciling. - + This is shown when the feature flag is initializing. + This is shown when the feature flag is reconciling. ``` ###### Object Feature Flag ```html
+ *objectFeatureFlag="'userConfig'; value: { theme: 'dark' }; default: { theme: 'light' }; domain: 'userDomain'; else: objectFeatureElse; initializing: objectFeatureInitializing; reconciling: objectFeatureReconciling" +> This is shown when the feature flag matches the specified user configuration.
This is shown when the feature flag does not match the specified user configuration. - - This is shown when the feature flag is initializing. - - - This is shown when the feature flag is reconciling. - + This is shown when the feature flag is initializing. + This is shown when the feature flag is reconciling. ``` ###### Opting-out of automatic re-rendering @@ -257,7 +240,9 @@ By default, the directive re-renders when the flag value changes or the context In cases, this is not desired, re-rendering can be disabled for both events: ```html -
+
This is shown when the feature flag is enabled.
``` @@ -274,13 +259,12 @@ The following example shows `value` being implicitly bound and `details` being b ```html
- It was a match! - The theme color is {{ value }} because of {{ details.reason }} + *stringFeatureFlag="'themeColor'; value: 'dark'; default: 'light'; else: stringFeatureElse; let value; let details = evaluationDetails" +> + It was a match! The theme color is {{ value }} because of {{ details.reason }}
- - It was no match! - The theme color is {{ value }} because of {{ details.reason }} + + It was no match! The theme color is {{ value }} because of {{ details.reason }} ``` @@ -288,9 +272,7 @@ When the expected flag value is omitted, the template will always be rendered. This can be used to just render the flag value or details without conditional rendering. ```html -
- The theme color is {{ value }}. -
+
The theme color is {{ value }}.
``` ##### FeatureFlagService @@ -315,7 +297,7 @@ import { FeatureFlagService } from '@openfeature/angular-sdk';
Theme: {{ (currentTheme$ | async)?.value }}
Max items: {{ (maxItems$ | async)?.value }}
- ` + `, }) export class MyComponent { private flagService = inject(FeatureFlagService); @@ -347,11 +329,9 @@ import { FeatureFlagService } from '@openfeature/angular-sdk'; selector: 'my-component', standalone: true, template: ` -
- Feature is enabled! Reason: {{ isFeatureEnabled()?.reason }} -
+
Feature is enabled! Reason: {{ isFeatureEnabled()?.reason }}
Theme: {{ currentTheme()?.value }}
- ` + `, }) export class MyComponent { private flagService = inject(FeatureFlagService); @@ -368,8 +348,8 @@ The service methods accept the [same options as the directives](#opting-out-of-a ```typescript const flag$ = this.flagService.getBooleanDetails('my-flag', false, 'my-domain', { - updateOnConfigurationChanged: false, // default: true - updateOnContextChanged: false, // default: true + updateOnConfigurationChanged: false, // default: true + updateOnContextChanged: false, // default: true }); ``` @@ -394,7 +374,7 @@ const initialContext = { user: { id: 'user123', role: 'admin', - } + }, }; @NgModule({ @@ -402,8 +382,8 @@ const initialContext = { CommonModule, OpenFeatureModule.forRoot({ provider: yourFeatureProvider, - context: initialContext - }) + context: initialContext, + }), ], }) export class AppModule {} @@ -423,8 +403,8 @@ const contextFactory = (): EvaluationContext => loadContextFromLocalStorage(); CommonModule, OpenFeatureModule.forRoot({ provider: yourFeatureProvider, - context: contextFactory - }) + context: contextFactory, + }), ], }) export class AppModule {} diff --git a/docs/reference/sdks/client/web/index.mdx b/docs/reference/sdks/client/web/index.mdx index 28c86be5e..5727e6cc1 100644 --- a/docs/reference/sdks/client/web/index.mdx +++ b/docs/reference/sdks/client/web/index.mdx @@ -10,7 +10,7 @@ This content has been automatically generated from js-sdk. Edits should be made here: https://github.com/open-feature/js-sdk Once a repo has been updated, docs can be generated by running: yarn update:sdk-docs -Last updated at Thu Dec 04 2025 17:46:52 GMT+0000 (Coordinated Universal Time) +Last updated at Fri Dec 12 2025 08:11:53 GMT+0000 (Coordinated Universal Time) --> import MCPInstall from '@site/src/partials/mcp-install'; @@ -20,8 +20,8 @@ import MCPInstall from '@site/src/partials/mcp-install'; Specification - - Release + + Release
@@ -90,7 +90,7 @@ const client = OpenFeature.getClient(); const v2Enabled = client.getBooleanValue('v2_enabled', false); if (v2Enabled) { - console.log("v2 is enabled"); + console.log('v2 is enabled'); } ``` @@ -102,16 +102,16 @@ See [here](https://open-feature.github.io/js-sdk/modules/_openfeature_web_sdk.ht | Status | Features | Description | | ------ | ----------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- | -| ✅ | [Providers](#providers) | Integrate with a commercial, open source, or in-house feature management tool. | -| ✅ | [Targeting](#targeting-and-context) | Contextually-aware flag evaluation using [evaluation context](/docs/reference/concepts/evaluation-context). | -| ✅ | [Hooks](#hooks) | Add functionality to various stages of the flag evaluation life-cycle. | -| ✅ | [Logging](#logging) | Integrate with popular logging packages. | -| ✅ | [Domains](#domains) | Logically bind clients with providers. | -| ✅ | [Eventing](#eventing) | React to state changes in the provider or flag management system. | -| ✅ | [Tracking](#tracking) | Associate user actions with feature flag evaluations, particularly for A/B testing. | -| ✅ | [Shutdown](#shutdown) | Gracefully clean up a provider during application shutdown. | -| ✅ | [Extending](#extending) | Extend OpenFeature with custom providers and hooks. | -| ✅ | [Multi-Provider](#multi-provider) | Combine multiple providers with configurable evaluation strategies. | +| ✅ | [Providers](#providers) | Integrate with a commercial, open source, or in-house feature management tool. | +| ✅ | [Targeting](#targeting-and-context) | Contextually-aware flag evaluation using [evaluation context](/docs/reference/concepts/evaluation-context). | +| ✅ | [Hooks](#hooks) | Add functionality to various stages of the flag evaluation life-cycle. | +| ✅ | [Logging](#logging) | Integrate with popular logging packages. | +| ✅ | [Domains](#domains) | Logically bind clients with providers. | +| ✅ | [Eventing](#eventing) | React to state changes in the provider or flag management system. | +| ✅ | [Tracking](#tracking) | Associate user actions with feature flag evaluations, particularly for A/B testing. | +| ✅ | [Shutdown](#shutdown) | Gracefully clean up a provider during application shutdown. | +| ✅ | [Extending](#extending) | Extend OpenFeature with custom providers and hooks. | +| ✅ | [Multi-Provider](#multi-provider) | Combine multiple providers with configurable evaluation strategies. | Implemented: ✅ | In-progress: ⚠️ | Not implemented yet: ❌ @@ -160,15 +160,12 @@ The Multi-Provider is a powerful tool for performing migrations between flag pro ```ts import { MultiProvider } from '@openfeature/web-sdk'; -const multiProvider = new MultiProvider([ - { provider: new ProviderA() }, - { provider: new ProviderB() } -]); +const multiProvider = new MultiProvider([{ provider: new ProviderA() }, { provider: new ProviderB() }]); await OpenFeature.setProviderAndWait(multiProvider); const client = OpenFeature.getClient(); -console.log(client.getBooleanDetails("my-flag", false)); +console.log(client.getBooleanDetails('my-flag', false)); ``` By default, the Multi-Provider will evaluate all underlying providers in order and return the first successful result. If a provider indicates it does not have a flag (FLAG_NOT_FOUND error code), then it will be skipped and the next provider will be evaluated. @@ -185,11 +182,8 @@ The Multi-Provider comes with three strategies out of the box: import { MultiProvider, FirstSuccessfulStrategy } from '@openfeature/web-sdk'; const multiProvider = new MultiProvider( - [ - { provider: new ProviderA() }, - { provider: new ProviderB() } - ], - new FirstSuccessfulStrategy() + [{ provider: new ProviderA() }, { provider: new ProviderB() }], + new FirstSuccessfulStrategy(), ); ``` @@ -199,9 +193,9 @@ The Multi-Provider supports tracking events across multiple providers, allowing ```ts // Tracked events will be sent to all providers by default -client.track('user-conversion', { - value: 99.99, - currency: 'USD' +client.track('user-conversion', { + value: 99.99, + currency: 'USD', }); ``` @@ -236,7 +230,7 @@ Change context after the provider has been registered using `setContext`. ```ts // Set a value to the global context -await OpenFeature.setContext({ targetingKey: localStorage.getItem("targetingKey") }); +await OpenFeature.setContext({ targetingKey: localStorage.getItem('targetingKey') }); ``` Context is global and setting it is `async`. @@ -253,7 +247,7 @@ If the hook you're looking for hasn't been created yet, see the [develop a hook] Once you've added a hook as a dependency, it can be registered at the global, client, or flag invocation level. ```ts -import { OpenFeature } from "@openfeature/web-sdk"; +import { OpenFeature } from '@openfeature/web-sdk'; // add a hook globally, to run on all evaluations OpenFeature.addHooks(new ExampleGlobalHook()); @@ -263,7 +257,7 @@ const client = OpenFeature.getClient(); client.addHooks(new ExampleClientHook()); // add a hook for this evaluation only -const boolValue = client.getBooleanValue("bool-flag", false, { hooks: [new ExampleHook()]}); +const boolValue = client.getBooleanValue('bool-flag', false, { hooks: [new ExampleHook()] }); ``` ### Logging @@ -273,7 +267,7 @@ This behavior can be overridden by passing a custom logger either globally or pe A custom logger must implement the [Logger interface](https://github.com/open-feature/js-sdk/blob/main/packages/shared/src/logger/logger.ts). ```ts -import type { Logger } from "@openfeature/web-sdk"; +import type { Logger } from '@openfeature/web-sdk'; // The logger can be anything that conforms with the Logger interface const logger: Logger = console; @@ -293,17 +287,17 @@ A domain is a logical identifier which can be used to associate clients with a p If a domain has no associated provider, the default provider is used. ```ts -import { OpenFeature, InMemoryProvider } from "@openfeature/web-sdk"; +import { OpenFeature, InMemoryProvider } from '@openfeature/web-sdk'; // Registering the default provider OpenFeature.setProvider(InMemoryProvider(myFlags)); // Registering a provider to a domain -OpenFeature.setProvider("my-domain", new InMemoryProvider(someOtherFlags)); +OpenFeature.setProvider('my-domain', new InMemoryProvider(someOtherFlags)); // A Client bound to the default provider const clientWithDefault = OpenFeature.getClient(); // A Client bound to the InMemoryProvider provider -const domainScopedClient = OpenFeature.getClient("my-domain"); +const domainScopedClient = OpenFeature.getClient('my-domain'); ``` Domains can be defined on a provider during registration. @@ -315,13 +309,13 @@ By default, domain-scoped clients use the global context. This can be overridden by explicitly setting context when registering the provider or by referencing the domain when updating context: ```ts -OpenFeature.setProvider("my-domain", new NewCachedProvider(), { targetingKey: localStorage.getItem("targetingKey") }); +OpenFeature.setProvider('my-domain', new NewCachedProvider(), { targetingKey: localStorage.getItem('targetingKey') }); ``` To change context after the provider has been registered, use `setContext` with a domain: ```ts -await OpenFeature.setContext("my-domain", { targetingKey: localStorage.getItem("targetingKey") }) +await OpenFeature.setContext('my-domain', { targetingKey: localStorage.getItem('targetingKey') }); ``` Once a domain's context has been defined, it will override the global context for all clients bound to the domain. @@ -373,7 +367,7 @@ This should only be called when your application is in the process of shutting d ```ts import { OpenFeature } from '@openfeature/web-sdk'; -await OpenFeature.close() +await OpenFeature.close(); ``` ## Extending @@ -393,7 +387,7 @@ import { Logger, Provider, ProviderEventEmitter, - ResolutionDetails + ResolutionDetails, } from '@openfeature/web-sdk'; // implement the provider interface @@ -405,16 +399,36 @@ class MyProvider implements Provider { } as const; // Optional provider managed hooks hooks?: Hook[]; - resolveBooleanEvaluation(flagKey: string, defaultValue: boolean, context: EvaluationContext, logger: Logger): ResolutionDetails { + resolveBooleanEvaluation( + flagKey: string, + defaultValue: boolean, + context: EvaluationContext, + logger: Logger, + ): ResolutionDetails { // code to evaluate a boolean } - resolveStringEvaluation(flagKey: string, defaultValue: string, context: EvaluationContext, logger: Logger): ResolutionDetails { + resolveStringEvaluation( + flagKey: string, + defaultValue: string, + context: EvaluationContext, + logger: Logger, + ): ResolutionDetails { // code to evaluate a string } - resolveNumberEvaluation(flagKey: string, defaultValue: number, context: EvaluationContext, logger: Logger): ResolutionDetails { + resolveNumberEvaluation( + flagKey: string, + defaultValue: number, + context: EvaluationContext, + logger: Logger, + ): ResolutionDetails { // code to evaluate a number } - resolveObjectEvaluation(flagKey: string, defaultValue: T, context: EvaluationContext, logger: Logger): ResolutionDetails { + resolveObjectEvaluation( + flagKey: string, + defaultValue: T, + context: EvaluationContext, + logger: Logger, + ): ResolutionDetails { // code to evaluate an object } @@ -443,7 +457,7 @@ This can be a new repository or included in [the existing contrib repository](ht Implement your own hook by conforming to the [Hook interface](https://github.com/open-feature/js-sdk/blob/main/packages/shared/src/hooks/hook.ts). ```ts -import type { Hook, HookContext, EvaluationDetails, FlagValue } from "@openfeature/web-sdk"; +import type { Hook, HookContext, EvaluationDetails, FlagValue } from '@openfeature/web-sdk'; export class MyHook implements Hook { after(hookContext: HookContext, evaluationDetails: EvaluationDetails) { diff --git a/docs/reference/sdks/client/web/react.mdx b/docs/reference/sdks/client/web/react.mdx index 6d0d53f2f..c45426c02 100644 --- a/docs/reference/sdks/client/web/react.mdx +++ b/docs/reference/sdks/client/web/react.mdx @@ -10,7 +10,7 @@ This content has been automatically generated from js-sdk. Edits should be made here: https://github.com/open-feature/js-sdk Once a repo has been updated, docs can be generated by running: yarn update:sdk-docs -Last updated at Thu Dec 04 2025 17:46:52 GMT+0000 (Coordinated Universal Time) +Last updated at Fri Dec 12 2025 08:11:53 GMT+0000 (Coordinated Universal Time) --> import MCPInstall from '@site/src/partials/mcp-install'; @@ -20,8 +20,8 @@ import MCPInstall from '@site/src/partials/mcp-install'; Specification - - Release + + Release
@@ -89,8 +89,8 @@ yarn add @openfeature/react-sdk @openfeature/web-sdk @openfeature/core The following list contains the peer dependencies of `@openfeature/react-sdk`. See the [package.json](https://github.com/open-feature/js-sdk/blob/main/packages/react/package.json) for the required versions. -* `@openfeature/web-sdk` -* `react` +- `@openfeature/web-sdk` +- `react` ### Usage @@ -110,13 +110,13 @@ const flagConfig = { on: true, off: false, }, - defaultVariant: "on", + defaultVariant: 'on', contextEvaluator: (context: EvaluationContext) => { if (context.silly) { return 'on'; } - return 'off' - } + return 'off'; + }, }, }; @@ -148,7 +148,7 @@ function Page() { {showNewMessage ?

Welcome to this OpenFeature-enabled React app!

:

Welcome to this React app.

} - ) + ); } ``` @@ -165,12 +165,7 @@ const value = useBooleanFlagValue('new-message', false); import { useBooleanFlagDetails } from '@openfeature/react-sdk'; // "detailed" boolean flag evaluation -const { - value, - variant, - reason, - flagMetadata -} = useBooleanFlagDetails('new-message', false); +const { value, variant, reason, flagMetadata } = useBooleanFlagDetails('new-message', false); ``` #### Multiple Providers and Domains @@ -408,4 +403,4 @@ Avoid importing anything from `@openfeature/web-sdk` or `@openfeature/core`. ## Resources - - [Example repo](https://github.com/open-feature/react-test-app) +- [Example repo](https://github.com/open-feature/react-test-app) diff --git a/docs/reference/sdks/server/dart.mdx b/docs/reference/sdks/server/dart.mdx index cfec6f2a3..d66a4f4a3 100644 --- a/docs/reference/sdks/server/dart.mdx +++ b/docs/reference/sdks/server/dart.mdx @@ -9,7 +9,7 @@ This content has been automatically generated from dart-server-sdk. Edits should be made here: https://github.com/open-feature/dart-server-sdk Once a repo has been updated, docs can be generated by running: yarn update:sdk-docs -Last updated at Thu Dec 04 2025 17:46:52 GMT+0000 (Coordinated Universal Time) +Last updated at Fri Dec 12 2025 08:11:53 GMT+0000 (Coordinated Universal Time) -->

diff --git a/docs/reference/sdks/server/dotnet.mdx b/docs/reference/sdks/server/dotnet.mdx index b92a86207..60a4e1145 100644 --- a/docs/reference/sdks/server/dotnet.mdx +++ b/docs/reference/sdks/server/dotnet.mdx @@ -10,7 +10,7 @@ This content has been automatically generated from dotnet-sdk. Edits should be made here: https://github.com/open-feature/dotnet-sdk Once a repo has been updated, docs can be generated by running: yarn update:sdk-docs -Last updated at Thu Dec 04 2025 17:46:52 GMT+0000 (Coordinated Universal Time) +Last updated at Fri Dec 12 2025 08:11:52 GMT+0000 (Coordinated Universal Time) --> import MCPInstall from '@site/src/partials/mcp-install'; diff --git a/docs/reference/sdks/server/go.mdx b/docs/reference/sdks/server/go.mdx index 420ac6311..c44fc6781 100644 --- a/docs/reference/sdks/server/go.mdx +++ b/docs/reference/sdks/server/go.mdx @@ -9,7 +9,7 @@ This content has been automatically generated from go-sdk. Edits should be made here: https://github.com/open-feature/go-sdk Once a repo has been updated, docs can be generated by running: yarn update:sdk-docs -Last updated at Thu Dec 04 2025 17:46:52 GMT+0000 (Coordinated Universal Time) +Last updated at Fri Dec 12 2025 08:11:52 GMT+0000 (Coordinated Universal Time) --> import MCPInstall from '@site/src/partials/mcp-install'; diff --git a/docs/reference/sdks/server/java.mdx b/docs/reference/sdks/server/java.mdx index 113d21fb0..f44efc5e3 100644 --- a/docs/reference/sdks/server/java.mdx +++ b/docs/reference/sdks/server/java.mdx @@ -9,7 +9,7 @@ This content has been automatically generated from java-sdk. Edits should be made here: https://github.com/open-feature/java-sdk Once a repo has been updated, docs can be generated by running: yarn update:sdk-docs -Last updated at Thu Dec 04 2025 17:46:52 GMT+0000 (Coordinated Universal Time) +Last updated at Fri Dec 12 2025 08:11:51 GMT+0000 (Coordinated Universal Time) --> import MCPInstall from '@site/src/partials/mcp-install'; @@ -20,8 +20,8 @@ import MCPInstall from '@site/src/partials/mcp-install'; - - Release + + Release @@ -59,7 +59,7 @@ Note that this library is intended to be used in server-side contexts and has no dev.openfeature sdk - 1.19.0 + 1.19.2 ``` @@ -82,7 +82,7 @@ If you would like snapshot builds, this is the relevant repository information: ```groovy dependencies { - implementation 'dev.openfeature:sdk:1.19.0' + implementation 'dev.openfeature:sdk:1.19.2' } ``` diff --git a/docs/reference/sdks/server/javascript/index.mdx b/docs/reference/sdks/server/javascript/index.mdx index a6aec683d..6b8504f36 100644 --- a/docs/reference/sdks/server/javascript/index.mdx +++ b/docs/reference/sdks/server/javascript/index.mdx @@ -10,7 +10,7 @@ This content has been automatically generated from js-sdk. Edits should be made here: https://github.com/open-feature/js-sdk Once a repo has been updated, docs can be generated by running: yarn update:sdk-docs -Last updated at Thu Dec 04 2025 17:46:52 GMT+0000 (Coordinated Universal Time) +Last updated at Fri Dec 12 2025 08:11:52 GMT+0000 (Coordinated Universal Time) --> import MCPInstall from '@site/src/partials/mcp-install'; @@ -20,8 +20,8 @@ import MCPInstall from '@site/src/partials/mcp-install'; Specification - - Release + + Release
@@ -90,7 +90,7 @@ const client = OpenFeature.getClient(); const v2Enabled = await client.getBooleanValue('v2_enabled', false); if (v2Enabled) { - console.log("v2 is enabled"); + console.log('v2 is enabled'); } ``` @@ -100,19 +100,19 @@ See [here](https://open-feature.github.io/js-sdk/modules/_openfeature_server_sdk ## Features -| Status | Features | Description | -| ------ | ------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | -| ✅ | [Providers](#providers) | Integrate with a commercial, open source, or in-house feature management tool. | -| ✅ | [Targeting](#targeting) | Contextually-aware flag evaluation using [evaluation context](/docs/reference/concepts/evaluation-context). | -| ✅ | [Hooks](#hooks) | Add functionality to various stages of the flag evaluation life-cycle. | -| ✅ | [Logging](#logging) | Integrate with popular logging packages. | -| ✅ | [Domains](#domains) | Logically bind clients with providers. | -| ✅ | [Eventing](#eventing) | React to state changes in the provider or flag management system. | -| ✅ | [Transaction Context Propagation](#transaction-context-propagation) | Set a specific [evaluation context](/docs/reference/concepts/evaluation-context) for a transaction (e.g. an HTTP request or a thread) | -| ✅ | [Tracking](#tracking) | Associate user actions with feature flag evaluations, particularly for A/B testing. | -| ✅ | [Shutdown](#shutdown) | Gracefully clean up a provider during application shutdown. | -| ✅ | [Extending](#extending) | Extend OpenFeature with custom providers and hooks. | -| ✅ | [Multi-Provider](#multi-provider) | Combine multiple providers with configurable evaluation strategies. | +| Status | Features | Description | +| ------ | ------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| ✅ | [Providers](#providers) | Integrate with a commercial, open source, or in-house feature management tool. | +| ✅ | [Targeting](#targeting) | Contextually-aware flag evaluation using [evaluation context](/docs/reference/concepts/evaluation-context). | +| ✅ | [Hooks](#hooks) | Add functionality to various stages of the flag evaluation life-cycle. | +| ✅ | [Logging](#logging) | Integrate with popular logging packages. | +| ✅ | [Domains](#domains) | Logically bind clients with providers. | +| ✅ | [Eventing](#eventing) | React to state changes in the provider or flag management system. | +| ✅ | [Transaction Context Propagation](#transaction-context-propagation) | Set a specific [evaluation context](/docs/reference/concepts/evaluation-context) for a transaction (e.g. an HTTP request or a thread) | +| ✅ | [Tracking](#tracking) | Associate user actions with feature flag evaluations, particularly for A/B testing. | +| ✅ | [Shutdown](#shutdown) | Gracefully clean up a provider during application shutdown. | +| ✅ | [Extending](#extending) | Extend OpenFeature with custom providers and hooks. | +| ✅ | [Multi-Provider](#multi-provider) | Combine multiple providers with configurable evaluation strategies. | Implemented: ✅ | In-progress: ⚠️ | Not implemented yet: ❌ @@ -164,10 +164,7 @@ const primaryProvider = new YourPrimaryProvider(); const backupProvider = new YourBackupProvider(); // Create multi-provider with a strategy -const multiProvider = new MultiProvider( - [primaryProvider, backupProvider], - new FirstMatchStrategy() -); +const multiProvider = new MultiProvider([primaryProvider, backupProvider], new FirstMatchStrategy()); // Register the multi-provider await OpenFeature.setProviderAndWait(multiProvider); @@ -193,7 +190,7 @@ const oldProvider = new OldFlagProvider(); const multiProvider = new MultiProvider( [newProvider, oldProvider], // New provider is consulted first - new FirstMatchStrategy() + new FirstMatchStrategy(), ); await OpenFeature.setProviderAndWait(multiProvider); @@ -209,13 +206,10 @@ const providerA = new ProviderA(); const providerB = new ProviderB(); const multiProvider = new MultiProvider( - [ - { provider: providerA }, - { provider: providerB } - ], + [{ provider: providerA }, { provider: providerB }], new ComparisonStrategy(providerA, (resolutions) => { console.warn('Mismatch detected', resolutions); - }) + }), ); await OpenFeature.setProviderAndWait(multiProvider); @@ -229,7 +223,7 @@ If the flag management system you're using supports targeting, you can provide t ```ts // set a value to the global context -OpenFeature.setContext({ region: "us-east-1" }); +OpenFeature.setContext({ region: 'us-east-1' }); // set a value to the client context const client = OpenFeature.getClient(); @@ -239,7 +233,7 @@ client.setContext({ version: process.env.APP_VERSION }); const requestContext = { targetingKey: req.session.id, email: req.session.email, - product: req.productId + product: req.productId, }; const boolValue = await client.getBooleanValue('some-flag', false, requestContext); @@ -257,7 +251,7 @@ If the hook you're looking for hasn't been created yet, see the [develop a hook] Once you've added a hook as a dependency, it can be registered at the global, client, or flag invocation level. ```ts -import { OpenFeature } from "@openfeature/server-sdk"; +import { OpenFeature } from '@openfeature/server-sdk'; // add a hook globally, to run on all evaluations OpenFeature.addHooks(new ExampleGlobalHook()); @@ -267,7 +261,7 @@ const client = OpenFeature.getClient(); client.addHooks(new ExampleClientHook()); // add a hook for this evaluation only -const boolValue = await client.getBooleanValue("bool-flag", false, { hooks: [new ExampleHook()]}); +const boolValue = await client.getBooleanValue('bool-flag', false, { hooks: [new ExampleHook()] }); ``` ### Logging @@ -277,7 +271,7 @@ This behavior can be overridden by passing a custom logger either globally or pe A custom logger must implement the [Logger interface](https://github.com/open-feature/js-sdk/blob/main/packages/shared/src/logger/logger.ts). ```ts -import type { Logger } from "@openfeature/server-sdk"; +import type { Logger } from '@openfeature/server-sdk'; // The logger can be anything that conforms with the Logger interface const logger: Logger = console; @@ -297,28 +291,28 @@ A domain is a logical identifier which can be used to associate clients with a p If a domain has no associated provider, the default provider is used. ```ts -import { OpenFeature, InMemoryProvider } from "@openfeature/server-sdk"; +import { OpenFeature, InMemoryProvider } from '@openfeature/server-sdk'; const myFlags = { - 'v2_enabled': { + v2_enabled: { variants: { on: true, - off: false + off: false, }, disabled: false, - defaultVariant: "on" - } + defaultVariant: 'on', + }, }; // Registering the default provider OpenFeature.setProvider(InMemoryProvider(myFlags)); // Registering a provider to a domain -OpenFeature.setProvider("my-domain", new InMemoryProvider(someOtherFlags)); +OpenFeature.setProvider('my-domain', new InMemoryProvider(someOtherFlags)); // A Client bound to the default provider const clientWithDefault = OpenFeature.getClient(); // A Client bound to the InMemoryProvider provider -const domainScopedClient = OpenFeature.getClient("my-domain"); +const domainScopedClient = OpenFeature.getClient('my-domain'); ``` Domains can be defined on a provider during registration. @@ -355,22 +349,22 @@ Transaction context can be set where specific data is available (e.g. an auth se The following example shows an Express middleware using transaction context propagation to propagate the request ip and user id into request scoped transaction context. ```ts -import express, { Request, Response, NextFunction } from "express"; +import express, { Request, Response, NextFunction } from 'express'; import { OpenFeature, AsyncLocalStorageTransactionContextPropagator } from '@openfeature/server-sdk'; -OpenFeature.setTransactionContextPropagator(new AsyncLocalStorageTransactionContextPropagator()) +OpenFeature.setTransactionContextPropagator(new AsyncLocalStorageTransactionContextPropagator()); /** * This example is based on an express middleware. */ const app = express(); app.use((req: Request, res: Response, next: NextFunction) => { - const ip = res.headers.get("X-Forwarded-For") + const ip = res.headers.get('X-Forwarded-For'); OpenFeature.setTransactionContext({ targetingKey: req.user.id, ipAddress: ip }, () => { // The transaction context is used in any flag evaluation throughout the whole call chain of next next(); }); -}) +}); ``` ### Tracking @@ -396,7 +390,7 @@ This should only be called when your application is in the process of shutting d ```ts import { OpenFeature } from '@openfeature/server-sdk'; -await OpenFeature.close() +await OpenFeature.close(); ``` ## Extending @@ -416,7 +410,7 @@ import { Logger, Provider, ProviderEventEmitter, - ResolutionDetails + ResolutionDetails, } from '@openfeature/server-sdk'; // implement the provider interface @@ -428,16 +422,36 @@ class MyProvider implements Provider { } as const; // Optional provider managed hooks hooks?: Hook[]; - resolveBooleanEvaluation(flagKey: string, defaultValue: boolean, context: EvaluationContext, logger: Logger): Promise> { + resolveBooleanEvaluation( + flagKey: string, + defaultValue: boolean, + context: EvaluationContext, + logger: Logger, + ): Promise> { // code to evaluate a boolean } - resolveStringEvaluation(flagKey: string, defaultValue: string, context: EvaluationContext, logger: Logger): Promise> { + resolveStringEvaluation( + flagKey: string, + defaultValue: string, + context: EvaluationContext, + logger: Logger, + ): Promise> { // code to evaluate a string } - resolveNumberEvaluation(flagKey: string, defaultValue: number, context: EvaluationContext, logger: Logger): Promise> { + resolveNumberEvaluation( + flagKey: string, + defaultValue: number, + context: EvaluationContext, + logger: Logger, + ): Promise> { // code to evaluate a number } - resolveObjectEvaluation(flagKey: string, defaultValue: T, context: EvaluationContext, logger: Logger): Promise> { + resolveObjectEvaluation( + flagKey: string, + defaultValue: T, + context: EvaluationContext, + logger: Logger, + ): Promise> { // code to evaluate an object } @@ -462,7 +476,7 @@ This can be a new repository or included in [the existing contrib repository](ht Implement your own hook by conforming to the [Hook interface](https://github.com/open-feature/js-sdk/blob/main/packages/shared/src/hooks/hook.ts). ```ts -import type { Hook, HookContext, EvaluationDetails, FlagValue } from "@openfeature/server-sdk"; +import type { Hook, HookContext, EvaluationDetails, FlagValue } from '@openfeature/server-sdk'; export class MyHook implements Hook { after(hookContext: HookContext, evaluationDetails: EvaluationDetails) { diff --git a/docs/reference/sdks/server/javascript/nestjs.mdx b/docs/reference/sdks/server/javascript/nestjs.mdx index 933a9d06a..4ffab9b5e 100644 --- a/docs/reference/sdks/server/javascript/nestjs.mdx +++ b/docs/reference/sdks/server/javascript/nestjs.mdx @@ -10,7 +10,7 @@ This content has been automatically generated from js-sdk. Edits should be made here: https://github.com/open-feature/js-sdk Once a repo has been updated, docs can be generated by running: yarn update:sdk-docs -Last updated at Thu Dec 04 2025 17:46:52 GMT+0000 (Coordinated Universal Time) +Last updated at Fri Dec 12 2025 08:11:52 GMT+0000 (Coordinated Universal Time) --> import MCPInstall from '@site/src/partials/mcp-install'; diff --git a/docs/reference/sdks/server/php.mdx b/docs/reference/sdks/server/php.mdx index d379771fa..5e1e1cb66 100644 --- a/docs/reference/sdks/server/php.mdx +++ b/docs/reference/sdks/server/php.mdx @@ -9,7 +9,7 @@ This content has been automatically generated from php-sdk. Edits should be made here: https://github.com/open-feature/php-sdk Once a repo has been updated, docs can be generated by running: yarn update:sdk-docs -Last updated at Thu Dec 04 2025 17:46:52 GMT+0000 (Coordinated Universal Time) +Last updated at Fri Dec 12 2025 08:11:52 GMT+0000 (Coordinated Universal Time) --> import MCPInstall from '@site/src/partials/mcp-install'; diff --git a/docs/reference/sdks/server/python.mdx b/docs/reference/sdks/server/python.mdx index 9affc874b..82aa741ac 100644 --- a/docs/reference/sdks/server/python.mdx +++ b/docs/reference/sdks/server/python.mdx @@ -9,7 +9,7 @@ This content has been automatically generated from python-sdk. Edits should be made here: https://github.com/open-feature/python-sdk Once a repo has been updated, docs can be generated by running: yarn update:sdk-docs -Last updated at Thu Dec 04 2025 17:46:52 GMT+0000 (Coordinated Universal Time) +Last updated at Fri Dec 12 2025 08:11:52 GMT+0000 (Coordinated Universal Time) --> import MCPInstall from '@site/src/partials/mcp-install'; @@ -22,8 +22,8 @@ import MCPInstall from '@site/src/partials/mcp-install'; - - Latest version + + Latest version @@ -59,13 +59,13 @@ import MCPInstall from '@site/src/partials/mcp-install'; #### Pip install ```bash -pip install openfeature-sdk==0.8.3 +pip install openfeature-sdk==0.8.4 ``` #### requirements.txt ```bash -openfeature-sdk==0.8.3 +openfeature-sdk==0.8.4 ``` ```python diff --git a/docs/reference/sdks/server/ruby.mdx b/docs/reference/sdks/server/ruby.mdx index 32bbe2edb..7c9b25f7c 100644 --- a/docs/reference/sdks/server/ruby.mdx +++ b/docs/reference/sdks/server/ruby.mdx @@ -10,7 +10,7 @@ This content has been automatically generated from ruby-sdk. Edits should be made here: https://github.com/open-feature/ruby-sdk Once a repo has been updated, docs can be generated by running: yarn update:sdk-docs -Last updated at Thu Dec 04 2025 17:46:52 GMT+0000 (Coordinated Universal Time) +Last updated at Fri Dec 12 2025 08:11:53 GMT+0000 (Coordinated Universal Time) --> import MCPInstall from '@site/src/partials/mcp-install'; diff --git a/docs/reference/sdks/server/rust.mdx b/docs/reference/sdks/server/rust.mdx index 7f199fb34..e9172232f 100644 --- a/docs/reference/sdks/server/rust.mdx +++ b/docs/reference/sdks/server/rust.mdx @@ -9,7 +9,7 @@ This content has been automatically generated from rust-sdk. Edits should be made here: https://github.com/open-feature/rust-sdk Once a repo has been updated, docs can be generated by running: yarn update:sdk-docs -Last updated at Thu Dec 04 2025 17:46:53 GMT+0000 (Coordinated Universal Time) +Last updated at Fri Dec 12 2025 08:11:54 GMT+0000 (Coordinated Universal Time) -->

diff --git a/src/datasets/sdks/sdk-compatibility.json b/src/datasets/sdks/sdk-compatibility.json index 219edb694..ec041f021 100644 --- a/src/datasets/sdks/sdk-compatibility.json +++ b/src/datasets/sdks/sdk-compatibility.json @@ -4,8 +4,8 @@ "path": "/docs/reference/sdks/server/java", "category": "Server", "release": { - "href": "https://github.com/open-feature/java-sdk/releases/tag/v1.19.0", - "version": "1.19.0", + "href": "https://github.com/open-feature/java-sdk/releases/tag/v1.19.2", + "version": "1.19.2", "stable": true }, "spec": { @@ -64,8 +64,8 @@ "path": "/docs/reference/sdks/server/javascript", "category": "Server", "release": { - "href": "https://github.com/open-feature/js-sdk/releases/tag/server-sdk-v1.20.0", - "version": "1.20.0", + "href": "https://github.com/open-feature/js-sdk/releases/tag/server-sdk-v1.20.1", + "version": "1.20.1", "stable": true }, "spec": { @@ -244,8 +244,8 @@ "path": "/docs/reference/sdks/server/python", "category": "Server", "release": { - "href": "https://github.com/open-feature/python-sdk/releases/tag/v0.8.3", - "version": "0.8.3", + "href": "https://github.com/open-feature/python-sdk/releases/tag/v0.8.4", + "version": "0.8.4", "stable": false }, "spec": { @@ -364,8 +364,8 @@ "path": "/docs/reference/sdks/client/web", "category": "Client", "release": { - "href": "https://github.com/open-feature/js-sdk/releases/tag/web-sdk-v1.7.1", - "version": "1.7.1", + "href": "https://github.com/open-feature/js-sdk/releases/tag/web-sdk-v1.7.2", + "version": "1.7.2", "stable": true }, "spec": {