{
  "version": 3,
  "sources": ["../../../../../node_modules/@snapchat/client-hints/src/AbstractBrowserFeature.ts", "../../../../../node_modules/@snapchat/client-hints/src/media/supportsAvif.ts", "../../../../../node_modules/@snapchat/client-hints/src/media/supportsWebP.ts", "../../../../../node_modules/@snapchat/client-hints/src/StaticBrowserFeature.ts", "../../../../../node_modules/@snapchat/client-hints/src/utils/parseMajorMinorVersion.ts", "../../../../../node_modules/@snapchat/client-hints/src/utils/parseMajorVersion.ts", "../../../../../node_modules/@snapchat/client-hints/src/utils/parseUserAgent.ts", "../../../../snap-design-system-marketing/src/BrowserFeatures/BrowserFeaturesContextProvider.tsx", "../../../../snap-design-system-marketing/src/constants/media.ts", "../../../../snap-design-system-marketing/src/hooks/useMediaMode.ts", "../../../../snap-design-system-marketing/src/utils/environment.ts", "../../../../snap-design-system-marketing/src/utils/useWindowSize.ts"],
  "sourcesContent": ["import assign from 'lodash/assign.js';\nimport clone from 'lodash/clone.js';\n\nimport type {\n  BrowserInfo,\n  HighEntropyBrowserHints,\n  LowEntropyBrowserHints,\n} from './browserFeatures.types';\n\nexport interface BrowserFeatureProps {\n  lowEntropyHints?: LowEntropyBrowserHints;\n  highEntropyHints?: HighEntropyBrowserHints;\n}\n\nexport abstract class AbstractBrowserFeature implements BrowserInfo {\n  protected lowEntropyHints?: LowEntropyBrowserHints;\n  protected highEntropyHints?: HighEntropyBrowserHints;\n\n  constructor(props?: BrowserFeatureProps) {\n    this.lowEntropyHints = props?.lowEntropyHints;\n    this.highEntropyHints = props?.highEntropyHints;\n  }\n\n  // ===========================================================================\n  // Public methods.\n  // ===========================================================================\n\n  /** @override */\n  public getLowEntropyHints = (): Readonly<LowEntropyBrowserHints> => {\n    if (!this.lowEntropyHints) {\n      this.lowEntropyHints = Object.freeze(this.computeLowEntropyHints());\n    }\n\n    return this.lowEntropyHints;\n  };\n\n  /** @override */\n  public getHighEntropyHintsAsync = async (options: {\n    hints: Array<keyof HighEntropyBrowserHints>;\n  }): Promise<Readonly<HighEntropyBrowserHints>> => {\n    if (!this.highEntropyHints) {\n      this.highEntropyHints = {};\n    }\n    const missingHints = options.hints.filter(hint => !this.highEntropyHints![hint]);\n    if (missingHints.length === 0) return this.highEntropyHints;\n    const newHints = await this.computeHighEntropyHintsAsync(...missingHints);\n    const updatedHints: HighEntropyBrowserHints = clone(this.highEntropyHints);\n    assign(updatedHints, newHints);\n    this.highEntropyHints = updatedHints;\n    return Object.freeze(this.highEntropyHints);\n  };\n\n  /** @override */\n  public getCachedHighEntropyHints = (): Readonly<HighEntropyBrowserHints> | undefined => {\n    return this.highEntropyHints;\n  };\n\n  // ===========================================================================\n  // Abstract methods.\n  // ===========================================================================\n\n  protected abstract computeLowEntropyHints(): LowEntropyBrowserHints;\n\n  protected abstract computeHighEntropyHintsAsync(\n    ...hints: Array<keyof HighEntropyBrowserHints>\n  ): Promise<HighEntropyBrowserHints>;\n}\n", "import type { LowEntropyBrowserHints } from '../browserFeatures.types';\n\n/**\n * See https://caniuse.com/avif\n *\n * NOTE: We don't want to mandate high entropy hints here, so no support for Safari 16.\n */\nexport function supportsAvif(hints: LowEntropyBrowserHints): boolean {\n  // Egde. (Not supported currently as of 2023-08). Check before Chromium check.\n  // TODO: Check back in later.\n  const isEdge = hints.browsers.find(({ brand }) => brand === 'Edge');\n  if (isEdge) return false;\n\n  // Chrome, Android Internet, Samsung Internet\n  const isChrome85 = hints.browsers.find(\n    ({ brand, majorVersion }) => (brand === 'Chrome' || brand === 'Chromium') && majorVersion >= 85\n  );\n  if (isChrome85) return true;\n\n  // Firefox\n  // Technically there's limited support in 93-112, but we skip it here.\n  const isFirefox113 = hints.browsers.find(\n    ({ brand, majorVersion }) => brand === 'Firefox' && majorVersion >= 113\n  );\n  if (isFirefox113) return true;\n\n  // Opera\n  // Opera Mini isn't supported.\n  const isOperaMini = hints.browsers.find(({ brand }) => brand === 'Opera Mini');\n  const isOpera71 = hints.browsers.find(\n    ({ brand, majorVersion }) => brand === 'Opera' && majorVersion >= 71\n  );\n  if (isOpera71 && !isOperaMini) return true;\n\n  // Safari\n  // NOTE: We ignore high-entropy lookups for 16.1-16.3 on MacOS13+ and 16.4+\n  const isSafari17 = hints.browsers.find(\n    ({ brand, majorVersion }) => brand === 'Safari' && majorVersion >= 17\n  );\n  if (isSafari17) return true;\n\n  // Others\n  return false;\n}\n", "import type { LowEntropyBrowserHints } from '../browserFeatures.types';\n\n/**\n * See https://caniuse.com/webp\n *\n * NOTE: We don't want to mandate high entropy hints for these lookups.\n */\nexport function supportsWebP(hints: LowEntropyBrowserHints): boolean {\n  // Chrome, Chromium, Edge, Opera, Android Internet, Samsung Internet\n  const isChromium32 = hints.browsers.find(\n    ({ brand, majorVersion }) => (brand === 'Chromium' || brand === 'Chrome') && majorVersion >= 32\n  );\n  if (isChromium32) return true;\n\n  // Opera Mini\n  const isOperaMini = hints.browsers.find(({ brand }) => brand === 'Opera Mini');\n  if (isOperaMini) return true;\n\n  // Firefox\n  const isFirefox65 = hints.browsers.find(\n    ({ brand, majorVersion }) => brand === 'Firefox' && majorVersion >= 65\n  );\n  if (isFirefox65) return true;\n\n  // Safari\n  // NOTE that we ignore Safari14+ on MacOS11+\n  const isSafari16 = hints.browsers.find(\n    ({ brand, majorVersion }) => brand === 'Safari' && majorVersion >= 16\n  );\n  if (isSafari16) return true;\n\n  // Others.\n  return false;\n}\n", "import { AbstractBrowserFeature } from './AbstractBrowserFeature';\nimport type { HighEntropyBrowserHints, LowEntropyBrowserHints } from './browserFeatures.types';\n\n/**\n * Defaults for an unknown desktop device.\n *\n * This is what we'd parse from a request with no user agent of hint headers.\n */\nconst defaultLowEntropyHints: LowEntropyBrowserHints = {\n  isMobile: false,\n  platform: 'Unknown',\n  browsers: [],\n  saveData: false,\n};\n\n/** Implementation of the browser features that uses values passed in the constructor. */\nexport class StaticBrowserFeature extends AbstractBrowserFeature {\n  protected computeLowEntropyHints(): LowEntropyBrowserHints {\n    return this.lowEntropyHints ?? defaultLowEntropyHints;\n  }\n\n  protected computeHighEntropyHintsAsync(): Promise<HighEntropyBrowserHints> {\n    return Promise.resolve(this.highEntropyHints ?? {});\n  }\n}\n", "/**\n * Returns a numeric representation of a browser or os version.\n *\n * I.e. 11.2.25.20220715 => 11.2\n */\nexport function parseMajorMinorVersion(version?: string): number {\n  if (!version) return -1;\n  const [major, minor] = version.split('.');\n  return Number([major, minor].filter(Boolean).join('.'));\n}\n", "/** Parses the first integer before a '.' */\nexport function parseMajorVersion(version?: string): number {\n  if (!version) {\n    return 0;\n  }\n  const dotIndex = version.indexOf('.');\n  return Number(dotIndex >= 0 ? version.substring(0, dotIndex) : version);\n}\n", "// NOTE: This file focuses on parsing the low entropy client hints\n// from the user agent. Even though UA has more information than that, it's not\n// good to try to parse it out and make websites that depend on it since the\n// web is moving away from that.\n// I.e. do you need to know the architecture on the android tv the page is\n// being viewed on for your site to function properly?\n//\n// NOTE 2: Existing packages were considered for this. The best one by far\n// seems to be \"ua-parser-js\" which supports client hints, auto-detection\n// on the client, parsing server-side headers etc. However it's 6kb zipped\n// because it supports every single device known to mankind, which is a lot.\n\nimport type { BrowserBrand, LowEntropyBrowserHints, Platform } from '..';\nimport { parseMajorVersion } from './parseMajorVersion';\n\n/** Matcher for user agent version building blocks like AppleWebKit/605.1.15 */\nconst browserVersionRegex = /([a-zA-Z0-9]+)\\/([0-9.]+)/g;\n\nconst isMobileRegex = /Mobile/;\n\n/**\n * Supported browser brands.\n *\n * This covers both the User Agent string string variants a well as secure client hint user agent\n * ones.\n *\n * See https://wiki.sc-corp.net/pages/viewpage.action?pageId=157868735 for the choice of the ones\n * that are supported as distinct browsers. The others have to use fallbacks or list an approximate\n * compatibility (which they do).\n */\nconst supportedBrowserBrands: Record<string, BrowserBrand> = {\n  Firefox: 'Firefox',\n  Safari: 'Safari',\n  Chromium: 'Chromium',\n  'Google Chrome': 'Chrome',\n  Chrome: 'Chrome',\n  Edge: 'Edge',\n  Edg: 'Edge',\n  'Microsoft Edge': 'Edge',\n  CriOS: 'Chrome', // Chrome on iOS\n  FxiOS: 'Firefox', // Firefox on iOS\n  OPR: 'Opera',\n  Opera: 'Opera',\n  Presto: 'Opera Mini', // Opera Mini still uses Presto and keeps getting updates.\n};\n\n/**\n * Parses a string w/ the brand of a browser into a standard set.\n *\n * Note that this implementation on purpose DOES NOT differentiate between different versions of a\n * brand. I.e. \"Firefox Mobile\" === \"Firefox\" and \"Opera Mini\" === \"Opera\". It is expected that the\n * \"isMobile\" client hint is used to make the distinction where mobile vs desktop matters, and the\n * \"save-data\" hint is used to determine how much brandwidth the device has.\n */\nexport function parseBrowserBrand(brand: string): BrowserBrand {\n  return supportedBrowserBrands[brand] ?? 'Unknown';\n}\n\nconst platformRegex = /(\\([^)]+\\))/;\n\n/** Returns a standard platform account for the common ones we receive traffic from. */\nexport function parsePlatform(platform?: string): Platform | undefined {\n  if (!platform) return undefined;\n  if (/iOS|iPhone/.test(platform)) return 'iOS'; // Has to be before macOS test.\n  if (/macOS|Mac OS|AppleTV/.test(platform)) return 'macOS';\n  if (/Android|CrKey/.test(platform)) return 'Android'; // Has to be before Linux.\n  if (/Windows/.test(platform)) return 'Windows';\n  if (/Linux|Roku|PlayStation/.test(platform)) return 'Linux';\n  if (/CrOS/.test(platform)) return 'Chrome OS';\n  return undefined;\n}\n\n/** WebView browser appends the \"wv\" at the end of the platform part of the user agent. */\nconst androidWebViewRegex = /; wv\\)/;\n\nconst appleRegex = /iPhone|iPad/;\n\n/** Regex for browser that need to be promoted as the first brand. */\nconst promoteBrandNameRegex = /Edge|Opera|Opera Mini/;\n\n/**\n * Parses the browser brand and versions from the user agent.\n *\n * Handles weird cases like \"Version/X Brand/Y\" actually means \"Brand/X\"\n */\nfunction parseBrowserBrandsFromUa(\n  userAgent?: string\n): { brand: BrowserBrand; majorVersion: number }[] {\n  if (!userAgent) return [];\n  const matchArray = userAgent.matchAll(browserVersionRegex);\n\n  const isApple = appleRegex.test(userAgent);\n  const _isAndroidWebView = androidWebViewRegex.test(userAgent);\n  let appleWebViewVersion: number | undefined;\n  const result = [] as { brand: BrowserBrand; majorVersion: number }[];\n\n  for (const [, brand, version] of matchArray) {\n    // Skip type of mobile device. I.e. Mobile/15A372.\n    if (brand === 'Mobile' && isApple) {\n      appleWebViewVersion = parseMajorVersion(version);\n      continue;\n    }\n\n    const mappedBrand = supportedBrowserBrands[brand];\n    if (!mappedBrand) continue;\n    let majorVersion = parseMajorVersion(version);\n\n    if (mappedBrand === 'Safari') {\n      // If we're looking for \"Safari\" and have found it, can stop looking\n      appleWebViewVersion = undefined;\n\n      // Account for Version/X Safari/Y => Safari/X\n      // And Version/X Mobile/Blah Safari/Y => Safari/X\n      const safariVersion = /Version\\/([0-9.]*)( Mobile\\/[A-Z0-9]+)? Safari/.exec(userAgent);\n      if (safariVersion) majorVersion = parseMajorVersion(safariVersion[1]);\n\n      // Skip webkit subversion match. I.e. Safari/537 which is a match for AppleWebKit/537\n      if (majorVersion > 530) continue;\n    }\n\n    // Support Opera Mini\n    if (mappedBrand === 'Opera Mini') {\n      const operaMiniVersion = /Opera Mini\\/([0-9.]*)/.exec(userAgent);\n      if (operaMiniVersion) majorVersion = parseMajorVersion(operaMiniVersion[1]);\n    }\n\n    // Some brands put their version last, so they need to be promoted to the\n    // from to be consistent with the Client Hints api.\n    // I.e. 'Chrome/123.0.0 Safari/123.0.0 Edg/123.0.0` but it's Edge.\n    if (promoteBrandNameRegex.test(mappedBrand)) {\n      result.unshift({ brand: mappedBrand, majorVersion });\n    } else {\n      result.push({ brand: mappedBrand, majorVersion });\n    }\n  }\n\n  // If we're on Apple and have found a mobile version, then that's Safari Webview.\n  // Need to make sure it's recorded if there isn't another browser that's being\n  // used like ChriOS (Chrome on iOS).\n  if (appleWebViewVersion && result.length === 0) {\n    result.push({\n      brand: 'Safari',\n      majorVersion: appleWebViewVersion,\n    });\n  }\n\n  return result;\n}\n\n/**\n * Parses out low entropy client hints from a user-agent.\n *\n * Useful tool is: https://51degrees.com/developers/user-agent-tester\n */\nexport function parseUserAgent(userAgent?: string): LowEntropyBrowserHints {\n  const platform = parsePlatform(userAgent?.match(platformRegex)?.[0]);\n  const browsers = parseBrowserBrandsFromUa(userAgent);\n  return {\n    browsers: browsers as { brand: BrowserBrand; majorVersion: number }[],\n    isMobile: userAgent ? isMobileRegex.test(userAgent) : false,\n    platform: platform ?? 'Unknown',\n    saveData: false, // Not available from user agent. :(\n  };\n}\n", "import { StaticBrowserFeature } from '@snapchat/client-hints';\nimport { createContext } from 'react';\n\nimport type { BrowserFeatures } from './types';\n\nexport const BrowserFeaturesContext = createContext<BrowserFeatures>(\n  new StaticBrowserFeature({\n    lowEntropyHints: {\n      isMobile: true, // Mobile-first FTW\n      saveData: false,\n      browsers: [],\n      platform: 'Unknown',\n    },\n  })\n);\n\nexport const BrowserFeaturesContextProvider = BrowserFeaturesContext.Provider;\n", "import type { ValueOf } from '../types';\n\nexport const Device = {\n  None: 'None',\n  Laptop: 'Laptop',\n  Phone: 'Phone',\n  Shadow: 'Shadow',\n} as const;\n\nexport type Device = ValueOf<typeof Device>;\n\nexport const MediaMode = {\n  Desktop: 'Desktop',\n  Mobile: 'Mobile',\n} as const;\n\nexport type MediaMode = ValueOf<typeof MediaMode>;\n", "import { useContext, useEffect, useState } from 'react';\n\nimport { BrowserFeaturesContext } from '../BrowserFeatures';\nimport { MediaMode, mobileMaxWidth } from '../constants';\nimport { useWindowSize } from '../utils';\n\n/** Hook that returns whether the current rendering media mode. */\nexport function useMediaMode(): MediaMode {\n  const { getLowEntropyHints, getCachedHighEntropyHints } = useContext(BrowserFeaturesContext);\n  const requestedIsMobile = getLowEntropyHints().isMobile;\n  const initialClientWidth = getCachedHighEntropyHints()?.viewportWidth;\n  const defaultIsMobile = initialClientWidth\n    ? initialClientWidth <= mobileMaxWidth\n    : requestedIsMobile;\n\n  const [mode, setMode] = useState<MediaMode>(\n    defaultIsMobile ? MediaMode.Mobile : MediaMode.Desktop\n  );\n  const { width: windowWidth } = useWindowSize();\n\n  useEffect(() => {\n    const isMobile = (windowWidth ?? Number.POSITIVE_INFINITY) <= mobileMaxWidth;\n    setMode(isMobile ? MediaMode.Mobile : MediaMode.Desktop);\n  }, [windowWidth]);\n\n  return mode;\n}\n", "import { isBrowser } from '@snapchat/mw-common/client';\n\nexport { isBrowser };\n\n// eslint-disable-next-line no-restricted-syntax\nexport const isSSR = (): boolean => !isBrowser();\n", "import throttle from 'lodash/throttle.js';\nimport { useCallback, useContext, useEffect, useState } from 'react';\n\nimport { BrowserFeaturesContext } from '../BrowserFeatures';\nimport { isBrowser } from './environment';\n\nexport interface ViewportSize {\n  width?: number;\n  height?: number;\n}\n\nclass ViewportSizeEmitter extends EventTarget {\n  public width: number | undefined;\n  public height: number | undefined;\n\n  constructor() {\n    super();\n    this.width = undefined;\n    this.height = undefined;\n  }\n\n  public dispatchResizeEvent(): void {\n    viewportSizeEventTarget.dispatchEvent(new Event('resize'));\n  }\n\n  public setViewportSize(width: number, height: number): void {\n    this.width = width;\n    this.height = height;\n  }\n\n  public getViewportSize(): ViewportSize {\n    return {\n      width: this.width,\n      height: this.height,\n    };\n  }\n}\n\n// Event target to dispatch resize events\nconst viewportSizeEventTarget = new ViewportSizeEmitter();\n\nif (isBrowser()) {\n  // Set initial size\n  viewportSizeEventTarget.setViewportSize(window.innerWidth, window.innerHeight);\n\n  // Add window resize listener to update sizes (do we want to throttle this?)\n  window.addEventListener('resize', () => {\n    viewportSizeEventTarget.setViewportSize(window.innerWidth, window.innerHeight);\n    viewportSizeEventTarget.dispatchResizeEvent();\n  });\n}\n\n// Hook for determining viewport size.\n// Initially based on https://stackoverflow.com/questions/63406435/how-to-detect-window-size-in-next-js-ssr-using-react-hook\nexport function useWindowSize(throttleWindow = 1e3): ViewportSize {\n  const isClient = isBrowser();\n  const { getCachedHighEntropyHints } = useContext(BrowserFeaturesContext);\n\n  const getSize = useCallback(() => {\n    // if on server, try to use client hint to get values\n    if (!isClient) {\n      return {\n        width: getCachedHighEntropyHints()?.viewportWidth,\n        height: getCachedHighEntropyHints()?.viewportHeight,\n      };\n    }\n\n    // else just get from singleton object\n    return viewportSizeEventTarget.getViewportSize();\n  }, [getCachedHighEntropyHints, isClient]);\n\n  const [windowSize, setWindowSize] = useState<ViewportSize>(getSize);\n\n  const handleResize = useCallback(() => {\n    setWindowSize(getSize());\n  }, [getSize, setWindowSize]);\n\n  useEffect(() => {\n    if (!isClient) {\n      return;\n    }\n\n    // TODO: we will eventually want to replace this with radashi, but radashi does not allow us to set the leading flag (always true).\n    const eventListener = throttle(handleResize, throttleWindow, {\n      leading: false,\n      trailing: true,\n    });\n\n    viewportSizeEventTarget.addEventListener('resize', eventListener);\n    return () => viewportSizeEventTarget.removeEventListener('resize', eventListener);\n  }, [handleResize, isClient, throttleWindow]);\n\n  return windowSize;\n}\n"],
  "mappings": "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",
  "names": ["AbstractBrowserFeature", "_a", "props", "options", "missingHints", "hint", "newHints", "updatedHints", "clone_default", "assign_default", "__name", "supportsAvif", "hints", "brand", "majorVersion", "isOperaMini", "supportsWebP", "defaultLowEntropyHints", "StaticBrowserFeature", "parseMajorMinorVersion", "version", "major", "minor", "parseMajorVersion", "dotIndex", "browserVersionRegex", "isMobileRegex", "supportedBrowserBrands", "parseBrowserBrand", "platformRegex", "parsePlatform", "platform", "androidWebViewRegex", "appleRegex", "promoteBrandNameRegex", "parseBrowserBrandsFromUa", "userAgent", "matchArray", "isApple", "_isAndroidWebView", "appleWebViewVersion", "result", "mappedBrand", "safariVersion", "operaMiniVersion", "parseUserAgent", "import_react", "BrowserFeaturesContext", "StaticBrowserFeature", "BrowserFeaturesContextProvider", "Device", "MediaMode", "import_react", "isSSR", "isBrowser", "import_react", "ViewportSizeEmitter", "__publicField", "viewportSizeEventTarget", "width", "height", "isBrowser", "useWindowSize", "throttleWindow", "isClient", "getCachedHighEntropyHints", "BrowserFeaturesContext", "getSize", "windowSize", "setWindowSize", "handleResize", "eventListener", "throttle_default", "useMediaMode", "getLowEntropyHints", "getCachedHighEntropyHints", "BrowserFeaturesContext", "requestedIsMobile", "initialClientWidth", "defaultIsMobile", "mobileMaxWidth", "mode", "setMode", "MediaMode", "windowWidth", "useWindowSize", "isMobile"]
}
