Files
JiaZhiQianYan/node_modules/@posthog/core/dist/featureFlagUtils.mjs
2025-11-26 17:19:38 +08:00

114 lines
4.2 KiB
JavaScript

const normalizeFlagsResponse = (flagsResponse)=>{
if ('flags' in flagsResponse) {
const featureFlags = getFlagValuesFromFlags(flagsResponse.flags);
const featureFlagPayloads = getPayloadsFromFlags(flagsResponse.flags);
return {
...flagsResponse,
featureFlags,
featureFlagPayloads
};
}
{
const featureFlags = flagsResponse.featureFlags ?? {};
const featureFlagPayloads = Object.fromEntries(Object.entries(flagsResponse.featureFlagPayloads || {}).map(([k, v])=>[
k,
parsePayload(v)
]));
const flags = Object.fromEntries(Object.entries(featureFlags).map(([key, value])=>[
key,
getFlagDetailFromFlagAndPayload(key, value, featureFlagPayloads[key])
]));
return {
...flagsResponse,
featureFlags,
featureFlagPayloads,
flags
};
}
};
function getFlagDetailFromFlagAndPayload(key, value, payload) {
return {
key: key,
enabled: 'string' == typeof value ? true : value,
variant: 'string' == typeof value ? value : void 0,
reason: void 0,
metadata: {
id: void 0,
version: void 0,
payload: payload ? JSON.stringify(payload) : void 0,
description: void 0
}
};
}
const getFlagValuesFromFlags = (flags)=>Object.fromEntries(Object.entries(flags ?? {}).map(([key, detail])=>[
key,
getFeatureFlagValue(detail)
]).filter(([, value])=>void 0 !== value));
const getPayloadsFromFlags = (flags)=>{
const safeFlags = flags ?? {};
return Object.fromEntries(Object.keys(safeFlags).filter((flag)=>{
const details = safeFlags[flag];
return details.enabled && details.metadata && void 0 !== details.metadata.payload;
}).map((flag)=>{
const payload = safeFlags[flag].metadata?.payload;
return [
flag,
payload ? parsePayload(payload) : void 0
];
}));
};
const getFlagDetailsFromFlagsAndPayloads = (flagsResponse)=>{
const flags = flagsResponse.featureFlags ?? {};
const payloads = flagsResponse.featureFlagPayloads ?? {};
return Object.fromEntries(Object.entries(flags).map(([key, value])=>[
key,
{
key: key,
enabled: 'string' == typeof value ? true : value,
variant: 'string' == typeof value ? value : void 0,
reason: void 0,
metadata: {
id: void 0,
version: void 0,
payload: payloads?.[key] ? JSON.stringify(payloads[key]) : void 0,
description: void 0
}
}
]));
};
const getFeatureFlagValue = (detail)=>void 0 === detail ? void 0 : detail.variant ?? detail.enabled;
const parsePayload = (response)=>{
if ('string' != typeof response) return response;
try {
return JSON.parse(response);
} catch {
return response;
}
};
const createFlagsResponseFromFlagsAndPayloads = (featureFlags, featureFlagPayloads)=>{
const allKeys = [
...new Set([
...Object.keys(featureFlags ?? {}),
...Object.keys(featureFlagPayloads ?? {})
])
];
const enabledFlags = allKeys.filter((flag)=>!!featureFlags[flag] || !!featureFlagPayloads[flag]).reduce((res, key)=>(res[key] = featureFlags[key] ?? true, res), {});
const flagDetails = {
featureFlags: enabledFlags,
featureFlagPayloads: featureFlagPayloads ?? {}
};
return normalizeFlagsResponse(flagDetails);
};
const updateFlagValue = (flag, value)=>({
...flag,
enabled: getEnabledFromValue(value),
variant: getVariantFromValue(value)
});
function getEnabledFromValue(value) {
return 'string' == typeof value ? true : value;
}
function getVariantFromValue(value) {
return 'string' == typeof value ? value : void 0;
}
export { createFlagsResponseFromFlagsAndPayloads, getFeatureFlagValue, getFlagDetailsFromFlagsAndPayloads, getFlagValuesFromFlags, getPayloadsFromFlags, normalizeFlagsResponse, parsePayload, updateFlagValue };