123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- import type {experimentList, unassignedValue} from 'sentry/data/experimentConfig';
- /**
- * The grouping of the experiment
- */
- export enum ExperimentType {
- ORGANIZATION = 'organization',
- USER = 'user',
- }
- /**
- * An experiment configuration object defines an experiment in the frontend.
- * This drives various logic in experiment helpers.
- */
- export type ExperimentConfig = {
- /**
- * Possible assignment values of the experiment
- */
- assignments: ReadonlyArray<string | number | typeof unassignedValue>;
- /**
- * The name of the organization. This maps to the key exposed by the
- * organization manager on the backend.
- */
- key: string;
- /**
- * The parameter used to access the assignment value
- */
- parameter: string | 'variant' | 'exposed';
- /**
- * The type of experiment. This configures what group the experiment is
- * performed on.
- *
- * A Organization experiment assigns the whole organization.
- * A User experiment assigns a single user.
- */
- type: ExperimentType;
- };
- // NOTE: The code below is mostly type mechanics to provide utility types
- // around experiments for use in experiment helpers. You probably don't need to
- // modify this and likely just need to make changes to the experiment list [0]
- //
- // [0]: app/data/experimentConfig.tsx
- type ExperimentList = (typeof experimentList)[number];
- type ExperimentSelect<
- C extends ExperimentConfig,
- N extends ExperimentConfig['key'],
- > = C extends {key: N} ? C : never;
- type TypeSelect<
- C extends ExperimentConfig,
- T extends ExperimentConfig['type'],
- > = C extends {type: T} ? C : never;
- /**
- * A mapping of experiment key to the experiment configuration.
- */
- export type Experiments = {
- [E in ExperimentList['key']]: ExperimentSelect<ExperimentList, E>;
- };
- /**
- * Represents an active experiment key
- */
- export type ExperimentKey = keyof Experiments;
- type GetExperimentAssignment<E extends ExperimentList['key']> = {
- [K in E]: Experiments[K]['assignments'][number];
- };
- export type OrgExperiments = GetExperimentAssignment<
- TypeSelect<ExperimentList, ExperimentType.ORGANIZATION>['key']
- >;
- export type UserExperiments = GetExperimentAssignment<
- TypeSelect<ExperimentList, ExperimentType.USER>['key']
- >;
- export type ExperimentAssignment = GetExperimentAssignment<ExperimentList['key']>;
|