MM-24115 Use Native + BuiltIn emojis instead of systemEmojis (#4274)

* MM-24115 Use BuiltInEmojis instead of systemEmojis

* Address QA found issues
This commit is contained in:
Elias Nahum 2020-05-13 18:23:47 -04:00 committed by GitHub
parent 36e55c95a2
commit 1ae5584cb1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
13 changed files with 243 additions and 178 deletions

View file

@ -27,6 +27,7 @@ export default class EmojiSuggestion extends PureComponent {
autocompleteCustomEmojis: PropTypes.func.isRequired,
}).isRequired,
cursorPosition: PropTypes.number,
customEmojisEnabled: PropTypes.bool,
emojis: PropTypes.array.isRequired,
isSearch: PropTypes.bool,
fuse: PropTypes.object.isRequired,
@ -77,7 +78,7 @@ export default class EmojiSuggestion extends PureComponent {
const oldMatchTerm = this.matchTerm;
this.matchTerm = match[3] || '';
if (this.matchTerm !== oldMatchTerm && this.matchTerm.length) {
if (this.matchTerm !== oldMatchTerm && this.matchTerm.length && nextProps.customEmojisEnabled) {
this.props.actions.autocompleteCustomEmojis(this.matchTerm);
return;
}
@ -89,10 +90,10 @@ export default class EmojiSuggestion extends PureComponent {
}
}
handleFuzzySearch = async (matchTerm, props) => {
handleFuzzySearch = (matchTerm, props) => {
const {emojis, fuse} = props;
const results = await fuse.search(matchTerm.toLowerCase());
const results = fuse.search(matchTerm.toLowerCase());
const data = results.map((index) => emojis[index]);
this.setEmojiData(data, matchTerm);
};

View file

@ -6,6 +6,7 @@ import {createSelector} from 'reselect';
import {bindActionCreators} from 'redux';
import {getCustomEmojisByName} from '@mm-redux/selectors/entities/emojis';
import {getConfig} from '@mm-redux/selectors/entities/general';
import {autocompleteCustomEmojis} from '@mm-redux/actions/emojis';
import {addReactionToLatestPost} from 'app/actions/views/emoji';
@ -42,8 +43,9 @@ function mapStateToProps(state) {
const fuse = new Fuse(list, options);
return {
fuse,
emojis,
customEmojisEnabled: getConfig(state).EnableCustomEmoji === 'true',
fuse,
theme: getTheme(state),
};
}

View file

@ -53,7 +53,6 @@ export default class EmojiPicker extends PureComponent {
actions: PropTypes.shape({
getCustomEmojis: PropTypes.func.isRequired,
incrementEmojiPickerPage: PropTypes.func.isRequired,
searchCustomEmojis: PropTypes.func.isRequired,
}).isRequired,
};
@ -187,7 +186,7 @@ export default class EmojiPicker extends PureComponent {
clearTimeout(this.searchTermTimeout);
const timeout = searchTerm ? 100 : 0;
this.searchTermTimeout = setTimeout(async () => {
this.searchTermTimeout = setTimeout(() => {
const filteredEmojis = this.searchEmojis(searchTerm);
this.setState({
filteredEmojis,

View file

@ -8,7 +8,7 @@ import {bindActionCreators} from 'redux';
import {getTheme} from '@mm-redux/selectors/entities/preferences';
import {getCustomEmojisByName} from '@mm-redux/selectors/entities/emojis';
import {getConfig} from '@mm-redux/selectors/entities/general';
import {getCustomEmojis, searchCustomEmojis} from '@mm-redux/actions/emojis';
import {getCustomEmojis} from '@mm-redux/actions/emojis';
import {incrementEmojiPickerPage} from 'app/actions/views/emoji';
import {getDimensions, isLandscape} from 'app/selectors/device';
@ -173,7 +173,6 @@ function mapDispatchToProps(dispatch) {
actions: bindActionCreators({
getCustomEmojis,
incrementEmojiPickerPage,
searchCustomEmojis,
}, dispatch),
};
}

View file

@ -8,15 +8,12 @@ import {getCustomEmojisByName as selectCustomEmojisByName} from '@mm-redux/selec
import {parseNeededCustomEmojisFromText} from '@mm-redux/utils/emoji_utils';
import {GetStateFunc, DispatchFunc, ActionFunc, ActionResult} from '@mm-redux/types/actions';
import {getSystemEmojis} from 'app/utils/emojis';
import {logError} from './errors';
import {bindClientFunc, forceLogoutIfNecessary} from './helpers';
import {SystemEmoji, CustomEmoji} from '@mm-redux/types/emojis';
import {CustomEmoji} from '@mm-redux/types/emojis';
import {Dictionary} from '@mm-redux/types/utilities';
export let systemEmojis: Map<string, SystemEmoji> = new Map();
export function setSystemEmojis(emojis: Map<string, SystemEmoji>) {
systemEmojis = emojis;
}
export function createCustomEmoji(emoji: any, image: any): ActionFunc {
return bindClientFunc({
@ -89,6 +86,7 @@ export function getCustomEmojisInText(text: string): ActionFunc {
const state = getState();
const nonExistentEmoji = state.entities.emojis.nonExistentEmoji;
const customEmojisByName = selectCustomEmojisByName(state);
const systemEmojis: Set<string> = getSystemEmojis();
const emojisToLoad = parseNeededCustomEmojisFromText(text, systemEmojis, customEmojisByName, nonExistentEmoji);

View file

@ -8,7 +8,7 @@ import nock from 'nock';
import * as Actions from '@mm-redux/actions/posts';
import {getChannelStats} from '@mm-redux/actions/channels';
import {login} from '@mm-redux/actions/users';
import {setSystemEmojis, createCustomEmoji} from '@mm-redux/actions/emojis';
import {createCustomEmoji} from '@mm-redux/actions/emojis';
import {Client4} from '@mm-redux/client';
import {Preferences, Posts, RequestStatus} from '../constants';
import {ChannelTypes, PostTypes} from '@mm-redux/action_types';
@ -555,8 +555,6 @@ describe('Actions.Posts', () => {
},
};
setSystemEmojis(new Map([['systemEmoji1', {}]]));
it('no emojis in post', () => {
assert.deepEqual(
Actions.getNeededCustomEmojis(state, [
@ -578,7 +576,7 @@ describe('Actions.Posts', () => {
it('system emoji in post', () => {
assert.deepEqual(
Actions.getNeededCustomEmojis(state, [
{message: ':systemEmoji1:'},
{message: ':mattermost:'},
]),
new Set(),
);
@ -587,7 +585,7 @@ describe('Actions.Posts', () => {
it('mixed emojis in post', () => {
assert.deepEqual(
Actions.getNeededCustomEmojis(state, [
{message: ':systemEmoji1: :name1: :name2: :name3:'},
{message: ':mattermost: :name1: :name2: :name3:'},
]),
new Set(['name3']),
);
@ -659,7 +657,7 @@ describe('Actions.Posts', () => {
it('mixed emojis in message attachment', () => {
assert.deepEqual(
Actions.getNeededCustomEmojis(state, [
{message: '', props: {attachments: [{text: ':name4: :name1:', pretext: ':name3: :systemEmoji1:', fields: [{value: ':name3:'}]}]}},
{message: '', props: {attachments: [{text: ':name4: :name1:', pretext: ':name3: :mattermost:', fields: [{value: ':name3:'}]}]}},
]),
new Set(['name3', 'name4']),
);

View file

@ -1,7 +1,7 @@
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import {Client4, DEFAULT_LIMIT_AFTER, DEFAULT_LIMIT_BEFORE} from '@mm-redux/client';
import {Client4} from '@mm-redux/client';
import {General, Preferences, Posts} from '@mm-redux/constants';
import {WebsocketEvents} from '@constants';
import {PostTypes, ChannelTypes, FileTypes, IntegrationTypes} from '@mm-redux/action_types';
@ -16,11 +16,12 @@ import {getUserIdFromChannelName} from '@mm-redux/utils/channel_utils';
import {parseNeededCustomEmojisFromText} from '@mm-redux/utils/emoji_utils';
import {isFromWebhook, isSystemMessage, shouldIgnorePost} from '@mm-redux/utils/post_utils';
import {isCombinedUserActivityPost} from '@mm-redux/utils/post_list';
import {getSystemEmojis} from 'app/utils/emojis';
import {getMyChannelMember, markChannelAsUnread, markChannelAsRead, markChannelAsViewed} from './channels';
import {systemEmojis, getCustomEmojiByName, getCustomEmojisByName} from './emojis';
import {getCustomEmojiByName, getCustomEmojisByName} from './emojis';
import {logError} from './errors';
import {bindClientFunc, forceLogoutIfNecessary} from './helpers';
import {forceLogoutIfNecessary} from './helpers';
import {
deletePreferences,
@ -592,7 +593,7 @@ export function getCustomEmojiForReaction(name: string) {
return async (dispatch: DispatchFunc, getState: GetStateFunc) => {
const nonExistentEmoji = getState().entities.emojis.nonExistentEmoji;
const customEmojisByName = selectCustomEmojisByName(getState());
const systemEmojis = getSystemEmojis();
if (systemEmojis.has(name)) {
return {data: true};
}
@ -623,6 +624,7 @@ export function getReactionsForPost(postId: string) {
if (reactions && reactions.length > 0) {
const nonExistentEmoji = getState().entities.emojis.nonExistentEmoji;
const customEmojisByName = selectCustomEmojisByName(getState());
const systemEmojis = getSystemEmojis();
const emojisToLoad = new Set<string>();
reactions.forEach((r: Reaction) => {
@ -1034,6 +1036,7 @@ export function getNeededCustomEmojis(state: GlobalState, posts: Array<Post>): S
let customEmojisByName: Map<string, CustomEmoji>; // Populate this lazily since it's relatively expensive
const nonExistentEmoji = state.entities.emojis.nonExistentEmoji;
const systemEmojis = getSystemEmojis();
posts.forEach((post) => {
if (post.message.includes(':')) {
@ -1097,7 +1100,7 @@ export function removePost(post: ExtendedPost) {
}
export function selectPost(postId: string) {
return async (dispatch: DispatchFunc, getState: GetStateFunc) => {
return async (dispatch: DispatchFunc) => {
dispatch({
type: PostTypes.RECEIVED_POST_SELECTED,
data: postId,
@ -1179,7 +1182,7 @@ export function doPostActionWithCookie(postId: string, actionId: string, actionC
}
export function addMessageIntoHistory(message: string) {
return async (dispatch: DispatchFunc, getState: GetStateFunc) => {
return async (dispatch: DispatchFunc) => {
dispatch({
type: PostTypes.ADD_MESSAGE_INTO_HISTORY,
data: message,
@ -1190,7 +1193,7 @@ export function addMessageIntoHistory(message: string) {
}
export function resetHistoryIndex(index: number) {
return async (dispatch: DispatchFunc, getState: GetStateFunc) => {
return async (dispatch: DispatchFunc) => {
dispatch({
type: PostTypes.RESET_HISTORY_INDEX,
data: index,
@ -1201,7 +1204,7 @@ export function resetHistoryIndex(index: number) {
}
export function moveHistoryIndexBack(index: number) {
return async (dispatch: DispatchFunc, getState: GetStateFunc) => {
return async (dispatch: DispatchFunc) => {
dispatch({
type: PostTypes.MOVE_HISTORY_INDEX_BACK,
data: index,
@ -1212,7 +1215,7 @@ export function moveHistoryIndexBack(index: number) {
}
export function moveHistoryIndexForward(index: number) {
return async (dispatch: DispatchFunc, getState: GetStateFunc) => {
return async (dispatch: DispatchFunc) => {
dispatch({
type: PostTypes.MOVE_HISTORY_INDEX_FORWARD,
data: index,

View file

@ -10,7 +10,7 @@ describe('EmojiUtils', () => {
it('no emojis', () => {
const actual = EmojiUtils.parseNeededCustomEmojisFromText(
'This has no emojis',
new Map(),
new Set(),
new Map(),
new Map(),
);
@ -22,7 +22,7 @@ describe('EmojiUtils', () => {
it('some emojis', () => {
const actual = EmojiUtils.parseNeededCustomEmojisFromText(
':this: :is_all: :emo-jis: :123:',
new Map(),
new Set(),
new Map(),
new Map(),
);
@ -34,7 +34,7 @@ describe('EmojiUtils', () => {
it('text surrounding emojis', () => {
const actual = EmojiUtils.parseNeededCustomEmojisFromText(
':this:/:is_all: (:emo-jis:) surrounding:123:text:456:asdf',
new Map(),
new Set(),
new Map(),
new Map(),
);
@ -46,7 +46,7 @@ describe('EmojiUtils', () => {
it('system emojis', () => {
const actual = EmojiUtils.parseNeededCustomEmojisFromText(
':this: :is_all: :emo-jis: :123:',
new Map([['this', {name: 'this'}], ['123', {name: '123'}]]),
new Set(['this', '123']),
new Map(),
new Map(),
);
@ -58,7 +58,7 @@ describe('EmojiUtils', () => {
it('custom emojis', () => {
const actual = EmojiUtils.parseNeededCustomEmojisFromText(
':this: :is_all: :emo-jis: :123:',
new Map(),
new Set(),
new Map([['is_all', {name: 'is_all'}], ['emo-jis', {name: 'emo-jis'}]]),
new Map(),
);
@ -70,7 +70,7 @@ describe('EmojiUtils', () => {
it('emojis that we\'ve already tried to load', () => {
const actual = EmojiUtils.parseNeededCustomEmojisFromText(
':this: :is_all: :emo-jis: :123:',
new Map(),
new Set(),
new Map(),
new Map([['this', {name: 'this'}], ['emo-jis', {name: 'emo-jis'}]]),
);

View file

@ -21,7 +21,7 @@ export function getEmojiImageUrl(emoji: Emoji): string {
return Client4.getSystemEmojiImageUrl(filename);
}
export function parseNeededCustomEmojisFromText(text: string, systemEmojis: Map<string, SystemEmoji>, customEmojisByName: Map<string, CustomEmoji>, nonExistentEmoji: Set<string>): Set<string> {
export function parseNeededCustomEmojisFromText(text: string, systemEmojis: Set<string>, customEmojisByName: Map<string, CustomEmoji>, nonExistentEmoji: Set<string>): Set<string> {
if (!text.includes(':')) {
return new Set();
}

View file

@ -4,6 +4,7 @@
import React, {PureComponent} from 'react';
import PropTypes from 'prop-types';
import {
Keyboard,
StyleSheet,
View,
} from 'react-native';
@ -47,6 +48,7 @@ export default class AddReaction extends PureComponent {
}
close = () => {
Keyboard.dismiss();
dismissModal();
};

File diff suppressed because one or more lines are too long

332
package-lock.json generated
View file

@ -4780,14 +4780,6 @@
"resolved": "https://registry.npmjs.org/@react-native-community/cameraroll/-/cameraroll-1.5.2.tgz",
"integrity": "sha512-xrkrmcI5V8IzWoGQOqycs2YZRmGqASqZMDkjOzFFg6bCy95+OMquPnCmGdaUx1ONO1x6tsQSCv87xM/oL+9m/A=="
},
"@react-native-community/cli-debugger-ui": {
"version": "4.6.3",
"resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-4.6.3.tgz",
"integrity": "sha512-5hnzGBP1eXmc1gOuKm9x5uyw9z5QE3C2pSz57eaV6dHjl9LKfeBXd9L+RqeG/uWi7buE4YyJwirvpufLREoyJg==",
"requires": {
"serve-static": "^1.13.1"
}
},
"@react-native-community/cli-platform-android": {
"version": "4.6.3",
"resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-4.6.3.tgz",
@ -4988,11 +4980,6 @@
}
}
},
"@react-native-community/cli-types": {
"version": "4.6.3",
"resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-4.6.3.tgz",
"integrity": "sha512-76uXaqPV1m6zGmL+x/KGHfLZiVVbCvkI4KElnd1dVEsDrVVoAsJ0tvBad+GhHh/NtYU1VmtuJ/zcKnjWdVla1A=="
},
"@react-native-community/netinfo": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/@react-native-community/netinfo/-/netinfo-4.4.0.tgz",
@ -6982,6 +6969,12 @@
}
}
},
"chownr": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
"integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
"optional": true
},
"ci-info": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
@ -9674,6 +9667,15 @@
"universalify": "^0.1.0"
}
},
"fs-minipass": {
"version": "1.2.7",
"resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz",
"integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==",
"optional": true,
"requires": {
"minipass": "^2.6.0"
}
},
"fs-readdir-recursive": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz",
@ -9739,12 +9741,6 @@
"concat-map": "0.0.1"
}
},
"chownr": {
"version": "1.1.1",
"resolved": false,
"integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==",
"optional": true
},
"code-point-at": {
"version": "1.1.0",
"resolved": false,
@ -9796,15 +9792,6 @@
"integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=",
"optional": true
},
"fs-minipass": {
"version": "1.2.5",
"resolved": false,
"integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==",
"optional": true,
"requires": {
"minipass": "^2.2.1"
}
},
"fs.realpath": {
"version": "1.0.0",
"resolved": false,
@ -9911,38 +9898,13 @@
"brace-expansion": "^1.1.7"
}
},
"minimist": {
"version": "0.0.8",
"resolved": false,
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
"optional": true
},
"minipass": {
"version": "2.3.5",
"resolved": false,
"integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==",
"optional": true,
"requires": {
"safe-buffer": "^5.1.2",
"yallist": "^3.0.0"
}
},
"minizlib": {
"version": "1.2.1",
"resolved": false,
"integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==",
"optional": true,
"requires": {
"minipass": "^2.2.1"
}
},
"mkdirp": {
"version": "0.5.1",
"resolved": false,
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
"version": "0.5.5",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
"integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
"optional": true,
"requires": {
"minimist": "0.0.8"
"minimist": "^1.2.5"
}
},
"ms": {
@ -10086,9 +10048,9 @@
},
"dependencies": {
"minimist": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
"optional": true
}
}
@ -10188,21 +10150,6 @@
"integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
"optional": true
},
"tar": {
"version": "4.4.8",
"resolved": false,
"integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==",
"optional": true,
"requires": {
"chownr": "^1.1.1",
"fs-minipass": "^1.2.5",
"minipass": "^2.3.4",
"minizlib": "^1.1.1",
"mkdirp": "^0.5.0",
"safe-buffer": "^5.1.2",
"yallist": "^3.0.2"
}
},
"util-deprecate": {
"version": "1.0.2",
"resolved": false,
@ -10223,12 +10170,6 @@
"resolved": false,
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"optional": true
},
"yallist": {
"version": "3.0.3",
"resolved": false,
"integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==",
"optional": true
}
}
},
@ -10317,9 +10258,9 @@
"dev": true
},
"fuse.js": {
"version": "5.0.10-beta",
"resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-5.0.10-beta.tgz",
"integrity": "sha512-/tZI6BiF4zToF1neZxOIa5YmSw6j5+3yJW/agoYUZBiaxHJk/ANBxafYDS/60Tvo3JQM2u/ceRvOgBmRYkv70A=="
"version": "3.6.1",
"resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-3.6.1.tgz",
"integrity": "sha512-hT9yh/tiinkmirKrlv4KWOjztdoZo1mx9Qh4KvWqC7isoXwdUY3PNWUxceF4/qO9R6riA2C29jdTOeQOIROjgw=="
},
"gensync": {
"version": "1.0.0-beta.1",
@ -16839,20 +16780,12 @@
"dev": true
},
"json5": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz",
"integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==",
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz",
"integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==",
"dev": true,
"requires": {
"minimist": "^1.2.0"
},
"dependencies": {
"minimist": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
"dev": true
}
"minimist": "^1.2.5"
}
},
"jsonfile": {
@ -17965,9 +17898,36 @@
}
},
"minimist": {
"version": "0.0.8",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
},
"minipass": {
"version": "2.9.0",
"resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz",
"integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==",
"optional": true,
"requires": {
"safe-buffer": "^5.1.2",
"yallist": "^3.0.0"
},
"dependencies": {
"yallist": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
"optional": true
}
}
},
"minizlib": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz",
"integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==",
"optional": true,
"requires": {
"minipass": "^2.9.0"
}
},
"mixin-deep": {
"version": "1.3.2",
@ -17989,11 +17949,11 @@
}
},
"mkdirp": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
"version": "0.5.5",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
"integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
"requires": {
"minimist": "0.0.8"
"minimist": "^1.2.5"
}
},
"mmjstool": {
@ -18594,9 +18554,9 @@
}
},
"yargs": {
"version": "15.1.0",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-15.1.0.tgz",
"integrity": "sha512-T39FNN1b6hCW4SOIk1XyTOWxtXdcen0t+XYrysQmChzSipvhBO8Bj0nK1ozAasdk24dNWuMZvr4k24nz+8HHLg==",
"version": "15.3.1",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz",
"integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==",
"dev": true,
"requires": {
"cliui": "^6.0.0",
@ -18609,13 +18569,13 @@
"string-width": "^4.2.0",
"which-module": "^2.0.0",
"y18n": "^4.0.0",
"yargs-parser": "^16.1.0"
"yargs-parser": "^18.1.1"
}
},
"yargs-parser": {
"version": "16.1.0",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-16.1.0.tgz",
"integrity": "sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg==",
"version": "18.1.3",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
"integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
"dev": true,
"requires": {
"camelcase": "^5.0.0",
@ -19589,9 +19549,9 @@
},
"dependencies": {
"@jest/types": {
"version": "25.3.0",
"resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz",
"integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==",
"version": "25.5.0",
"resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz",
"integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==",
"requires": {
"@types/istanbul-lib-coverage": "^2.0.0",
"@types/istanbul-reports": "^1.1.1",
@ -19600,14 +19560,14 @@
}
},
"@react-native-community/cli": {
"version": "4.6.3",
"resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-4.6.3.tgz",
"integrity": "sha512-MqOvUyKfspzA/uUSQELouYDkS4hbqaCWG/Nc13/k+vwQnXjq2sJlVKZCrctV4IY33oKMr/S0LwyZiiiwhQ8GMg==",
"version": "4.8.0",
"resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-4.8.0.tgz",
"integrity": "sha512-z4qHfxtoTxKhQ0V9B02a82IxBkEBH5FfKnaJn9WL5Tf4SmE91ER8ZNVEWNr97S4TCFVYDrpM7iKnrYpNi/ciYQ==",
"requires": {
"@hapi/joi": "^15.0.3",
"@react-native-community/cli-debugger-ui": "^4.6.3",
"@react-native-community/cli-tools": "^4.6.3",
"@react-native-community/cli-types": "^4.6.3",
"@react-native-community/cli-debugger-ui": "^4.8.0",
"@react-native-community/cli-tools": "^4.8.0",
"@react-native-community/cli-types": "^4.8.0",
"chalk": "^3.0.0",
"command-exists": "^1.2.8",
"commander": "^2.19.0",
@ -19644,17 +19604,43 @@
"ws": "^1.1.0"
},
"dependencies": {
"@react-native-community/cli-debugger-ui": {
"version": "4.8.0",
"resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-4.8.0.tgz",
"integrity": "sha512-Eq9lHINDXiBAwmFRCMN8jeKk6FTDnTxAfITkjPUNNTj7q3K+fH/oyOMJjxbIZbryIJY6g+g/ln6vsS2WzISNYQ==",
"requires": {
"serve-static": "^1.13.1"
}
},
"@react-native-community/cli-tools": {
"version": "4.8.0",
"resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-4.8.0.tgz",
"integrity": "sha512-voXGruhYyyhCbEYM2uZ54dMZcBgXFFcQxVK3nLwJDG9nSQGObZInj9Zf76ix5qGnvKKGWIGUcbmRhyLpAzTXuQ==",
"requires": {
"chalk": "^3.0.0",
"lodash": "^4.17.15",
"mime": "^2.4.1",
"node-fetch": "^2.6.0",
"open": "^6.2.0",
"shell-quote": "1.6.1"
}
},
"@react-native-community/cli-types": {
"version": "4.8.0",
"resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-4.8.0.tgz",
"integrity": "sha512-gkjQdmzskQJdddVNRBATa7rWMbamD2j4B7w9shbg20tIBYoh/tgHdkgiLqZQSfBKa8HqrAkeCJTYaT1oV4oReQ=="
},
"ansi-regex": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
},
"pretty-format": {
"version": "25.3.0",
"resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.3.0.tgz",
"integrity": "sha512-wToHwF8bkQknIcFkBqNfKu4+UZqnrLn/Vr+wwKQwwvPzkBfDDKp/qIabFqdgtoi5PEnM8LFByVsOrHoa3SpTVA==",
"version": "25.5.0",
"resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz",
"integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==",
"requires": {
"@jest/types": "^25.3.0",
"@jest/types": "^25.5.0",
"ansi-regex": "^5.0.0",
"ansi-styles": "^4.0.0",
"react-is": "^16.12.0"
@ -19828,10 +19814,10 @@
"p-locate": "^4.1.0"
}
},
"minimist": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
"mime": {
"version": "2.4.5",
"resolved": "https://registry.npmjs.org/mime/-/mime-2.4.5.tgz",
"integrity": "sha512-3hQhEUF027BuxZjQA3s7rIv/7VCQPa27hN9u9g87sEkWaKwQPuXOkVKtOeiyUrnWqTDiOs8Ed2rwg733mB0R5w=="
},
"p-locate": {
"version": "4.1.0",
@ -21957,6 +21943,29 @@
"integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==",
"dev": true
},
"tar": {
"version": "4.4.13",
"resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz",
"integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==",
"optional": true,
"requires": {
"chownr": "^1.1.1",
"fs-minipass": "^1.2.5",
"minipass": "^2.8.6",
"minizlib": "^1.2.1",
"mkdirp": "^0.5.0",
"safe-buffer": "^5.1.2",
"yallist": "^3.0.3"
},
"dependencies": {
"yallist": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
"optional": true
}
}
},
"temp": {
"version": "0.8.3",
"resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz",
@ -22184,9 +22193,9 @@
}
},
"ts-jest": {
"version": "25.2.1",
"resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-25.2.1.tgz",
"integrity": "sha512-TnntkEEjuXq/Gxpw7xToarmHbAafgCaAzOpnajnFC6jI7oo1trMzAHA04eWpc3MhV6+yvhE8uUBAmN+teRJh0A==",
"version": "25.5.0",
"resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-25.5.0.tgz",
"integrity": "sha512-govrjbOk1UEzcJ5cX5k8X8IUtFuP3lp3mrF3ZuKtCdAOQzdeCM7qualhb/U8s8SWFwEDutOqfF5PLkJ+oaYD4w==",
"dev": true,
"requires": {
"bs-logger": "0.x",
@ -22195,22 +22204,65 @@
"json5": "2.x",
"lodash.memoize": "4.x",
"make-error": "1.x",
"micromatch": "4.x",
"mkdirp": "0.x",
"resolve": "1.x",
"semver": "^5.5",
"yargs-parser": "^16.1.0"
"semver": "6.x",
"yargs-parser": "18.x"
},
"dependencies": {
"semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
"braces": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"dev": true,
"requires": {
"fill-range": "^7.0.1"
}
},
"fill-range": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
"dev": true,
"requires": {
"to-regex-range": "^5.0.1"
}
},
"is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"dev": true
},
"micromatch": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
"integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
"dev": true,
"requires": {
"braces": "^3.0.1",
"picomatch": "^2.0.5"
}
},
"semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"dev": true
},
"to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"dev": true,
"requires": {
"is-number": "^7.0.0"
}
},
"yargs-parser": {
"version": "16.1.0",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-16.1.0.tgz",
"integrity": "sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg==",
"version": "18.1.3",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
"integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
"dev": true,
"requires": {
"camelcase": "^5.0.0",

View file

@ -20,7 +20,7 @@
"deepmerge": "4.2.2",
"emoji-regex": "8.0.0",
"form-data": "3.0.0",
"fuse.js": "5.0.10-beta",
"fuse.js": "3.6.1",
"intl": "1.2.5",
"jail-monkey": "2.3.2",
"mime-db": "1.43.0",
@ -116,8 +116,8 @@
"eslint-plugin-mattermost": "github:mattermost/eslint-plugin-mattermost#070ce792d105482ffb2b27cfc0b7e78b3d20acee",
"eslint-plugin-react": "7.19.0",
"harmony-reflect": "1.6.1",
"isomorphic-fetch": "2.2.1",
"husky": "4.2.3",
"isomorphic-fetch": "2.2.1",
"jest": "25.2.3",
"jest-cli": "25.2.3",
"jest-enzyme": "7.1.2",
@ -135,7 +135,7 @@
"redux-mock-store": "1.5.4",
"redux-persist-node-storage": "2.0.0",
"socketcluster": "16.0.1",
"ts-jest": "25.2.1",
"ts-jest": "25.5.0",
"typescript": "3.8.3",
"underscore": "1.9.2",
"util": "0.12.2"