storybook-addon-useragent
Version:
storybook-addon-useragent
1 lines • 26.7 kB
Source Map (JSON)
{"version":3,"sources":["../src/constants.ts","../src/core/constants.ts","../src/core/detection.ts","../src/core/browser.ts","../src/core/manipulation.ts","../src/core/index.ts","../src/withUserAgent.ts","../src/preview.ts"],"names":["PARAM_KEY","PLATFORMS","ARCHITECTURES","BROWSER_MAPPING","REGEX","detectPlatform","userAgent","platformMatch","match","detectPlatformVersion","platform","detectBitness","version","detectArchitecture","archMatch","archInfo","detectModel","category","detectWow64","isBrowserName","brand","parseBrowserBrands","brands","parseUserAgent","brandList","isMobile","parsedPlatform","parsedArchitecture","parsedModel","parsedPlatformVersion","parsedBitness","isWow64","result","currentUserAgent","beforeAgent","originalNavigator","initialParsedData","setUserAgentData","error","parsedData","userAgentDataProxy","navigatorProxy","target","prop","e","updateUserAgent","fallbackError","set","getFromArgs","args","setUserAgent","getUserAgent","withUserAgent","StoryFn","context","isUserAgentSet","setIsUserAgentSet","useState","useMemo","componentId","useEffect","cleanup","err","preview","preview_default"],"mappings":"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","file":"preview.cjs","sourcesContent":["export const PARAM_KEY = \"userAgent\";\nexport const ADDON_ID = \"storybook/user-agent\";\nexport const TOOL_ID = `${ADDON_ID}/tool`;\nexport const TOOL_TITLE = \"User-Agent\";\n","export const PLATFORMS = {\n WINDOWS: \"Windows\",\n MACINTOSH: \"Macintosh\",\n LINUX: \"Linux\",\n ANDROID: \"Android\",\n IOS: \"iOS\",\n} as const;\n\nexport type Platform = (typeof PLATFORMS)[keyof typeof PLATFORMS];\n\nexport const ARCHITECTURES = {\n X64: \"x64\",\n X86: \"x86\",\n ARM64: \"arm64\",\n ARM: \"arm\",\n} as const;\n\nexport type Architecture = (typeof ARCHITECTURES)[keyof typeof ARCHITECTURES];\n\nexport const BROWSER_MAPPING = {\n Chrome: \"Chrome\",\n Chromium: \"Chromium\",\n Edge: \"Edge\",\n Brave: \"Brave\",\n Opera: \"Opera\",\n Firefox: \"Firefox\",\n Safari: \"Safari\",\n \"Internet Explorer\": \"Internet Explorer\",\n} as const;\n\nexport type Browser = (typeof BROWSER_MAPPING)[keyof typeof BROWSER_MAPPING];\n\nexport const REGEX = {\n MOBILE: /Mobile|Android|iPhone|iPad|iPod/i,\n PLATFORM: /Windows|Macintosh|Linux|Android|iPhone|iPad|iPod/i,\n ARCH_INFO: /\\((.*?)\\)/,\n DEVICE_MODEL: {\n APPLE: /iPhone|iPad|iPod|MacBook|MacBook Pro|MacBook Air|iMac|Mac Pro/i,\n MOBILE: /Android|Windows Phone|BlackBerry|Nexus|Pixel|Galaxy/i,\n PHONE_BRANDS: /Xiaomi|Huawei|Sony|LG|OnePlus|OPPO|vivo|Realme|Motorola/i,\n PC_BRANDS: /Lenovo|Asus|Acer|Dell|HP|Surface/i,\n },\n BROWSER:\n /(Chrome|Chromium|Edge|Brave|Opera)\\/(\\d+\\.\\d+)|(Firefox)\\/(\\d+\\.\\d+)|(Version)\\/(\\d+\\.\\d+).*Safari|(MSIE|Trident)\\/(\\d+\\.\\d+)/i,\n PLATFORM_VERSION: {\n WINDOWS: /Windows NT (\\d+\\.\\d+)/i,\n MACOS: /Mac OS X (\\d+[._]\\d+(?:[._]\\d+)?)/i,\n IOS: /iPhone OS (\\d+[._]\\d+(?:[._]\\d+)?)/i,\n ANDROID: /Android (\\d+(?:\\.\\d+(?:\\.\\d+)?)?)/i,\n },\n BITNESS: {\n WIN64: /Win64|x64|WOW64/i,\n X86_64: /x86_64/i,\n ARM64: /aarch64/i,\n I686: /i686|i386/i,\n ARM32: /armv\\d+[^6]/i,\n },\n};\n","import {\n PLATFORMS,\n ARCHITECTURES,\n REGEX,\n Platform,\n Architecture,\n} from \"./constants\";\n\nexport function detectPlatform(userAgent: string): Platform | undefined {\n const platformMatch = userAgent.match(REGEX.PLATFORM);\n if (!platformMatch) {\n return undefined;\n }\n\n const match = platformMatch[0];\n\n if (/Windows/i.test(match)) return PLATFORMS.WINDOWS;\n else if (/Macintosh/i.test(match)) return PLATFORMS.MACINTOSH;\n else if (/Linux/i.test(match)) return PLATFORMS.LINUX;\n else if (/Android/i.test(match)) return PLATFORMS.ANDROID;\n else if (/iPhone|iPad|iPod/i.test(match)) return PLATFORMS.IOS;\n\n return undefined;\n}\n\nexport function detectPlatformVersion(\n userAgent: string,\n platform?: Platform,\n): string | undefined {\n if (!platform) {\n platform = detectPlatform(userAgent);\n }\n\n if (!platform) return undefined;\n\n let match;\n\n switch (platform) {\n case PLATFORMS.WINDOWS:\n match = userAgent.match(REGEX.PLATFORM_VERSION.WINDOWS);\n return match?.[1];\n\n case PLATFORMS.MACINTOSH:\n match = userAgent.match(REGEX.PLATFORM_VERSION.MACOS);\n if (match?.[1]) {\n // Convert 10_15_7 to 10.15.7\n return match[1].replace(/_/g, \".\");\n }\n return undefined;\n\n case PLATFORMS.IOS:\n match = userAgent.match(REGEX.PLATFORM_VERSION.IOS);\n if (match?.[1]) {\n // Convert 14_0 to 14.0\n return match[1].replace(/_/g, \".\");\n }\n return undefined;\n\n case PLATFORMS.ANDROID:\n match = userAgent.match(REGEX.PLATFORM_VERSION.ANDROID);\n return match?.[1];\n\n default:\n return undefined;\n }\n}\n\nexport function detectBitness(userAgent: string): string | undefined {\n // Windows or macOS with explicit 64-bit markers\n if (REGEX.BITNESS.WIN64.test(userAgent)) {\n return \"64\";\n }\n\n // Linux x86_64\n if (REGEX.BITNESS.X86_64.test(userAgent)) {\n return \"64\";\n }\n\n // ARM64/aarch64\n if (REGEX.BITNESS.ARM64.test(userAgent)) {\n return \"64\";\n }\n\n // 32-bit Intel\n if (REGEX.BITNESS.I686.test(userAgent)) {\n return \"32\";\n }\n\n // 32-bit ARM\n if (REGEX.BITNESS.ARM32.test(userAgent)) {\n return \"32\";\n }\n\n // Default for modern devices (most modern browsers and devices are 64-bit)\n const platform = detectPlatform(userAgent);\n if (platform === PLATFORMS.MACINTOSH || platform === PLATFORMS.IOS) {\n // Modern Apple devices are all 64-bit\n return \"64\";\n }\n\n // For other platforms, we're less certain but most modern devices are 64-bit\n if (platform === PLATFORMS.ANDROID) {\n // Android version-based detection\n const version = detectPlatformVersion(userAgent, platform);\n if (version) {\n const majorVersion = parseInt(version.split(\".\")[0], 10);\n // Android 5.0 and above are typically 64-bit\n if (majorVersion >= 5) {\n return \"64\";\n } else {\n // Older Android versions were typically 32-bit\n return \"32\";\n }\n }\n }\n\n return undefined;\n}\n\nexport function detectArchitecture(\n userAgent: string,\n): Architecture | undefined {\n const archMatch = REGEX.ARCH_INFO.exec(userAgent);\n if (!archMatch?.[1]) {\n return undefined;\n }\n\n const archInfo = archMatch[1];\n\n if (archInfo.includes(ARCHITECTURES.X64)) return ARCHITECTURES.X64;\n else if (archInfo.includes(ARCHITECTURES.X86)) return ARCHITECTURES.X86;\n else if (archInfo.includes(ARCHITECTURES.ARM64)) return ARCHITECTURES.ARM64;\n else if (archInfo.includes(ARCHITECTURES.ARM)) return ARCHITECTURES.ARM;\n\n return undefined;\n}\n\nexport function detectModel(userAgent: string): string | undefined {\n for (const category of Object.values(REGEX.DEVICE_MODEL)) {\n const match = category.exec(userAgent);\n if (match?.[0]) {\n return match[0];\n }\n }\n\n return undefined;\n}\n\n/**\n * Detects if the user agent is from a WOW64 environment (32-bit app on 64-bit Windows)\n */\nexport function detectWow64(userAgent: string): boolean {\n // Only relevant for Windows systems\n const platform = detectPlatform(userAgent);\n if (platform !== PLATFORMS.WINDOWS) {\n return false;\n }\n\n // Check for WOW64 marker\n return /WOW64/i.test(userAgent);\n}\n","import { BROWSER_MAPPING, REGEX } from \"./constants\";\nimport type { Brand, UserAgentData } from \"./types\";\nimport {\n detectPlatform,\n detectArchitecture,\n detectModel,\n detectPlatformVersion,\n detectBitness,\n detectWow64,\n} from \"./detection\";\n\nexport function isBrowserName(\n brand: string,\n): brand is keyof typeof BROWSER_MAPPING {\n return brand in BROWSER_MAPPING;\n}\n\nexport function parseBrowserBrands(userAgent: string): Brand[] {\n const brands: Brand[] = [];\n const match = userAgent.match(REGEX.BROWSER);\n\n if (!match) {\n return brands;\n }\n\n if (match[1] && match[2]) {\n const brand = match[1];\n const version = match[2];\n\n if (isBrowserName(brand)) {\n brands.push({ brand: BROWSER_MAPPING[brand], version });\n } else {\n brands.push({ brand: \"Chromium\", version });\n }\n }\n\n if (match[3] && match[4]) {\n brands.push({ brand: BROWSER_MAPPING.Firefox, version: match[4] });\n }\n\n if (match[5] && match[6]) {\n brands.push({ brand: BROWSER_MAPPING.Safari, version: match[6] });\n }\n\n if (match[7] && match[8]) {\n brands.push({\n brand: BROWSER_MAPPING[\"Internet Explorer\"],\n version: match[8],\n });\n }\n\n return brands;\n}\n\nexport async function getModernBrowserInfo(): Promise<\n { brands?: Brand[]; highEntropyValues?: Partial<UserAgentData> } | undefined\n> {\n if (typeof window === \"undefined\" || !window.navigator.userAgentData) {\n return undefined;\n }\n\n const brands =\n window.navigator.userAgentData.brands ||\n window.navigator.userAgentData.fullVersionList;\n\n let highEntropyValues: Partial<UserAgentData> | undefined;\n\n if (window.navigator.userAgentData.getHighEntropyValues) {\n try {\n highEntropyValues =\n await window.navigator.userAgentData.getHighEntropyValues([\n \"architecture\",\n \"bitness\",\n \"brands\",\n \"fullVersionList\",\n \"mobile\",\n \"model\",\n \"platform\",\n \"platformVersion\",\n \"wow64\",\n ]);\n } catch (error) {\n console.warn(\"Failed to get high entropy values:\", error);\n }\n }\n\n if (!brands && !highEntropyValues) return undefined;\n\n return {\n brands: brands?.map((brand) => ({\n brand: brand.brand,\n version: brand.version,\n })),\n highEntropyValues,\n };\n}\n\nexport async function parseUserAgent(\n userAgent: string,\n): Promise<Partial<UserAgentData>> {\n const brandList = parseBrowserBrands(userAgent);\n const isMobile = REGEX.MOBILE.test(userAgent);\n const parsedPlatform = detectPlatform(userAgent);\n const parsedArchitecture = detectArchitecture(userAgent);\n const parsedModel = detectModel(userAgent);\n const parsedPlatformVersion = detectPlatformVersion(\n userAgent,\n parsedPlatform,\n );\n const parsedBitness = detectBitness(userAgent);\n const isWow64 = detectWow64(userAgent);\n\n const result: Partial<UserAgentData> = {\n userAgent,\n mobile: isMobile,\n platform: parsedPlatform,\n architecture: parsedArchitecture,\n model: parsedModel,\n platformVersion: parsedPlatformVersion || \"0\",\n bitness: parsedBitness || \"64\",\n wow64: isWow64,\n };\n\n if (brandList && brandList.length > 0) {\n result.brands = brandList;\n result.fullVersionList = brandList;\n } else {\n result.brands = [];\n result.fullVersionList = [];\n }\n\n return result;\n}\n","import type { UserAgentData, UserAgentArgs } from \"./types\";\nimport { parseUserAgent } from \"./browser\";\n\nlet currentUserAgent =\n typeof window !== \"undefined\" ? window.navigator.userAgent : \"\";\n\nconst beforeAgent =\n typeof window !== \"undefined\" ? window.navigator.userAgent : \"\";\n\nlet originalNavigator: Navigator | undefined;\nif (typeof window !== \"undefined\") {\n originalNavigator = window.navigator;\n\n (async () => {\n try {\n const initialParsedData = await parseUserAgent(beforeAgent);\n\n if (window.navigator.userAgentData) {\n setUserAgentData(initialParsedData);\n }\n } catch (error) {\n console.warn(\"Failed to initialize consistent userAgentData:\", error);\n }\n })();\n}\n\nfunction setUserAgentData(parsedData: Partial<UserAgentData>): void {\n if (typeof window === \"undefined\" || !window.navigator.userAgentData) return;\n\n try {\n const userAgentDataProxy = {\n ...window.navigator.userAgentData,\n ...parsedData,\n getHighEntropyValues: async () => parsedData,\n };\n\n const navigatorProxy = new Proxy(window.navigator, {\n get(target, prop) {\n if (prop === \"userAgentData\") {\n return userAgentDataProxy;\n }\n return Reflect.get(target, prop);\n },\n });\n\n if (window.Navigator && typeof window.Navigator === \"function\") {\n try {\n Object.defineProperty(window, \"navigator\", {\n value: navigatorProxy,\n configurable: true,\n writable: true,\n });\n } catch (e) {\n console.warn(\"Unable to replace navigator object with proxy:\", e);\n }\n }\n } catch (error) {\n console.warn(\"Failed to set userAgentData safely:\", error);\n }\n}\n\nasync function updateUserAgent(userAgent: string): Promise<void> {\n if (typeof window === \"undefined\") return;\n\n try {\n const navigatorProxy = new Proxy(window.navigator, {\n get(target, prop) {\n if (prop === \"userAgent\") {\n return userAgent;\n }\n return Reflect.get(target, prop);\n },\n });\n\n if (window.Navigator && typeof window.Navigator === \"function\") {\n try {\n Object.defineProperty(window, \"navigator\", {\n value: navigatorProxy,\n configurable: true,\n writable: true,\n });\n } catch (e) {\n console.warn(\"Unable to replace navigator object with proxy:\", e);\n\n try {\n Object.defineProperty(window.navigator, \"userAgent\", {\n get: () => userAgent,\n configurable: true,\n });\n } catch (fallbackError) {\n console.warn(\"All UA spoofing methods failed:\", fallbackError);\n }\n }\n }\n\n if (window.navigator.userAgentData) {\n const parsedData = await parseUserAgent(userAgent);\n setUserAgentData(parsedData);\n }\n } catch (error) {\n console.warn(\"Failed to update userAgent safely:\", error);\n }\n}\n\nexport async function set(userAgent?: string): Promise<() => Promise<void>> {\n if (typeof window === \"undefined\") return async () => {};\n\n try {\n if (!userAgent) {\n currentUserAgent = beforeAgent;\n await updateUserAgent(beforeAgent);\n return async () => {};\n }\n\n currentUserAgent = userAgent;\n await updateUserAgent(userAgent);\n\n return async () => {\n try {\n if (originalNavigator) {\n Object.defineProperty(window, \"navigator\", {\n value: originalNavigator,\n configurable: true,\n writable: true,\n });\n } else {\n await updateUserAgent(currentUserAgent);\n }\n } catch (error) {\n console.warn(\"Failed to restore original navigator:\", error);\n await updateUserAgent(currentUserAgent);\n }\n };\n } catch (error) {\n console.warn(\"Error in userAgent setting process:\", error);\n return async () => {};\n }\n}\n\nexport function getFromArgs(args?: UserAgentArgs): string {\n return args?.useragent || \"\";\n}\n","import { set, getFromArgs } from \"./manipulation\";\n\nexport * from \"./types\";\nexport * from \"./constants\";\nexport * from \"./detection\";\nexport * from \"./browser\";\n\nexport const setUserAgent = set;\nexport const getUserAgent = getFromArgs;\n","import type {\n Renderer,\n PartialStoryFn as StoryFunction,\n StoryContext,\n} from \"@storybook/types\";\n\nimport { useEffect, useMemo, useState } from \"@storybook/preview-api\";\n\nimport { setUserAgent, getUserAgent } from \"./core\";\n\nexport function withUserAgent(\n StoryFn: StoryFunction<Renderer>,\n context: StoryContext<Renderer>,\n) {\n const [isUserAgentSet, setIsUserAgentSet] = useState(false);\n\n const userAgent = useMemo(\n () => getUserAgent(context.args),\n [context.args?.useragent],\n );\n\n const componentId = useMemo(() => context.id, [context.id]);\n\n useEffect(() => {\n let cleanup: (() => Promise<void>) | (() => void) = () => {};\n\n (async () => {\n try {\n setIsUserAgentSet(false);\n const cleanupFn = await setUserAgent(userAgent);\n cleanup = cleanupFn;\n setIsUserAgentSet(true);\n } catch (error) {\n console.error(\"Failed to set user agent:\", error);\n setIsUserAgentSet(true);\n }\n })();\n\n return () => {\n if (cleanup instanceof Promise) {\n cleanup.catch((err) => console.error(\"Error during cleanup:\", err));\n } else {\n cleanup();\n }\n setIsUserAgentSet(false);\n };\n }, [userAgent, componentId]);\n\n if (userAgent && !isUserAgentSet) {\n return null;\n }\n\n return StoryFn();\n}\n","import type { Renderer, ProjectAnnotations } from \"@storybook/types\";\nimport { PARAM_KEY } from \"./constants\";\nimport { withUserAgent } from \"./withUserAgent\";\n\nconst preview: ProjectAnnotations<Renderer> = {\n decorators: [withUserAgent],\n initialGlobals: { [PARAM_KEY]: false },\n};\n\nexport default preview;\n"]}