-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathtypesFromDefinitions.ts
48 lines (40 loc) · 1.26 KB
/
typesFromDefinitions.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
import type { ClientFeaturesResponse } from "unleash-client";
export const typesFromDefinitions = (definitions: ClientFeaturesResponse) => {
const { features } = definitions;
const featureVariants = features.length
? "export type FeaturesVariantMap = {" +
features
.map(({ name, variants }) => {
if (!variants?.length) {
return `\n "${name}": [{ "name": "disabled", "enabled": false }]`;
}
return `\n "${name}": [${variants
?.map(
(variant) =>
`${variants.length > 1 ? "\n " : ""}{ "name": "${
variant.name
}"; "enabled": true; "payload": ${JSON.stringify(
variant.payload
)} }`
)
.join(" |")}]`;
})
.join(",") +
"\n};"
: "export type FeaturesVariantMap = {};";
return `${featureVariants}
export type FeatureName = keyof FeaturesVariantMap;
export type FeatureVariants = {
[T in FeatureName]: FeaturesVariantMap[T];
};
type FeaturesMap = {
[T in FeatureName]: {
name: T;
enabled: boolean;
variant: FeatureVariants[T][number];
impressionData: boolean;
};
};
export type Features = Array<FeaturesMap[keyof FeaturesMap]>;
`;
};