@detector-js/feature
Version:
DetectorJS Feature Module
1 lines • 59.2 kB
Source Map (JSON)
{"mappings":"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","sources":["<anon>","packages/feature/lib/feature.ts","packages/feature/lib/audioFeature.ts","packages/feature/lib/videoFeature.ts"],"sourcesContent":["import {Asserts as $j3TDB$Asserts, CssFlagsClass as $j3TDB$CssFlagsClass} from \"@detector-js/core\";\n\nfunction $parcel$export(e, n, v, s) {\n Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\n\nvar $7cd421dc85d63a63$exports = {};\n\n$parcel$export($7cd421dc85d63a63$exports, \"AudioFeature\", () => $7cd421dc85d63a63$export$ae7d97a50b8bcedb);\n\nclass $7cd421dc85d63a63$export$ae7d97a50b8bcedb extends (0, $j3TDB$CssFlagsClass) {\n #audioElement;\n /**\n * Creates an instance of AudioFeature.\n * @param {any} [ua=null]\n * @param {any} [flags={}]\n * @param {string} [cssFlagsPrefix='audio']\n *\n * @memberOf AudioFeature\n */ constructor(ua = null, flags = {}, cssFlagsPrefix = \"audio\"){\n super(ua, flags, cssFlagsPrefix);\n this.#createTestElements();\n this.context = this.getContext();\n this.formats = {\n mp3: this.getMp3(),\n webm: this.getWebm(),\n ogg: this.getOgg(),\n opus: this.getOpus(),\n wav: this.getWav(),\n m4a: this.getM4a()\n };\n }\n /**\n *\n *\n * @memberof AudioFeature\n */ #createTestElements() {\n this.#audioElement = this.document.createElement(\"audio\");\n }\n // /**\n // *\n // *\n // * @memberof AudioFeature\n // */\n // _destroyTestElements() {\n // this.#audioElement = null;\n // delete this.#audioElement;\n // }\n /**\n *\n *\n * @readonly\n *\n * @memberOf AudioFeature\n */ get supported() {\n return (0, $j3TDB$Asserts).all([\n \"Audio\" in this.root,\n \"HTMLAudioElement\" in this.root,\n \"HTMLMediaElement\" in this.root,\n ()=>!!this.#audioElement && \"canPlayType\" in this.#audioElement && this.#audioElement instanceof HTMLAudioElement && this.#audioElement instanceof HTMLMediaElement\n ], true);\n }\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf AudioFeature\n */ getContext() {\n return (0, $j3TDB$Asserts).one([\n \"AudioContext\" in this.root,\n \"webkitAudioContext\" in this.root\n ]);\n }\n /**\n *__\n *\n * @returns boolean\n *\n * @memberOf AudioFeature\n */ getMp3() {\n return (0, $j3TDB$Asserts).all([\n ()=>this.supported && this.#audioElement.canPlayType(\"audio/mpeg;\").replace(/^no$/, \"\") !== \"\"\n ], true);\n }\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf AudioFeature\n */ getWebm() {\n return (0, $j3TDB$Asserts).all([\n ()=>this.supported && this.#audioElement.canPlayType('audio/webm; codecs=\"vorbis\"').replace(/^no$/, \"\") !== \"\"\n ], true);\n }\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf AudioFeature\n */ getOgg() {\n return (0, $j3TDB$Asserts).all([\n ()=>this.supported && this.#audioElement.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/^no$/, \"\") !== \"\"\n ], true);\n }\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf AudioFeature\n */ getOpus() {\n return (0, $j3TDB$Asserts).all([\n ()=>this.supported && this.#audioElement.canPlayType('audio/ogg; codecs=\"opus\"').replace(/^no$/, \"\") !== \"\"\n ], true);\n }\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf AudioFeature\n */ getWav() {\n return (0, $j3TDB$Asserts).all([\n ()=>this.supported && this.#audioElement.canPlayType('audio/wav; codecs=\"1\"').replace(/^no$/, \"\") !== \"\"\n ], true);\n }\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf AudioFeature\n */ getM4a() {\n return (0, $j3TDB$Asserts).all([\n ()=>this.supported && (this.#audioElement.canPlayType(\"audio/x-m4a;\").replace(/^no$/, \"\") || this.#audioElement.canPlayType(\"audio/aac;\").replace(/^no$/, \"\")) !== \"\"\n ], true);\n }\n}\n\n\nvar $46289615aff459c2$exports = {};\n\n$parcel$export($46289615aff459c2$exports, \"VideoFeature\", () => $46289615aff459c2$export$4d7d44add0424e8a);\n\nclass $46289615aff459c2$export$4d7d44add0424e8a extends (0, $j3TDB$CssFlagsClass) {\n #videoElement;\n /**\n * Creates an instance of VideoFeature.\n * @param {any} [ua=null]\n * @param {any} [flags={}]\n * @param {string} [cssFlagsPrefix='video']\n *\n * @memberOf VideoFeature\n */ constructor(ua = null, flags = {}, cssFlagsPrefix = \"video\"){\n super(ua, flags, cssFlagsPrefix);\n this._createTestElements();\n this.formats = {\n mp4: this.getMp4(),\n ogv: this.getOgv(),\n webm: this.getWebm()\n };\n }\n /**\n *\n *\n * @memberof VideoFeature\n */ _createTestElements() {\n this.#videoElement = this.document.createElement(\"video\");\n }\n // /**\n // *\n // *\n // * @memberof VideoFeature\n // */\n // _destroyTestElements() {\n // this._viewElement = null;\n // delete this._videoElement;\n // }\n /**\n *\n *\n * @readonly\n *\n * @memberOf VideoFeature\n */ get supported() {\n return (0, $j3TDB$Asserts).all([\n \"HTMLVideoElement\" in this.root,\n \"HTMLMediaElement\" in this.root,\n ()=>!!this.#videoElement && \"canPlayType\" in this.#videoElement && this.#videoElement instanceof HTMLVideoElement && this.#videoElement instanceof HTMLMediaElement\n ], true);\n }\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf VideoFeature\n */ getMp4() {\n return (0, $j3TDB$Asserts).all([\n ()=>this.supported && this.#videoElement.canPlayType('video/mp4; codecs=\"avc1.42E01E, mp4a.40.2\"').replace(/^no$/, \"\") !== \"\"\n ], true);\n }\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf VideoFeature\n */ getOgv() {\n return (0, $j3TDB$Asserts).all([\n ()=>this.supported && this.#videoElement.canPlayType('video/ogg; codecs=\"theora, vorbis\"').replace(/^no$/, \"\") !== \"\"\n ], true);\n }\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf VideoFeature\n */ getWebm() {\n return (0, $j3TDB$Asserts).all([\n ()=>this.supported && this.#videoElement.canPlayType('video/webm; codecs=\"vp8, vorbis\"').replace(/^no$/, \"\") !== \"\"\n ], true);\n }\n}\n\n\nclass $903c311c8572dd0d$export$6e91cf7616333d5 extends (0, $j3TDB$CssFlagsClass) {\n #cssPrefixes;\n #script;\n #canvas;\n #div;\n #input;\n #img;\n #xmlHttpRequest;\n /**\n * Creates an instance of Feature.\n * @param {any} [ua=null]\n * @param {any} [flags={}]\n * @param {string} [cssFlagsPrefix='feature']\n *\n * @memberOf Feature\n */ constructor(ua = null, flags = {}, cssFlagsPrefix = \"feature\"){\n super(ua, flags, cssFlagsPrefix);\n this.#createTestElements();\n this.addEventListener = this.getAddEventListener();\n this.asyncScript = this.getAsyncScript();\n this.battery = this.getBattery();\n this.cors = this.getCors();\n this.deferScript = this.getDeferScript();\n this.file = this.getFile();\n this.fileSystem = this.getFileSystem();\n this.fullscreen = this.getFullscreen();\n this.fullscreenKeyboard = this.getFullscreenKeyboard();\n this.geolocation = this.getGeolocation();\n this.historyAPI = this.getHistoryAPI();\n this.littleEndian = this.getLittleEndian();\n this.localStorage = this.getLocalStorage();\n this.matchMedia = this.getMatchMedia();\n this.querySelector = this.getQuerySelector();\n this.querySelectorAll = this.getQuerySelectorAll();\n this.serviceWorker = this.getServiceWorker();\n this.typedArray = this.getTypedArray();\n this.userMedia = this.getUserMedia();\n this.vibration = this.getVibration();\n this.worker = this.getWorker();\n }\n /**\n *\n *\n * @param {any} prop\n * @param {any} [prefixes=this.#cssPrefixes]\n * @returns {string}\n *\n * @memberOf Feature\n */ #getCssPrefixedProp(prop, prefixes = this.#cssPrefixes) {\n prop = prop.toCamelCase();\n const prefixedProps = prefixes.map((item)=>{\n return (item === \"spec\" ? \"\" : \"-\" + item + \"-\") + prop;\n });\n // if ('CSS' in this.root && 'supports' in this.root.CSS) {\n // return this.root.CSS.supports(prefixedProps.map(item => '(' + item + ': inherit)').join(' or '));\n // }\n const prefixedPropsFound = prefixedProps.filter((item)=>{\n return item in this.#div.style;\n });\n if (prefixedPropsFound.length > 0) return prefixedPropsFound[0];\n return null;\n }\n /**\n *\n *\n * @param {any} prop\n * @param {any} [prefixes=this.#cssPrefixes]\n * @returns {string}\n *\n * @memberOf Feature\n */ _checkCssPrefixedProp(prop, prefixes = this.#cssPrefixes) {\n return !!this.#getCssPrefixedProp(prop, prefixes);\n }\n /**\n *\n *\n * @param {any} prop\n * @param {any} value\n * @returns {any}\n *\n * @memberOf Feature\n */ _getCssPrefixedPropValue(prop, value) {\n const prefixedProp = this.#getCssPrefixedProp(prop);\n if (prefixedProp) {\n this.document.body.insertBefore(this.#div, null);\n this.#div.style[prefixedProp] = value;\n const computedStylePropValue = this.root.getComputedStyle(this.#div).getPropertyValue(prefixedProp);\n this.document.body.removeChild(this.#div);\n if (!!computedStylePropValue && typeof computedStylePropValue === \"string\") return computedStylePropValue;\n return null;\n }\n return null;\n }\n /**\n *\n *\n * @param {any} prop\n * @param {any} value\n * @returns {any}\n *\n * @memberOf Feature\n */ _checkCssPrefixedPropValue(prop, value) {\n const prefixedPropValue = this._getCssPrefixedPropValue(prop, value);\n return !!prefixedPropValue && prefixedPropValue !== \"none\";\n }\n /**\n *\n *\n * @memberof Feature\n */ #createTestElements() {\n this.#cssPrefixes = [\n \"spec\",\n \"webkit\",\n \"moz\",\n \"ms\",\n \"o\"\n ];\n this.#script = this.document.createElement(\"script\");\n this.#canvas = this.document.createElement(\"canvas\");\n this.#div = this.document.createElement(\"div\");\n this.#input = this.document.createElement(\"input\");\n this.#img = this.document.createElement(\"img\");\n this.#xmlHttpRequest = new this.root.XMLHttpRequest();\n }\n // /**\n // *\n // *\n // * @memberof Feature\n // */\n // _destroyTestElements() {\n // this.#cssPrefixes = null;\n // this._script = null;\n // this._canvas = null;\n // this._div = null;\n // this._input = null;\n // this._img = null;\n // this._xmlHttpRequest = null;\n // delete this.#cssPrefixes;\n // delete this._script;\n // delete this._canvas;\n // delete this._div;\n // delete this._input;\n // delete this._img;\n // delete this._xmlHttpRequest;\n // }\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf Feature\n */ getAddEventListener() {\n return \"addEventListener\" in this.root;\n }\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf Feature\n */ getAsyncScript() {\n return \"async\" in this.#script;\n }\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf Feature\n */ getBattery() {\n return \"battery\" in this.navigator;\n }\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf Feature\n */ getCors() {\n return \"XMLHttpRequest\" in this.root && \"withCredentials\" in this.#xmlHttpRequest;\n }\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf Feature\n */ getDeferScript() {\n return \"defer\" in this.#script;\n }\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf Feature\n */ getFile() {\n return (0, $j3TDB$Asserts).all([\n \"File\" in this.root,\n \"FileReader\" in this.root,\n \"FileList\" in this.root,\n \"Blob\" in this.root\n ]);\n }\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf Feature\n */ getFileSystem() {\n return \"requestFileSystem\" in this.root;\n }\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf Feature\n */ getFullscreen() {\n return (0, $j3TDB$Asserts).one([\n \"requestFullscreen\" in this.#canvas,\n \"webkitRequestFullscreen\" in this.#canvas,\n \"msRequestFullscreen\" in this.#canvas,\n \"mozRequestFullScreen\" in this.#canvas\n ]);\n }\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf Feature\n */ getFullscreenKeyboard() {\n return (0, $j3TDB$Asserts).all([\n ()=>\"Element\" in this.root && \"ALLOW_KEYBOARD_INPUT\" in this.root.Element\n ], true);\n }\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf Feature\n */ getGeolocation() {\n return \"geolocation\" in this.navigator;\n }\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf Feature\n */ getHistoryAPI() {\n return (0, $j3TDB$Asserts).all([\n ()=>\"history\" in this.root && \"pushState\" in this.root.history\n ], true);\n }\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf Feature\n */ getLittleEndian() {\n return (0, $j3TDB$Asserts).all([\n this.getTypedArray.bind(this),\n ()=>new this.root.Int8Array(new this.root.Int16Array([\n 1\n ]).buffer)[0] > 0\n ], true);\n }\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf Feature\n */ getLocalStorage() {\n return (0, $j3TDB$Asserts).one([\n ()=>\"localStorage\" in this.root\n ], true) && (0, $j3TDB$Asserts).one([\n ()=>{\n const test = \"x\";\n this.root.localStorage.setItem(test, test);\n this.root.localStorage.removeItem(test);\n return true;\n }\n ], true);\n }\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf Feature\n */ getMatchMedia() {\n return \"matchMedia\" in this.root;\n }\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf Feature\n */ getQuerySelector() {\n return \"querySelector\" in this.document;\n }\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf Feature\n */ getQuerySelectorAll() {\n return \"querySelectorAll\" in this.document;\n }\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf Feature\n */ getServiceWorker() {\n return \"serviceWorker\" in this.navigator;\n }\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf Feature\n */ getTypedArray() {\n return (0, $j3TDB$Asserts).all([\n ()=>\"Int8Array\" in this.root && typeof this.root.Int8Array !== \"undefined\"\n ], true);\n }\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf Feature\n */ getUserMedia() {\n return (0, $j3TDB$Asserts).one([\n \"getUserMedia\" in this.navigator,\n \"webkitGetUserMedia\" in this.navigator,\n \"mozGetUserMedia\" in this.navigator,\n \"msGetUserMedia\" in this.navigator\n ]);\n }\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf Feature\n */ getVibration() {\n return (0, $j3TDB$Asserts).one([\n \"vibrate\" in this.navigator,\n \"webkitVibrate\" in this.navigator,\n \"mozVibrate\" in this.navigator,\n \"msVibrate\" in this.navigator\n ]);\n }\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf Feature\n */ getWorker() {\n return \"Worker\" in this.root;\n }\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */ get pointerEnabled() {\n return (0, $j3TDB$Asserts).one([\n \"pointerEnabled\" in this.navigator,\n \"msPointerEnabled\" in this.navigator\n ]);\n }\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */ get pixelRatio() {\n return this.root.devicePixelRatio || 1;\n }\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */ get pointerLock() {\n return (0, $j3TDB$Asserts).one([\n \"pointerLockElement\" in this.document,\n \"webkitPointerLockElement\" in this.document,\n \"mozPointerLockElement\" in this.document\n ]);\n }\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */ get quirksMode() {\n return this.document.compatMode !== \"CSS1Compat\";\n }\n /**\n * Test if CSS 3D transforms are supported\n *\n * @readonly\n *\n * @memberOf Feature\n */ get css3D() {\n return (0, $j3TDB$Asserts).all([\n this._checkCssPrefixedPropValue.bind(this, \"transform\", \"translate3d(1px,1px,1px)\"),\n this._checkCssPrefixedProp.bind(this, \"perspective\")\n ], true);\n }\n // Test if CSS transforms are supported\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */ get cssTransform() {\n return (0, $j3TDB$Asserts).one([\n this._checkCssPrefixedProp.bind(this, \"transform-origin\")\n ], true);\n }\n // Test if CSS transitions are supported\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */ get cssTransition() {\n return (0, $j3TDB$Asserts).one([\n this._checkCssPrefixedProp.bind(this, \"transition\")\n ], true);\n }\n // Test if Device Motion is supported\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */ get deviceMotion() {\n return \"DeviceMotionEvent\" in this.root;\n }\n // Test if Device Orientation is supported\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */ get deviceOrientation() {\n return \"DeviceOrientationEvent\" in this.root;\n }\n // Test if Context Menu is supported\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */ get contextMenu() {\n return (0, $j3TDB$Asserts).all([\n \"contextMenu\" in this.document,\n \"HTMLMenuItemElement\" in this.root\n ]);\n }\n // Test if classList API is supported\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */ get classList() {\n return \"classList\" in this.document;\n }\n // Test if placeholder attribute is supported\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */ get placeholder() {\n return \"placeholder\" in this.#input;\n }\n // Test if viewport units are supported\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */ get viewportUnit() {\n return (0, $j3TDB$Asserts).all([\n ()=>(this.#img.style.width = \"1vw\", this.#img.style.width !== \"\")\n ], true);\n }\n // Test if REM units are supported\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */ get remUnit() {\n return (0, $j3TDB$Asserts).all([\n ()=>(this.#img.style.width = \"1rem\", this.#img.style.width !== \"\")\n ], true);\n }\n // Test if Canvas is supported\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */ get canvas() {\n return (0, $j3TDB$Asserts).all([\n ()=>\"getContext\" in this.#canvas && !!this.#canvas.getContext(\"2d\")\n ], true);\n }\n // Test if SVG is supported\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */ get svg() {\n return (0, $j3TDB$Asserts).all([\n ()=>\"createElementNS\" in this.document && \"createSVGRect\" in this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\")\n ], true);\n }\n // Test if WebP is supported\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */ get webp() {\n return (0, $j3TDB$Asserts).all([\n ()=>{\n const elem = document.createElement(\"canvas\");\n if (!!(elem.getContext && elem.getContext(\"2d\"))) // was able or not to get WebP representation\n return elem.toDataURL(\"image/webp\").indexOf(\"data:image/webp\") === 0;\n return false;\n }\n ], true);\n }\n // Test if WebGL is supported\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */ get webGL() {\n return (0, $j3TDB$Asserts).one([\n ()=>this.canvas && \"WebGLRenderingContext\" in this.root && (this.#canvas.getContext(\"webgl\") || this.#canvas.getContext(\"experimental-webgl\")),\n ()=>this.canvas && \"WebGL2RenderingContext\" in this.root && this.#canvas.getContext(\"webgl2\")\n ], true);\n }\n // Test if WebVR is supported\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */ get webVR() {\n return (0, $j3TDB$Asserts).all([\n \"getVRDisplays\" in this.navigator\n ]);\n }\n // Tests if touch events are supported, but doesn't necessarily reflect a touchscreen device\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */ get touch() {\n return (0, $j3TDB$Asserts).one([\n ()=>\"ontouchstart\" in this.root,\n ()=>\"ontouchstart\" in this.document.documentElement\n ], true) && (0, $j3TDB$Asserts).one([\n ()=>\"DocumentTouch\" in this.root,\n ()=>this.pointerEnabled && \"MSGesture\" in this.root,\n ()=>\"maxTouchPoints\" in this.navigator && this.navigator.maxTouchPoints > 1\n ], true);\n }\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */ get forceTouch() {\n return (0, $j3TDB$Asserts).all([\n ()=>\"MouseEvent\" in this.root && \"WEBKIT_FORCE_AT_MOUSE_DOWN\" in this.root.MouseEvent && \"WEBKIT_FORCE_AT_FORCE_MOUSE_DOWN\" in this.root.MouseEvent\n ], true);\n }\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */ get pointerEvents() {\n return (0, $j3TDB$Asserts).all([\n !!this.root.PointerEvent\n ], true);\n }\n // Test if img srcset attribute is supported\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */ get srcset() {\n return \"srcset\" in this.#img;\n }\n // Test if img sizes attribute is supported\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */ get sizes() {\n return \"sizes\" in this.#img;\n }\n // Test if Picture element is supported\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */ get pictureElement() {\n return \"HTMLPictureElement\" in this.root;\n }\n // Test if Picture element is supported\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */ get dialogElement() {\n return \"HTMLDialogElement\" in this.root;\n }\n}\n\n\nexport {$903c311c8572dd0d$export$6e91cf7616333d5 as Feature, $7cd421dc85d63a63$export$ae7d97a50b8bcedb as AudioFeature, $46289615aff459c2$export$4d7d44add0424e8a as VideoFeature};\n//# sourceMappingURL=feature.mjs.map\n","import { Asserts, CssFlagsClass } from '@detector-js/core';\n\n/**\n *\n *\n * @export\n * @class Feature\n * @extends {CssFlagsClass}\n */\nexport class Feature extends CssFlagsClass {\n #cssPrefixes: string[];\n #script: HTMLScriptElement;\n #canvas: HTMLCanvasElement;\n #div: HTMLDivElement;\n #input: HTMLInputElement;\n #img: HTMLImageElement;\n #xmlHttpRequest: XMLHttpRequest;\n\n addEventListener: boolean;\n asyncScript: boolean;\n battery: boolean;\n cors: boolean;\n deferScript: boolean;\n file: boolean;\n fileSystem: boolean;\n fullscreen: boolean;\n fullscreenKeyboard: boolean;\n geolocation: boolean;\n historyAPI: boolean;\n littleEndian: boolean;\n localStorage: boolean;\n matchMedia: boolean;\n querySelector: boolean;\n querySelectorAll: boolean;\n serviceWorker: boolean;\n typedArray: boolean;\n userMedia: boolean;\n vibration: boolean;\n worker: boolean;\n\n /**\n * Creates an instance of Feature.\n * @param {any} [ua=null]\n * @param {any} [flags={}]\n * @param {string} [cssFlagsPrefix='feature']\n *\n * @memberOf Feature\n */\n constructor(ua: string | null = null, flags = {}, cssFlagsPrefix = 'feature') {\n super(ua, flags, cssFlagsPrefix);\n\n this.#createTestElements();\n\n this.addEventListener = this.getAddEventListener();\n this.asyncScript = this.getAsyncScript();\n this.battery = this.getBattery();\n this.cors = this.getCors();\n this.deferScript = this.getDeferScript();\n this.file = this.getFile();\n this.fileSystem = this.getFileSystem();\n this.fullscreen = this.getFullscreen();\n this.fullscreenKeyboard = this.getFullscreenKeyboard();\n this.geolocation = this.getGeolocation();\n this.historyAPI = this.getHistoryAPI();\n this.littleEndian = this.getLittleEndian();\n this.localStorage = this.getLocalStorage();\n this.matchMedia = this.getMatchMedia();\n this.querySelector = this.getQuerySelector();\n this.querySelectorAll = this.getQuerySelectorAll();\n this.serviceWorker = this.getServiceWorker();\n this.typedArray = this.getTypedArray();\n this.userMedia = this.getUserMedia();\n this.vibration = this.getVibration();\n this.worker = this.getWorker();\n }\n\n /**\n *\n *\n * @param {any} prop\n * @param {any} [prefixes=this.#cssPrefixes]\n * @returns {string}\n *\n * @memberOf Feature\n */\n #getCssPrefixedProp(prop, prefixes = this.#cssPrefixes) {\n prop = prop.toCamelCase();\n\n const prefixedProps = prefixes.map((item) => {\n return (item === 'spec' ? '' : '-' + item + '-') + prop;\n });\n\n // if ('CSS' in this.root && 'supports' in this.root.CSS) {\n // return this.root.CSS.supports(prefixedProps.map(item => '(' + item + ': inherit)').join(' or '));\n // }\n\n const prefixedPropsFound = prefixedProps.filter((item) => {\n return item in this.#div.style;\n });\n\n if (prefixedPropsFound.length > 0) {\n return prefixedPropsFound[0];\n }\n\n return null;\n }\n\n /**\n *\n *\n * @param {any} prop\n * @param {any} [prefixes=this.#cssPrefixes]\n * @returns {string}\n *\n * @memberOf Feature\n */\n _checkCssPrefixedProp(prop, prefixes = this.#cssPrefixes) {\n return !!this.#getCssPrefixedProp(prop, prefixes);\n }\n\n /**\n *\n *\n * @param {any} prop\n * @param {any} value\n * @returns {any}\n *\n * @memberOf Feature\n */\n _getCssPrefixedPropValue(prop, value) {\n const prefixedProp = this.#getCssPrefixedProp(prop);\n\n if (prefixedProp) {\n this.document.body.insertBefore(this.#div, null);\n\n this.#div.style[prefixedProp] = value;\n\n const computedStylePropValue = this.root.getComputedStyle(this.#div).getPropertyValue(prefixedProp);\n\n this.document.body.removeChild(this.#div);\n\n if (!!computedStylePropValue && typeof computedStylePropValue === 'string') {\n return computedStylePropValue;\n }\n\n return null;\n }\n\n return null;\n }\n\n /**\n *\n *\n * @param {any} prop\n * @param {any} value\n * @returns {any}\n *\n * @memberOf Feature\n */\n _checkCssPrefixedPropValue(prop, value) {\n const prefixedPropValue = this._getCssPrefixedPropValue(prop, value);\n\n return !!prefixedPropValue && prefixedPropValue !== 'none';\n }\n\n /**\n *\n *\n * @memberof Feature\n */\n #createTestElements() {\n this.#cssPrefixes = ['spec', 'webkit', 'moz', 'ms', 'o'];\n\n this.#script = this.document.createElement('script');\n this.#canvas = this.document.createElement('canvas');\n this.#div = this.document.createElement('div');\n this.#input = this.document.createElement('input');\n this.#img = this.document.createElement('img');\n this.#xmlHttpRequest = new this.root.XMLHttpRequest();\n }\n\n // /**\n // *\n // *\n // * @memberof Feature\n // */\n // _destroyTestElements() {\n // this.#cssPrefixes = null;\n\n // this._script = null;\n // this._canvas = null;\n // this._div = null;\n // this._input = null;\n // this._img = null;\n // this._xmlHttpRequest = null;\n\n // delete this.#cssPrefixes;\n\n // delete this._script;\n // delete this._canvas;\n // delete this._div;\n // delete this._input;\n // delete this._img;\n // delete this._xmlHttpRequest;\n // }\n\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf Feature\n */\n getAddEventListener() {\n return 'addEventListener' in this.root;\n }\n\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf Feature\n */\n getAsyncScript() {\n return 'async' in this.#script;\n }\n\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf Feature\n */\n getBattery() {\n return 'battery' in this.navigator;\n }\n\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf Feature\n */\n getCors() {\n return 'XMLHttpRequest' in this.root && 'withCredentials' in this.#xmlHttpRequest;\n }\n\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf Feature\n */\n getDeferScript() {\n return 'defer' in this.#script;\n }\n\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf Feature\n */\n getFile() {\n return Asserts.all(['File' in this.root, 'FileReader' in this.root, 'FileList' in this.root, 'Blob' in this.root]);\n }\n\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf Feature\n */\n getFileSystem() {\n return 'requestFileSystem' in this.root;\n }\n\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf Feature\n */\n getFullscreen() {\n return Asserts.one([\n 'requestFullscreen' in this.#canvas,\n 'webkitRequestFullscreen' in this.#canvas,\n 'msRequestFullscreen' in this.#canvas,\n 'mozRequestFullScreen' in this.#canvas\n ]);\n }\n\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf Feature\n */\n getFullscreenKeyboard() {\n return Asserts.all([() => 'Element' in this.root && 'ALLOW_KEYBOARD_INPUT' in this.root.Element], true);\n }\n\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf Feature\n */\n getGeolocation() {\n return 'geolocation' in this.navigator;\n }\n\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf Feature\n */\n getHistoryAPI() {\n return Asserts.all([() => 'history' in this.root && 'pushState' in this.root.history], true);\n }\n\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf Feature\n */\n getLittleEndian() {\n return Asserts.all(\n [this.getTypedArray.bind(this), () => new this.root.Int8Array(new this.root.Int16Array([1]).buffer)[0] > 0],\n true\n );\n }\n\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf Feature\n */\n getLocalStorage() {\n return (\n Asserts.one([() => 'localStorage' in this.root], true) &&\n Asserts.one(\n [\n () => {\n const test = 'x';\n this.root.localStorage.setItem(test, test);\n this.root.localStorage.removeItem(test);\n\n return true;\n }\n ],\n true\n )\n );\n }\n\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf Feature\n */\n getMatchMedia() {\n return 'matchMedia' in this.root;\n }\n\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf Feature\n */\n getQuerySelector() {\n return 'querySelector' in this.document;\n }\n\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf Feature\n */\n getQuerySelectorAll() {\n return 'querySelectorAll' in this.document;\n }\n\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf Feature\n */\n getServiceWorker() {\n return 'serviceWorker' in this.navigator;\n }\n\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf Feature\n */\n getTypedArray() {\n return Asserts.all([() => 'Int8Array' in this.root && typeof this.root.Int8Array !== 'undefined'], true);\n }\n\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf Feature\n */\n getUserMedia() {\n return Asserts.one([\n 'getUserMedia' in this.navigator,\n 'webkitGetUserMedia' in this.navigator,\n 'mozGetUserMedia' in this.navigator,\n 'msGetUserMedia' in this.navigator\n ]);\n }\n\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf Feature\n */\n getVibration() {\n return Asserts.one([\n 'vibrate' in this.navigator,\n 'webkitVibrate' in this.navigator,\n 'mozVibrate' in this.navigator,\n 'msVibrate' in this.navigator\n ]);\n }\n\n /**\n *\n *\n * @returns boolean\n *\n * @memberOf Feature\n */\n getWorker() {\n return 'Worker' in this.root;\n }\n\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */\n get pointerEnabled() {\n return Asserts.one(['pointerEnabled' in this.navigator, 'msPointerEnabled' in this.navigator]);\n }\n\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */\n get pixelRatio() {\n return this.root.devicePixelRatio || 1;\n }\n\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */\n get pointerLock() {\n return Asserts.one([\n 'pointerLockElement' in this.document,\n 'webkitPointerLockElement' in this.document,\n 'mozPointerLockElement' in this.document\n ]);\n }\n\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */\n get quirksMode() {\n return this.document.compatMode !== 'CSS1Compat';\n }\n\n /**\n * Test if CSS 3D transforms are supported\n *\n * @readonly\n *\n * @memberOf Feature\n */\n get css3D() {\n return Asserts.all(\n [\n this._checkCssPrefixedPropValue.bind(this, 'transform', 'translate3d(1px,1px,1px)'),\n this._checkCssPrefixedProp.bind(this, 'perspective')\n ],\n true\n );\n }\n\n // Test if CSS transforms are supported\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */\n get cssTransform() {\n return Asserts.one([this._checkCssPrefixedProp.bind(this, 'transform-origin')], true);\n }\n\n // Test if CSS transitions are supported\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */\n get cssTransition() {\n return Asserts.one([this._checkCssPrefixedProp.bind(this, 'transition')], true);\n }\n\n // Test if Device Motion is supported\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */\n get deviceMotion() {\n return 'DeviceMotionEvent' in this.root;\n }\n\n // Test if Device Orientation is supported\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */\n get deviceOrientation() {\n return 'DeviceOrientationEvent' in this.root;\n }\n\n // Test if Context Menu is supported\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */\n get contextMenu() {\n return Asserts.all(['contextMenu' in this.document, 'HTMLMenuItemElement' in this.root]);\n }\n\n // Test if classList API is supported\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */\n get classList() {\n return 'classList' in this.document;\n }\n\n // Test if placeholder attribute is supported\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */\n get placeholder() {\n return 'placeholder' in this.#input;\n }\n\n // Test if viewport units are supported\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */\n get viewportUnit() {\n return Asserts.all([() => (this.#img.style.width = '1vw') && this.#img.style.width !== ''], true);\n }\n\n // Test if REM units are supported\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */\n get remUnit() {\n return Asserts.all([() => (this.#img.style.width = '1rem') && this.#img.style.width !== ''], true);\n }\n\n // Test if Canvas is supported\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */\n get canvas() {\n return Asserts.all([() => 'getContext' in this.#canvas && !!this.#canvas.getContext('2d')], true);\n }\n\n // Test if SVG is supported\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */\n get svg() {\n return Asserts.all(\n [\n () =>\n 'createElementNS' in this.document &&\n 'createSVGRect' in this.document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n ],\n true\n );\n }\n\n // Test if WebP is supported\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */\n get webp() {\n return Asserts.all(\n [\n () => {\n const elem = document.createElement('canvas');\n\n if (!!(elem.getContext && elem.getContext('2d'))) {\n // was able or not to get WebP representation\n return elem.toDataURL('image/webp').indexOf('data:image/webp') === 0;\n }\n\n return false;\n }\n ],\n true\n );\n }\n\n // Test if WebGL is supported\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */\n get webGL() {\n return Asserts.one(\n [\n () =>\n this.canvas &&\n 'WebGLRenderingContext' in this.root &&\n (this.#canvas.getContext('webgl') || this.#canvas.getContext('experimental-webgl')),\n () => this.canvas && 'WebGL2RenderingContext' in this.root && this.#canvas.getContext('webgl2')\n ],\n true\n );\n }\n\n // Test if WebVR is supported\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */\n get webVR() {\n return Asserts.all(['getVRDisplays' in this.navigator]);\n }\n\n // Tests if touch events are supported, but doesn't necessarily reflect a touchscreen device\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */\n get touch() {\n return (\n Asserts.one([() => 'ontouchstart' in this.root, () => 'ontouchstart' in this.document.documentElement], true) &&\n Asserts.one(\n [\n () => 'DocumentTouch' in this.root,\n () => this.pointerEnabled && 'MSGesture' in this.root,\n () => 'maxTouchPoints' in this.navigator && this.navigator.maxTouchPoints > 1\n ],\n true\n )\n );\n }\n\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */\n get forceTouch() {\n return Asserts.all(\n [\n () =>\n 'MouseEvent' in this.root &&\n 'WEBKIT_FORCE_AT_MOUSE_DOWN' in this.root.MouseEvent &&\n 'WEBKIT_FORCE_AT_FORCE_MOUSE_DOWN' in this.root.MouseEvent\n ],\n true\n );\n }\n\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */\n get pointerEvents() {\n return Asserts.all([!!this.root.PointerEvent], true);\n }\n\n // Test if img srcset attribute is supported\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */\n get srcset() {\n return 'srcset' in this.#img;\n }\n\n // Test if img sizes attribute is supported\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */\n get sizes() {\n return 'sizes' in this.#img;\n }\n\n // Test if Picture element is supported\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */\n get pictureElement() {\n return 'HTMLPictureElement' in this.root;\n }\n\n // T