@js-toolkit/web-utils 1.65.0 → 1.66.0
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/getPinchZoomHandlers.d.ts +23 -0
- package/getPinchZoomHandlers.js +1 -0
- package/{ga → metrics/ga}/DataLayerProxy.d.ts +2 -2
- package/metrics/ga/DataLayerProxy.js +1 -0
- package/{ga → metrics/ga}/getHandler.d.ts +9 -6
- package/metrics/ga/getHandler.js +1 -0
- package/{ga → metrics/ga}/types.d.ts +1 -1
- package/metrics/types.d.ts +3 -0
- package/metrics/types.js +1 -0
- package/metrics/yandex/DataLayerProxy.d.ts +7 -0
- package/metrics/yandex/DataLayerProxy.js +1 -0
- package/metrics/yandex/getHandler.d.ts +18 -0
- package/metrics/yandex/getHandler.js +1 -0
- package/metrics/yandex/types.d.ts +13 -0
- package/metrics/yandex/types.js +1 -0
- package/package.json +27 -27
- package/platform/getIOSVersion.js +1 -1
- package/platform/getPlatformInfo.js +1 -1
- package/platform/isAndroid.js +1 -1
- package/platform/isChrome.js +1 -1
- package/platform/isIOS.js +1 -1
- package/platform/isMacOS.js +1 -1
- package/platform/isMobile.js +1 -1
- package/platform/isSafari.js +1 -1
- package/ga/DataLayerProxy.js +0 -1
- package/ga/getHandler.js +0 -1
- package/ga/iframeMessenger.d.ts +0 -6
- package/ga/iframeMessenger.js +0 -1
- /package/{ga → metrics/ga}/types.js +0 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
type TouchLike = Pick<Touch, 'pageX' | 'pageY' | 'clientX' | 'clientY'>;
|
|
2
|
+
type TouchListLike = ArrayLike<TouchLike>;
|
|
3
|
+
type TouchEventLike = Override<Pick<TouchEvent, 'touches' | 'preventDefault' | 'stopPropagation'>, {
|
|
4
|
+
touches: TouchListLike;
|
|
5
|
+
}> & {
|
|
6
|
+
readonly scale?: number;
|
|
7
|
+
};
|
|
8
|
+
type ActionType = 'zoom' | 'move';
|
|
9
|
+
interface PinchZoomHandlers<E extends TouchEventLike = TouchEventLike> {
|
|
10
|
+
onTouchStart: (event: E) => void;
|
|
11
|
+
onTouchMove: (event: E) => void;
|
|
12
|
+
onTouchEnd: (event: E) => void;
|
|
13
|
+
getState: () => ActionType | undefined;
|
|
14
|
+
}
|
|
15
|
+
export interface GetPinchZoomHandlersOptions<E extends TouchEventLike = TouchEventLike> {
|
|
16
|
+
canStart: (action: ActionType, event: E) => boolean;
|
|
17
|
+
onUpdate: (deltaScale: number, deltaOffsetX: number, deltaOffsetY: number) => void;
|
|
18
|
+
onEnd: (x?: number, y?: number) => void;
|
|
19
|
+
getBounds?: () => [target: DOMRect, bounds: DOMRect];
|
|
20
|
+
acceleration?: number;
|
|
21
|
+
}
|
|
22
|
+
export declare function getPinchZoomHandlers<E extends TouchEventLike = TouchEventLike>({ canStart, onUpdate, onEnd, getBounds, acceleration, }: GetPinchZoomHandlersOptions<E>): PinchZoomHandlers<E>;
|
|
23
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{preventDefault}from"./preventDefault";function getDistanceBetweenFingers(e,t){return Math.hypot(t.pageX-e.pageX,t.pageY-e.pageY)}function getPoint(e,t){return t?{x:(e.pageX+t.pageX)/2,y:(e.pageY+t.pageY)/2}:{x:e.pageX,y:e.pageY}}export function getPinchZoomHandlers({canStart:e,onUpdate:t,onEnd:o,getBounds:n,acceleration:i=2}){const c={x:0,y:0,distance:0};let s,g=1,h=0,a=0,r=!1;const l=e=>{s||(r=!1),s=e.touches.length>=2?"zoom":"move",h=0,a=0,"zoom"===s&&(g=1);const t=e.touches[0],o=e.touches[1];Object.assign(c,getPoint(t,o)),c.distance=o?getDistanceBetweenFingers(t,o):0},u=(e,t)=>{s=void 0,o(e,t)};return{onTouchStart:t=>{t.touches.length>2||e(s??"move",t)&&(l(t),"zoom"===s&&preventDefault(t))},onTouchMove:e=>{if(null==s)return;preventDefault(e);const o=e.touches[0],n=e.touches[1],l=getPoint(o,n),u=(l.x-c.x)*i,p=(l.y-c.y)*i,d=u-h,f=p-a;if(h=u,a=p,r=!0,n&&"zoom"===s){const e=getDistanceBetweenFingers(o,n)/c.distance,i=e-g;g=e,t(i,d,f)}else t(0,d,f)},onTouchEnd:e=>{if(s)if(r&&preventDefault(e),1!==e.touches.length){if(!(e.touches.length>0)){if(n&&r){const[e,t]=n(),o=e.left+window.scrollX>t.left,i=e.top+window.scrollY>t.top,c=e.right+window.scrollX<t.right,s=e.bottom+window.scrollY<t.bottom;if(o||i||c||s){const n=o||c?((e.width-t.width)/2||0)-(c?e.width-t.width:0):0,g=i||s?((e.height-t.height)/2||0)-(s?e.height-t.height:0):0;return void u(n,g)}}u()}}else l(e)},getState:()=>s}}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import type { DataLayer } from '../types';
|
|
1
2
|
import { type GAEventData, type GAEventDataTransformerMap } from './getHandler';
|
|
2
|
-
export
|
|
3
|
-
export declare class DataLayerProxy<D extends GAEventData> {
|
|
3
|
+
export declare class DataLayerProxy<D extends GAEventData> implements DataLayer<D> {
|
|
4
4
|
private readonly handler;
|
|
5
5
|
constructor(transformers: GAEventDataTransformerMap<D>);
|
|
6
6
|
push(data: D): void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{getHandler}from"./getHandler";export class DataLayerProxy{handler;constructor(r){const t=getHandler("auto",r);this.handler=t}push(r){this.handler(r)}}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
import { type GAEventMessage } from './iframeMessenger';
|
|
2
1
|
import type { GTMEventData } from './types';
|
|
3
2
|
export interface GAEventData {
|
|
4
3
|
readonly eventCategory: string;
|
|
5
|
-
readonly
|
|
4
|
+
readonly eventType: string;
|
|
6
5
|
readonly label: string | undefined;
|
|
7
6
|
/**
|
|
8
|
-
* Идентификатор потока данных
|
|
7
|
+
* Идентификатор потока данных (номер счетчика в других системах)
|
|
9
8
|
* (https://support.google.com/analytics/answer/12270356?hl=ru).
|
|
10
9
|
*
|
|
11
10
|
* Можно не указывать, если:
|
|
@@ -14,14 +13,18 @@ export interface GAEventData {
|
|
|
14
13
|
*/
|
|
15
14
|
readonly measurementId: string | undefined;
|
|
16
15
|
}
|
|
16
|
+
export interface GAIFrameMessage<T extends string = string, D extends GAEventData = GAEventData> {
|
|
17
|
+
type: T;
|
|
18
|
+
event: D;
|
|
19
|
+
}
|
|
17
20
|
export interface GADataHandler<D extends GAEventData> {
|
|
18
21
|
(data: D): void;
|
|
19
22
|
}
|
|
20
23
|
type GALibType = 'gtm' | 'gtag' | /* 'ga' | */ 'iframe' | 'auto';
|
|
21
|
-
|
|
24
|
+
type GAEventDataTransformer<D extends GAEventData, L extends Extract<GALibType, 'gtm' | 'iframe'>> = (data: D) => {
|
|
22
25
|
readonly gtm: GTMEventData;
|
|
23
|
-
readonly iframe:
|
|
26
|
+
readonly iframe: GAIFrameMessage<string, D>;
|
|
24
27
|
}[L];
|
|
25
28
|
export type GAEventDataTransformerMap<D extends GAEventData, L extends Extract<GALibType, 'gtm' | 'iframe'> = Extract<GALibType, 'gtm' | 'iframe'>> = L extends L ? Record<L, GAEventDataTransformer<D, L>> : never;
|
|
26
|
-
export declare function getHandler<D extends GAEventData, L extends GALibType>(gaLib: L, transformers: L extends '
|
|
29
|
+
export declare function getHandler<D extends GAEventData, L extends GALibType>(gaLib: L, transformers: L extends 'gtag' ? undefined : GAEventDataTransformerMap<D>): GADataHandler<D>;
|
|
27
30
|
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{UnreachableCaseError}from"@js-toolkit/utils/UnreachableCaseError";function gtmHandler(e,r,t){e.push(r(t))}function gtagHandler(e,r){const{eventType:t,eventCategory:n,measurementId:a,label:o}=r;e("event",t,{send_to:a,event_category:n,event_label:o,value:void 0})}function iframeHandler(e,r){window.parent.postMessage({type:e,event:r},"*")}export function getHandler(e,r){switch(e){case"auto":if(window.gtag)return getHandler("gtag",void 0);if(window.dataLayer)return getHandler("gtm",r);if(window.parent!==window)return getHandler("iframe",r);throw new Error("Unable to create auto handler due to Google Analytics is not configured or current window is not inside iframe.");case"iframe":return e=>{const t=r.iframe(e);iframeHandler(t.type,t.event)};case"gtm":{const{dataLayer:e}=window;if(!e)throw new Error("Unable to create handler: `dataLayer` is undefined.");return t=>{gtmHandler(e,r.gtm,t)}}case"gtag":{const{gtag:e}=window;if(!e)throw new Error("Unable to create handler: `gtag` is undefined.");return r=>{gtagHandler(e,r)}}default:throw new UnreachableCaseError(e,`Unknown GA lib type '${e}'.`)}}
|
package/metrics/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { DataLayer } from '../types';
|
|
2
|
+
import { type YAEventDataTransformerMap, type YaLibType, type YMEventData } from './getHandler';
|
|
3
|
+
export declare class DataLayerProxy<D extends YMEventData> implements DataLayer<D> {
|
|
4
|
+
private readonly handler;
|
|
5
|
+
constructor(lib: YaLibType, transformers: YAEventDataTransformerMap<D>);
|
|
6
|
+
push(data: D): void;
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{getHandler}from"./getHandler";export class DataLayerProxy{handler;constructor(r,e){const t=getHandler(r,e);this.handler=t}push(r){this.handler(r)}}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { YTMEventData } from './types';
|
|
2
|
+
export type YMEventData = AnyObject;
|
|
3
|
+
export interface YaIFrameMessage<T extends string = string, D extends YMEventData = YMEventData> {
|
|
4
|
+
type: T;
|
|
5
|
+
event: D;
|
|
6
|
+
}
|
|
7
|
+
export interface YaDataHandler<D extends YMEventData> {
|
|
8
|
+
(data: D): void;
|
|
9
|
+
}
|
|
10
|
+
export type YaLibType = 'ym' | 'ytm' | 'iframe' | 'auto';
|
|
11
|
+
type YAEventDataTransformer<D extends YMEventData, L extends ExtractStrict<YaLibType, 'ytm' | 'ym' | 'iframe'>> = (data: D) => {
|
|
12
|
+
ytm: YTMEventData;
|
|
13
|
+
ym: [counterId: string, fn: 'reachGoal', target: string, params: AnyObject] | [counterId: string, fn: 'params', params: AnyObject];
|
|
14
|
+
iframe: YaIFrameMessage<string, D>;
|
|
15
|
+
}[L];
|
|
16
|
+
export type YAEventDataTransformerMap<D extends YMEventData, L extends ExtractStrict<YaLibType, 'ytm' | 'ym' | 'iframe'> = 'ytm' | 'ym' | 'iframe'> = L extends L ? Record<L, YAEventDataTransformer<D, L>> : never;
|
|
17
|
+
export declare function getHandler<D extends YMEventData, L extends YaLibType>(yaLib: L, transformers: YAEventDataTransformerMap<D>): YaDataHandler<D>;
|
|
18
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{UnreachableCaseError}from"@js-toolkit/utils/UnreachableCaseError";function ytmHandler(e,r,n){e.push(r(n))}function ymHandler(e,r,n){const[t,a,...o]=r(n);e(t,a,...o)}function iframeHandler(e,r){window.parent.postMessage({type:e,event:r},"*")}export function getHandler(e,r){switch(e){case"auto":if(window.ym)return getHandler("ym",r);if(window.dataLayer)return getHandler("ytm",r);if(window.parent!==window)return getHandler("iframe",r);throw new Error("Unable to create auto handler due to Yandex Metrics is not configured or current window is not inside iframe.");case"iframe":return e=>{const n=r.iframe(e);iframeHandler(n.type,n.event)};case"ytm":{const{dataLayer:e}=window;if(!e)throw new Error("Unable to create handler: `dataLayer` is undefined.");return n=>{ytmHandler(e,r.ytm,n)}}case"ym":{const{ym:e}=window;if(!e)throw new Error("Unable to create handler: `ym` is undefined.");return n=>{ymHandler(e,r.ym,n)}}default:throw new UnreachableCaseError(e,`Unknown Ya lib type '${e}'.`)}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@js-toolkit/web-utils",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.66.0",
|
|
4
4
|
"description": "Web utils",
|
|
5
5
|
"author": "VZH",
|
|
6
6
|
"license": "MIT",
|
|
@@ -17,33 +17,33 @@
|
|
|
17
17
|
"minor-publish": "npm run build && npm version minor --force --no-workspaces-update -m 'v%s' && npm run copy:configs && cd ./dist && npm publish --access public && git push --follow-tags"
|
|
18
18
|
},
|
|
19
19
|
"optionalDependencies": {
|
|
20
|
-
"@js-toolkit/node-utils": "
|
|
20
|
+
"@js-toolkit/node-utils": "1.2.6"
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
|
23
|
-
"@eslint/compat": "
|
|
24
|
-
"@eslint/eslintrc": "
|
|
25
|
-
"@eslint/js": "
|
|
26
|
-
"@js-toolkit/configs": "
|
|
27
|
-
"@js-toolkit/utils": "
|
|
28
|
-
"@types/eslint": "
|
|
29
|
-
"@types/lodash.throttle": "
|
|
30
|
-
"@types/uuid": "
|
|
31
|
-
"copyfiles": "
|
|
32
|
-
"eslint": "
|
|
33
|
-
"eslint-config-prettier": "
|
|
34
|
-
"eslint-import-resolver-typescript": "
|
|
35
|
-
"eslint-plugin-import": "
|
|
36
|
-
"eslint-plugin-prettier": "
|
|
37
|
-
"lodash.throttle": "
|
|
38
|
-
"prettier": "
|
|
39
|
-
"reconnecting-websocket": "
|
|
40
|
-
"rimraf": "
|
|
41
|
-
"terser": "
|
|
42
|
-
"typescript": "
|
|
43
|
-
"typescript-eslint": "
|
|
44
|
-
"ua-parser-js": "
|
|
45
|
-
"uuid": "
|
|
46
|
-
"webpack": "
|
|
47
|
-
"yargs": "
|
|
23
|
+
"@eslint/compat": "2.0.0",
|
|
24
|
+
"@eslint/eslintrc": "3.3.3",
|
|
25
|
+
"@eslint/js": "9.39.2",
|
|
26
|
+
"@js-toolkit/configs": "3.99.0",
|
|
27
|
+
"@js-toolkit/utils": "1.60.3",
|
|
28
|
+
"@types/eslint": "9.6.1",
|
|
29
|
+
"@types/lodash.throttle": "4.1.9",
|
|
30
|
+
"@types/uuid": "11.0.0",
|
|
31
|
+
"copyfiles": "2.4.1",
|
|
32
|
+
"eslint": "9.39.2",
|
|
33
|
+
"eslint-config-prettier": "10.1.8",
|
|
34
|
+
"eslint-import-resolver-typescript": "4.4.4",
|
|
35
|
+
"eslint-plugin-import-x": "4.16.1",
|
|
36
|
+
"eslint-plugin-prettier": "5.5.4",
|
|
37
|
+
"lodash.throttle": "4.1.1",
|
|
38
|
+
"prettier": "3.7.4",
|
|
39
|
+
"reconnecting-websocket": "4.4.0",
|
|
40
|
+
"rimraf": "6.1.2",
|
|
41
|
+
"terser": "5.44.1",
|
|
42
|
+
"typescript": "5.9.3",
|
|
43
|
+
"typescript-eslint": "8.50.0",
|
|
44
|
+
"ua-parser-js": "2.0.7",
|
|
45
|
+
"uuid": "13.0.0",
|
|
46
|
+
"webpack": "5.104.0",
|
|
47
|
+
"yargs": "18.0.0"
|
|
48
48
|
}
|
|
49
49
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{getCachedPlatformInfo}from"./getPlatformInfo";import{isIOS}from"./isIOS";import{Semver}from"./Semver";let memo;export function getIOSVersion(){if(void 0===memo){const o=getCachedPlatformInfo();if(!o)return;const{os:e}=o;memo=isIOS()&&e.version?Semver.parse(e.version):null}return memo??void 0}
|
|
1
|
+
import{getCachedPlatformInfo,getPlatformInfoSync}from"./getPlatformInfo";import{isIOS}from"./isIOS";import{Semver}from"./Semver";let memo;export function getIOSVersion(){if(void 0===memo){const o=getCachedPlatformInfo()??getPlatformInfoSync();if(!o)return;const{os:e}=o;memo=isIOS()&&e.version?Semver.parse(e.version):null}return memo??void 0}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{UAParser}from"ua-parser-js";let syncResult,asyncResult,promise;function toPlatformInfo(t){return{...t,toStringObject(){return Object.getOwnPropertyNames(this).reduce((t,e)=>{const n=e;return null!=this[n]&&"function"!=typeof this[n]&&(t[n]=this[n].toString()),t},{})}}}export function getPlatformInfoSync(){return null==syncResult&&(syncResult=toPlatformInfo(new UAParser(navigator.userAgent).getResult().withFeatureCheck())),syncResult}export async function getPlatformInfo(){return null==asyncResult&&(promise=promise??Promise.resolve(new UAParser(navigator.userAgent).getResult().withFeatureCheck().withClientHints()),asyncResult=toPlatformInfo(await promise),syncResult=asyncResult,promise=void 0),asyncResult}export function getCachedPlatformInfo(){return null==asyncResult&&(console.warn("PlatformInfo is not ready yet."),getPlatformInfo()),asyncResult}
|
|
1
|
+
import{UAParser}from"ua-parser-js";let syncResult,asyncResult,promise;function toPlatformInfo(t){return{...t,toStringObject(){return Object.getOwnPropertyNames(this).reduce((t,e)=>{const n=e;return null!=this[n]&&"function"!=typeof this[n]&&(t[n]=this[n].toString()),t},{})}}}export function getPlatformInfoSync(){return null==asyncResult&&null==syncResult&&(syncResult=toPlatformInfo(new UAParser(navigator.userAgent).getResult().withFeatureCheck())),asyncResult??syncResult}export async function getPlatformInfo(){return null==asyncResult&&(promise=promise??Promise.resolve(new UAParser(navigator.userAgent).getResult().withFeatureCheck().withClientHints()),asyncResult=toPlatformInfo(await promise),syncResult=asyncResult,promise=void 0),asyncResult}export function getCachedPlatformInfo(){return null==asyncResult&&(console.warn("PlatformInfo is not ready yet."),getPlatformInfo()),asyncResult}
|
package/platform/isAndroid.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{getCachedPlatformInfo}from"./getPlatformInfo";export function isAndroid(){const o=getCachedPlatformInfo()
|
|
1
|
+
import{getCachedPlatformInfo,getPlatformInfoSync}from"./getPlatformInfo";export function isAndroid(){const o=(getCachedPlatformInfo()??getPlatformInfoSync()).os.name;return"Android"===o||"Android-x86"===o}
|
package/platform/isChrome.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{getCachedPlatformInfo}from"./getPlatformInfo";export function isChrome(){const o=getCachedPlatformInfo()
|
|
1
|
+
import{getCachedPlatformInfo,getPlatformInfoSync}from"./getPlatformInfo";export function isChrome(){const o=(getCachedPlatformInfo()??getPlatformInfoSync()).browser.name;return"Chrome"===o||"Mobile Chrome"===o}
|
package/platform/isIOS.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{getCachedPlatformInfo}from"./getPlatformInfo";import{isMobile}from"./isMobile";export function isIOS(){const o=getCachedPlatformInfo();return
|
|
1
|
+
import{getCachedPlatformInfo,getPlatformInfoSync}from"./getPlatformInfo";import{isMobile}from"./isMobile";export function isIOS(){const o=getCachedPlatformInfo()??getPlatformInfoSync();return"iOS"===o.os.name||isMobile()&&"Apple"===o.device.vendor}
|
package/platform/isMacOS.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{getCachedPlatformInfo}from"./getPlatformInfo";import{isMobile}from"./isMobile";export function isMacOS(){const o=getCachedPlatformInfo()
|
|
1
|
+
import{getCachedPlatformInfo,getPlatformInfoSync}from"./getPlatformInfo";import{isMobile}from"./isMobile";export function isMacOS(){const o=(getCachedPlatformInfo()??getPlatformInfoSync()).os.name;return("Mac OS"===o||"macOS"===o)&&!isMobile()}
|
package/platform/isMobile.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{getCachedPlatformInfo}from"./getPlatformInfo";export function isMobile(){const o=getCachedPlatformInfo()
|
|
1
|
+
import{getCachedPlatformInfo,getPlatformInfoSync}from"./getPlatformInfo";export function isMobile(){const o=getCachedPlatformInfo()??getPlatformInfoSync(),t=o.device.type;return!!("mobile"===t||"tablet"===t||!t&&"Apple"===o.device.vendor&&navigator.maxTouchPoints&&navigator.maxTouchPoints>2)}
|
package/platform/isSafari.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{getCachedPlatformInfo}from"./getPlatformInfo";import{isIOS}from"./isIOS";import{isMacOS}from"./isMacOS";export function isSafari(){const
|
|
1
|
+
import{getCachedPlatformInfo,getPlatformInfoSync}from"./getPlatformInfo";import{isIOS}from"./isIOS";import{isMacOS}from"./isMacOS";export function isSafari(){const o=(getCachedPlatformInfo()??getPlatformInfoSync()).browser.name;return"Safari"===o||"Mobile Safari"===o||"WebKit"===o&&(isIOS()||isMacOS())}
|
package/ga/DataLayerProxy.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{getHandler}from"./getHandler";export class DataLayerProxy{handler;constructor(r){const e=getHandler("auto",r);if(!e)throw new Error("Google Analytics handler is not created.");this.handler=e}push(r){this.handler(r)}}
|
package/ga/getHandler.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{iframeMessenger}from"./iframeMessenger";function gtmHandler(e,t,n){e.push(t(n))}function gtagHandler(e,t){const{action:n,eventCategory:a,measurementId:r,label:o}=t;e("event",n,{send_to:r,event_category:a,event_label:o,value:void 0})}export function getHandler(e,t){switch(e){case"auto":return window.gtag?getHandler("gtag",void 0):window.dataLayer?getHandler("gtm",t):window.parent!==window?getHandler("iframe",t):void 0;case"iframe":return e=>{const n=t.iframe(e);iframeMessenger(n.type,n.event)};case"gtm":{const{dataLayer:e}=window;return e?n=>{gtmHandler(e,t.gtm,n)}:void 0}case"gtag":return window.gtag?gtagHandler.bind(void 0,window.gtag):void 0;default:throw new Error(`Unknown GA lib type '${e}'.`)}}
|
package/ga/iframeMessenger.d.ts
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import type { GAEventData } from './getHandler';
|
|
2
|
-
export interface GAEventMessage<T extends string = string, D extends GAEventData = GAEventData> {
|
|
3
|
-
type: T;
|
|
4
|
-
event: D;
|
|
5
|
-
}
|
|
6
|
-
export declare function iframeMessenger<T extends string, D extends GAEventData>(type: T, data: D): void;
|
package/ga/iframeMessenger.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export function iframeMessenger(e,n){window.parent.postMessage({type:e,event:n},"*")}
|
|
File without changes
|