mirror of
				https://github.com/Unleash/unleash.git
				synced 2025-10-27 11:02:16 +01:00 
			
		
		
		
	-
https://linear.app/unleash/issue/2-546/fetch-the-payload-from-a-real-feature-flag
-
https://linear.app/unleash/issue/2-547/adapt-ui-to-use-the-feature-flag-information-were-fetching
Tackles the 2 tasks above. 
Adapts our `FlagResolver` logic to support variants, so we can use them
for our message banner project but also anything else in the future.
Also adapts MessageBanner to the new logic.
 - Add support for variants in `FlagResolver`;
 - Adapt `MessageBanner` to a variants flag;
 - Adds `sticky` support for the `MessageBanner`;
- Adds our first variants flag to `uiConfig` and `experimental`:
`messageBanner`;
- Adds a `variant-flag-schema` to make it easy to represent the variant
output that we specify in `uiConfig`;
- Adapts `experimental` to be able to represent default variants while
still maintaining type safety;
- Adds helpers to make it easy to use variants in our project, such as
`getVariantValue` and the `useVariant` hook;
 - Adapts and adds new tests in `flag-resolver.test.ts`;
 
### Notes
- ~~The `as PayloadType` assertions need
https://github.com/Unleash/unleash-client-node/pull/454 since it
includes https://github.com/Unleash/unleash-client-node/pull/452~~
(50ccf60893);
 - ~~Enterprise needs a PR that will follow soon~~;
 
 

		
	
			
		
			
				
	
	
		
			71 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import { SdkContextSchema } from 'lib/openapi/spec/sdk-context-schema';
 | |
| import { InMemStorageProvider, FeatureEvaluator } from './feature-evaluator';
 | |
| import { FeatureConfigurationClient } from 'lib/types/stores/feature-strategies-store';
 | |
| import { Segment } from './feature-evaluator/strategy/strategy';
 | |
| import { ISegment } from 'lib/types/model';
 | |
| import { serializeDates } from '../../lib/types/serialize-dates';
 | |
| import { Operator } from './feature-evaluator/constraint';
 | |
| import { FeatureInterface } from 'unleash-client/lib/feature';
 | |
| import { PayloadType } from 'unleash-client';
 | |
| 
 | |
| type NonEmptyList<T> = [T, ...T[]];
 | |
| 
 | |
| export const mapFeaturesForClient = (
 | |
|     features: FeatureConfigurationClient[],
 | |
| ): FeatureInterface[] =>
 | |
|     features.map((feature) => ({
 | |
|         impressionData: false,
 | |
|         ...feature,
 | |
|         variants: (feature.variants || []).map((variant) => ({
 | |
|             overrides: [],
 | |
|             ...variant,
 | |
|             payload: variant.payload && {
 | |
|                 ...variant.payload,
 | |
|                 type: variant.payload.type as PayloadType,
 | |
|             },
 | |
|         })),
 | |
|         project: feature.project,
 | |
|         strategies: feature.strategies.map((strategy) => ({
 | |
|             parameters: {},
 | |
|             ...strategy,
 | |
|             constraints:
 | |
|                 strategy.constraints &&
 | |
|                 strategy.constraints.map((constraint) => ({
 | |
|                     inverted: false,
 | |
|                     values: [],
 | |
|                     ...constraint,
 | |
|                     operator: constraint.operator as unknown as Operator,
 | |
|                 })),
 | |
|         })),
 | |
|     }));
 | |
| 
 | |
| export const mapSegmentsForClient = (segments: ISegment[]): Segment[] =>
 | |
|     serializeDates(segments) as Segment[];
 | |
| 
 | |
| export type ClientInitOptions = {
 | |
|     features: NonEmptyList<FeatureConfigurationClient>;
 | |
|     segments?: ISegment[];
 | |
|     context: SdkContextSchema;
 | |
|     logError: (message: any, ...args: any[]) => void;
 | |
| };
 | |
| 
 | |
| export const offlineUnleashClient = async ({
 | |
|     features,
 | |
|     context,
 | |
|     segments,
 | |
| }: ClientInitOptions): Promise<FeatureEvaluator> => {
 | |
|     const client = new FeatureEvaluator({
 | |
|         ...context,
 | |
|         appName: context.appName,
 | |
|         storageProvider: new InMemStorageProvider(),
 | |
|         bootstrap: {
 | |
|             data: mapFeaturesForClient(features),
 | |
|             segments: mapSegmentsForClient(segments),
 | |
|         },
 | |
|     });
 | |
| 
 | |
|     client.start();
 | |
| 
 | |
|     return client;
 | |
| };
 |