@js-toolkit/web-utils 1.65.0 → 1.67.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/responsive/MediaQuery.d.ts +18 -0
- package/responsive/MediaQuery.js +1 -0
- package/responsive/MediaQueryListener.d.ts +19 -0
- package/responsive/MediaQueryListener.js +1 -0
- package/responsive/ViewSize.d.ts +45 -0
- package/responsive/ViewSize.js +1 -0
- package/responsive/getViewSizeQueryMap.d.ts +2 -0
- package/responsive/getViewSizeQueryMap.js +1 -0
- 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.67.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.1",
|
|
24
|
+
"@eslint/eslintrc": "3.3.3",
|
|
25
|
+
"@eslint/js": "9.39.2",
|
|
26
|
+
"@js-toolkit/configs": "3.99.1",
|
|
27
|
+
"@js-toolkit/utils": "1.61.0",
|
|
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.5",
|
|
37
|
+
"lodash.throttle": "4.1.1",
|
|
38
|
+
"prettier": "3.8.0",
|
|
39
|
+
"reconnecting-websocket": "4.4.0",
|
|
40
|
+
"rimraf": "6.1.2",
|
|
41
|
+
"terser": "5.46.0",
|
|
42
|
+
"typescript": "5.9.3",
|
|
43
|
+
"typescript-eslint": "8.53.1",
|
|
44
|
+
"ua-parser-js": "2.0.8",
|
|
45
|
+
"uuid": "13.0.0",
|
|
46
|
+
"webpack": "5.104.1",
|
|
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())}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { MediaQueryListener, type MediaQueryEventHandler } from './MediaQueryListener';
|
|
2
|
+
import type { ViewSize } from './ViewSize';
|
|
3
|
+
export type { MediaQueryEvent, MediaQueryEventHandler } from './MediaQueryListener';
|
|
4
|
+
export declare abstract class MediaQuery {
|
|
5
|
+
private static _listener;
|
|
6
|
+
static get listener(): MediaQueryListener;
|
|
7
|
+
static get isInitialized(): boolean;
|
|
8
|
+
static get currentViewSize(): ViewSize;
|
|
9
|
+
static get currentViewSizeValues(): ViewSize.Values;
|
|
10
|
+
static addListener(listener: MediaQueryEventHandler): void;
|
|
11
|
+
static removeListener(listener: MediaQueryEventHandler): boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Init all media queries for handle changes.
|
|
14
|
+
* Safe for multiple calls.
|
|
15
|
+
*/
|
|
16
|
+
static init(): ViewSize;
|
|
17
|
+
static destroy(): void;
|
|
18
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{MediaQueryListener}from"./MediaQueryListener";export class MediaQuery{static _listener;static get listener(){if(!this._listener)throw new Error("Media queries is not initialized. You should initialize it before by call `init` method.");return this._listener}static get isInitialized(){return null!=this._listener}static get currentViewSize(){return this.listener.currentViewSize}static get currentViewSizeValues(){return this.listener.currentViewSizeQuery}static addListener(e){this.listener.addListener(e)}static removeListener(e){return this.listener.removeListener(e)}static init(){return this._listener??=new MediaQueryListener,this.currentViewSize}static destroy(){this._listener&&this._listener.destroy()}}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ViewSize } from './ViewSize';
|
|
2
|
+
export interface MediaQueryEvent extends Pick<MediaQueryListEvent, 'matches'> {
|
|
3
|
+
readonly viewSize: ViewSize;
|
|
4
|
+
}
|
|
5
|
+
export type MediaQueryEventHandler = (event: MediaQueryEvent) => void;
|
|
6
|
+
export declare class MediaQueryListener implements Disposable {
|
|
7
|
+
private _currentViewSize;
|
|
8
|
+
private readonly mediaQueries;
|
|
9
|
+
private readonly listeners;
|
|
10
|
+
readonly queries: Readonly<Record<ViewSize, string>>;
|
|
11
|
+
get currentViewSize(): ViewSize;
|
|
12
|
+
get currentViewSizeQuery(): ViewSize.Values;
|
|
13
|
+
/** Init all media queries for handle changes. */
|
|
14
|
+
constructor();
|
|
15
|
+
addListener(listener: MediaQueryEventHandler): void;
|
|
16
|
+
removeListener(listener: MediaQueryEventHandler): boolean;
|
|
17
|
+
destroy(): void;
|
|
18
|
+
[Symbol.dispose](): void;
|
|
19
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{ViewSize}from"./ViewSize";import{getViewSizeQueryMap}from"./getViewSizeQueryMap";export class MediaQueryListener{_currentViewSize;mediaQueries=[];listeners=new Set;queries;get currentViewSize(){if(!this._currentViewSize)throw new Error(`Media queries is not initialized properly. Current view size is ${String(this._currentViewSize)}.`);return this._currentViewSize}get currentViewSizeQuery(){return ViewSize.values[this.currentViewSize]}constructor(){this.queries=getViewSizeQueryMap(),Object.entries(this.queries).forEach(([e,i])=>{const r=ViewSize.of(e),t=window.matchMedia(i);this.mediaQueries.push(t),t.onchange=({matches:e})=>{e&&(this._currentViewSize=r),this.listeners.forEach(i=>i({viewSize:r,matches:e}))},t.matches&&(this._currentViewSize=r)})}addListener(e){this.listeners.add(e)}removeListener(e){return this.listeners.delete(e)}destroy(){this.mediaQueries.splice(0,this.mediaQueries.length).forEach(e=>{e.onchange=null}),this.listeners.clear()}[Symbol.dispose](){return this.destroy()}}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export declare enum ViewSize {
|
|
2
|
+
/** minWidth=0, maxWidth=319 */
|
|
3
|
+
xxxxs = 1,
|
|
4
|
+
/** minWidth=320, maxWidth=479 */
|
|
5
|
+
xxxs = 2,
|
|
6
|
+
/** minWidth=480, maxWidth=639 */
|
|
7
|
+
xxs = 3,
|
|
8
|
+
/** minWidth=640, maxWidth=827 */
|
|
9
|
+
xs = 4,
|
|
10
|
+
/** minWidth=828, maxWidth=1023 */
|
|
11
|
+
s = 5,
|
|
12
|
+
/** minWidth=1024, maxWidth=1365 */
|
|
13
|
+
m = 6,
|
|
14
|
+
/** minWidth=1366, maxWidth=1599 */
|
|
15
|
+
l = 7,
|
|
16
|
+
/** minWidth=1600, maxWidth=1919 */
|
|
17
|
+
xl = 8,
|
|
18
|
+
/** minWidth=1920, maxWidth=2559 */
|
|
19
|
+
xxl = 9,
|
|
20
|
+
/** minWidth=2560, maxWidth=3839 */
|
|
21
|
+
xxxl = 10,
|
|
22
|
+
/** minWidth=3840, maxWidth=7679 */
|
|
23
|
+
xxxxl = 11,
|
|
24
|
+
/** minWidth=7680, maxWidth=Number.MAX_SAFE_INTEGER */
|
|
25
|
+
xxxxxl = 12
|
|
26
|
+
}
|
|
27
|
+
export declare namespace ViewSize {
|
|
28
|
+
type Type = ExtractKeysOfType<typeof ViewSize, number>;
|
|
29
|
+
type Keys = keyof Type;
|
|
30
|
+
interface Values {
|
|
31
|
+
readonly minWidth: number;
|
|
32
|
+
readonly maxWidth: number;
|
|
33
|
+
}
|
|
34
|
+
/** All values are unique. */
|
|
35
|
+
const values: Readonly<Record<ViewSize, Values>>;
|
|
36
|
+
function of(viewSizeNumber: string): ViewSize;
|
|
37
|
+
function keyOf(viewSize: ViewSize): Keys;
|
|
38
|
+
/** Sorted values. */
|
|
39
|
+
const valueList: readonly (readonly [ViewSize, Values])[];
|
|
40
|
+
function get(width: number): ViewSize;
|
|
41
|
+
function lt(size: ViewSize, than: ViewSize): boolean;
|
|
42
|
+
function lte(size: ViewSize, than: ViewSize): boolean;
|
|
43
|
+
function gt(size: ViewSize, than: ViewSize): boolean;
|
|
44
|
+
function gte(size: ViewSize, than: ViewSize): boolean;
|
|
45
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export var ViewSize;!function(x){x[x.xxxxs=1]="xxxxs",x[x.xxxs=2]="xxxs",x[x.xxs=3]="xxs",x[x.xs=4]="xs",x[x.s=5]="s",x[x.m=6]="m",x[x.l=7]="l",x[x.xl=8]="xl",x[x.xxl=9]="xxl",x[x.xxxl=10]="xxxl",x[x.xxxxl=11]="xxxxl",x[x.xxxxxl=12]="xxxxxl"}(ViewSize||(ViewSize={})),function(x){function i(i){const t=+i,n=Number.isFinite(t)?x[t]:i;return x[n]}x.values={[x.xxxxs]:{minWidth:0,maxWidth:319},[x.xxxs]:{minWidth:320,maxWidth:479},[x.xxs]:{minWidth:480,maxWidth:639},[x.xs]:{minWidth:640,maxWidth:827},[x.s]:{minWidth:828,maxWidth:1023},[x.m]:{minWidth:1024,maxWidth:1365},[x.l]:{minWidth:1366,maxWidth:1599},[x.xl]:{minWidth:1600,maxWidth:1919},[x.xxl]:{minWidth:1920,maxWidth:2559},[x.xxxl]:{minWidth:2560,maxWidth:3839},[x.xxxxl]:{minWidth:3840,maxWidth:7679},[x.xxxxxl]:{minWidth:7680,maxWidth:Number.MAX_SAFE_INTEGER}},x.of=i,x.keyOf=function(i){return x[i]},x.valueList=Object.entries(x.values).map(([x,t])=>[i(x),t]).sort(([,x],[,i])=>x.minWidth-i.minWidth),x.get=function(i){return x.valueList.find(([,x])=>i>=x.minWidth&&i<=x.maxWidth)?.[0]??x.valueList.at(-1)[0]},x.lt=function(x,i){return x<i},x.lte=function(x,i){return x<=i},x.gt=function(x,i){return x>i},x.gte=function(x,i){return x>=i}}(ViewSize||(ViewSize={}));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{ViewSize}from"./ViewSize";export function getViewSizeQueryMap(){return ViewSize.valueList.reduce((e,[i,{minWidth:t,maxWidth:n}])=>(e[i]=`only screen and (min-width: ${t}px) and (max-width: ${n}px)`,e),{})}
|
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
|