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
43import type { JsonType } from 'posthog-js';
import usePostHogFeatureFlag from '~/modules/posthog/runtime/composables/usePostHogFeatureFlag';
export default defineNuxtRouteMiddleware((to) => {
const posthogFeatureFlagPayloads = useState<Record<string, JsonType> | undefined>('ph-feature-flag-payloads');
if (!posthogFeatureFlagPayloads.value) return;
// Clone the Vue proxy object to a plain object
const payloads = JSON.parse(JSON.stringify(posthogFeatureFlagPayloads.value));
let redirectTo;
const { getFeatureFlag } = usePostHogFeatureFlag();
// Iterate over payload entries (flagName -> payload)
Object.entries(payloads).some(([_flagName, payload]) => {
if (
payload &&
typeof payload === 'object' &&
!Array.isArray(payload) &&
'experiment_type' in payload &&
'control_path' in payload &&
'path' in payload
) {
const expPayload = payload as { experiment_type: string; control_path: string; path: string };
if (expPayload.experiment_type === 'page') {
getFeatureFlag(_flagName);
if (to.path === expPayload.control_path && expPayload.control_path !== expPayload.path) {
redirectTo = expPayload.path;
return true;
}
}
}
});
if (redirectTo) {
return navigateTo(redirectTo);
}
});