UNPKG

19.5 kBSource Map (JSON)View Raw
1{"version":3,"file":"agent.min.js","sources":["../src/utils.ts","../src/presets.ts","../src/userAgentData.ts","../src/userAgent.ts","../src/agent.ts","../src/index.umd.ts"],"sourcesContent":["import { PresetInfo, PresetResult, NavigatorUABrandVersion } from \"./types\";\n\nexport function some<T>(arr: T[], callback: (value: T, index: number) => any): boolean {\n const length = arr.length;\n\n for (let i = 0; i < length; ++i) {\n if (callback(arr[i], i)) {\n return true;\n }\n }\n\n return false;\n}\nexport function find<T>(arr: T[], callback: (value: T, index: number) => any): T | null {\n const length = arr.length;\n\n for (let i = 0; i < length; ++i) {\n if (callback(arr[i], i)) {\n return arr[i];\n }\n }\n return null;\n}\nexport function getUserAgent(agent?: string): string {\n let userAgent = agent;\n if (typeof userAgent === \"undefined\") {\n if (typeof navigator === \"undefined\" || !navigator) {\n return \"\";\n }\n\n userAgent = navigator.userAgent || \"\";\n }\n return userAgent!.toLowerCase();\n}\nexport function execRegExp(pattern: string, text: string): RegExpExecArray | null {\n try {\n return new RegExp(pattern, \"g\").exec(text);\n } catch (e) {\n return null;\n }\n}\nexport function hasUserAgentData(): boolean {\n if (typeof navigator === \"undefined\" || !navigator || !navigator.userAgentData) {\n return false;\n }\n const userAgentData = navigator.userAgentData;\n const brands = (userAgentData.brands || userAgentData.uaList);\n\n return !!(brands && brands.length);\n}\nexport function findVersion(versionTest: string, userAgent: string): string {\n const result = execRegExp(`(${versionTest})((?:\\\\/|\\\\s|:)([0-9|\\\\.|_]+))`, userAgent);\n\n return result ? result[3] : \"\";\n}\nexport function convertVersion(text: string): string {\n return text.replace(/_/g, \".\");\n}\nexport function findPreset(presets: PresetInfo[], userAgent: string): PresetResult {\n let userPreset: PresetInfo | null = null;\n let version = \"-1\";\n\n some(presets, preset => {\n const result = execRegExp(`(${preset.test})((?:\\\\/|\\\\s|:)([0-9|\\\\.|_]+))?`, userAgent);\n\n if (!result || preset.brand) {\n return false;\n }\n userPreset = preset;\n version = result[3] || \"-1\";\n\n if (preset.versionAlias) {\n version = preset.versionAlias;\n } else if (preset.versionTest) {\n version = findVersion(preset.versionTest.toLowerCase(), userAgent) || version;\n }\n version = convertVersion(version);\n return true;\n });\n\n return {\n preset: userPreset,\n version,\n };\n}\nexport function findPresetBrand(presets: PresetInfo[], brands: NavigatorUABrandVersion[]): NavigatorUABrandVersion {\n const brandInfo = {\n brand: \"\",\n version: \"-1\",\n };\n some(presets, preset => {\n const result = findBrand(brands, preset);\n\n if (!result) {\n return false;\n }\n\n brandInfo.brand = preset.id;\n brandInfo.version = preset.versionAlias || result.version;\n\n return brandInfo.version !== \"-1\";\n });\n\n return brandInfo;\n}\nexport function findBrand(brands: NavigatorUABrandVersion[], preset: PresetInfo): NavigatorUABrandVersion | null {\n return find(brands, ({ brand }) => {\n return execRegExp(`${preset.test}`, brand.toLowerCase());\n });\n}\n","import { PresetInfo } from \"./types\";\n\nexport const BROWSER_PRESETS: PresetInfo[] = [\n {\n test: \"phantomjs\",\n id: \"phantomjs\",\n },\n {\n test: \"whale\",\n id: \"whale\",\n }, {\n test: \"edgios|edge|edg\",\n id: \"edge\",\n },\n {\n test: \"msie|trident|windows phone\",\n id: \"ie\",\n versionTest: \"iemobile|msie|rv\",\n },\n {\n test: \"miuibrowser\",\n id: \"miui browser\",\n },\n {\n test: \"samsungbrowser\",\n id: \"samsung internet\",\n },\n {\n test: \"samsung\",\n id: \"samsung internet\",\n versionTest: \"version\",\n },\n {\n test: \"chrome|crios\",\n id: \"chrome\",\n },\n {\n test: \"firefox|fxios\",\n id: \"firefox\",\n },\n {\n test: \"android\",\n id: \"android browser\",\n versionTest: \"version\",\n },\n {\n test: \"safari|iphone|ipad|ipod\",\n id: \"safari\",\n versionTest: \"version\",\n },\n];\n\n// chromium's engine(blink) is based on applewebkit 537.36.\nexport const CHROMIUM_PRESETS: PresetInfo[] = [\n {\n test: \"(?=.*applewebkit/(53[0-7]|5[0-2]|[0-4]))(?=.*\\\\schrome)\",\n id: \"chrome\",\n versionTest: \"chrome\",\n },\n {\n test: \"chromium\",\n id: \"chrome\",\n },\n {\n test: \"whale\",\n id: \"chrome\",\n versionAlias: \"-1\",\n brand: true,\n },\n];\nexport const WEBKIT_PRESETS: PresetInfo[] = [\n {\n test: \"applewebkit\",\n id: \"webkit\",\n versionTest: \"applewebkit|safari\",\n },\n];\nexport const PLATFORM_PRESETS: PresetInfo[] = [\n {\n test: \"win\",\n id: \"window\",\n },\n {\n test: \"linux\",\n id: \"linux\",\n },\n {\n test: \"ipad|ipod|iphone\",\n id: \"ios\",\n },\n {\n test: \"android\",\n id: \"android\",\n },\n];\nexport const WEBVIEW_PRESETS: PresetInfo[] = [\n {\n test: \"(?=(iphone|ipad))(?!(.*version))\",\n id: \"webview\",\n },\n {\n test: \"(?=(android|iphone|ipad))(?=.*(naver|daum|; wv))\",\n id: \"webview\",\n },\n {\n // test webview\n test: \"webview\",\n id: \"webview\",\n },\n];\nexport const OS_PRESETS: PresetInfo[] = [\n {\n test: \"windows phone\",\n id: \"windows phone\",\n },\n {\n test: \"windows 2000\",\n id: \"window\",\n versionAlias: \"5.0\",\n },\n {\n test: \"windows nt\",\n id: \"window\",\n },\n {\n test: \"iphone|ipad|ipod\",\n id: \"ios\",\n versionTest: \"iphone os|cpu os\",\n },\n {\n test: \"mac os x\",\n id: \"mac\",\n },\n {\n test: \"android\",\n id: \"android\",\n },\n {\n test: \"tizen\",\n id: \"tizen\",\n },\n {\n test: \"webos|web0s\",\n id: \"webos\",\n },\n // {\n // test: \"linux|ubuntu|debian\",\n // id: \"linux\",\n // versionAlias: \"-1\",\n // },\n];\n","import { UADataValues, AgentInfo, AgentBrowserInfo, AgentOSInfo } from \"./types\";\nimport { some, find, findBrand, convertVersion, findPresetBrand } from \"./utils\";\nimport { BROWSER_PRESETS, OS_PRESETS, CHROMIUM_PRESETS, WEBKIT_PRESETS, WEBVIEW_PRESETS } from \"./presets\";\n\nexport function parseUserAgentData(osData?: UADataValues): AgentInfo {\n const userAgentData = navigator.userAgentData;\n const brands = [...(userAgentData.uaList || userAgentData.brands)!];\n const isMobile = userAgentData.mobile || false;\n const firstBrand = brands[0];\n const browser: AgentBrowserInfo = {\n name: firstBrand.brand,\n version: firstBrand.version,\n majorVersion: -1,\n webkit: false,\n webkitVersion: \"-1\",\n chromium: false,\n chromiumVersion: \"-1\",\n webview: !!findPresetBrand(WEBVIEW_PRESETS, brands).brand,\n };\n const os: AgentOSInfo = {\n name: \"unknown\",\n version: \"-1\",\n majorVersion: -1,\n };\n browser.webkit = !browser.chromium && some(WEBKIT_PRESETS, preset => findBrand(brands, preset));\n\n const chromiumBrand = findPresetBrand(CHROMIUM_PRESETS, brands);\n\n browser.chromium = !!chromiumBrand.brand;\n browser.chromiumVersion = chromiumBrand.version;\n if (!browser.chromium) {\n const webkitBrand = findPresetBrand(WEBKIT_PRESETS, brands);\n\n browser.webkit = !!webkitBrand.brand;\n browser.webkitVersion = webkitBrand.version;\n }\n if (osData) {\n const platform = osData.platform.toLowerCase();\n\n const result = find(OS_PRESETS, preset => {\n return new RegExp(`${preset.test}`, \"g\").exec(platform);\n });\n os.name = result ? result.id : platform;\n os.version = osData.platformVersion;\n }\n const browserBrand = findPresetBrand(BROWSER_PRESETS, brands);\n\n if (browserBrand.brand) {\n browser.name = browserBrand.brand;\n browser.version = osData ? osData.uaFullVersion : browserBrand.version;\n }\n if (navigator.platform === \"Linux armv8l\") {\n os.name = \"android\";\n } else if (browser.webkit) {\n os.name = isMobile ? \"ios\" : \"mac\";\n }\n if (os.name === \"ios\" && browser.webview) {\n browser.version = \"-1\";\n }\n\n os.version = convertVersion(os.version);\n browser.version = convertVersion(browser.version);\n os.majorVersion = parseInt(os.version, 10);\n browser.majorVersion = parseInt(browser.version, 10);\n\n return {\n browser,\n os,\n isMobile,\n isHints: true,\n };\n}\n","import { AgentInfo } from \"./types\";\nimport { getUserAgent, findPreset } from \"./utils\";\nimport { WEBVIEW_PRESETS, CHROMIUM_PRESETS, BROWSER_PRESETS, OS_PRESETS, WEBKIT_PRESETS } from \"./presets\";\n\nexport function parseUserAgent(userAgent?: string): AgentInfo {\n const nextAgent = getUserAgent(userAgent);\n const isMobile = !!/mobi/g.exec(nextAgent);\n const browser = {\n name: \"unknown\",\n version: \"-1\",\n majorVersion: -1,\n webview: !!findPreset(WEBVIEW_PRESETS, nextAgent).preset,\n chromium: false,\n chromiumVersion: \"-1\",\n webkit: false,\n webkitVersion: \"-1\",\n };\n const os = {\n name: \"unknown\",\n version: \"-1\",\n majorVersion: -1,\n };\n const {\n preset: browserPreset,\n version: browserVersion,\n } = findPreset(BROWSER_PRESETS, nextAgent);\n\n const {\n preset: osPreset,\n version: osVersion,\n } = findPreset(OS_PRESETS, nextAgent);\n\n const chromiumPreset = findPreset(CHROMIUM_PRESETS, nextAgent);\n\n browser.chromium = !!chromiumPreset.preset;\n browser.chromiumVersion = chromiumPreset.version;\n if (!browser.chromium) {\n const webkitPreset = findPreset(WEBKIT_PRESETS, nextAgent);\n\n browser.webkit = !!webkitPreset.preset;\n browser.webkitVersion = webkitPreset.version;\n }\n\n if (osPreset) {\n os.name = osPreset.id;\n os.version = osVersion;\n os.majorVersion = parseInt(osVersion, 10);\n }\n if (browserPreset) {\n browser.name = browserPreset.id;\n browser.version = browserVersion;\n\n if (browser.webview && os.name === \"ios\" && browser.name !== \"safari\") {\n browser.webview = false;\n }\n }\n browser.majorVersion = parseInt(browser.version, 10);\n\n return {\n browser,\n os,\n isMobile,\n isHints: false,\n };\n}\n","import { AgentInfo } from \"./types\";\nimport { hasUserAgentData } from \"./utils\";\nimport { parseUserAgentData } from \"./userAgentData\";\nimport { parseUserAgent } from \"./userAgent\";\n/**\n * @namespace eg.agent\n */\n\n/**\n* Extracts accuate browser and operating system information from the user agent string or client hints.\n* @ko 유저 에이전트 문자열 또는 client hints에서 정확한 브라우저와 운영체제 정보를 추출한다.\n* @function eg.agent#getAccurateAgent\n* @param - Callback function to get the accuate agent <ko>정확한 에이전트를 가져오기 위한 callback 함수</ko>\n* @return - get the accuate agent promise. If Promise are not supported, null is returned. <ko> 정확한 에이전트 promise를 가져온다. Promise를 지원 하지 않는 경우, null을 반환한다. </ko>\n* @example\nimport { getAccurateAgent } from \"@egjs/agent\";\n// eg.agent.getAccurateAgent()\ngetAccurateAgent().then(agent => {\n const { os, browser, isMobile } = agent;\n});\ngetAccurateAgent(agent => {\n const { os, browser, isMobile } = agent;\n});\n*/\nexport function getAccurateAgent(callback?: (result: AgentInfo) => void): Promise<AgentInfo> | null {\n if (hasUserAgentData()) {\n return navigator.userAgentData.getHighEntropyValues([\n \"architecture\",\n \"model\",\n \"platform\",\n \"platformVersion\",\n \"uaFullVersion\",\n ]).then(info => {\n const agentInfo = parseUserAgentData(info);\n\n callback && callback(agentInfo);\n return agentInfo;\n });\n }\n callback && callback(agent());\n if (typeof Promise === \"undefined\" || !Promise) {\n return null;\n }\n return Promise.resolve(agent());\n}\n\n\n/**\n * Extracts browser and operating system information from the user agent string.\n * @ko 유저 에이전트 문자열에서 브라우저와 운영체제 정보를 추출한다.\n * @function eg.agent#agent\n * @param - user agent string to parse <ko>파싱할 유저에이전트 문자열</ko>\n * @return - agent Info <ko> 에이전트 정보 </ko>\n * @example\nimport agent from \"@egjs/agent\";\n// eg.agent();\nconst { os, browser, isMobile } = agent();\n */\nfunction agent(userAgent?: string): AgentInfo {\n if (typeof userAgent === \"undefined\" && hasUserAgentData()) {\n return parseUserAgentData();\n } else {\n return parseUserAgent(userAgent);\n }\n}\n\nexport default agent;\n","import agent, * as modules from \"./agent\";\n\nfor (const name in modules) {\n (agent as any)[name] = (modules as any)[name];\n}\n\nexport default agent;\n"],"names":["some","arr","callback","length","i","find","execRegExp","pattern","text","RegExp","exec","e","hasUserAgentData","navigator","userAgentData","brands","uaList","convertVersion","replace","findPreset","presets","userAgent","userPreset","version","preset","result","test","brand","versionAlias","versionTest","findVersion","toLowerCase","findPresetBrand","brandInfo","findBrand","id","_a","BROWSER_PRESETS","CHROMIUM_PRESETS","WEBKIT_PRESETS","WEBVIEW_PRESETS","OS_PRESETS","parseUserAgentData","osData","isMobile","mobile","firstBrand","browser","name","majorVersion","webkit","webkitVersion","chromium","chromiumVersion","webview","os","chromiumBrand","webkitBrand","platform_1","platform","platformVersion","browserBrand","uaFullVersion","parseInt","isHints","parseUserAgent","nextAgent","agent","getUserAgent","browserPreset","browserVersion","_b","osPreset","osVersion","chromiumPreset","webkitPreset","getHighEntropyValues","then","info","agentInfo","Promise","resolve","modules"],"mappings":"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"}
\No newline at end of file