{"version":3,"file":"main.5027d020.js","mappings":"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","sources":["webpack://@finviz/website/./js/app/shared/sentry/init.ts","webpack://@finviz/website/./js/app/shared/sentry/constants.ts","webpack://@finviz/website/./js/app/shared/tracking.ts","webpack://@finviz/website/./js/main/components/loading.tsx","webpack://@finviz/website/./js/main/hooks/use-track-pageview.ts","webpack://@finviz/website/./js/main/hooks/useCachedLoaderData.tsx","webpack://@finviz/website/./js/main/components/ScrollRestore.tsx","webpack://@finviz/website/./js/main/modules/alerts/index.tsx","webpack://@finviz/website/./js/main/modules/insider-trading/components/LoadingScreen.tsx","webpack://@finviz/website/./js/main/modules/insider-trading/index.tsx","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/insider-trading/constants.ts","webpack://@finviz/website/./js/main/modules/insider-trading/hooks/useInsiderTradingRouter.ts","webpack://@finviz/website/./js/main/modules/quote/types.ts","webpack://@finviz/website/./js/main/modules/quote/utils.ts","webpack://@finviz/website/./js/main/util-routing.tsx"],"sourcesContent":["import * as Sentry from '@sentry/browser'\r\n\r\nimport { ThrowableError } from '../../../main/services/api'\r\nimport { getSentryOptions } from './constants'\r\n\r\nif ('FinvizSentrySettings' in window && !('sentryDisabled' in window)) {\r\n const sentryOptions = getSentryOptions(window)\r\n Sentry.init({\r\n ...sentryOptions,\r\n beforeSend(event: Sentry.ErrorEvent, hint: Sentry.EventHint) {\r\n const originalError = hint.originalException as Error | null\r\n const exception = event.exception?.values?.[0]\r\n const errorFrames = exception?.stacktrace?.frames ?? []\r\n\r\n const mechanism = exception?.mechanism?.type ?? hint.mechanism?.type\r\n const message = originalError?.message ?? exception?.value\r\n\r\n /**\r\n * Ignore scripts matching `ignoreStack`.\r\n * - If pattern is string, only the script url is matched. In case of `http.client`, the url is matched\r\n * - If pattern is array, both url and and error message must match\r\n */\r\n const isIgnoredError = sentryOptions.ignoreStack.some((ignorePattern) => {\r\n const [ignoreSource, ignoreMessage] = Array.isArray(ignorePattern) ? ignorePattern : [ignorePattern]\r\n const isIgnoredScript =\r\n errorFrames.some((frame) => frame?.filename?.includes(ignoreSource)) ||\r\n (mechanism === 'http.client' && event.request?.url?.includes(ignoreSource))\r\n\r\n if (!ignoreMessage) return isIgnoredScript\r\n\r\n return message?.match(ignoreMessage)\r\n })\r\n\r\n if (isIgnoredError) return null\r\n\r\n // Completely ignore 524 errors, track other network errors as `info` if the status is 520+\r\n const statusCode =\r\n originalError instanceof ThrowableError ? originalError.status : (event.contexts?.response?.status_code ?? -1)\r\n if (statusCode === 500) {\r\n return { ...event, level: 'error', fingerprint: ['500'] }\r\n } else if (statusCode > 500 && statusCode < 520) {\r\n return { ...event, level: 'info', fingerprint: ['500+'] }\r\n } else if (statusCode > 520) {\r\n // Completely ignore 524 errors\r\n if (statusCode === 524) return null\r\n return { ...event, level: 'info', fingerprint: ['520+'] }\r\n }\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 getCurrentScope: Sentry.getCurrentScope,\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\nconst prodDsn = 'https://11de51e753454212a2845e5899a38cae@sentry.io/33153'\r\nconst devDsn = 'https://a6b6fd3b51987321373cd9ac451f1d4b@o17229.ingest.us.sentry.io/4508811147476997'\r\n\r\nexport const getSentryOptions = (globalRef: { location: { hostname: string } }) => ({\r\n dsn: globalRef.location.hostname.includes('finviz.com') ? prodDsn : devDsn,\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 environment:\r\n typeof window !== 'undefined' && 'FinvizSentrySettings' in window ? FinvizSentrySettings.environment : 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 'AbortError: The operation was aborted.',\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 'investingchannel.com',\r\n ['cmp2.js', /(AbortError|NetworkError|aborted|network)/i],\r\n ] satisfies Array,\r\n})\r\n","export enum AdsProvider {\r\n None,\r\n InvestingChannel,\r\n Freestar,\r\n}\r\n\r\nexport function getAdsProvider() {\r\n if (FinvizSettings.hasUserPremium) return AdsProvider.None\r\n\r\n if (FinvizSettings.adsProvider === 2) {\r\n return AdsProvider.Freestar\r\n }\r\n\r\n return AdsProvider.InvestingChannel\r\n}\r\n\r\n/**\r\n * Tracks virtual page views to google analytics and freestar\r\n */\r\nexport function trackPageView(props: { pathname?: string; query?: string; freestarPageView?: boolean }) {\r\n const { pathname = window.location.pathname, query = window.location.search, freestarPageView = true } = props\r\n\r\n window.gtag?.('set', 'page_path', `${pathname}${query.length ? '?' : ''}${query.replace(/^\\?/, '')}`)\r\n window.gtag?.('event', 'page_view')\r\n\r\n if (freestarPageView && getAdsProvider() === AdsProvider.Freestar) {\r\n window.freestar?.queue.push(() => freestar.trackPageview())\r\n }\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\nimport { useLocation } from 'react-router-dom'\r\n\r\nimport * as tracking from '../../app/shared/tracking'\r\n\r\nexport function useTrackPageView(props?: { trackInitial?: boolean; trackAutomatically?: boolean }) {\r\n const { trackInitial = false, trackAutomatically = true } = props ?? {}\r\n const initialRender = React.useRef(trackInitial)\r\n const location = useLocation()\r\n\r\n const handleTrackView = React.useCallback(() => {\r\n tracking.trackPageView({ pathname: location.pathname, query: location.search })\r\n }, [location.pathname, location.search])\r\n\r\n React.useEffect(() => {\r\n if (!trackAutomatically) return\r\n if (initialRender.current) handleTrackView()\r\n initialRender.current = true\r\n }, [trackAutomatically, handleTrackView, trackInitial])\r\n\r\n return handleTrackView\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 React from 'react'\r\nimport { ScrollRestoration, useLocation } from 'react-router-dom'\r\n\r\nconst DEFAULT_RESTORE_KEY = 'default'\r\n\r\n/**\r\n * Get type of last navigation\r\n * https://caniuse.com/mdn-api_performance_getentriesbytype\r\n */\r\nfunction getIsInitiallyRendered() {\r\n const navTypes = window.performance\r\n ?.getEntriesByType?.('navigation')\r\n .map((nav) => (nav as PerformanceNavigationTiming).type)\r\n\r\n return navTypes?.includes('reload') || navTypes?.includes('back_forward')\r\n}\r\n\r\n/**\r\n * Some of our views are based on query params (unsupported by router),\r\n * which creates problems with scroll restore navigating between pages (eg. quote)\r\n *\r\n * In order to work around this, we need to only restore the scroll on page reload\r\n * and not on navigation. But at the same time, we need to write the scroll position,\r\n * so we can restore it if we need to.\r\n *\r\n * We can’t simply render the component conditionally, because it’d restore scroll\r\n * on mount, so we need a way of restoring scroll only on reload, while preserving\r\n * the saving functionality, which we do by switching the key in an effect after the component has rendered\r\n */\r\nexport function ScrollRestore() {\r\n const loc = useLocation()\r\n const [resetKey, setKey] = React.useState(() =>\r\n getIsInitiallyRendered()\r\n ? DEFAULT_RESTORE_KEY\r\n : loc.key === DEFAULT_RESTORE_KEY\r\n ? Math.random().toString(16)\r\n : loc.key\r\n )\r\n\r\n React.useEffect(() => setKey(() => DEFAULT_RESTORE_KEY), [])\r\n\r\n return resetKey} />\r\n}\r\n","import { lazyLoadComponent } from '../../util-routing'\r\n\r\nexport const alertsModule = [\r\n {\r\n path: '/alerts.ashx',\r\n loaderBundle: () => import(/* webpackChunkName: \"alerts-loaders\" */ './loaders'),\r\n Component: lazyLoadComponent({\r\n chunkName: 'alerts',\r\n load: () => import(/* webpackChunkName: \"alerts\" */ './AlertsRoute'),\r\n }),\r\n },\r\n]\r\n","import { LoadingScreen as SharedLoadingScreen } from '../../../components/loading'\r\nimport { InsiderView } from '../constants'\r\nimport { useInsiderTradingRouter } from '../hooks/useInsiderTradingRouter'\r\n\r\nexport function LoadingScreen() {\r\n const insiderTradingRouter = useInsiderTradingRouter()\r\n\r\n // On index page we only use top bar from the module, min height (44px) is precalculated correctly\r\n // and there's another content already rendered on BE. SharedLoadingScreen has min height\r\n // which is way more than 44px but in this case even spinner doesn't look good so we're not rendering anything\r\n if (insiderTradingRouter.viewParams.view === InsiderView.Index) {\r\n return null\r\n }\r\n\r\n return \r\n}\r\n","import { Suspense } from 'react'\r\n\r\nimport { LazyRouteDefinition, createRouteViewSwitch, lazyLoadComponent } from '../../util-routing'\r\nimport { LoadingScreen } from './components/LoadingScreen'\r\nimport { InsiderView, InsiderViewParam } from './constants'\r\n\r\nconst { loader, action, ViewSwitch } = createRouteViewSwitch({\r\n defaultView: InsiderView.Index,\r\n viewParam: InsiderViewParam.View,\r\n views: {\r\n '': {\r\n Component: lazyLoadComponent({\r\n chunkName: 'insider-index',\r\n load: () => import(/* webpackChunkName: \"insider-index\" */ './routes/Index'),\r\n }),\r\n },\r\n [InsiderView.Managers]: {\r\n Component: lazyLoadComponent({\r\n chunkName: 'insider-managers',\r\n load: () => import(/* webpackChunkName: \"insider-managers\" */ './routes/Managers'),\r\n }),\r\n },\r\n [InsiderView.ManagerDetails]: {\r\n Component: lazyLoadComponent({\r\n chunkName: 'insider-manager-details',\r\n load: () => import(/* webpackChunkName: \"insider-manager-details\" */ './routes/ManagerDetails'),\r\n }),\r\n },\r\n [InsiderView.ManagerHoldings]: {\r\n Component: lazyLoadComponent({\r\n chunkName: 'insider-manager-holdings',\r\n load: () => import(/* webpackChunkName: \"insider-manager-holdings\" */ './routes/ManagerHoldings'),\r\n }),\r\n },\r\n [InsiderView.Funds]: {\r\n Component: lazyLoadComponent({\r\n chunkName: 'insider-funds',\r\n load: () => import(/* webpackChunkName: \"insider-funds\" */ './routes/Funds'),\r\n }),\r\n },\r\n [InsiderView.FundDetails]: {\r\n Component: lazyLoadComponent({\r\n chunkName: 'insider-fund-details',\r\n load: () => import(/* webpackChunkName: \"insider-fund-details\" */ './routes/FundDetails'),\r\n }),\r\n },\r\n [InsiderView.FundHoldings]: {\r\n Component: lazyLoadComponent({\r\n chunkName: 'insider-fund-holdings',\r\n load: () => import(/* webpackChunkName: \"insider-fund-holdings\" */ './routes/FundHoldings'),\r\n }),\r\n },\r\n [InsiderView.NotFound]: {\r\n Component: lazyLoadComponent({\r\n chunkName: 'insider-not-found',\r\n load: () => import(/* webpackChunkName: \"insider-not-found\" */ './routes/NotFound'),\r\n }),\r\n },\r\n },\r\n})\r\n\r\nexport const insiderTradingModule: LazyRouteDefinition[] = [\r\n {\r\n path: '/insidertrading.ashx',\r\n loader,\r\n action,\r\n element: (\r\n }>\r\n \r\n \r\n ),\r\n },\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 { 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.Earnings]: {\r\n Component: lazyLoadComponent({\r\n chunkName: 'earnings',\r\n load: () => import(/* webpackChunkName: \"earnings\" */ '../earnings'),\r\n }),\r\n },\r\n [QuoteSubview.Forecast]: {\r\n Component: lazyLoadComponent({\r\n chunkName: 'forecast',\r\n load: () => import(/* webpackChunkName: \"forecast\" */ '../forecast'),\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 },\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 { ScrollRestore } from './components/ScrollRestore'\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 { useTrackPageView } from './hooks/use-track-pageview'\r\nimport { alertsModule } from './modules/alerts'\r\nimport { insiderTradingModule } from './modules/insider-trading'\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 Component: () => {\r\n useTrackPageView()\r\n\r\n return (\r\n }>\r\n \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 ...alertsModule,\r\n ...insiderTradingModule,\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 path: '/create_alert_portfolio.ashx',\r\n loaderBundle: () =>\r\n import(/* webpackChunkName: \"create-alert-portfolio-loaders\" */ './modules/create-alert-portfolio/loaders'),\r\n Component: lazyLoadComponent({\r\n chunkName: 'create-alert-portfolio',\r\n load: () => import(/* webpackChunkName: \"create-alert-portfolio\" */ './modules/create-alert-portfolio/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","import { MapDataRoot } from '../../../app/maps/types'\r\nimport { ChartBoxoverEntry } from '../../../app/shared/components/ChartBoxover'\r\nimport { ColorVariant } from '../../components'\r\nimport type { ApiPaginatedResponse } from '../../types'\r\n\r\nexport const SEGMENT_COLORS = Object.keys(ColorVariant).filter(\r\n (c) => ![ColorVariant.gray, ColorVariant.default, ColorVariant.darkGray].includes(c as ColorVariant)\r\n) as ColorVariant[]\r\n\r\nexport enum InvestorType {\r\n Manager = 'manager_13f',\r\n OtherManager = 'other_manager_13f',\r\n Fund = 'nport_fund',\r\n}\r\n\r\nexport enum InsiderView {\r\n Index = '',\r\n Managers = 'managers',\r\n ManagerDetails = 'manager-details',\r\n ManagerHoldings = 'manager-holdings',\r\n Funds = 'funds',\r\n FundDetails = 'fund-details',\r\n FundHoldings = 'fund-holdings',\r\n NotFound = 'not-found',\r\n}\r\n\r\nexport enum InsiderViewParam {\r\n View = 'view',\r\n Page = 'page',\r\n Search = 'search',\r\n InvestorId = 'investorId',\r\n ReportEndDate = 'reportEndDate',\r\n TransactionType = 'transactionType',\r\n OptionType = 'optionType',\r\n AssetCategory = 'assetCategory',\r\n Sort = 'sort',\r\n InvestorType = 'investorType',\r\n}\r\n\r\nexport enum HoldingOptionType {\r\n Any = 'any',\r\n Share = 'share',\r\n Put = 'put',\r\n Call = 'call',\r\n}\r\n\r\nexport const InsiderViewHasParams: Record = {\r\n [InsiderView.Index]: [InsiderViewParam.View],\r\n [InsiderView.Managers]: [\r\n InsiderViewParam.View,\r\n InsiderViewParam.Page,\r\n InsiderViewParam.Search,\r\n InsiderViewParam.Sort,\r\n ],\r\n [InsiderView.ManagerDetails]: [InsiderViewParam.View, InsiderViewParam.InvestorId, InsiderViewParam.ReportEndDate],\r\n [InsiderView.ManagerHoldings]: [\r\n InsiderViewParam.View,\r\n InsiderViewParam.InvestorId,\r\n InsiderViewParam.ReportEndDate,\r\n InsiderViewParam.TransactionType,\r\n InsiderViewParam.OptionType,\r\n InsiderViewParam.Page,\r\n InsiderViewParam.Sort,\r\n ],\r\n [InsiderView.Funds]: [InsiderViewParam.View, InsiderViewParam.Page, InsiderViewParam.Search, InsiderViewParam.Sort],\r\n [InsiderView.FundDetails]: [InsiderViewParam.View, InsiderViewParam.InvestorId, InsiderViewParam.ReportEndDate],\r\n [InsiderView.FundHoldings]: [\r\n InsiderViewParam.View,\r\n InsiderViewParam.InvestorId,\r\n InsiderViewParam.ReportEndDate,\r\n InsiderViewParam.TransactionType,\r\n InsiderViewParam.AssetCategory,\r\n InsiderViewParam.Page,\r\n InsiderViewParam.Sort,\r\n ],\r\n [InsiderView.NotFound]: [InsiderViewParam.View, InsiderViewParam.InvestorType],\r\n}\r\n\r\nexport interface InsiderViewsParams {\r\n [InsiderView.Index]: Record\r\n [InsiderView.Managers]: {\r\n [InsiderViewParam.View]: InsiderView\r\n [InsiderViewParam.Page]: number\r\n [InsiderViewParam.Search]?: string\r\n [InsiderViewParam.Sort]?: string\r\n }\r\n [InsiderView.ManagerDetails]: {\r\n [InsiderViewParam.View]: InsiderView\r\n [InsiderViewParam.InvestorId]: string\r\n [InsiderViewParam.ReportEndDate]?: string\r\n }\r\n [InsiderView.ManagerHoldings]: {\r\n [InsiderViewParam.View]: InsiderView\r\n [InsiderViewParam.InvestorId]: string\r\n [InsiderViewParam.ReportEndDate]?: string\r\n [InsiderViewParam.TransactionType]?: HoldingTransactionType\r\n [InsiderViewParam.OptionType]?: HoldingOptionType\r\n [InsiderViewParam.Page]: number\r\n [InsiderViewParam.Sort]?: string\r\n }\r\n [InsiderView.Funds]: {\r\n [InsiderViewParam.View]: InsiderView\r\n [InsiderViewParam.Page]: number\r\n [InsiderViewParam.Search]?: string\r\n [InsiderViewParam.Sort]?: string\r\n }\r\n [InsiderView.FundDetails]: {\r\n [InsiderViewParam.View]: InsiderView\r\n [InsiderViewParam.InvestorId]: string\r\n [InsiderViewParam.ReportEndDate]?: string\r\n }\r\n [InsiderView.FundHoldings]: {\r\n [InsiderViewParam.View]: InsiderView\r\n [InsiderViewParam.InvestorId]: string\r\n [InsiderViewParam.ReportEndDate]?: string\r\n [InsiderViewParam.TransactionType]?: HoldingTransactionType\r\n [InsiderViewParam.AssetCategory]?: string\r\n [InsiderViewParam.Page]: number\r\n [InsiderViewParam.Sort]?: string\r\n }\r\n [InsiderView.NotFound]: {\r\n [InsiderViewParam.View]: InsiderView\r\n [InsiderViewParam.InvestorType]: InvestorType\r\n }\r\n}\r\n\r\nexport const INSIDER_VIEW_LABELS = {\r\n [InsiderView.Index]: 'Insiders',\r\n [InsiderView.Managers]: 'Managers',\r\n [InsiderView.Funds]: 'Funds',\r\n}\r\n\r\nexport interface ManagerSearchItemData {\r\n investorId: string\r\n name: string\r\n seriesName?: string\r\n portfolioManager?: string\r\n}\r\n\r\nexport interface InstOwnFiler {\r\n investorId: string\r\n filerName: string\r\n filerCik?: number\r\n seriesName?: string | null\r\n investorType: InvestorType\r\n otherManagerName?: string\r\n hasOwnHoldings?: boolean\r\n portfolioManager?: string\r\n}\r\n\r\ninterface InstOwnLatestSummary {\r\n reportDate: string\r\n totalSumOfUsdValue: number\r\n turnoverPerc: number\r\n}\r\n\r\nexport interface TopInvestmentType {\r\n ticker?: string\r\n name?: string\r\n value: number\r\n putCall: HoldingOptionType\r\n boxoverData: ChartBoxoverEntry | null\r\n}\r\n\r\nexport interface ManagerFundItemData {\r\n filer: InstOwnFiler\r\n topInvestments: Array\r\n latestSummaries: InstOwnLatestSummary[]\r\n}\r\n\r\ninterface ManagerFundSummary {\r\n investorId: string\r\n reportDate: string\r\n totalCountOfInvestments: number\r\n totalSumOfUsdValue: number\r\n totalSumOfUsdValuePrevQ: number | null\r\n countOfNewPurchased: number\r\n countOfSoldOut: number\r\n countOfAddedTo: number\r\n countOfReduced: number\r\n percOfPortfolioOfTop10: number\r\n turnoverPerc: number\r\n timeHeldTop10: number\r\n timeHeldTop20: number\r\n timeHeldAll: number\r\n isConfidentialOmitted: boolean\r\n}\r\n\r\nexport interface SectorAllocation {\r\n quarter: string\r\n sector: string\r\n pctAllocation: number\r\n usdAllocation: number\r\n}\r\n\r\nexport type IndividualManagers = Array<{ name: string; investorId: string | null }>\r\n\r\nexport interface ManagerData {\r\n filer: InstOwnFiler\r\n latestSummary: ManagerFundSummary\r\n topBuysUsd: TopInvestmentType[]\r\n topSellsUsd: TopInvestmentType[]\r\n topBuysPct: TopInvestmentType[]\r\n topSellsPct: TopInvestmentType[]\r\n individualManagers: IndividualManagers\r\n mapData: MapDataRoot\r\n sectorAllocations: SectorAllocation[]\r\n}\r\n\r\nexport interface InitialManagerDetailsData {\r\n initialManagerDetailsData: ManagerData\r\n initialManagerReportDates: string[]\r\n}\r\n\r\nexport interface CountryAllocation {\r\n quarter: string\r\n country: string\r\n pctAllocation: number\r\n usdAllocation: number\r\n}\r\n\r\nexport interface FundData {\r\n filer: InstOwnFiler\r\n latestSummary: ManagerFundSummary\r\n topBuysUsd: TopInvestmentType[]\r\n topSellsUsd: TopInvestmentType[]\r\n topBuysPct: TopInvestmentType[]\r\n topSellsPct: TopInvestmentType[]\r\n individualManagers: IndividualManagers\r\n mapData: MapDataRoot\r\n countryAllocations: CountryAllocation[]\r\n}\r\n\r\nexport interface InitialFundDetailsData {\r\n initialFundDetailsData: FundData\r\n initialFundReportDates: string[]\r\n}\r\n\r\nexport interface ManagerHolding {\r\n issuerTicker: string\r\n issuerName: string\r\n putCall: HoldingOptionType\r\n sector: string\r\n subAdvisorFlag: boolean\r\n shares: number\r\n valueUsd: number\r\n percentageOfPortfolio: number\r\n previousPercentageOfPortfolio: number\r\n changeInShares: number\r\n percentChangeFromPrevious: number\r\n lastClose: number\r\n firstQtrOwned: string\r\n percOwnership: number | null\r\n weightedAvgPrice: number | null\r\n boxoverData: ChartBoxoverEntry | null\r\n}\r\n\r\nexport interface InitialManagerHoldingsData {\r\n initialManagerHoldingsFiler: InstOwnFiler | null\r\n initialManagerHoldingsData: ApiPaginatedResponse\r\n initialManagerReportDates: string[]\r\n initialLatestSummary: {\r\n isConfidentialOmitted: boolean\r\n }\r\n}\r\n\r\nexport interface FundHolding {\r\n boxoverData: ChartBoxoverEntry | null\r\n issuerName: string\r\n issuerTicker: string\r\n assetCategory: string\r\n investmentCountry: string\r\n payOffProfile: string\r\n percentChangeFromPrevious: number // % Chng. balance\r\n percentageOfPortfolio: number\r\n previousPercentageOfPortfolio: number\r\n shareType: string // Units\r\n shares: number // Balance\r\n valueUsd: number\r\n}\r\n\r\nexport interface InitialFundHoldingsData {\r\n initialFundHoldingsFiler: InstOwnFiler | null\r\n initialFundHoldingsData: ApiPaginatedResponse\r\n initialFundReportDates: string[]\r\n initialFundAssetCategories: Record\r\n}\r\n\r\nexport enum ManagerFundSortEnum {\r\n MostPopular = 'most_popular',\r\n PortfolioValue = 'portfolio_value',\r\n NumInvestments = 'num_investments',\r\n NewPurchased = 'new_purchased',\r\n SoldOut = 'sold_out',\r\n Added = 'added',\r\n Reduced = 'reduced',\r\n TopTenConcentration = 'top_ten_concentration',\r\n Turnover = 'turnover',\r\n TimeHeldTop10 = 'time_held_top10',\r\n TimeHeldAll = 'time_held_all',\r\n}\r\n\r\nexport const ManagerFundSortLabel = {\r\n [ManagerFundSortEnum.MostPopular]: 'Most Popular',\r\n [ManagerFundSortEnum.PortfolioValue]: 'Portfolio Value',\r\n [ManagerFundSortEnum.NumInvestments]: 'Number of Investments',\r\n [ManagerFundSortEnum.NewPurchased]: 'New Purchased',\r\n [ManagerFundSortEnum.SoldOut]: 'Sold Out',\r\n [ManagerFundSortEnum.Added]: 'Added',\r\n [ManagerFundSortEnum.Reduced]: 'Reduced',\r\n [ManagerFundSortEnum.TopTenConcentration]: 'Top 10 Concentration',\r\n [ManagerFundSortEnum.Turnover]: 'Turnover',\r\n [ManagerFundSortEnum.TimeHeldTop10]: 'Time Held (Top 10)',\r\n [ManagerFundSortEnum.TimeHeldAll]: 'Time Held (All)',\r\n} as const\r\n\r\nexport const DEFAULT_QUERY_CACHE_TIME_IN_MS = 1000\r\n\r\nexport enum ChangeTypeEnum {\r\n Usd,\r\n Percentage,\r\n}\r\n\r\nexport enum HoldingColumnEnum {\r\n ticker = 'issuerTicker',\r\n name = 'issuerName',\r\n type = 'putCall',\r\n sector = 'sector',\r\n sharesHeld = 'shares',\r\n marketValue = 'valueUsd',\r\n portfolioPercentage = 'percentageOfPortfolio',\r\n previousPortfolioPercentage = 'previousPercentageOfPortfolio',\r\n changeInShares = 'changeInShares',\r\n changeInSharesPercentage = 'percentChangeFromPrevious',\r\n ownershipPercentage = 'percOwnership',\r\n averagePrice = 'weightedAvgPrice',\r\n currentPrice = 'currentPrice',\r\n quarterFirstOwned = 'firstQtrOwned',\r\n}\r\n\r\nexport enum FundHoldingColumnEnum {\r\n issuerTicker = 'issuerTicker',\r\n issuerName = 'issuerName',\r\n assetCategory = 'assetCategory',\r\n balance = 'shares',\r\n units = 'shareType',\r\n valueUsd = 'valueUsd',\r\n portfolioPercentage = 'percentageOfPortfolio',\r\n previousPortfolioPercentage = 'previousPercentageOfPortfolio',\r\n percentChangeFromPrevious = 'percentChangeFromPrevious',\r\n payOffProfile = 'payOffProfile',\r\n investmentCountry = 'investmentCountry',\r\n}\r\n\r\nexport enum HoldingTransactionType {\r\n Any = 'any',\r\n New = 'new',\r\n ClosedOut = 'closed_out',\r\n Added = 'added',\r\n Reduced = 'reduced',\r\n NoChange = 'no_change',\r\n}\r\n\r\nexport const HoldingTransactionTypeLabelMap = {\r\n [HoldingTransactionType.Any]: 'Any',\r\n [HoldingTransactionType.New]: 'New',\r\n [HoldingTransactionType.Added]: 'Added',\r\n [HoldingTransactionType.Reduced]: 'Reduced',\r\n [HoldingTransactionType.ClosedOut]: 'Closed Out',\r\n [HoldingTransactionType.NoChange]: 'No Change',\r\n}\r\n\r\nexport const HoldingTransactionTypes = [\r\n HoldingTransactionType.Any,\r\n HoldingTransactionType.New,\r\n HoldingTransactionType.Added,\r\n HoldingTransactionType.Reduced,\r\n HoldingTransactionType.ClosedOut,\r\n HoldingTransactionType.NoChange,\r\n]\r\n\r\nexport const HoldingOptionTypeLabelMap = {\r\n [HoldingOptionType.Any]: 'Any',\r\n [HoldingOptionType.Share]: 'Share',\r\n [HoldingOptionType.Put]: 'Put',\r\n [HoldingOptionType.Call]: 'Call',\r\n}\r\n\r\nexport const HoldingOptionTypes = [\r\n HoldingOptionType.Any,\r\n HoldingOptionType.Share,\r\n HoldingOptionType.Put,\r\n HoldingOptionType.Call,\r\n]\r\n","import { isValid, parseISO } from 'date-fns'\r\nimport * as React from 'react'\r\nimport { useSearchParams } from 'react-router-dom'\r\n\r\nimport { ObjectHash, encodeQueryString } from '../../../../app/queryString'\r\nimport {\r\n HoldingOptionType,\r\n HoldingTransactionType,\r\n InsiderView,\r\n InsiderViewHasParams,\r\n InsiderViewParam,\r\n InsiderViewsParams,\r\n InvestorType,\r\n} from '../constants'\r\n\r\nfunction getInsiderViewSpecificParams<\r\n T extends InsiderView,\r\n ParamsType extends Partial = Partial,\r\n>(params: ParamsType, view: T) {\r\n return Object.keys(params).reduce(\r\n (acc, key) =>\r\n InsiderViewHasParams[view]?.includes(key as InsiderViewParam)\r\n ? { ...acc, [key]: params[key as keyof ParamsType] }\r\n : acc,\r\n {} as ParamsType\r\n )\r\n}\r\n\r\nexport function useInsiderTradingRouter() {\r\n const [params] = useSearchParams()\r\n\r\n return React.useMemo(() => {\r\n const view = (params.get(InsiderViewParam.View) || InsiderView.Index) as T\r\n const reportEndDate = params.get(InsiderViewParam.ReportEndDate)\r\n\r\n const parsedParams: InsiderViewsParams[T] = {\r\n [InsiderViewParam.View]: view,\r\n [InsiderViewParam.Page]: Number(params.get(InsiderViewParam.Page) || '1'),\r\n [InsiderViewParam.Search]: params.get(InsiderViewParam.Search) ?? undefined,\r\n [InsiderViewParam.InvestorId]: params.get(InsiderViewParam.InvestorId) ?? '',\r\n [InsiderViewParam.ReportEndDate]: reportEndDate && isValid(parseISO(reportEndDate)) ? reportEndDate : undefined,\r\n [InsiderViewParam.TransactionType]:\r\n (params.get(InsiderViewParam.TransactionType) as HoldingTransactionType) ?? undefined,\r\n [InsiderViewParam.OptionType]: (params.get(InsiderViewParam.OptionType) as HoldingOptionType) ?? undefined,\r\n [InsiderViewParam.AssetCategory]: params.get(InsiderViewParam.AssetCategory) ?? undefined,\r\n [InsiderViewParam.Sort]: params.get(InsiderViewParam.Sort) ?? undefined,\r\n [InsiderViewParam.InvestorType]: params.get(InsiderViewParam.InvestorType) as InvestorType,\r\n }\r\n\r\n return {\r\n params,\r\n viewParams: getInsiderViewSpecificParams(parsedParams, view),\r\n getInsiderTradingLink: ({\r\n view,\r\n params = {},\r\n additionalQueryParams,\r\n }: {\r\n view: View\r\n params?: Partial\r\n additionalQueryParams?: ObjectHash\r\n }) =>\r\n `/insidertrading.ashx?${encodeQueryString({\r\n ...getInsiderViewSpecificParams({ ...params, view }, view),\r\n ...additionalQueryParams,\r\n })}`,\r\n }\r\n }, [params])\r\n}\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 BackToScreener = 'b',\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 Earnings = 'ea',\r\n Forecast = 'fc',\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.Earnings:\r\n case QuoteSubview.Forecast:\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 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] ?? options.views[options.defaultView!]\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"],"names":["window","sentryOptions","dsn","location","hostname","includes","allowUrls","release","FinvizSentrySettings","undefined","environment","sendDefaultPii","integrations","dedupeIntegration","extraErrorDataIntegration","httpClientIntegration","failedRequestTargets","thirdPartyErrorFilterIntegration","filterKeys","behaviour","ignoreErrors","ignoreStack","Sentry","beforeSend","event","hint","_event$exception","_exception$stacktrace","_exception$stacktrace2","_exception$mechanism$","_exception$mechanism","_hint$mechanism","_originalError$messag","_event$contexts$respo","_event$contexts","originalError","originalException","exception","values","errorFrames","stacktrace","frames","mechanism","type","message","value","some","ignorePattern","_event$request","ignoreSource","ignoreMessage","Array","isArray","isIgnoredScript","frame","_frame$filename","filename","request","url","match","statusCode","ThrowableError","status","contexts","response","status_code","level","fingerprint","id","String","_window$FinvizSetting","_window$FinvizSetting2","dpr","devicePixelRatio","redesign","FinvizSettings","hasRedesignEnabled","dark","hasDarkTheme","innerWidth","innerHeight","captureException","captureMessage","withScope","getCurrentScope","AdsProvider","getAdsProvider","hasUserPremium","None","adsProvider","Freestar","InvestingChannel","trackPageView","props","_window$gtag","_window","_window$gtag2","_window2","pathname","query","search","freestarPageView","_window$freestar","gtag","call","length","replace","freestar","queue","push","trackPageview","Loading","_ref","delay","timeout","throwOnTimeout","_jsx","Delayed","delayComponent","timeoutComponent","ErrorView","showContact","title","_jsxs","_Fragment","children","href","link","toContact","className","Spinner","LoadingScreen","useTrackPageView","trackInitial","trackAutomatically","initialRender","React","useLocation","handleTrackView","tracking","current","CachedLoaderDataContext","useCachedLoaderData","context","Error","CachedLoaderDataContextProvider","isNullValidData","loaderData","useLoaderData","dataCacheRef","data","isCached","Provider","DEFAULT_RESTORE_KEY","ScrollRestore","loc","resetKey","setKey","_window$performance","_window$performance$g","navTypes","performance","getEntriesByType","map","nav","getIsInitiallyRendered","key","Math","random","toString","ScrollRestoration","getKey","alertsModule","path","loaderBundle","Component","lazyLoadComponent","chunkName","load","useInsiderTradingRouter","viewParams","view","InsiderView","Index","SharedLoadingScreen","loader","action","ViewSwitch","createRouteViewSwitch","defaultView","viewParam","InsiderViewParam","View","views","Managers","ManagerDetails","ManagerHoldings","Funds","FundDetails","FundHoldings","NotFound","insiderTradingModule","element","Suspense","fallback","portfolioModule","shouldRevalidate","revalidateOnQueryChange","QuoteSharedWrapper","optionsBundle","QuoteQuery","Type","QuoteSubview","OptionsChain","OptionsVolatility","Revenue","Dividends","Earnings","Forecast","ShortInterest","Traffic","LatestFilings","quoteModule","args","getQuoteSubview","currentUrl","searchParams","get","shouldRevalidateOnQueryChange","then","RenderRecentQuotes","catch","router","createBrowserRouter","SettingsContext","NotificationWrapper","Outlet","ErrorBoundary","RouterErrorElement","defineLazyRoutes","rootEl","document","getElementById","ReactDOM","render","RouterProvider","SEGMENT_COLORS","Object","keys","ColorVariant","filter","c","gray","default","darkGray","InvestorType","HoldingOptionType","InsiderViewHasParams","Page","Search","Sort","InvestorId","ReportEndDate","TransactionType","OptionType","AssetCategory","INSIDER_VIEW_LABELS","ManagerFundSortEnum","ManagerFundSortLabel","MostPopular","PortfolioValue","NumInvestments","NewPurchased","SoldOut","Added","Reduced","TopTenConcentration","Turnover","TimeHeldTop10","TimeHeldAll","DEFAULT_QUERY_CACHE_TIME_IN_MS","ChangeTypeEnum","HoldingColumnEnum","FundHoldingColumnEnum","HoldingTransactionType","HoldingTransactionTypeLabelMap","Any","New","ClosedOut","NoChange","HoldingTransactionTypes","HoldingOptionTypeLabelMap","Share","Put","Call","HoldingOptionTypes","getInsiderViewSpecificParams","params","reduce","acc","_InsiderViewHasParams","useSearchParams","_params$get","_params$get2","_ref2","_params$get3","_params$get4","reportEndDate","parsedParams","Number","isValid","parseISO","getInsiderTradingLink","_ref3","additionalQueryParams","encodeQueryString","QuoteView","_Object$values$find","find","getQuoteView","Financials","Options","ChartDetail","prevParams","nextParams","nextUrl","requiredChanged","otherChanged","index","arr","indexOf","defaultShouldRevalidate","parseRouteInitData","elementId","removeElement","arguments","initialData","parsedData","parseInitData","remove","querySelector","componentLoader","lazy","routes","_props$loader","_props$action","mod","_mod$loader","_mod$action","async","options","getModuleFromURL","_ref4","_options$views$viewQu","viewQueryParam","route","URL","actionModule","loaderModule","_getModuleFromURL"],"sourceRoot":""}