Skip to content

Instantly share code, notes, and snippets.

@pwfisher
Created April 20, 2021 19:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pwfisher/e550c8a58b052c12dd503a6f30eb8bc4 to your computer and use it in GitHub Desktop.
Save pwfisher/e550c8a58b052c12dd503a6f30eb8bc4 to your computer and use it in GitHub Desktop.
Optimizely Client Side Types
/**
* @see https://docs.developers.optimizely.com/web/docs
*
* globalThis.optimizely?.get('state').getVariationMap()
* {
* 20015858428: { id: "20020533131", name: null, index: null },
* 20104572923: { id: "20121934640", name: "v1", index: 0 },
* }
*/
/**
* Dictionary: Record replacement, handle undefined values.
* @see https://fnune.com/typescript/2019/01/30/typescript-series-1-record-is-usually-not-the-best-choice/
*/
type DictionaryKey = string | number | symbol
export type Dictionary<K extends DictionaryKey, T> = { [P in K]?: T }
type Option = { id: string; name: string }
// ------
type CampaignState = {
allExperiments: Option[]
audiences: Option[]
campaignName: string | null
experiment: Option | null
id: string
isActive: boolean
isInCampaignHoldback: boolean
reason: undefined | string // 'force'
variation: Option
visitorRedirected: boolean
}
type Command = { type: string; eventName: string; tags: Object }
type ConditionOperator = 'or' | 'and'
type ConditionValue = { type: string; value: string; match: string }
type Condition = ConditionOperator | ConditionValue | Condition[]
type Decision = { campaign?: string; experiment: string; variation: string; holdback?: boolean }
type DecisionConfig = { campaignId: string; shouldCleanString: boolean; maxLength: number }
type EventBase = { c: string; hash_: string; n: string; y: string }
type Event = { eventBase: EventBase; s: number; si: number; t: number }
type ExperimentState = {
audiences: Option[]
experimentName: string
id: string
isActive: boolean
isInExperimentHoldback: boolean
reason?: string | unknown
variation: Option
visitorRedirected: boolean
}
type FilterObject = { isActive?: boolean }
type FilterFunction = (campaignState: CampaignState) => boolean
type Filter = FilterObject | FilterFunction
type GetKey =
| 'behavior'
| 'data'
| 'dcp'
| 'jquery'
| 'session'
| 'state'
| 'utils'
| 'visitor'
| 'visitor_id'
type Location = { city: string; continent: string; country: string; region: string }
type PageTag = {
apiName: string
category: string
locator: string
locatorType: string
valueType: string
}
type PageState = {
apiName: string
category: string
id: string
isActive: boolean
metadata: Object
name: string
staticConditions: Condition[]
tags: PageTag[]
}
type RedirectInfo = { experimentId: string; variationId: string; referrer: string }
type Variation = { id: string; name: string | null; index: number | null }
type VariationMap = Dictionary<string, Variation>
type Visitor = {
browserId: string // 'gc'
browserVersion: string
currentTimestamp: number
customBehavior: unknown
device: string // 'desktop'
device_type: string // 'desktop_laptop'
events: Event[]
first_session: boolean
location: Location
offset: number
referrer: null | unknown
source_type: string
visitorId: string
}
type VisitorId = { randomId: string }
// ------
export interface OptimizelyState {
getActivationId: () => string
getActiveExperimentIds: () => string[]
getCampaignStateLists: () => Dictionary<string, CampaignState[]>
getCampaignStates: (filter?: Filter) => Dictionary<string, CampaignState>
getDecisionObject: (config: DecisionConfig) => Decision | null
getDecisionString: (config: DecisionConfig) => string | null
getExperimentStates: (filter?: Filter) => Dictionary<string, ExperimentState>
getPageStates: (filter?: Filter) => Dictionary<string, PageState>
getRedirectInfo: () => RedirectInfo | null
getVariationMap: () => VariationMap
isGlobalHoldback: () => boolean
}
export interface Optimizely {
get: (key: GetKey) => OptimizelyState | Visitor | VisitorId | unknown // others omitted
push: (command: Command) => void
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment