diff --git a/.eslintrc.js b/.eslintrc.js index 1e2a8a6776c..1f45dc58ad6 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -43,7 +43,7 @@ module.exports = { '@typescript-eslint/no-empty-function': 'off', '@typescript-eslint/no-inferrable-types': 'off', '@typescript-eslint/ban-ts-comment': 'off', - 'no-shadow': 'warn', + 'no-shadow': 'error', curly: 'error', }, overrides: [ diff --git a/frontend/src/lib/components/PropertyFilters/components/OperatorValueSelect.tsx b/frontend/src/lib/components/PropertyFilters/components/OperatorValueSelect.tsx index 56da2d8f426..fa05cbb2ae2 100644 --- a/frontend/src/lib/components/PropertyFilters/components/OperatorValueSelect.tsx +++ b/frontend/src/lib/components/PropertyFilters/components/OperatorValueSelect.tsx @@ -38,16 +38,16 @@ export function OperatorValueSelect({ <> } onChange={(newOperator: PropertyOperator) => { setCurrentOperator(newOperator) if (isOperatorFlag(newOperator)) { onChange(newOperator, newOperator) - } else if (isOperatorFlag(currentOperator || 'exact')) { + } else if (isOperatorFlag(currentOperator || PropertyOperator.Exact)) { onChange(newOperator, null) } else if ( - isOperatorMulti(currentOperator || 'exact') && + isOperatorMulti(currentOperator || PropertyOperator.Exact) && !isOperatorMulti(newOperator) && Array.isArray(value) ) { @@ -59,16 +59,16 @@ export function OperatorValueSelect({ {...operatorSelectProps} /> - {!isOperatorFlag(currentOperator || 'exact') && ( + {!isOperatorFlag(currentOperator || PropertyOperator.Exact) && ( { - onChange(currentOperator || 'exact', newValue) + onChange(currentOperator || PropertyOperator.Exact, newValue) }} /> @@ -90,7 +90,7 @@ export function OperatorSelect({ operator, operators, onChange, ...props }: Oper labelInValue value={{ value: operator || '=', - label: operatorMap[operator || 'exact'], + label: operatorMap[operator || PropertyOperator.Exact], }} placeholder="Property key" onChange={(_value, op) => { @@ -100,8 +100,8 @@ export function OperatorSelect({ operator, operators, onChange, ...props }: Oper {...props} > {operators.map((op) => ( - - {operatorMap[op || 'exact']} + + {operatorMap[op || PropertyOperator.Exact]} ))} diff --git a/frontend/src/lib/logic/selectBoxLogic.ts b/frontend/src/lib/logic/selectBoxLogic.ts index a61e66f3086..fb68b81c7cc 100644 --- a/frontend/src/lib/logic/selectBoxLogic.ts +++ b/frontend/src/lib/logic/selectBoxLogic.ts @@ -151,7 +151,7 @@ export const selectBoxLogic = kea item.name[0] === '$').length + extraProps.count_posthog_events = item.dataSource.filter(({ name }) => name[0] === '$').length } } eventUsageLogic.actions.reportEventSearched(search, extraProps) diff --git a/frontend/src/scenes/insights/InsightDateFilter/index.tsx b/frontend/src/scenes/insights/InsightDateFilter/InsightDateFilter.tsx similarity index 79% rename from frontend/src/scenes/insights/InsightDateFilter/index.tsx rename to frontend/src/scenes/insights/InsightDateFilter/InsightDateFilter.tsx index aef00840f51..f8ce51ba180 100644 --- a/frontend/src/scenes/insights/InsightDateFilter/index.tsx +++ b/frontend/src/scenes/insights/InsightDateFilter/InsightDateFilter.tsx @@ -17,9 +17,9 @@ export function InsightDateFilter(props: DateFilterProps): JSX.Element { {...props} dateFrom={dateFrom} dateTo={dateTo} - onChange={(dateFrom, dateTo) => { - setDates(dateFrom, dateTo) - props.onChange?.(dateFrom, dateTo) + onChange={(changedDateFrom, changedDateTo) => { + setDates(changedDateFrom, changedDateTo) + props.onChange?.(changedDateFrom, changedDateTo) }} /> diff --git a/frontend/src/scenes/insights/InsightDateFilter/index.ts b/frontend/src/scenes/insights/InsightDateFilter/index.ts new file mode 100644 index 00000000000..64227d89d64 --- /dev/null +++ b/frontend/src/scenes/insights/InsightDateFilter/index.ts @@ -0,0 +1 @@ +export * from './InsightDateFilter' diff --git a/frontend/src/scenes/insights/InsightTabs/FunnelTab/FunnelTab.tsx b/frontend/src/scenes/insights/InsightTabs/FunnelTab/FunnelTab.tsx index 5ff1bf9c5ce..56115d0d696 100644 --- a/frontend/src/scenes/insights/InsightTabs/FunnelTab/FunnelTab.tsx +++ b/frontend/src/scenes/insights/InsightTabs/FunnelTab/FunnelTab.tsx @@ -45,7 +45,7 @@ export function FunnelTab({ newUI }: FunnelTabProps): JSX.Element {

Steps

): void => setFilters(filters, false)} + setFilters={(newFilters: Record): void => setFilters(newFilters, false)} typeKey={`EditFunnel-action`} hideMathSelector={true} buttonCopy="Add funnel step" diff --git a/frontend/src/scenes/insights/InsightTabs/RetentionTab.tsx b/frontend/src/scenes/insights/InsightTabs/RetentionTab.tsx index 554a84e0628..933cc5a7efb 100644 --- a/frontend/src/scenes/insights/InsightTabs/RetentionTab.tsx +++ b/frontend/src/scenes/insights/InsightTabs/RetentionTab.tsx @@ -42,11 +42,11 @@ function DefaultRetentionTab(): JSX.Element { const { setFilters } = useActions(retentionTableLogic({ dashboardItemId: null })) const entityLogic = entityFilterLogic({ - setFilters: (filters: FilterType) => { - if (filters.events && filters.events.length > 0) { - setFilters({ target_entity: filters.events[0] }) - } else if (filters.actions && filters.actions.length > 0) { - setFilters({ target_entity: filters.actions[0] }) + setFilters: (newFilters: FilterType) => { + if (newFilters.events && newFilters.events.length > 0) { + setFilters({ target_entity: newFilters.events[0] }) + } else if (newFilters.actions && newFilters.actions.length > 0) { + setFilters({ target_entity: newFilters.actions[0] }) } else { setFilters({ target_entity: null }) } @@ -58,11 +58,11 @@ function DefaultRetentionTab(): JSX.Element { }) const entityLogicReturning = entityFilterLogic({ - setFilters: (filters: FilterType) => { - if (filters.events && filters.events.length > 0) { - setFilters({ returning_entity: filters.events[0] }) - } else if (filters.actions && filters.actions.length > 0) { - setFilters({ returning_entity: filters.actions[0] }) + setFilters: (newFilters: FilterType) => { + if (newFilters.events && newFilters.events.length > 0) { + setFilters({ returning_entity: newFilters.events[0] }) + } else if (newFilters.actions && newFilters.actions.length > 0) { + setFilters({ returning_entity: newFilters.actions[0] }) } else { setFilters({ returning_entity: null }) } diff --git a/frontend/src/scenes/insights/InsightTabs/RetentionTabHorizontal.tsx b/frontend/src/scenes/insights/InsightTabs/RetentionTabHorizontal.tsx index 22afd127a35..8959374e5f9 100644 --- a/frontend/src/scenes/insights/InsightTabs/RetentionTabHorizontal.tsx +++ b/frontend/src/scenes/insights/InsightTabs/RetentionTabHorizontal.tsx @@ -36,11 +36,11 @@ export function RetentionTabHorizontal({ annotationsToCreate }: BaseTabProps): J const isSmallScreen = screens.xs || (screens.sm && !screens.md) const entityLogic = entityFilterLogic({ - setFilters: (filters: FilterType) => { - if (filters.events && filters.events.length > 0) { - setFilters({ target_entity: filters.events[0] }) - } else if (filters.actions && filters.actions.length > 0) { - setFilters({ target_entity: filters.actions[0] }) + setFilters: (newFilters: FilterType) => { + if (newFilters.events && newFilters.events.length > 0) { + setFilters({ target_entity: newFilters.events[0] }) + } else if (newFilters.actions && newFilters.actions.length > 0) { + setFilters({ target_entity: newFilters.actions[0] }) } else { setFilters({ target_entity: null }) } @@ -52,11 +52,11 @@ export function RetentionTabHorizontal({ annotationsToCreate }: BaseTabProps): J }) const entityLogicReturning = entityFilterLogic({ - setFilters: (filters: FilterType) => { - if (filters.events && filters.events.length > 0) { - setFilters({ returning_entity: filters.events[0] }) - } else if (filters.actions && filters.actions.length > 0) { - setFilters({ returning_entity: filters.actions[0] }) + setFilters: (newFilters: FilterType) => { + if (newFilters.events && newFilters.events.length > 0) { + setFilters({ returning_entity: newFilters.events[0] }) + } else if (newFilters.actions && newFilters.actions.length > 0) { + setFilters({ returning_entity: newFilters.actions[0] }) } else { setFilters({ returning_entity: null }) } diff --git a/frontend/src/scenes/insights/InsightTabs/TrendTab/Formula.tsx b/frontend/src/scenes/insights/InsightTabs/TrendTab/Formula.tsx index 6abbfaf0988..495b9fc0554 100644 --- a/frontend/src/scenes/insights/InsightTabs/TrendTab/Formula.tsx +++ b/frontend/src/scenes/insights/InsightTabs/TrendTab/Formula.tsx @@ -27,13 +27,13 @@ export function Formula({ autoFocus={autoFocus} value={value} onChange={(e) => { - let value = e.target.value.toLocaleUpperCase() + let changedValue = e.target.value.toLocaleUpperCase() // Only allow typing of allowed characters - value = value + changedValue = changedValue .split('') .filter((d) => /^[a-zA-Z\ \-\*\^0-9\+\/\(\)]+$/g.test(d)) .join('') - setValue(value) + setValue(changedValue) }} onFocus={() => onFocus && onFocus(true, value)} onBlur={() => !filters.formula && onFocus && onFocus(false, value)} diff --git a/frontend/src/scenes/insights/LineGraph/LineGraph.js b/frontend/src/scenes/insights/LineGraph/LineGraph.js index 013628a7fdb..8d34566d0ab 100644 --- a/frontend/src/scenes/insights/LineGraph/LineGraph.js +++ b/frontend/src/scenes/insights/LineGraph/LineGraph.js @@ -102,15 +102,15 @@ export function LineGraph({ }, [myLineChart.current, size, type, annotationsCondition]) function calculateBoundaries() { - const leftExtent = myLineChart.current.scales['x-axis-0'].left - const rightExtent = myLineChart.current.scales['x-axis-0'].right - const ticks = myLineChart.current.scales['x-axis-0'].ticks.length - const delta = rightExtent - leftExtent - const interval = delta / (ticks - 1) - const topExtent = myLineChart.current.scales['x-axis-0'].top + 8 - setLeftExtent(leftExtent) - setInterval(interval) - setTopExtent(topExtent) + const boundaryLeftExtent = myLineChart.current.scales['x-axis-0'].left + const boundaryRightExtent = myLineChart.current.scales['x-axis-0'].right + const boundaryTicks = myLineChart.current.scales['x-axis-0'].ticks.length + const boundaryDelta = boundaryRightExtent - boundaryLeftExtent + const boundaryInterval = boundaryDelta / (boundaryTicks - 1) + const boundaryTopExtent = myLineChart.current.scales['x-axis-0'].top + 8 + setLeftExtent(boundaryLeftExtent) + setInterval(boundaryInterval) + setTopExtent(boundaryTopExtent) } function processDataset(dataset, index) { diff --git a/frontend/src/scenes/insights/SaveModal/SaveModal.tsx b/frontend/src/scenes/insights/SaveModal/SaveModal.tsx index 3656544a2ae..966d0bf06ba 100644 --- a/frontend/src/scenes/insights/SaveModal/SaveModal.tsx +++ b/frontend/src/scenes/insights/SaveModal/SaveModal.tsx @@ -20,9 +20,9 @@ export const SaveModal: React.FC = (props) => { onCancel() } - function _onSubmit(input: string): void { + function _onSubmit(submittedInput: string): void { setInput('') - onSubmit(input) + onSubmit(submittedInput) } return ( diff --git a/frontend/src/scenes/persons/MergePerson.tsx b/frontend/src/scenes/persons/MergePerson.tsx index f8abd2eb60f..0898989e667 100644 --- a/frontend/src/scenes/persons/MergePerson.tsx +++ b/frontend/src/scenes/persons/MergePerson.tsx @@ -63,10 +63,10 @@ export function MergePerson({ {persons.results && persons.results .filter((p) => p.uuid !== person.uuid) - .map((person) => - person.id ? ( - - {person.name} + .map((p) => + p.id ? ( + + {p.name} ) : undefined )} diff --git a/frontend/src/scenes/sessions/SessionDetails.tsx b/frontend/src/scenes/sessions/SessionDetails.tsx index f4a7a7702f9..e83c1b535ac 100644 --- a/frontend/src/scenes/sessions/SessionDetails.tsx +++ b/frontend/src/scenes/sessions/SessionDetails.tsx @@ -78,9 +78,9 @@ export function SessionDetails({ session }: { session: SessionType }): JSX.Eleme hideOnSinglePage: !events || events.length < 10, showSizeChanger: true, pageSizeOptions: ['10', '20', '50', '100', '200', '500'], - onChange: (page, pageSize) => { - setPage(page) - setPageSize(pageSize || 50) + onChange: (changedPage, changedPageSize) => { + setPage(changedPage) + setPageSize(changedPageSize || 50) }, }} expandable={{ diff --git a/frontend/src/scenes/sessions/filters/DurationFilter.tsx b/frontend/src/scenes/sessions/filters/DurationFilter.tsx index eef151c7efa..05f2079dac4 100644 --- a/frontend/src/scenes/sessions/filters/DurationFilter.tsx +++ b/frontend/src/scenes/sessions/filters/DurationFilter.tsx @@ -1,12 +1,12 @@ import React, { useState } from 'react' import { useActions } from 'kea' -import { RecordingPropertyFilter } from '~/types' +import { PropertyOperator, RecordingDurationFilter } from '~/types' import { Input, Select } from 'antd' import { OperatorSelect } from 'lib/components/PropertyFilters/components/OperatorValueSelect' import { sessionsFiltersLogic } from 'scenes/sessions/filters/sessionsFiltersLogic' interface Props { - filter: RecordingPropertyFilter + filter: RecordingDurationFilter selector: number } @@ -25,9 +25,9 @@ export function DurationFilter({ filter, selector }: Props): JSX.Element { <> { - updateFilter({ ...filter, operator: operator as 'lt' | 'gt' }, selector) + updateFilter({ ...filter, operator }, selector) }} /> diff --git a/frontend/src/scenes/sessions/filters/EditFiltersPanel.tsx b/frontend/src/scenes/sessions/filters/EditFiltersPanel.tsx index a969eb0a099..feec11236e9 100644 --- a/frontend/src/scenes/sessions/filters/EditFiltersPanel.tsx +++ b/frontend/src/scenes/sessions/filters/EditFiltersPanel.tsx @@ -3,7 +3,7 @@ import { Button, Card, Divider, Space } from 'antd' import { useActions, useValues } from 'kea' import { SaveOutlined, SearchOutlined } from '@ant-design/icons' import { CloseButton } from 'lib/components/CloseButton' -import { Entity, EventTypePropertyFilter, PersonPropertyFilter, PropertyFilter, RecordingPropertyFilter } from '~/types' +import { Entity, PersonPropertyFilter, PropertyFilter } from '~/types' import { sessionsFiltersLogic } from 'scenes/sessions/filters/sessionsFiltersLogic' import { EventPropertyFilter } from 'scenes/sessions/filters/EventPropertyFilter' import { PersonFilter } from 'scenes/sessions/filters/UserFilter' @@ -180,14 +180,12 @@ export function EditFiltersPanel({ onSubmit }: Props): JSX.Element | null { - {['event_type', 'action_type'].includes(item.type) && ( - - )} - {item.type === 'person' && ( - + {(item.type === 'event_type' || item.type === 'action_type') && ( + )} + {item.type === 'person' && } {item.type === 'recording' && item.key === 'duration' && ( - + )} {filters.length > 1 && andTag(index < filters.length - 1)} diff --git a/frontend/src/scenes/sessions/filters/EventPropertyFilter.tsx b/frontend/src/scenes/sessions/filters/EventPropertyFilter.tsx index 45b695e2f94..a20589b0bbb 100644 --- a/frontend/src/scenes/sessions/filters/EventPropertyFilter.tsx +++ b/frontend/src/scenes/sessions/filters/EventPropertyFilter.tsx @@ -1,14 +1,14 @@ import React from 'react' import { useActions, useValues } from 'kea' import { PropertySelect } from 'lib/components/PropertyFilters/components/PropertySelect' -import { EventTypePropertyFilter } from '~/types' +import { ActionTypePropertyFilter, EventTypePropertyFilter, PropertyOperator } from '~/types' import { keyMapping } from 'lib/components/PropertyKeyInfo' import { OperatorValueSelect } from 'lib/components/PropertyFilters/components/OperatorValueSelect' import { sessionsFiltersLogic } from 'scenes/sessions/filters/sessionsFiltersLogic' import { propertyDefinitionsLogic } from 'scenes/events/propertyDefinitionsLogic' interface Props { - filter: EventTypePropertyFilter + filter: EventTypePropertyFilter | ActionTypePropertyFilter selector: number } @@ -36,7 +36,9 @@ export function EventPropertyFilter({ filter, selector }: Props): JSX.Element { updateFilter( { ...filter, - properties: [{ operator: 'exact', value: null, ...property, type: 'event', key }], + properties: [ + { operator: PropertyOperator.Exact, value: null, ...property, type: 'event', key }, + ], }, selector ) @@ -49,11 +51,11 @@ export function EventPropertyFilter({ filter, selector }: Props): JSX.Element { propkey={property.key} operator={property.operator} value={property.value} - onChange={(operator, value) => { + onChange={(operator, changedValue) => { updateFilter( { ...filter, - properties: [{ ...property, operator, value }], + properties: [{ ...property, operator, value: changedValue }], }, selector ) diff --git a/frontend/src/scenes/sessions/filters/SessionsFilterBox.tsx b/frontend/src/scenes/sessions/filters/SessionsFilterBox.tsx index 97b238b0773..d4b813d4f04 100644 --- a/frontend/src/scenes/sessions/filters/SessionsFilterBox.tsx +++ b/frontend/src/scenes/sessions/filters/SessionsFilterBox.tsx @@ -100,7 +100,7 @@ export function SessionsFilterBox({ selector }: { selector: FilterSelector }): J id: cohort.id, cohort, })), - renderInfo: function cohorts({ item }) { + renderInfo: function renderCohorts({ item }) { return ( <> Cohorts @@ -144,7 +144,7 @@ export function SessionsFilterBox({ selector }: { selector: FilterSelector }): J name: name, usage_count: count, })), - renderInfo: function userProperty({ item }) { + renderInfo: function renderUserProperty({ item }) { return ( <> User property diff --git a/frontend/src/scenes/sessions/filters/constants.ts b/frontend/src/scenes/sessions/filters/constants.ts index ea039e62e5e..7f0a91dd5da 100644 --- a/frontend/src/scenes/sessions/filters/constants.ts +++ b/frontend/src/scenes/sessions/filters/constants.ts @@ -1,10 +1,10 @@ -import { SessionsPropertyFilter } from '~/types' +import { PropertyOperator, SessionsPropertyFilter } from '~/types' export const SESSIONS_WITH_RECORDINGS_FILTER: SessionsPropertyFilter = { type: 'recording', key: 'duration', value: 0, - operator: 'gt', + operator: PropertyOperator.GreaterThan, label: 'Recording duration', } diff --git a/frontend/src/scenes/sessions/filters/sessionsFiltersLogic.tsx b/frontend/src/scenes/sessions/filters/sessionsFiltersLogic.tsx index 5b58759f840..2d2549973ff 100644 --- a/frontend/src/scenes/sessions/filters/sessionsFiltersLogic.tsx +++ b/frontend/src/scenes/sessions/filters/sessionsFiltersLogic.tsx @@ -4,7 +4,7 @@ import api from 'lib/api' import { toast } from 'react-toastify' import { SESSIONS_WITH_RECORDINGS_FILTER, SESSIONS_WITH_UNSEEN_RECORDINGS } from 'scenes/sessions/filters/constants' import { sessionsFiltersLogicType } from './sessionsFiltersLogicType' -import { SessionsPropertyFilter } from '~/types' +import { PropertyOperator, SessionsPropertyFilter } from '~/types' export type FilterSelector = number | string @@ -146,11 +146,13 @@ export const sessionsFiltersLogic = kea< listeners: ({ actions, values }) => ({ dropdownSelected: ({ type, id, label }) => { if (values.openFilter !== null) { - if (type === 'action_type' || type === 'event_type' || type === 'cohort') { + if (type === 'action_type' || type === 'event_type') { actions.updateFilter({ type, key: 'id', value: id, label }, values.openFilter) + } else if (type === 'cohort') { + actions.updateFilter({ type, key: 'id', value: Number(id), label }, values.openFilter) } else if (type === 'person') { actions.updateFilter( - { type, key: id.toString(), value: null, label, operator: 'exact' }, + { type, key: id.toString(), value: null, label, operator: PropertyOperator.Exact }, values.openFilter ) } else if (type === 'recording' && id === 'duration') { diff --git a/frontend/src/toolbar/actions/SelectorCount.tsx b/frontend/src/toolbar/actions/SelectorCount.tsx index c6117a4d109..70d88cfcc78 100644 --- a/frontend/src/toolbar/actions/SelectorCount.tsx +++ b/frontend/src/toolbar/actions/SelectorCount.tsx @@ -7,16 +7,16 @@ interface SelectorCountProps { export function SelectorCount({ selector }: SelectorCountProps): JSX.Element { const [matches, selectorError] = useMemo(() => { - let selectorError = false - let matches = 0 + let _selectorError = false + let _matches = 0 if (selector) { try { - matches = querySelectorAllDeep(selector).length + _matches = querySelectorAllDeep(selector).length } catch { - selectorError = true + _selectorError = true } } - return [matches, selectorError] + return [_matches, _selectorError] }, [selector]) return ( diff --git a/frontend/src/toolbar/actions/UrlMatchingToggle.tsx b/frontend/src/toolbar/actions/UrlMatchingToggle.tsx index ca7b728fdef..d047889d81a 100644 --- a/frontend/src/toolbar/actions/UrlMatchingToggle.tsx +++ b/frontend/src/toolbar/actions/UrlMatchingToggle.tsx @@ -1,6 +1,6 @@ import React from 'react' import { Button } from 'antd' -import { ActionStepType } from '~/types' +import { ActionStepType, ActionStepUrlMatching } from '~/types' interface UrlMatchingToggleProps { value?: ActionStepType['url_matching'] @@ -13,14 +13,20 @@ export function UrlMatchingToggle({ value, onChange, style }: UrlMatchingToggleP - - diff --git a/frontend/src/toolbar/elements/FocusRect.tsx b/frontend/src/toolbar/elements/FocusRect.tsx index 0a50f0ac560..1eaa5deba04 100644 --- a/frontend/src/toolbar/elements/FocusRect.tsx +++ b/frontend/src/toolbar/elements/FocusRect.tsx @@ -34,17 +34,17 @@ export function FocusRect({ rect }: { rect: DOMRect }): JSX.Element { return ( <> - {rects.map((rect) => ( + {rects.map((r) => (
} diff --git a/package.json b/package.json index a6b26d51e30..4df8bc29483 100644 --- a/package.json +++ b/package.json @@ -138,7 +138,7 @@ "sass-loader": "^10.0.1", "style-loader": "^1.2.1", "ts-node": "^9.1.1", - "typescript": "^4.2.4", + "typescript": "^4.3.2", "webpack": "^4.46.0", "webpack-cli": "^4.5.0", "webpack-dev-server": "^3.11.2" diff --git a/yarn.lock b/yarn.lock index 3326d1215e4..c552df24856 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11772,10 +11772,10 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@^4.2.4: - version "4.2.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.4.tgz#8610b59747de028fda898a8aef0e103f156d0961" - integrity sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg== +typescript@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.2.tgz#399ab18aac45802d6f2498de5054fcbbe716a805" + integrity sha512-zZ4hShnmnoVnAHpVHWpTcxdv7dWP60S2FsydQLV8V5PbS3FifjWFFRiHSWpDJahly88PRyV5teTSLoq4eG7mKw== unbox-primitive@^1.0.0: version "1.0.0"