feat: add member status from wrapper when we are an admin

pull/2963/head
Audric Ackermann 2 years ago
parent 1dbcd157a0
commit 8274712528

@ -259,6 +259,9 @@
"groupOthersPromoted": "<b>$name$</b> and <b>$count$ others</b> were promoted to Admin.",
"inviteFailed": "Invite Failed",
"invitePending": "Invite Pending",
"promotionFailed": "Promotion Failed",
"promotionPending": "Promotion Pending",
"groupInviteFailedOne": "Failed to invite <b>$name$</b> to <b>$groupname$</b>",
"groupInviteFailedTwo": "Failed to invite <b>$first$</b> and <b>$second$</b> to <b>$groupname$</b>",
"groupInviteFailedOthers": "Failed to invite <b>$first$</b> and <b>$count$ others</b> to <b>$groupname$</b>",

@ -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<MemberListItemProps, 'displayGroupStatus' | 'pubkey' | 'groupPk'>) => {
if (
displayGroupStatus &&
groupPk &&
PubKey.isClosedGroupV2(groupPk) &&
PubKey.is05Pubkey(pubkey) &&
!UserUtils.isUsFromCache(pubkey)
) {
return (
<Flex container={true} margin="0 0 0 auto">
<ResendInviteButton groupPk={groupPk} pubkey={pubkey} />
</Flex>
);
}
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 (
<StyledGroupStatusText isFailure={groupPromotionFailed || groupInviteFailed}>
{statusText}
</StyledGroupStatusText>
);
};
const GroupStatusContainer = ({
displayGroupStatus,
groupPk,
pubkey,
}: Pick<MemberListItemProps, 'displayGroupStatus' | 'pubkey' | 'groupPk'>) => {
if (
displayGroupStatus &&
groupPk &&
PubKey.isClosedGroupV2(groupPk) &&
PubKey.is05Pubkey(pubkey) &&
!UserUtils.isUsFromCache(pubkey)
) {
return <GroupStatusText groupPk={groupPk} pubkey={pubkey} />;
}
return null;
};
const ResendInviteButton = ({
groupPk,
pubkey,
}: {
pubkey: PubkeyType;
groupPk: GroupPubkeyType;
}) => {
const {
isSelected,
pubkey,
isZombie,
isAdmin,
onSelect,
onUnselect,
inMentions,
disableBg,
dataTestId,
} = props;
return (
<SessionButton
dataTestId="resend-invite-button"
buttonShape={SessionButtonShape.Square}
buttonType={SessionButtonType.Solid}
text={window.i18n('resend')}
onClick={() => {
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: {
>
<StyledInfo>
<AvatarItem memberPubkey={pubkey} isAdmin={isAdmin || false} />
<StyledName>{memberName}</StyledName>
<Flex
container={true}
flexDirection="column"
margin="0 var(--margins-md)"
alignItems="flex-start"
>
<StyledName>{memberName}</StyledName>
<GroupStatusContainer
pubkey={pubkey}
displayGroupStatus={displayGroupStatus}
groupPk={groupPk}
/>
</Flex>
</StyledInfo>
<ResendInviteContainer
pubkey={pubkey}
displayGroupStatus={displayGroupStatus}
groupPk={groupPk}
/>
{!inMentions && (
<StyledCheckContainer>
<SessionRadio active={isSelected} value={pubkey} inputName={pubkey} label="" />

@ -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}
/>
);
})}

@ -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';

@ -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<string> {
function getMembersOfGroup(state: StateType, convo?: string): Array<GroupMemberGet> {
if (!convo) {
return [];
}
@ -16,9 +15,15 @@ export function getLibMembersPubkeys(state: StateType, convo?: string): Array<st
}
const members = getLibGroupsState(state).members[convo];
if (isEmpty(members)) {
return [];
}
return members || [];
}
function findMemberInMembers(members: Array<GroupMemberGet>, memberPk: string) {
return members.find(m => m.pubkeyHex === memberPk);
}
export function getLibMembersPubkeys(state: StateType, convo?: string): Array<string> {
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<string> {
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<string> {
return getLibMembersPubkeys(state, convo);
}
@ -89,3 +109,21 @@ export function getLibGroupAdminsOutsideRedux(convoId: string): Array<string> {
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));
}

@ -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'

@ -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"

Loading…
Cancel
Save