{"version":3,"file":"4821.658943ec.js","mappings":"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","sources":["webpack://@finviz/website/../charts/app/constants/common.ts","webpack://@finviz/website/../charts/app/utils.ts","webpack://@finviz/website/../charts/app/utils/helpers.ts"],"sourcesContent":["export const FONT_SIZE = {\r\n XXS: 5,\r\n XS: 7,\r\n S: 8,\r\n M: 10,\r\n L: 11,\r\n XXL: 18,\r\n XXXL: 23,\r\n}\r\nexport const LINE_HEIGHT = {\r\n XS: 7,\r\n S: 8,\r\n M: 10,\r\n}\r\nexport const PADDING = {\r\n XXXS: 1,\r\n XXS: 2,\r\n XS: 3,\r\n S: 5,\r\n}\r\nexport const MARGIN = {\r\n XS: 4,\r\n}\r\nexport const CHART_MARGIN = {\r\n S: 15,\r\n M: 30,\r\n L: 35,\r\n XL: 38,\r\n XXL: 48,\r\n}\r\nexport const SETTINGS_HEIGHT = 44\r\nexport const TICKER_TIMEFRAME_CHANGE_HEIGHT = 20\r\nexport const OFFSET = {\r\n XXS: 2,\r\n XS: 4,\r\n S: 6,\r\n M: 8,\r\n XXL: 20,\r\n}\r\nexport const MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\r\n\r\nexport enum ChartEditorEnum {\r\n publish = 'publish',\r\n tools = 'tools',\r\n ideas = 'ideas',\r\n settings = 'settings',\r\n timeframe = 'timeframe',\r\n}\r\n\r\nexport enum LayoutType {\r\n '1h1v' = '1h1v',\r\n '1h2v' = '1h2v',\r\n '1h3v' = '1h3v',\r\n '2h1v' = '2h1v',\r\n '2h2v' = '2h2v',\r\n '3h1v' = '3h1v',\r\n '3h2v' = '3h2v',\r\n '1l2r' = '1l2r',\r\n '1t2b' = '1t2b',\r\n}\r\n\r\nexport enum CanvasElementType {\r\n element = 'canvas/element',\r\n arrow = 'canvas/arrow',\r\n brushV1 = 'canvas/brush/brush_v1',\r\n curve = 'canvas/curve',\r\n ellipse = 'canvas/ellipse',\r\n fibonacciRetracements = 'canvas/fibonacci_retracements',\r\n horizontalLine = 'canvas/horizontal_line',\r\n line = 'canvas/line',\r\n measure = 'canvas/measure',\r\n pitchforkV1 = 'canvas/pitchfork/pitchfork_v1',\r\n polygon = 'canvas/polygon',\r\n position = 'canvas/position',\r\n rectangle = 'canvas/rectangle',\r\n rotatedRectangle = 'canvas/rotated_rectangle',\r\n scaledLine = 'canvas/scaled_line',\r\n scaledText = 'canvas/scaled_text',\r\n symbol = 'canvas/symbol',\r\n text = 'canvas/text',\r\n triangle = 'canvas/triangle',\r\n verticalLine = 'canvas/vertical_line',\r\n xabcd = 'canvas/xabcd',\r\n calloutV1 = 'canvas/callout/callout_v1',\r\n elliottWaves = 'canvas/elliott_waves/elliott_waves',\r\n ellipseV1 = 'canvas/ellipse/ellipse_v1',\r\n rotatedRectangleV1 = 'canvas/rotated_rectangle/rotated_rectangle_v1',\r\n}\r\n\r\nexport enum ChartElementType {\r\n CandleStick = 'charts/candle_stick',\r\n HeikinAshi = 'charts/heikin_ashi',\r\n HollowCandleStick = 'charts/candle_stick_hollow',\r\n LineChart = 'charts/line_chart',\r\n OhlcChart = 'charts/ohlc_chart',\r\n MarketSentiment = 'charts/market_sentiment',\r\n MultiLineChart = 'charts/multi_line_chart',\r\n PerfChart = 'charts/perf_chart',\r\n}\r\n\r\nexport enum IndicatorType {\r\n Indicator = 'indicators/indicator',\r\n None = 'indicators/none',\r\n Adx = 'indicators/adx',\r\n Aro = 'indicators/aro',\r\n Aroosc = 'indicators/aroosc',\r\n Atr = 'indicators/atr',\r\n Cci = 'indicators/cci',\r\n Cot = 'indicators/cot',\r\n Fi = 'indicators/fi',\r\n Macd = 'indicators/macd',\r\n Mfi = 'indicators/mfi',\r\n Obv = 'indicators/obv',\r\n Perf = 'indicators/perf',\r\n Rmi = 'indicators/rmi',\r\n Roc = 'indicators/roc',\r\n Rsi = 'indicators/rsi',\r\n Rvol = 'indicators/rvol',\r\n Rwi = 'indicators/rwi',\r\n Stofa = 'indicators/stofa',\r\n Stofu = 'indicators/stofu',\r\n Stosl = 'indicators/stosl',\r\n Trix = 'indicators/trix',\r\n Ult = 'indicators/ult',\r\n Vol = 'indicators/vol',\r\n Wr = 'indicators/wr',\r\n Shrtfl = 'indicators/shrtfl',\r\n Shrtra = 'indicators/shrtra',\r\n}\r\n\r\nexport enum OverlayType {\r\n Overlay = 'overlays/overlay',\r\n None = 'overlays/none',\r\n Bb = 'overlays/bb',\r\n Dch = 'overlays/dch',\r\n Ema = 'overlays/ema',\r\n Ema2 = 'overlays/ema2',\r\n Hilo = 'overlays/hilo',\r\n Hline = 'overlays/hline',\r\n Ic = 'overlays/ic',\r\n Icf = 'overlays/icf',\r\n Kch = 'overlays/kch',\r\n Patterns = 'overlays/patterns',\r\n Pp = 'overlays/pp',\r\n Sar = 'overlays/sar',\r\n Sma = 'overlays/sma',\r\n Sma2 = 'overlays/sma2',\r\n Str = 'overlays/str',\r\n Vp = 'overlays/vp',\r\n Vwap = 'overlays/vwap',\r\n}\r\n\r\nexport enum ChartEventDbType {\r\n Dividends = 'chartEvent/dividends',\r\n Split = 'chartEvent/split',\r\n Earnings = 'chartEvent/earnings',\r\n}\r\n\r\nexport enum ChartEventType {\r\n ChartEvent = 'chartEvent/chartEvent',\r\n Dividends = 'chartEvent/dividends',\r\n Split = 'chartEvent/split',\r\n Earnings = 'chartEvent/earnings',\r\n}\r\n\r\nexport enum ChartEventBadgeType {\r\n Dividends = 'chartEvent/dividends',\r\n Split = 'chartEvent/split',\r\n EarningsPositive = 'chartEvent/earnings',\r\n EarningsNegative = 'chartEvent/earningsNegative',\r\n EarningsNeutral = 'chartEvent/earningsNeutral',\r\n EarningsFuture = 'chartEvent/earningsFuture',\r\n}\r\n\r\nexport const ChartEventLabels: Record = {\r\n [ChartEventBadgeType.Dividends]: 'Dividends',\r\n [ChartEventBadgeType.Split]: 'Split',\r\n [ChartEventBadgeType.EarningsPositive]: 'Earnings & Revenue',\r\n [ChartEventBadgeType.EarningsNegative]: 'Earnings & Revenue',\r\n [ChartEventBadgeType.EarningsNeutral]: 'Earnings & Revenue',\r\n [ChartEventBadgeType.EarningsFuture]: 'Earnings & Revenue',\r\n}\r\n\r\ninterface LayoutRule {\r\n columns: number\r\n rows: number\r\n count: number\r\n gridAreas?: string[]\r\n}\r\n\r\nexport const LAYOUTS: Record = {\r\n '1h1v': { columns: 1, rows: 1, count: 1 },\r\n '1h2v': { columns: 1, rows: 2, count: 2 },\r\n '1h3v': { columns: 1, rows: 3, count: 3 },\r\n '2h1v': { columns: 2, rows: 1, count: 2 },\r\n '2h2v': { columns: 2, rows: 2, count: 4 },\r\n '3h1v': { columns: 3, rows: 1, count: 3 },\r\n '3h2v': { columns: 3, rows: 2, count: 6 },\r\n '1l2r': {\r\n columns: 2,\r\n rows: 2,\r\n count: 3,\r\n gridAreas: ['1 / 1 / 3 / 2', '1 / 2 / 2 / 3', '2 / 2 / 3 / 3'],\r\n },\r\n '1t2b': {\r\n columns: 2,\r\n rows: 2,\r\n count: 3,\r\n gridAreas: ['1 / 1 / 2 / 3', '2 / 1 / 3 / 2', '2 / 2 / 3 / 3'],\r\n },\r\n}\r\n\r\nexport const SORT_DIRECTION = {\r\n ASC: 'ASC',\r\n DESC: 'DESC',\r\n}\r\n\r\nexport const ICON_SIZE = {\r\n L: 32,\r\n}\r\n\r\n// Keep in sync with the copy in Website repo - Website/js/main/constants.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 type TimeframeAndIntradayType = TIMEFRAME | 'intraday'\r\n\r\nexport const TIMEFRAMES_WITH_PRE_MARKET = [TIMEFRAME.i1, TIMEFRAME.i2, TIMEFRAME.i3, TIMEFRAME.i5]\r\n\r\nexport const IntradayTimeframeInterval = {\r\n [TIMEFRAME.i1]: 1,\r\n [TIMEFRAME.i2]: 2,\r\n [TIMEFRAME.i3]: 3,\r\n [TIMEFRAME.i5]: 5,\r\n [TIMEFRAME.i10]: 10,\r\n [TIMEFRAME.i15]: 15,\r\n [TIMEFRAME.i30]: 30,\r\n [TIMEFRAME.h]: 60,\r\n [TIMEFRAME.h2]: 120,\r\n [TIMEFRAME.h4]: 240,\r\n}\r\n\r\nexport const TimeframeLabelShort = {\r\n [TIMEFRAME.i1]: '1M',\r\n [TIMEFRAME.i2]: '2M',\r\n [TIMEFRAME.i3]: '3M',\r\n [TIMEFRAME.i5]: '5M',\r\n [TIMEFRAME.i10]: '10M',\r\n [TIMEFRAME.i15]: '15M',\r\n [TIMEFRAME.i30]: '30M',\r\n [TIMEFRAME.h]: '1H',\r\n [TIMEFRAME.h2]: '2H',\r\n [TIMEFRAME.h4]: '4H',\r\n [TIMEFRAME.d]: 'D',\r\n [TIMEFRAME.w]: 'W',\r\n [TIMEFRAME.m]: 'M',\r\n}\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 enum QuoteFinancialAttachment {\r\n shortInterest = 'shortInterest',\r\n}\r\n\r\nexport const TIMEFRAME_SECONDS = {\r\n [TIMEFRAME.i1]: 60,\r\n [TIMEFRAME.i2]: 120,\r\n [TIMEFRAME.i3]: 180,\r\n [TIMEFRAME.i5]: 300,\r\n [TIMEFRAME.i10]: 600,\r\n [TIMEFRAME.i15]: 900,\r\n [TIMEFRAME.i30]: 1800,\r\n [TIMEFRAME.h]: 3600,\r\n [TIMEFRAME.h2]: 7200,\r\n [TIMEFRAME.h4]: 14400,\r\n [TIMEFRAME.d]: 86400,\r\n [TIMEFRAME.w]: 604800,\r\n [TIMEFRAME.m]: 2592000,\r\n}\r\n\r\nexport const CRYPTOS = {\r\n BTCUSD: 'BTCUSD',\r\n LTCUSD: 'LTCUSD',\r\n ETHUSD: 'ETHUSD',\r\n XRPUSD: 'XRPUSD',\r\n BCHUSD: 'BCHUSD',\r\n BTCEUR: 'BTCEUR',\r\n LTCEUR: 'LTCEUR',\r\n ETHEUR: 'ETHEUR',\r\n XRPEUR: 'XRPEUR',\r\n BCHEUR: 'BCHEUR',\r\n LTCBTC: 'LTCBTC',\r\n ETHBTC: 'ETHBTC',\r\n XRPBTC: 'XRPBTC',\r\n BCHBTC: 'BCHBTC',\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 TextAlign {\r\n left = 'left',\r\n right = 'right',\r\n center = 'center',\r\n start = 'start',\r\n end = 'end',\r\n}\r\n\r\nexport enum TextBaseline {\r\n top = 'top',\r\n hanging_dont_use = 'hanging', // not supported - https://github.com/Automattic/node-canvas/wiki/Compatibility-Status#text-styles\r\n middle = 'middle',\r\n alphabetic = 'alphabetic',\r\n ideographic_dont_use = 'ideographic', // not supported - https://github.com/Automattic/node-canvas/wiki/Compatibility-Status#text-styles\r\n bottom = 'bottom',\r\n}\r\n\r\nexport enum ScaleType {\r\n Linear = 'linear',\r\n Percentage = 'percentage',\r\n Logarithmic = 'logarithmic',\r\n}\r\n\r\nexport enum QuotePollingIntervalInMs {\r\n Default = 2000,\r\n Free = 180000,\r\n Elite = Default,\r\n EliteStocksReduced = 60000,\r\n}\r\n\r\nexport const EXTRA_MARKET_BUFFER_MINUTES = 30\r\n\r\nexport const ScaleLabel = {\r\n [ScaleType.Linear]: 'Linear',\r\n [ScaleType.Percentage]: 'Percentage',\r\n [ScaleType.Logarithmic]: 'Logarithmic',\r\n}\r\n\r\nexport const PANE_HEIGHT_DEFAULT = {\r\n chart: 400,\r\n indicator: 120,\r\n}\r\n\r\nexport const INDICATOR_LABEL_HEIGHT = 24\r\n\r\nexport const MOBILE_BARS_TO_VIEW = 150 // 5 months of daily bars\r\n\r\nexport const MOBILE_VIEW_BREAKPOINT_WIDTH = 768\r\n\r\nexport const FREE_DATE_RANGES = ['m1', 'm3', 'm6', 'ytd', 'y1', 'y2', 'y5', 'max']\r\n\r\nexport const getTimeframeLabel = (timeframe: string) => {\r\n switch (timeframe) {\r\n case TIMEFRAME.i1:\r\n return '1 MIN'\r\n case TIMEFRAME.i2:\r\n return '2 MIN'\r\n case TIMEFRAME.i3:\r\n return '3 MIN'\r\n case TIMEFRAME.i5:\r\n return '5 MIN'\r\n case TIMEFRAME.i10:\r\n return '10 MIN'\r\n case TIMEFRAME.i15:\r\n return '15 MIN'\r\n case TIMEFRAME.i30:\r\n return '30 MIN'\r\n case TIMEFRAME.h:\r\n return '1 HR'\r\n case TIMEFRAME.h2:\r\n return '2 HR'\r\n case TIMEFRAME.h4:\r\n return '4 HR'\r\n case TIMEFRAME.d:\r\n return 'DAILY'\r\n case TIMEFRAME.w:\r\n return 'WEEKLY'\r\n case TIMEFRAME.m:\r\n return 'MONTHLY'\r\n default:\r\n return ''\r\n }\r\n}\r\n\r\nexport type ChartsPageQueryParams = {\r\n p: string\r\n t: string\r\n l: string\r\n r?: string\r\n i?: string\r\n sidebar?: string\r\n}\r\n\r\nexport type QuotePageQueryParams = {\r\n p?: string\r\n t: string\r\n r?: string\r\n i?: string\r\n ty?: QuotePageQueryChartTypes\r\n}\r\n\r\nexport enum QuotePageQueryChartTypes {\r\n l = 'l',\r\n c = 'c',\r\n cs = 'cs',\r\n hc = 'hc',\r\n ha = 'ha',\r\n o = 'o',\r\n p = 'p',\r\n}\r\n\r\nexport type ChartsOrQuotePageQueryParams = ChartsPageQueryParams | QuotePageQueryParams\r\n\r\nexport enum MacroTimeframe {\r\n // seconds = 'seconds',\r\n minutes = 'minutes',\r\n hours = 'hours',\r\n days = 'days',\r\n weeks = 'weeks',\r\n months = 'months',\r\n}\r\n\r\nexport const MicroMacroTimeframe = {\r\n [TIMEFRAME.i1]: {\r\n micro: 1,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i2]: {\r\n micro: 2,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i3]: {\r\n micro: 3,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i5]: {\r\n micro: 5,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i10]: {\r\n micro: 10,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i15]: {\r\n micro: 15,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i30]: {\r\n micro: 30,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.h]: {\r\n micro: 1,\r\n macro: MacroTimeframe.hours,\r\n },\r\n [TIMEFRAME.h2]: {\r\n micro: 2,\r\n macro: MacroTimeframe.hours,\r\n },\r\n [TIMEFRAME.h4]: {\r\n micro: 4,\r\n macro: MacroTimeframe.hours,\r\n },\r\n [TIMEFRAME.d]: {\r\n micro: 1,\r\n macro: MacroTimeframe.days,\r\n },\r\n [TIMEFRAME.w]: {\r\n micro: 1,\r\n macro: MacroTimeframe.weeks,\r\n },\r\n [TIMEFRAME.m]: {\r\n micro: 1,\r\n macro: MacroTimeframe.months,\r\n },\r\n}\r\n\r\nexport const MicroTimeframeRange = (Object.keys(MicroMacroTimeframe) as TIMEFRAME[]).reduce(\r\n (prev, curr) => ({\r\n ...prev,\r\n [MicroMacroTimeframe[curr].macro]: prev[MicroMacroTimeframe[curr].macro]\r\n ? [...prev[MicroMacroTimeframe[curr].macro], MicroMacroTimeframe[curr].micro]\r\n : [MicroMacroTimeframe[curr].micro],\r\n }),\r\n {} as { [key in MacroTimeframe]: number[] }\r\n)\r\n\r\ntype IRange = {\r\n from?: number\r\n to?: number\r\n}\r\n\r\nexport type IVisibility = {\r\n [key in MacroTimeframe]?: IRange\r\n}\r\n\r\nexport enum SetVisibilityTo {\r\n currentAndAbove,\r\n currentAndBelow,\r\n currentOnly,\r\n all,\r\n}\r\n\r\nexport const QUOTE_FETCH_EVENT = 'quoteFetchEvent'\r\n\r\n// Keep in sync with the clone in Website repo in shared/is-stock-fast-refresh-available.ts\r\nexport const PREMARKET_AFTERMARKET_HOURS = 2.5\r\n\r\nexport const CHART_ELEMENT_ID = 'chart'\r\n\r\nexport const CHART_SETTINGS_DIALOG_TEST_ID = 'chart-settings-dialog'\r\n","import {\r\n MOBILE_VIEW_BREAKPOINT_WIDTH,\r\n PREMARKET_AFTERMARKET_HOURS,\r\n SpecificChartFunctionality,\r\n} from './constants/common'\r\nimport { captureException, getIsSSr } from './utils/helpers'\r\n\r\nexport { getSanitizedTicker } from './utils/ticker-sanitizer'\r\n\r\nfunction getIsDstInNy(date: Date) {\r\n const dayNumber = date.getDate()\r\n const monthIndex = date.getMonth()\r\n const dayOfWeek = date.getDay()\r\n const previousSunday = dayNumber - dayOfWeek\r\n if (monthIndex < 2 || monthIndex > 10) {\r\n return false\r\n }\r\n if (monthIndex > 2 && monthIndex < 10) {\r\n return true\r\n }\r\n return monthIndex === 2 ? previousSunday >= 8 : previousSunday <= 0\r\n}\r\n\r\nclass Utils {\r\n static min(...args: T[]): number {\r\n if (typeof args[0] === 'number') {\r\n return args[0] < +args[1] ? args[0] : (args[1] as number)\r\n }\r\n let min = args[0][0]\r\n for (const arg of args) {\r\n for (const el of arg as number[]) {\r\n if (el < min) {\r\n min = el\r\n }\r\n }\r\n }\r\n return min\r\n }\r\n\r\n static max(...args: T[]): number {\r\n if (typeof args[0] === 'number') {\r\n return args[0] > +args[1] ? args[0] : (args[1] as number)\r\n }\r\n let max = args[0][0]\r\n for (const arg of args) {\r\n for (const el of arg as number[]) {\r\n if (el > max) {\r\n max = el\r\n }\r\n }\r\n }\r\n return max\r\n }\r\n\r\n static minMax(...args: number[][]) {\r\n let max\r\n let min = (max = args[0][0] as number)\r\n for (const arg of args) {\r\n for (const el of arg) {\r\n if (el < min) {\r\n min = el\r\n }\r\n if (el > max) {\r\n max = el\r\n }\r\n }\r\n }\r\n return [min, max]\r\n }\r\n\r\n static getScaleRatio() {\r\n return (typeof window !== 'undefined' && window.devicePixelRatio) || 1\r\n }\r\n\r\n static setSizeOnCanvasElement({\r\n canvasElement,\r\n width,\r\n height,\r\n ratio = Utils.getScaleRatio(),\r\n }: {\r\n canvasElement: HTMLCanvasElement | null\r\n width: number\r\n height: number\r\n ratio?: number\r\n }) {\r\n if (canvasElement) {\r\n canvasElement.width = width * ratio\r\n canvasElement.height = height * ratio\r\n canvasElement.style.width = width + 'px'\r\n canvasElement.style.height = height + 'px'\r\n }\r\n }\r\n\r\n static getQuoteDateTimestampOffsetInSeconds(referenceDate?: Date) {\r\n const date = referenceDate || new Date()\r\n const dateAsNY = new Date(\r\n date.getUTCFullYear(),\r\n date.getUTCMonth(),\r\n date.getUTCDate(),\r\n date.getUTCHours() - 5,\r\n date.getUTCMinutes(),\r\n date.getUTCSeconds()\r\n )\r\n const isDst = getIsDstInNy(dateAsNY)\r\n return (isDst ? 4 : 5) * 60 * 60\r\n }\r\n\r\n static convertLocalToNyTime(referenceDate: Date, addOffset: boolean) {\r\n const date = new Date(referenceDate)\r\n const quoteDateTimeOffsetInMs = Utils.getQuoteDateTimestampOffsetInSeconds(date) * 1000\r\n const localTimeOffsetInMs = date.getTimezoneOffset() * 60 * 1000\r\n const offsetDirectionCoefficient = addOffset ? 1 : -1\r\n date.setTime(date.getTime() + (localTimeOffsetInMs - quoteDateTimeOffsetInMs) * offsetDirectionCoefficient)\r\n return date\r\n }\r\n\r\n // Keep in sync with the clone in Website repo in shared/isStockFastRefreshAvailable.ts\r\n static isStockFastRefreshAvailable(hasPremarket = true, hasAftermarket = true, bufferMinutes = 30) {\r\n const MARKET_START = { hours: 9, minutes: 30 }\r\n const MARKET_END = { hours: 16, minutes: 0 }\r\n const getMinutes = ({ hours, minutes }: { hours: number; minutes: number }) => hours * 60 + minutes\r\n\r\n const date = convertLocalToNyTime(new Date(), true)\r\n const dayOfWeek = date.getDay()\r\n const currentDayMinutes = date.getHours() * 60 + date.getMinutes()\r\n\r\n const premarketMinutes = hasPremarket ? PREMARKET_AFTERMARKET_HOURS * 60 : 0\r\n const aftermarketMinutes = hasAftermarket ? PREMARKET_AFTERMARKET_HOURS * 60 : 0\r\n\r\n const isWeekend = dayOfWeek === 0 || dayOfWeek === 6\r\n const isOpen = getMinutes(MARKET_START) - premarketMinutes - bufferMinutes <= currentDayMinutes\r\n const isClosed = getMinutes(MARKET_END) + aftermarketMinutes + bufferMinutes <= currentDayMinutes\r\n return !isWeekend && isOpen && !isClosed\r\n }\r\n\r\n static dateFromUnixTimestamp(timestamp: number) {\r\n /*\r\n * Passing 0 as a param is needed in order to setUTCSeconds work properly.\r\n * The function adds seconds to the date instance if it exceeds 60.\r\n * For more info see the docs https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCSeconds\r\n * */\r\n const date = new Date(0)\r\n date.setUTCSeconds(timestamp)\r\n return Utils.convertLocalToNyTime(date, true)\r\n }\r\n\r\n static dateStringFromDate(date: Date) {\r\n return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(\r\n 2,\r\n '0'\r\n )}`\r\n }\r\n\r\n static dateFromDateString(dateString: string) {\r\n const [yyyy, mm, dd] = dateString.split('-')\r\n\r\n const date = new Date(Number.parseInt(yyyy), Number.parseInt(mm) - 1, Number.parseInt(dd))\r\n if (Number.isNaN(date.getTime())) {\r\n captureException(new Error('Invalid Date'), { extra: { date, dateString } })\r\n }\r\n\r\n return date\r\n }\r\n\r\n static isMobile(testTouchPoints?: boolean) {\r\n if (getIsSSr()) return false\r\n let isMobileOs = false\r\n\r\n // New iOS versions no longer report iPad in user agent\r\n if (navigator.userAgent.indexOf('Macintosh') > -1) {\r\n try {\r\n document.createEvent('TouchEvent')\r\n isMobileOs = true\r\n } catch {}\r\n } else {\r\n isMobileOs = !!navigator.userAgent.match(\r\n /\\b(Android|webOS|i(?:Phone|Pad|Pod)|BlackBerry|Windows (?:Phone|Mobile))\\b/i\r\n )\r\n }\r\n\r\n if (testTouchPoints) {\r\n try {\r\n return (\r\n isMobileOs &&\r\n (window.navigator.msMaxTouchPoints ||\r\n window.navigator.maxTouchPoints ||\r\n 'ontouchstart' in document.createElement('div'))\r\n )\r\n } catch {}\r\n }\r\n\r\n return isMobileOs\r\n }\r\n\r\n static isIPad() {\r\n const matchesIPad = navigator.userAgent.match(/iPad/i)\r\n const matchesIPhone = navigator.userAgent.match(/iPhone/i)\r\n const matchesIPod = navigator.userAgent.match(/iPod/i)\r\n const matchesIOSLike = navigator.userAgent.match(/Mac/) && navigator.maxTouchPoints > 0\r\n\r\n return (matchesIOSLike && !matchesIPhone && !matchesIPod) || matchesIPad\r\n }\r\n\r\n static getCookie(name: string) {\r\n const re = new RegExp('(?:(?:^|.*;\\\\s*)' + name + '\\\\s*\\\\=\\\\s*([^;]*).*$)|^.*$')\r\n return document.cookie.replace(re, '$1')\r\n }\r\n\r\n static setCookie(name: string, value: string, expires: Date) {\r\n let cookie = name + '=' + value + '; expires=' + expires.toUTCString()\r\n if (document.location.hostname !== 'localhost') {\r\n cookie += '; domain=.finviz.com'\r\n }\r\n document.cookie = cookie\r\n }\r\n}\r\n\r\nexport default Utils\r\nexport const convertLocalToNyTime = Utils.convertLocalToNyTime\r\nexport const dateFromUnixTimestamp = Utils.dateFromUnixTimestamp\r\nexport const dateStringFromDate = Utils.dateStringFromDate\r\nexport const dateFromDateString = Utils.dateFromDateString\r\n\r\nexport function getFullscreenStatus(): boolean {\r\n return (\r\n document.fullscreenElement ??\r\n document.webkitFullscreenElement ??\r\n document.mozFullScreenElement ??\r\n document.msFullscreenElement ??\r\n false\r\n )\r\n}\r\n\r\nexport function getRequestFullscreen(element: HTMLElement) {\r\n return (\r\n element.requestFullscreen ??\r\n element.webkitRequestFullScreen ??\r\n element.mozRequestFullScreen ??\r\n element.msRequestFullscreen\r\n )\r\n}\r\n\r\nexport function getExitFullscreen() {\r\n return (\r\n document.exitFullscreen ?? document.webkitExitFullscreen ?? document.mozExitFullScreen ?? document.msExitFullscreen\r\n )\r\n}\r\n\r\nexport function ready(fn: () => void) {\r\n if (document.readyState !== 'loading') {\r\n fn()\r\n return\r\n }\r\n\r\n document.addEventListener('DOMContentLoaded', fn)\r\n}\r\n\r\nexport function getChartsDimensions(chartElementId: string) {\r\n const PADDING = 2 // Border widths\r\n const containerElement = document.getElementById(chartElementId)\r\n\r\n const box = containerElement?.getBoundingClientRect()\r\n\r\n return {\r\n width: Math.max((box?.width ?? 0) - PADDING, 0),\r\n height: Math.max((box?.height ?? 0) - PADDING, 0),\r\n }\r\n}\r\n\r\nexport function getIsMobileScreenSize() {\r\n return window.innerWidth < MOBILE_VIEW_BREAKPOINT_WIDTH\r\n}\r\n\r\nexport function getIsMobilePortrait(isMobile?: boolean) {\r\n if (isMobile ?? Utils.isMobile()) {\r\n return window.orientation % 180 === 0\r\n }\r\n return false\r\n}\r\n\r\nexport function numberToStringWithUnitsSuffix(value: number) {\r\n let suffix = ''\r\n if (value >= 1000000000) {\r\n value /= 1000000000\r\n suffix = 'B'\r\n } else if (value >= 1000000) {\r\n value /= 1000000\r\n suffix = 'M'\r\n } else if (value >= 1000) {\r\n value /= 1000\r\n suffix = 'K'\r\n }\r\n\r\n return value.toFixed(2) + suffix\r\n}\r\n\r\nexport function isRedesignEnabled() {\r\n return typeof window !== 'undefined' && window.FinvizSettings?.hasRedesignEnabled\r\n}\r\n\r\nexport function isRedesignedPage(\r\n obj: { specificChartFunctionality?: SpecificChartFunctionality | null },\r\n matchingPages = [\r\n SpecificChartFunctionality.forexPage,\r\n SpecificChartFunctionality.futuresPage,\r\n SpecificChartFunctionality.cryptoPage,\r\n ]\r\n) {\r\n const isQuotePage = obj.specificChartFunctionality === SpecificChartFunctionality.quotePage\r\n const isQuoteFinancials = obj.specificChartFunctionality === SpecificChartFunctionality.quoteFinancials\r\n\r\n return (\r\n (isRedesignEnabled() && matchingPages.includes(obj.specificChartFunctionality!)) ||\r\n // Legacy design on quote uses redesigned elements (page header + chart controls)\r\n isQuotePage ||\r\n isQuoteFinancials\r\n )\r\n}\r\n","import { EmptyObject, ObjectHash } from '../../types/shared'\r\n\r\nexport function getRoundedString({ number, numOfDecimalPlaces }: { number: number; numOfDecimalPlaces: number }) {\r\n const precision = Math.pow(10, numOfDecimalPlaces)\r\n return String(Math.round(number * precision) / precision)\r\n}\r\n\r\nexport function getIsSSr() {\r\n return typeof process !== 'undefined' && !!process?.env.IS_OFFSCREEN_RENDERER\r\n}\r\n\r\nexport function isValidHexColor(color: string) {\r\n const regex = /^#([\\da-f]{3}){1,2}$|^#([\\da-f]{4}){1,2}$/i\r\n return !!color && regex.test(color)\r\n}\r\n\r\nexport function getParsedIntegersFromPeriodString(periodString: string) {\r\n const periodParts = periodString.split(',')\r\n return periodParts.map((part) => Number.parseInt(part, 10))\r\n}\r\n\r\nexport function captureException(exception: Error, captureContext?: { extra: ObjectHash }) {\r\n if (process.env.NODE_ENV === 'development' || process.env.IS_E2E_TESTING) {\r\n console.error(exception)\r\n } else if (process.env.IS_OFFSCREEN_RENDERER) {\r\n import('@sentry/node').then((client) => {\r\n client.captureException(exception, captureContext)\r\n })\r\n } else {\r\n window.Sentry.captureException(exception, captureContext)\r\n }\r\n}\r\n\r\nexport function isPositiveFloat(value: string | number) {\r\n const parsedNumber = Number.parseFloat(`${value}`)\r\n return !Number.isNaN(parsedNumber) && isFinite(parsedNumber) && parsedNumber > 0\r\n}\r\n\r\nexport function isPositiveInteger(value: string | number) {\r\n const string = `${value}`\r\n return isPositiveFloat(value) && Number.parseInt(string, 10) === Number.parseFloat(string)\r\n}\r\n\r\nexport function isInRange({\r\n value,\r\n min = Number.MIN_SAFE_INTEGER,\r\n max = Number.MAX_SAFE_INTEGER,\r\n}: {\r\n value: string | number\r\n min?: number\r\n max?: number\r\n}) {\r\n const parsedNumber = Number.parseFloat(`${value}`)\r\n return !Number.isNaN(parsedNumber) && parsedNumber >= min && parsedNumber <= max\r\n}\r\n\r\nexport function tryJsonParse(json: string | null = '') {\r\n try {\r\n return JSON.parse(json ?? '') as Result\r\n } catch {\r\n return null\r\n }\r\n}\r\n\r\nexport function getValueInRange({ value, min, max }: { value: number; min: number; max: number }) {\r\n return Math.min(Math.max(value, min), max)\r\n}\r\n\r\nexport function isPrimaryClick(e: React.Touch | React.TouchEvent | React.MouseEvent) {\r\n // cypress trigger mouseevent has button: undefined if button option isn't explicitly specified\r\n // as cy.get('.target').trigger('mousedown', { button: 0 })\r\n if (e.hasOwnProperty('button') && (e as unknown as MouseEvent).button !== undefined) {\r\n return (e as unknown as MouseEvent).button === 0\r\n } else {\r\n return true\r\n }\r\n}\r\n\r\n// this function is used to fix the issue with circular reference when stringifying an object using JSON.stringify\r\nexport function getJSONReplacerFunc() {\r\n const visited = new WeakSet()\r\n return (key: string, value: any) => {\r\n if (typeof value === 'object' && value !== null) {\r\n if (visited.has(value)) {\r\n return\r\n }\r\n visited.add(value)\r\n }\r\n return value\r\n }\r\n}\r\n\r\n// This is a duplicate from Website repo which is accessible on window.FLibs but this doesn't work on SSR charts\r\nexport const formatDateToStringUS = (date: Date, options?: Intl.DateTimeFormatOptions | undefined) =>\r\n date.toLocaleDateString('en-US', {\r\n day: '2-digit',\r\n month: '2-digit',\r\n year: 'numeric',\r\n ...options,\r\n })\r\n\r\n// randomUUID source: https://stackoverflow.com/questions/105034/how-do-i-create-a-guid-uuid/2117523#2117523\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// duplicate from Website/js/main/util.ts, to be refactored\r\nexport function getEarningsDateSuffix(date: Date) {\r\n const hours = date.getHours()\r\n\r\n if (hours <= 9) {\r\n return 'BMO'\r\n } else if (hours >= 16) {\r\n return 'AMC'\r\n }\r\n\r\n return ''\r\n}\r\n\r\nexport function isValidTickerString(ticker: string) {\r\n const regex = /^@?[a-z0-9](?:[a-z0-9]*[-_]?[a-z0-9]+)?$/\r\n return regex.test(ticker.toLowerCase())\r\n}\r\n"],"names":["FONT_SIZE","XXS","XS","S","M","L","XXL","XXXL","LINE_HEIGHT","PADDING","XXXS","MARGIN","CHART_MARGIN","XL","SETTINGS_HEIGHT","TICKER_TIMEFRAME_CHANGE_HEIGHT","OFFSET","MONTHS","ChartEditorEnum","LayoutType","CanvasElementType","ChartElementType","IndicatorType","OverlayType","ChartEventDbType","ChartEventType","ChartEventBadgeType","ChartEventLabels","Dividends","Split","EarningsPositive","EarningsNegative","EarningsNeutral","EarningsFuture","LAYOUTS","columns","rows","count","gridAreas","SORT_DIRECTION","ASC","DESC","TIMEFRAME","TIMEFRAMES_WITH_PRE_MARKET","i1","i2","i3","i5","IntradayTimeframeInterval","i10","i15","i30","h","h2","h4","TimeframeLabelShort","d","w","m","DateRangeType","QuoteFinancialAttachment","TIMEFRAME_SECONDS","CRYPTOS","BTCUSD","LTCUSD","ETHUSD","XRPUSD","BCHUSD","BTCEUR","LTCEUR","ETHEUR","XRPEUR","BCHEUR","LTCBTC","ETHBTC","XRPBTC","BCHBTC","SpecificChartFunctionality","TextAlign","TextBaseline","ScaleType","QuotePollingIntervalInMs","EXTRA_MARKET_BUFFER_MINUTES","ScaleLabel","Linear","Percentage","Logarithmic","PANE_HEIGHT_DEFAULT","chart","indicator","INDICATOR_LABEL_HEIGHT","MOBILE_BARS_TO_VIEW","MOBILE_VIEW_BREAKPOINT_WIDTH","FREE_DATE_RANGES","getTimeframeLabel","timeframe","QuotePageQueryChartTypes","MacroTimeframe","MicroMacroTimeframe","micro","macro","minutes","hours","days","weeks","months","MicroTimeframeRange","Object","keys","reduce","prev","curr","SetVisibilityTo","QUOTE_FETCH_EVENT","PREMARKET_AFTERMARKET_HOURS","CHART_ELEMENT_ID","CHART_SETTINGS_DIALOG_TEST_ID","Utils","min","_len","arguments","length","args","Array","_key","arg","el","max","_len2","_key2","minMax","_len3","_key3","getScaleRatio","window","devicePixelRatio","setSizeOnCanvasElement","_ref","canvasElement","width","height","ratio","style","getQuoteDateTimestampOffsetInSeconds","referenceDate","date","Date","dayNumber","getDate","monthIndex","getMonth","previousSunday","getDay","getIsDstInNy","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","convertLocalToNyTime","addOffset","quoteDateTimeOffsetInMs","localTimeOffsetInMs","getTimezoneOffset","offsetDirectionCoefficient","setTime","getTime","isStockFastRefreshAvailable","hasPremarket","undefined","hasAftermarket","bufferMinutes","getMinutes","_ref2","dayOfWeek","currentDayMinutes","getHours","premarketMinutes","aftermarketMinutes","isWeekend","isOpen","isClosed","dateFromUnixTimestamp","timestamp","setUTCSeconds","dateStringFromDate","getFullYear","String","padStart","dateFromDateString","dateString","yyyy","mm","dd","split","Number","parseInt","isNaN","captureException","Error","extra","isMobile","testTouchPoints","getIsSSr","isMobileOs","navigator","userAgent","indexOf","document","createEvent","match","msMaxTouchPoints","maxTouchPoints","createElement","isIPad","matchesIPad","matchesIPhone","matchesIPod","getCookie","name","re","RegExp","cookie","replace","setCookie","value","expires","toUTCString","location","hostname","getFullscreenStatus","fullscreenElement","webkitFullscreenElement","mozFullScreenElement","msFullscreenElement","getRequestFullscreen","element","requestFullscreen","webkitRequestFullScreen","mozRequestFullScreen","msRequestFullscreen","getExitFullscreen","exitFullscreen","webkitExitFullscreen","mozExitFullScreen","msExitFullscreen","ready","fn","readyState","addEventListener","getChartsDimensions","chartElementId","containerElement","getElementById","box","getBoundingClientRect","Math","getIsMobileScreenSize","innerWidth","getIsMobilePortrait","orientation","numberToStringWithUnitsSuffix","suffix","toFixed","isRedesignEnabled","FinvizSettings","hasRedesignEnabled","isRedesignedPage","obj","matchingPages","forexPage","futuresPage","cryptoPage","isQuotePage","specificChartFunctionality","quotePage","isQuoteFinancials","quoteFinancials","includes","getRoundedString","number","numOfDecimalPlaces","precision","pow","round","process","getParsedIntegersFromPeriodString","periodString","map","part","exception","captureContext","Sentry","isPositiveFloat","parsedNumber","parseFloat","isFinite","isPositiveInteger","string","isInRange","MIN_SAFE_INTEGER","MAX_SAFE_INTEGER","getValueInRange","_ref3","isPrimaryClick","e","hasOwnProperty","button","getJSONReplacerFunc","visited","WeakSet","key","has","add","formatDateToStringUS","options","toLocaleDateString","day","month","year","getUuid","crypto","randomUUID","substring","c","getRandomValues","Uint8Array","toString","getEarningsDateSuffix"],"sourceRoot":""}