@detector-js/feature
Version:
DetectorJS Feature Module
1 lines • 20.3 kB
Source Map (JSON)
{"mappings":"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","sources":["packages/feature/lib/lib/audioFeature.ts","packages/feature/lib/lib/videoFeature.ts","packages/feature/lib/lib/feature.ts","packages/feature/lib/feature.ts"],"sourcesContent":[null,null,null,"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 // Test if Picture element is supported\n /**\n *\n *\n * @readonly\n *\n * @memberOf Feature\n */\n get dialogElement() {\n return 'HTMLDialogElement' in this.root;\n }\n}\n\nif (process.env.NODE_ENV === 'development') {\n const packageJSON = require('../package.json');\n\n console.log(`${packageJSON.description} v${packageJSON.version} initialized`);\n}\n\nexport * from './audioFeature';\nexport * from './videoFeature';\n"],"names":[],"version":3,"file":"feature.types.d.ts.map"}