diff --git a/shared/people/index.shared.tsx b/shared/people/index.shared.tsx index 57aa851c141d..1a671c87a6c1 100644 --- a/shared/people/index.shared.tsx +++ b/shared/people/index.shared.tsx @@ -10,10 +10,7 @@ import Todo from './todo' import {clearSignupEmail} from './signup-email' // import WotTask from './wot-task' -const itemToComponent: (item: T.Immutable, props: Props) => React.ReactNode = ( - item, - props -) => { +const renderPeopleItem = (item: T.Immutable, props: Props): React.ReactNode => { switch (item.type) { case 'todo': return ( @@ -63,6 +60,17 @@ const itemToComponent: (item: T.Immutable, props: Pro } } +const shouldRenderNewItem = (item: T.Immutable, signupEmail: string) => + item.type !== 'todo' || item.todoType !== 'verifyAllEmail' || !signupEmail + +const PeopleItems = ({ + items, + props, +}: { + items: ReadonlyArray> + props: Props +}): Array => items.map((item): React.ReactNode => renderPeopleItem(item, props)) + function EmailVerificationBanner(props: {signupEmail: string}) { const {signupEmail} = props React.useEffect( @@ -117,13 +125,13 @@ function ResentEmailVerificationBanner(props: { } export function PeoplePageList(props: Props) { + const visibleNewItems = props.newItems.filter(item => shouldRenderNewItem(item, props.signupEmail)) + return ( - {props.newItems - .filter(item => item.type !== 'todo' || item.todoType !== 'verifyAllEmail' || !props.signupEmail) - .map((item): React.ReactNode => itemToComponent(item, props))} + {/*Array.from(props.wotUpdates, ([key, item]) => ( - {props.oldItems.map((item): React.ReactNode => itemToComponent(item, props))} + ) } diff --git a/shared/people/todo.tsx b/shared/people/todo.tsx index 450947c4d861..b390fec71405 100644 --- a/shared/people/todo.tsx +++ b/shared/people/todo.tsx @@ -8,6 +8,7 @@ import PeopleItem, {type TaskButton} from './item' import * as Kb from '@/common-adapters' import {useSettingsEmailState} from '@/stores/settings-email' import {settingsAccountTab, settingsGitTab} from '@/constants/settings' +import type {AppTab} from '@/constants/tabs' import {useTrackerState} from '@/stores/tracker' import {useCurrentUserState} from '@/stores/current-user' import {navToProfile} from '@/constants/router' @@ -46,8 +47,8 @@ type TodoOwnProps = { } const installLinkURL = 'https://keybase.io/download' -const useOnSkipTodo = (skipTodo: (type: T.People.TodoType) => void, type: T.People.TodoType) => () => { - skipTodo(type) +const useOnSkipTodo = (skipTodo: (type: T.People.TodoType) => void, type?: T.People.TodoType) => () => { + type && skipTodo(type) } function makeDefaultButtons( @@ -72,116 +73,120 @@ function makeDefaultButtons( return result } -const AddEmailConnector = (props: TodoOwnProps) => { - const {navigateAppend, switchTab} = C.Router2 - const onConfirm = () => { - switchTab(C.Tabs.settingsTab) - navigateAppend(settingsAccountTab) - navigateAppend('settingsAddEmail') - } - const onDismiss = useOnSkipTodo(props.skipTodo, 'addEmail') - const buttons = makeDefaultButtons(onConfirm, props.confirmLabel, onDismiss) - return +const useRouterNavigation = () => C.Router2 + +type BasicTaskProps = TodoOwnProps & { + dismissLabel?: string + dismissTodoType?: T.People.TodoType + onConfirm: () => void + subText?: string +} + +const BasicTask = ({ + dismissLabel, + dismissTodoType, + onConfirm, + subText, + ...props +}: BasicTaskProps) => { + const onDismiss = useOnSkipTodo(props.skipTodo, dismissTodoType) + return ( + + ) +} + +type SettingsAccountTaskProps = TodoOwnProps & { + destination?: 'settingsAddEmail' | 'settingsAddPhone' + dismissTodoType?: T.People.TodoType } -const AddPhoneNumberConnector = (props: TodoOwnProps) => { - const {navigateAppend, switchTab} = C.Router2 +const SettingsAccountTask = ({ + destination, + dismissTodoType, + ...props +}: SettingsAccountTaskProps) => { + const {navigateAppend, switchTab} = useRouterNavigation() const onConfirm = () => { switchTab(C.Tabs.settingsTab) navigateAppend(settingsAccountTab) - navigateAppend('settingsAddPhone') + destination && navigateAppend(destination) } - const onDismiss = useOnSkipTodo(props.skipTodo, 'addPhoneNumber') - const buttons = makeDefaultButtons(onConfirm, props.confirmLabel, onDismiss) - return + return } -const AvatarTeamConnector = (props: TodoOwnProps) => { - const switchTab = C.Router2.switchTab - const onConfirm = () => switchTab(C.Tabs.teamsTab) - const buttons = makeDefaultButtons(onConfirm, props.confirmLabel) - return +type SwitchTabTaskProps = TodoOwnProps & { + dismissTodoType?: T.People.TodoType + tab: AppTab } -const AvatarUserConnector = (props: TodoOwnProps) => { - const onConfirm = editAvatar - const buttons = makeDefaultButtons(onConfirm, props.confirmLabel) - return -} +const SwitchTabTask = ({dismissTodoType, tab, ...props}: SwitchTabTaskProps) => ( + C.Router2.switchTab(tab)} /> +) -const BioConnector = (props: TodoOwnProps) => { +const AvatarUserTask = (props: TodoOwnProps) => ( + +) + +const BioTask = (props: TodoOwnProps) => { const myUsername = useCurrentUserState(s => s.username) const showUser = useTrackerState(s => s.dispatch.showUser) - const onConfirm = (username: string) => { - // make sure we have tracker state & profile is up to date - showUser(username, false) + const onConfirm = () => { + // Ensure tracker state exists and the profile view is up to date. + showUser(myUsername, false) } - const buttons = makeDefaultButtons(() => onConfirm(myUsername), props.confirmLabel) - return + return } -const ProofConnector = (props: TodoOwnProps) => { +const ProofTask = (props: TodoOwnProps) => { const myUsername = useCurrentUserState(s => s.username) - const onConfirm = navToProfile - const onDismiss = useOnSkipTodo(props.skipTodo, 'proof') - const buttons = makeDefaultButtons(() => onConfirm(myUsername), props.confirmLabel, onDismiss) - return + return navToProfile(myUsername)} /> } -const DeviceConnector = (props: TodoOwnProps) => { - const onConfirm = () => openURL(installLinkURL) - const onDismiss = useOnSkipTodo(props.skipTodo, 'device') - const buttons = makeDefaultButtons(onConfirm, props.confirmLabel, onDismiss) - return -} +const OpenURLTask = ({ + dismissTodoType, + url, + ...props +}: TodoOwnProps & {dismissTodoType?: T.People.TodoType; url: string}) => ( + openURL(url)} /> +) -const FollowConnector = (props: TodoOwnProps) => { +const FollowTask = (props: TodoOwnProps) => { const appendPeopleBuilder = C.Router2.appendPeopleBuilder - const onConfirm = () => { - appendPeopleBuilder() - } - const onDismiss = useOnSkipTodo(props.skipTodo, 'follow') - const buttons = makeDefaultButtons(onConfirm, props.confirmLabel, onDismiss) - return + return } -const ChatConnector = (props: TodoOwnProps) => { - const switchTab = C.Router2.switchTab - const onConfirm = () => switchTab(C.Tabs.chatTab) - const onDismiss = useOnSkipTodo(props.skipTodo, 'chat') - const buttons = makeDefaultButtons(onConfirm, props.confirmLabel, onDismiss) - return -} - -const PaperKeyConnector = (props: TodoOwnProps) => { - const navigateAppend = C.Router2.navigateAppend - const onConfirm = () => navigateAppend({name: 'deviceAdd', params: {highlight: ['paper key']}}) - const buttons = makeDefaultButtons(onConfirm, props.confirmLabel) - return -} +const PaperKeyTask = (props: TodoOwnProps) => ( + C.Router2.navigateAppend({name: 'deviceAdd', params: {highlight: ['paper key']}})} + /> +) -const TeamConnector = (props: TodoOwnProps) => { - const switchTab = C.Router2.switchTab +const TeamTask = (props: TodoOwnProps) => { const launchNewTeamWizardOrModal = useTeamsState(s => s.dispatch.launchNewTeamWizardOrModal) - const onConfirm = () => { - switchTab(C.Tabs.teamsTab) - launchNewTeamWizardOrModal() - } - const onDismiss = useOnSkipTodo(props.skipTodo, 'team') - const buttons = makeDefaultButtons(onConfirm, props.confirmLabel, onDismiss) - return -} - -const FolderConnector = (props: TodoOwnProps) => { - const switchTab = C.Router2.switchTab - const onConfirm = () => switchTab(C.Tabs.fsTab) - const onDismiss = useOnSkipTodo(props.skipTodo, 'folder') - const buttons = makeDefaultButtons(onConfirm, props.confirmLabel, onDismiss) - return + return ( + { + C.Router2.switchTab(C.Tabs.teamsTab) + launchNewTeamWizardOrModal() + }} + /> + ) } -const GitRepoConnector = (props: TodoOwnProps) => { - const {navigateAppend, switchTab} = C.Router2 +const GitRepoTask = (props: TodoOwnProps) => { + const {navigateAppend, switchTab} = useRouterNavigation() const onConfirm = (isTeam: boolean) => { if (C.isMobile) { navigateAppend(settingsGitTab) @@ -209,21 +214,13 @@ const GitRepoConnector = (props: TodoOwnProps) => { return } -const TeamShowcaseConnector = (props: TodoOwnProps) => { - const switchTab = C.Router2.switchTab - const onConfirm = () => switchTab(C.Tabs.teamsTab) - const onDismiss = useOnSkipTodo(props.skipTodo, 'teamShowcase') - const buttons = makeDefaultButtons(onConfirm, props.confirmLabel, onDismiss) - return -} - -const VerifyAllEmailConnector = (props: TodoOwnProps) => { +const VerifyAllEmailTask = (props: TodoOwnProps) => { const editEmail = useSettingsEmailState(s => s.dispatch.editEmail) const onConfirm = (email: string) => { editEmail({email, verify: true}) props.setResentEmail(email) } - const {navigateAppend, switchTab} = C.Router2 + const {navigateAppend, switchTab} = useRouterNavigation() const onManage = () => { switchTab(C.Tabs.settingsTab) navigateAppend(settingsAccountTab) @@ -254,8 +251,8 @@ const VerifyAllEmailConnector = (props: TodoOwnProps) => { return } -const VerifyAllPhoneNumberConnector = (props: TodoOwnProps) => { - const {navigateAppend, switchTab} = C.Router2 +const VerifyAllPhoneNumberTask = (props: TodoOwnProps) => { + const {navigateAppend, switchTab} = useRouterNavigation() const onConfirm = (phoneNumber: string) => { navigateAppend({name: 'settingsVerifyPhone', params: {initialResend: true, phoneNumber}}) } @@ -285,9 +282,9 @@ const VerifyAllPhoneNumberConnector = (props: TodoOwnProps) => { return } -const LegacyEmailVisibilityConnector = (props: TodoOwnProps) => { +const LegacyEmailVisibilityTask = (props: TodoOwnProps) => { const editEmail = useSettingsEmailState(s => s.dispatch.editEmail) - const {navigateAppend, switchTab} = C.Router2 + const {navigateAppend, switchTab} = useRouterNavigation() const onConfirm = (email: string) => { switchTab(C.Tabs.settingsTab) navigateAppend(settingsAccountTab) @@ -320,39 +317,41 @@ const LegacyEmailVisibilityConnector = (props: TodoOwnProps) => { const TaskChooser = (props: TodoOwnProps) => { switch (props.todoType) { case todoTypes.addEmail: - return + return case todoTypes.addPhoneNumber: - return + return ( + + ) case todoTypes.avatarTeam: - return + return case todoTypes.avatarUser: - return + return case todoTypes.bio: - return + return case todoTypes.proof: - return + return case todoTypes.device: - return + return case todoTypes.follow: - return + return case todoTypes.chat: - return + return case todoTypes.paperkey: - return + return case todoTypes.team: - return + return case todoTypes.folder: - return + return case todoTypes.gitRepo: - return + return case todoTypes.legacyEmailVisibility: - return + return case todoTypes.teamShowcase: - return + return case todoTypes.verifyAllEmail: - return + return case todoTypes.verifyAllPhoneNumber: - return + return default: return null } diff --git a/shared/yarn.lock b/shared/yarn.lock index 472bcef35148..e5bd0e72eeb6 100644 --- a/shared/yarn.lock +++ b/shared/yarn.lock @@ -4860,24 +4860,24 @@ bplist-parser@^0.3.1: big-integer "1.6.x" brace-expansion@^1.1.7: - version "1.1.12" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843" - integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== + version "1.1.13" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.13.tgz#d37875c01dc9eff988dd49d112a57cb67b54efe6" + integrity sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w== dependencies: balanced-match "^1.0.0" concat-map "0.0.1" brace-expansion@^2.0.1, brace-expansion@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.2.tgz#54fc53237a613d854c7bd37463aad17df87214e7" - integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ== + version "2.0.3" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.3.tgz#0493338bdd58e319b1039c67cf7ee439892c01d9" + integrity sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA== dependencies: balanced-match "^1.0.0" brace-expansion@^5.0.2: - version "5.0.4" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-5.0.4.tgz#614daaecd0a688f660bbbc909a8748c3d80d4336" - integrity sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg== + version "5.0.5" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-5.0.5.tgz#dcc3a37116b79f3e1b46db994ced5d570e930fdb" + integrity sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ== dependencies: balanced-match "^4.0.2" @@ -6633,18 +6633,21 @@ fast-uri@^3.0.1: resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.1.0.tgz#66eecff6c764c0df9b762e62ca7edcfb53b4edfa" integrity sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA== -fast-xml-builder@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fast-xml-builder/-/fast-xml-builder-1.0.0.tgz#a485d7e8381f1db983cf006f849d1066e2935241" - integrity sha512-fpZuDogrAgnyt9oDDz+5DBz0zgPdPZz6D4IR7iESxRXElrlGTRkHJ9eEt+SACRJwT0FNFrt71DFQIUFBJfX/uQ== +fast-xml-builder@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/fast-xml-builder/-/fast-xml-builder-1.1.4.tgz#0c407a1d9d5996336c0cd76f7ff785cac6413017" + integrity sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg== + dependencies: + path-expression-matcher "^1.1.3" fast-xml-parser@^5.3.6: - version "5.4.1" - resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-5.4.1.tgz#0c81b8ecfb3021e5ad83aa3df904af19a05bc601" - integrity sha512-BQ30U1mKkvXQXXkAGcuyUA/GA26oEB7NzOtsxCDtyu62sjGw5QraKFhx2Em3WQNjPw9PG6MQ9yuIIgkSDfGu5A== + version "5.5.9" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-5.5.9.tgz#e59637abebec3dbfbb4053b532d787af6ea11527" + integrity sha512-jldvxr1MC6rtiZKgrFnDSvT8xuH+eJqxqOBThUVjYrxssYTo1avZLGql5l0a0BAERR01CadYzZ83kVEkbyDg+g== dependencies: - fast-xml-builder "^1.0.0" - strnum "^2.1.2" + fast-xml-builder "^1.1.4" + path-expression-matcher "^1.2.0" + strnum "^2.2.2" fastest-levenshtein@^1.0.12: version "1.0.16" @@ -6827,9 +6830,9 @@ flat@^5.0.2: integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== flatted@^3.2.9: - version "3.3.3" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" - integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== + version "3.4.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.4.2.tgz#f5c23c107f0f37de8dbdf24f13722b3b98d52726" + integrity sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA== flora-colossus@^3.0.2: version "3.0.2" @@ -9676,9 +9679,9 @@ node-fetch@^2.7.0: whatwg-url "^5.0.0" node-forge@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.3.tgz#0ad80f6333b3a0045e827ac20b7f735f93716751" - integrity sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg== + version "1.4.0" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.4.0.tgz#1c7b7d8bdc2d078739f58287d589d903a11b2fc2" + integrity sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ== node-int64@^0.4.0: version "0.4.0" @@ -10144,6 +10147,11 @@ path-exists@^4.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== +path-expression-matcher@^1.1.3, path-expression-matcher@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/path-expression-matcher/-/path-expression-matcher-1.2.0.tgz#9bdae3787f43b0857b0269e9caaa586c12c8abee" + integrity sha512-DwmPWeFn+tq7TiyJ2CxezCAirXjFxvaiD03npak3cRjlP9+OjTmSy1EpIrEbh+l6JgUundniloMLDQ/6VTdhLQ== + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -10176,9 +10184,9 @@ path-scurry@^2.0.0, path-scurry@^2.0.2: minipass "^7.1.2" path-to-regexp@~0.1.12: - version "0.1.12" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7" - integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ== + version "0.1.13" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.13.tgz#9b22ec16bc3ab88d05a0c7e369869421401ab17d" + integrity sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA== path-type@^2.0.0: version "2.0.0" @@ -10208,14 +10216,14 @@ picocolors@1.1.1, picocolors@^1.1.1: integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + version "2.3.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.2.tgz#5a942915e26b372dc0f0e6753149a16e6b1c5601" + integrity sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA== picomatch@^4.0.2, picomatch@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042" - integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== + version "4.0.4" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.4.tgz#fd6f5e00a143086e074dffe4c924b8fb293b0589" + integrity sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A== pify@^2.0.0: version "2.3.0" @@ -11754,10 +11762,10 @@ strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -strnum@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/strnum/-/strnum-2.1.2.tgz#a5e00ba66ab25f9cafa3726b567ce7a49170937a" - integrity sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ== +strnum@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/strnum/-/strnum-2.2.2.tgz#f11fd94ab62b536ba2ecc615858f3747c2881b3f" + integrity sha512-DnR90I+jtXNSTXWdwrEy9FakW7UX+qUZg28gj5fk2vxxl7uS/3bpI4fjFYVmdK9etptYBPNkpahuQnEwhwECqA== structured-headers@^0.4.1: version "0.4.1" @@ -12759,9 +12767,9 @@ yallist@^3.0.2: integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yaml@^2.2.1, yaml@^2.2.2, yaml@^2.6.1: - version "2.8.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.8.2.tgz#5694f25eca0ce9c3e7a9d9e00ce0ddabbd9e35c5" - integrity sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A== + version "2.8.3" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.8.3.tgz#a0d6bd2efb3dd03c59370223701834e60409bd7d" + integrity sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg== yargs-parser@^18.1.2: version "18.1.3"