-
Notifications
You must be signed in to change notification settings - Fork 32
/
Copy pathtoggles.ts
58 lines (49 loc) · 1.88 KB
/
toggles.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
/* IFeatureToggles = string is a placeholder for an empty type. Replace string with a union type of new feature-toggles. Ex. 'feature1' | 'feature2' */
export type IFeatureToggles = string;
export type IFeatureToggleConf = {
[feature in IFeatureToggles]: {
defaultValue: boolean;
title: string;
description: string;
links: string[];
};
};
export const FeatureToggles: IFeatureToggleConf = {};
export type FeatureToggleSource = 'window' | 'cookie' | 'default';
export type IFeatureTogglesOptionalMap = { [key in IFeatureToggles]?: boolean };
export type IFeatureTogglesMap = { [key in IFeatureToggles]: boolean };
export type FeatureValue = { value: boolean; source: FeatureToggleSource };
export type AugmentedFeatureToggles = {
[key in IFeatureToggles]: (typeof FeatureToggles)[key] & FeatureValue & { key: IFeatureToggles };
};
export function getFeature(feature: IFeatureToggles): FeatureValue {
if (
window.featureToggles &&
feature in window.featureToggles &&
typeof window.featureToggles[feature] === 'boolean'
) {
return {
value: window.featureToggles[feature] as boolean,
source: 'window',
};
}
if (document.cookie.includes(`FEATURE_${feature}=true`)) {
return { value: true, source: 'cookie' };
}
if (document.cookie.includes(`FEATURE_${feature}=false`)) {
return { value: false, source: 'cookie' };
}
return { value: FeatureToggles[feature].defaultValue, source: 'default' };
}
export function getAugmentedFeatures(): AugmentedFeatureToggles {
const augmentedFeatures: AugmentedFeatureToggles = {} as AugmentedFeatureToggles;
for (const feature of Object.keys(FeatureToggles) as IFeatureToggles[]) {
augmentedFeatures[feature] = {
...FeatureToggles[feature],
...getFeature(feature),
key: feature,
};
}
return augmentedFeatures;
}
export const featureToggleValues: IFeatureTogglesMap = {};