diff --git a/tracker/index.d.ts b/tracker/index.d.ts index 67cebc08..f9bd4b24 100644 --- a/tracker/index.d.ts +++ b/tracker/index.d.ts @@ -1,4 +1,4 @@ -type TrackedProperties = { +export type TrackedProperties = { /** * Hostname of server * @@ -55,7 +55,7 @@ type TrackedProperties = { website: string; }; -type WithRequired = T & { [P in K]-?: T[P] } +export type WithRequired = T & { [P in K]-?: T[P] }; /** * @@ -65,74 +65,89 @@ type WithRequired = T & { [P in K]-?: T[P] } * - Arrays are converted to a String, with the same max length of 500. * - Objects have a max of 50 properties. Arrays are considered 1 property. */ -type EventData = Record; -type EventProperties = { +export interface EventData { + [key: string]: number | string | EventData | number[] | string[] | EventData[]; +} + +export type EventProperties = { + /** + * NOTE: event names will be truncated past 50 characters + */ name: string; data?: EventData; -} & WithRequired -| WithRequired; +} & WithRequired; +export type PageViewProperties = WithRequired; +export type CustomEventFunction = ( + props: PageViewProperties, +) => EventProperties | PageViewProperties; + +export type UmamiTracker = { + track: { + /** + * Track a page view + * + * @example ``` + * umami.track(); + * ``` + */ + (): Promise; + + /** + * Track an event with a given name + * + * NOTE: event names will be truncated past 50 characters + * + * @example ``` + * umami.track('signup-button'); + * ``` + */ + (eventName: string): Promise; + + /** + * Tracks an event with dynamic data. + * + * NOTE: event names will be truncated past 50 characters + * + * When tracking events, the default properties are included in the payload. This is equivalent to running: + * + * ```js + * umami.track(props => ({ + * ...props, + * name: 'signup-button', + * data: { + * name: 'newsletter', + * id: 123 + * } + * })); + * ``` + * + * @example ``` + * umami.track('signup-button', { name: 'newsletter', id: 123 }); + * ``` + */ + (eventName: string, obj: EventData): Promise; + + /** + * Tracks a page view with custom properties + * + * @example ``` + * umami.track({ website: 'e676c9b4-11e4-4ef1-a4d7-87001773e9f2', url: '/home', title: 'Home page' }); + * ``` + */ + (properties: PageViewProperties): Promise; + + /** + * Tracks an event with fully customizable dynamic data + * Ilf you don't specify any `name` and/or `data`, it will be treated as a page view + * + * @example ``` + * umami.track((props) => ({ ...props, url: path })); + * ``` + */ + (eventFunction: CustomEventFunction): Promise; + }; +}; interface Window { - umami: { - track: { - /** - * Track a page view - * - * @example ``` - * umami.track(); - * ``` - */ - (): Promise; - - /** - * Track an event with a given name - * - * @example ``` - * umami.track('signup-button'); - * ``` - */ - (eventName: string): Promise; - - /** - * Tracks an event with dynamic data. - * - * When tracking events, the default properties are included in the payload. This is equivalent to running: - * - * ```js - * umami.track(props => ({ - * ...props, - * name: 'signup-button', - * data: { - * name: 'newsletter', - * id: 123 - * } - * })); - * ``` - * - * @example ``` - * umami.track('signup-button', { name: 'newsletter', id: 123 }); - * ``` - */ - (eventName: string, obj: EventData): Promise; - - /** - * Tracks a page view with custom properties - * - * @example ``` - * umami.track({ website: 'e676c9b4-11e4-4ef1-a4d7-87001773e9f2', url: '/home', title: 'Home page' }); - * ``` - */ - (properties: WithRequired, 'website'>): Promise; - - /** - * Tracks an event with fully customizable dynamic data - * Ilf you don't specify any `name` and/or `data`, it will be treated as a page view - * - * @example ``` - * umami.track((props) => ({ ...props, url: path })); - * ``` - */ - (eventFunction: (prop: TrackedProperties) => EventProperties): Promise; - }; - }; + umami: UmamiTracker; }