UNPKG

@ngx-toolkit/device

Version:

Angular device user-agent detection with Universal support

1 lines 10.4 kB
{"version":3,"file":"ngx-toolkit-device.mjs","sources":["../../../projects/device/src/lib/device.model.ts","../../../projects/device/src/lib/device.token.ts","../../../projects/device/src/lib/device.service.ts","../../../projects/device/src/lib/device.module.ts","../../../projects/device/src/public-api.ts","../../../projects/device/src/ngx-toolkit-device.ts"],"sourcesContent":["export enum DeviceType {\n TABLET = 0,\n MOBILE,\n NORMAL\n}\n\nexport enum DevicePlatform {\n ANDROID = 0,\n IOS,\n UNKNOWN\n}\n\nexport class Device {\n type: DeviceType;\n platform: DevicePlatform;\n\n constructor(type: DeviceType = DeviceType.NORMAL, platform: DevicePlatform = DevicePlatform.UNKNOWN) {\n this.type = type;\n this.platform = platform;\n }\n\n isNormal(): boolean {\n return this.type === DeviceType.NORMAL;\n }\n\n isMobile(): boolean {\n return this.type === DeviceType.MOBILE;\n }\n\n isTablet(): boolean {\n return this.type === DeviceType.TABLET;\n }\n}\n","import {InjectionToken} from '@angular/core';\nimport {Device} from './device.model';\n\nexport const USER_AGENT = new InjectionToken<string>('USER_AGENT');\nexport const DEVICE = new InjectionToken<Device>('DEVICE');\n","import {Device, DevicePlatform, DeviceType} from './device.model';\n\n/**\n * see https://github.com/spring-projects/spring-mobile\n */\nexport class DeviceService {\n private static KNOWN_MOBILE_USER_AGENT_PREFIXES: string[] = [\n 'w3c ',\n 'w3c-',\n 'acs-',\n 'alav',\n 'alca',\n 'amoi',\n 'avan',\n 'benq',\n 'bird',\n 'blac',\n 'blaz',\n 'brew',\n 'cell',\n 'cldc',\n 'cmd-',\n 'dang',\n 'doco',\n 'eric',\n 'hipt',\n 'htc_',\n 'inno',\n 'ipaq',\n 'ipod',\n 'jigs',\n 'kddi',\n 'keji',\n 'leno',\n 'lg-c',\n 'lg-d',\n 'lg-g',\n 'lge-',\n 'lg/u',\n 'maui',\n 'maxo',\n 'midp',\n 'mits',\n 'mmef',\n 'mobi',\n 'mot-',\n 'moto',\n 'mwbp',\n 'nec-',\n 'newt',\n 'noki',\n 'palm',\n 'pana',\n 'pant',\n 'phil',\n 'play',\n 'port',\n 'prox',\n 'qwap',\n 'sage',\n 'sams',\n 'sany',\n 'sch-',\n 'sec-',\n 'send',\n 'seri',\n 'sgh-',\n 'shar',\n 'sie-',\n 'siem',\n 'smal',\n 'smar',\n 'sony',\n 'sph-',\n 'symb',\n 't-mo',\n 'teli',\n 'tim-',\n 'tosh',\n 'tsm-',\n 'upg1',\n 'upsi',\n 'vk-v',\n 'voda',\n 'wap-',\n 'wapa',\n 'wapi',\n 'wapp',\n 'wapr',\n 'webc',\n 'winw',\n 'winw',\n 'xda ',\n 'xda-'\n ];\n\n private static KNOWN_MOBILE_USER_AGENT_KEYWORDS: string[] = [\n 'blackberry',\n 'webos',\n 'ipod',\n 'lge vx',\n 'midp',\n 'maemo',\n 'mmp',\n 'mobile',\n 'netfront',\n 'hiptop',\n 'nintendo DS',\n 'novarra',\n 'openweb',\n 'opera mobi',\n 'opera mini',\n 'palm',\n 'psp',\n 'phone',\n 'smartphone',\n 'symbian',\n 'up.browser',\n 'up.link',\n 'wap',\n 'windows ce'\n ];\n\n private static KNOWN_TABLET_USER_AGENT_KEYWORDS: string[] = ['ipad', 'playbook', 'hp-tablet', 'kindle'];\n\n static resolveDevice(userAgent: string): Device {\n if (!userAgent) {\n return new Device(DeviceType.NORMAL, DevicePlatform.UNKNOWN);\n }\n\n userAgent = userAgent.toLowerCase();\n\n /**\n * Tablet Detection\n */\n\n // Apple\n if (userAgent.includes('ipad')) {\n return new Device(DeviceType.TABLET, DevicePlatform.IOS);\n }\n\n const isMobile: boolean =\n userAgent.includes('mobile') ||\n DeviceService.KNOWN_MOBILE_USER_AGENT_KEYWORDS.some(mobileUserAgent => userAgent.includes(mobileUserAgent));\n if (!isMobile) {\n // Android\n if (userAgent.includes('android')) {\n return new Device(DeviceType.TABLET, DevicePlatform.ANDROID);\n }\n // Kindle Fire\n if (userAgent.includes('silk')) {\n return new Device(DeviceType.TABLET, DevicePlatform.UNKNOWN);\n }\n }\n // From keywords\n if (DeviceService.KNOWN_TABLET_USER_AGENT_KEYWORDS.some(tabletUserAgent => userAgent.includes(tabletUserAgent))) {\n return new Device(DeviceType.TABLET, DevicePlatform.UNKNOWN);\n }\n\n /**\n * Mobile detection\n */\n // From prefix\n if (\n userAgent.length >= 4 &&\n DeviceService.KNOWN_MOBILE_USER_AGENT_PREFIXES.indexOf(userAgent.substring(0, 4)) !== -1\n ) {\n return new Device(DeviceType.MOBILE, DevicePlatform.UNKNOWN);\n }\n // Android\n if (userAgent.includes('android')) {\n return new Device(DeviceType.MOBILE, DevicePlatform.ANDROID);\n }\n // Apple\n if (userAgent.includes('iphone') || userAgent.includes('ipod') || userAgent.includes('ipad')) {\n return new Device(DeviceType.MOBILE, DevicePlatform.IOS);\n }\n // From keywords\n if (isMobile) {\n return new Device(DeviceType.MOBILE, DevicePlatform.UNKNOWN);\n }\n\n /**\n * => Normal device\n */\n return new Device(DeviceType.NORMAL, DevicePlatform.UNKNOWN);\n }\n}\n","import {DOCUMENT} from '@angular/common';\nimport {ModuleWithProviders, NgModule, Optional} from '@angular/core';\nimport {Device} from './device.model';\nimport {DeviceService} from './device.service';\nimport {DEVICE, USER_AGENT} from './device.token';\n\nexport function deviceResolverFactory(userAgent?: string, document?: any): Device {\n if (!userAgent && document) {\n userAgent = document.defaultView?.navigator?.userAgent;\n }\n\n return DeviceService.resolveDevice(userAgent);\n}\n\n@NgModule()\nexport class DeviceModule {\n /**\n * In root module to provide the DEVICE\n */\n static forRoot(): ModuleWithProviders<DeviceModule> {\n return {\n ngModule: DeviceModule,\n providers: [\n {\n provide: DEVICE,\n useFactory: deviceResolverFactory,\n deps: [[new Optional(), USER_AGENT], [new Optional(), DOCUMENT]]\n }\n ]\n };\n }\n}\n","/*\n * Public API Surface of device\n */\n\nexport {DeviceType, DevicePlatform, Device} from './lib/device.model';\nexport {USER_AGENT, DEVICE} from './lib/device.token';\nexport {DeviceModule} from './lib/device.module';\n\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}