Design system TextField : ajoute les messages d'erreur et le composant SearchField

wip-johan
Johan Girod 2021-10-18 17:04:47 +02:00 committed by Alexandre Valsamou-Stanislawski
parent 8ca9531234
commit 92f4b2971f
8 changed files with 255 additions and 111 deletions

View File

@ -25,6 +25,7 @@
"@babel/preset-env": "^7.9.5",
"@babel/preset-react": "^7.9.4",
"@babel/preset-typescript": "^7.9.0",
"@react-types/searchfield": "^3.1.2",
"@types/cheerio": "^0.22.18",
"@types/js-yaml": "^3.12.2",
"@types/mocha": "^8.2.2",
@ -63,8 +64,10 @@
},
"dependencies": {
"@babel/runtime": "^7.3.4",
"@react-aria/searchfield": "^3.2.0",
"@react-aria/textfield": "^3.4.0",
"@react-pdf/renderer": "^1.6.10",
"@react-stately/searchfield": "^3.1.3",
"@rehooks/local-storage": "^2.1.1",
"@sentry/react": "^6.3.5",
"@sentry/tracing": "^6.3.5",

View File

@ -3,6 +3,7 @@ import React, { useCallback, useMemo, useState } from 'react'
import { Trans, useTranslation } from 'react-i18next'
import styled, { css } from 'styled-components'
import { debounce } from '../../../utils'
import { SearchField } from 'DesignSystem/field'
import { InputProps } from '../RuleInput'
export type ApiCommuneJson = {
@ -140,15 +141,15 @@ export default function Select({ onChange, value, id, missing }: InputProps) {
}, [searchResults, focusedElem, noResult, handleSubmit])
const handleChange = useCallback(
(e: React.ChangeEvent<HTMLInputElement>) => {
(value: string) => {
setFocusedElem(0)
setName(e.target.value)
if (e.target.value.length < 2) {
setName(value)
if (value.length < 2) {
setSearchResults(null)
return
}
setLoadingState(true)
debouncedHandleSearch(e.target.value)
debouncedHandleSearch(value)
},
[debouncedHandleSearch]
)
@ -183,32 +184,21 @@ export default function Select({ onChange, value, id, missing }: InputProps) {
return (
<div>
<input
<SearchField
role="combobox"
errorMessage={noResult && <Trans>Cette commune n'existe pas</Trans>}
type="search"
id={id}
aria-autocomplete="list"
onBlur={submitFocusedElem}
aria-readonly="true"
css={noResult ? 'border-color: firebrick !important' : ''}
className="ui__"
onKeyDown={handleKeyDown}
aria-controls="liste-commune"
placeholder={t('Commune ou code postal')}
label={t('Commune ou code postal')}
value={name}
onChange={handleChange}
/>
{noResult && (
<p
className="ui__ notice"
css={`
color: firebrick !important;
margin-top: -0.4rem;
`}
>
<Trans>Cette commune n'existe pas</Trans>
</p>
)}
{!!searchResults && (
<FromTop>

View File

@ -0,0 +1,50 @@
import { InputHTMLAttributes, useRef } from 'react'
import { useSearchField } from '@react-aria/searchfield'
import { AriaSearchFieldProps } from '@react-types/searchfield'
import { useSearchFieldState } from '@react-stately/searchfield'
import {
StyledContainer,
StyledDescription,
StyledInput,
StyledInputContainer,
StyledLabel,
} from './TextField'
import styled from 'styled-components'
export default function SearchField(props: AriaSearchFieldProps) {
const state = useSearchFieldState(props)
const ref = useRef<HTMLInputElement>(null)
const { labelProps, inputProps, descriptionProps, clearButtonProps } =
useSearchField(props, state, ref)
return (
<StyledContainer>
<StyledInputContainer
error={!!props.errorMessage || props.validationState === 'invalid'}
>
<StyledInput
{...(inputProps as InputHTMLAttributes<HTMLInputElement>)}
ref={ref}
/>
<StyledLabel {...labelProps}>{props.label}</StyledLabel>
{state.value !== '' && (
<StyledClearButton {...clearButtonProps}>×</StyledClearButton>
)}
</StyledInputContainer>
{props.description && (
<StyledDescription {...descriptionProps} style={{ fontSize: 12 }}>
{props.description}
</StyledDescription>
)}
</StyledContainer>
)
}
const StyledClearButton = styled.button`
position: absolute;
right: 0;
font-size: 2rem;
line-height: 2rem;
height: ${({ theme }) => theme.spacings.xxxl};
padding: ${({ theme }) => `${theme.spacings.md} ${theme.spacings.sm}`};
`

View File

@ -1,67 +1,46 @@
import { InputHTMLAttributes, useRef } from 'react'
import styled from 'styled-components'
import styled, { css } from 'styled-components'
import { useTextField, AriaTextFieldOptions } from '@react-aria/textfield'
import { ExtraSmallBody } from 'DesignSystem/typography/paragraphs'
const LABEL_HEIGHT = '1rem'
export default function TextField(props: AriaTextFieldOptions) {
const ref = useRef<HTMLInputElement>(null)
const { labelProps, inputProps, descriptionProps } = useTextField(
{ ...props, inputElementType: 'input' },
ref
)
const { labelProps, inputProps, descriptionProps, errorMessageProps } =
useTextField({ ...props, inputElementType: 'input' }, ref)
return (
<>
<StyledInputContainer>
<StyledContainer>
<StyledInputContainer
error={!!props.errorMessage || props.validationState === 'invalid'}
>
<StyledInput
{...(inputProps as InputHTMLAttributes<HTMLInputElement>)}
ref={ref}
/>
<StyledLabel {...labelProps}>{props.label}</StyledLabel>
</StyledInputContainer>
{props.errorMessage && (
<StyledErrorMessage {...errorMessageProps}>
{props.errorMessage}
</StyledErrorMessage>
)}
{props.description && (
<StyledDescription {...descriptionProps} style={{ fontSize: 12 }}>
<StyledDescription {...descriptionProps}>
{props.description}
</StyledDescription>
)}
</>
</StyledContainer>
)
}
const labelHeight = '1rem'
const StyledInputContainer = styled.div`
border-radius: ${({ theme }) => theme.box.borderRadius};
border: ${({ theme }) => theme.box.borderWidth} solid
${({ theme }) => theme.colors.extended.grey[500]};
outline: transparent solid 1px;
position: relative;
flex-direction: column;
transition: outline-color, border-color 0.3s;
height: ${({ theme }) => theme.spacings.xxxl};
:focus-within {
outline-color: ${({ theme }) => theme.colors.bases.primary[600]};
border-color: ${({ theme }) => theme.colors.bases.primary[600]};
}
:focus-within label {
color: ${({ theme }) => theme.colors.bases.primary[800]};
}
:focus-within + p {
color: ${({ theme }) => theme.colors.bases.primary[800]};
}
input:not(:focus):placeholder-shown + label {
font-size: 1rem;
line-height: 1.5rem;
pointer-events: none;
top: 50%;
transform: translateY(-50%);
}
export const StyledContainer = styled.div`
width: 100%;
min-width: fit-content;
margin-bottom: ${({ theme }) => theme.spacings.lg};
`
const StyledInput = styled.input`
export const StyledInput = styled.input`
font-size: 1rem;
line-height: 1.5rem;
border: none;
@ -72,15 +51,16 @@ const StyledInput = styled.input`
height: 100%;
outline: none;
position: absolute;
padding: calc(${labelHeight} + ${({ theme }) => theme.spacings.xs})
padding: calc(${LABEL_HEIGHT} + ${({ theme }) => theme.spacings.xs})
${({ theme }) => theme.spacings.sm} ${({ theme }) => theme.spacings.xs};
`
const StyledLabel = styled.label`
export const StyledLabel = styled.label`
top: 0%;
transform: translateY(0%);
font-size: 0.75rem;
line-height: ${labelHeight};
line-height: ${LABEL_HEIGHT};
font-family: ${({ theme }) => theme.fonts.main};
padding: ${({ theme }) => theme.spacings.xs}
${({ theme }) => theme.spacings.sm};
@ -89,56 +69,56 @@ const StyledLabel = styled.label`
transition: all 0.1s;
`
const StyledDescription = styled(ExtraSmallBody)`
export const StyledDescription = styled(ExtraSmallBody)`
padding: ${({ theme }) => theme.spacings.xxs}
${({ theme }) => theme.spacings.sm};
will-change: feColorMatrix;
will-change: color;
transition: color 0.2s;
`
// /* Type=Input text, Legend=False, Status=Default */
// /* Auto Layout */
// display: flex;
// flex-direction: column;
// align-items: flex-start;
// padding: 20px 16px;
const StyledErrorMessage = styled(StyledDescription)`
color: ${({ theme }) => theme.colors.extended.error[400]} !important;
`
// position: absolute;
// width: 360px;
// height: 64px;
// right: 1634px;
// bottom: 1055px;
export const StyledInputContainer = styled.div<{ error: boolean }>`
border-radius: ${({ theme }) => theme.box.borderRadius};
border: ${({ theme }) =>
`${theme.box.borderWidth} solid ${theme.colors.extended.grey[500]}`};
outline: transparent solid 1px;
position: relative;
flex-direction: column;
transition: all 0.2s;
height: ${({ theme }) => theme.spacings.xxxl};
:focus-within {
outline-color: ${({ theme, error }) =>
error
? theme.colors.extended.error[400]
: theme.colors.bases.primary[600]};
}
:focus-within ${StyledLabel} {
color: ${({ theme }) => theme.colors.bases.primary[800]};
}
// /* Base/UR White */
// background: #FFFFFF;
// /* Base/UR Grey N°5 */
// border: 1px solid #6C757D;
// box-sizing: border-box;
// border-radius: 6px;
:focus-within + ${StyledDescription} {
color: ${({ theme }) => theme.colors.bases.primary[800]};
}
// /* Label */
input:not(:focus):placeholder-shown + ${StyledLabel} {
font-size: 1rem;
line-height: 1.5rem;
pointer-events: none;
top: 50%;
transform: translateY(-50%);
}
// position: static;
// left: 16px;
// right: 16px;
// top: 20px;
// bottom: 20px;
// /* Form/Label_inactive */
// font-family: Roboto;
// font-style: normal;
// font-weight: normal;
// font-size: 16px;
// line-height: 24px;
// /* identical to box height, or 150% */
// text-align: justify;
// /* Base/UR Grey N°7 */
// color: #212529;
// /* Inside Auto Layout */
// flex: none;
// order: 0;
// align-self: stretch;
// flex-grow: 0;
// margin: 10px 0px;
${({ theme, error }) =>
error &&
css`
&& {
border-color: ${theme.colors.extended.error[400]};
}
&&& label {
color: ${theme.colors.extended.error[400]};
}
`}
`

View File

@ -1 +1,2 @@
export { default as TextField } from './TextField'
export { default as SearchField } from './SearchField'

View File

@ -199,6 +199,7 @@ function FormulairePublicodes() {
)}
<RuleInput
id={dottedName}
label={question ?? title}
dottedName={dottedName as DottedName}
onChange={(value) => onChange(dottedName, value)}
/>

127
yarn.lock
View File

@ -2714,6 +2714,45 @@
resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed"
integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==
"@formatjs/ecma402-abstract@1.10.0":
version "1.10.0"
resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.10.0.tgz#f51b9167535c9463113c24644de90262aa5d31a7"
integrity sha512-WNkcUHC6xw12rWY87TUw6KXzb1LnOooYBLLqtyn1kW2j197rcwpqmUOJMBED56YcLzaJPfVw1L2ShiDhL5pVnQ==
dependencies:
"@formatjs/intl-localematcher" "0.2.21"
tslib "^2.1.0"
"@formatjs/fast-memoize@1.2.0":
version "1.2.0"
resolved "https://registry.yarnpkg.com/@formatjs/fast-memoize/-/fast-memoize-1.2.0.tgz#1123bfcc5d21d761f15d8b1c32d10e1b6530355d"
integrity sha512-fObitP9Tlc31SKrPHgkPgQpGo4+4yXfQQITTCNH8AZdEqB7Mq4nPrjpUL/tNGN3lEeJcFxDbi0haX8HM7QvQ8w==
dependencies:
tslib "^2.1.0"
"@formatjs/icu-messageformat-parser@2.0.13":
version "2.0.13"
resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.0.13.tgz#fcd7816b3d0b799daf20ff9e5e0fe81d3618276e"
integrity sha512-dIdcNnuJj1V+DnXQUjJTA+uES/UCpxLPbIA8R1wSrWY/yCgv9N1beSY1lTHrhcG0XC++ShP+AEqqVV/zX3BMZg==
dependencies:
"@formatjs/ecma402-abstract" "1.10.0"
"@formatjs/icu-skeleton-parser" "1.3.0"
tslib "^2.1.0"
"@formatjs/icu-skeleton-parser@1.3.0":
version "1.3.0"
resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.3.0.tgz#fedf604bf788a587b23c9a03ec148c1f2c3177f7"
integrity sha512-ORUHdglLuE0Vvg3KlxeeguDq2ErUlCWmIU9EmQAhqwhtRwf78nNy2WAJ9qvxzSsp4dAv1CJ9AoS43RdY8JTVaA==
dependencies:
"@formatjs/ecma402-abstract" "1.10.0"
tslib "^2.1.0"
"@formatjs/intl-localematcher@0.2.21":
version "0.2.21"
resolved "https://registry.yarnpkg.com/@formatjs/intl-localematcher/-/intl-localematcher-0.2.21.tgz#39ef33d701fe8084f3d693cd3ff7cbe03cdd3a49"
integrity sha512-JTJeLiNwexN4Gy0cMxoUPvJbKhXdnSuo5jPrDafEZpnDWlJ5VDYta8zUVVozO/pwzEmFVHEUpgiEDj+39L4oMg==
dependencies:
tslib "^2.1.0"
"@hapi/address@^2.1.2":
version "2.1.4"
resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5"
@ -2757,6 +2796,21 @@
resolved "https://registry.yarnpkg.com/@icons/material/-/material-0.2.4.tgz#e90c9f71768b3736e76d7dd6783fc6c2afa88bc8"
integrity sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw==
"@internationalized/message@^3.0.2":
version "3.0.2"
resolved "https://registry.yarnpkg.com/@internationalized/message/-/message-3.0.2.tgz#c3db2b6b7f75af815819f77da11f8424381416e3"
integrity sha512-ZZ8FQDCsri3vUB2mfDD76Vbf97DH361AiZUXKHV4BqwCtYyaNYiZqIr8KXrcMCxJvrIYVQLSn8+jeIQRO3bvtw==
dependencies:
"@babel/runtime" "^7.6.2"
intl-messageformat "^9.6.12"
"@internationalized/number@^3.0.2":
version "3.0.3"
resolved "https://registry.yarnpkg.com/@internationalized/number/-/number-3.0.3.tgz#d29003dffdff54ca6f2287ec0cb77ff3d045478f"
integrity sha512-ewFoVvsxSyd9QZnknvOWPjirYqdMQhXTeDhJg3hM6C/FeZt0banpGH1nZ0SGMZXHz8NK9uAa2KVIq+jqAIOg4w==
dependencies:
"@babel/runtime" "^7.6.2"
"@istanbuljs/load-nyc-config@^1.0.0":
version "1.1.0"
resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced"
@ -2998,6 +3052,18 @@
"@react-types/shared" "^3.9.0"
clsx "^1.1.1"
"@react-aria/i18n@^3.3.2":
version "3.3.2"
resolved "https://registry.yarnpkg.com/@react-aria/i18n/-/i18n-3.3.2.tgz#891902938333c6ab5491b7acb7581f8567045dbc"
integrity sha512-a4AptbWLPVMJfjPdyW60TFtT4gvKAputx9YaUrIywoV/5p900AcOOc3uuL43+vuCKBzMkGUeTa1a4eL1HstDUA==
dependencies:
"@babel/runtime" "^7.6.2"
"@internationalized/message" "^3.0.2"
"@internationalized/number" "^3.0.2"
"@react-aria/ssr" "^3.0.3"
"@react-aria/utils" "^3.8.2"
"@react-types/shared" "^3.8.0"
"@react-aria/interactions@^3.6.0":
version "3.6.0"
resolved "https://registry.yarnpkg.com/@react-aria/interactions/-/interactions-3.6.0.tgz#63c16e6179e8ae38221e26256d9a7639d7f9b24e"
@ -3017,7 +3083,22 @@
"@react-types/label" "^3.5.0"
"@react-types/shared" "^3.9.0"
"@react-aria/ssr@^3.1.0":
"@react-aria/searchfield@^3.2.0":
version "3.2.0"
resolved "https://registry.yarnpkg.com/@react-aria/searchfield/-/searchfield-3.2.0.tgz#f0f8609c2e3a7ed300209f6aa01f6d782c131f81"
integrity sha512-uD3wSsvsZYW8LJ1hnt/5aWwcqmNT1Qorio2PizfvY7jKC4FytU/wjxxI8p8mRRtffltqldgTPgakAwW3KYPpAw==
dependencies:
"@babel/runtime" "^7.6.2"
"@react-aria/i18n" "^3.3.2"
"@react-aria/interactions" "^3.6.0"
"@react-aria/textfield" "^3.4.0"
"@react-aria/utils" "^3.9.0"
"@react-stately/searchfield" "^3.1.3"
"@react-types/button" "^3.4.1"
"@react-types/searchfield" "^3.1.2"
"@react-types/shared" "^3.9.0"
"@react-aria/ssr@^3.0.3", "@react-aria/ssr@^3.1.0":
version "3.1.0"
resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.1.0.tgz#b7163e6224725c30121932a8d1422ef91d1fab22"
integrity sha512-RxqQKmE8sO7TGdrcSlHTcVzMP450hqowtBSd2bBS9oPlcokVkaGq28c3Rwa8ty5ctw4EBCjXqjP7xdcKMGDzug==
@ -3036,7 +3117,7 @@
"@react-types/shared" "^3.9.0"
"@react-types/textfield" "^3.3.0"
"@react-aria/utils@^3.9.0":
"@react-aria/utils@^3.8.2", "@react-aria/utils@^3.9.0":
version "3.9.0"
resolved "https://registry.yarnpkg.com/@react-aria/utils/-/utils-3.9.0.tgz#c5446f807091a744311d4d559fa8a42e7448824d"
integrity sha512-P0dEOMHGHHJ5KC8iCpaMxAtgdUdeISAm4FZnmoD5fK3JxlKEC046hUxlad83RkNOBZkT2dDvF4HeDCUqdMWHKQ==
@ -3114,6 +3195,16 @@
dependencies:
unicode-trie "^0.3.0"
"@react-stately/searchfield@^3.1.3":
version "3.1.3"
resolved "https://registry.yarnpkg.com/@react-stately/searchfield/-/searchfield-3.1.3.tgz#c2fe18be4ca8478c3bb3fdebc7e9e4a14ebfae07"
integrity sha512-IIsgZ87RgdSTLcXB3U+EdgbtAXlpw50G9fDYhwpjIaiZQ60RsaEz0mo+s1+oapXGudCFWyQYNR+nqF7jzNKxwg==
dependencies:
"@babel/runtime" "^7.6.2"
"@react-stately/utils" "^3.2.2"
"@react-types/searchfield" "^3.1.2"
"@react-types/shared" "^3.8.0"
"@react-stately/utils@^3.2.2":
version "3.2.2"
resolved "https://registry.yarnpkg.com/@react-stately/utils/-/utils-3.2.2.tgz#468eafa60740c6b0b847a368215dfaa55e87f505"
@ -3121,6 +3212,13 @@
dependencies:
"@babel/runtime" "^7.6.2"
"@react-types/button@^3.4.1":
version "3.4.1"
resolved "https://registry.yarnpkg.com/@react-types/button/-/button-3.4.1.tgz#715ac9d4997c79233be4d9020b58f85936b8252b"
integrity sha512-B54M84LxdEppwjXNlkBEJyMfe9fd+bvFV7R6+NJvupGrZm/LuFNYjFcHk7yjMKWTdWm6DbpIuQz54n5qTW7Vlg==
dependencies:
"@react-types/shared" "^3.8.0"
"@react-types/label@^3.5.0":
version "3.5.0"
resolved "https://registry.yarnpkg.com/@react-types/label/-/label-3.5.0.tgz#c7093871f42c62e1b5523f61a0856a2f58d4cf2a"
@ -3128,12 +3226,19 @@
dependencies:
"@react-types/shared" "^3.9.0"
"@react-types/shared@^3.9.0":
"@react-types/searchfield@^3.1.2":
version "3.1.2"
resolved "https://registry.yarnpkg.com/@react-types/searchfield/-/searchfield-3.1.2.tgz#184770b67f1fad57a6024ad00b7e42cf934ed54b"
integrity sha512-lIyXEzoS/XXmddAvgZk/a8/8qAkVt5XbUrX7CrpZOiwqIPsVDI2bDYiv7N9GdS0pMeSyu1X9mXCnJfvzu/Dkow==
dependencies:
"@react-types/textfield" "^3.2.3"
"@react-types/shared@^3.8.0", "@react-types/shared@^3.9.0":
version "3.9.0"
resolved "https://registry.yarnpkg.com/@react-types/shared/-/shared-3.9.0.tgz#d834f3e6e2c992089192f3c83fb7963e3a6f5207"
integrity sha512-YYksINfR6q92P10AhPEGo47Hd7oz1hrnZ6Vx8Gsrq62IbqDdv1XOTzPBaj17Z1ymNY2pitLUSEXsLmozt4wxxQ==
"@react-types/textfield@^3.3.0":
"@react-types/textfield@^3.2.3", "@react-types/textfield@^3.3.0":
version "3.3.0"
resolved "https://registry.yarnpkg.com/@react-types/textfield/-/textfield-3.3.0.tgz#07a447fda327df4843e7d36cbd00f87f8a73e725"
integrity sha512-lOf0tx3c3dVaomH/uvKpOKFVTXQ232kLnMhOJTtj97JDX7fTr3SNhDUV0G8Zf4M0vr+l+xkTrJkywYE23rzliw==
@ -9791,6 +9896,15 @@ intl-locales-supported@^1.0.0:
resolved "https://registry.yarnpkg.com/intl-locales-supported/-/intl-locales-supported-1.8.12.tgz#bbd83475a1cda61dc026309ca61f64c450af8ccb"
integrity sha512-FJPl7p1LYO/C+LpwlDcvVpq7AeFTdFgwnq1JjdNYKjb51xkIxssXRR8LaA0fJFogjwRRztqw1ahgSJMSZsSFdw==
intl-messageformat@^9.6.12:
version "9.9.3"
resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-9.9.3.tgz#bf577b3a78c38f6cb81dda3952390df9be5be01d"
integrity sha512-YeXTVG1QAfDySO/gbpIrnMw3sKZvmNljahaTWFSGWNs0cNtR6vzwwvg6tzlda4buOw7xzJU3DgLm+skyMC85ow==
dependencies:
"@formatjs/fast-memoize" "1.2.0"
"@formatjs/icu-messageformat-parser" "2.0.13"
tslib "^2.1.0"
intl@^1.2.5:
version "1.2.5"
resolved "https://registry.yarnpkg.com/intl/-/intl-1.2.5.tgz#82244a2190c4e419f8371f5aa34daa3420e2abde"
@ -15962,6 +16076,11 @@ tslib@^1.9.0:
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
tslib@^2.1.0:
version "2.3.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01"
integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==
tsutils@^3.17.1:
version "3.17.1"
resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759"