Skip to content

Commit

Permalink
feat: give option to retrieve toggle definitions with full segment da…
Browse files Browse the repository at this point in the history
…ta (#574)

* feat: give option to retrieve toggle definitions with full segment data

* set a default value

* refactor a bit and add test

* refactor a bit and add test

* refactor a bit and add test

* refactor a bit and add test

* refactor a bit and add test

* fix: missing this binding in segment resolution

* more tests

* more tests

* more tests

---------

Co-authored-by: sighphyre <liquidwicked64@gmail.com>
  • Loading branch information
andreas-unleash and sighphyre committed Feb 1, 2024
1 parent 3288035 commit 7c5406e
Show file tree
Hide file tree
Showing 6 changed files with 345 additions and 34 deletions.
6 changes: 5 additions & 1 deletion src/feature.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { StrategyTransportInterface } from './strategy';
import { Segment } from './strategy/strategy';
import { EnhancedStrategyTransportInterface, Segment } from './strategy/strategy';
// eslint-disable-next-line import/no-cycle
import { VariantDefinition } from './variant';

Expand All @@ -22,6 +22,10 @@ export interface FeatureInterface {
dependencies?: Dependency[];
}

export interface EnhancedFeatureInterface extends Omit<FeatureInterface, 'strategies'> {
strategies?: EnhancedStrategyTransportInterface[]
}

export interface ClientFeaturesResponse {
version: number;
features: FeatureInterface[];
Expand Down
4 changes: 2 additions & 2 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@ export function getFeatureToggleDefinition(toggleName: string) {
return instance && instance.getFeatureToggleDefinition(toggleName);
}

export function getFeatureToggleDefinitions() {
return instance && instance.getFeatureToggleDefinitions();
export function getFeatureToggleDefinitions(withFullSegments = false) {
return instance && instance.getFeatureToggleDefinitions(withFullSegments);
}

export function getVariant(
Expand Down
28 changes: 26 additions & 2 deletions src/repository/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { EventEmitter } from 'events';
import { ClientFeaturesResponse, FeatureInterface } from '../feature';
import { ClientFeaturesResponse, EnhancedFeatureInterface, FeatureInterface } from '../feature';
import { get } from '../request';
import { CustomHeaders, CustomHeadersFunction } from '../headers';
import getUrl from '../url-utils';
Expand All @@ -8,13 +8,18 @@ import { TagFilter } from '../tags';
import { BootstrapProvider } from './bootstrap-provider';
import { StorageProvider } from './storage-provider';
import { UnleashEvents } from '../events';
import { Segment } from '../strategy/strategy';
import {
EnhancedStrategyTransportInterface,
Segment,
StrategyTransportInterface,
} from '../strategy/strategy';

const SUPPORTED_SPEC_VERSION = '4.3.0';

export interface RepositoryInterface extends EventEmitter {
getToggle(name: string): FeatureInterface | undefined;
getToggles(): FeatureInterface[];
getTogglesWithSegmentData(): EnhancedFeatureInterface[];
getSegment(id: number): Segment | undefined;
stop(): void;
start(): Promise<void>;
Expand Down Expand Up @@ -405,4 +410,23 @@ Message: ${err.message}`,
getToggles(): FeatureInterface[] {
return Object.keys(this.data).map((key) => this.data[key]);
}

getTogglesWithSegmentData(): EnhancedFeatureInterface[] {
const toggles = this.getToggles();
return toggles.map((toggle): EnhancedFeatureInterface => {
const { strategies, ...restOfToggle } = toggle;

return { ...restOfToggle, strategies: this.enhanceStrategies(strategies) };
});
}

private enhanceStrategies = (
strategies: StrategyTransportInterface[]| undefined
): EnhancedStrategyTransportInterface[] | undefined => {
return strategies?.map(strategy => {
const { segments, ...restOfStrategy } = strategy;
const enhancedSegments = segments?.map(segment => this.getSegment(segment));
return { ...restOfStrategy, segments: enhancedSegments };
})
}
}
5 changes: 5 additions & 0 deletions src/strategy/strategy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,11 @@ export interface StrategyTransportInterface {
variants?: VariantDefinition[];
}

export interface EnhancedStrategyTransportInterface
extends Omit<StrategyTransportInterface, 'segments'> {
segments?: Array<Segment | undefined>
}

export interface Constraint {
contextName: string;
operator: Operator;
Expand Down

0 comments on commit 7c5406e

Please sign in to comment.