/** * Internal dependencies */ import type { Experiment } from './experiments'; import type { Url } from './utils'; import type { PostId } from './wordpress'; export type OptimizationScore = { readonly value: number; readonly breakdown: { readonly running: number; readonly recentlyFinished: number; readonly cadence: number; readonly coverage: number; readonly inactivityPenalty: number; }; }; export type Opportunity = OpportunityDetails & { readonly score: number; readonly target: OpportunityTarget; }; export type OpportunityType = Opportunity[ 'type' ]; export type OpportunityTarget = | { readonly type: 'post'; readonly postType: string; readonly postId: PostId; readonly title: string; readonly url: Url; } | { readonly type: 'url'; readonly title: string; readonly url: Url; }; export type KeyPageMeta = { readonly reason: string; }; export type OpportunityMultipleReasonsMeta = { readonly opportunities: ReadonlyArray< Opportunity >; }; export type OpportunityViewsMeta = { readonly views: number; }; export type OpportunityPostMeta = { readonly publishDate: string; }; export type OpportunityExperimentMeta = { readonly experiment: { readonly experimentId: Experiment[ 'id' ]; readonly experimentName: Experiment[ 'name' ]; readonly experimentType: Experiment[ 'type' ]; readonly description: Experiment[ 'description' ]; readonly alternatives: Experiment[ 'alternatives' ]; readonly goals: Experiment[ 'goals' ]; readonly segments: Experiment[ 'segments' ]; readonly testedAt: Experiment[ 'endDate' ]; }; }; export type RunningExperimentSummary = { readonly id: Experiment[ 'id' ]; readonly type: string; readonly name: string; readonly startedAt: string; readonly alternativeCount: number; readonly resultUrl: string; }; export type PendingExperimentSummary = { readonly id: Experiment[ 'id' ]; readonly type: string; readonly name: string; readonly editUrl: string; }; export type FinishedExperimentSummary = { readonly id: Experiment[ 'id' ]; readonly name: Experiment[ 'name' ]; readonly endDate: string; readonly resultUrl: string; }; // ======= // HELPERS // ======= type OpportunityDetails = | { readonly type: 'multiple-reasons'; readonly meta: OpportunityMultipleReasonsMeta; } | { readonly type: 'key-page'; readonly meta: KeyPageMeta; } | { readonly type: 'high-traffic'; readonly meta: OpportunityViewsMeta; } | { readonly type: 'recently-finished-experiment'; readonly meta: OpportunityExperimentMeta; } | { readonly type: 'recently-published'; readonly meta: OpportunityPostMeta; } | { readonly type: 'stale-experiment'; readonly meta: OpportunityExperimentMeta; };