rozmova-analytics 1.0.1 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,6 @@
1
+ import { AnalyticsCommonParams } from "./types";
2
+ export declare const generateUserId: () => string;
3
+ export declare const getUserId: () => string;
4
+ export declare const getCommonParams: () => AnalyticsCommonParams;
5
+ export declare const init: (additionalParams?: Record<string, string>) => void;
6
+ export declare const trackEvent: (eventName: string, properties?: {}) => void;
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.trackEvent = exports.init = exports.getUserId = exports.getCommonParams = exports.generateUserId = void 0;
7
+ var _jsCookie = _interopRequireDefault(require("js-cookie"));
8
+ var _mixpanelBrowser = _interopRequireDefault(require("mixpanel-browser"));
9
+ var _nanoid = require("nanoid");
10
+ var _constants = require("./constants");
11
+ var _helpers = require("./helpers");
12
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
13
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
14
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
15
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
16
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
17
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
18
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
19
+ var generateUserId = exports.generateUserId = function generateUserId() {
20
+ var userId = (0, _nanoid.nanoid)();
21
+ var domain = (0, _helpers.getDomain)();
22
+ _jsCookie["default"].set(_constants.USER_ID_KEY, userId, {
23
+ domain: domain
24
+ });
25
+ localStorage.setItem(_constants.USER_ID_KEY, userId);
26
+ return userId;
27
+ };
28
+ var getUserId = exports.getUserId = function getUserId() {
29
+ return _jsCookie["default"].get(_constants.USER_ID_KEY) || localStorage.getItem(_constants.USER_ID_KEY) || (0, _helpers.getQueryParam)(_constants.USER_ID_KEY) || generateUserId();
30
+ };
31
+ var getCurrentParams = function getCurrentParams() {
32
+ var paramsFromCookie = _jsCookie["default"].get(_constants.PARAMS_COOKIE_NAME);
33
+ var prevParams = paramsFromCookie ? JSON.parse(paramsFromCookie) : {};
34
+ var searchParams = new URLSearchParams(window.location.search);
35
+ var isNewSetUTM = _constants.UTM_KEYS.some(function (utmKey) {
36
+ return searchParams.get(utmKey) && searchParams.get(utmKey) !== prevParams[utmKey];
37
+ });
38
+ var currentUTMParams = isNewSetUTM ? _constants.UTM_KEYS.reduce(function (prev, curr) {
39
+ return _objectSpread(_objectSpread({}, prev), {}, _defineProperty({}, curr, searchParams.get(curr)));
40
+ }, {}) : _constants.UTM_KEYS.reduce(function (prev, curr) {
41
+ return _objectSpread(_objectSpread({}, prev), {}, _defineProperty({}, curr, prevParams[curr]));
42
+ }, {});
43
+ var currentParams = _objectSpread(_objectSpread({}, currentUTMParams), {}, {
44
+ referrer: (0, _helpers.getReferrer)() || prevParams.referrer,
45
+ search_query: (0, _helpers.getSearchQueryFromReferrer)() || prevParams.search_query,
46
+ landing_page_url: prevParams.landing_page_url || window.location.href
47
+ });
48
+ _jsCookie["default"].set(_constants.PARAMS_COOKIE_NAME, JSON.stringify(currentParams), {
49
+ domain: (0, _helpers.getDomain)()
50
+ });
51
+ return currentParams;
52
+ };
53
+ var getCommonParams = exports.getCommonParams = function getCommonParams() {
54
+ var persistedParams = getCurrentParams();
55
+ return _objectSpread(_objectSpread({}, persistedParams), {}, {
56
+ fbc: _jsCookie["default"].get("_fbc"),
57
+ fbp: _jsCookie["default"].get("_fbp"),
58
+ session_id: (0, _helpers.getGASessionId)(),
59
+ user_pseudo_id: (0, _helpers.getGAClientId)(),
60
+ rid: getUserId(),
61
+ funnel_name: _jsCookie["default"].get("funnel_name"),
62
+ funnel_type: _jsCookie["default"].get("funnel_type"),
63
+ language: (0, _helpers.getBrowserLanguage)(),
64
+ platform: "web",
65
+ url: window.location.href,
66
+ device: (0, _helpers.detectDeviceType)(),
67
+ browser: (0, _helpers.detectBrowser)(),
68
+ system: (0, _helpers.detectOS)()
69
+ });
70
+ };
71
+ var init = exports.init = function init() {
72
+ var additionalParams = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
73
+ var userId = getUserId();
74
+ if ((0, _helpers.isMetaBrowser)()) {
75
+ (0, _helpers.setQueryParam)(_constants.USER_ID_KEY, userId);
76
+ }
77
+ (0, _helpers.waitForGA)(function () {
78
+ _mixpanelBrowser["default"].init(_constants.MIXPANEL_TOKEN, {
79
+ debug: false,
80
+ track_pageview: "url-with-path",
81
+ persistence: "cookie"
82
+ });
83
+ var userProperties = _objectSpread(_objectSpread({}, getCommonParams()), additionalParams);
84
+ _mixpanelBrowser["default"].register(userProperties);
85
+ gtag("config", _constants.GOOGLE_ANALYTICS_ID, {
86
+ user_properties: userProperties,
87
+ server_container_url: _constants.GA_SERVER_CONTAINER_URL
88
+ });
89
+ });
90
+ };
91
+ var trackEvent = exports.trackEvent = function trackEvent(eventName) {
92
+ var properties = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
93
+ (0, _helpers.waitForGA)(function () {
94
+ var commonParams = getCommonParams();
95
+ var params = _objectSpread(_objectSpread({}, commonParams), properties);
96
+ try {
97
+ _mixpanelBrowser["default"].track(eventName, params);
98
+ } catch (e) {
99
+ console.log(e);
100
+ }
101
+ try {
102
+ gtag("event", eventName, params);
103
+ } catch (e) {
104
+ console.log(e);
105
+ }
106
+ });
107
+ };
@@ -0,0 +1,6 @@
1
+ export declare const USER_ID_KEY = "rid";
2
+ export declare const PARAMS_COOKIE_NAME = "rozmovaAnalyticsParams";
3
+ export declare const UTM_KEYS: string[];
4
+ export declare const GOOGLE_ANALYTICS_ID = "G-9PCTLFE0F6";
5
+ export declare const GA_SERVER_CONTAINER_URL = "https://tagging.clearly.help";
6
+ export declare const MIXPANEL_TOKEN = "9d4cb3d213e5aee689ea01dd68ad65ad";
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.UTM_KEYS = exports.USER_ID_KEY = exports.PARAMS_COOKIE_NAME = exports.MIXPANEL_TOKEN = exports.GOOGLE_ANALYTICS_ID = exports.GA_SERVER_CONTAINER_URL = void 0;
7
+ var USER_ID_KEY = exports.USER_ID_KEY = "rid";
8
+ var PARAMS_COOKIE_NAME = exports.PARAMS_COOKIE_NAME = "rozmovaAnalyticsParams";
9
+ var UTM_KEYS = exports.UTM_KEYS = ["utm_source", "utm_medium", "utm_campaign", "utm_campaign_id", "utm_advertiser_id", "utm_adset_id", "utm_adset_name", "utm_ad_id", "utm_ad_name", "utm_keyword"];
10
+ var GOOGLE_ANALYTICS_ID = exports.GOOGLE_ANALYTICS_ID = "G-9PCTLFE0F6";
11
+ var GA_SERVER_CONTAINER_URL = exports.GA_SERVER_CONTAINER_URL = "https://tagging.clearly.help";
12
+ var MIXPANEL_TOKEN = exports.MIXPANEL_TOKEN = "9d4cb3d213e5aee689ea01dd68ad65ad";
@@ -0,0 +1,13 @@
1
+ export declare const setQueryParam: (name: string, value: string) => void;
2
+ export declare const getQueryParam: (name: string) => string | null;
3
+ export declare const isMetaBrowser: () => any;
4
+ export declare const getBrowserLanguage: () => string;
5
+ export declare function detectBrowser(): "Microsoft Edge" | "Chrome" | "Firefox" | "Safari" | "Opera" | "Internet Explorer" | "Unknown";
6
+ export declare function detectDeviceType(): "Mobile" | "Desktop";
7
+ export declare function detectOS(): "Windows" | "macOS" | "Linux" | "Android" | "iOS" | "Unknown OS";
8
+ export declare const getDomain: () => string;
9
+ export declare const getReferrer: () => string | null;
10
+ export declare function getSearchQueryFromReferrer(): string | null;
11
+ export declare const getGAClientId: () => string;
12
+ export declare function getGASessionId(): string | null;
13
+ export declare const waitForGA: (callback: () => void) => void;
@@ -0,0 +1,152 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.detectBrowser = detectBrowser;
7
+ exports.detectDeviceType = detectDeviceType;
8
+ exports.detectOS = detectOS;
9
+ exports.getGAClientId = exports.getDomain = exports.getBrowserLanguage = void 0;
10
+ exports.getGASessionId = getGASessionId;
11
+ exports.getReferrer = exports.getQueryParam = void 0;
12
+ exports.getSearchQueryFromReferrer = getSearchQueryFromReferrer;
13
+ exports.waitForGA = exports.setQueryParam = exports.isMetaBrowser = void 0;
14
+ var _jsCookie = _interopRequireDefault(require("js-cookie"));
15
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
16
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
17
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
18
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
19
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
20
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
21
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
22
+ var setQueryParam = exports.setQueryParam = function setQueryParam(name, value) {
23
+ var url = new URL(window.location.href);
24
+ url.searchParams.set(name, value);
25
+ window.history.replaceState({
26
+ path: url.toString()
27
+ }, "", url.toString());
28
+ };
29
+ var getQueryParam = exports.getQueryParam = function getQueryParam(name) {
30
+ var searchParams = new URLSearchParams(window.location.search);
31
+ return searchParams.get(name);
32
+ };
33
+ var isMetaBrowser = exports.isMetaBrowser = function isMetaBrowser() {
34
+ // @ts-expect-error opera property
35
+ var ua = navigator.userAgent || navigator.vendor || window.opera;
36
+ return ua.match(/FBAN|FBAV|Instagram/i);
37
+ };
38
+ var getBrowserLanguage = exports.getBrowserLanguage = function getBrowserLanguage() {
39
+ return window.navigator.language;
40
+ };
41
+ function detectBrowser() {
42
+ var userAgent = navigator.userAgent;
43
+ if (userAgent.indexOf("Edg") > -1) {
44
+ return "Microsoft Edge";
45
+ } else if (userAgent.indexOf("Chrome") > -1) {
46
+ return "Chrome";
47
+ } else if (userAgent.indexOf("Firefox") > -1) {
48
+ return "Firefox";
49
+ } else if (userAgent.indexOf("Safari") > -1) {
50
+ return "Safari";
51
+ } else if (userAgent.indexOf("Opera") > -1) {
52
+ return "Opera";
53
+ } else if (userAgent.indexOf("Trident") > -1 || userAgent.indexOf("MSIE") > -1) {
54
+ return "Internet Explorer";
55
+ }
56
+ return "Unknown";
57
+ }
58
+ function detectDeviceType() {
59
+ var userAgent = navigator.userAgent;
60
+ if (/Mobi|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(userAgent)) {
61
+ return "Mobile";
62
+ } else {
63
+ return "Desktop";
64
+ }
65
+ }
66
+ function detectOS() {
67
+ var userAgent = navigator.userAgent;
68
+ if (userAgent.includes("Win")) {
69
+ return "Windows";
70
+ } else if (userAgent.includes("Mac")) {
71
+ return "macOS";
72
+ } else if (userAgent.includes("X11") || userAgent.includes("Linux")) {
73
+ return "Linux";
74
+ } else if (userAgent.includes("Android")) {
75
+ return "Android";
76
+ } else if (userAgent.includes("like Mac")) {
77
+ return "iOS";
78
+ } else {
79
+ return "Unknown OS";
80
+ }
81
+ }
82
+ var getDomain = exports.getDomain = function getDomain() {
83
+ var domainParts = window.location.hostname.split(".");
84
+ var domainPartsLength = domainParts.length;
85
+ if (domainParts.length === 1) return domainParts[0];
86
+ return domainParts.slice(domainPartsLength - 2, domainPartsLength).join(".");
87
+ };
88
+ var getReferrer = exports.getReferrer = function getReferrer() {
89
+ var referrer = document.referrer;
90
+ if (referrer) {
91
+ var url = new URL(referrer);
92
+ if (url.hostname.includes(getDomain())) {
93
+ return null;
94
+ }
95
+ }
96
+ return referrer;
97
+ };
98
+ function getSearchQueryFromReferrer() {
99
+ // Get the referrer URL (the page that linked to your site)
100
+ var referrer = getReferrer();
101
+ if (!referrer) {
102
+ return null; // No referrer, likely a direct visit or from a link without referrer
103
+ }
104
+
105
+ // Define search engine domains and their query parameter for search terms
106
+ var searchEngines = {
107
+ "google.com": "q",
108
+ "bing.com": "q",
109
+ "yahoo.com": "p",
110
+ "duckduckgo.com": "q",
111
+ "ask.com": "q",
112
+ "baidu.com": "wd",
113
+ "yandex.com": "text"
114
+ };
115
+
116
+ // Create a URL object for the referrer
117
+ var referrerUrl = new URL(referrer);
118
+
119
+ // Check if the referrer is a known search engine
120
+ for (var _i = 0, _Object$entries = Object.entries(searchEngines); _i < _Object$entries.length; _i++) {
121
+ var _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2),
122
+ domain = _Object$entries$_i[0],
123
+ queryParam = _Object$entries$_i[1];
124
+ if (referrerUrl.hostname.includes(domain)) {
125
+ // If the referrer is a search engine, extract the search query
126
+ var searchQuery = referrerUrl.searchParams.get(queryParam);
127
+ return searchQuery ? decodeURIComponent(searchQuery) : null;
128
+ }
129
+ }
130
+
131
+ // If no match with search engines, return null
132
+ return null;
133
+ }
134
+ var getGAClientId = exports.getGAClientId = function getGAClientId() {
135
+ var clientId = _jsCookie["default"].get("_ga");
136
+ if (!clientId) return "";
137
+ var splitedClientId = clientId.split(".");
138
+ return splitedClientId[2] + "." + splitedClientId[3];
139
+ };
140
+ function getGASessionId() {
141
+ // Use your own ID here ↓
142
+ var pattern = /_ga_9PCTLFE0F6=GS\d\.\d\.(.+?)(?:;|$)/;
143
+ var match = document.cookie.match(pattern);
144
+ var parts = match === null || match === void 0 ? void 0 : match[1].split(".");
145
+ if (parts) return parts[0];
146
+ return null;
147
+ }
148
+ var _waitForGA = exports.waitForGA = function waitForGA(callback) {
149
+ if (getGASessionId()) callback();else setTimeout(function () {
150
+ return _waitForGA(callback);
151
+ }, 1000);
152
+ };
package/dist/index.d.ts CHANGED
@@ -1,4 +1,7 @@
1
- declare const Analytics: {
2
- init(): void;
1
+ export declare const Analytics: {
2
+ getUserId: () => string;
3
+ generateUserId: () => string;
4
+ init: (additionalParams?: Record<string, string>) => void;
5
+ getCommonParams: () => import("./types").AnalyticsCommonParams;
6
+ trackEvent: (eventName: string, properties?: {}) => void;
3
7
  };
4
- export default Analytics;
package/dist/index.js CHANGED
@@ -3,10 +3,12 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports["default"] = void 0;
7
- var Analytics = {
8
- init: function init() {
9
- console.log("init");
10
- }
11
- };
12
- var _default = exports["default"] = Analytics;
6
+ exports.Analytics = void 0;
7
+ var _analytics = require("./analytics");
8
+ var Analytics = exports.Analytics = {
9
+ getUserId: _analytics.getUserId,
10
+ generateUserId: _analytics.generateUserId,
11
+ init: _analytics.init,
12
+ getCommonParams: _analytics.getCommonParams,
13
+ trackEvent: _analytics.trackEvent
14
+ };
@@ -0,0 +1,28 @@
1
+ export type AnalyticsCommonParams = {
2
+ utm_source: string;
3
+ utm_medium: string;
4
+ utm_campaign: string;
5
+ utm_campaign_id: string;
6
+ utm_advertiser_id: string;
7
+ utm_adset_id: string;
8
+ utm_adset_name: string;
9
+ utm_ad_id: string;
10
+ utm_ad_name: string;
11
+ utm_keyword: string;
12
+ referrer: string;
13
+ search_query: string;
14
+ landing_page_url: string;
15
+ fbp?: string;
16
+ fbc?: string;
17
+ session_id: string | null;
18
+ user_pseudo_id: string;
19
+ funnel_name?: string;
20
+ funnel_type?: string;
21
+ language: string;
22
+ platform: string;
23
+ url: string;
24
+ device: string;
25
+ browser: string;
26
+ system: string;
27
+ rid: string;
28
+ };
package/dist/types.js ADDED
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
package/package.json CHANGED
@@ -1,16 +1,16 @@
1
1
  {
2
2
  "name": "rozmova-analytics",
3
- "version": "1.0.1",
4
- "description": "A collection of JavaScript functions for analytics (Google Analytics, Mixpanel, etc.).",
3
+ "version": "1.0.3",
4
+ "description": "A collection of JavaScript functions for Rozmova analytics",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "scripts": {
8
8
  "build": "babel src --out-dir dist --extensions .ts,.tsx && npm run build:types",
9
- "build:types": "tsc --emitDeclarationOnly"
10
- },
11
- "repository": {
12
- "type": "git",
13
- "url": "https://github.com/uptechteam/rozmova-analytics.git"
9
+ "build:types": "tsc --emitDeclarationOnly",
10
+ "lint": "eslint 'src/**/*.{ts,tsx}'",
11
+ "lint:fix": "eslint 'src/**/*.{ts,tsx}' --fix",
12
+ "format": "prettier --write 'src/**/*.{ts,tsx}'",
13
+ "prepare": "husky install"
14
14
  },
15
15
  "keywords": [
16
16
  "analytics",
@@ -19,7 +19,7 @@
19
19
  "javascript",
20
20
  "npm-package"
21
21
  ],
22
- "author": "Your Name",
22
+ "author": "Bohdan Solokha",
23
23
  "license": "MIT",
24
24
  "files": [
25
25
  "dist"
@@ -29,6 +29,23 @@
29
29
  "@babel/core": "^7.22.0",
30
30
  "@babel/preset-env": "^7.22.0",
31
31
  "@babel/preset-typescript": "^7.26.0",
32
+ "@types/gtag.js": "^0.0.20",
33
+ "@types/js-cookie": "^3.0.6",
34
+ "@types/mixpanel-browser": "^2.50.2",
35
+ "@types/node": "^22.10.2",
36
+ "@typescript-eslint/eslint-plugin": "^8.18.2",
37
+ "@typescript-eslint/parser": "^8.18.2",
38
+ "eslint": "^8.57.0",
39
+ "eslint-config-prettier": "^9.1.0",
40
+ "eslint-plugin-import": "^2.31.0",
41
+ "eslint-plugin-prettier": "^5.2.1",
42
+ "husky": "^8.0.0",
43
+ "prettier": "^3.4.2",
32
44
  "typescript": "^5.7.2"
45
+ },
46
+ "dependencies": {
47
+ "js-cookie": "^3.0.5",
48
+ "mixpanel-browser": "^2.58.0",
49
+ "nanoid": "^5.0.9"
33
50
  }
34
51
  }