{"version":3,"file":"main.0d5171fc.js","mappings":"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","sources":["webpack://@finviz/website/./js/app/queryString.ts","webpack://@finviz/website/./js/app/shared/cookie.ts","webpack://@finviz/website/./js/app/shared/sentry/constants.ts","webpack://@finviz/website/./js/app/shared/sentry/init.ts","webpack://@finviz/website/./js/app/shared/utils.ts","webpack://@finviz/website/./js/main/components/delayed.tsx","webpack://@finviz/website/./js/main/components/error-view.tsx","webpack://@finviz/website/./js/main/components/loading.tsx","webpack://@finviz/website/./js/main/components/notification/hooks.ts","webpack://@finviz/website/./js/main/components/notification/notification-wrapper.tsx","webpack://@finviz/website/./js/main/components/notification/with-notification-context.tsx","webpack://@finviz/website/./js/main/components/notification/notification.tsx","webpack://@finviz/website/./js/main/constants.ts","webpack://@finviz/website/./js/main/context.ts","webpack://@finviz/website/./js/main/hooks/useCachedLoaderData.tsx","webpack://@finviz/website/./js/main/hooks/useVisualViewport.ts","webpack://@finviz/website/./js/main/modules/portfolio/index.ts","webpack://@finviz/website/./js/main/modules/quote/index.tsx","webpack://@finviz/website/./js/main/index.tsx","webpack://@finviz/website/./js/main/modules/quote/types.ts","webpack://@finviz/website/./js/main/modules/quote/utils.ts","webpack://@finviz/website/./js/main/services/routing.ts","webpack://@finviz/website/./js/main/types.ts","webpack://@finviz/website/./js/main/util-routing.tsx","webpack://@finviz/website/./js/main/util.tsx","webpack://@finviz/website/../node_modules/@ariakit/react-core/esm/__chunks/5KB2YIDT.js","webpack://@finviz/website/../node_modules/@ariakit/react-core/esm/__chunks/JJ3MV4KB.js"],"sourcesContent":["export type ObjectHash = Record\r\n\r\nexport const decodeQueryString = function = ObjectHash>(\r\n search = window.location.search\r\n): T {\r\n const vars = search.substring(1).split('&')\r\n const obj: ObjectHash = {}\r\n vars.forEach((pair) => {\r\n const delimiterPos = pair.indexOf('='),\r\n key = decodeURIComponent(pair.substring(0, delimiterPos)),\r\n value = decodeURIComponent(pair.substring(delimiterPos + 1))\r\n obj[key] = value\r\n })\r\n return obj as T\r\n}\r\n\r\nexport const encodeQueryString = function (values: ObjectHash, whitelistedValues: string[] = []) {\r\n return Object.keys(values).reduce((prev, key) => {\r\n const value = values[key]\r\n if (!['', null, undefined].includes(value) || whitelistedValues.includes(value)) {\r\n return prev + (prev.length > 0 ? '&' : '') + encodeURIComponent(key) + '=' + encodeURIComponent(value)\r\n }\r\n return prev\r\n }, '')\r\n}\r\n","export function getParsedCookies(cookieName: string) {\r\n const parseCookies = document.cookie\r\n .split(';')\r\n .map((cookieString) => cookieString.split('='))\r\n .reduce(\r\n (acc, v) => {\r\n acc[decodeURIComponent(v[0].trim())] = decodeURIComponent(v[1].trim())\r\n return acc\r\n },\r\n {} as Record\r\n )\r\n\r\n return cookieName ? parseCookies[cookieName] : parseCookies\r\n}\r\n\r\nexport function getCookie(name: string) {\r\n var re = new RegExp('(?:(?:^|.*;\\\\s*)' + name + '\\\\s*\\\\=\\\\s*([^;]*).*$)|^.*$')\r\n return document.cookie.replace(re, '$1')\r\n}\r\n\r\nexport function setCookie(name: string, value: string, expires: Date) {\r\n var cookie = name + '=' + value + '; expires=' + expires.toUTCString()\r\n if (/\\bfinviz\\b/.test(document.location.hostname)) {\r\n cookie += '; domain=.finviz.com'\r\n }\r\n document.cookie = cookie\r\n}\r\n","import {\r\n dedupeIntegration,\r\n extraErrorDataIntegration,\r\n httpClientIntegration,\r\n thirdPartyErrorFilterIntegration,\r\n} from '@sentry/browser'\r\n\r\nexport const sentryOptions = {\r\n dsn: 'https://11de51e753454212a2845e5899a38cae@sentry.io/33153',\r\n allowUrls: [/finviz\\.com/, /www\\.finviz\\.com/, /elite\\.finviz\\.com/],\r\n release: typeof window !== 'undefined' && 'FinvizSentrySettings' in window ? FinvizSentrySettings.release : undefined,\r\n sendDefaultPii: true,\r\n integrations: [\r\n dedupeIntegration(),\r\n extraErrorDataIntegration(),\r\n httpClientIntegration({ failedRequestTargets: [/finviz\\.com/] }),\r\n thirdPartyErrorFilterIntegration({\r\n filterKeys: ['finviz'], //NOTE: same application keys as specified in Sentry bundle plugin `webpack.config.js` -> `sentryWebpackPlugin`\r\n behaviour: 'apply-tag-if-exclusively-contains-third-party-frames',\r\n }),\r\n ],\r\n /**\r\n * Ignore if error message matches\r\n * For ignoring specific files, or errors in specific files use `ignoreStack` below\r\n */\r\n ignoreErrors: [\r\n 'TypeError: Failed to fetch',\r\n 'TypeError: NetworkError when attempting to fetch resource.',\r\n 'ChunkLoadError: Loading chunk',\r\n 'Error: Loading CSS chunk',\r\n /^TypeError: Load failed$/,\r\n ],\r\n /**\r\n * Ignore error if a script name in the stack matches any of these\r\n * For global ignore pattenrs use `ignoreErrors` above\r\n */\r\n ignoreStack: [\r\n // Ignore all quantserve scripts\r\n 'quantcount.com',\r\n 'quantserve.com',\r\n // Ignore network errors from cmp script\r\n ['cmp2.js', /(AbortError|NetworkError|aborted|network)/i],\r\n ] satisfies Array,\r\n}\r\n","import * as Sentry from '@sentry/browser'\r\n\r\nimport { ThrowableError } from '../../../main/services/api'\r\nimport { sentryOptions } from './constants'\r\n\r\nif ('FinvizSentrySettings' in window && !('sentryDisabled' in window)) {\r\n Sentry.init({\r\n ...sentryOptions,\r\n beforeSend(event: Sentry.ErrorEvent, hint: Sentry.EventHint) {\r\n const error = hint.originalException as Error | null\r\n const errorFrames = event.exception?.values?.[0]?.stacktrace?.frames ?? []\r\n\r\n // Completely ignore 524 errors, track other network errors as `info` if the status is 520+\r\n const statusCode = error instanceof ThrowableError ? error.status : (event.contexts?.response?.status_code ?? -1)\r\n if (statusCode >= 520) {\r\n // Completely ignore 524 errors\r\n if (statusCode === 524) return null\r\n return { ...event, level: 'info' } satisfies Sentry.ErrorEvent\r\n }\r\n\r\n const isIgnoredError = sentryOptions.ignoreStack.some((ignorePattern) => {\r\n const [ignoreSource, ignoreMessage] = Array.isArray(ignorePattern) ? ignorePattern : [ignorePattern]\r\n const isIgnoredScript = errorFrames.some((frame) => frame?.filename?.includes(ignoreSource))\r\n const isIgnoredMessage =\r\n ignoreMessage && typeof error?.message === 'string' ? error.message.match(ignoreMessage) : false\r\n\r\n return ignoreMessage ? isIgnoredScript && isIgnoredMessage : isIgnoredScript\r\n })\r\n\r\n if (isIgnoredError) return null\r\n\r\n return event\r\n },\r\n })\r\n\r\n if (FinvizSentrySettings.id > 0) {\r\n Sentry.setUser({ id: String(FinvizSentrySettings.id) })\r\n }\r\n\r\n try {\r\n Sentry.setTags({\r\n dpr: window.devicePixelRatio,\r\n redesign: window.FinvizSettings?.hasRedesignEnabled,\r\n dark: window.FinvizSettings?.hasDarkTheme,\r\n innerWidth: window.innerWidth,\r\n innerHeight: window.innerHeight,\r\n })\r\n } catch {}\r\n}\r\n\r\nwindow['Sentry'] = {\r\n captureException: Sentry.captureException,\r\n captureMessage: Sentry.captureMessage,\r\n withScope: Sentry.withScope,\r\n}\r\n","import { setCookieRequest } from '../../main/services/api'\r\nimport { decodeQueryString, encodeQueryString } from '../queryString'\r\nimport { getCookie, setCookie } from './cookie'\r\n\r\nexport const formatDateToStringUS = (date: Date) =>\r\n date.toLocaleDateString('en-US', {\r\n day: '2-digit',\r\n month: '2-digit',\r\n year: 'numeric',\r\n })\r\n\r\nconst DRAWING_QUOTE_PAGE_COOKIE_NAME = 'charts-draw'\r\nexport function getIsDrawingEnabledOnQuotePage() {\r\n return getCookie(DRAWING_QUOTE_PAGE_COOKIE_NAME) === 'on'\r\n}\r\n\r\nexport async function setIsDrawingEnabledOnQuotePage(isEnabled: boolean) {\r\n return setCookieRequest(DRAWING_QUOTE_PAGE_COOKIE_NAME, isEnabled ? 'on' : 'off')\r\n .catch(() => {\r\n // fallback to JS otherwise draw toggle won't work if API doesn't work\r\n setIsDrawingEnabledOnQuotePageCookieViaJS(isEnabled)\r\n })\r\n .finally(() => {\r\n const { i: idea, ...rest } = decodeQueryString()\r\n if (idea) {\r\n document.location = `quote.ashx?${encodeQueryString(rest)}`\r\n } else {\r\n document.location.reload()\r\n }\r\n })\r\n}\r\n\r\nfunction setIsDrawingEnabledOnQuotePageCookieViaJS(isEnabled: boolean) {\r\n const expires = new Date()\r\n expires.setMonth(expires.getMonth() + 1)\r\n setCookie(DRAWING_QUOTE_PAGE_COOKIE_NAME, isEnabled ? 'on' : 'off', expires)\r\n}\r\n\r\nexport function parseInitData(elementId: string): T | undefined {\r\n try {\r\n const initDataElement = document.getElementById(elementId)!\r\n return JSON.parse(initDataElement.textContent!)\r\n } catch (e) {\r\n Sentry.captureException(e)\r\n return\r\n }\r\n}\r\n\r\nexport function getSidebarFromCookie() {\r\n const chartsUrl = getCookie('chartsUrl')\r\n const decodedCookie = chartsUrl ? decodeQueryString<{ sidebar?: string }>(chartsUrl) : null\r\n return decodedCookie?.sidebar || undefined\r\n}\r\n","import * as React from 'react'\r\n\r\nexport interface DelayedProps {\r\n /**\r\n * The delay in milliseconds before the component is rendered.\r\n *\r\n * @default 300\r\n */\r\n delay?: number\r\n\r\n /**\r\n * Delay in milliseconds before rendering timeout state.\r\n */\r\n timeout?: number\r\n\r\n /**\r\n * Throw on timeout (suspense)\r\n */\r\n throwOnTimeout?: boolean\r\n\r\n /**\r\n * Component visible during the delay.\r\n * If rendering text, wrap it in a `span` to prevent error — see PR#608\r\n */\r\n delayComponent?: React.ReactNode\r\n\r\n /**\r\n * Component visible when timeout is over.\r\n * If rendering text, wrap it in a `span` to prevent error — see PR#608\r\n */\r\n timeoutComponent?: React.ReactNode\r\n\r\n /**\r\n * Component visible when delay is over.\r\n * If rendering text, wrap it in a `span` to prevent error — see PR#608\r\n */\r\n children?: React.ReactNode\r\n}\r\n\r\nexport function Delayed({\r\n delay = 300,\r\n timeout = 0,\r\n throwOnTimeout = false,\r\n delayComponent,\r\n timeoutComponent,\r\n children,\r\n}: DelayedProps) {\r\n const [visible, setVisible] = React.useState(false)\r\n const [hasTimedOut, setHasTimedOut] = React.useState(false)\r\n\r\n React.useEffect(() => {\r\n const visibilityTimeout = window.setTimeout(() => setVisible(true), delay)\r\n\r\n let failedTimeout: number\r\n if (timeout > 0) {\r\n failedTimeout = window.setTimeout(() => {\r\n setHasTimedOut(true)\r\n if (throwOnTimeout) throw new Error()\r\n }, timeout)\r\n }\r\n\r\n return () => {\r\n clearTimeout(visibilityTimeout)\r\n clearTimeout(failedTimeout)\r\n }\r\n }, [delay, timeout, throwOnTimeout])\r\n\r\n if (!visible) return <>{delayComponent}\r\n\r\n if (hasTimedOut) {\r\n return <>{timeoutComponent}\r\n }\r\n\r\n return <>{children}\r\n}\r\n","import * as Sentry from '@sentry/browser'\r\nimport { ReactNode, useEffect } from 'react'\r\nimport { FallbackProps } from 'react-error-boundary'\r\nimport { useRouteError } from 'react-router-dom'\r\n\r\nimport { link } from '../services/routing'\r\nimport { Button } from './button'\r\nimport { Heading, Paragraph } from './typography'\r\n\r\ninterface ErrorViewProps {\r\n /**\r\n * Title of the message\r\n */\r\n title?: ReactNode\r\n\r\n /**\r\n * Body text\r\n */\r\n message?: ReactNode\r\n\r\n /**\r\n * Show contact support text under the message\r\n *\r\n * @default true\r\n */\r\n showContact?: boolean\r\n\r\n /**\r\n * Show refresh page button under the text\r\n *\r\n * @default true\r\n */\r\n showRefresh?: boolean\r\n}\r\n\r\nexport function ErrorView({ title, message, showContact = true, showRefresh = true }: ErrorViewProps) {\r\n return (\r\n
\r\n {title}\r\n {message}\r\n\r\n {showContact && (\r\n \r\n Our development team has been notified of this. If the error persists, please{' '}\r\n \r\n contact support\r\n \r\n .\r\n \r\n )}\r\n\r\n {showRefresh && (\r\n \r\n Refresh page\r\n \r\n )}\r\n
\r\n )\r\n}\r\n\r\nexport function DefaultErrorBoundary({\r\n error,\r\n title = 'Application error',\r\n message = 'We’re sorry but an unknown error occured.',\r\n ...props\r\n}: Partial) {\r\n useEffect(() => {\r\n // Ignore webpack chunk loading errors\r\n if (error?.name === 'ChunkLoadError') return\r\n // Otherwise log to Sentry\r\n Sentry.captureException(error, { level: 'fatal' })\r\n // so we can see error in logs\r\n console.error('ErrorBoundary:', JSON.stringify(error))\r\n }, [error])\r\n\r\n return \r\n}\r\n\r\nexport function RouterErrorElement() {\r\n const error = useRouteError() as Error\r\n return \r\n}\r\n","import { link } from '../services/routing'\r\nimport { Delayed, DelayedProps } from './delayed'\r\nimport { ErrorView } from './error-view'\r\nimport { Spinner } from './spinner'\r\n\r\ntype LoadingProps = Pick\r\n\r\nexport function Loading({ delay, timeout, throwOnTimeout }: LoadingProps) {\r\n return (\r\n \r\n There’s been an error loading the application.\r\n
\r\n Please make sure your internet connection is stable and refresh the page. If the error persists, please{' '}\r\n \r\n contact support\r\n \r\n .\r\n \r\n }\r\n />\r\n }\r\n >\r\n \r\n \r\n )\r\n}\r\n\r\nexport function LoadingScreen(props: LoadingProps) {\r\n return (\r\n
\r\n \r\n
\r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nexport type NotificationContextType = ReturnType\r\n\r\nexport enum NotificationPosition {\r\n TopLeft,\r\n TopRight,\r\n BottomLeft,\r\n BottomRight,\r\n}\r\n\r\nexport interface NotificationOptions {\r\n position?: NotificationPosition\r\n inline?: boolean\r\n}\r\n\r\nexport const NotificationContext = React.createContext<{\r\n show: (element: JSX.Element, options?: NotificationOptions) => void\r\n hide: () => void\r\n}>({\r\n show: () => {},\r\n hide: () => {},\r\n})\r\n\r\nexport function useNotification() {\r\n return React.useContext(NotificationContext)\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { getVisualViewport, useVisualViewport } from '../../hooks/useVisualViewport'\r\nimport { NotificationContext, NotificationOptions, NotificationPosition } from './hooks'\r\n\r\ninterface NotificationState {\r\n element: JSX.Element\r\n options: Partial\r\n}\r\n\r\nexport function NotificationWrapper(props: React.PropsWithChildren) {\r\n const [isOpen, setIsOpen] = React.useState(false)\r\n const [notification, setNotification] = React.useState(null)\r\n const { viewport, setViewport } = useVisualViewport({ enabled: !!notification })\r\n\r\n const context = React.useRef({\r\n show: (element: JSX.Element, options: Partial = {}) => {\r\n setViewport(() => getVisualViewport(window.visualViewport))\r\n setNotification({ element, options })\r\n setIsOpen(true)\r\n },\r\n hide: () => setIsOpen(false),\r\n })\r\n\r\n const positionClass = React.useMemo(() => {\r\n const { position = NotificationPosition.BottomLeft } = notification?.options ?? {}\r\n return {\r\n '[--inset-t:1rem] items-start pt-inset-top': [\r\n NotificationPosition.TopLeft,\r\n NotificationPosition.TopRight,\r\n ].includes(position),\r\n '[--inset-r:1rem] justify-end landscape-secondary:pr-inset-right': [\r\n NotificationPosition.TopRight,\r\n NotificationPosition.BottomRight,\r\n ].includes(position),\r\n '[--inset-b:1rem] items-end pb-inset-bottom': [\r\n NotificationPosition.BottomLeft,\r\n NotificationPosition.BottomRight,\r\n ].includes(position),\r\n '[--inset-l:1rem] justify-start landscape-primary:pl-inset-left': [\r\n NotificationPosition.TopLeft,\r\n NotificationPosition.BottomLeft,\r\n ].includes(position),\r\n }\r\n }, [notification?.options])\r\n\r\n const WrapperComponent = React.useMemo(\r\n () => (notification?.options.inline ? React.Fragment : Ariakit.Portal),\r\n [notification?.options.inline]\r\n )\r\n\r\n return (\r\n \r\n {props.children}\r\n {isOpen && (\r\n \r\n \r\n {notification?.element}\r\n \r\n \r\n )}\r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { NotificationContextType, useNotification } from './hooks'\r\n\r\nexport function withNotificationContext(\r\n WrappedComponent: React.ComponentType\r\n) {\r\n const displayName = WrappedComponent.displayName ?? WrappedComponent.name ?? 'Component'\r\n const WithNotificationContext = (props: Omit) => {\r\n const notification = useNotification()\r\n return \r\n }\r\n\r\n WithNotificationContext.displayName = `withNotificationContext(${displayName})`\r\n\r\n return WithNotificationContext\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Button } from '../button'\r\nimport { useNotification } from './hooks'\r\n\r\ninterface NotificationProps {\r\n className?: string\r\n /**\r\n * Default button text\r\n * @default Close\r\n */\r\n closeText?: string\r\n\r\n /**\r\n * Custom buttons. Overrides `closeText`\r\n */\r\n actions?: JSX.Element\r\n\r\n /**\r\n * When set, the notification will automatically close\r\n */\r\n timeoutInMs?: number\r\n}\r\n\r\nexport function Notification({\r\n className,\r\n closeText = 'Close',\r\n actions,\r\n timeoutInMs,\r\n children,\r\n}: React.PropsWithChildren) {\r\n const notification = useNotification()\r\n\r\n React.useEffect(() => {\r\n let timeoutId: number\r\n if (timeoutInMs) {\r\n timeoutId = window.setTimeout(() => {\r\n notification.hide()\r\n }, timeoutInMs)\r\n }\r\n\r\n return () => {\r\n if (timeoutId) {\r\n clearTimeout(timeoutId)\r\n }\r\n }\r\n }, [notification, timeoutInMs])\r\n\r\n return (\r\n \r\n
{children}
\r\n
\r\n {actions ?? (\r\n \r\n )}\r\n
\r\n \r\n )\r\n}\r\n","export const CRYPTO_TICKERS = [\r\n 'BTCUSD',\r\n 'LTCUSD',\r\n 'ETHUSD',\r\n 'XRPUSD',\r\n 'BCHUSD',\r\n 'BTCEUR',\r\n 'LTCEUR',\r\n 'ETHEUR',\r\n 'XRPEUR',\r\n 'BCHEUR',\r\n 'LTCBTC',\r\n 'ETHBTC',\r\n 'XRPBTC',\r\n 'BCHBTC',\r\n]\r\n\r\n// Keep in sync with the copy in Charts repo - app/constants/common.ts\r\nexport enum TIMEFRAME {\r\n i1 = 'i1',\r\n i2 = 'i2',\r\n i3 = 'i3',\r\n i5 = 'i5',\r\n i10 = 'i10',\r\n i15 = 'i15',\r\n i30 = 'i30',\r\n h = 'h',\r\n h2 = 'h2',\r\n h4 = 'h4',\r\n d = 'd',\r\n w = 'w',\r\n m = 'm',\r\n}\r\n\r\nexport enum SpecificChartFunctionality {\r\n default = 'default',\r\n quotePage = 'quotePage',\r\n quotePerf = 'quotePerf',\r\n quoteFinancials = 'quoteFinancials',\r\n chartPage = 'chartPage',\r\n smallIndex = 'smallIndex',\r\n offScreen = 'offScreen',\r\n forexPage = 'forexPage',\r\n futuresPage = 'futuresPage',\r\n cryptoPage = 'cryptoPage',\r\n}\r\n\r\nexport enum QuoteRoutes {\r\n OptionsChain = 'oc',\r\n OptionsVolatility = 'ocv',\r\n Revenue = 'rv',\r\n Dividends = 'dv',\r\n Earnings = 'ea',\r\n Performance = 'p',\r\n ShortInterest = 'si',\r\n Traffic = 'tr',\r\n LatestFilings = 'lf',\r\n}\r\n\r\nexport const FINANCIALS_SECTION_LABELS = {\r\n [QuoteRoutes.Revenue]: 'Revenue',\r\n [QuoteRoutes.Dividends]: 'Dividends',\r\n [QuoteRoutes.Earnings]: 'Earnings',\r\n}\r\n\r\nexport const OPTIONS_SECTION_LABELS = {\r\n [QuoteRoutes.OptionsChain]: 'Prices',\r\n [QuoteRoutes.OptionsVolatility]: 'Volatility & Greeks',\r\n}\r\n\r\n// @TODO: Reuse across the app (website & charts)\r\nexport const MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\r\n","import { createContext, useContext } from 'react'\r\n\r\nexport const SETTINGS_CONTEXT_DEFAULT = {\r\n versionImages: 0,\r\n nodeChartsDomain: '',\r\n hasUserPremium: false,\r\n name: '',\r\n email: '',\r\n hasDarkTheme: false,\r\n}\r\n\r\nexport const SettingsContext = createContext(SETTINGS_CONTEXT_DEFAULT)\r\n\r\nexport function useSettings() {\r\n return useContext(SettingsContext)\r\n}\r\n","import * as React from 'react'\r\nimport { ReactNode } from 'react'\r\nimport { useLoaderData } from 'react-router-dom'\r\n\r\nexport type CachedLoaderDataContextType = ReturnType\r\n\r\nexport const CachedLoaderDataContext = React.createContext<{\r\n data: any\r\n isCached: boolean\r\n} | null>(null)\r\n\r\nexport function useCachedLoaderData() {\r\n const context = React.useContext<{ data: DataType; isCached: boolean } | null>(CachedLoaderDataContext)\r\n\r\n if (context === null) {\r\n throw new Error(\r\n 'Error! Extracting context without wrapping your component with the CachedLoaderDataContextProvider'\r\n )\r\n }\r\n\r\n return context\r\n}\r\n\r\ninterface CachedLoaderDataContextProviderProps {\r\n children: ReactNode\r\n isNullValidData?: boolean\r\n}\r\nexport function CachedLoaderDataContextProvider({\r\n children,\r\n isNullValidData = false,\r\n}: CachedLoaderDataContextProviderProps) {\r\n const loaderData = useLoaderData() as DataType\r\n const dataCacheRef = React.useRef(loaderData)\r\n\r\n const value = React.useMemo(() => {\r\n if (loaderData !== undefined && (loaderData !== null || isNullValidData)) {\r\n dataCacheRef.current = loaderData\r\n }\r\n return { data: dataCacheRef.current, isCached: !loaderData }\r\n }, [loaderData, isNullValidData])\r\n\r\n return {children}\r\n}\r\n","import throttle from 'lodash.throttle'\r\nimport * as React from 'react'\r\n\r\nexport function getVisualViewport(visualViewport: VisualViewport | null) {\r\n const width = visualViewport?.width ?? window.innerWidth\r\n const height = visualViewport?.height ?? window.innerHeight\r\n const scale = visualViewport?.scale ?? 1\r\n\r\n return {\r\n top: visualViewport?.offsetTop ?? 0,\r\n left: visualViewport?.offsetLeft ?? 0,\r\n scale: Math.round((1 / scale) * 100) / 100,\r\n width: Math.round(width * scale),\r\n height: Math.round(height * scale),\r\n unscaledWidth: width,\r\n unscaledHeight: height,\r\n }\r\n}\r\n\r\nexport function useVisualViewport({ enabled = true, onScroll = true }: { enabled?: boolean; onScroll?: boolean } = {}) {\r\n const [viewport, setViewport] = React.useState(getVisualViewport(window.visualViewport))\r\n\r\n React.useEffect(() => {\r\n if (!enabled) return\r\n\r\n const handleChange = throttle((ev: Event) => {\r\n const viewport = ev.currentTarget as VisualViewport\r\n if (viewport) {\r\n setViewport(() => getVisualViewport(viewport))\r\n }\r\n }, 50)\r\n\r\n window.visualViewport?.addEventListener('resize', handleChange)\r\n if (onScroll) window.visualViewport?.addEventListener('scroll', handleChange)\r\n handleChange({ currentTarget: window.visualViewport } as Event)\r\n\r\n return () => {\r\n window.visualViewport?.removeEventListener('resize', handleChange)\r\n window.visualViewport?.removeEventListener('scroll', handleChange)\r\n }\r\n }, [enabled, onScroll])\r\n\r\n return React.useMemo(() => ({ viewport, setViewport }), [viewport])\r\n}\r\n","import { revalidateOnQueryChange } from '../../util-routing'\r\nimport { lazyLoadComponent } from '../../util-routing'\r\n\r\nexport const portfolioModule = [\r\n {\r\n path: '/portfolio.ashx',\r\n shouldRevalidate: revalidateOnQueryChange(['pid']),\r\n loaderBundle: () => import(/* webpackChunkName: \"portfolio-view-loaders\" */ './routes/View/loaders'),\r\n Component: lazyLoadComponent({\r\n chunkName: 'portfolio-view',\r\n load: () => import(/* webpackChunkName: \"portfolio-view\" */ './routes/View/Route'),\r\n }),\r\n },\r\n {\r\n path: '/create_new_portfolio.ashx',\r\n loaderBundle: () => import(/* webpackChunkName: \"portfolio-empty-loaders\" */ './routes/EmptyView/loaders'),\r\n Component: lazyLoadComponent({\r\n chunkName: 'portfolio-empty',\r\n load: () => import(/* webpackChunkName: \"portfolio-empty\" */ './routes/EmptyView/Route'),\r\n }),\r\n },\r\n {\r\n path: '/portfolio_edit.ashx',\r\n loaderBundle: () => import(/* webpackChunkName: \"portfolio-edit-loaders\" */ './routes/BulkEdit/loaders'),\r\n Component: lazyLoadComponent({\r\n chunkName: 'portfolio-edit',\r\n load: () => import(/* webpackChunkName: \"portfolio-edit\" */ './routes/BulkEdit/Route'),\r\n }),\r\n },\r\n]\r\n","import * as React from 'react'\r\nimport { ScrollRestoration, ShouldRevalidateFunction } from 'react-router-dom'\r\n\r\nimport { shouldRevalidateOnQueryChange } from '../../util-routing'\r\nimport { LazyRouteDefinition, createRouteViewSwitch, lazyLoadComponent } from '../../util-routing'\r\nimport { QuoteQuery, QuoteSubview } from './types'\r\nimport { getQuoteSubview } from './utils'\r\n\r\nconst QuoteSharedWrapper = lazyLoadComponent({\r\n chunkName: 'quote-portal-components',\r\n load: () => import(/* webpackChunkName: \"quote-portal-components\" */ './components/QuoteSharedWrapper'),\r\n})\r\n\r\nexport function getShouldRevalidateQuoteRoute(): ShouldRevalidateFunction {\r\n return (args) => {\r\n const route = getQuoteSubview(args.currentUrl.searchParams.get('ty') as QuoteSubview)\r\n\r\n switch (route) {\r\n case QuoteSubview.OptionsChain:\r\n case QuoteSubview.OptionsVolatility:\r\n return shouldRevalidateOnQueryChange(args, ['e', 's', 'ov'])\r\n\r\n default:\r\n return false\r\n }\r\n }\r\n}\r\n\r\nconst optionsBundle = {\r\n loader: () => import(/* webpackChunkName: \"options-loaders\" */ '../options/loaders'),\r\n Component: lazyLoadComponent({\r\n chunkName: 'options',\r\n load: () => import(/* webpackChunkName: \"options\" */ '../options'),\r\n }),\r\n}\r\n\r\nconst { loader, action, ViewSwitch } = createRouteViewSwitch({\r\n defaultView: '',\r\n viewParam: QuoteQuery.Type,\r\n views: {\r\n [QuoteSubview.OptionsChain]: optionsBundle,\r\n [QuoteSubview.OptionsVolatility]: optionsBundle,\r\n [QuoteSubview.Revenue]: {\r\n Component: lazyLoadComponent({\r\n chunkName: 'revenue',\r\n load: () => import(/* webpackChunkName: \"revenue\" */ '../revenue'),\r\n }),\r\n },\r\n [QuoteSubview.Dividends]: {\r\n Component: lazyLoadComponent({\r\n chunkName: 'dividends',\r\n load: () => import(/* webpackChunkName: \"dividends\" */ '../dividends'),\r\n }),\r\n },\r\n [QuoteSubview.Eearnings]: {\r\n Component: lazyLoadComponent({\r\n chunkName: 'earnings',\r\n load: () => import(/* webpackChunkName: \"earnings\" */ '../earnings'),\r\n }),\r\n },\r\n [QuoteSubview.ShortInterest]: {\r\n Component: lazyLoadComponent({\r\n chunkName: 'short-interest',\r\n load: () => import(/* webpackChunkName: \"short-interest\" */ '../short-interest'),\r\n }),\r\n },\r\n [QuoteSubview.Traffic]: {\r\n Component: lazyLoadComponent({\r\n chunkName: 'traffic',\r\n load: () => import(/* webpackChunkName: \"traffic\" */ '../traffic'),\r\n }),\r\n },\r\n [QuoteSubview.LatestFilings]: {\r\n Component: lazyLoadComponent({\r\n chunkName: 'latest-filings',\r\n load: () => import(/* webpackChunkName: \"latest-filings\" */ '../latest-filings'),\r\n }),\r\n },\r\n },\r\n})\r\n\r\nexport const quoteModule: LazyRouteDefinition[] = [\r\n {\r\n path: '/quote.ashx',\r\n loader,\r\n action,\r\n shouldRevalidate: getShouldRevalidateQuoteRoute(),\r\n Component: function QuoteRoot() {\r\n React.useEffect(() => {\r\n if (FinvizSettings.hasUserPremium || FinvizSettings.hasRedesignEnabled) {\r\n import(/* webpackChunkName: \"recent_quotes\" */ '../../../app/shared/recent_quotes')\r\n .then(({ RenderRecentQuotes }) => {\r\n RenderRecentQuotes()\r\n })\r\n .catch()\r\n }\r\n }, [])\r\n\r\n return (\r\n <>\r\n {/* Intentionally do not trigger upper router loading boundary, these components use portals */}\r\n \r\n \r\n \r\n\r\n \r\n\r\n {/**\r\n * We precompute the element height on the backend so that the content under\r\n * options doesn’t jump when options render, so we can put restore scroll here.\r\n */}\r\n \r\n \r\n )\r\n },\r\n },\r\n]\r\n","import '../app/shared/sentry/init'\r\n\r\nimport { Suspense } from 'react'\r\nimport * as ReactDOM from 'react-dom/client'\r\nimport { Outlet, RouterProvider, createBrowserRouter } from 'react-router-dom'\r\n\r\nimport '../../styles/charts.css'\r\nimport '../../styles/modal.css'\r\nimport '../../styles/tailwind.css'\r\nimport '../../styles/timeframe-bar.css'\r\nimport { RouterErrorElement } from './components/error-view'\r\nimport { LoadingScreen } from './components/loading'\r\nimport { NotificationWrapper } from './components/notification'\r\nimport { SettingsContext } from './context'\r\nimport { portfolioModule } from './modules/portfolio'\r\nimport { quoteModule } from './modules/quote'\r\nimport { lazyLoadComponent } from './util-routing'\r\nimport { defineLazyRoutes } from './util-routing'\r\n\r\nconst router = createBrowserRouter([\r\n {\r\n path: '/',\r\n element: (\r\n }>\r\n \r\n \r\n \r\n \r\n \r\n \r\n ),\r\n ErrorBoundary: RouterErrorElement,\r\n children: defineLazyRoutes([\r\n ...portfolioModule,\r\n ...quoteModule,\r\n {\r\n path: '/charts',\r\n Component: lazyLoadComponent({\r\n chunkName: 'charts',\r\n load: () => import(/* webpackChunkName: \"charts\" */ './modules/charts'),\r\n }),\r\n },\r\n {\r\n path: '/save_to_portfolio.ashx',\r\n Component: lazyLoadComponent({\r\n chunkName: 'save-to-portfolio',\r\n load: () => import(/* webpackChunkName: \"save-to-portfolio\" */ './modules/save-to-portfolio/Route'),\r\n }),\r\n },\r\n {\r\n path: '/create_alert.ashx',\r\n Component: lazyLoadComponent({\r\n chunkName: 'create-alert',\r\n load: () => import(/* webpackChunkName: \"create-alert\" */ './modules/create-alert/Route'),\r\n }),\r\n },\r\n ]),\r\n },\r\n])\r\n\r\nconst rootEl = document.getElementById('root')\r\nconst root = ReactDOM.createRoot(rootEl!)\r\n\r\nroot.render()\r\n","// Do not import any file here. It might end up in the main bundle\r\n\r\nexport enum QuoteQuery {\r\n Ticker = 't',\r\n Type = 'ty',\r\n Period = 'p',\r\n DateRange = 'r',\r\n}\r\n\r\n// Keep in sync with FullViewUrlQuery.cs\r\nexport enum QuoteView {\r\n // Default subviews for views\r\n ChartDetail = 'c',\r\n Financials = 'dv',\r\n Options = 'oc',\r\n}\r\n\r\n// Keep in sync with FullViewUrlQuery.cs\r\nexport enum QuoteSubview {\r\n ComparePerf = 'p',\r\n OptionsChain = 'oc',\r\n OptionsVolatility = 'ocv',\r\n Dividends = 'dv',\r\n Eearnings = 'ea',\r\n Revenue = 'rv',\r\n ShortInterest = 'si',\r\n Traffic = 'tr',\r\n LatestFilings = 'lf',\r\n}\r\n","// Do not import any other file here, it might end up in the main bundle\r\nimport { QuoteSubview, QuoteView } from './types'\r\n\r\n// Keep in sync with FullViewUrlQuery.cs\r\nexport function getQuoteSubview(type: QuoteSubview | QuoteView) {\r\n return Object.values(QuoteSubview).find((value) => value === type) ?? null\r\n}\r\n\r\n// Keep in sync with FullViewUrlQuery.cs\r\nexport function getQuoteView(type: QuoteView | QuoteSubview) {\r\n switch (getQuoteSubview(type)) {\r\n case QuoteSubview.Dividends:\r\n case QuoteSubview.Eearnings:\r\n case QuoteSubview.Revenue:\r\n return QuoteView.Financials\r\n case QuoteSubview.OptionsChain:\r\n case QuoteSubview.OptionsVolatility:\r\n return QuoteView.Options\r\n case null:\r\n return QuoteView.ChartDetail // No subview is active == chart detail\r\n default:\r\n return null // Eg. Short interest doesn’t belong to any parent group\r\n }\r\n}\r\n","import * as pathToRegexp from 'path-to-regexp'\r\n\r\nimport { cleanTicker } from '../util'\r\n\r\n/**\r\n * Compile route path by applying parameters to it\r\n *\r\n * @example\r\n * // Outputs /route/1?query=foo\r\n * compilePath('/route/:id?query=:query', { id: 1, query: 'foo' })\r\n */\r\nfunction compilePath(\r\n path: string,\r\n params?: pathToRegexp.ParamData,\r\n options?: pathToRegexp.ParseOptions & pathToRegexp.CompileOptions\r\n) {\r\n return pathToRegexp.compile(path, options)(params)\r\n}\r\n\r\nexport const path = {\r\n home: '/',\r\n news: '/news.ashx',\r\n screener: '/screener.ashx',\r\n charts: '/charts',\r\n groups: '/groups.ashx',\r\n portfolio: '/portfolio.ashx',\r\n insider: '/insidertrading.ashx',\r\n elite: '/elite.ashx',\r\n search: '/search.ashx\\\\?p=:ticker',\r\n quote: '/quote.ashx\\\\?t=:ticker',\r\n contact: '/contact.ashx',\r\n\r\n alerts: '/alerts.ashx',\r\n help: '/help/screener.ashx',\r\n account: '/myaccount.ashx',\r\n login: '/login.ashx',\r\n logout: '/logout.ashx',\r\n\r\n // Maps\r\n maps: '/map.ashx',\r\n bubbles: '/bubbles.ashx',\r\n\r\n // Futures\r\n futures: '/futures.ashx',\r\n futuresPerf: '/futures_performance.ashx',\r\n futuresCharts: '/futures_charts.ashx',\r\n futuresChartDetail: '/futures_charts.ashx\\\\?t=:ticker',\r\n\r\n // Forex\r\n forex: '/forex.ashx',\r\n forexPerf: '/forex_performance.ashx',\r\n forexCharts: '/forex_charts.ashx',\r\n forexChartDetail: '/forex_charts.ashx\\\\?t=:ticker',\r\n\r\n // Crypto\r\n crypto: '/crypto.ashx',\r\n cryptoPerf: '/crypto_performance.ashx',\r\n cryptoCharts: '/crypto_charts.ashx',\r\n cryptoChartDetail: '/crypto_charts.ashx\\\\?t=:ticker',\r\n\r\n // Backtsest\r\n backtests: '/backtests.ashx',\r\n backtestCreate: '/backtest_create.ashx',\r\n backtestDetail: '/backtest_detail.ashx\\\\?id=:backtestId',\r\n backtestPresets: 'backtests.ashx\\\\?presets=1',\r\n}\r\n\r\nexport const link = {\r\n toHome: () => path.home,\r\n toNews: () => path.news,\r\n toScreener: () => path.screener,\r\n toCharts: () => path.charts,\r\n toGroups: () => path.groups,\r\n toPortfolio: () => path.portfolio,\r\n toInsider: () => path.insider,\r\n toElite: () => path.elite,\r\n toSearch: (ticker: string) => compilePath(path.search, { ticker }),\r\n toQuote: (ticker: string) => compilePath(path.quote, { ticker }),\r\n toContact: () => path.contact,\r\n\r\n toAlerts: () => path.alerts,\r\n toHelp: () => path.help,\r\n toAccount: () => path.account,\r\n toLogin: () => path.login,\r\n toLogout: () => path.logout,\r\n\r\n toMaps: () => path.maps,\r\n toBubbles: () => path.bubbles,\r\n\r\n toFutures: () => path.futures,\r\n toFuturesPerf: () => path.futuresPerf,\r\n toFuturesCharts: () => path.futuresCharts,\r\n toFuturesChartDetail: (ticker: string) => compilePath(path.futuresChartDetail, { ticker: cleanTicker(ticker) }),\r\n\r\n toForex: () => path.forex,\r\n toForexPerf: () => path.forexPerf,\r\n toForexCharts: () => path.forexCharts,\r\n toForexChartDetail: (ticker: string) => compilePath(path.forexChartDetail, { ticker: cleanTicker(ticker) }),\r\n\r\n toCrypto: () => path.crypto,\r\n toCryptoPerf: () => path.cryptoPerf,\r\n toCryptoCharts: () => path.cryptoCharts,\r\n toCryptoChartDetail: (ticker: string) => compilePath(path.cryptoChartDetail, { ticker: cleanTicker(ticker) }),\r\n\r\n toBacktests: () => path.backtests,\r\n toBacktestCreate: () => path.backtestCreate,\r\n toBacktestDetail: (backtestId: string | number) =>\r\n compilePath(path.backtestDetail, { backtestId: String(backtestId) }),\r\n toBacktestPresets: () => path.backtestPresets,\r\n}\r\n","export enum Instrument {\r\n Stock = 'stock',\r\n Forex = 'forex',\r\n Crypto = 'crypto',\r\n Futures = 'futures',\r\n MarketSentiment = 'market_sentiment',\r\n Group = 'group',\r\n}\r\n\r\nexport type RecordType = Record\r\n\r\nexport type PartialBy = Omit & Partial>\r\n\r\nexport type NullableNumbers = { [K in keyof Obj]: Obj[K] extends number ? number | null : Obj[K] }\r\n\r\nexport enum DateRangeType {\r\n d1 = 'd1',\r\n d5 = 'd5',\r\n m1 = 'm1',\r\n m3 = 'm3',\r\n m6 = 'm6',\r\n ytd = 'ytd',\r\n y1 = 'y1',\r\n y2 = 'y2',\r\n y5 = 'y5',\r\n max = 'max',\r\n}\r\n\r\nexport type SortableValue = string | null | number | Date\r\nexport enum SortDirection {\r\n Ascending = 1,\r\n Descending = -1,\r\n}\r\n\r\nexport enum FeatureFlag {\r\n RedesignedPages = 'redesign',\r\n PortfolioRedesign = 'redesignpfo',\r\n OptionsGreeks = 'greeks',\r\n TrafficPage = 'trafficPage',\r\n ScreenerAddFilter = 'screeneraddfilter',\r\n}\r\n","import React, { ComponentType, LazyExoticComponent, lazy } from 'react'\r\nimport {\r\n ActionFunction,\r\n ActionFunctionArgs,\r\n LoaderFunction,\r\n LoaderFunctionArgs,\r\n type RouteObject,\r\n type ShouldRevalidateFunction,\r\n type ShouldRevalidateFunctionArgs,\r\n useSearchParams,\r\n} from 'react-router-dom'\r\n\r\nimport { parseInitData } from '../app/shared/utils'\r\nimport { CachedLoaderDataContextProvider } from './hooks/useCachedLoaderData'\r\n\r\n/**\r\n * This fn creates a revalidator rule which always revalidates loader when the\r\n * specified keys change but ignores changes to other keys. It also allows\r\n * `revalidator.revalidate` to work even if the query didn’t\r\n */\r\n\r\nexport function revalidateOnQueryChange(keys: string[]): ShouldRevalidateFunction {\r\n return (args) => {\r\n const prevParams = args.currentUrl.searchParams\r\n const nextParams = args.nextUrl.searchParams\r\n const requiredChanged = keys.some((key) => prevParams.get(key) !== nextParams.get(key))\r\n const otherChanged = [...prevParams.keys(), ...nextParams.keys()].some(\r\n (key, index, arr) =>\r\n // Get unique keys\r\n !keys.includes(key) &&\r\n arr.indexOf(key) === index &&\r\n // Check changed keys\r\n prevParams.get(key) !== nextParams.get(key)\r\n )\r\n\r\n if (!requiredChanged && otherChanged) {\r\n return false\r\n }\r\n\r\n return args.defaultShouldRevalidate\r\n }\r\n}\r\n\r\n/**\r\n * This fn does the same as `revalidateOnQueryChange`\r\n * except you need to provide `ShouldRevalidateFunctionArgs` manually\r\n */\r\n\r\nexport function shouldRevalidateOnQueryChange(args: ShouldRevalidateFunctionArgs, keys: string[]) {\r\n return revalidateOnQueryChange(keys)(args)\r\n}\r\n\r\nexport function parseRouteInitData({\r\n elementId = 'route-init-data',\r\n fallback = null,\r\n removeElement = true,\r\n}: { elementId?: string; fallback?: DataType | null; removeElement?: boolean } = {}): DataType | null {\r\n const element = document.getElementById(elementId)\r\n let initialData = fallback\r\n\r\n if (!element) return fallback\r\n\r\n try {\r\n const parsedData = parseInitData(elementId)\r\n if (removeElement) element.remove()\r\n\r\n if (parsedData) initialData = parsedData\r\n } catch {\r\n initialData = fallback\r\n }\r\n\r\n return initialData\r\n}\r\n\r\n/**\r\n * Function which wraps React.lazy and checks whether a chunk is preloaded\r\n * from async-manifest. If yes, kick in the promise resolve early so we can\r\n * instantly render the component\r\n */\r\nexport function lazyLoadComponent({\r\n chunkName,\r\n load,\r\n}: {\r\n chunkName: string\r\n load: () => Promise<{ default: ComponentType }>\r\n}): LazyExoticComponent> {\r\n // Resolve earlier if prefetch element is present\r\n const hasPreloadElement = document.querySelector(`[data-chunk-id=${chunkName}]`)\r\n\r\n if (hasPreloadElement) {\r\n const componentLoader = load()\r\n\r\n return lazy(() => componentLoader)\r\n }\r\n\r\n return lazy(load)\r\n}\r\n\r\nexport type LazyRouteDefinition = Omit & {\r\n loaderBundle?: () => Promise<{ loader?: LoaderFunction; action?: ActionFunction }>\r\n Component?: ReturnType | (() => JSX.Element)\r\n}\r\n\r\n/**\r\n * Transforms top level async routes and their loaders to react router route definitions.\r\n * - `loaderBundle` must return promise module with exports `{ loader?, action? }`\r\n * - `Component` can be a react component or `lazyLoadComponent`.\r\n *\r\n * If `loaderBundle` and `Component` is set, the component is automatically wrapped in\r\n * ``\r\n *\r\n * Do not use this for query param routes\r\n */\r\nexport function defineLazyRoutes(routes: LazyRouteDefinition[]): RouteObject[] {\r\n return routes.map(({ loaderBundle, Component, ...props }) => {\r\n const loader =\r\n props.loader ??\r\n (loaderBundle ? (args: LoaderFunctionArgs) => loaderBundle().then((mod) => mod.loader?.(args)) : undefined)\r\n\r\n const action =\r\n props.action ??\r\n (loaderBundle ? (args: ActionFunctionArgs) => loaderBundle().then((mod) => mod.action?.(args)) : undefined)\r\n\r\n return {\r\n ...props,\r\n loader,\r\n action,\r\n lazy: async () => ({\r\n // We’re rewriting Component if we have a loader\r\n Component: loader && Component ? undefined : Component,\r\n // Wrap each route in its own provider so they don’t share loader cache\r\n element:\r\n loader && Component ? (\r\n \r\n \r\n \r\n ) : undefined,\r\n }),\r\n children: defineLazyRoutes((props.children as any) ?? []),\r\n } as RouteObject\r\n })\r\n}\r\n\r\n/**\r\n * Argument to `createModuleViewSwitch` when manually specifying the route\r\n */\r\ntype ObjectRoute = {\r\n useDefaultLoader?: boolean\r\n Component: ReturnType\r\n loader?: () => Promise<{ loader: LoaderFunction }>\r\n action?: () => Promise<{ action: ActionFunction }>\r\n}\r\n\r\n/**\r\n * A very thin and naive abstraction over react router which allows routing\r\n * by (single) query params\r\n */\r\nexport function createRouteViewSwitch(options: {\r\n viewParam: ViewParamType\r\n defaultView: ViewType | null\r\n views: Record\r\n}) {\r\n /**\r\n * Load the module (should probably be replaced with our async utils code or\r\n * react query so we get retry). Needs to stay `async`, so we can await in\r\n * action/loader switch even if the module is of `ObjectModule` type\r\n */\r\n function getModuleFromURL(search: URLSearchParams): ObjectRoute | null {\r\n const viewQueryParam = (search.get(options.viewParam) as ViewType) ?? options.defaultView\r\n return options.views[viewQueryParam]\r\n }\r\n\r\n function action(args: ActionFunctionArgs): ReturnType {\r\n const url = new URL(args.request.url)\r\n const route = getModuleFromURL(url.searchParams)\r\n if (!route?.action) return null\r\n return route.action().then((actionModule) => actionModule.action(args))\r\n }\r\n\r\n function loader(args: LoaderFunctionArgs): ReturnType {\r\n const url = new URL(args.request.url)\r\n const route = getModuleFromURL(url.searchParams)\r\n\r\n // Use default loader if none is defined\r\n if (!route?.loader) return parseRouteInitData()\r\n\r\n return route.loader().then((loaderModule) => loaderModule.loader(args))\r\n }\r\n\r\n // Handle the actual view switching\r\n function ViewSwitch() {\r\n const [searchParams] = useSearchParams()\r\n const Component = getModuleFromURL(searchParams)?.Component\r\n\r\n return {Component && }\r\n }\r\n\r\n return {\r\n defaultView: options.defaultView,\r\n action,\r\n loader,\r\n ViewSwitch,\r\n }\r\n}\r\n","import isPlainObject from 'lodash.isplainobject'\r\n\r\nimport { getCookie } from '../app/shared/cookie'\r\nimport { CRYPTO_TICKERS } from './constants'\r\nimport { FeatureFlag, Instrument, SortDirection, SortableValue } from './types'\r\nimport { RecordType } from './types'\r\n\r\nconst isObject = (value: any): value is RecordType => isPlainObject(value)\r\n\r\n/**\r\n * Parse text as JSON\r\n */\r\nexport function parseAsJSON(value: unknown | Shape): Shape | undefined {\r\n if (isObject(value)) {\r\n return value as Shape\r\n }\r\n\r\n let parsedValue\r\n try {\r\n if (typeof value === 'string') {\r\n parsedValue = JSON.parse(value)\r\n }\r\n } catch {\r\n return\r\n }\r\n return parsedValue\r\n}\r\n\r\n/**\r\n * remove @ symbol from a ticker\r\n */\r\nexport function cleanTicker(ticker: string) {\r\n return ticker.startsWith('@') ? ticker.substring(1) : ticker\r\n}\r\n\r\n/**\r\n * Get instrument for a ticker.\r\n *\r\n * - If ticker doesn’t start with `@` - stock\r\n * - Otherwise\r\n * - one of `CRYPTO_TICKERS` - crypto\r\n * - has length of 6 - forex\r\n * - none of above - future\r\n *\r\n * NOTE: counterpart in charts 'charts/app/utils/chart.js'\r\n */\r\n\r\nexport function getInstrumentForTicker(ticker: string): Instrument {\r\n if (!ticker?.startsWith('@')) return Instrument.Stock\r\n\r\n const cleanedTicker = cleanTicker(ticker)\r\n\r\n if (CRYPTO_TICKERS.includes(cleanedTicker.toUpperCase())) return Instrument.Crypto\r\n if (cleanedTicker.length === 6) return Instrument.Forex\r\n\r\n return Instrument.Futures\r\n}\r\n\r\n/**\r\n * Async load Resize observer polyfill when we need it\r\n */\r\nlet resizeObserverPolyfill: typeof window.ResizeObserver\r\nexport async function loadResizeObserverPolyfill() {\r\n if (typeof window.ResizeObserver === 'undefined') {\r\n const polyfill = await import('resize-observer-polyfill')\r\n resizeObserverPolyfill = polyfill.default\r\n window.ResizeObserver = resizeObserverPolyfill\r\n return resizeObserverPolyfill as typeof window.ResizeObserver\r\n }\r\n}\r\n\r\nexport async function getIsBrave() {\r\n return (navigator.brave && (await navigator.brave.isBrave())) || false\r\n}\r\n\r\nexport function deserializeFeatureFlags(): Partial> | undefined {\r\n try {\r\n const cookie = decodeURIComponent(getCookie('featureFlags'))\r\n const flags = cookie.split('_').map((value) => {\r\n const [key, val] = value.split(':')\r\n return [key, val === '1']\r\n })\r\n\r\n return Object.fromEntries(flags)\r\n } catch {\r\n return\r\n }\r\n}\r\n\r\nexport function serializeFeatureFlags(flags: Partial>) {\r\n return Object.entries(flags)\r\n .map(([key, val]) => `${key}:${Number(val)}`)\r\n .join('_')\r\n}\r\n\r\nexport enum ChildPosition {\r\n topLeft,\r\n topRight,\r\n bottomLeft,\r\n bottomRight,\r\n center,\r\n topCenter,\r\n rightCenter,\r\n bottomCenter,\r\n leftCenter,\r\n}\r\n\r\nexport function getFlexAlignClasses(position: ChildPosition) {\r\n return {\r\n 'justify-start': [ChildPosition.topLeft, ChildPosition.bottomLeft, ChildPosition.leftCenter].includes(position),\r\n 'justify-center': [ChildPosition.center, ChildPosition.topCenter, ChildPosition.bottomCenter].includes(position),\r\n 'justify-end': [ChildPosition.topRight, ChildPosition.bottomRight, ChildPosition.rightCenter].includes(position),\r\n 'items-start': [ChildPosition.topLeft, ChildPosition.topRight, ChildPosition.topCenter].includes(position),\r\n 'items-center': [ChildPosition.center, ChildPosition.rightCenter, ChildPosition.leftCenter].includes(position),\r\n 'items-end': [ChildPosition.bottomLeft, ChildPosition.bottomRight, ChildPosition.bottomCenter].includes(position),\r\n }\r\n}\r\n\r\ninterface NumberFormatOptions {\r\n fractions: number\r\n multiply: number\r\n showPlusSign: boolean\r\n defaultValue: string\r\n}\r\n\r\nconst intlCache: { [key: number]: Intl.NumberFormat } = {}\r\nfunction getIntl(fractions: number) {\r\n if (!intlCache[fractions])\r\n intlCache[fractions] = new Intl.NumberFormat('en-US', {\r\n minimumFractionDigits: fractions,\r\n maximumFractionDigits: fractions,\r\n })\r\n return intlCache[fractions]\r\n}\r\n\r\nexport function shortFormatNumber(\r\n value: number | null | undefined,\r\n { fractions = 2, showPlusSign = false, defaultValue = '-', multiply = 1 }: Partial = {}\r\n) {\r\n let num = value\r\n if (num === undefined || num === null || !Number.isFinite(num)) return defaultValue\r\n\r\n num *= multiply\r\n\r\n let suffix = ''\r\n const absValue = Math.abs(num)\r\n if (absValue >= 1e9) {\r\n num /= 1e9\r\n suffix = 'B'\r\n } else if (absValue >= 1e6) {\r\n num /= 1e6\r\n suffix = 'M'\r\n } else if (absValue >= 1000) {\r\n num /= 1000\r\n suffix = 'K'\r\n }\r\n\r\n const formatted = getIntl(fractions).format(num)\r\n\r\n return (showPlusSign && num > 0 ? '+' : '') + formatted + suffix\r\n}\r\n\r\nexport function formatNumber(\r\n value: number | null | undefined,\r\n { fractions = 2, showPlusSign = false, defaultValue = '-' }: Partial = {}\r\n) {\r\n if (value === undefined || value === null) return defaultValue\r\n\r\n const fixedValue = value.toFixed(fractions)\r\n const prefix = showPlusSign && value > 0 ? '+' : ''\r\n\r\n if (parseFloat(fixedValue) === 0 && value !== 0) {\r\n return {prefix + fixedValue}\r\n }\r\n\r\n const formatted = getIntl(fractions).format(value)\r\n\r\n return prefix + formatted\r\n}\r\n\r\nexport interface SortByColumnOptions {\r\n /**\r\n * Change order of `null` values.\r\n * - `false` Force sort null as first (asc) and last (desc)\r\n * - `true` Always sort null as last regardless of order\r\n * @default false\r\n */\r\n sortNullAsLast?: boolean\r\n\r\n /**\r\n * When true, null values will not be treated as special values\r\n * @default false\r\n */\r\n ignoreNullForComparison?: boolean\r\n}\r\n\r\nexport function sortByColumn(\r\n options: SortByColumnOptions & {\r\n a: SortableValue\r\n b: SortableValue\r\n direction: SortDirection\r\n }\r\n) {\r\n if (options.a === options.b) return 0\r\n\r\n // Compare as strings\r\n if (typeof options.a === 'string' && typeof options.b === 'string')\r\n return options.a.localeCompare(options.b) * options.direction\r\n\r\n // Always sort null last if enabled\r\n if (options.sortNullAsLast && options.a === null) return Infinity\r\n if (options.sortNullAsLast && options.b === null) return -Infinity\r\n\r\n // Sort null first/last depending on direction\r\n if (!options.ignoreNullForComparison && options.a === null) return -options.direction\r\n if (!options.ignoreNullForComparison && options.b === null) return options.direction\r\n\r\n // Compare as numbers\r\n return (Number(options.a) - Number(options.b)) * options.direction\r\n}\r\n\r\nexport function moveItemInArray(arr: ItemType[], sourceIndex: number, destinationIndex: number) {\r\n // make sure sourceIndex and destinationIndex are inside of arr\r\n const from = Math.max(0, Math.min(sourceIndex, arr.length - 1))\r\n const to = Math.min(arr.length - 1, Math.max(destinationIndex, 0))\r\n\r\n const items = [...arr]\r\n const [removed] = items.splice(from, 1)\r\n items.splice(to, 0, removed)\r\n\r\n return items\r\n}\r\n\r\nexport function randomUUID() {\r\n return `${1e7}-${1e3}-${4e3}-${8e3}-${1e11}`.replace(/[018]/g, (substring) => {\r\n const c = Number(substring)\r\n return (c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16)\r\n })\r\n}\r\n\r\nexport function getUuid() {\r\n return window.crypto?.randomUUID?.() ?? randomUUID()\r\n}\r\n\r\n/**\r\n * Used as a callback to autoFocusOnShow/autoFocusOnHide to make sure the page\r\n * doesn’t jump when focusing the element\r\n */\r\nexport function focusWithoutScroll(element: HTMLElement | null) {\r\n requestAnimationFrame(() => {\r\n element?.focus({ preventScroll: element.ariaHasPopup !== null })\r\n })\r\n\r\n return !element\r\n}\r\n\r\nexport function blurWithoutScroll(element: HTMLElement | null) {\r\n element?.focus({ preventScroll: true })\r\n\r\n return !element\r\n}\r\n\r\n/**\r\n * Can be used as a callback for events if you just need to prevent the default action\r\n */\r\nexport function preventDefault(ev: React.MouseEvent) {\r\n ev.preventDefault()\r\n}\r\n\r\nexport function getNavigationLinkUrl(\r\n url: URL,\r\n preservedKeys?: string[],\r\n removeQueryKeys?: string[],\r\n additionalQueryValues: Record = {}\r\n) {\r\n const newUrl = new URL(url)\r\n\r\n if (preservedKeys?.length) {\r\n for (const key of newUrl.searchParams.keys()) {\r\n if (!preservedKeys.includes(key)) newUrl.searchParams.delete(key)\r\n }\r\n }\r\n\r\n removeQueryKeys?.forEach((key) => {\r\n newUrl.searchParams.delete(key)\r\n })\r\n\r\n Object.entries(additionalQueryValues).forEach(([key, value]) => {\r\n newUrl.searchParams.set(key, value as string)\r\n })\r\n\r\n return newUrl\r\n}\r\n\r\nexport function getElitePageLink(campaign?: string) {\r\n const url = '/elite.ashx'\r\n const query = new URLSearchParams('utm_source=finviz&utm_medium=banner')\r\n\r\n if (campaign) {\r\n query.set('utm_campaign', campaign)\r\n\r\n return `${url}?${query.toString()}`\r\n }\r\n\r\n return url\r\n}\r\n","\"use client\";\nimport {\n useButton\n} from \"./JJ3MV4KB.js\";\nimport {\n useDialogScopedContext\n} from \"./XXVAHUAO.js\";\nimport {\n createElement,\n createHook,\n forwardRef\n} from \"./5M6RSQEC.js\";\nimport {\n useEvent\n} from \"./6O5OEQGF.js\";\nimport {\n __objRest,\n __spreadProps,\n __spreadValues\n} from \"./4R3V3JGP.js\";\n\n// src/dialog/dialog-dismiss.tsx\nimport { useMemo } from \"react\";\nimport { jsx, jsxs } from \"react/jsx-runtime\";\nvar TagName = \"button\";\nvar useDialogDismiss = createHook(\n function useDialogDismiss2(_a) {\n var _b = _a, { store } = _b, props = __objRest(_b, [\"store\"]);\n const context = useDialogScopedContext();\n store = store || context;\n const onClickProp = props.onClick;\n const onClick = useEvent((event) => {\n onClickProp == null ? void 0 : onClickProp(event);\n if (event.defaultPrevented)\n return;\n store == null ? void 0 : store.hide();\n });\n const children = useMemo(\n () => /* @__PURE__ */ jsxs(\n \"svg\",\n {\n \"aria-label\": \"Dismiss popup\",\n display: \"block\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n strokeWidth: \"1.5pt\",\n viewBox: \"0 0 16 16\",\n height: \"1em\",\n width: \"1em\",\n children: [\n /* @__PURE__ */ jsx(\"line\", { x1: \"4\", y1: \"4\", x2: \"12\", y2: \"12\" }),\n /* @__PURE__ */ jsx(\"line\", { x1: \"4\", y1: \"12\", x2: \"12\", y2: \"4\" })\n ]\n }\n ),\n []\n );\n props = __spreadProps(__spreadValues({\n \"data-dialog-dismiss\": \"\",\n children\n }, props), {\n onClick\n });\n props = useButton(props);\n return props;\n }\n);\nvar DialogDismiss = forwardRef(function DialogDismiss2(props) {\n const htmlProps = useDialogDismiss(props);\n return createElement(TagName, htmlProps);\n});\n\nexport {\n useDialogDismiss,\n DialogDismiss\n};\n","\"use client\";\nimport {\n useCommand\n} from \"./KSZPJCUA.js\";\nimport {\n createElement,\n createHook,\n forwardRef\n} from \"./5M6RSQEC.js\";\nimport {\n useMergeRefs,\n useTagName\n} from \"./6O5OEQGF.js\";\nimport {\n __spreadProps,\n __spreadValues\n} from \"./4R3V3JGP.js\";\n\n// src/button/button.ts\nimport { useEffect, useRef, useState } from \"react\";\nimport { isButton } from \"@ariakit/core/utils/dom\";\nvar TagName = \"button\";\nvar useButton = createHook(\n function useButton2(props) {\n const ref = useRef(null);\n const tagName = useTagName(ref, TagName);\n const [isNativeButton, setIsNativeButton] = useState(\n () => !!tagName && isButton({ tagName, type: props.type })\n );\n useEffect(() => {\n if (!ref.current)\n return;\n setIsNativeButton(isButton(ref.current));\n }, []);\n props = __spreadProps(__spreadValues({\n role: !isNativeButton && tagName !== \"a\" ? \"button\" : void 0\n }, props), {\n ref: useMergeRefs(ref, props.ref)\n });\n props = useCommand(props);\n return props;\n }\n);\nvar Button = forwardRef(function Button2(props) {\n const htmlProps = useButton(props);\n return createElement(TagName, htmlProps);\n});\n\nexport {\n useButton,\n Button\n};\n"],"names":["decodeQueryString","vars","arguments","length","undefined","window","location","search","substring","split","obj","forEach","pair","delimiterPos","indexOf","key","decodeURIComponent","value","encodeQueryString","values","whitelistedValues","Object","keys","reduce","prev","includes","encodeURIComponent","getParsedCookies","cookieName","parseCookies","document","cookie","map","cookieString","acc","v","trim","getCookie","name","re","RegExp","replace","setCookie","expires","toUTCString","test","hostname","sentryOptions","dsn","allowUrls","release","FinvizSentrySettings","sendDefaultPii","integrations","dedupeIntegration","extraErrorDataIntegration","httpClientIntegration","failedRequestTargets","thirdPartyErrorFilterIntegration","filterKeys","behaviour","ignoreErrors","ignoreStack","Sentry","beforeSend","event","hint","_event$exception$valu","_event$exception","_event$contexts$respo","_event$contexts","error","originalException","errorFrames","exception","stacktrace","frames","statusCode","ThrowableError","status","contexts","response","status_code","level","some","ignorePattern","ignoreSource","ignoreMessage","Array","isArray","isIgnoredScript","frame","_frame$filename","filename","isIgnoredMessage","message","match","id","String","_window$FinvizSetting","_window$FinvizSetting2","dpr","devicePixelRatio","redesign","FinvizSettings","hasRedesignEnabled","dark","hasDarkTheme","innerWidth","innerHeight","captureException","captureMessage","withScope","formatDateToStringUS","date","toLocaleDateString","day","month","year","parseInitData","elementId","initDataElement","getElementById","JSON","parse","textContent","e","getSidebarFromCookie","chartsUrl","decodedCookie","sidebar","Delayed","_ref","delay","timeout","throwOnTimeout","delayComponent","timeoutComponent","children","visible","setVisible","React","hasTimedOut","setHasTimedOut","visibilityTimeout","setTimeout","failedTimeout","Error","clearTimeout","_jsx","_Fragment","ErrorView","title","showContact","showRefresh","_jsxs","className","Heading","Paragraph","href","link","toContact","Button","as","origin","pathname","DefaultErrorBoundary","_ref2","props","useEffect","console","stringify","RouterErrorElement","useRouteError","Loading","Spinner","LoadingScreen","NotificationPosition","NotificationContext","show","hide","useNotification","NotificationWrapper","isOpen","setIsOpen","notification","setNotification","viewport","setViewport","useVisualViewport","enabled","context","element","options","getVisualViewport","visualViewport","positionClass","_notification$options","position","BottomLeft","TopLeft","TopRight","BottomRight","WrapperComponent","inline","Ariakit","Provider","current","role","classnames","unmountOnHide","open","onClose","modal","backdrop","focusable","hideOnEscape","hideOnInteractOutside","autoFocusOnShow","autoFocusOnHide","style","width","height","transform","left","top","scale","willChange","withNotificationContext","WrappedComponent","_WrappedComponent$dis","displayName","WithNotificationContext","notificationContext","Notification","closeText","actions","timeoutInMs","timeoutId","theme","CRYPTO_TICKERS","TIMEFRAME","SpecificChartFunctionality","QuoteRoutes","FINANCIALS_SECTION_LABELS","Revenue","Dividends","Earnings","OPTIONS_SECTION_LABELS","OptionsChain","OptionsVolatility","MONTHS","SETTINGS_CONTEXT_DEFAULT","versionImages","nodeChartsDomain","hasUserPremium","email","SettingsContext","createContext","useSettings","useContext","CachedLoaderDataContext","useCachedLoaderData","CachedLoaderDataContextProvider","isNullValidData","loaderData","useLoaderData","dataCacheRef","data","isCached","_visualViewport$width","_visualViewport$heigh","_visualViewport$scale","_visualViewport$offse","_visualViewport$offse2","offsetTop","offsetLeft","Math","round","unscaledWidth","unscaledHeight","onScroll","_window$visualViewpor","_window$visualViewpor2","handleChange","throttle","ev","currentTarget","addEventListener","_window$visualViewpor3","_window$visualViewpor4","removeEventListener","portfolioModule","path","shouldRevalidate","revalidateOnQueryChange","loaderBundle","Component","lazyLoadComponent","chunkName","load","QuoteSharedWrapper","optionsBundle","loader","action","ViewSwitch","createRouteViewSwitch","defaultView","viewParam","QuoteQuery","Type","views","QuoteSubview","Eearnings","ShortInterest","Traffic","LatestFilings","quoteModule","args","getQuoteSubview","currentUrl","searchParams","get","shouldRevalidateOnQueryChange","then","RenderRecentQuotes","catch","fallback","ScrollRestoration","router","createBrowserRouter","Suspense","Outlet","ErrorBoundary","defineLazyRoutes","rootEl","ReactDOM","render","RouterProvider","QuoteView","type","_Object$values$find","find","getQuoteView","Financials","Options","ChartDetail","compilePath","params","pathToRegexp","toHome","toNews","toScreener","toCharts","toGroups","toPortfolio","toInsider","toElite","toSearch","ticker","toQuote","toAlerts","toHelp","toAccount","toLogin","toLogout","toMaps","toBubbles","toFutures","toFuturesPerf","toFuturesCharts","toFuturesChartDetail","cleanTicker","toForex","toForexPerf","toForexCharts","toForexChartDetail","toCrypto","toCryptoPerf","toCryptoCharts","toCryptoChartDetail","toBacktests","toBacktestCreate","toBacktestDetail","backtestId","toBacktestPresets","Instrument","DateRangeType","SortDirection","FeatureFlag","prevParams","nextParams","nextUrl","requiredChanged","otherChanged","index","arr","defaultShouldRevalidate","parseRouteInitData","removeElement","initialData","parsedData","remove","querySelector","componentLoader","lazy","routes","_props$loader","_props$action","_ref3","mod","_mod$loader","call","_mod$action","async","getModuleFromURL","_ref4","viewQueryParam","route","URL","request","url","actionModule","loaderModule","_getModuleFromURL","useSearchParams","startsWith","getInstrumentForTicker","Stock","cleanedTicker","toUpperCase","Crypto","Forex","Futures","resizeObserverPolyfill","loadResizeObserverPolyfill","ResizeObserver","polyfill","default","getIsBrave","navigator","brave","isBrave","deserializeFeatureFlags","flags","val","fromEntries","serializeFeatureFlags","entries","Number","join","ChildPosition","getFlexAlignClasses","topLeft","bottomLeft","leftCenter","center","topCenter","bottomCenter","topRight","bottomRight","rightCenter","intlCache","getIntl","fractions","Intl","NumberFormat","minimumFractionDigits","maximumFractionDigits","shortFormatNumber","showPlusSign","defaultValue","multiply","num","isFinite","suffix","absValue","abs","format","formatNumber","fixedValue","toFixed","prefix","parseFloat","toString","sortByColumn","a","b","localeCompare","direction","sortNullAsLast","Infinity","ignoreNullForComparison","moveItemInArray","sourceIndex","destinationIndex","from","max","min","to","items","removed","splice","getUuid","_window$crypto$random","_window$crypto","_window$crypto$random2","crypto","randomUUID","c","getRandomValues","Uint8Array","focusWithoutScroll","requestAnimationFrame","focus","preventScroll","ariaHasPopup","blurWithoutScroll","preventDefault","getNavigationLinkUrl","preservedKeys","removeQueryKeys","additionalQueryValues","newUrl","delete","set","getElitePageLink","campaign","query","URLSearchParams","useDialogDismiss","_a","_b","store","onClickProp","onClick","defaultPrevented","useMemo","jsxs","display","fill","stroke","strokeLinecap","strokeLinejoin","strokeWidth","viewBox","jsx","x1","y1","x2","y2","DialogDismiss","htmlProps","TagName","useButton","ref","useRef","tagName","isNativeButton","setIsNativeButton","useState"],"sourceRoot":""}