@js-toolkit/web-utils 1.49.0 → 1.51.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.
@@ -2,6 +2,7 @@ import { EventEmitterListener } from './EventEmitterListener';
2
2
  import type { EmitterTarget, GetEventMap } from './EventEmitterListener.utils';
3
3
  export declare class EventListeners {
4
4
  private readonly listeners;
5
+ getScopes(): IterableIterator<EmitterTarget>;
5
6
  scope<T extends EmitterTarget, M extends AnyObject = GetEventMap<T>>(target: T, scope?: string): EventEmitterListener<T, M>;
6
7
  removeAllListeners<T extends EmitterTarget>(target?: T | undefined, scope?: string): this;
7
8
  }
package/EventListeners.js CHANGED
@@ -1 +1 @@
1
- import{EventEmitterListener}from"./EventEmitterListener";export class EventListeners{constructor(){this.listeners=new Map}scope(e,s){var t,l;const r=null!=s?s:"",i=null!==(t=this.listeners.get(e))&&void 0!==t?t:new Map;!this.listeners.has(e)&&this.listeners.set(e,i);const n=null!==(l=i.get(r))&&void 0!==l?l:new EventEmitterListener(e);return!i.has(r)&&i.set(r,n),n}removeAllListeners(e,s){var t;if(e)if(s){const l=this.listeners.get(e);null===(t=null==l?void 0:l.get(s))||void 0===t||t.removeAllListeners(),null==l||l.delete(s),0===(null==l?void 0:l.size)&&this.listeners.delete(e)}else{const s=this.listeners.get(e);null==s||s.forEach((e=>e.removeAllListeners())),null==s||s.clear(),this.listeners.delete(e)}else this.listeners.forEach((e=>{e.forEach((e=>e.removeAllListeners())),e.clear()})),this.listeners.clear();return this}}
1
+ import{EventEmitterListener}from"./EventEmitterListener";export class EventListeners{constructor(){this.listeners=new Map}getScopes(){return this.listeners.keys()}scope(e,s){var t,l;const r=null!=s?s:"",i=null!==(t=this.listeners.get(e))&&void 0!==t?t:new Map;!this.listeners.has(e)&&this.listeners.set(e,i);const n=null!==(l=i.get(r))&&void 0!==l?l:new EventEmitterListener(e);return!i.has(r)&&i.set(r,n),n}removeAllListeners(e,s){var t;if(e)if(s){const l=this.listeners.get(e);null===(t=null==l?void 0:l.get(s))||void 0===t||t.removeAllListeners(),null==l||l.delete(s),0===(null==l?void 0:l.size)&&this.listeners.delete(e)}else{const s=this.listeners.get(e);null==s||s.forEach((e=>e.removeAllListeners())),null==s||s.clear(),this.listeners.delete(e)}else this.listeners.forEach((e=>{e.forEach((e=>e.removeAllListeners())),e.clear()})),this.listeners.clear();return this}}
@@ -15,8 +15,8 @@ export declare class PipController extends EventEmitter<PipController.EventMap>
15
15
  private readonly listener;
16
16
  constructor(video: HTMLVideoElement);
17
17
  destroy(): Promise<void>;
18
- get isPip(): boolean;
19
- get currentElement(): HTMLVideoElement | null;
18
+ isPip(): boolean;
19
+ getCurrentElement(): HTMLVideoElement | null;
20
20
  request(): Promise<void>;
21
21
  exit(): Promise<void>;
22
22
  }
@@ -26,7 +26,7 @@ export declare namespace PipController {
26
26
  }
27
27
  type EventMap = {
28
28
  [Events.Change]: [{
29
- isPip: boolean;
29
+ pip: boolean;
30
30
  }];
31
31
  };
32
32
  }
package/PipController.js CHANGED
@@ -1 +1 @@
1
- import{EventEmitter}from"eventemitter3";import{EventEmitterListener}from"./EventEmitterListener";const getPipUnavailableError=()=>new Error("PiP is not available");export class PipController extends EventEmitter{static isApiEnabled(){return!!HTMLVideoElement.prototype.requestPictureInPicture&&!!document.exitPictureInPicture&&!!document.pictureInPictureEnabled}static isWebkitApiEnabled(){return!!HTMLVideoElement.prototype.webkitSupportsPresentationMode&&HTMLVideoElement.prototype.webkitSupportsPresentationMode("picture-in-picture")}static isAvailable(e){return this.isApiEnabled()&&!e.disablePictureInPicture||this.isWebkitApiEnabled()}get Events(){return PipController.Events}constructor(e){if(super(),this.listener=new EventEmitterListener(e),PipController.isAvailable(e)){const e=()=>{this.emit(this.Events.Change,{isPip:!0})},t=()=>{this.emit(this.Events.Change,{isPip:!1})};PipController.isApiEnabled()?(this.listener.on("enterpictureinpicture",e),this.listener.on("leavepictureinpicture",t)):this.listener.on("webkitpresentationmodechanged",(()=>{let i=this.listener.target.webkitPresentationMode;return()=>{"picture-in-picture"===this.listener.target.webkitPresentationMode?e():"picture-in-picture"===i&&t(),i=this.listener.target.webkitPresentationMode}})(),!0)}}destroy(){return this.exit().finally((()=>{this.removeAllListeners(),this.listener.removeAllListeners()}))}get isPip(){return PipController.isApiEnabled()?document.pictureInPictureElement===this.listener.target:"picture-in-picture"===this.listener.target.webkitPresentationMode}get currentElement(){return this.isPip?this.listener.target:null}request(){return new Promise(((e,t)=>{if(this.isPip)e();else{if(!PipController.isAvailable(this.listener.target))throw getPipUnavailableError();PipController.isApiEnabled()?this.listener.target.requestPictureInPicture().then((()=>e()),t):(this.listener.once("webkitpresentationmodechanged",(()=>{"picture-in-picture"===this.listener.target.webkitPresentationMode?e():t(new Error("Something went wrong."))}),!0),this.listener.target.webkitSetPresentationMode("picture-in-picture"))}}))}exit(){return new Promise(((e,t)=>{if(this.isPip){if(!PipController.isAvailable(this.listener.target))throw getPipUnavailableError();PipController.isApiEnabled()?document.exitPictureInPicture().then(e,t):(this.listener.once("webkitpresentationmodechanged",(()=>{"picture-in-picture"!==this.listener.target.webkitPresentationMode?e():t(new Error("Something went wrong."))}),!0),this.listener.target.webkitSetPresentationMode("inline"))}else e()}))}}!function(e){let t;!function(e){e.Change="change"}(t=e.Events||(e.Events={}))}(PipController||(PipController={}));
1
+ import{EventEmitter}from"eventemitter3";import{EventEmitterListener}from"./EventEmitterListener";const getPipUnavailableError=()=>new Error("PiP is not available");export class PipController extends EventEmitter{static isApiEnabled(){return!!HTMLVideoElement.prototype.requestPictureInPicture&&!!document.exitPictureInPicture&&!!document.pictureInPictureEnabled}static isWebkitApiEnabled(e){return!!e.webkitSupportsPresentationMode&&e.webkitSupportsPresentationMode("picture-in-picture")}static isAvailable(e){return this.isApiEnabled()&&!e.disablePictureInPicture||this.isWebkitApiEnabled(e)}get Events(){return PipController.Events}constructor(e){if(super(),this.listener=new EventEmitterListener(e),PipController.isAvailable(e)){const e=()=>{this.emit(this.Events.Change,{pip:!0})},t=()=>{this.emit(this.Events.Change,{pip:!1})};PipController.isApiEnabled()?(this.listener.on("enterpictureinpicture",e),this.listener.on("leavepictureinpicture",t)):this.listener.on("webkitpresentationmodechanged",(()=>{let i=this.listener.target.webkitPresentationMode;return()=>{"picture-in-picture"===this.listener.target.webkitPresentationMode?e():"picture-in-picture"===i&&t(),i=this.listener.target.webkitPresentationMode}})(),!0)}}destroy(){return this.exit().finally((()=>{this.removeAllListeners(),this.listener.removeAllListeners()}))}isPip(){return PipController.isApiEnabled()?document.pictureInPictureElement===this.listener.target:"picture-in-picture"===this.listener.target.webkitPresentationMode}getCurrentElement(){return this.isPip()?this.listener.target:null}request(){return new Promise(((e,t)=>{if(this.isPip())e();else{if(!PipController.isAvailable(this.listener.target))throw getPipUnavailableError();PipController.isApiEnabled()?this.listener.target.requestPictureInPicture().then((()=>e()),t):(this.listener.once("webkitpresentationmodechanged",(()=>{"picture-in-picture"===this.listener.target.webkitPresentationMode?e():t(new Error("Something went wrong."))}),!0),this.listener.target.webkitSetPresentationMode("picture-in-picture"))}}))}exit(){return new Promise(((e,t)=>{if(this.isPip()){if(!PipController.isAvailable(this.listener.target))throw getPipUnavailableError();PipController.isApiEnabled()?document.exitPictureInPicture().then(e,t):(this.listener.once("webkitpresentationmodechanged",(()=>{"picture-in-picture"!==this.listener.target.webkitPresentationMode?e():t(new Error("Something went wrong."))}),!0),this.listener.target.webkitSetPresentationMode("inline"))}else e()}))}}!function(e){let t;!function(e){e.Change="change"}(t=e.Events||(e.Events={}))}(PipController||(PipController={}));
@@ -1 +1 @@
1
- import{getHandler}from"./getHandler";export class DataLayerProxy{constructor(r){const e=getHandler("auto",r);if(!e)throw new Error("Data layer for Google Analytics is undefined.");this.handler=e}push(r){this.handler(r)}}
1
+ import{getHandler}from"./getHandler";export class DataLayerProxy{constructor(r){const t=getHandler("auto",r);if(!t)throw new Error("Google Analytics handler is not created.");this.handler=t}push(r){this.handler(r)}}
@@ -1,18 +1,26 @@
1
1
  import { type GAEventMessage } from './iframeMessenger';
2
- import './types';
2
+ import type { GTMEventData } from './types';
3
3
  export interface GAEventData {
4
- eventCategory: string;
5
- action: string;
6
- label: string | undefined;
7
- trackingId: string | undefined;
4
+ readonly eventCategory: string;
5
+ readonly action: string;
6
+ readonly label: string | undefined;
7
+ /**
8
+ * Идентификатор потока данных
9
+ * (https://support.google.com/analytics/answer/12270356?hl=ru).
10
+ *
11
+ * Можно не указывать, если:
12
+ * - используется Google Tag Manager (gtm.js) с настроенным тегом, в котором самостоятельно указан идентификатор потока данных.
13
+ * - используется Google Tag (gtag.js) с указанным идентификатором потока данных по умолчанию.
14
+ */
15
+ readonly measurementId: string | undefined;
8
16
  }
9
17
  export interface GADataHandler<D extends GAEventData> {
10
18
  (data: D): void;
11
19
  }
12
- type GALibType = 'gtm' | 'gtag' | 'ga' | 'iframe' | 'auto';
20
+ type GALibType = 'gtm' | 'gtag' | /* 'ga' | */ 'iframe' | 'auto';
13
21
  export type GAEventDataTransformer<D extends GAEventData, L extends Extract<GALibType, 'gtm' | 'iframe'>> = (data: D) => {
14
- gtm: GTMEventData;
15
- iframe: GAEventMessage<string, D>;
22
+ readonly gtm: GTMEventData;
23
+ readonly iframe: GAEventMessage<string, D>;
16
24
  }[L];
17
25
  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;
18
26
  export declare function getHandler<D extends GAEventData, L extends GALibType>(gaLib: L, transformers: L extends 'auto' | 'gtm' | 'iframe' ? GAEventDataTransformerMap<D> : undefined): GADataHandler<D> | undefined;
package/ga/getHandler.js CHANGED
@@ -1 +1 @@
1
- import{iframeMessenger}from"./iframeMessenger";import"./types";function gtmHandler(e,n,t){e.push(n(t))}function gtagHandler(e,n){const{action:t,eventCategory:a,trackingId:o,label:i}=n;e("event",t,{send_to:o,event_category:a,event_label:i,value:void 0})}function gaHandler(e,n,t){const a=window[e];if(!a)return;const{action:o,eventCategory:i,trackingId:r,label:d}=t,g={hitType:"event",eventCategory:i,eventAction:o,eventLabel:d,eventValue:void 0};if(r){const e=()=>{var e;const t=null!==(e=n[r])&&void 0!==e?e:a.getAll().find((e=>e.get("trackingId")===r));t&&(n[r]=t,t.send(g))};a.loaded?e():a(e)}else a("send",g)}export function getHandler(e,n){switch(e){case"auto":return window.gtag?getHandler("gtag",void 0):window.GoogleAnalyticsObject&&window[window.GoogleAnalyticsObject]||window.ga?getHandler("ga",void 0):window.dataLayer?getHandler("gtm",n):window.parent!==window?getHandler("iframe",n):void 0;case"iframe":return e=>{const t=n.iframe(e);iframeMessenger(t.type,t.event)};case"gtm":{const{dataLayer:e}=window;return e?t=>{gtmHandler(e,n.gtm,t)}:void 0}case"gtag":return window.gtag?gtagHandler.bind(void 0,window.gtag):void 0;case"ga":{const e=window.GoogleAnalyticsObject||"ga";return window[e]?gaHandler.bind(void 0,e,{}):void 0}default:throw new Error(`Unknown GA lib type '${e}'.`)}}
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/types.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- interface GTMEventData {
1
+ export interface GTMEventData {
2
2
  event: string;
3
3
  }
4
4
  interface GTMDataLayer<D extends GTMEventData> {
@@ -11,31 +11,12 @@ interface GTagEventData {
11
11
  send_to: string | undefined;
12
12
  }
13
13
  type GTagParams = [type: 'event', event: string, data: GTagEventData];
14
- interface GAObjectEventData {
15
- hitType: 'event';
16
- eventCategory: string;
17
- eventAction: string;
18
- eventLabel: string | undefined;
19
- eventValue: number | undefined;
20
- }
21
- type GACommandParams = [command: 'send', data: GAObjectEventData];
22
- interface GATracker {
23
- get(field: string): unknown;
24
- send(data: GAObjectEventData): void;
25
- }
26
- interface GAObject {
27
- readonly loaded?: boolean | undefined;
28
- getAll(): GATracker[];
29
- (...params: GACommandParams): void;
30
- (readyCallback: VoidFunction): void;
31
- }
32
- interface Window {
33
- /** Universal Analytics object name, default `ga`. */
34
- GoogleAnalyticsObject?: string | undefined;
35
- /** Universal Analytics without gtag. */
36
- ga?: GAObject | undefined;
37
- /** Global Site Tag */
38
- gtag?: ((...params: GTagParams) => void) | undefined;
39
- /** Google Tag Manager */
40
- dataLayer?: GTMDataLayer<GTMEventData> | undefined;
14
+ declare global {
15
+ interface Window {
16
+ /** Google tag */
17
+ gtag?: ((...params: GTagParams) => void) | undefined;
18
+ /** Google Tag Manager */
19
+ dataLayer?: GTMDataLayer<GTMEventData> | undefined;
20
+ }
41
21
  }
22
+ export {};
package/ga/types.js CHANGED
@@ -1 +1 @@
1
- "use strict";
1
+ export{};
package/loadScript.js CHANGED
@@ -1 +1 @@
1
- import{onDOMReady}from"./onDOMReady";function isScriptAdded(e){const r=e.startsWith("//")?window.location.protocol+e:e;for(let e=0;e<document.scripts.length;e+=1)if(document.scripts[e].src===r)return!0;return!1}export function loadScript(e,{keepScript:r,id:t,async:n=!0,defer:o=!1}={}){return new Promise(((d,i)=>{onDOMReady((()=>{try{if(t){if(document.scripts.namedItem(t))return void d()}else if(isScriptAdded(e))return void d();const c=document.createElement("script"),s=()=>{c.removeEventListener("load",a),c.removeEventListener("error",p),r||c.remove()},a=()=>{s(),d()},p=e=>{s();const r=e instanceof ErrorEvent?e:new Error("Script load error. See previous log messages.");i(r)};t&&(c.id=t),c.async=n,c.defer=o,c.src=e,c.addEventListener("load",a,{once:!0}),c.addEventListener("error",p,{once:!0}),document.head.appendChild(c)}catch(e){i(e)}}))}))}
1
+ import{onDOMReady}from"./onDOMReady";function isScriptAdded(e){const r=e.startsWith("//")?window.location.protocol+e:e;for(let e=0;e<document.scripts.length;e+=1)if(document.scripts[e].src===r)return!0;return!1}export function loadScript(e,{keepScript:r,id:t,async:n=!0,defer:o=!1}={}){return new Promise(((d,i)=>{onDOMReady((()=>{try{if(t){if(document.scripts.namedItem(t))return void d()}else if(isScriptAdded(e))return void d();const c=document.createElement("script"),s=()=>{c.removeEventListener("load",a),c.removeEventListener("error",p),r||c.remove()},a=()=>{s(),d()},p=r=>{s();const t=r instanceof ErrorEvent?r:new Error(`Unable to load script by url ${e}. See previous log messages.`,{cause:r});i(t)};t&&(c.id=t),c.async=n,c.defer=o,c.src=e,c.addEventListener("load",a,{once:!0}),c.addEventListener("error",p,{once:!0}),document.head.appendChild(c)}catch(e){i(e)}}))}))}
@@ -0,0 +1,5 @@
1
+ export interface BaseMediaController<T extends HTMLMediaElement = HTMLMediaElement> {
2
+ attach(media: T, ...args: unknown[]): void;
3
+ detach(): void;
4
+ destroy(): void;
5
+ }
@@ -0,0 +1 @@
1
+ export{};
@@ -1,12 +1,13 @@
1
+ import type { BaseMediaController } from './BaseMediaController';
1
2
  export declare function attachMediaStream(media: HTMLMediaElement, stream: MediaStream | undefined): void;
2
3
  export declare function removeTrack(mediaStream: MediaStream, track: MediaStreamTrack): void;
3
4
  export declare function addTrack(mediaStream: MediaStream, track: MediaStreamTrack, onEnded?: VoidFunction | undefined): void;
4
- export declare class MediaStreamController {
5
+ export declare class MediaStreamController implements BaseMediaController {
5
6
  private mediaStream;
6
7
  private media;
7
8
  constructor(mediaStream: MediaStream);
8
- attachMedia(media: HTMLMediaElement): void;
9
- detachMedia(): void;
9
+ attach(media: HTMLMediaElement): void;
10
+ detach(): void;
10
11
  updateStream(stream: MediaStream): void;
11
12
  removeTrack(track: MediaStreamTrack): void;
12
13
  addTrack(track: MediaStreamTrack, onEnded?: VoidFunction | undefined): void;
@@ -1 +1 @@
1
- import{resetMedia}from"./resetMedia";export function attachMediaStream(e,t){t&&t.active&&e.muted&&0===t.getVideoTracks().filter((e=>!e.getSettings().displaySurface)).length?e.srcObject=null:e.srcObject=t&&t.active?t:null}export function removeTrack(e,t){e.removeTrack(t),e.dispatchEvent(new MediaStreamTrackEvent("removetrack",{track:t}))}export function addTrack(e,t,a){e.addTrack(t),e.dispatchEvent(new MediaStreamTrackEvent("addtrack",{track:t})),t.addEventListener("ended",(()=>{removeTrack(e,t),a&&a()}),{once:!0})}export class MediaStreamController{constructor(e){this.mediaStream=e}attachMedia(e){this.media=e,attachMediaStream(e,this.mediaStream)}detachMedia(){if(this.media){const{media:e}=this;this.media=void 0,resetMedia(e)}}updateStream(e){if(this.mediaStream===e)return;const{media:t}=this;this.mediaStream=e,t&&this.attachMedia(t)}removeTrack(e){removeTrack(this.mediaStream,e)}addTrack(e,t){addTrack(this.mediaStream,e,(()=>{this.removeTrack(e),t&&t()}))}reset(){this.mediaStream.getTracks().forEach((e=>{e.stop(),this.removeTrack(e)}))}destroy(){this.detachMedia(),this.reset()}}
1
+ import{resetMedia}from"./resetMedia";export function attachMediaStream(e,t){t&&t.active&&e.muted&&0===t.getVideoTracks().filter((e=>!e.getSettings().displaySurface)).length?e.srcObject=null:e.srcObject=t&&t.active?t:null}export function removeTrack(e,t){e.removeTrack(t),e.dispatchEvent(new MediaStreamTrackEvent("removetrack",{track:t}))}export function addTrack(e,t,a){e.addTrack(t),e.dispatchEvent(new MediaStreamTrackEvent("addtrack",{track:t})),t.addEventListener("ended",(()=>{removeTrack(e,t),a&&a()}),{once:!0})}export class MediaStreamController{constructor(e){this.mediaStream=e}attach(e){this.media=e,attachMediaStream(e,this.mediaStream)}detach(){if(this.media){const{media:e}=this;this.media=void 0,resetMedia(e)}}updateStream(e){if(this.mediaStream===e)return;const{media:t}=this;this.mediaStream=e,t&&this.attach(t)}removeTrack(e){removeTrack(this.mediaStream,e)}addTrack(e,t){addTrack(this.mediaStream,e,(()=>{this.removeTrack(e),t&&t()}))}reset(){this.mediaStream.getTracks().forEach((e=>{e.stop(),this.removeTrack(e)}))}destroy(){this.detach(),this.reset()}}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@js-toolkit/web-utils",
3
- "version": "1.49.0",
3
+ "version": "1.51.0",
4
4
  "description": "Web utils",
5
5
  "author": "VZH",
6
6
  "license": "MIT",
@@ -17,25 +17,25 @@
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": "^1.1.7"
20
+ "@js-toolkit/node-utils": "^1.2.0"
21
21
  },
22
22
  "devDependencies": {
23
- "@js-toolkit/configs": "^3.88.2",
23
+ "@js-toolkit/configs": "^3.90.0",
24
24
  "@js-toolkit/utils": "^1.50.0",
25
25
  "@types/uuid": "^9.0.7",
26
- "@typescript-eslint/eslint-plugin": "^6.14.0",
27
- "@typescript-eslint/parser": "^6.14.0",
26
+ "@typescript-eslint/eslint-plugin": "^6.19.0",
27
+ "@typescript-eslint/parser": "^6.19.0",
28
28
  "copyfiles": "^2.4.1",
29
- "eslint": "^8.55.0",
29
+ "eslint": "^8.56.0",
30
30
  "eslint-config-airbnb-base": "^15.0.0",
31
31
  "eslint-config-prettier": "^9.1.0",
32
- "eslint-plugin-import": "^2.29.0",
33
- "eslint-plugin-prettier": "^5.0.1",
32
+ "eslint-plugin-import": "^2.29.1",
33
+ "eslint-plugin-prettier": "^5.1.3",
34
34
  "eventemitter3": "^5.0.1",
35
- "prettier": "^3.1.1",
35
+ "prettier": "^3.2.4",
36
36
  "reconnecting-websocket": "^4.4.0",
37
37
  "rimraf": "^5.0.5",
38
- "terser": "^5.26.0",
38
+ "terser": "^5.27.0",
39
39
  "typescript": "^5.3.3",
40
40
  "ua-parser-js": "^2.0.0-beta.1",
41
41
  "uuid": "^9.0.1",
@@ -1 +1 @@
1
- import{getCachedUAInfo}from"./ua";import{isIOS}from"./isIOS";let memo;export function getIOSVersion(){if(void 0===memo){const o=getCachedUAInfo();if(!o)return;const{os:e}=o,t=isIOS()&&e.version&&/(\d+)\.(\d+)(?:\.(\d+))?/.exec(e.version);memo=t?{major:parseInt(t[1],10)||0,minor:parseInt(t[2],10)||0,patch:parseInt(t[3],10)||0,toString(){return`${this.major}_${this.minor}_${this.patch}`}}:null}return null!=memo?memo:void 0}
1
+ import{getCachedPlatformInfo}from"./getPlatformInfo";import{isIOS}from"./isIOS";let memo;export function getIOSVersion(){if(void 0===memo){const o=getCachedPlatformInfo();if(!o)return;const{os:t}=o,r=isIOS()&&t.version&&/(\d+)\.(\d+)(?:\.(\d+))?/.exec(t.version);memo=r?{major:parseInt(r[1],10)||0,minor:parseInt(r[2],10)||0,patch:parseInt(r[3],10)||0,toString(){return`${this.major}_${this.minor}_${this.patch}`}}:null}return null!=memo?memo:void 0}
@@ -0,0 +1,7 @@
1
+ import 'ua-parser-js/src/main/ua-parser';
2
+ type PlatformInfo = DeepReadonly<OmitStrict<UAParser.IResult, 'withClientHints' | 'withFeatureCheck'>> & {
3
+ toStringObject(): Record<Keys<ExcludeKeysOfType<UAParser.IResult, AnyFunction>>, string>;
4
+ };
5
+ export declare function getPlatformInfo(): Promise<PlatformInfo>;
6
+ export declare function getCachedPlatformInfo(): PlatformInfo | undefined;
7
+ export {};
@@ -0,0 +1 @@
1
+ import{__awaiter}from"tslib";import{UAParser}from"ua-parser-js";import"ua-parser-js/src/main/ua-parser";let result,promise;export function getPlatformInfo(){return __awaiter(this,void 0,void 0,(function*(){return null==result&&(promise=null!=promise?promise:Promise.resolve(new UAParser(navigator.userAgent).getResult().withFeatureCheck().withClientHints()),result=Object.assign(Object.assign({},yield promise),{toStringObject(){return Object.getOwnPropertyNames(this).reduce(((t,r)=>{const e=r;return null!=this[e]&&"function"!=typeof this[e]&&(t[e]=this[e].toString()),t}),{})}}),promise=void 0),result}))}export function getCachedPlatformInfo(){return null==result&&(console.warn("PlatformInfo is not ready yet."),getPlatformInfo()),result}
@@ -1 +1 @@
1
- import{getCachedUAInfo}from"./ua";export function isAndroid(){const n=getCachedUAInfo();if(!n)return!1;const o=n.os.name;return"Android"===o||"Android-x86"===o}
1
+ import{getCachedPlatformInfo}from"./getPlatformInfo";export function isAndroid(){const o=getCachedPlatformInfo();if(!o)return!1;const n=o.os.name;return"Android"===n||"Android-x86"===n}
package/platform/isIOS.js CHANGED
@@ -1 +1 @@
1
- import{getCachedUAInfo}from"./ua";import{isMobile}from"./isMobile";export function isIOS(){const e=getCachedUAInfo();return!!e&&("iOS"===e.os.name||isMobile()&&"Apple"===e.device.vendor)}
1
+ import{getCachedPlatformInfo}from"./getPlatformInfo";import{isMobile}from"./isMobile";export function isIOS(){const o=getCachedPlatformInfo();return!!o&&("iOS"===o.os.name||isMobile()&&"Apple"===o.device.vendor)}
@@ -1 +1 @@
1
- import{getCachedUAInfo}from"./ua";import{isMobile}from"./isMobile";export function isMacOS(){const o=getCachedUAInfo();if(!o)return!1;const e=o.os.name;return("Mac OS"===e||"macOS"===e)&&!isMobile()}
1
+ import{getCachedPlatformInfo}from"./getPlatformInfo";import{isMobile}from"./isMobile";export function isMacOS(){const o=getCachedPlatformInfo();if(!o)return!1;const t=o.os.name;return("Mac OS"===t||"macOS"===t)&&!isMobile()}
@@ -1 +1 @@
1
- import{getCachedUAInfo}from"./ua";export function isMobile(){const e=getCachedUAInfo();if(!e)return!1;const o=e.device.type;return!!("mobile"===o||"tablet"===o||!o&&"Apple"===e.device.vendor&&navigator.maxTouchPoints&&navigator.maxTouchPoints>2)}
1
+ import{getCachedPlatformInfo}from"./getPlatformInfo";export function isMobile(){const o=getCachedPlatformInfo();if(!o)return!1;const t=o.device.type;return!!("mobile"===t||"tablet"===t||!t&&"Apple"===o.device.vendor&&navigator.maxTouchPoints&&navigator.maxTouchPoints>2)}
@@ -1 +1 @@
1
- import{getCachedUAInfo}from"./ua";import{isIOS}from"./isIOS";import{isMacOS}from"./isMacOS";export function isSafari(){const i=getCachedUAInfo();if(!i)return!1;const r=i.browser.name;return"Safari"===r||"Mobile Safari"===r||"WebKit"===r&&(isIOS()||isMacOS())}
1
+ import{getCachedPlatformInfo}from"./getPlatformInfo";import{isIOS}from"./isIOS";import{isMacOS}from"./isMacOS";export function isSafari(){const r=getCachedPlatformInfo();if(!r)return!1;const o=r.browser.name;return"Safari"===o||"Mobile Safari"===o||"WebKit"===o&&(isIOS()||isMacOS())}
package/platform/ua.d.ts DELETED
@@ -1,4 +0,0 @@
1
- type UAInfo = DeepReadonly<OmitStrict<UAParser.IResult, 'withClientHints'>>;
2
- export declare function getUAInfo(): Promise<UAInfo>;
3
- export declare function getCachedUAInfo(): UAInfo | undefined;
4
- export {};
package/platform/ua.js DELETED
@@ -1 +0,0 @@
1
- import{__awaiter}from"tslib";import{UAParser}from"ua-parser-js";let result,promise;export function getUAInfo(){return __awaiter(this,void 0,void 0,(function*(){return null==result&&(promise=null!=promise?promise:Promise.resolve(new UAParser(navigator.userAgent).getResult().withClientHints()),result=yield promise,promise=void 0),result}))}export function getCachedUAInfo(){return result}