{"version":3,"file":"options.bb4acb9c.js","mappings":"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","sources":["webpack://@finviz/website/./js/main/components/ChipSwitch.tsx","webpack://@finviz/website/./js/main/components/SubMenu/SubMenu.tsx","webpack://@finviz/website/./js/main/components/SubMenu/SubMenuTabs.tsx","webpack://@finviz/website/./js/main/hooks/use-sticky-shadow.ts","webpack://@finviz/website/./js/main/modules/options/components/StickyShadow.tsx","webpack://@finviz/website/./js/main/modules/options/constants/columns.tsx","webpack://@finviz/website/./js/main/modules/options/constants/common.ts","webpack://@finviz/website/./js/main/modules/quote/components/QuoteOptionsTabMenu.tsx","webpack://@finviz/website/./js/main/modules/options/components/OptionsViewSwitcher.tsx","webpack://@finviz/website/./js/main/modules/options/hooks/useOptionsQuery.ts","webpack://@finviz/website/./js/main/modules/options/components/PriceRow.tsx","webpack://@finviz/website/./js/main/modules/options/components/TableColumn.tsx","webpack://@finviz/website/./js/main/modules/options/components/ChainTable.tsx","webpack://@finviz/website/./js/main/modules/options/utils/options.ts","webpack://@finviz/website/./js/main/modules/options/components/FilterSelect.tsx","webpack://@finviz/website/./js/main/modules/options/components/DateFilter.tsx","webpack://@finviz/website/./js/main/modules/options/components/StrikeFilter.tsx","webpack://@finviz/website/./js/main/modules/options/components/ViewFooter.tsx","webpack://@finviz/website/./js/main/modules/options/hooks/useOptionsSortChange.ts","webpack://@finviz/website/./js/main/modules/options/hooks/useOptionsSortOrder.ts","webpack://@finviz/website/./js/main/modules/options/routes/ChainRoute.tsx","webpack://@finviz/website/./js/main/modules/options/components/OptionsTable.tsx","webpack://@finviz/website/./js/main/modules/options/routes/ListRoute.tsx","webpack://@finviz/website/./js/main/modules/options/routes/PlotRoute.tsx","webpack://@finviz/website/./js/main/modules/options/index.tsx","webpack://@finviz/website/./js/main/modules/options/types.tsx","webpack://@finviz/website/./js/main/modules/options/utils/query.ts","webpack://@finviz/website/./js/main/modules/quote/components/QuoteStickySubMenu.tsx","webpack://@finviz/website/../node_modules/core-js/modules/es.array.find-last-index.js"],"sourcesContent":["import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Button, ButtonComponentProps, ButtonProps } from './button'\r\nimport { Paragraph } from './typography'\r\n\r\ninterface Props {\r\n children: (React.ReactElement | null)[]\r\n label?: string\r\n size?: ButtonProps['size']\r\n rounding?: ButtonProps['rounding']\r\n}\r\n\r\nexport function ChipSwitch({ children, label, size, rounding }: Props) {\r\n return (\r\n
\r\n {label && (\r\n \r\n {label}\r\n \r\n )}\r\n\r\n {React.Children.map(children, (child: React.ReactElement | null) => {\r\n if (React.isValidElement(child) && child.type === Button) {\r\n return React.cloneElement(child, {\r\n size,\r\n rounding,\r\n theme: child.props.theme ?? 'chipTransparent',\r\n className: classnames(child.props.className, {\r\n // @todo - these style should be applied globally onto all chipTransparent buttons\r\n '!text-gray-600 dark:!text-gray-400': !child.props.active,\r\n '!text-gray-800 dark:!text-white': child.props.active,\r\n }),\r\n })\r\n }\r\n\r\n return child\r\n })}\r\n
\r\n )\r\n}\r\n\r\nexport const ChipSwitchButton = Button\r\n","import classNames from 'classnames'\r\nimport { isRedesignEnabled } from 'finviz-charts/app/utils'\r\nimport * as React from 'react'\r\n\r\ninterface Props extends React.HTMLProps {\r\n leftContent?: React.ReactNode\r\n middleContent?: React.ReactNode\r\n rightContent?: React.ReactNode\r\n}\r\n\r\nexport function SubMenu({ leftContent, middleContent, rightContent, ...props }: Props) {\r\n return (\r\n
\r\n
\r\n \r\n {leftContent}\r\n
\r\n {middleContent &&
{middleContent}
}\r\n
{rightContent}
\r\n
\r\n \r\n )\r\n}\r\n","import { Link } from 'react-router-dom'\r\n\r\nimport { Button, ButtonSizeType } from '../button'\r\n\r\ninterface Props {\r\n items: Array<{ label: string; href: string; isActive: boolean; reloadDocument?: boolean }>\r\n size?: ButtonSizeType\r\n}\r\n\r\nexport function SubMenuTabs({ items, size = 'medium' }: Props) {\r\n return (\r\n
\r\n {items.map(({ label, href, isActive, reloadDocument }) => (\r\n \r\n {label}\r\n \r\n ))}\r\n
\r\n )\r\n}\r\n","import throttle from 'lodash.throttle'\r\nimport * as React from 'react'\r\n\r\nexport function useStickyShadow() {\r\n const stickyRef = React.useRef(null)\r\n const [isSticky, setIsSticky] = React.useState(false)\r\n\r\n React.useEffect(() => {\r\n if (!stickyRef.current) return\r\n\r\n const onScroll = throttle(function () {\r\n const stickyElement = stickyRef.current\r\n if (!stickyElement) return\r\n\r\n const elementStickyTopOffset = parseFloat(getComputedStyle(stickyElement).top)\r\n const elementCurrentTopOffset = stickyElement.getBoundingClientRect().top\r\n\r\n setIsSticky(elementCurrentTopOffset === elementStickyTopOffset)\r\n }, 100)\r\n\r\n onScroll()\r\n document.addEventListener('scroll', onScroll)\r\n\r\n return () => {\r\n document.removeEventListener('scroll', onScroll)\r\n }\r\n }, [])\r\n\r\n return React.useMemo(\r\n () => ({\r\n stickyRef,\r\n isSticky,\r\n }),\r\n [isSticky]\r\n )\r\n}\r\n","import classNames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { useStickyShadow } from '../../../hooks/use-sticky-shadow'\r\n\r\nexport function StickyShadow(props: React.HTMLProps) {\r\n const { stickyRef, isSticky } = useStickyShadow()\r\n\r\n return (\r\n
\r\n \r\n
\r\n )\r\n}\r\n","import { formatDate } from '../../../../app/header/utils'\r\nimport { RedGreenText } from '../../../components/RedGreenText'\r\nimport { TableAlign } from '../../../components/Table'\r\nimport { formatNumber } from '../../../util'\r\nimport { ColumnId, RowKind, TableColumnDefinition } from '../types'\r\nimport { DATE_FORMAT_INT, DATE_FORMAT_VIEW, DATE_FORMAT_VIEW_LONG } from './common'\r\n\r\nconst NULL_VALUE = '-'\r\nconst FORMAT_SETTINGS = { defaultValue: NULL_VALUE }\r\nconst GREEK_SETTINGS = { defaultValue: NULL_VALUE, fractions: 4 }\r\n\r\nexport const columnMap: Record = Object.freeze({\r\n [ColumnId.LastClose]: {\r\n id: ColumnId.LastClose,\r\n align: TableAlign.Right,\r\n name: 'Last Close',\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n return args.row.lastClose === 0 ? NULL_VALUE : formatNumber(args.row.lastClose, FORMAT_SETTINGS)\r\n },\r\n },\r\n [ColumnId.ChangeUsd]: {\r\n id: ColumnId.ChangeUsd,\r\n align: TableAlign.Right,\r\n name: 'Change $',\r\n getValueForSort: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n if (args.row.lastClose === 0) return null\r\n return args.row.lastChange\r\n },\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n if (args.row.lastClose === 0) return NULL_VALUE\r\n\r\n return (\r\n \r\n {formatNumber(args.row.lastChange, { ...FORMAT_SETTINGS, showPlusSign: true })}\r\n \r\n )\r\n },\r\n },\r\n [ColumnId.ChangePct]: {\r\n id: ColumnId.ChangePct,\r\n align: TableAlign.Right,\r\n name: 'Change %',\r\n getValueForSort: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n if (typeof args.row.lastClose !== 'number' || args.row.lastClose === 0) return null\r\n const prevClose = args.row.lastClose - args.row.lastChange\r\n return (args.row.lastClose / prevClose - 1) * 100\r\n },\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n if (typeof args.row.lastClose !== 'number' || args.row.lastClose === 0) return NULL_VALUE\r\n\r\n const prevClose = args.row.lastClose - args.row.lastChange\r\n const change = (args.row.lastClose / prevClose - 1) * 100\r\n\r\n return (\r\n \r\n {formatNumber(change, { ...FORMAT_SETTINGS, showPlusSign: true })}\r\n \r\n )\r\n },\r\n },\r\n [ColumnId.BidPrice]: {\r\n id: ColumnId.BidPrice,\r\n align: TableAlign.Right,\r\n name: 'Bid',\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n if (args.row.bidPrice === 0) return NULL_VALUE\r\n return formatNumber(args.row.bidPrice, FORMAT_SETTINGS)\r\n },\r\n },\r\n [ColumnId.AskPrice]: {\r\n id: ColumnId.AskPrice,\r\n align: TableAlign.Right,\r\n name: 'Ask',\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n if (args.row.askPrice === 0) return NULL_VALUE\r\n return formatNumber(args.row.askPrice, FORMAT_SETTINGS)\r\n },\r\n },\r\n [ColumnId.Volume]: {\r\n id: ColumnId.Volume,\r\n align: TableAlign.Right,\r\n name: 'Volume',\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n return formatNumber(args.row.lastVolume, { ...FORMAT_SETTINGS, fractions: 0 })\r\n },\r\n },\r\n [ColumnId.OpenInterest]: {\r\n id: ColumnId.OpenInterest,\r\n align: TableAlign.Right,\r\n name: 'Open Int.',\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n return formatNumber(args.row.openInterest, { ...FORMAT_SETTINGS, fractions: 0 })\r\n },\r\n },\r\n [ColumnId.StrikePrice]: {\r\n id: ColumnId.StrikePrice,\r\n align: TableAlign.Right,\r\n name: 'Strike',\r\n className: 'w-28',\r\n renderColumn: (args) => formatNumber(args.row.strike, FORMAT_SETTINGS),\r\n },\r\n [ColumnId.ExpirationDate]: {\r\n id: ColumnId.ExpirationDate,\r\n align: TableAlign.Right,\r\n name: 'Expiry',\r\n className: 'w-28',\r\n renderColumn: (args) => formatDate(args.row.exDate, DATE_FORMAT_INT, DATE_FORMAT_VIEW),\r\n },\r\n [ColumnId.ContractName]: {\r\n id: ColumnId.ContractName,\r\n align: TableAlign.Left,\r\n name: 'Contract Name',\r\n className: 'w-44',\r\n getValueForSort: (args) => `${args.ticker}${args.row.exDate}${args.row.strike}`,\r\n renderColumn: (args) => {\r\n if (!args.row) return NULL_VALUE\r\n const strike = (args.row.strike * 1000).toString().padStart(8, '0')\r\n\r\n return (\r\n \r\n {args.ticker?.replace('-', '')}\r\n {args.row.exDate}\r\n {args.kind === RowKind.Call ? 'C' : 'P'}\r\n {strike}\r\n \r\n )\r\n },\r\n },\r\n [ColumnId.LastTrade]: {\r\n id: ColumnId.LastTrade,\r\n align: TableAlign.Right,\r\n name: 'Last Trade',\r\n className: 'w-44',\r\n getValueForSort: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n return new Date(args.row.lastTime)\r\n },\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n if (args.row.lastClose === 0) return NULL_VALUE\r\n return formatDate(new Date(args.row.lastTime), DATE_FORMAT_VIEW_LONG)\r\n },\r\n },\r\n [ColumnId.IV]: {\r\n id: ColumnId.IV,\r\n align: TableAlign.Right,\r\n name: 'IV',\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n if (!args.row.iv) return NULL_VALUE\r\n return formatNumber(args.row.iv * 100, FORMAT_SETTINGS) + '%'\r\n },\r\n },\r\n [ColumnId.Delta]: {\r\n id: ColumnId.Delta,\r\n align: TableAlign.Right,\r\n name: 'Delta',\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n if (!args.row.delta) return NULL_VALUE\r\n return formatNumber(args.row.delta, GREEK_SETTINGS)\r\n },\r\n },\r\n [ColumnId.Gamma]: {\r\n id: ColumnId.Gamma,\r\n align: TableAlign.Right,\r\n name: 'Gamma',\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n if (!args.row.gamma) return NULL_VALUE\r\n return formatNumber(args.row.gamma, GREEK_SETTINGS)\r\n },\r\n },\r\n [ColumnId.Theta]: {\r\n id: ColumnId.Theta,\r\n align: TableAlign.Right,\r\n name: 'Theta',\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n if (!args.row.theta) return NULL_VALUE\r\n return formatNumber(args.row.theta, GREEK_SETTINGS)\r\n },\r\n },\r\n [ColumnId.Vega]: {\r\n id: ColumnId.Vega,\r\n align: TableAlign.Right,\r\n name: 'Vega',\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n if (!args.row.vega) return NULL_VALUE\r\n return formatNumber(args.row.vega, GREEK_SETTINGS)\r\n },\r\n },\r\n [ColumnId.Rho]: {\r\n id: ColumnId.Rho,\r\n align: TableAlign.Right,\r\n name: 'Rho',\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n if (!args.row.rho) return NULL_VALUE\r\n return formatNumber(args.row.rho, GREEK_SETTINGS)\r\n },\r\n },\r\n})\r\n","export const DATE_FORMAT_DB = 'yyyy-MM-dd'\r\nexport const DATE_FORMAT_INT = 'yyMMdd'\r\nexport const DATE_FORMAT_VIEW = 'MM/dd/yyyy'\r\nexport const DATE_FORMAT_VIEW_LONG = 'MMM dd, yyyy, hh:mm a'\r\nexport const DATE_FORMAT_SCATTER_PLOT = '%m/%d/%Y'\r\nexport const LINK_COLUMN_NAME = 'link'\r\n","import { decodeQueryString, encodeQueryString } from '../../../../app/queryString'\r\nimport { SubMenuTabs } from '../../../components/SubMenu/SubMenuTabs'\r\nimport { OptionsSubpage, OptionsView } from '../../options/types'\r\nimport { QuoteSubview } from '../types'\r\n\r\nconst OPTIONS_SECTION_LABELS = {\r\n [QuoteSubview.OptionsChain]: 'Prices',\r\n [QuoteSubview.OptionsVolatility]: 'Volatility & Greeks',\r\n}\r\n\r\nconst OPTIONS_MENU_TABS: Array = [\r\n QuoteSubview.OptionsChain,\r\n QuoteSubview.OptionsVolatility,\r\n]\r\n\r\nfunction getProperOV(ty: string, ov: string): string {\r\n if (ty === OptionsSubpage.Volatility && ov === OptionsView.Plot) {\r\n return OptionsView.ChainByDate\r\n }\r\n return ov\r\n}\r\n\r\nfunction getOptionsMenuTabs() {\r\n const searchParams = decodeQueryString()\r\n\r\n return OPTIONS_MENU_TABS.map((value) => ({\r\n label: OPTIONS_SECTION_LABELS[value],\r\n href: `/quote.ashx?${encodeQueryString({\r\n ...searchParams,\r\n ty: value,\r\n ov: getProperOV(value, searchParams.ov),\r\n })}`,\r\n isActive: searchParams.ty === value,\r\n reloadDocument: true,\r\n }))\r\n}\r\n\r\nexport function QuoteOptionsTabMenu() {\r\n return \r\n}\r\n","import * as React from 'react'\r\nimport { Link, useSearchParams } from 'react-router-dom'\r\n\r\nimport { ChipSwitch, ChipSwitchButton } from '../../../components/ChipSwitch'\r\nimport { OptionsQuery, OptionsSubpage, OptionsView } from '../types'\r\n\r\nexport function OptionsViewSwitcher({ activeView, subpage }: { activeView: OptionsView; subpage: OptionsSubpage }) {\r\n const [searchParams] = useSearchParams()\r\n\r\n const chainLink = React.useMemo(() => {\r\n const newParams = new URLSearchParams(searchParams)\r\n newParams.set(\r\n OptionsQuery.View,\r\n [OptionsView.ChainByStrike, OptionsView.ListByStrike].includes(newParams.get(OptionsQuery.View) as OptionsView)\r\n ? OptionsView.ChainByStrike\r\n : OptionsView.ChainByDate\r\n )\r\n return newParams\r\n }, [searchParams])\r\n\r\n const listLink = React.useMemo(() => {\r\n const newParams = new URLSearchParams(searchParams)\r\n newParams.set(\r\n OptionsQuery.View,\r\n [OptionsView.ChainByStrike, OptionsView.ListByStrike].includes(newParams.get(OptionsQuery.View) as OptionsView)\r\n ? OptionsView.ListByStrike\r\n : OptionsView.ListByDate\r\n )\r\n return newParams\r\n }, [searchParams])\r\n\r\n const plotLink = React.useMemo(() => {\r\n const newParams = new URLSearchParams(searchParams)\r\n newParams.set(OptionsQuery.View, OptionsView.Plot)\r\n newParams.delete(OptionsQuery.Strike)\r\n newParams.delete(OptionsQuery.Expiry)\r\n return newParams\r\n }, [searchParams])\r\n\r\n return (\r\n \r\n \r\n Chain\r\n \r\n \r\n List\r\n \r\n {subpage === OptionsSubpage.Prices ? (\r\n \r\n 3D\r\n \r\n ) : null}\r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { OptionsParsedQuery, parseOptionsQuery } from '../utils/query'\r\n\r\nexport function useOptionsQuery(params: URLSearchParams): OptionsParsedQuery {\r\n return React.useMemo(() => parseOptionsQuery(params), [params])\r\n}\r\n","import { getDate, getFormattedDateString } from '../../../../app/header/utils'\r\nimport { TableAlign, TableCell, TableRow } from '../../../components/Table'\r\nimport { formatNumber } from '../../../util'\r\n\r\ninterface PriceRowProps {\r\n /**\r\n * Price to show\r\n */\r\n lastClose: number | null\r\n\r\n /**\r\n * Date when the last price was valid to.\r\n *\r\n * @default current time\r\n */\r\n lastTime: number | null\r\n\r\n /**\r\n * Column span for the left column with date\r\n */\r\n leftSpan?: number\r\n\r\n /**\r\n * Column span for the right column, which is empty\r\n */\r\n rightSpan?: number\r\n\r\n priceAlign?: TableAlign\r\n\r\n /**\r\n * Show additional empty cells around lastClose cell\r\n */\r\n showAdditionalCells?: boolean\r\n}\r\n\r\nexport function PriceRow({\r\n lastClose,\r\n lastTime,\r\n leftSpan,\r\n rightSpan,\r\n priceAlign = TableAlign.Center,\r\n showAdditionalCells = true,\r\n}: PriceRowProps) {\r\n if (lastTime === null || lastClose === null) return null\r\n\r\n const date = getDate(lastTime * 1000)\r\n const formattedDate = getFormattedDateString(date, 'dateOnly')\r\n const formattedTime = getFormattedDateString(date, 'timeOnly')\r\n\r\n return (\r\n \r\n \r\n Price {formattedDate}{' '}\r\n {formattedTime} ET\r\n \r\n {showAdditionalCells && }\r\n \r\n {formatNumber(lastClose)}\r\n \r\n {showAdditionalCells && }\r\n \r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\n\r\nimport { TableCell, TableCellProps } from '../../../components/Table'\r\n\r\nexport interface OptionsTableCellProps extends TableCellProps {\r\n isHighlighted?: boolean\r\n isBorderVisible?: boolean\r\n}\r\n\r\nexport function OptionsTableCell({\r\n isFirst,\r\n isLast,\r\n isHighlighted,\r\n isBorderVisible = true,\r\n ...props\r\n}: OptionsTableCellProps) {\r\n return (\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport React from 'react'\r\nimport { Link, useSearchParams } from 'react-router-dom'\r\n\r\nimport {\r\n Table,\r\n TableAlign,\r\n TableBody,\r\n TableHead,\r\n TableHeaderSortable,\r\n TableRow,\r\n getDefaultSortFromUrl,\r\n useTableSort,\r\n} from '../../../components/Table'\r\nimport { SortByShape } from '../../../hooks/use-sort-data'\r\nimport { SortDirection, SortableValue } from '../../../types'\r\nimport { columnMap } from '../constants/columns'\r\nimport { ColumnId, Option, OptionRow, OptionsSubpage, RowKind, TableColumnDefinition } from '../types'\r\nimport { mergeOptionsBy } from '../utils/options'\r\nimport { getViewLink } from '../utils/query'\r\nimport { PriceRow } from './PriceRow'\r\nimport { OptionsTableCell, OptionsTableCellProps } from './TableColumn'\r\n\r\nexport interface ChainTableColumn extends Omit {\r\n /**\r\n * The sort hook internally compares `id` key, and because we have the same\r\n * columns on each side, we need them to be unique, so we keep the original id\r\n */\r\n id: string\r\n originalId: ColumnId\r\n /**\r\n * Used in sorting to distinguish between calls and puts columns\r\n */\r\n rowKind: RowKind\r\n}\r\n\r\nconst CALL_OPTION_COLUMNS: ChainTableColumn[] = [\r\n ColumnId.LastClose,\r\n ColumnId.ChangeUsd,\r\n ColumnId.ChangePct,\r\n ColumnId.BidPrice,\r\n ColumnId.AskPrice,\r\n ColumnId.Volume,\r\n ColumnId.OpenInterest,\r\n].map((id) => ({\r\n ...columnMap[id],\r\n originalId: id,\r\n id: `call_${columnMap[id].id}`,\r\n rowKind: RowKind.Call,\r\n className: classnames({\r\n 'w-22 xl:w-auto': id === ColumnId.LastClose,\r\n 'w-20 xl:w-auto': [ColumnId.ChangeUsd, ColumnId.OpenInterest].includes(id),\r\n 'hidden xl:table-cell': id === ColumnId.ChangePct,\r\n }),\r\n}))\r\n\r\nconst PUT_OPTION_COLUMNS: ChainTableColumn[] = CALL_OPTION_COLUMNS.map((option) => ({\r\n ...option,\r\n id: `put_${option.originalId}`,\r\n originalId: option.originalId,\r\n rowKind: RowKind.Put,\r\n}))\r\n\r\nconst CALL_OPTION_GREEK_COLUMNS: ChainTableColumn[] = [\r\n ColumnId.LastClose,\r\n ColumnId.IV,\r\n ColumnId.Delta,\r\n ColumnId.Gamma,\r\n ColumnId.Theta,\r\n ColumnId.Vega,\r\n ColumnId.Rho,\r\n].map((id) => ({\r\n ...columnMap[id],\r\n originalId: id,\r\n id: `call_${columnMap[id].id}`,\r\n rowKind: RowKind.Call,\r\n className: classnames({\r\n 'w-22 xl:w-auto': id === ColumnId.LastClose,\r\n 'w-20 xl:w-auto': [ColumnId.ChangeUsd, ColumnId.OpenInterest].includes(id),\r\n 'hidden xl:table-cell': id === ColumnId.ChangePct,\r\n }),\r\n}))\r\n\r\nconst PUT_OPTION_GREEK_COLUMNS: ChainTableColumn[] = CALL_OPTION_GREEK_COLUMNS.map((option) => ({\r\n ...option,\r\n id: `put_${option.originalId}`,\r\n originalId: option.originalId,\r\n rowKind: RowKind.Put,\r\n}))\r\n\r\nconst FULL_COLUMNS_BREAKPOINT = 1280\r\n\r\nfunction valueGetter(column: ChainTableColumn) {\r\n return (row: OptionRow) => {\r\n const customValueGetter = typeof column.getValueForSort === 'function' ? column.getValueForSort : undefined\r\n\r\n switch (column.rowKind) {\r\n case RowKind.OptionRow:\r\n if (customValueGetter) {\r\n return customValueGetter({ kind: RowKind.OptionRow, row })\r\n } else {\r\n return (row[column.originalId as keyof typeof row] as SortableValue) ?? null\r\n }\r\n case RowKind.Call:\r\n if (row.call && customValueGetter) {\r\n return customValueGetter({ kind: RowKind.Call, row: row.call })\r\n } else {\r\n return row.call?.[column.originalId as keyof Option] ?? null\r\n }\r\n case RowKind.Put:\r\n if (row.put && customValueGetter) {\r\n return customValueGetter({ kind: RowKind.Put, row: row.put })\r\n } else {\r\n return row.put?.[column.originalId as keyof Option] ?? null\r\n }\r\n default:\r\n return null\r\n }\r\n }\r\n}\r\n\r\ninterface ChainTableProps {\r\n className?: string\r\n\r\n /**\r\n * Type of table, display either prices or volatility & greeks\r\n */\r\n subpage: OptionsSubpage\r\n\r\n /**\r\n * Options rows which are displayed in the table.\r\n */\r\n data: Option[]\r\n\r\n /**\r\n * `id` of the column which is displayed as the middle column between\r\n * calls and puts.\r\n *\r\n * @default ColumnId.StrikePrice\r\n */\r\n middleColumn?: ColumnId.StrikePrice | ColumnId.ExpirationDate\r\n\r\n /**\r\n * When enabled, a row with current price will be added to the table at the\r\n * position of the price. The row will only be visible when ordering by the\r\n * middle column.\r\n *\r\n * @default middleColumn === ColumnId.StrikePrice\r\n */\r\n isPriceRowEnabled?: boolean\r\n\r\n /**\r\n * Last close for current ticker. Used to add highlight on calls/puts and as\r\n * a row in the middle of the table which displays the current price.\r\n */\r\n lastClose: number | null\r\n\r\n /**\r\n * Time when the `lastClose` was valid. Displayed in current price row.\r\n */\r\n lastTime: number | null\r\n\r\n /**\r\n * Whether headers should become sticky\r\n */\r\n isHeaderSticky?: boolean\r\n headerClass?: string\r\n\r\n /**\r\n * Sorting key (column id, with optional dash prefix for descending)\r\n */\r\n tableOrder: string\r\n\r\n onSortChange?: (\r\n column: ChainTableColumn,\r\n sort: SortByShape,\r\n changeSort: (newSort: ChainTableColumn, direction?: SortDirection) => void\r\n ) => void\r\n}\r\n\r\nexport function ChainTable({\r\n className,\r\n data,\r\n lastClose,\r\n lastTime,\r\n middleColumn = ColumnId.StrikePrice,\r\n isPriceRowEnabled = middleColumn === ColumnId.StrikePrice,\r\n isHeaderSticky,\r\n headerClass,\r\n subpage,\r\n tableOrder,\r\n onSortChange,\r\n}: ChainTableProps) {\r\n const CALL_COLUMNS = subpage === OptionsSubpage.Volatility ? CALL_OPTION_GREEK_COLUMNS : CALL_OPTION_COLUMNS\r\n const PUT_COLUMNS = subpage === OptionsSubpage.Volatility ? PUT_OPTION_GREEK_COLUMNS : PUT_OPTION_COLUMNS\r\n const [columnsLength, setColumnsLength] = React.useState(CALL_COLUMNS.length)\r\n const [searchParams] = useSearchParams()\r\n const tickerLastClose = lastClose ?? 0\r\n\r\n React.useEffect(() => {\r\n const updateColumnsLength = () => {\r\n if (window.innerWidth >= FULL_COLUMNS_BREAKPOINT && columnsLength === CALL_COLUMNS.length - 1) {\r\n setColumnsLength(CALL_COLUMNS.length)\r\n } else if (window.innerWidth < FULL_COLUMNS_BREAKPOINT && columnsLength === CALL_COLUMNS.length) {\r\n setColumnsLength(CALL_COLUMNS.length - 1)\r\n }\r\n }\r\n\r\n updateColumnsLength()\r\n window.addEventListener('resize', updateColumnsLength)\r\n\r\n return () => {\r\n window.removeEventListener('resize', updateColumnsLength)\r\n }\r\n })\r\n\r\n const middleColumnDefinition = React.useMemo(\r\n () => ({\r\n ...columnMap[middleColumn],\r\n originalId: middleColumn,\r\n rowKind: RowKind.OptionRow,\r\n }),\r\n [middleColumn]\r\n )\r\n\r\n const allColumns = React.useMemo(\r\n () => [...CALL_COLUMNS, middleColumnDefinition, ...PUT_COLUMNS],\r\n [CALL_COLUMNS, PUT_COLUMNS, middleColumnDefinition]\r\n )\r\n\r\n const mergedData = React.useMemo(() => mergeOptionsBy(data, middleColumn), [data, middleColumn])\r\n const {\r\n data: tableRows,\r\n sort,\r\n changeSort,\r\n } = useTableSort({\r\n data: mergedData,\r\n columns: allColumns,\r\n defaultSort: getDefaultSortFromUrl(allColumns, tableOrder),\r\n valueGetter,\r\n })\r\n\r\n /**\r\n * We display current price as a row between strike prices\r\n */\r\n const currentPriceRow = React.useMemo(() => {\r\n const isVisible = isPriceRowEnabled && sort.column.id === middleColumnDefinition.id\r\n\r\n if (!isVisible) return { isVisible, rowIndex: -1 }\r\n\r\n const rowIndex =\r\n sort.direction === SortDirection.Ascending\r\n ? tableRows.findLastIndex((option) => option.strike < tickerLastClose)\r\n : tableRows.findLastIndex((option) => option.strike > tickerLastClose)\r\n\r\n return { isVisible, index: rowIndex }\r\n }, [isPriceRowEnabled, sort.column.id, sort.direction, middleColumnDefinition.id, tableRows, tickerLastClose])\r\n\r\n const priceRowProps = React.useMemo(\r\n () => ({\r\n lastClose: tickerLastClose,\r\n lastTime,\r\n leftSpan: columnsLength,\r\n rightSpan: columnsLength,\r\n }),\r\n [tickerLastClose, lastTime, columnsLength]\r\n )\r\n\r\n return (\r\n \r\n \r\n {CALL_COLUMNS.map((column) => (\r\n {\r\n typeof onSortChange === 'function' ? onSortChange(column, sort, changeSort) : changeSort(column)\r\n }}\r\n >\r\n {column.name}\r\n \r\n ))}\r\n\r\n
\r\n {\r\n typeof onSortChange === 'function'\r\n ? onSortChange(middleColumnDefinition, sort, changeSort)\r\n : changeSort(middleColumnDefinition)\r\n }}\r\n className=\"w-28\"\r\n >\r\n {middleColumnDefinition.name}\r\n \r\n \r\n\r\n {PUT_COLUMNS.map((column) => (\r\n {\r\n typeof onSortChange === 'function' ? onSortChange(column, sort, changeSort) : changeSort(column)\r\n }}\r\n >\r\n {column.name}\r\n \r\n ))}\r\n \r\n\r\n {currentPriceRow.isVisible && currentPriceRow.index < 0 && (\r\n \r\n \r\n \r\n )}\r\n\r\n \r\n {tableRows.map((option, index) => {\r\n const isCurrentPriceRow = currentPriceRow.isVisible && currentPriceRow.index === index\r\n const showPriceAfter = isCurrentPriceRow && currentPriceRow.index < tableRows.length - 1\r\n const columnClass = classnames({ 'border-b': showPriceAfter })\r\n const middleLink = getViewLink(middleColumn, searchParams, option)\r\n\r\n const row = (\r\n \r\n {option.call ? (\r\n \r\n ) : (\r\n \r\n )}\r\n\r\n \r\n \r\n \r\n {middleColumnDefinition.renderColumn({ kind: RowKind.OptionRow, row: option })}\r\n \r\n \r\n \r\n\r\n {option.put ? (\r\n tickerLastClose}\r\n className={columnClass}\r\n />\r\n ) : (\r\n \r\n )}\r\n \r\n )\r\n\r\n if (showPriceAfter) {\r\n return (\r\n \r\n {row}\r\n {showPriceAfter && }\r\n \r\n )\r\n }\r\n\r\n return row\r\n })}\r\n \r\n\r\n {currentPriceRow.isVisible && currentPriceRow.index === tableRows.length - 1 && (\r\n \r\n \r\n \r\n )}\r\n
\r\n )\r\n}\r\n\r\ninterface ChainOptionRowProps extends Omit {\r\n columns: ChainTableColumn[]\r\n kind: RowKind.Call | RowKind.Put\r\n option: Option\r\n isHighlighted?: boolean\r\n}\r\n\r\nfunction ChainOptionRow({ columns, kind, option, isHighlighted, className, ...props }: ChainOptionRowProps) {\r\n return (\r\n <>\r\n {columns.map((column, index) => {\r\n const isFirst = index === 0\r\n const isLast = index === columns.length - 1\r\n\r\n return (\r\n \r\n {column.renderColumn({ kind, row: option })}\r\n \r\n )\r\n })}\r\n \r\n )\r\n}\r\n","import { ColumnId, Option, OptionRow, OptionType } from '../types'\r\n\r\nexport function mergeOptionsBy(options: Option[], mergeBy: ColumnId.StrikePrice | ColumnId.ExpirationDate) {\r\n const result: OptionRow[] = []\r\n const sorted = options.slice().sort((a, b) => a[mergeBy] - b[mergeBy])\r\n\r\n for (const option of sorted) {\r\n let last = result[result.length - 1]\r\n if (last?.[mergeBy] !== option[mergeBy]) {\r\n last = { strike: option.strike, exDate: option.exDate, call: null, put: null }\r\n result.push(last)\r\n }\r\n\r\n if (option.type === OptionType.Call) {\r\n last.call = option\r\n } else {\r\n last.put = option\r\n }\r\n }\r\n\r\n return result\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { Select, SelectItem } from '../../../components'\r\nimport { columnMap } from '../constants/columns'\r\nimport { ColumnId } from '../types'\r\n\r\ninterface FilterSelectProps {\r\n filterColumn: ColumnId\r\n selected?: ValueType\r\n options: Array>\r\n onChange: (value: SelectItem) => void\r\n}\r\n\r\nexport function FilterSelect({\r\n filterColumn,\r\n selected,\r\n options,\r\n onChange,\r\n}: FilterSelectProps) {\r\n /**\r\n * `selected` comes from loader. We set the selection to state in order to have\r\n * immediate response to user action. We also need to set the selection in an effect\r\n * so that back/forward works correctly.\r\n */\r\n const [filterValue, setFilterValue] = React.useState(selected)\r\n React.useEffect(() => {\r\n setFilterValue(selected)\r\n }, [selected])\r\n\r\n return (\r\n {\r\n setFilterValue(item.value)\r\n onChange(item)\r\n }}\r\n />\r\n )\r\n}\r\n","import * as React from 'react'\r\nimport { useSearchParams } from 'react-router-dom'\r\n\r\nimport { formatDate } from '../../../../app/header/utils'\r\nimport { DATE_FORMAT_DB, DATE_FORMAT_VIEW } from '../constants/common'\r\nimport { ColumnId, OptionsQuery } from '../types'\r\nimport { FilterSelect } from './FilterSelect'\r\n\r\nexport function DateFilter({ currentExpiry, expiries }: { currentExpiry: string; expiries: string[] }) {\r\n const [, setSearchParams] = useSearchParams()\r\n\r\n const filterOptions = React.useMemo(\r\n () => expiries.map((option) => ({ label: formatDate(option, DATE_FORMAT_DB, DATE_FORMAT_VIEW), value: option })),\r\n [expiries]\r\n )\r\n\r\n return (\r\n {\r\n setSearchParams((prev) => {\r\n const newQuery = new URLSearchParams(prev)\r\n newQuery.set(OptionsQuery.Expiry, option.value)\r\n return newQuery\r\n })\r\n }}\r\n />\r\n )\r\n}\r\n","import * as React from 'react'\r\nimport { useSearchParams } from 'react-router-dom'\r\n\r\nimport { formatNumber } from '../../../util'\r\nimport { ColumnId, OptionsQuery } from '../types'\r\nimport { FilterSelect } from './FilterSelect'\r\n\r\nexport function StrikeFilter({ currentStrike, strikes }: { currentStrike: number; strikes: number[] }) {\r\n const [, setSearchParams] = useSearchParams()\r\n\r\n const filterOptions = React.useMemo(\r\n () => strikes.map((option) => ({ label: '$ ' + formatNumber(option), value: option })),\r\n [strikes]\r\n )\r\n\r\n return (\r\n {\r\n setSearchParams((prev) => {\r\n const newQuery = new URLSearchParams(prev)\r\n newQuery.set(OptionsQuery.Strike, option.value.toString())\r\n return newQuery\r\n })\r\n }}\r\n />\r\n )\r\n}\r\n","import classNames from 'classnames'\r\nimport React from 'react'\r\nimport { useSearchParams } from 'react-router-dom'\r\n\r\nimport { parseOptionsQuery } from '../utils/query'\r\n\r\nexport default function ViewFooter({ className }: { className?: string }) {\r\n const [searchParams] = useSearchParams()\r\n const { ticker, expiry, strike } = parseOptionsQuery(searchParams)\r\n\r\n const exportUrl = React.useMemo(\r\n () =>\r\n 'export/options?' +\r\n new URLSearchParams({\r\n t: ticker,\r\n e: expiry ?? '',\r\n s: strike ? strike.toString() : '',\r\n }),\r\n [ticker, expiry, strike]\r\n )\r\n\r\n return (\r\n
\r\n Options delayed 15 minutes\r\n {\r\n window.gtag && window.gtag('event', 'download', { event_category: 'export' })\r\n }}\r\n >\r\n export\r\n \r\n
\r\n )\r\n}\r\n","import * as React from 'react'\r\nimport { useNavigate } from 'react-router-dom'\r\n\r\nimport { SortByShape } from '../../../hooks/use-sort-data'\r\nimport { SortDirection } from '../../../types'\r\nimport { LINK_COLUMN_NAME } from '../constants/common'\r\nimport { OptionsQuery, OptionsSubpage } from '../types'\r\nimport { OptionsParsedQuery, orderToString } from '../utils/query'\r\n\r\nexport function useOptionsSortChange(\r\n subpage: OptionsSubpage,\r\n query: OptionsParsedQuery\r\n) {\r\n const navigate = useNavigate()\r\n return React.useCallback(\r\n (\r\n column: SortColumnType,\r\n sort: SortByShape,\r\n changeSort: (newSort: SortColumnType, direction?: SortDirection) => void,\r\n prefix: string = '',\r\n isLinkColumn: boolean = false\r\n ) => {\r\n const newQuery = new URLSearchParams(query.params)\r\n const urlColumnId = isLinkColumn ? LINK_COLUMN_NAME : column.id\r\n const urlOrderValue =\r\n sort.column.id === column.id && sort.direction === SortDirection.Ascending\r\n ? `-${prefix}${urlColumnId}`\r\n : `${prefix}${urlColumnId}`\r\n\r\n const newOrder = { ...query.order, [subpage]: urlOrderValue }\r\n\r\n newQuery.set(OptionsQuery.Order, orderToString(newOrder))\r\n changeSort(column)\r\n navigate(`?${newQuery}`, { preventScrollReset: true })\r\n },\r\n [navigate, query.order, query.params, subpage]\r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { OptionsSubpage } from '../types'\r\nimport { OptionsParsedQuery } from '../utils/query'\r\n\r\nexport function useOptionsSortOrder(subpage: OptionsSubpage, query: OptionsParsedQuery, defaultOrder: string) {\r\n return React.useMemo(() => {\r\n if (query.order[subpage]) {\r\n return query.order[subpage]\r\n }\r\n return defaultOrder\r\n }, [defaultOrder, query, subpage])\r\n}\r\n","import { useSearchParams } from 'react-router-dom'\r\n\r\nimport { SortByShape } from '../../../hooks/use-sort-data'\r\nimport { SortDirection } from '../../../types'\r\nimport { ChainTable, ChainTableColumn } from '../components/ChainTable'\r\nimport { DateFilter } from '../components/DateFilter'\r\nimport { StickyShadow } from '../components/StickyShadow'\r\nimport { StrikeFilter } from '../components/StrikeFilter'\r\nimport ViewFooter from '../components/ViewFooter'\r\nimport { columnMap } from '../constants/columns'\r\nimport { useOptionsQuery } from '../hooks/useOptionsQuery'\r\nimport { useOptionsSortChange } from '../hooks/useOptionsSortChange'\r\nimport { useOptionsSortOrder } from '../hooks/useOptionsSortOrder'\r\nimport { ColumnId, OptionsByDateLoader, OptionsByStrikeLoader, OptionsView } from '../types'\r\nimport { evalLinkOrder } from '../utils/query'\r\n\r\nexport function ChainRoute({ options, lastClose, lastTime, ...props }: OptionsByDateLoader | OptionsByStrikeLoader) {\r\n const middleColumn = props.view === OptionsView.ChainByDate ? ColumnId.StrikePrice : ColumnId.ExpirationDate\r\n const filterColumn = props.view === OptionsView.ChainByDate ? ColumnId.ExpirationDate : ColumnId.StrikePrice\r\n const [searchParams] = useSearchParams()\r\n const query = useOptionsQuery(searchParams)\r\n const tableOrder = useOptionsSortOrder(props.subpage, query, middleColumn)\r\n const effectiveTableOrder = evalLinkOrder(tableOrder, middleColumn)\r\n const optionsSortChange = useOptionsSortChange(props.subpage, query)\r\n\r\n const handleSortChange = (\r\n column: ChainTableColumn,\r\n sort: SortByShape,\r\n changeSort: (newSort: any, direction?: SortDirection) => void\r\n ) => optionsSortChange(column, sort, changeSort, '', column.id === middleColumn)\r\n\r\n return (\r\n <>\r\n
\r\n
\r\n
\r\n
\r\n

Calls

\r\n
{columnMap[filterColumn].name}
\r\n
\r\n
\r\n {props.view === OptionsView.ChainByDate && (\r\n \r\n )}\r\n {props.view === OptionsView.ChainByStrike && (\r\n \r\n )}\r\n
\r\n
\r\n

Puts

\r\n
\r\n
\r\n
\r\n\r\n \r\n
\r\n handleSortChange(column, sort, changeSort)}\r\n />\r\n
\r\n
\r\n \r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport {\r\n Table,\r\n TableAlign,\r\n TableBody,\r\n TableHead,\r\n TableHeaderSortable,\r\n TableRow,\r\n getDefaultSortFromUrl,\r\n useTableSortWithAutoupdate,\r\n} from '../../../components/Table'\r\nimport { SortByShape } from '../../../hooks/use-sort-data'\r\nimport { SortDirection } from '../../../types'\r\nimport { CallKind, ColumnId, ColumnRendererProps, Option, RowKind, TableColumnDefinition } from '../types'\r\nimport { PriceRow } from './PriceRow'\r\nimport { OptionsTableCell } from './TableColumn'\r\n\r\nfunction defaultColumnRenderer(column: TableColumnDefinition, props: ColumnRendererProps) {\r\n return column.renderColumn(props)\r\n}\r\n\r\nfunction getColumnValueGetter(kind: RowKind, ticker?: string | null, lastClose?: number | null) {\r\n return (column: TableColumnDefinition) => (row: Option) => {\r\n if (typeof column.getValueForSort === 'function') {\r\n return column.getValueForSort({ kind, lastClose, row } as CallKind)\r\n }\r\n\r\n return row[column.id as keyof typeof row] ?? null\r\n }\r\n}\r\n\r\ninterface OptionsTableProps {\r\n kind?: RowKind\r\n ticker: string | null\r\n lastClose?: number | null\r\n lastTime?: number | null\r\n options: Option[]\r\n columns: TableColumnDefinition[]\r\n isPriceRowEnabled?: boolean\r\n\r\n /**\r\n * Sorting key (column id, with optional dash prefix for descending)\r\n */\r\n tableOrder: string\r\n\r\n /**\r\n * Whether headers should become sticky\r\n */\r\n isHeaderSticky?: boolean\r\n headerClass?: string\r\n\r\n renderColumn?: (column: TableColumnDefinition, props: ColumnRendererProps) => React.ReactNode\r\n\r\n onSortChange?: (\r\n column: TableColumnDefinition,\r\n sort: SortByShape,\r\n changeSort: (newSort: TableColumnDefinition, direction?: SortDirection) => void\r\n ) => void\r\n}\r\n\r\nexport function OptionsTable({\r\n kind = RowKind.Call,\r\n ticker,\r\n lastClose,\r\n lastTime,\r\n columns,\r\n options,\r\n isPriceRowEnabled = true,\r\n tableOrder,\r\n isHeaderSticky,\r\n headerClass,\r\n renderColumn = defaultColumnRenderer,\r\n onSortChange,\r\n}: OptionsTableProps) {\r\n const { data, sort, changeSort } = useTableSortWithAutoupdate({\r\n data: options,\r\n columns,\r\n defaultSort: getDefaultSortFromUrl(columns, tableOrder),\r\n valueGetter: getColumnValueGetter(kind, ticker, lastClose),\r\n tableOrder,\r\n })\r\n /**\r\n * We display current price as a row between strike prices\r\n */\r\n const currentPriceRow = React.useMemo(() => {\r\n const isVisible = isPriceRowEnabled && sort.column.id === ColumnId.StrikePrice\r\n\r\n if (!isVisible || typeof lastClose !== 'number') return { isVisible: false, rowIndex: -1 }\r\n\r\n const rowIndex =\r\n sort.direction === SortDirection.Ascending\r\n ? data.findLastIndex((option) => option.strike < lastClose)\r\n : data.findLastIndex((option) => option.strike > lastClose)\r\n\r\n return { isVisible: true, index: rowIndex }\r\n }, [isPriceRowEnabled, sort.column.id, sort.direction, lastClose, data])\r\n\r\n const priceRowProps = React.useMemo(\r\n () => ({\r\n lastClose: lastClose ?? null,\r\n lastTime: lastTime ?? null,\r\n leftSpan: 2,\r\n rightSpan: 7,\r\n showAdditionalCells: false,\r\n priceAlign: TableAlign.Right,\r\n }),\r\n [lastClose, lastTime]\r\n )\r\n\r\n return (\r\n \r\n \r\n {columns.map((column) => (\r\n \r\n typeof onSortChange === 'function' ? onSortChange(column, sort, changeSort) : changeSort(column)\r\n }\r\n >\r\n {column.name}\r\n \r\n ))}\r\n \r\n\r\n \r\n {data.map((option, rowIndex) => {\r\n const key = `${option.askPrice}-${option.exDate}-${option.strike}-${rowIndex}`\r\n const isHighlighted =\r\n typeof lastClose === 'number' &&\r\n (kind === RowKind.Call ? option.strike < lastClose : option.strike > lastClose)\r\n const isCurrentPriceRow = currentPriceRow.isVisible && currentPriceRow.index === rowIndex\r\n const showPriceAfter = isCurrentPriceRow && currentPriceRow.index < data.length - 1\r\n\r\n const row = (\r\n \r\n {columns.map((column, index) => (\r\n \r\n {renderColumn(column, { kind: kind, ticker, lastClose, row: option } as ColumnRendererProps)}\r\n \r\n ))}\r\n \r\n )\r\n\r\n if (showPriceAfter) {\r\n return (\r\n \r\n {row}\r\n {showPriceAfter && }\r\n \r\n )\r\n }\r\n\r\n return row\r\n })}\r\n \r\n
\r\n )\r\n}\r\n","import * as React from 'react'\r\nimport { Link, useSearchParams } from 'react-router-dom'\r\n\r\nimport { SortByShape } from '../../../hooks/use-sort-data'\r\nimport { SortDirection } from '../../../types'\r\nimport { DateFilter } from '../components/DateFilter'\r\nimport { OptionsTable } from '../components/OptionsTable'\r\nimport { StickyShadow } from '../components/StickyShadow'\r\nimport { StrikeFilter } from '../components/StrikeFilter'\r\nimport ViewFooter from '../components/ViewFooter'\r\nimport { columnMap } from '../constants/columns'\r\nimport { useOptionsQuery } from '../hooks/useOptionsQuery'\r\nimport { useOptionsSortChange } from '../hooks/useOptionsSortChange'\r\nimport { useOptionsSortOrder } from '../hooks/useOptionsSortOrder'\r\nimport {\r\n ColumnId,\r\n ColumnRendererProps,\r\n OptionType,\r\n OptionsByDateLoader,\r\n OptionsByStrikeLoader,\r\n OptionsSubpage,\r\n OptionsView,\r\n RowKind,\r\n TableColumnDefinition,\r\n} from '../types'\r\nimport { evalLinkOrder, getViewLink } from '../utils/query'\r\n\r\nconst LEFT_COLUMNS = [ColumnId.ContractName, ColumnId.LastTrade]\r\nconst RIGHT_PRICES_COLUMNS = [\r\n ColumnId.LastClose,\r\n ColumnId.BidPrice,\r\n ColumnId.AskPrice,\r\n ColumnId.ChangeUsd,\r\n ColumnId.ChangePct,\r\n ColumnId.Volume,\r\n ColumnId.OpenInterest,\r\n]\r\n\r\nconst RIGHT_GREEK_COLUMNS = [\r\n ColumnId.LastClose,\r\n ColumnId.IV,\r\n ColumnId.Delta,\r\n ColumnId.Gamma,\r\n ColumnId.Theta,\r\n ColumnId.Vega,\r\n ColumnId.Rho,\r\n]\r\n\r\nconst BY_DATE_PRICES_COLUMNS = [...LEFT_COLUMNS, ColumnId.StrikePrice, ...RIGHT_PRICES_COLUMNS].map(\r\n (id) => columnMap[id]\r\n)\r\nconst BY_STRIKE_PRICES_COLUMNS = [...LEFT_COLUMNS, ColumnId.ExpirationDate, ...RIGHT_PRICES_COLUMNS].map(\r\n (id) => columnMap[id]\r\n)\r\n\r\nconst BY_DATE_GREEK_COLUMNS = [...LEFT_COLUMNS, ColumnId.StrikePrice, ...RIGHT_GREEK_COLUMNS].map((id) => columnMap[id])\r\nconst BY_STRIKE_GREEK_COLUMNS = [...LEFT_COLUMNS, ColumnId.ExpirationDate, ...RIGHT_GREEK_COLUMNS].map(\r\n (id) => columnMap[id]\r\n)\r\n\r\nfunction getColumnRenderer(searchParams: URLSearchParams) {\r\n return (column: TableColumnDefinition, props: ColumnRendererProps) => {\r\n switch (column.id) {\r\n case ColumnId.StrikePrice:\r\n case ColumnId.ExpirationDate:\r\n const middleLink = getViewLink(column.id, searchParams, props.row)\r\n\r\n return (\r\n \r\n {column.renderColumn(props)}\r\n \r\n )\r\n default:\r\n return column.renderColumn(props)\r\n }\r\n }\r\n}\r\n\r\nfunction getColumns(subpage: OptionsSubpage, isByDateList: boolean): TableColumnDefinition[] {\r\n if (subpage === OptionsSubpage.Volatility) {\r\n return isByDateList ? BY_DATE_GREEK_COLUMNS : BY_STRIKE_GREEK_COLUMNS\r\n } else {\r\n return isByDateList ? BY_DATE_PRICES_COLUMNS : BY_STRIKE_PRICES_COLUMNS\r\n }\r\n}\r\n\r\nfunction removePrefix(sortOrder: string) {\r\n if (!sortOrder.includes('_')) return sortOrder\r\n const [prefix, rest] = sortOrder.split('_', 2)\r\n return prefix.startsWith('-') ? `-${rest}` : rest\r\n}\r\n\r\nexport function ListRoute(props: OptionsByDateLoader | OptionsByStrikeLoader) {\r\n const [searchParams] = useSearchParams()\r\n const subpage = props.subpage\r\n const columnRenderer = React.useMemo(() => getColumnRenderer(searchParams), [searchParams])\r\n const isByDateList = props.view === OptionsView.ListByDate\r\n const columns = getColumns(subpage, isByDateList)\r\n const linkColumn = isByDateList ? ColumnId.StrikePrice : ColumnId.ExpirationDate\r\n const filterColumn = isByDateList ? ColumnId.ExpirationDate : ColumnId.StrikePrice\r\n const query = useOptionsQuery(searchParams)\r\n const prefixedTableOrder = useOptionsSortOrder(props.subpage, query, linkColumn)\r\n const tableOrder = removePrefix(prefixedTableOrder)\r\n const effectiveTableOrder = evalLinkOrder(tableOrder, linkColumn)\r\n const optionsSortChange = useOptionsSortChange(subpage, query)\r\n\r\n const handleSortChange = (\r\n column: TableColumnDefinition,\r\n sort: SortByShape,\r\n changeSort: (newSort: any, direction?: SortDirection) => void,\r\n sortPrefix: string\r\n ) => {\r\n optionsSortChange(column, sort, changeSort, column.id === linkColumn ? '' : sortPrefix, column.id === linkColumn)\r\n }\r\n\r\n return (\r\n <>\r\n
\r\n
\r\n
\r\n
\r\n
{columnMap[filterColumn].name}
\r\n
\r\n {props.view === OptionsView.ListByDate && (\r\n \r\n )}\r\n {props.view === OptionsView.ListByStrike && (\r\n \r\n )}\r\n
\r\n
\r\n
\r\n
\r\n\r\n
\r\n \r\n
\r\n
\r\n

Calls

\r\n
\r\n option.type === OptionType.Call)}\r\n renderColumn={columnRenderer}\r\n tableOrder={effectiveTableOrder}\r\n onSortChange={(column, sort, changeSort) => handleSortChange(column, sort, changeSort, 'call_')}\r\n />\r\n
\r\n
\r\n\r\n
\r\n

\r\n Puts\r\n

\r\n \r\n
\r\n option.type === OptionType.Put)}\r\n renderColumn={columnRenderer}\r\n tableOrder={effectiveTableOrder}\r\n onSortChange={(column, sort, changeSort) => handleSortChange(column, sort, changeSort, 'put_')}\r\n />\r\n
\r\n
\r\n
\r\n \r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { Loading } from '../../../components/loading'\r\nimport ViewFooter from '../components/ViewFooter'\r\nimport { OptionsLoaderData } from '../types'\r\n\r\nconst ScatterPlot = React.lazy(() => import('../components/ScatterPlot'))\r\n\r\nexport function PlotRoute({ options }: OptionsLoaderData) {\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
\r\n \r\n
\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport { useRevalidator, useSearchParams } from 'react-router-dom'\r\n\r\nimport { intervalCallbackOnWindowVisible } from '../../../app/shared/documentVisibility'\r\nimport { useCachedLoaderData } from '../../hooks/useCachedLoaderData'\r\nimport { QuoteOptionsTabMenu } from '../quote/components/QuoteOptionsTabMenu'\r\nimport { QuoteStickySubMenu } from '../quote/components/QuoteStickySubMenu'\r\nimport { OptionsViewSwitcher } from './components/OptionsViewSwitcher'\r\nimport { useOptionsQuery } from './hooks/useOptionsQuery'\r\nimport { ChainRoute } from './routes/ChainRoute'\r\nimport { ListRoute } from './routes/ListRoute'\r\nimport { PlotRoute } from './routes/PlotRoute'\r\nimport { OptionsLoaderData, OptionsSubpage, OptionsView } from './types'\r\n\r\nconst OPTIONS_REFRESH_INTERVAL = 60 * 1000\r\n\r\nexport default function Options() {\r\n const { data } = useCachedLoaderData()\r\n const revalidator = useRevalidator()\r\n const [searchParams] = useSearchParams()\r\n const query = useOptionsQuery(searchParams)\r\n\r\n React.useEffect(() => {\r\n const unsubscribe = intervalCallbackOnWindowVisible({ interval: OPTIONS_REFRESH_INTERVAL }, () => {\r\n // Do a false check so that browsers which don’t support this just continue\r\n if (navigator.onLine === false) return\r\n revalidator.revalidate()\r\n })\r\n\r\n return unsubscribe\r\n // Reset the refetch interval after every expiry change\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [query.expiry, query.strike])\r\n\r\n return FinvizSettings.hasOptionsGreeksEnabled ? (\r\n <>\r\n }\r\n rightContent={\r\n data?.options?.length ? (\r\n \r\n ) : undefined\r\n }\r\n />\r\n
\r\n {data?.options?.length ? (\r\n \r\n ) : (\r\n
\r\n Options are not available for this stock.\r\n
\r\n )}\r\n
\r\n \r\n ) : (\r\n
\r\n {data?.options?.length ? (\r\n <>\r\n \r\n \r\n
\r\n \r\n \r\n ) : (\r\n
\r\n Options are not available for this stock.\r\n
\r\n )}\r\n \r\n )\r\n}\r\n\r\nfunction OptionsContent(props: OptionsLoaderData & { subpage: OptionsSubpage; view: OptionsView }) {\r\n switch (props.view) {\r\n case OptionsView.Plot:\r\n return \r\n case OptionsView.ListByDate:\r\n case OptionsView.ListByStrike:\r\n return \r\n case OptionsView.ChainByStrike:\r\n default:\r\n return \r\n }\r\n}\r\n","import { TableAlign } from '../../components/Table'\r\nimport { SortableColumn } from '../../hooks/use-sort-data'\r\n\r\nexport enum OptionsQuery {\r\n Ticker = 't',\r\n Expiry = 'e',\r\n Strike = 's',\r\n Order = 'o',\r\n View = 'ov',\r\n Type = 'ty',\r\n}\r\n\r\nexport enum OptionsSubpage {\r\n Prices = 'oc',\r\n Volatility = 'ocv',\r\n}\r\n\r\nexport enum OptionsView {\r\n ChainByDate = 'chain_date',\r\n ChainByStrike = 'chain_strike',\r\n ListByDate = 'list_date',\r\n ListByStrike = 'list_strike',\r\n Plot = 'plot',\r\n}\r\n\r\nexport enum OptionType {\r\n Call = 'call',\r\n Put = 'put',\r\n}\r\n\r\nexport interface Option {\r\n type: OptionType\r\n ticker: string\r\n exDate: number\r\n strike: number\r\n openInterest: number\r\n averageVolume: number\r\n bidPrice: number\r\n askPrice: number\r\n lastClose: number\r\n lastChange: number\r\n lastSize: number\r\n lastVolume: number\r\n lastTime: string\r\n iv: number | null\r\n delta: number | null\r\n gamma: number | null\r\n theta: number | null\r\n vega: number | null\r\n rho: number | null\r\n}\r\n\r\nexport interface OptionRow {\r\n strike: number\r\n exDate: number\r\n call: Option | null\r\n put: Option | null\r\n}\r\n\r\nexport interface LoaderBase {\r\n ticker: string | null\r\n options: Option[]\r\n lastClose: number | null\r\n lastTime: number | null\r\n hasData?: boolean\r\n}\r\n\r\nexport interface OptionsByDateLoader extends LoaderBase {\r\n subpage: OptionsSubpage\r\n view: OptionsView.ChainByDate | OptionsView.ListByDate\r\n expiries: string[]\r\n currentExpiry: string\r\n}\r\n\r\nexport interface OptionsByStrikeLoader extends LoaderBase {\r\n subpage: OptionsSubpage\r\n view: OptionsView.ChainByStrike | OptionsView.ListByStrike\r\n strikes: number[]\r\n currentStrike: number\r\n}\r\n\r\nexport interface PlotLoader {\r\n subpage: OptionsSubpage\r\n view: OptionsView.Plot\r\n optionable: boolean\r\n options: Option[]\r\n}\r\n\r\nexport type OptionsLoaderData = OptionsByDateLoader | OptionsByStrikeLoader | PlotLoader\r\n\r\nexport enum ColumnId {\r\n ContractName = 'contractName',\r\n LastClose = 'lastClose',\r\n ChangeUsd = 'lastChange',\r\n ChangePct = 'changePct',\r\n BidPrice = 'bidPrice',\r\n AskPrice = 'askPrice',\r\n Volume = 'lastVolume',\r\n OpenInterest = 'openInterest',\r\n StrikePrice = 'strike',\r\n ExpirationDate = 'exDate',\r\n LastTrade = 'lastTime',\r\n IV = 'iv',\r\n Delta = 'delta',\r\n Gamma = 'gamma',\r\n Theta = 'theta',\r\n Vega = 'vega',\r\n Rho = 'rho',\r\n}\r\n\r\nexport enum RowKind {\r\n OptionRow, // Base row which includes both call and put. Used to render strike price\r\n Call,\r\n Put,\r\n}\r\n\r\ninterface OptionRowKind {\r\n ticker?: string\r\n lastClose?: number | null\r\n kind: RowKind.OptionRow\r\n row: OptionRow\r\n}\r\n\r\nexport interface CallKind {\r\n ticker?: string\r\n lastClose?: number | null\r\n kind: RowKind.Call\r\n row: Option\r\n}\r\n\r\ninterface PutKind {\r\n ticker?: string\r\n lastClose?: number | null\r\n kind: RowKind.Put\r\n row: Option\r\n}\r\n\r\nexport type ColumnRendererProps = CallKind | PutKind | OptionRowKind\r\n\r\nexport interface TableColumnDefinition extends SortableColumn {\r\n name: string\r\n align?: TableAlign\r\n className?: string\r\n renderColumn: (props: ColumnRendererProps) => React.ReactNode\r\n}\r\n\r\nexport type MappedSubpageOrders = { [key in OptionsSubpage]?: string }\r\n","import { formatDate } from '../../../../app/header/utils'\r\nimport { DATE_FORMAT_DB, DATE_FORMAT_INT, LINK_COLUMN_NAME } from '../constants/common'\r\nimport { ColumnId, MappedSubpageOrders, Option, OptionRow, OptionsQuery, OptionsSubpage, OptionsView } from '../types'\r\n\r\nconst DELIMITER = '|'\r\n\r\nfunction parseOrder(input: string | null): MappedSubpageOrders {\r\n if (!input) return {}\r\n const parts = input.split(DELIMITER)\r\n let pricesOrder, volatilityOrder\r\n if (parts.length === 1) pricesOrder = volatilityOrder = parts[0]\r\n else [pricesOrder, volatilityOrder] = parts\r\n return {\r\n [OptionsSubpage.Prices]: pricesOrder,\r\n [OptionsSubpage.Volatility]: volatilityOrder,\r\n }\r\n}\r\n\r\nexport function orderToString(obj: MappedSubpageOrders): string {\r\n const arr = [obj[OptionsSubpage.Prices], obj[OptionsSubpage.Volatility]]\r\n return arr.join(DELIMITER)\r\n}\r\n\r\nexport type OptionsParsedQuery = ReturnType\r\n\r\nexport function parseOptionsQuery(query: URLSearchParams) {\r\n const strike = Number(query.get(OptionsQuery.Strike))\r\n\r\n return {\r\n params: Object.fromEntries(query.entries()) as Record, // Re-export the original query as key/val\r\n ticker: query.get(OptionsQuery.Ticker)!, // Validated on BE\r\n expiry: query.get(OptionsQuery.Expiry),\r\n order: parseOrder(query.get(OptionsQuery.Order)),\r\n strike: Number.isFinite(strike) ? strike : null,\r\n view: (query.get(OptionsQuery.View) as OptionsView) ?? OptionsView.ChainByDate,\r\n type: query.get(OptionsQuery.Type) as OptionsSubpage,\r\n }\r\n}\r\n\r\nexport function evalLinkOrder(order: string, linkAlias: string) {\r\n if (!linkAlias) return order\r\n if (order === LINK_COLUMN_NAME) return linkAlias\r\n if (order === `-${LINK_COLUMN_NAME}`) return `-${linkAlias}`\r\n return order\r\n}\r\n\r\nexport function getViewLink(columnId: ColumnId, searchParams: URLSearchParams, option: Option | OptionRow) {\r\n const middleLink = new URLSearchParams(searchParams)\r\n\r\n switch (searchParams.get(OptionsQuery.View)) {\r\n case OptionsView.ChainByStrike:\r\n middleLink.set(OptionsQuery.View, OptionsView.ChainByDate)\r\n break\r\n case OptionsView.ListByDate:\r\n middleLink.set(OptionsQuery.View, OptionsView.ListByStrike)\r\n break\r\n case OptionsView.ListByStrike:\r\n middleLink.set(OptionsQuery.View, OptionsView.ListByDate)\r\n break\r\n case OptionsView.ChainByDate:\r\n default:\r\n middleLink.set(OptionsQuery.View, OptionsView.ChainByStrike)\r\n }\r\n\r\n if (columnId === ColumnId.ExpirationDate) {\r\n middleLink.delete(OptionsQuery.Strike)\r\n middleLink.set(OptionsQuery.Expiry, formatDate(option.exDate, DATE_FORMAT_INT, DATE_FORMAT_DB))\r\n } else {\r\n middleLink.delete(OptionsQuery.Expiry)\r\n middleLink.set(OptionsQuery.Strike, option.strike.toString())\r\n }\r\n\r\n return middleLink\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { SubMenu } from '../../../components/SubMenu/SubMenu'\r\n\r\ninterface Props {\r\n leftContent?: React.ReactNode\r\n rightContent?: React.ReactNode\r\n}\r\n\r\nexport function QuoteStickySubMenu({ leftContent, rightContent }: Props) {\r\n return \r\n}\r\n","'use strict';\nvar $ = require('../internals/export');\nvar $findLastIndex = require('../internals/array-iteration-from-last').findLastIndex;\nvar addToUnscopables = require('../internals/add-to-unscopables');\n\n// `Array.prototype.findLastIndex` method\n// https://tc39.es/ecma262/#sec-array.prototype.findlastindex\n$({ target: 'Array', proto: true }, {\n findLastIndex: function findLastIndex(callbackfn /* , that = undefined */) {\n return $findLastIndex(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\naddToUnscopables('findLastIndex');\n"],"names":["ChipSwitch","_ref","children","label","size","rounding","_jsxs","className","_jsx","Paragraph","React","map","child","_child$props$theme","type","Button","theme","props","classnames","active","ChipSwitchButton","SubMenu","leftContent","middleContent","rightContent","classNames","isRedesignEnabled","SubMenuTabs","items","_ref2","href","isActive","reloadDocument","as","Link","to","useStickyShadow","stickyRef","isSticky","setIsSticky","current","onScroll","throttle","stickyElement","elementStickyTopOffset","parseFloat","getComputedStyle","top","elementCurrentTopOffset","getBoundingClientRect","document","addEventListener","removeEventListener","StickyShadow","ref","NULL_VALUE","FORMAT_SETTINGS","defaultValue","GREEK_SETTINGS","fractions","columnMap","Object","freeze","ColumnId","LastClose","id","align","TableAlign","Right","name","renderColumn","args","kind","RowKind","OptionRow","row","lastClose","formatNumber","ChangeUsd","getValueForSort","lastChange","RedGreenText","value","showPlusSign","ChangePct","prevClose","change","BidPrice","bidPrice","AskPrice","askPrice","Volume","lastVolume","OpenInterest","openInterest","StrikePrice","strike","ExpirationDate","formatDate","exDate","DATE_FORMAT_INT","DATE_FORMAT_VIEW","ContractName","Left","ticker","_args$ticker","toString","padStart","replace","Call","LastTrade","Date","lastTime","DATE_FORMAT_VIEW_LONG","IV","iv","Delta","delta","Gamma","gamma","Theta","theta","Vega","vega","Rho","rho","DATE_FORMAT_DB","DATE_FORMAT_SCATTER_PLOT","LINK_COLUMN_NAME","OPTIONS_SECTION_LABELS","QuoteSubview","OptionsChain","OptionsVolatility","OPTIONS_MENU_TABS","getOptionsMenuTabs","searchParams","decodeQueryString","encodeQueryString","ty","ov","OptionsSubpage","Volatility","OptionsView","Plot","ChainByDate","QuoteOptionsTabMenu","OptionsViewSwitcher","activeView","subpage","useSearchParams","chainLink","newParams","URLSearchParams","set","OptionsQuery","View","ChainByStrike","ListByStrike","includes","get","listLink","ListByDate","plotLink","delete","Strike","Expiry","Prices","useOptionsQuery","params","parseOptionsQuery","PriceRow","leftSpan","rightSpan","priceAlign","Center","showAdditionalCells","date","getDate","formattedDate","getFormattedDateString","formattedTime","TableRow","TableCell","colSpan","OptionsTableCell","isFirst","isLast","isHighlighted","isBorderVisible","CALL_OPTION_COLUMNS","originalId","rowKind","PUT_OPTION_COLUMNS","option","Put","CALL_OPTION_GREEK_COLUMNS","PUT_OPTION_GREEK_COLUMNS","FULL_COLUMNS_BREAKPOINT","valueGetter","column","customValueGetter","undefined","call","_row$call","_row$call2","put","_row$put","_row$put2","ChainTable","data","middleColumn","isPriceRowEnabled","isHeaderSticky","headerClass","tableOrder","onSortChange","CALL_COLUMNS","PUT_COLUMNS","columnsLength","setColumnsLength","length","tickerLastClose","updateColumnsLength","window","innerWidth","middleColumnDefinition","allColumns","mergedData","options","mergeBy","result","sorted","slice","sort","a","b","_last","last","push","OptionType","mergeOptionsBy","tableRows","changeSort","useTableSort","columns","defaultSort","getDefaultSortFromUrl","currentPriceRow","isVisible","rowIndex","index","direction","SortDirection","Ascending","findLastIndex","priceRowProps","Table","cellPadding","TableHead","TableHeaderSortable","onClick","TableBody","_tableRows","_tableRows2","showPriceAfter","columnClass","middleLink","getViewLink","ChainOptionRow","_ref3","_Fragment","_createElement","key","FilterSelect","filterColumn","selected","onChange","filterValue","setFilterValue","Select","placement","item","DateFilter","currentExpiry","expiries","setSearchParams","filterOptions","prev","newQuery","StrikeFilter","currentStrike","strikes","ViewFooter","expiry","exportUrl","t","e","s","gtag","event_category","useOptionsSortChange","query","navigate","useNavigate","prefix","arguments","isLinkColumn","urlColumnId","urlOrderValue","newOrder","order","Order","orderToString","preventScrollReset","useOptionsSortOrder","defaultOrder","ChainRoute","view","effectiveTableOrder","evalLinkOrder","optionsSortChange","handleSortChange","defaultColumnRenderer","getColumnValueGetter","_row","OptionsTable","useTableSortWithAutoupdate","LEFT_COLUMNS","RIGHT_PRICES_COLUMNS","RIGHT_GREEK_COLUMNS","BY_DATE_PRICES_COLUMNS","BY_STRIKE_PRICES_COLUMNS","BY_DATE_GREEK_COLUMNS","BY_STRIKE_GREEK_COLUMNS","ListRoute","columnRenderer","getColumnRenderer","isByDateList","getColumns","linkColumn","sortOrder","rest","split","startsWith","removePrefix","sortPrefix","filter","ScatterPlot","PlotRoute","fallback","Loading","OPTIONS_REFRESH_INTERVAL","Options","_data$options","_data$view","_data$options2","_data$options3","_data$view2","useCachedLoaderData","revalidator","useRevalidator","intervalCallbackOnWindowVisible","interval","navigator","onLine","revalidate","FinvizSettings","hasOptionsGreeksEnabled","QuoteStickySubMenu","OptionsContent","DELIMITER","parseOrder","input","parts","pricesOrder","volatilityOrder","obj","join","Number","fromEntries","entries","Ticker","isFinite","Type","linkAlias","columnId","$","$findLastIndex","addToUnscopables","target","proto","callbackfn","this"],"sourceRoot":""}