diff --git a/package.json b/package.json index 808dd31..b860370 100644 --- a/package.json +++ b/package.json @@ -30,8 +30,10 @@ "vue" ], "main": "dist/vue-analytics.js", + "types": "vue-analytics.d.ts", "files": [ - "dist" + "dist", + "vue-analytics.d.ts" ], "author": { "name": "Matteo Gabriele", diff --git a/vue-analytics.d.ts b/vue-analytics.d.ts new file mode 100644 index 0000000..e9a28c6 --- /dev/null +++ b/vue-analytics.d.ts @@ -0,0 +1,132 @@ + +declare module 'vue-analytics' { + import _Vue, { PluginFunction } from 'vue'; + import VueRouter, { Route } from 'vue-router'; + + interface eventFn { + (category: string, action?: string, label?: string, value?: number): void; + (options: { + eventCategory: string, + eventAction: string, + eventLabel: string, + eventValue: number + }): void; + } + + type pageDetails = { + page: string, + title: string, + location: string + }; + + interface pageFn { + (path: string): void; + (options: pageDetails): void; + (route: VueRouter): void; + } + + interface setFn { + (fieldName: string, fieldValue: string): void; + (options: { + field: string, value: string + }): void; + } + + interface socialFn { + (network: string, action: string, target: string): void; + (options: { + socialNetwork: string, + socialAction: string, + socialTarget: string + }): void; + } + + interface timeFn { + (category: string, variable: string, value: number, label: string): void; + (options: { + timingCategory: string, + timingVar: string, + timingValue: number, + timingLabel: string + }): void; + } + + export default class VueAnalytics { + static install(Vue: typeof _Vue, options: { + id: string | string[] | (() => string) | (() => Promise) | Promise, + router?: VueRouter, + ignoreRoutes?: string[], + debug?: { + enabled?: boolean, + trace?: boolean, + sendHitTask?: boolean + }, + batch?: { + enabled?: boolean, + amount?: number, + delay?: number + }, + linkers?: string[], + customResourceURL?: string, + ecommerce?: { + enabled?: boolean, + enhanced?: boolean, + options?: any + }, + autoTracking?: { + exception?: boolean, + exceptionLogs?: boolean, + screenview?: boolean, + pageviewOnLoad?: boolean, + page?: boolean, + pageviewTemplate?: (route: Route) => pageDetails, + transformQueryString?: boolean, + prependBase?: boolean, + skipSamePath: boolean, + shouldRouterUpdate: (to: Route, from: Route) => string, + untracked?: boolean + }, + fields?: { + [field: string]: any + }, + customIdFields?: { + [id: string]: { + [field: string]: any + } + }, + disabled?: boolean | (() => boolean) | (() => Promise) | Promise, + checkDuplicatedScript?: boolean, + disableScriptLoader?: boolean + set?: { field: string, value: string }[], + commands?: any, + beforeFirstHit?: () => void, + ready?: () => void + }): void; + analyticsMiddleware: any; + onAnalyticsReady: () => Promise; + event: eventFn; + ecommerce: any; + set: setFn; + page: pageFn; + query: any; + screenview: ((screen: string) => void) | ((option: { screenName: string, [otherProperties: string]: any }) => void); + time: timeFn; + require: (pluginName: string, options?: any) => void; + exception: (exception: Error | string) => void; + social: socialFn; + disable: () => void; + enable: () => void; + } + + module 'vue/types/options' { + interface ComponentOptions { + ga?: VueAnalytics; + } + } + + module 'vue/types/vue' { + interface Vue { + $ga: VueAnalytics; + } + } +}