stone-analytics 0.0.20 → 0.0.22
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.
- package/README.md +63 -63
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +45 -44
package/README.md
CHANGED
|
@@ -1,63 +1,63 @@
|
|
|
1
|
-
# Пакет с функцией отправки аналитики stone
|
|
2
|
-
|
|
3
|
-
Npm-пакет для отправки аналитики по api/send-event
|
|
4
|
-
|
|
5
|
-
## Установка
|
|
6
|
-
|
|
7
|
-
```sh
|
|
8
|
-
npm i stone-analytics@latest
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
### Метод отправки аналитики
|
|
12
|
-
|
|
13
|
-
Метод для отправки аналитики sendAnalytics
|
|
14
|
-
|
|
15
|
-
```sh
|
|
16
|
-
import { useEffect } from 'react'
|
|
17
|
-
import { sendAnalytics } from 'stone-analytics'
|
|
18
|
-
|
|
19
|
-
export const AllProviders = () => {
|
|
20
|
-
useEffect(() => {
|
|
21
|
-
sendAnalytics({
|
|
22
|
-
event: 'page_view',
|
|
23
|
-
name: 'Переход на страницу',
|
|
24
|
-
})
|
|
25
|
-
}, [])
|
|
26
|
-
}
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
#### Параметры
|
|
30
|
-
|
|
31
|
-
| Поле | Тип | Описание |
|
|
32
|
-
| -------- | ------------------------ | ----------------------------------------------------- |
|
|
33
|
-
| `event` | `string` | Название события (например, `"click"`, `"page_view"`) |
|
|
34
|
-
| `name` | `string` | Уникальное имя события |
|
|
35
|
-
| `params` | `TAnalyticsVisitParams?` | Дополнительные параметры события (необязательно) |
|
|
36
|
-
|
|
37
|
-
### Инициализация сессии
|
|
38
|
-
|
|
39
|
-
Хук для инициализации id сессии и id клиента
|
|
40
|
-
|
|
41
|
-
```sh
|
|
42
|
-
import { useInitializeMetrics } from 'stone-analytics'
|
|
43
|
-
|
|
44
|
-
export const AppProvider = ({ children }: { children: React.ReactNode }) => {
|
|
45
|
-
useInitializeMetrics()
|
|
46
|
-
|
|
47
|
-
return <>{children}</>
|
|
48
|
-
}
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
| Поле | Описание |
|
|
52
|
-
| ---------- | --------- |
|
|
53
|
-
| session_id | На сессию |
|
|
54
|
-
| client_id | На год |
|
|
55
|
-
|
|
56
|
-
### Локальная разработка
|
|
57
|
-
|
|
58
|
-
Для того , чтобы локально ничего не отправлялось добавить в env.local
|
|
59
|
-
|
|
60
|
-
```sh
|
|
61
|
-
process.env.NEXT_PUBLIC_IS_TEST === 'true'
|
|
62
|
-
```
|
|
63
|
-
|
|
1
|
+
# Пакет с функцией отправки аналитики stone
|
|
2
|
+
|
|
3
|
+
Npm-пакет для отправки аналитики по api/send-event
|
|
4
|
+
|
|
5
|
+
## Установка
|
|
6
|
+
|
|
7
|
+
```sh
|
|
8
|
+
npm i stone-analytics@latest
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
### Метод отправки аналитики
|
|
12
|
+
|
|
13
|
+
Метод для отправки аналитики sendAnalytics
|
|
14
|
+
|
|
15
|
+
```sh
|
|
16
|
+
import { useEffect } from 'react'
|
|
17
|
+
import { sendAnalytics } from 'stone-analytics'
|
|
18
|
+
|
|
19
|
+
export const AllProviders = () => {
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
sendAnalytics({
|
|
22
|
+
event: 'page_view',
|
|
23
|
+
name: 'Переход на страницу',
|
|
24
|
+
})
|
|
25
|
+
}, [])
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
#### Параметры
|
|
30
|
+
|
|
31
|
+
| Поле | Тип | Описание |
|
|
32
|
+
| -------- | ------------------------ | ----------------------------------------------------- |
|
|
33
|
+
| `event` | `string` | Название события (например, `"click"`, `"page_view"`) |
|
|
34
|
+
| `name` | `string` | Уникальное имя события |
|
|
35
|
+
| `params` | `TAnalyticsVisitParams?` | Дополнительные параметры события (необязательно) |
|
|
36
|
+
|
|
37
|
+
### Инициализация сессии
|
|
38
|
+
|
|
39
|
+
Хук для инициализации id сессии и id клиента
|
|
40
|
+
|
|
41
|
+
```sh
|
|
42
|
+
import { useInitializeMetrics } from 'stone-analytics'
|
|
43
|
+
|
|
44
|
+
export const AppProvider = ({ children }: { children: React.ReactNode }) => {
|
|
45
|
+
useInitializeMetrics()
|
|
46
|
+
|
|
47
|
+
return <>{children}</>
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
| Поле | Описание |
|
|
52
|
+
| ---------- | --------- |
|
|
53
|
+
| session_id | На сессию |
|
|
54
|
+
| client_id | На год |
|
|
55
|
+
|
|
56
|
+
### Локальная разработка
|
|
57
|
+
|
|
58
|
+
Для того , чтобы локально ничего не отправлялось добавить в env.local
|
|
59
|
+
|
|
60
|
+
```sh
|
|
61
|
+
process.env.NEXT_PUBLIC_IS_TEST === 'true'
|
|
62
|
+
```
|
|
63
|
+
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var
|
|
1
|
+
var C=Object.create;var p=Object.defineProperty;var E=Object.getOwnPropertyDescriptor;var A=Object.getOwnPropertyNames;var D=Object.getPrototypeOf,x=Object.prototype.hasOwnProperty;var b=(e,t)=>{for(var o in t)p(e,o,{get:t[o],enumerable:!0})},y=(e,t,o,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of A(t))!x.call(e,s)&&s!==o&&p(e,s,{get:()=>t[s],enumerable:!(i=E(t,s))||i.enumerable});return e};var N=(e,t,o)=>(o=e!=null?C(D(e)):{},y(t||!e||!e.__esModule?p(o,"default",{value:e,enumerable:!0}):o,e)),U=e=>y(p({},"__esModule",{value:!0}),e);var Y={};b(Y,{checkTimeStamp:()=>_,sendAnalytics:()=>l,setClientId:()=>g,setSessionId:()=>d,useInitializeMetrics:()=>B});module.exports=U(Y);var m=()=>String(Date.now())+String(Math.floor(Math.random()*9e8)+1e8);var T=typeof localStorage<"u",_=e=>{if(!e)return!1;let t=Number(e.slice(0,10)),o=new Date(t*1e3),i=new Date(new Date().toISOString());return i.getFullYear()>o.getFullYear()&&i.getMonth()>=o.getMonth()&&i.getDate()>=o.getDate()},d=()=>{let e=m();T&&localStorage.setItem("st_session_id",e)},g=()=>{let e=m();T&&localStorage.setItem("st_client_id",e)};var f=require("cookies-next");var S=e=>{var t;if(typeof window<"u"){let o=process.env.NEXT_PUBLIC_IS_TEST==="true",i=window.location.pathname,s=window.location.href,n={event:e.event,st_event_id:(t=e.params)==null?void 0:t.st_event_id,page_path:i,page_url:s};e.params.st_session_id&&(n.st_session_id=e.params.st_session_id),e.params.st_client_id&&(n.st_client_id=e.params.st_client_id),e.params.project&&(n.project=e.params.project),e.params.lot_id&&(n.lot_id=e.params.lot_id),o||(window.dataLayer=window.dataLayer||[],window.dataLayer.push(n),console.log("dataLayerPush:",n))}};var I=e=>{if(typeof ym<"u"&&typeof window<"u"){let t=process.env.NEXT_PUBLIC_IS_TEST==="true";(typeof process.env.NEXT_PUBLIC_YM_COUNTER>"u"||!process.env.NEXT_PUBLIC_YM_COUNTER)&&console.log("Yandex counter \u043D\u0435 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D \u0432 \u043A\u043E\u043D\u0444\u0438\u0433\u0435 .env.local"),t||(ym(process.env.NEXT_PUBLIC_YM_COUNTER,"reachGoal",e.target,e.params),console.log("Yandex Metrika "+process.env.NEXT_PUBLIC_YM_COUNTER+" reachGoal: "+e.target,e.params))}else console.log("Yandex Metrika \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u0430")};var w=async e=>{if(typeof window<"u"){let t=process.env.NEXT_PUBLIC_IS_TEST==="true",o="https://stone.ru/api/analytics/send-event",i=window.location.pathname,s=window.location.href,n={event:e.event,name:e.name,payload:{...e.params,page_path:i,page_url:s}};try{t||(await fetch(o,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)}),console.log("sendAnalyticsToAPI:",n))}catch{console.log("can't sendAnalyticsToAPI")}}else return};var h=N(require("@fingerprintjs/fingerprintjs")),l=async e=>{if(typeof window<"u"){let t=h.default.load(),o=typeof localStorage<"u",i=process.env.NEXT_PUBLIC_IS_TEST==="true";e.params=e.params||{},e.params.st_event_id=m(),e.params.date=new Date().toISOString().slice(0,19).replace("T"," ");try{await t.then(c=>c.get()).then(c=>{e.params&&(e.params.st_client_hash_id=c.visitorId)})}catch(c){console.log("error fingerprintJS"+c)}let s=String((0,f.getCookie)("_ym_uid"));s&&s!=""&&(e.params.ym_client_id=s);let n=String((0,f.getCookie)("_ga"));n&&n!=""&&(e.params.ga_client_id=n);let r=o?localStorage.getItem("st_client_id"):void 0;r&&r!=""&&(e.params.st_client_id=r);let a=o?localStorage.getItem("st_session_id"):void 0;a&&a!=""&&(e.params.st_session_id=a),i||(S({event:e.event,params:e.params}),I({target:e.event,params:e.params}),w({event:e.event,name:e.name,params:e.params}))}};var u=require("react"),B=()=>{let e=typeof localStorage<"u",t=!!(e&&localStorage.getItem("st_client_id")),o=!!(e&&localStorage.getItem("st_session_id")),i=_(e?localStorage.getItem("st_client_id"):null);return(!t||i)&&g(),o||(d(),l({event:"session_start",name:"\u041D\u0430\u0447\u0430\u043B\u043E \u0441\u0435\u0441\u0441\u0438\u0438"})),(0,u.useEffect)(()=>{let s=localStorage.getItem("tabCount"),n=s?parseInt(s):0;n<0&&(localStorage.setItem("tabCount",String(0)),n=0),n++,n&&localStorage.setItem("tabCount",String(n));let r=()=>{let a=localStorage.getItem("tabCount");if(a&&typeof window<"u"){let c=String(Number(a)-1),v=window.scrollY,P=document.documentElement.scrollHeight-document.documentElement.clientHeight,L=v/P*100;l({event:"scroll",name:"\u041F\u0435\u0440\u0435\u0445\u043E\u0434 \u0438\u043B\u0438 \u0443\u0445\u043E\u0434 \u0441\u043E \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B",params:{scroll_percent:L.toFixed(0)+"%"}}),c==="0"&&(l({event:"session_end",name:"\u041A\u043E\u043D\u0435\u0446 \u0441\u0435\u0441\u0441\u0438\u0438"}),localStorage.setItem("st_session_id","")),localStorage.setItem("tabCount",c)}};return window.addEventListener("beforeunload",r),()=>{window.removeEventListener("beforeunload",r)}},[]),(0,u.useEffect)(()=>{let s,n=()=>{clearTimeout(s),s=setTimeout(()=>{localStorage.setItem("st_session_id",""),l({event:"timeout_30min",name:"\u041A\u043E\u043D\u0435\u0446 \u0441\u0435\u0441\u0441\u0438\u0438"})},18e5)},r=["mousemove","click","touchstart","scroll","keydown"];return r.forEach(a=>{window.addEventListener(a,n)}),n(),()=>{r.forEach(a=>{window.removeEventListener(a,n)}),clearTimeout(s)}},[]),{}};0&&(module.exports={checkTimeStamp,sendAnalytics,setClientId,setSessionId,useInitializeMetrics});
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/utils/makeUID.ts","../src/utils/sessionClientId.ts","../src/sendAnalytics/sendAnalytics.ts","../src/dataLayerPush/dataLayerPush.ts","../src/ymTarget/ymaTarget.ts","../src/sendAnalyticsToAPI/sendAnalyticsToAPI.ts","../src/hooks/useInitializeMetrics.ts","../src/utils/hashId.ts"],"sourcesContent":["export * from './utils/sessionClientId'\r\nexport * from './sendAnalytics/sendAnalytics'\r\nexport * from './hooks/useInitializeMetrics'","export const makeTimeBasedUID = (): string => {\r\n\treturn (\r\n\t\tString(Date.now()) + String(Math.floor(Math.random() * (999999999 - 100000000 + 1)) + 100000000)\r\n\t)\r\n}","import {makeTimeBasedUID} from './makeUID'\r\n\r\nconst isLocalStorage = typeof localStorage !== 'undefined'\r\n\r\nconst checkTimeStamp = (clientId: string | null) => {\r\n if (!clientId) return false\r\n\r\n const ISOSDate = new Date(clientId.split('_')[0])\r\n const ISOSDateNow = new Date(new Date().toISOString())\r\n\r\n return (\r\n ISOSDateNow.getFullYear() > ISOSDate.getFullYear() &&\r\n ISOSDateNow.getMonth() >= ISOSDate.getMonth() &&\r\n ISOSDateNow.getDate() >= ISOSDate.getDate()\r\n )\r\n}\r\n\r\nconst setSessionId = () => {\r\n const newId = makeTimeBasedUID()\r\n const timeStamp = new Date().toISOString()\r\n if (isLocalStorage) localStorage.setItem('st_session_id', timeStamp + '_' + newId)\r\n}\r\n\r\nconst setClientId = () => {\r\n const newId = makeTimeBasedUID()\r\n const timeStamp = new Date().toISOString()\r\n if (isLocalStorage) localStorage.setItem('st_client_id', timeStamp + '_' + newId)\r\n}\r\n\r\n\r\nexport {setClientId, setSessionId, checkTimeStamp}","import { getCookie } from 'cookies-next'\r\nimport { TAnalyticsData } from '../types/analytics'\r\nimport { dataLayerPush } from '../dataLayerPush/dataLayerPush'\r\nimport { ymTarget } from '../ymTarget/ymaTarget'\r\nimport { sendAnalyticsToAPI } from '../sendAnalyticsToAPI/sendAnalyticsToAPI'\r\nimport { makeTimeBasedUID } from '../utils/makeUID'\r\n\r\nexport const sendAnalytics = (data: TAnalyticsData) => {\r\n\tconst isLocalStorage = typeof localStorage !== 'undefined'\r\n\tconst isTest = process.env.NEXT_PUBLIC_IS_TEST === 'true'\r\n\r\n\tdata.params = data.params || {}\r\n\tdata.params.st_event_id = makeTimeBasedUID()\r\n\tdata.params.date = new Date().toISOString()\r\n\r\n\tconst _ym_uid = String(getCookie('_ym_uid'))\r\n\tif (_ym_uid && _ym_uid != '') {\r\n\t\tdata.params.ym_client_id = _ym_uid\r\n\t}\r\n\tconst _ga = String(getCookie('_ga'))\r\n\tif (_ga && _ga != '') {\r\n\t\tdata.params.ga_client_id = _ga\r\n\t}\r\n\r\n\tconst st_client_id = isLocalStorage ? localStorage.getItem('st_client_id') : undefined\r\n\tif (st_client_id && st_client_id != '') {\r\n\t\tdata.params.st_client_id = st_client_id\r\n\t}\r\n\r\n\tconst st_session_id = isLocalStorage ? localStorage.getItem('st_session_id') : undefined\r\n\tif (st_session_id && st_session_id != '') {\r\n\t\tdata.params.st_session_id = st_session_id\r\n\t}\r\n\r\n\tconst st_client_hash_id = isLocalStorage ? localStorage.getItem('st_client_hash_id') : undefined\r\n\tif (st_client_hash_id && st_client_hash_id != '') {\r\n\t\tdata.params.st_client_hash_id = st_client_hash_id\r\n\t}\r\n\r\n\tif (!isTest) {\r\n\t\tdataLayerPush({ event: data.event, params: data.params })\r\n\t\tymTarget({ target: data.event, params: data.params })\r\n\t\tsendAnalyticsToAPI({ event: data.event, name: data.name, params: data.params })\r\n\t}\r\n}\r\n","import { TAnalyticsVisitParams } from '../types/analytics'\r\n\r\nexport type TGADataLayer = {\r\n\tevent: string\r\n\tparams: TAnalyticsVisitParams\r\n}\r\n\r\nexport type DataLayerPush = {\r\n\tevent: string\r\n\tpage_path: string\r\n\tpage_url: string\r\n\tst_event_id?: string\r\n\tst_client_id?: string\r\n\tst_session_id?: string\r\n\tabTestGroup?: string\r\n\tproject?: string\r\n\tlot_id?: string | number\r\n}\r\n\r\ndeclare global {\r\n\tinterface Window {\r\n\t\tdataLayer: DataLayerPush[]\r\n\t}\r\n}\r\n\r\nexport const dataLayerPush = (data: TGADataLayer) => {\r\n\tif (typeof window !== 'undefined') {\r\n\t\tconst isTest = process.env.NEXT_PUBLIC_IS_TEST === 'true'\r\n\t\tconst pathname = window.location.pathname\r\n\t\tconst href = window.location.href\r\n\t\tconst layerEvent: DataLayerPush = {\r\n\t\t\tevent: data.event,\r\n\t\t\tst_event_id: data.params?.st_event_id,\r\n\t\t\tabTestGroup: data.params?.abTestGroup,\r\n\t\t\tpage_path: pathname,\r\n\t\t\tpage_url: href,\r\n\t\t}\r\n\t\tif (data.params.st_session_id) {\r\n\t\t\tlayerEvent.st_session_id = data.params.st_session_id\r\n\t\t}\r\n\t\tif (data.params.st_client_id) {\r\n\t\t\tlayerEvent.st_client_id = data.params.st_client_id\r\n\t\t}\r\n\t\tif (data.params.project) {\r\n\t\t\tlayerEvent.project = data.params.project\r\n\t\t}\r\n\t\tif (data.params.lot_id) {\r\n\t\t\tlayerEvent.lot_id = data.params.lot_id\r\n\t\t}\r\n\r\n\t\tif (!isTest) {\r\n\t\t\twindow.dataLayer = window.dataLayer || []\r\n\t\t\twindow.dataLayer.push(layerEvent)\r\n\r\n\t\t\tconsole.log('dataLayerPush:', layerEvent)\r\n\t\t}\r\n\t}\r\n}\r\n\r\n","import { TAnalyticsVisitParams } from '../types/analytics'\r\n\r\nexport type TYMTarget = {\r\n\ttarget: string\r\n\tparams: TAnalyticsVisitParams\r\n}\r\n\r\ndeclare let ym: any\r\n/**\r\n * Отправка события в Яндек метрику\r\n * @param data\r\n */\r\nexport const ymTarget = (data: TYMTarget) => {\r\n\tif (typeof ym !== 'undefined' && typeof window !== 'undefined') {\r\n\t\tconst isTest = process.env.NEXT_PUBLIC_IS_TEST === 'true'\r\n\t\tif (\r\n\t\t\ttypeof process.env.NEXT_PUBLIC_YM_COUNTER == 'undefined' ||\r\n\t\t\t!process.env.NEXT_PUBLIC_YM_COUNTER\r\n\t\t) {\r\n\t\t\tconsole.log('Yandex counter не определен в конфиге .env.local')\r\n\t\t}\r\n\t\tif (!isTest) {\r\n\t\t\tym(process.env.NEXT_PUBLIC_YM_COUNTER, 'reachGoal', data.target, data.params)\r\n\r\n\t\t\tconsole.log(\r\n\t\t\t\t'Yandex Metrika ' + process.env.NEXT_PUBLIC_YM_COUNTER + ' reachGoal: ' + data.target,\r\n\t\t\t\tdata.params\r\n\t\t\t)\r\n\t\t}\r\n\t} else {\r\n\t\tconsole.log('Yandex Metrika не найдена')\r\n\t}\r\n}\r\n\r\n","import { TAnalyticsVisitParams } from '../types/analytics'\r\n\r\nexport type TAnalyticsApiData = {\r\n\tevent: string\r\n\tname: string\r\n\tmouse_X?: string\r\n\tmouse_Y?: string\r\n\tparams: TAnalyticsVisitParams\r\n}\r\n\r\nexport const sendAnalyticsToAPI = async (data: TAnalyticsApiData) => {\r\n\tif (typeof window !== 'undefined') {\r\n\t\tconst isTest = process.env.NEXT_PUBLIC_IS_TEST === 'true'\r\n\t\tconst url = `https://stone.ru/api/analytics/send-event`\r\n\t\tconst pathname = window.location.pathname\r\n\t\tconst href = window.location.href\r\n\r\n\t\tconst formData = {\r\n\t\t\tevent: data.event,\r\n\t\t\tname: data.name,\r\n\t\t\tpayload: { ...data.params, ...{ page_path: pathname, page_url: href } },\r\n\t\t}\r\n\t\ttry {\r\n\t\t\tif (!isTest) {\r\n\t\t\t\tawait fetch(url, {\r\n\t\t\t\t\tmethod: 'POST',\r\n\t\t\t\t\theaders: {\r\n\t\t\t\t\t\t'Content-Type': 'application/json',\r\n\t\t\t\t\t},\r\n\t\t\t\t\tbody: JSON.stringify(formData),\r\n\t\t\t\t})\r\n\t\t\t\tconsole.log('sendAnalyticsToAPI:', formData)\r\n\t\t\t}\r\n\t\t} catch (e) {\r\n\t\t\tconsole.log(\"can't sendAnalyticsToAPI\")\r\n\t\t}\r\n\t} else return\r\n}\r\n\r\n","import { checkTimeStamp, setClientId, setSessionId } from '../utils/sessionClientId'\r\nimport { sendAnalytics } from '../sendAnalytics/sendAnalytics'\r\nimport { useEffect } from 'react'\r\nimport { setBrowserId } from '../utils/hashId'\r\n\r\nexport const useInitializeMetrics = () => {\r\n\tconst isLocalStorage = typeof localStorage !== 'undefined'\r\n\r\n\tconst isClientId = Boolean(isLocalStorage ? localStorage.getItem('st_client_id') : null)\r\n\tconst isSessionId = Boolean(isLocalStorage ? localStorage.getItem('st_session_id') : null)\r\n\tconst isYearPast = checkTimeStamp(isLocalStorage ? localStorage.getItem('st_client_id') : null)\r\n\r\n\tif (!isClientId || isYearPast) setClientId()\r\n\r\n\tif (!isSessionId) {\r\n\t\tsetSessionId()\r\n\t\tsetBrowserId()\r\n\t\tsendAnalytics({\r\n\t\t\tevent: 'session_start',\r\n\t\t\tname: 'Начало сессии',\r\n\t\t})\r\n\t}\r\n\r\n\tuseEffect(() => {\r\n\t\tconst tabCountStorage = localStorage.getItem('tabCount')\r\n\r\n\t\t// При открытии вкладки\r\n\t\tlet tabCount = tabCountStorage ? parseInt(tabCountStorage) : 0\r\n\t\tif (tabCount < 0) {\r\n\t\t\tlocalStorage.setItem('tabCount', String(0))\r\n\t\t\ttabCount = 0\r\n\t\t}\r\n\r\n\t\ttabCount++\r\n\t\tif (tabCount) localStorage.setItem('tabCount', String(tabCount))\r\n\r\n\t\t// Обработчик для закрытия вкладки\r\n\t\tconst handleBeforeUnload = () => {\r\n\t\t\tconst tabCountStorage = localStorage.getItem('tabCount')\r\n\t\t\tif (tabCountStorage && typeof window !== 'undefined') {\r\n\t\t\t\tconst tabCount = String(Number(tabCountStorage) - 1)\r\n\t\t\t\tconst scrollTop = window.scrollY\r\n\t\t\t\tconst scrollHeight =\r\n\t\t\t\t\tdocument.documentElement.scrollHeight - document.documentElement.clientHeight\r\n\t\t\t\tconst scrollPercent = (scrollTop / scrollHeight) * 100\r\n\r\n\t\t\t\tsendAnalytics({\r\n\t\t\t\t\tevent: 'scroll',\r\n\t\t\t\t\tname: 'Переход или уход со страницы',\r\n\t\t\t\t\tparams: { scroll_percent: scrollPercent.toFixed(0) + '%' },\r\n\t\t\t\t})\r\n\r\n\t\t\t\tif (tabCount === '0') {\r\n\t\t\t\t\tsendAnalytics({\r\n\t\t\t\t\t\tevent: 'session_end',\r\n\t\t\t\t\t\tname: 'Конец сессии',\r\n\t\t\t\t\t})\r\n\r\n\t\t\t\t\tlocalStorage.setItem('st_session_id', '')\r\n\t\t\t\t\tlocalStorage.setItem('st_client_hash_id', '')\r\n\t\t\t\t}\r\n\t\t\t\tlocalStorage.setItem('tabCount', tabCount)\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\twindow.addEventListener('beforeunload', handleBeforeUnload)\r\n\t\treturn () => {\r\n\t\t\twindow.removeEventListener('beforeunload', handleBeforeUnload)\r\n\t\t}\r\n\t}, [])\r\n\r\n\tuseEffect(() => {\r\n\t\tlet inactivityTimer: NodeJS.Timeout\r\n\r\n\t\tconst resetInactivityTimer = () => {\r\n\t\t\tclearTimeout(inactivityTimer)\r\n\t\t\t// 30 минут\r\n\t\t\tinactivityTimer = setTimeout(() => {\r\n\t\t\t\tlocalStorage.setItem('st_session_id', '')\r\n\t\t\t\tlocalStorage.setItem('st_client_hash_id', '')\r\n\r\n\t\t\t\tsendAnalytics({\r\n\t\t\t\t\tevent: 'timeout_30min',\r\n\t\t\t\t\tname: 'Конец сессии',\r\n\t\t\t\t})\r\n\t\t\t}, 30 * 60 * 1000)\r\n\t\t}\r\n\r\n\t\tconst events = ['mousemove', 'click', 'touchstart', 'scroll', 'keydown']\r\n\t\tevents.forEach((event) => {\r\n\t\t\twindow.addEventListener(event, resetInactivityTimer)\r\n\t\t})\r\n\r\n\t\t// Запускаем таймер при монтировании компонента\r\n\t\tresetInactivityTimer()\r\n\t\treturn () => {\r\n\t\t\tevents.forEach((event) => {\r\n\t\t\t\twindow.removeEventListener(event, resetInactivityTimer)\r\n\t\t\t})\r\n\t\t\tclearTimeout(inactivityTimer)\r\n\t\t}\r\n\t}, [])\r\n\r\n\treturn {}\r\n}\r\n","const isLocalStorage = typeof localStorage !== 'undefined'\r\n\r\nconst getStringHash = (str: string, seed = 0) => {\r\n let h1 = 0xdeadbeef ^ seed,\r\n h2 = 0x41c6ce57 ^ seed\r\n for (let i = 0, ch; i < str.length; i++) {\r\n ch = str.charCodeAt(i)\r\n h1 = Math.imul(h1 ^ ch, 2654435761)\r\n h2 = Math.imul(h2 ^ ch, 1597334677)\r\n }\r\n h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^ Math.imul(h2 ^ (h2 >>> 13), 3266489909)\r\n h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ Math.imul(h1 ^ (h1 >>> 13), 3266489909)\r\n return 4294967296 * (2097151 & h2) + (h1 >>> 0)\r\n}\r\n\r\nconst getClientHashId = () => {\r\n if (typeof window !== 'undefined') {\r\n\r\n const userBrowserString =\r\n navigator?.userAgent +\r\n '|' +\r\n window?.screen?.width +\r\n '|' +\r\n window?.screen?.height +\r\n '|' +\r\n navigator?.language +\r\n '|' +\r\n navigator?.cookieEnabled\r\n return getStringHash(userBrowserString)\r\n }\r\n}\r\n\r\nconst setBrowserId = () => {\r\n const newId = getClientHashId()\r\n\r\n if (isLocalStorage && newId) localStorage.setItem('st_client_hash_id', String(newId))\r\n}\r\n\r\nexport {getClientHashId, setBrowserId}"],"mappings":"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","names":["src_exports","__export","checkTimeStamp","sendAnalytics","setClientId","setSessionId","useInitializeMetrics","__toCommonJS","makeTimeBasedUID","isLocalStorage","checkTimeStamp","clientId","ISOSDate","ISOSDateNow","setSessionId","newId","makeTimeBasedUID","timeStamp","setClientId","import_cookies_next","dataLayerPush","data","_a","_b","isTest","pathname","href","layerEvent","ymTarget","data","isTest","sendAnalyticsToAPI","data","isTest","url","pathname","href","formData","sendAnalytics","data","isLocalStorage","isTest","makeTimeBasedUID","_ym_uid","_ga","st_client_id","st_session_id","st_client_hash_id","dataLayerPush","ymTarget","sendAnalyticsToAPI","import_react","isLocalStorage","getStringHash","str","seed","h1","h2","i","ch","getClientHashId","_a","_b","userBrowserString","setBrowserId","newId","useInitializeMetrics","isLocalStorage","isClientId","isSessionId","isYearPast","checkTimeStamp","setClientId","setSessionId","setBrowserId","sendAnalytics","tabCountStorage","tabCount","handleBeforeUnload","scrollTop","scrollHeight","scrollPercent","inactivityTimer","resetInactivityTimer","events","event"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/utils/makeUID.ts","../src/utils/sessionClientId.ts","../src/sendAnalytics/sendAnalytics.ts","../src/dataLayerPush/dataLayerPush.ts","../src/ymTarget/ymaTarget.ts","../src/sendAnalyticsToAPI/sendAnalyticsToAPI.ts","../src/hooks/useInitializeMetrics.ts"],"sourcesContent":["export * from './utils/sessionClientId'\nexport * from './sendAnalytics/sendAnalytics'\nexport * from './hooks/useInitializeMetrics'","export const makeTimeBasedUID = (): string => {\n\treturn (\n\t\tString(Date.now()) + String(Math.floor(Math.random() * (999999999 - 100000000 + 1)) + 100000000)\n\t)\n}","import {makeTimeBasedUID} from './makeUID'\n\nconst isLocalStorage = typeof localStorage !== 'undefined'\n\nconst checkTimeStamp = (clientId: string | null) => {\n if (!clientId) return false\n\n const unixTimestamp = Number(clientId.slice(0, 10))\n const ISOSDate = new Date(unixTimestamp * 1000)\n const ISOSDateNow = new Date(new Date().toISOString())\n\n return (\n ISOSDateNow.getFullYear() > ISOSDate.getFullYear() &&\n ISOSDateNow.getMonth() >= ISOSDate.getMonth() &&\n ISOSDateNow.getDate() >= ISOSDate.getDate()\n )\n}\n\nconst setSessionId = () => {\n const newId = makeTimeBasedUID()\n if (isLocalStorage) localStorage.setItem('st_session_id', newId)\n}\n\nconst setClientId = () => {\n const newId = makeTimeBasedUID()\n if (isLocalStorage) localStorage.setItem('st_client_id', newId)\n}\n\nexport {setClientId, setSessionId, checkTimeStamp}","import {getCookie} from 'cookies-next'\nimport {TAnalyticsData} from '../types/analytics'\nimport {dataLayerPush} from '../dataLayerPush/dataLayerPush'\nimport {ymTarget} from '../ymTarget/ymaTarget'\nimport {sendAnalyticsToAPI} from '../sendAnalyticsToAPI/sendAnalyticsToAPI'\nimport {makeTimeBasedUID} from '../utils/makeUID'\nimport FingerprintJS from '@fingerprintjs/fingerprintjs'\n\nexport const sendAnalytics = async (data: TAnalyticsData) => {\n if (typeof window !== 'undefined') {\n const fpPromise = FingerprintJS.load()\n const isLocalStorage = typeof localStorage !== 'undefined'\n const isTest = process.env.NEXT_PUBLIC_IS_TEST === 'true'\n\n data.params = data.params || {}\n data.params.st_event_id = makeTimeBasedUID()\n data.params.date = new Date().toISOString().slice(0, 19).replace('T', ' ');\n\n try {\n await fpPromise\n .then((fp) => fp.get())\n .then((result) => {\n if (data.params) {\n data.params.st_client_hash_id = result.visitorId\n }\n })\n } catch (e) {\n console.log('error fingerprintJS' + e)\n }\n\n const _ym_uid = String(getCookie('_ym_uid'))\n if (_ym_uid && _ym_uid != '') {\n data.params.ym_client_id = _ym_uid\n }\n const _ga = String(getCookie('_ga'))\n if (_ga && _ga != '') {\n data.params.ga_client_id = _ga\n }\n\n const st_client_id = isLocalStorage ? localStorage.getItem('st_client_id') : undefined\n if (st_client_id && st_client_id != '') {\n data.params.st_client_id = st_client_id\n }\n\n const st_session_id = isLocalStorage ? localStorage.getItem('st_session_id') : undefined\n if (st_session_id && st_session_id != '') {\n data.params.st_session_id = st_session_id\n }\n\n if (!isTest) {\n dataLayerPush({event: data.event, params: data.params})\n ymTarget({target: data.event, params: data.params})\n sendAnalyticsToAPI({event: data.event, name: data.name, params: data.params})\n }\n }\n}\n","import { TAnalyticsVisitParams } from '../types/analytics'\n\nexport type TGADataLayer = {\n\tevent: string\n\tparams: TAnalyticsVisitParams\n}\n\nexport type DataLayerPush = {\n\tevent: string\n\tpage_path: string\n\tpage_url: string\n\tst_event_id?: string\n\tst_client_id?: string\n\tst_session_id?: string\n\tabTestGroup?: string\n\tproject?: string\n\tlot_id?: string | number\n}\n\ndeclare global {\n\tinterface Window {\n\t\tdataLayer: DataLayerPush[]\n\t}\n}\n\nexport const dataLayerPush = (data: TGADataLayer) => {\n\tif (typeof window !== 'undefined') {\n\t\tconst isTest = process.env.NEXT_PUBLIC_IS_TEST === 'true'\n\t\tconst pathname = window.location.pathname\n\t\tconst href = window.location.href\n\t\tconst layerEvent: DataLayerPush = {\n\t\t\tevent: data.event,\n\t\t\tst_event_id: data.params?.st_event_id,\n\t\t\tpage_path: pathname,\n\t\t\tpage_url: href,\n\t\t}\n\t\tif (data.params.st_session_id) {\n\t\t\tlayerEvent.st_session_id = data.params.st_session_id\n\t\t}\n\t\tif (data.params.st_client_id) {\n\t\t\tlayerEvent.st_client_id = data.params.st_client_id\n\t\t}\n\t\tif (data.params.project) {\n\t\t\tlayerEvent.project = data.params.project\n\t\t}\n\t\tif (data.params.lot_id) {\n\t\t\tlayerEvent.lot_id = data.params.lot_id\n\t\t}\n\n\t\tif (!isTest) {\n\t\t\twindow.dataLayer = window.dataLayer || []\n\t\t\twindow.dataLayer.push(layerEvent)\n\n\t\t\tconsole.log('dataLayerPush:', layerEvent)\n\t\t}\n\t}\n}\n\n","import { TAnalyticsVisitParams } from '../types/analytics'\n\nexport type TYMTarget = {\n\ttarget: string\n\tparams: TAnalyticsVisitParams\n}\n\ndeclare let ym: any\n/**\n * Отправка события в Яндек метрику\n * @param data\n */\nexport const ymTarget = (data: TYMTarget) => {\n\tif (typeof ym !== 'undefined' && typeof window !== 'undefined') {\n\t\tconst isTest = process.env.NEXT_PUBLIC_IS_TEST === 'true'\n\t\tif (\n\t\t\ttypeof process.env.NEXT_PUBLIC_YM_COUNTER == 'undefined' ||\n\t\t\t!process.env.NEXT_PUBLIC_YM_COUNTER\n\t\t) {\n\t\t\tconsole.log('Yandex counter не определен в конфиге .env.local')\n\t\t}\n\t\tif (!isTest) {\n\t\t\tym(process.env.NEXT_PUBLIC_YM_COUNTER, 'reachGoal', data.target, data.params)\n\n\t\t\tconsole.log(\n\t\t\t\t'Yandex Metrika ' + process.env.NEXT_PUBLIC_YM_COUNTER + ' reachGoal: ' + data.target,\n\t\t\t\tdata.params\n\t\t\t)\n\t\t}\n\t} else {\n\t\tconsole.log('Yandex Metrika не найдена')\n\t}\n}\n\n","import { TAnalyticsVisitParams } from '../types/analytics'\n\nexport type TAnalyticsApiData = {\n\tevent: string\n\tname: string\n\tmouse_X?: string\n\tmouse_Y?: string\n\tparams: TAnalyticsVisitParams\n}\n\nexport const sendAnalyticsToAPI = async (data: TAnalyticsApiData) => {\n\tif (typeof window !== 'undefined') {\n\t\tconst isTest = process.env.NEXT_PUBLIC_IS_TEST === 'true'\n\t\tconst url = `https://stone.ru/api/analytics/send-event`\n\t\tconst pathname = window.location.pathname\n\t\tconst href = window.location.href\n\n\t\tconst formData = {\n\t\t\tevent: data.event,\n\t\t\tname: data.name,\n\t\t\tpayload: { ...data.params, ...{ page_path: pathname, page_url: href } },\n\t\t}\n\t\ttry {\n\t\t\tif (!isTest) {\n\t\t\t\tawait fetch(url, {\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\t},\n\t\t\t\t\tbody: JSON.stringify(formData),\n\t\t\t\t})\n\t\t\t\tconsole.log('sendAnalyticsToAPI:', formData)\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.log(\"can't sendAnalyticsToAPI\")\n\t\t}\n\t} else return\n}\n\n","import { checkTimeStamp, setClientId, setSessionId } from '../utils/sessionClientId'\nimport { sendAnalytics } from '../sendAnalytics/sendAnalytics'\nimport { useEffect } from 'react'\n\nexport const useInitializeMetrics = () => {\n\tconst isLocalStorage = typeof localStorage !== 'undefined'\n\n\tconst isClientId = Boolean(isLocalStorage ? localStorage.getItem('st_client_id') : null)\n\tconst isSessionId = Boolean(isLocalStorage ? localStorage.getItem('st_session_id') : null)\n\tconst isYearPast = checkTimeStamp(isLocalStorage ? localStorage.getItem('st_client_id') : null)\n\n\tif (!isClientId || isYearPast) setClientId()\n\n\tif (!isSessionId) {\n\t\tsetSessionId()\n\t\tsendAnalytics({\n\t\t\tevent: 'session_start',\n\t\t\tname: 'Начало сессии',\n\t\t})\n\t}\n\n\tuseEffect(() => {\n\t\tconst tabCountStorage = localStorage.getItem('tabCount')\n\n\t\t// При открытии вкладки\n\t\tlet tabCount = tabCountStorage ? parseInt(tabCountStorage) : 0\n\t\tif (tabCount < 0) {\n\t\t\tlocalStorage.setItem('tabCount', String(0))\n\t\t\ttabCount = 0\n\t\t}\n\n\t\ttabCount++\n\t\tif (tabCount) localStorage.setItem('tabCount', String(tabCount))\n\n\t\t// Обработчик для закрытия вкладки\n\t\tconst handleBeforeUnload = () => {\n\t\t\tconst tabCountStorage = localStorage.getItem('tabCount')\n\t\t\tif (tabCountStorage && typeof window !== 'undefined') {\n\t\t\t\tconst tabCount = String(Number(tabCountStorage) - 1)\n\t\t\t\tconst scrollTop = window.scrollY\n\t\t\t\tconst scrollHeight =\n\t\t\t\t\tdocument.documentElement.scrollHeight - document.documentElement.clientHeight\n\t\t\t\tconst scrollPercent = (scrollTop / scrollHeight) * 100\n\n\t\t\t\tsendAnalytics({\n\t\t\t\t\tevent: 'scroll',\n\t\t\t\t\tname: 'Переход или уход со страницы',\n\t\t\t\t\tparams: { scroll_percent: scrollPercent.toFixed(0) + '%' },\n\t\t\t\t})\n\n\t\t\t\tif (tabCount === '0') {\n\t\t\t\t\tsendAnalytics({\n\t\t\t\t\t\tevent: 'session_end',\n\t\t\t\t\t\tname: 'Конец сессии',\n\t\t\t\t\t})\n\n\t\t\t\t\tlocalStorage.setItem('st_session_id', '')\n\t\t\t\t}\n\t\t\t\tlocalStorage.setItem('tabCount', tabCount)\n\t\t\t}\n\t\t}\n\n\t\twindow.addEventListener('beforeunload', handleBeforeUnload)\n\t\treturn () => {\n\t\t\twindow.removeEventListener('beforeunload', handleBeforeUnload)\n\t\t}\n\t}, [])\n\n\tuseEffect(() => {\n\t\tlet inactivityTimer: NodeJS.Timeout\n\n\t\tconst resetInactivityTimer = () => {\n\t\t\tclearTimeout(inactivityTimer)\n\t\t\t// 30 минут\n\t\t\tinactivityTimer = setTimeout(() => {\n\t\t\t\tlocalStorage.setItem('st_session_id', '')\n\n\t\t\t\tsendAnalytics({\n\t\t\t\t\tevent: 'timeout_30min',\n\t\t\t\t\tname: 'Конец сессии',\n\t\t\t\t})\n\t\t\t}, 30 * 60 * 1000)\n\t\t}\n\n\t\tconst events = ['mousemove', 'click', 'touchstart', 'scroll', 'keydown']\n\t\tevents.forEach((event) => {\n\t\t\twindow.addEventListener(event, resetInactivityTimer)\n\t\t})\n\n\t\t// Запускаем таймер при монтировании компонента\n\t\tresetInactivityTimer()\n\t\treturn () => {\n\t\t\tevents.forEach((event) => {\n\t\t\t\twindow.removeEventListener(event, resetInactivityTimer)\n\t\t\t})\n\t\t\tclearTimeout(inactivityTimer)\n\t\t}\n\t}, [])\n\n\treturn {}\n}\n"],"mappings":"6iBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,oBAAAE,EAAA,kBAAAC,EAAA,gBAAAC,EAAA,iBAAAC,EAAA,yBAAAC,IAAA,eAAAC,EAAAP,GCAO,IAAMQ,EAAmB,IAE9B,OAAO,KAAK,IAAI,CAAC,EAAI,OAAO,KAAK,MAAM,KAAK,OAAO,EAAK,GAA0B,EAAI,GAAS,ECAjG,IAAMC,EAAiB,OAAO,aAAiB,IAEzCC,EAAkBC,GAA4B,CAChD,GAAI,CAACA,EAAU,MAAO,GAEtB,IAAMC,EAAgB,OAAOD,EAAS,MAAM,EAAG,EAAE,CAAC,EAC5CE,EAAW,IAAI,KAAKD,EAAgB,GAAI,EACxCE,EAAc,IAAI,KAAK,IAAI,KAAK,EAAE,YAAY,CAAC,EAErD,OACIA,EAAY,YAAY,EAAID,EAAS,YAAY,GACjDC,EAAY,SAAS,GAAKD,EAAS,SAAS,GAC5CC,EAAY,QAAQ,GAAKD,EAAS,QAAQ,CAElD,EAEME,EAAe,IAAM,CACvB,IAAMC,EAAQC,EAAiB,EAC3BR,GAAgB,aAAa,QAAQ,gBAAiBO,CAAK,CACnE,EAEME,EAAc,IAAM,CACtB,IAAMF,EAAQC,EAAiB,EAC3BR,GAAgB,aAAa,QAAQ,eAAgBO,CAAK,CAClE,EC1BA,IAAAG,EAAwB,wBCyBjB,IAAMC,EAAiBC,GAAuB,CAzBrD,IAAAC,EA0BC,GAAI,OAAO,OAAW,IAAa,CAClC,IAAMC,EAAS,QAAQ,IAAI,sBAAwB,OAC7CC,EAAW,OAAO,SAAS,SAC3BC,EAAO,OAAO,SAAS,KACvBC,EAA4B,CACjC,MAAOL,EAAK,MACZ,aAAaC,EAAAD,EAAK,SAAL,YAAAC,EAAa,YAC1B,UAAWE,EACX,SAAUC,CACX,EACIJ,EAAK,OAAO,gBACfK,EAAW,cAAgBL,EAAK,OAAO,eAEpCA,EAAK,OAAO,eACfK,EAAW,aAAeL,EAAK,OAAO,cAEnCA,EAAK,OAAO,UACfK,EAAW,QAAUL,EAAK,OAAO,SAE9BA,EAAK,OAAO,SACfK,EAAW,OAASL,EAAK,OAAO,QAG5BE,IACJ,OAAO,UAAY,OAAO,WAAa,CAAC,EACxC,OAAO,UAAU,KAAKG,CAAU,EAEhC,QAAQ,IAAI,iBAAkBA,CAAU,EAE1C,CACD,EC5CO,IAAMC,EAAYC,GAAoB,CAC5C,GAAI,OAAO,GAAO,KAAe,OAAO,OAAW,IAAa,CAC/D,IAAMC,EAAS,QAAQ,IAAI,sBAAwB,QAElD,OAAO,QAAQ,IAAI,uBAA0B,KAC7C,CAAC,QAAQ,IAAI,yBAEb,QAAQ,IAAI,iJAAkD,EAE1DA,IACJ,GAAG,QAAQ,IAAI,uBAAwB,YAAaD,EAAK,OAAQA,EAAK,MAAM,EAE5E,QAAQ,IACP,kBAAoB,QAAQ,IAAI,uBAAyB,eAAiBA,EAAK,OAC/EA,EAAK,MACN,EAEF,MACC,QAAQ,IAAI,wEAA2B,CAEzC,ECtBO,IAAME,EAAqB,MAAOC,GAA4B,CACpE,GAAI,OAAO,OAAW,IAAa,CAClC,IAAMC,EAAS,QAAQ,IAAI,sBAAwB,OAC7CC,EAAM,4CACNC,EAAW,OAAO,SAAS,SAC3BC,EAAO,OAAO,SAAS,KAEvBC,EAAW,CAChB,MAAOL,EAAK,MACZ,KAAMA,EAAK,KACX,QAAS,CAAE,GAAGA,EAAK,OAAa,UAAWG,EAAU,SAAUC,CAAO,CACvE,EACA,GAAI,CACEH,IACJ,MAAM,MAAMC,EAAK,CAChB,OAAQ,OACR,QAAS,CACR,eAAgB,kBACjB,EACA,KAAM,KAAK,UAAUG,CAAQ,CAC9B,CAAC,EACD,QAAQ,IAAI,sBAAuBA,CAAQ,EAE7C,MAAY,CACX,QAAQ,IAAI,0BAA0B,CACvC,CACD,KAAO,OACR,EH/BA,IAAAC,EAA0B,2CAEbC,EAAgB,MAAOC,GAAyB,CACzD,GAAI,OAAO,OAAW,IAAa,CAC/B,IAAMC,EAAY,EAAAC,QAAc,KAAK,EAC/BC,EAAiB,OAAO,aAAiB,IACzCC,EAAS,QAAQ,IAAI,sBAAwB,OAEnDJ,EAAK,OAASA,EAAK,QAAU,CAAC,EAC9BA,EAAK,OAAO,YAAcK,EAAiB,EAC3CL,EAAK,OAAO,KAAO,IAAI,KAAK,EAAE,YAAY,EAAE,MAAM,EAAG,EAAE,EAAE,QAAQ,IAAK,GAAG,EAEzE,GAAI,CACA,MAAMC,EACD,KAAMK,GAAOA,EAAG,IAAI,CAAC,EACrB,KAAMC,GAAW,CACVP,EAAK,SACLA,EAAK,OAAO,kBAAoBO,EAAO,UAE/C,CAAC,CACT,OAASC,EAAG,CACR,QAAQ,IAAI,sBAAwBA,CAAC,CACzC,CAEA,IAAMC,EAAU,UAAO,aAAU,SAAS,CAAC,EACvCA,GAAWA,GAAW,KACtBT,EAAK,OAAO,aAAeS,GAE/B,IAAMC,EAAM,UAAO,aAAU,KAAK,CAAC,EAC/BA,GAAOA,GAAO,KACdV,EAAK,OAAO,aAAeU,GAG/B,IAAMC,EAAeR,EAAiB,aAAa,QAAQ,cAAc,EAAI,OACzEQ,GAAgBA,GAAgB,KAChCX,EAAK,OAAO,aAAeW,GAG/B,IAAMC,EAAgBT,EAAiB,aAAa,QAAQ,eAAe,EAAI,OAC3ES,GAAiBA,GAAiB,KAClCZ,EAAK,OAAO,cAAgBY,GAG3BR,IACDS,EAAc,CAAC,MAAOb,EAAK,MAAO,OAAQA,EAAK,MAAM,CAAC,EACtDc,EAAS,CAAC,OAAQd,EAAK,MAAO,OAAQA,EAAK,MAAM,CAAC,EAClDe,EAAmB,CAAC,MAAOf,EAAK,MAAO,KAAMA,EAAK,KAAM,OAAQA,EAAK,MAAM,CAAC,EAEpF,CACJ,EIrDA,IAAAgB,EAA0B,iBAEbC,EAAuB,IAAM,CACzC,IAAMC,EAAiB,OAAO,aAAiB,IAEzCC,EAAa,GAAQD,GAAiB,aAAa,QAAQ,cAAc,GACzEE,EAAc,GAAQF,GAAiB,aAAa,QAAQ,eAAe,GAC3EG,EAAaC,EAAeJ,EAAiB,aAAa,QAAQ,cAAc,EAAI,IAAI,EAE9F,OAAI,CAACC,GAAcE,IAAYE,EAAY,EAEtCH,IACJI,EAAa,EACbC,EAAc,CACb,MAAO,gBACP,KAAM,2EACP,CAAC,MAGF,aAAU,IAAM,CACf,IAAMC,EAAkB,aAAa,QAAQ,UAAU,EAGnDC,EAAWD,EAAkB,SAASA,CAAe,EAAI,EACzDC,EAAW,IACd,aAAa,QAAQ,WAAY,OAAO,CAAC,CAAC,EAC1CA,EAAW,GAGZA,IACIA,GAAU,aAAa,QAAQ,WAAY,OAAOA,CAAQ,CAAC,EAG/D,IAAMC,EAAqB,IAAM,CAChC,IAAMF,EAAkB,aAAa,QAAQ,UAAU,EACvD,GAAIA,GAAmB,OAAO,OAAW,IAAa,CACrD,IAAMC,EAAW,OAAO,OAAOD,CAAe,EAAI,CAAC,EAC7CG,EAAY,OAAO,QACnBC,EACL,SAAS,gBAAgB,aAAe,SAAS,gBAAgB,aAC5DC,EAAiBF,EAAYC,EAAgB,IAEnDL,EAAc,CACb,MAAO,SACP,KAAM,uJACN,OAAQ,CAAE,eAAgBM,EAAc,QAAQ,CAAC,EAAI,GAAI,CAC1D,CAAC,EAEGJ,IAAa,MAChBF,EAAc,CACb,MAAO,cACP,KAAM,qEACP,CAAC,EAED,aAAa,QAAQ,gBAAiB,EAAE,GAEzC,aAAa,QAAQ,WAAYE,CAAQ,CAC1C,CACD,EAEA,cAAO,iBAAiB,eAAgBC,CAAkB,EACnD,IAAM,CACZ,OAAO,oBAAoB,eAAgBA,CAAkB,CAC9D,CACD,EAAG,CAAC,CAAC,KAEL,aAAU,IAAM,CACf,IAAII,EAEEC,EAAuB,IAAM,CAClC,aAAaD,CAAe,EAE5BA,EAAkB,WAAW,IAAM,CAClC,aAAa,QAAQ,gBAAiB,EAAE,EAExCP,EAAc,CACb,MAAO,gBACP,KAAM,qEACP,CAAC,CACF,EAAG,IAAc,CAClB,EAEMS,EAAS,CAAC,YAAa,QAAS,aAAc,SAAU,SAAS,EACvE,OAAAA,EAAO,QAASC,GAAU,CACzB,OAAO,iBAAiBA,EAAOF,CAAoB,CACpD,CAAC,EAGDA,EAAqB,EACd,IAAM,CACZC,EAAO,QAASC,GAAU,CACzB,OAAO,oBAAoBA,EAAOF,CAAoB,CACvD,CAAC,EACD,aAAaD,CAAe,CAC7B,CACD,EAAG,CAAC,CAAC,EAEE,CAAC,CACT","names":["src_exports","__export","checkTimeStamp","sendAnalytics","setClientId","setSessionId","useInitializeMetrics","__toCommonJS","makeTimeBasedUID","isLocalStorage","checkTimeStamp","clientId","unixTimestamp","ISOSDate","ISOSDateNow","setSessionId","newId","makeTimeBasedUID","setClientId","import_cookies_next","dataLayerPush","data","_a","isTest","pathname","href","layerEvent","ymTarget","data","isTest","sendAnalyticsToAPI","data","isTest","url","pathname","href","formData","import_fingerprintjs","sendAnalytics","data","fpPromise","FingerprintJS","isLocalStorage","isTest","makeTimeBasedUID","fp","result","e","_ym_uid","_ga","st_client_id","st_session_id","dataLayerPush","ymTarget","sendAnalyticsToAPI","import_react","useInitializeMetrics","isLocalStorage","isClientId","isSessionId","isYearPast","checkTimeStamp","setClientId","setSessionId","sendAnalytics","tabCountStorage","tabCount","handleBeforeUnload","scrollTop","scrollHeight","scrollPercent","inactivityTimer","resetInactivityTimer","events","event"]}
|
package/package.json
CHANGED
|
@@ -1,44 +1,45 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "stone-analytics",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"description": "send stanal",
|
|
5
|
-
"main": "dist/index.cjs",
|
|
6
|
-
"module": "dist/index.js",
|
|
7
|
-
"types": "dist/index.d.ts",
|
|
8
|
-
"exports": {
|
|
9
|
-
".": {
|
|
10
|
-
"import": "./dist/index.js",
|
|
11
|
-
"require": "./dist/index.cjs"
|
|
12
|
-
},
|
|
13
|
-
"./*": "./dist/*"
|
|
14
|
-
},
|
|
15
|
-
"files": [
|
|
16
|
-
"dist"
|
|
17
|
-
],
|
|
18
|
-
"scripts": {
|
|
19
|
-
"build": "tsup",
|
|
20
|
-
"version": "npm run build && git add .",
|
|
21
|
-
"release": "npm version patch && git push --follow-tags && npm publish",
|
|
22
|
-
"prepublishOnly": "npm run build"
|
|
23
|
-
},
|
|
24
|
-
"dependencies": {
|
|
25
|
-
"
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
"react
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
"@types/react
|
|
34
|
-
"
|
|
35
|
-
"
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
1
|
+
{
|
|
2
|
+
"name": "stone-analytics",
|
|
3
|
+
"version": "0.0.22",
|
|
4
|
+
"description": "send stanal",
|
|
5
|
+
"main": "dist/index.cjs",
|
|
6
|
+
"module": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/index.js",
|
|
11
|
+
"require": "./dist/index.cjs"
|
|
12
|
+
},
|
|
13
|
+
"./*": "./dist/*"
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist"
|
|
17
|
+
],
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "tsup",
|
|
20
|
+
"version": "npm run build && git add .",
|
|
21
|
+
"release": "npm version patch && git push --follow-tags && npm publish",
|
|
22
|
+
"prepublishOnly": "npm run build"
|
|
23
|
+
},
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"@fingerprintjs/fingerprintjs": "^4.6.1",
|
|
26
|
+
"cookies-next": "^2.1.2"
|
|
27
|
+
},
|
|
28
|
+
"peerDependencies": {
|
|
29
|
+
"react": "^18.2.0",
|
|
30
|
+
"react-dom": "^18.2.0"
|
|
31
|
+
},
|
|
32
|
+
"devDependencies": {
|
|
33
|
+
"@types/react": "19.0.1",
|
|
34
|
+
"@types/react-dom": "18.0.10",
|
|
35
|
+
"tsup": "^7.0.0",
|
|
36
|
+
"typescript": "^5.8.2"
|
|
37
|
+
},
|
|
38
|
+
"engines": {
|
|
39
|
+
"node": ">=18"
|
|
40
|
+
},
|
|
41
|
+
"publishConfig": {
|
|
42
|
+
"access": "public"
|
|
43
|
+
},
|
|
44
|
+
"license": "MIT"
|
|
45
|
+
}
|