diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 64e7dd22b..f424e20b6 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -259,6 +259,9 @@ "groupOthersPromoted": "$name$ and $count$ others were promoted to Admin.", "inviteFailed": "Invite Failed", + "invitePending": "Invite Pending", + "promotionFailed": "Promotion Failed", + "promotionPending": "Promotion Pending", "groupInviteFailedOne": "Failed to invite $name$ to $groupname$", "groupInviteFailedTwo": "Failed to invite $first$ and $second$ to $groupname$", "groupInviteFailedOthers": "Failed to invite $first$ and $count$ others to $groupname$", diff --git a/ts/components/MemberListItem.tsx b/ts/components/MemberListItem.tsx index cda20a20b..5a133da47 100644 --- a/ts/components/MemberListItem.tsx +++ b/ts/components/MemberListItem.tsx @@ -1,8 +1,20 @@ import React from 'react'; import styled from 'styled-components'; -import { Avatar, AvatarSize, CrownIcon } from './avatar/Avatar'; +import { GroupPubkeyType, PubkeyType } from 'libsession_util_nodejs'; import { useConversationUsernameOrShorten } from '../hooks/useParamSelector'; +import { PubKey } from '../session/types'; +import { UserUtils } from '../session/utils'; +import { GroupInvite } from '../session/utils/job_runners/jobs/GroupInviteJob'; +import { + useMemberInviteFailed, + useMemberInvitePending, + useMemberPromotionFailed, + useMemberPromotionPending, +} from '../state/selectors/groups'; +import { Avatar, AvatarSize, CrownIcon } from './avatar/Avatar'; +import { Flex } from './basic/Flex'; +import { SessionButton, SessionButtonShape, SessionButtonType } from './basic/SessionButton'; import { SessionRadio } from './basic/SessionRadio'; const AvatarContainer = styled.div` @@ -55,8 +67,6 @@ const StyledInfo = styled.div` const StyledName = styled.span` font-weight: bold; - margin-inline-start: var(--margins-md); - margin-inline-end: var(--margins-md); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; @@ -67,7 +77,7 @@ const StyledCheckContainer = styled.div` align-items: center; `; -export const MemberListItem = (props: { +type MemberListItemProps = { pubkey: string; isSelected: boolean; // this bool is used to make a zombie appear with less opacity than a normal member @@ -78,19 +88,114 @@ export const MemberListItem = (props: { onSelect?: (pubkey: string) => void; onUnselect?: (pubkey: string) => void; dataTestId?: string; + displayGroupStatus?: boolean; + groupPk?: string; +}; + +const ResendInviteContainer = ({ + displayGroupStatus, + groupPk, + pubkey, +}: Pick) => { + if ( + displayGroupStatus && + groupPk && + PubKey.isClosedGroupV2(groupPk) && + PubKey.is05Pubkey(pubkey) && + !UserUtils.isUsFromCache(pubkey) + ) { + return ( + + + + ); + } + return null; +}; + +const StyledGroupStatusText = styled.span<{ isFailure: boolean }>` + color: var(--danger-color); + font-size: var(--font-size-xs); + margin-top: var(--margins-xs); +`; + +const GroupStatusText = ({ groupPk, pubkey }: { pubkey: PubkeyType; groupPk: GroupPubkeyType }) => { + const groupInviteFailed = useMemberInviteFailed(pubkey, groupPk); + const groupPromotionFailed = useMemberPromotionFailed(pubkey, groupPk); + + const groupInvitePending = useMemberInvitePending(pubkey, groupPk); + const groupPromotionPending = useMemberPromotionPending(pubkey, groupPk); + + const statusText = groupPromotionFailed + ? window.i18n('promotionFailed') + : groupInviteFailed + ? window.i18n('inviteFailed') + : groupInvitePending + ? window.i18n('invitePending') + : groupPromotionPending + ? window.i18n('promotionPending') + : null; + + if (!statusText) { + return null; + } + return ( + + {statusText} + + ); +}; + +const GroupStatusContainer = ({ + displayGroupStatus, + groupPk, + pubkey, +}: Pick) => { + if ( + displayGroupStatus && + groupPk && + PubKey.isClosedGroupV2(groupPk) && + PubKey.is05Pubkey(pubkey) && + !UserUtils.isUsFromCache(pubkey) + ) { + return ; + } + return null; +}; + +const ResendInviteButton = ({ + groupPk, + pubkey, +}: { + pubkey: PubkeyType; + groupPk: GroupPubkeyType; }) => { - const { - isSelected, - pubkey, - isZombie, - isAdmin, - onSelect, - onUnselect, - inMentions, - disableBg, - dataTestId, - } = props; + return ( + { + void GroupInvite.addGroupInviteJob({ groupPk, member: pubkey }); + }} + /> + ); +}; +export const MemberListItem = ({ + isSelected, + pubkey, + dataTestId, + disableBg, + displayGroupStatus, + inMentions, + isAdmin, + isZombie, + onSelect, + onUnselect, + groupPk, +}: MemberListItemProps) => { const memberName = useConversationUsernameOrShorten(pubkey); return ( @@ -114,9 +219,27 @@ export const MemberListItem = (props: { > - {memberName} + + {memberName} + + + + {!inMentions && ( diff --git a/ts/components/dialog/UpdateGroupMembersDialog.tsx b/ts/components/dialog/UpdateGroupMembersDialog.tsx index 6547e8e11..48a91549f 100644 --- a/ts/components/dialog/UpdateGroupMembersDialog.tsx +++ b/ts/components/dialog/UpdateGroupMembersDialog.tsx @@ -1,5 +1,5 @@ import _ from 'lodash'; -import React from 'react'; +import React, { useMemo } from 'react'; import { useDispatch } from 'react-redux'; import useKey from 'react-use/lib/useKey'; import styled from 'styled-components'; @@ -25,6 +25,7 @@ import { import { useSet } from '../../hooks/useSet'; import { ConvoHub } from '../../session/conversations'; import { initiateClosedGroupUpdate } from '../../session/group/closed-group'; +import { useSelectedIsGroupV2 } from '../../state/selectors/selectedConversation'; type Props = { conversationId: string; @@ -46,16 +47,19 @@ const ClassicMemberList = (props: { }) => { const { onSelect, convoId, onUnselect, selectedMembers } = props; const weAreAdmin = useWeAreAdmin(convoId); + const isV2Group = useSelectedIsGroupV2(); const groupAdmins = useGroupAdmins(convoId); const groupMembers = useSortedGroupMembers(convoId); - let currentMembers = groupMembers || []; - currentMembers = [...currentMembers].sort(m => (groupAdmins?.includes(m) ? -1 : 0)); + const sortedMembers = useMemo( + () => [...groupMembers].sort(m => (groupAdmins?.includes(m) ? -1 : 0)), + [groupMembers, groupAdmins] + ); return ( <> - {currentMembers.map(member => { + {sortedMembers.map(member => { const isSelected = (weAreAdmin && selectedMembers.includes(member)) || false; const isAdmin = groupAdmins?.includes(member); @@ -68,6 +72,8 @@ const ClassicMemberList = (props: { key={member} isAdmin={isAdmin} disableBg={true} + displayGroupStatus={isV2Group && weAreAdmin} + groupPk={convoId} /> ); })} diff --git a/ts/node/logging.ts b/ts/node/logging.ts index f256d4f82..dcfc3ab21 100644 --- a/ts/node/logging.ts +++ b/ts/node/logging.ts @@ -1,13 +1,14 @@ // NOTE: Temporarily allow `then` until we convert the entire file to `async` / `await`: /* eslint-disable more/no-then */ -import path from 'path'; import fs from 'fs'; +import path from 'path'; -import { app, ipcMain as ipc } from 'electron'; import Logger from 'bunyan'; -import _ from 'lodash'; +// eslint-disable-next-line import/order +import { app, ipcMain as ipc } from 'electron'; import firstline from 'firstline'; +import _ from 'lodash'; import { readLastLinesEnc } from 'read-last-lines-ts'; import rimraf from 'rimraf'; diff --git a/ts/state/selectors/groups.ts b/ts/state/selectors/groups.ts index 11e6d13f8..fb9e88e8d 100644 --- a/ts/state/selectors/groups.ts +++ b/ts/state/selectors/groups.ts @@ -1,5 +1,4 @@ -import { GroupPubkeyType } from 'libsession_util_nodejs'; -import { isEmpty } from 'lodash'; +import { GroupMemberGet, GroupPubkeyType, PubkeyType } from 'libsession_util_nodejs'; import { useSelector } from 'react-redux'; import { PubKey } from '../../session/types'; import { GroupState } from '../ducks/groups'; @@ -7,7 +6,7 @@ import { StateType } from '../reducer'; const getLibGroupsState = (state: StateType): GroupState => state.groups; -export function getLibMembersPubkeys(state: StateType, convo?: string): Array { +function getMembersOfGroup(state: StateType, convo?: string): Array { if (!convo) { return []; } @@ -16,9 +15,15 @@ export function getLibMembersPubkeys(state: StateType, convo?: string): Array, memberPk: string) { + return members.find(m => m.pubkeyHex === memberPk); +} + +export function getLibMembersPubkeys(state: StateType, convo?: string): Array { + const members = getMembersOfGroup(state, convo); return members.map(m => m.pubkeyHex); } @@ -28,21 +33,36 @@ function getIsCreatingGroupFromUI(state: StateType): boolean { } export function getLibAdminsPubkeys(state: StateType, convo?: string): Array { - if (!convo) { - return []; - } - if (!PubKey.isClosedGroupV2(convo)) { - return []; - } - - const members = getLibGroupsState(state).members[convo]; - if (isEmpty(members)) { - return []; - } + const members = getMembersOfGroup(state, convo); return members.filter(m => m.promoted).map(m => m.pubkeyHex); } +function getMemberInviteFailed(state: StateType, pubkey: PubkeyType, convo?: GroupPubkeyType) { + const members = getMembersOfGroup(state, convo); + return findMemberInMembers(members, pubkey)?.inviteFailed || false; +} + +function getMemberInvitePending(state: StateType, pubkey: PubkeyType, convo?: GroupPubkeyType) { + const members = getMembersOfGroup(state, convo); + return findMemberInMembers(members, pubkey)?.invitePending || false; +} + +function getMemberIsPromoted(state: StateType, pubkey: PubkeyType, convo?: GroupPubkeyType) { + const members = getMembersOfGroup(state, convo); + return findMemberInMembers(members, pubkey)?.promoted || false; +} + +function getMemberPromotionFailed(state: StateType, pubkey: PubkeyType, convo?: GroupPubkeyType) { + const members = getMembersOfGroup(state, convo); + return findMemberInMembers(members, pubkey)?.promotionFailed || false; +} + +function getMemberPromotionPending(state: StateType, pubkey: PubkeyType, convo?: GroupPubkeyType) { + const members = getMembersOfGroup(state, convo); + return findMemberInMembers(members, pubkey)?.promotionPending || false; +} + export function getLibMembersCount(state: StateType, convo?: GroupPubkeyType): Array { return getLibMembersPubkeys(state, convo); } @@ -89,3 +109,21 @@ export function getLibGroupAdminsOutsideRedux(convoId: string): Array { export function useIsCreatingGroupFromUIPending() { return useSelector(getIsCreatingGroupFromUI); } + +export function useMemberInviteFailed(member: PubkeyType, groupPk: GroupPubkeyType) { + return useSelector((state: StateType) => getMemberInviteFailed(state, member, groupPk)); +} + +export function useMemberInvitePending(member: PubkeyType, groupPk: GroupPubkeyType) { + return useSelector((state: StateType) => getMemberInvitePending(state, member, groupPk)); +} +export function useMemberIsPromoted(member: PubkeyType, groupPk: GroupPubkeyType) { + return useSelector((state: StateType) => getMemberIsPromoted(state, member, groupPk)); +} + +export function useMemberPromotionFailed(member: PubkeyType, groupPk: GroupPubkeyType) { + return useSelector((state: StateType) => getMemberPromotionFailed(state, member, groupPk)); +} +export function useMemberPromotionPending(member: PubkeyType, groupPk: GroupPubkeyType) { + return useSelector((state: StateType) => getMemberPromotionPending(state, member, groupPk)); +} diff --git a/ts/types/LocalizerKeys.ts b/ts/types/LocalizerKeys.ts index 17c81014f..14fa5beba 100644 --- a/ts/types/LocalizerKeys.ts +++ b/ts/types/LocalizerKeys.ts @@ -234,6 +234,7 @@ export type LocalizerKeys = | 'invalidSessionId' | 'inviteContacts' | 'inviteFailed' + | 'invitePending' | 'join' | 'joinACommunity' | 'joinOpenGroup' @@ -363,6 +364,8 @@ export type LocalizerKeys = | 'primaryColorRed' | 'primaryColorYellow' | 'privacySettingsTitle' + | 'promotionFailed' + | 'promotionPending' | 'pruneSettingDescription' | 'pruneSettingTitle' | 'publicChatExists' diff --git a/yarn.lock b/yarn.lock index ae1a8c628..f9c7f8bea 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12,20 +12,27 @@ resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== +"@babel/code-frame@^7.0.0": + version "7.22.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" + integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== + dependencies: + "@babel/highlight" "^7.22.13" + chalk "^2.4.2" + "@babel/code-frame@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.5.tgz#234d98e1551960604f1246e6475891a570ad5658" integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ== dependencies: - "@babel/highlight" "^7.22.10" - chalk "^2.4.2" + "@babel/highlight" "^7.22.5" "@babel/generator@^7.22.7": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.9.tgz#572ecfa7a31002fa1de2a9d91621fd895da8493d" - integrity sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw== + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" + integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== dependencies: - "@babel/types" "^7.22.5" + "@babel/types" "^7.23.0" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" @@ -81,25 +88,35 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + "@babel/helper-validator-identifier@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== -"@babel/highlight@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.5.tgz#aa6c05c5407a67ebce408162b7ede789b4d22031" - integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw== +"@babel/highlight@^7.22.13", "@babel/highlight@^7.22.5": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" + integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== dependencies: - "@babel/helper-validator-identifier" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@^7.20.15", "@babel/parser@^7.22.5", "@babel/parser@^7.22.7": +"@babel/parser@^7.20.15", "@babel/parser@^7.22.5": version "7.22.7" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.7.tgz#df8cf085ce92ddbdbf668a7f186ce848c9036cae" integrity sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q== +"@babel/parser@^7.22.7": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" + integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== + "@babel/plugin-syntax-jsx@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918" @@ -135,18 +152,18 @@ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.8.tgz#4d4451d31bc34efeae01eac222b514a77aa4000e" integrity sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw== dependencies: - "@babel/code-frame" "^7.22.10" - "@babel/generator" "^7.22.10" + "@babel/code-frame" "^7.22.5" + "@babel/generator" "^7.22.7" "@babel/helper-environment-visitor" "^7.22.5" "@babel/helper-function-name" "^7.22.5" "@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.22.10" - "@babel/types" "^7.22.10" + "@babel/parser" "^7.22.7" + "@babel/types" "^7.22.5" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.22.10", "@babel/types@^7.22.5": +"@babel/types@^7.22.5": version "7.22.10" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.10.tgz#4a9e76446048f2c66982d1a989dd12b8a2d2dc03" integrity sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg== @@ -155,6 +172,15 @@ "@babel/helper-validator-identifier" "^7.22.5" to-fast-properties "^2.0.0" +"@babel/types@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" + integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== + dependencies: + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + "@commitlint/cli@^17.7.1": version "17.7.1" resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-17.7.1.tgz#f3ab35bd38d82fcd4ab03ec5a1e9db26d57fe1b0" @@ -1039,21 +1065,21 @@ "@types/prop-types" "*" "@types/react" "*" -"@types/react@*", "@types/react@^17", "@types/react@^17.0.2": - version "17.0.62" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.62.tgz#2efe8ddf8533500ec44b1334dd1a97caa2f860e3" - integrity sha512-eANCyz9DG8p/Vdhr0ZKST8JV12PhH2ACCDYlFw6DIO+D+ca+uP4jtEDEpVqXZrh/uZdXQGwk7whJa3ah5DtyLw== +"@types/react@*", "@types/react@17.0.2", "@types/react@^17": + version "17.0.2" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.2.tgz#3de24c4efef902dd9795a49c75f760cbe4f7a5a8" + integrity sha512-Xt40xQsrkdvjn1EyWe1Bc0dJLcil/9x2vAuW7ya+PuQip4UYUaXyhzWmAbwRsdMgwOFHpfp7/FFZebDU6Y8VHA== dependencies: "@types/prop-types" "*" - "@types/scheduler" "*" csstype "^3.0.2" -"@types/react@17.0.2": - version "17.0.2" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.2.tgz#3de24c4efef902dd9795a49c75f760cbe4f7a5a8" - integrity sha512-Xt40xQsrkdvjn1EyWe1Bc0dJLcil/9x2vAuW7ya+PuQip4UYUaXyhzWmAbwRsdMgwOFHpfp7/FFZebDU6Y8VHA== +"@types/react@^17.0.2": + version "17.0.62" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.62.tgz#2efe8ddf8533500ec44b1334dd1a97caa2f860e3" + integrity sha512-eANCyz9DG8p/Vdhr0ZKST8JV12PhH2ACCDYlFw6DIO+D+ca+uP4jtEDEpVqXZrh/uZdXQGwk7whJa3ah5DtyLw== dependencies: "@types/prop-types" "*" + "@types/scheduler" "*" csstype "^3.0.2" "@types/redux-logger@3.0.7": @@ -1549,6 +1575,11 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" +ansi-styles@^6.0.0, ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + anymatch@~3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" @@ -2403,6 +2434,14 @@ commander@^5.0.0: resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== +compare-func@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3" + integrity sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA== + dependencies: + array-ify "^1.0.0" + dot-prop "^5.1.0" + compare-version@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/compare-version/-/compare-version-0.1.2.tgz#0162ec2d9351f5ddd59a9202cba935366a725080" @@ -2443,6 +2482,30 @@ console-control-strings@^1.1.0: resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== +conventional-changelog-angular@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-6.0.0.tgz#a9a9494c28b7165889144fd5b91573c4aa9ca541" + integrity sha512-6qLgrBF4gueoC7AFVHu51nHL9pF9FRjXrH+ceVf7WmAfH3gs+gEYOkvxhjMPjZu57I4AGUGoNTY8V7Hrgf1uqg== + dependencies: + compare-func "^2.0.0" + +conventional-changelog-conventionalcommits@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-6.1.0.tgz#3bad05f4eea64e423d3d90fc50c17d2c8cf17652" + integrity sha512-3cS3GEtR78zTfMzk0AizXKKIdN4OvSh7ibNz6/DPbhWWQu7LqE/8+/GqSodV+sywUR2gpJAdP/1JFf4XtN7Zpw== + dependencies: + compare-func "^2.0.0" + +conventional-commits-parser@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-4.0.0.tgz#02ae1178a381304839bce7cea9da5f1b549ae505" + integrity sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg== + dependencies: + JSONStream "^1.3.5" + is-text-path "^1.0.1" + meow "^8.1.2" + split2 "^3.2.2" + copy-to-clipboard@^3.3.1: version "3.3.3" resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz#55ac43a1db8ae639a4bd99511c148cdd1b83a1b0" @@ -3392,6 +3455,21 @@ execa@^4.0.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + extract-zip@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" @@ -6694,6 +6772,14 @@ slice-ansi@^3.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" +slice-ansi@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" + integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== + dependencies: + ansi-styles "^6.0.0" + is-fullwidth-code-point "^4.0.0" + smart-buffer@^4.0.2: version "4.2.0" resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" @@ -7775,6 +7861,11 @@ yauzl@^2.10.0: buffer-crc32 "~0.2.3" fd-slicer "~1.1.0" +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"