-
-
Notifications
You must be signed in to change notification settings - Fork 768
/
Copy pathflag-resolver.ts
81 lines (70 loc) · 2.4 KB
/
flag-resolver.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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import { type Variant, PayloadType } from 'unleash-client';
import type {
IExperimentalOptions,
IExternalFlagResolver,
IFlagContext,
IFlags,
IFlagResolver,
IFlagKey,
} from '../types/experimental';
import { getDefaultVariant } from 'unleash-client/lib/variant';
export default class FlagResolver implements IFlagResolver {
private experiments: IFlags;
private externalResolver: IExternalFlagResolver;
constructor(expOpt: IExperimentalOptions) {
this.experiments = expOpt.flags;
this.externalResolver = expOpt.externalResolver;
}
getAll(context?: IFlagContext): IFlags {
const flags: IFlags = { ...this.experiments };
Object.keys(flags).forEach((flagName: IFlagKey) => {
const flag = flags[flagName];
if (typeof flag === 'boolean') {
if (!flag) {
flags[flagName] = this.externalResolver.isEnabled(
flagName,
context,
);
}
} else {
if (!flag?.enabled) {
flags[flagName] = this.externalResolver.getVariant(
flagName,
context,
);
}
}
});
return flags;
}
isEnabled(expName: IFlagKey, context?: IFlagContext): boolean {
const exp = this.experiments[expName];
if (exp) {
if (typeof exp === 'boolean') return exp;
else return exp.enabled;
}
return this.externalResolver.isEnabled(expName, context);
}
getVariant(expName: IFlagKey, context?: IFlagContext): Variant {
const exp = this.experiments[expName];
if (exp) {
if (typeof exp === 'boolean') return getDefaultVariant();
else if (exp.enabled) return exp;
}
return this.externalResolver.getVariant(expName, context);
}
getStaticContext(): IFlagContext {
return this.externalResolver.getStaticContext();
}
}
export const getVariantValue = <T = string>(
variant: Variant | undefined,
): T | undefined => {
if (variant?.enabled) {
if (!variant.payload) return variant.name as T;
if (variant.payload.type === PayloadType.JSON) {
return JSON.parse(variant.payload.value) as T;
}
return variant.payload.value as T;
}
};