diff --git a/android/app/build.gradle b/android/app/build.gradle index e41b27d79..b3b313464 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -123,7 +123,7 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion missingDimensionStrategy "RNN.reactNativeVersion", "reactNative57_5" - versionCode 236 + versionCode 238 versionName "1.24.0" multiDexEnabled = true ndk { diff --git a/app/components/file_attachment_list/__snapshots__/file_attachment.test.js.snap b/app/components/file_attachment_list/__snapshots__/file_attachment.test.js.snap new file mode 100644 index 000000000..2e93e4b54 --- /dev/null +++ b/app/components/file_attachment_list/__snapshots__/file_attachment.test.js.snap @@ -0,0 +1,80 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`FileAttachment should match snapshot 1`] = ` + + + + + + +`; diff --git a/app/components/file_attachment_list/file_attachment.js b/app/components/file_attachment_list/file_attachment.js index 256eedf77..e7d0b8009 100644 --- a/app/components/file_attachment_list/file_attachment.js +++ b/app/components/file_attachment_list/file_attachment.js @@ -140,15 +140,14 @@ export default class FileAttachment extends PureComponent { return ( {fileAttachmentComponent} - - - {this.renderFileInfo()} - - + + {this.renderFileInfo()} + ); } diff --git a/app/components/file_attachment_list/file_attachment.test.js b/app/components/file_attachment_list/file_attachment.test.js new file mode 100644 index 000000000..a138fd8da --- /dev/null +++ b/app/components/file_attachment_list/file_attachment.test.js @@ -0,0 +1,45 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. +import React from 'react'; +import {shallow} from 'enzyme'; + +import FileAttachment from './file_attachment.js'; +import Preferences from 'mattermost-redux/constants/preferences'; + +jest.mock('react-native-doc-viewer', () => ({ + openDoc: jest.fn(), +})); + +describe('FileAttachment', () => { + const baseProps = { + canDownloadFiles: true, + file: { + create_at: 1546893090093, + delete_at: 0, + extension: 'png', + has_preview_image: true, + height: 171, + id: 'fileId', + name: 'image.png', + post_id: 'postId', + size: 14894, + update_at: 1546893090093, + user_id: 'userId', + width: 425, + data: { + mime_type: 'image/png', + }, + }, + id: 'id', + index: 0, + theme: Preferences.THEMES.default, + }; + + test('should match snapshot', () => { + const wrapper = shallow( + + ); + + expect(wrapper.getElement()).toMatchSnapshot(); + }); +}); diff --git a/app/components/markdown/markdown_table/markdown_table.js b/app/components/markdown/markdown_table/markdown_table.js index f84573979..a288a1d3d 100644 --- a/app/components/markdown/markdown_table/markdown_table.js +++ b/app/components/markdown/markdown_table/markdown_table.js @@ -9,6 +9,7 @@ import { View, } from 'react-native'; import LinearGradient from 'react-native-linear-gradient'; +import Icon from 'react-native-vector-icons/FontAwesome'; import {CELL_WIDTH} from 'app/components/markdown/markdown_table_cell/markdown_table_cell'; @@ -107,7 +108,7 @@ export default class MarkdownTable extends React.PureComponent { ]} start={{x: 0, y: 0}} end={{x: 1, y: 0}} - style={style.moreRight} + style={[style.moreRight, {height: this.state.contentHeight}]} /> ); } @@ -120,13 +121,26 @@ export default class MarkdownTable extends React.PureComponent { changeOpacity(this.props.theme.centerChannelColor, 0.0), changeOpacity(this.props.theme.centerChannelColor, 0.1), ]} - style={style.moreBelow} + style={[style.moreBelow, {width: this.getTableWidth()}]} /> ); } + const expandButton = ( + + + + ); + return ( @@ -142,6 +156,7 @@ export default class MarkdownTable extends React.PureComponent { {moreRight} {moreBelow} + {expandButton} ); } @@ -155,26 +170,44 @@ const getStyleSheet = makeStyleSheetFromTheme((theme) => { borderRightWidth: 1, maxHeight: MAX_HEIGHT, }, + expandButton: { + height: 30, + width: 30, + borderWidth: 1, + paddingTop: 6, + paddingLeft: 7, + borderColor: changeOpacity(theme.centerChannelColor, 0.2), + borderRadius: 15, + bottom: 20, + backgroundColor: theme.centerChannelBg, + }, + icon: { + fontSize: 15, + color: theme.linkColor, + }, table: { borderColor: changeOpacity(theme.centerChannelColor, 0.2), borderLeftWidth: 1, borderTopWidth: 1, }, + tablePadding: { + paddingRight: 10, + }, tableExtraBorders: { borderBottomWidth: 1, borderRightWidth: 1, }, moreBelow: { - bottom: 0, + bottom: 30, height: 20, position: 'absolute', - right: 0, + left: 0, width: '100%', }, moreRight: { - height: '100%', + maxHeight: MAX_HEIGHT, position: 'absolute', - right: 0, + right: 10, top: 0, width: 20, }, diff --git a/app/screens/channel/channel_nav_bar/channel_title/__snapshots__/channel_title.test.js.snap b/app/screens/channel/channel_nav_bar/channel_title/__snapshots__/channel_title.test.js.snap index cda04d782..6e5502cc5 100644 --- a/app/screens/channel/channel_nav_bar/channel_title/__snapshots__/channel_title.test.js.snap +++ b/app/screens/channel/channel_nav_bar/channel_title/__snapshots__/channel_title.test.js.snap @@ -51,6 +51,133 @@ exports[`ChannelTitle should match snapshot 1`] = ` `; +exports[`ChannelTitle should match snapshot when is DM and has guests and the teammate is the guest (when can show subtitles) 1`] = ` + + + + Other user + + + + + + + +`; + +exports[`ChannelTitle should match snapshot when is DM and has guests but the teammate is not the guest (when can show subtitles) 1`] = ` + + + + Other user + + + + +`; + exports[`ChannelTitle should match snapshot when isSelfDMChannel is true 1`] = ` { expect(wrapper.getElement()).toMatchSnapshot(); }); + + test('should match snapshot when is DM and has guests but the teammate is not the guest (when can show subtitles)', () => { + const props = { + ...baseProps, + displayName: 'Other user', + channelType: General.DM_CHANNEL, + isGuest: false, + hasGuests: true, + canHaveSubtitle: true, + }; + const wrapper = shallow( + , + {context: {intl: {formatMessage: (intlId) => intlId.defaultMessage}}}, + ); + + expect(wrapper.getElement()).toMatchSnapshot(); + }); + + test('should match snapshot when is DM and has guests and the teammate is the guest (when can show subtitles)', () => { + const props = { + ...baseProps, + displayName: 'Other user', + channelType: General.DM_CHANNEL, + isGuest: true, + hasGuests: true, + canHaveSubtitle: true, + }; + const wrapper = shallow( + , + {context: {intl: {formatMessage: (intlId) => intlId.defaultMessage}}}, + ); + + expect(wrapper.getElement()).toMatchSnapshot(); + }); }); diff --git a/app/screens/channel_info/__snapshots__/channel_info.test.js.snap b/app/screens/channel_info/__snapshots__/channel_info.test.js.snap index c2003eb01..5982e5be3 100644 --- a/app/screens/channel_info/__snapshots__/channel_info.test.js.snap +++ b/app/screens/channel_info/__snapshots__/channel_info.test.js.snap @@ -27,6 +27,7 @@ exports[`channel_info should match snapshot 1`] = ` isArchived={false} isBot={false} isGroupConstrained={false} + isTeammateGuest={false} memberCount={2} onPermalinkPress={[Function]} purpose="Purpose" diff --git a/app/screens/channel_info/__snapshots__/channel_info_header.test.js.snap b/app/screens/channel_info/__snapshots__/channel_info_header.test.js.snap index 1c745ee44..d48b33ee5 100644 --- a/app/screens/channel_info/__snapshots__/channel_info_header.test.js.snap +++ b/app/screens/channel_info/__snapshots__/channel_info_header.test.js.snap @@ -209,10 +209,11 @@ exports[`channel_info_header should match snapshot 1`] = ` "color": "#2389d7", }, "mention": Object { - "color": "#2389d7", + "color": "#166de0", }, "mention_highlight": Object { "backgroundColor": "#ffe577", + "color": "#166de0", }, "strong": Object { "fontWeight": "bold", @@ -356,10 +357,11 @@ exports[`channel_info_header should match snapshot 1`] = ` "color": "#2389d7", }, "mention": Object { - "color": "#2389d7", + "color": "#166de0", }, "mention_highlight": Object { "backgroundColor": "#ffe577", + "color": "#166de0", }, "strong": Object { "fontWeight": "bold", @@ -408,7 +410,7 @@ exports[`channel_info_header should match snapshot 1`] = ` `; -exports[`channel_info_header should match snapshot when DM and hasGuests 1`] = ` +exports[`channel_info_header should match snapshot when DM and hasGuests and is the teammate 1`] = ` + + + + + + + + + + + + + + + + + + +`; + +exports[`channel_info_header should match snapshot when DM and hasGuests but its me and not the teammate 1`] = ` + + + + + + Channel name + + + + + + 0} isGroupConstrained={currentChannel.group_constrained} /> diff --git a/app/screens/channel_info/channel_info.test.js b/app/screens/channel_info/channel_info.test.js index 3aac0d3dc..9e431bc52 100644 --- a/app/screens/channel_info/channel_info.test.js +++ b/app/screens/channel_info/channel_info.test.js @@ -60,6 +60,7 @@ describe('channel_info', () => { status: 'status', theme: Preferences.THEMES.default, isBot: false, + isTeammateGuest: false, isLandscape: false, actions: { clearPinnedPosts: jest.fn(), diff --git a/app/screens/channel_info/channel_info_header.js b/app/screens/channel_info/channel_info_header.js index 9389822eb..e77f874d2 100644 --- a/app/screens/channel_info/channel_info_header.js +++ b/app/screens/channel_info/channel_info_header.js @@ -40,6 +40,7 @@ export default class ChannelInfoHeader extends React.PureComponent { type: PropTypes.string.isRequired, isArchived: PropTypes.bool.isRequired, isBot: PropTypes.bool.isRequired, + isTeammateGuest: PropTypes.bool.isRequired, hasGuests: PropTypes.bool.isRequired, isGroupConstrained: PropTypes.bool, timeZone: PropTypes.string, @@ -50,10 +51,13 @@ export default class ChannelInfoHeader extends React.PureComponent { }; renderHasGuestText = (style) => { - const {type, hasGuests} = this.props; + const {type, hasGuests, isTeammateGuest} = this.props; if (!hasGuests) { return null; } + if (type === General.DM_CHANNEL && !isTeammateGuest) { + return null; + } let messageId; let defaultMessage; diff --git a/app/screens/channel_info/channel_info_header.test.js b/app/screens/channel_info/channel_info_header.test.js index 82456fa30..c865d1b3f 100644 --- a/app/screens/channel_info/channel_info_header.test.js +++ b/app/screens/channel_info/channel_info_header.test.js @@ -40,6 +40,7 @@ describe('channel_info_header', () => { type: General.OPEN_CHANNEL, isArchived: false, isBot: false, + isTeammateGuest: false, hasGuests: false, isGroupConstrained: false, }; @@ -76,12 +77,26 @@ describe('channel_info_header', () => { expect(wrapper.getElement()).toMatchSnapshot(); }); - test('should match snapshot when DM and hasGuests', async () => { + test('should match snapshot when DM and hasGuests but its me and not the teammate', async () => { const wrapper = shallow( , + {context: {intl: intlMock}}, + ); + expect(wrapper.getElement()).toMatchSnapshot(); + }); + + test('should match snapshot when DM and hasGuests and is the teammate', async () => { + const wrapper = shallow( + , {context: {intl: intlMock}}, ); diff --git a/app/screens/channel_info/index.js b/app/screens/channel_info/index.js index 03cfd499f..f59603e0e 100644 --- a/app/screens/channel_info/index.js +++ b/app/screens/channel_info/index.js @@ -71,6 +71,7 @@ function mapStateToProps(state) { let status; let isBot = false; + let isTeammateGuest = false; if (currentChannel.type === General.DM_CHANNEL) { const teammateId = getUserIdFromChannelName(currentUserId, currentChannel.name); const teammate = getUser(state, teammateId); @@ -79,6 +80,7 @@ function mapStateToProps(state) { isBot = true; } if (isGuest(teammate)) { + isTeammateGuest = true; currentChannelGuestCount = 1; } } @@ -116,6 +118,7 @@ function mapStateToProps(state) { theme: getTheme(state), canManageUsers, isBot, + isTeammateGuest, isLandscape: isLandscape(state), timeZone, }; diff --git a/app/screens/interactive_dialog/__snapshots__/dialog_introduction_text.test.js.snap b/app/screens/interactive_dialog/__snapshots__/dialog_introduction_text.test.js.snap index 261557971..fba0ce2bd 100644 --- a/app/screens/interactive_dialog/__snapshots__/dialog_introduction_text.test.js.snap +++ b/app/screens/interactive_dialog/__snapshots__/dialog_introduction_text.test.js.snap @@ -109,10 +109,11 @@ exports[`DialogIntroductionText should render the introduction text correctly 1` "color": "#2389d7", }, "mention": Object { - "color": "#2389d7", + "color": "#166de0", }, "mention_highlight": Object { "backgroundColor": "#ffe577", + "color": "#166de0", }, "strong": Object { "fontWeight": "bold", diff --git a/app/screens/search/search.js b/app/screens/search/search.js index 91b566181..288b57eb3 100644 --- a/app/screens/search/search.js +++ b/app/screens/search/search.js @@ -109,7 +109,7 @@ export default class Search extends PureComponent { } setTimeout(() => { - if (this.refs.searchBar) { + if (this.refs.searchBar && !this.props.initialValue) { this.refs.searchBar.focus(); } }, 150); @@ -840,4 +840,3 @@ const getStyleFromTheme = makeStyleSheetFromTheme((theme) => { }, }; }); - diff --git a/app/screens/settings/notification_settings_mentions_keywords/__snapshots__/notification_settings_mentions_keywords.test.js.snap b/app/screens/settings/notification_settings_mentions_keywords/__snapshots__/notification_settings_mentions_keywords.test.js.snap index defd9275c..fecf1832a 100644 --- a/app/screens/settings/notification_settings_mentions_keywords/__snapshots__/notification_settings_mentions_keywords.test.js.snap +++ b/app/screens/settings/notification_settings_mentions_keywords/__snapshots__/notification_settings_mentions_keywords.test.js.snap @@ -209,6 +209,7 @@ NotificationSettingsMentionsKeywords { "color": "#3d3c40", "fontSize": 15, "height": 150, + "paddingHorizontal": 15, "paddingVertical": 10, }, null, diff --git a/app/screens/settings/notification_settings_mentions_keywords/notification_settings_mentions_keywords.js b/app/screens/settings/notification_settings_mentions_keywords/notification_settings_mentions_keywords.js index 3a6601f99..90e3c4549 100644 --- a/app/screens/settings/notification_settings_mentions_keywords/notification_settings_mentions_keywords.js +++ b/app/screens/settings/notification_settings_mentions_keywords/notification_settings_mentions_keywords.js @@ -127,6 +127,7 @@ const getStyleSheet = makeStyleSheetFromTheme((theme) => { fontSize: 15, height: 150, paddingVertical: 10, + paddingHorizontal: 15, }, helpContainer: { marginTop: 10, diff --git a/app/screens/terms_of_service/__snapshots__/terms_of_service.test.js.snap b/app/screens/terms_of_service/__snapshots__/terms_of_service.test.js.snap index cbd59ede8..324248811 100644 --- a/app/screens/terms_of_service/__snapshots__/terms_of_service.test.js.snap +++ b/app/screens/terms_of_service/__snapshots__/terms_of_service.test.js.snap @@ -115,10 +115,11 @@ exports[`TermsOfService should enable/disable navigator buttons on setNavigatorB "color": "#2389d7", }, "mention": Object { - "color": "#2389d7", + "color": "#166de0", }, "mention_highlight": Object { "backgroundColor": "#ffe577", + "color": "#166de0", }, "strong": Object { "fontWeight": "bold", @@ -249,10 +250,11 @@ exports[`TermsOfService should enable/disable navigator buttons on setNavigatorB "color": "#2389d7", }, "mention": Object { - "color": "#2389d7", + "color": "#166de0", }, "mention_highlight": Object { "backgroundColor": "#ffe577", + "color": "#166de0", }, "strong": Object { "fontWeight": "bold", @@ -447,10 +449,11 @@ exports[`TermsOfService should match snapshot on enableNavigatorLogout 1`] = ` "color": "#2389d7", }, "mention": Object { - "color": "#2389d7", + "color": "#166de0", }, "mention_highlight": Object { "backgroundColor": "#ffe577", + "color": "#166de0", }, "strong": Object { "fontWeight": "bold", diff --git a/app/utils/markdown.js b/app/utils/markdown.js index ac2baae84..50f002aeb 100644 --- a/app/utils/markdown.js +++ b/app/utils/markdown.js @@ -81,7 +81,7 @@ export const getMarkdownTextStyles = makeStyleSheetFromTheme((theme) => { fontFamily: codeFont, }, mention: { - color: theme.linkColor, + color: theme.mentionHighlightLink, }, error: { color: theme.errorTextColor, @@ -91,6 +91,7 @@ export const getMarkdownTextStyles = makeStyleSheetFromTheme((theme) => { }, mention_highlight: { backgroundColor: theme.mentionHighlightBg, + color: theme.mentionHighlightLink, }, }; }); diff --git a/ios/Mattermost.xcodeproj/project.pbxproj b/ios/Mattermost.xcodeproj/project.pbxproj index eddc1fc0f..cffbebf3f 100644 --- a/ios/Mattermost.xcodeproj/project.pbxproj +++ b/ios/Mattermost.xcodeproj/project.pbxproj @@ -2856,7 +2856,7 @@ CODE_SIGN_ENTITLEMENTS = Mattermost/Mattermost.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 236; + CURRENT_PROJECT_VERSION = 238; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = UQ8HT4Q2XM; ENABLE_BITCODE = NO; @@ -2917,7 +2917,7 @@ CODE_SIGN_ENTITLEMENTS = Mattermost/Mattermost.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 236; + CURRENT_PROJECT_VERSION = 238; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = UQ8HT4Q2XM; ENABLE_BITCODE = NO; diff --git a/ios/Mattermost/Info.plist b/ios/Mattermost/Info.plist index 6f8e32fcb..518277cf6 100644 --- a/ios/Mattermost/Info.plist +++ b/ios/Mattermost/Info.plist @@ -34,7 +34,7 @@ CFBundleVersion - 236 + 238 ITSAppUsesNonExemptEncryption LSRequiresIPhoneOS diff --git a/ios/MattermostShare/Info.plist b/ios/MattermostShare/Info.plist index 037b0b60e..9b9ffcd1b 100644 --- a/ios/MattermostShare/Info.plist +++ b/ios/MattermostShare/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString 1.24.0 CFBundleVersion - 236 + 238 NSAppTransportSecurity NSAllowsArbitraryLoads diff --git a/ios/MattermostTests/Info.plist b/ios/MattermostTests/Info.plist index 5aba5d2c3..1553e2ccc 100644 --- a/ios/MattermostTests/Info.plist +++ b/ios/MattermostTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 236 + 238 diff --git a/ios/NotificationService/Info.plist b/ios/NotificationService/Info.plist index be47a6a67..1a5d8a77b 100644 --- a/ios/NotificationService/Info.plist +++ b/ios/NotificationService/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString 1.24.0 CFBundleVersion - 236 + 238 NSExtension NSExtensionPointIdentifier diff --git a/package-lock.json b/package-lock.json index 015aaed3a..84eb7af0e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5541,6 +5541,21 @@ } } }, + "character-entities": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.3.tgz", + "integrity": "sha512-yB4oYSAa9yLcGyTbB4ItFwHw43QHdH129IJ5R+WvxOkWlyFnR5FAaBNnUq4mcxsTVZGh28bHoeTHMKXH1wZf3w==" + }, + "character-entities-legacy": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.3.tgz", + "integrity": "sha512-YAxUpPoPwxYFsslbdKkhrGnXAtXoHNgYjlBM3WMXkWGTl5RsY3QmOyhwAgL8Nxm9l5LBThXGawxKPn68y6/fww==" + }, + "character-reference-invalid": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.3.tgz", + "integrity": "sha512-VOq6PRzQBam/8Jm6XBGk2fNEnHXAdGd6go0rtd4weAGECBamHDwwCQSOT12TACIYUZegUXnV6xBXqUssijtxIg==" + }, "chardet": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", @@ -5758,6 +5773,17 @@ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" }, + "clipboard": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.4.tgz", + "integrity": "sha512-Vw26VSLRpJfBofiVaFb/I8PVfdI1OxKcYShe6fm0sP/DtmiWQNCjhM/okTvdCo0G+lMMm1rMYbk4IK4x1X+kgQ==", + "optional": true, + "requires": { + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" + } + }, "cliui": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", @@ -5840,6 +5866,11 @@ "delayed-stream": "~1.0.0" } }, + "comma-separated-tokens": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.7.tgz", + "integrity": "sha512-Jrx3xsP4pPv4AwJUDWY9wOXGtwPXARej6Xd99h4TUGotmf8APuquKMpK+dnD3UgyxK7OEWaisjZz+3b5jtL6xQ==" + }, "commander": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", @@ -6312,6 +6343,12 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, + "delegate": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==", + "optional": true + }, "delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", @@ -7524,6 +7561,14 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "fault": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.3.tgz", + "integrity": "sha512-sfFuP4X0hzrbGKjAUNXYvNqsZ5F6ohx/dZ9I0KQud/aiZNwg263r5L9yGB0clvXHCkzXh5W3t7RSHchggYIFmA==", + "requires": { + "format": "^0.2.2" + } + }, "fb-watchman": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", @@ -8378,6 +8423,11 @@ "mime-types": "^2.1.12" } }, + "format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=" + }, "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", @@ -9132,6 +9182,15 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz", "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==" }, + "good-listener": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", + "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", + "optional": true, + "requires": { + "delegate": "^3.1.2" + } + }, "got": { "version": "6.7.1", "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", @@ -9170,9 +9229,9 @@ "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" }, "handlebars": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", - "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.4.2.tgz", + "integrity": "sha512-cIv17+GhL8pHHnRJzGu2wwcthL5sb8uDKBHvZ2Dtu5s1YNt0ljbzKbamnc+gr69y7bzwQiBdr5+hOpRd5pnOdg==", "dev": true, "requires": { "neo-async": "^2.6.0", @@ -9195,13 +9254,13 @@ "dev": true }, "uglify-js": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.10.tgz", - "integrity": "sha512-/GTF0nosyPLbdJBd+AwYiZ+Hu5z8KXWnO0WCGt1BQ/u9Iamhejykqmz5o1OHJ53+VAk6xVxychonnApDjuqGsw==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.1.tgz", + "integrity": "sha512-+dSJLJpXBb6oMHP+Yvw8hUgElz4gLTh82XuX68QiJVTXaE5ibl6buzhNkQdYhBlIhozWOC9ge16wyRmjG4TwVQ==", "dev": true, "optional": true, "requires": { - "commander": "~2.20.0", + "commander": "2.20.0", "source-map": "~0.6.1" } } @@ -9324,6 +9383,27 @@ "is-stream": "^1.0.1" } }, + "hast-util-parse-selector": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.2.tgz", + "integrity": "sha512-jIMtnzrLTjzqgVEQqPEmwEZV+ea4zHRFTP8Z2Utw0I5HuBOXHzUPPQWr6ouJdJqDKLbFU/OEiYwZ79LalZkmmw==" + }, + "hastscript": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-5.1.0.tgz", + "integrity": "sha512-7mOQX5VfVs/gmrOGlN8/EDfp1GqV6P3gTNVt+KnX4gbYhpASTM8bklFdFQCbFRAadURXAmw0R1QQdBdqp7jswQ==", + "requires": { + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.2.0", + "property-information": "^5.0.1", + "space-separated-tokens": "^1.0.0" + } + }, + "highlight.js": { + "version": "9.12.0", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.12.0.tgz", + "integrity": "sha1-5tnb5Xy+/mB1HwKvM2GVhwyQwB4=" + }, "hoist-non-react-statics": { "version": "2.5.5", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", @@ -9682,6 +9762,20 @@ } } }, + "is-alphabetical": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.3.tgz", + "integrity": "sha512-eEMa6MKpHFzw38eKm56iNNi6GJ7lf6aLLio7Kr23sJPAECscgRtZvOBYybejWDQ2bM949Y++61PY+udzj5QMLA==" + }, + "is-alphanumerical": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.3.tgz", + "integrity": "sha512-A1IGAPO5AW9vSh7omxIlOGwIqEvpW/TA+DksVOPM5ODuxKlZS09+TEM1E3275lJqO2oJ38vDpeAL3DCIiHE6eA==", + "requires": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + } + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -9755,6 +9849,11 @@ "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", "dev": true }, + "is-decimal": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.3.tgz", + "integrity": "sha512-bvLSwoDg2q6Gf+E2LEPiklHZxxiSi3XAh4Mav65mKqTfCO1HM3uBs24TjEH8iJX3bbDdLXKJXBTmGzuTUuAEjQ==" + }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", @@ -9819,6 +9918,11 @@ "is-extglob": "^1.0.0" } }, + "is-hexadecimal": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.3.tgz", + "integrity": "sha512-zxQ9//Q3D/34poZf8fiy3m3XVpbQc7ren15iKqrTtLPwkPD/t3Scy9Imp63FujULGxuK0ZlCwoo5xNpktFgbOA==" + }, "is-installed-globally": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", @@ -13974,6 +14078,15 @@ "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", "dev": true }, + "lowlight": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.9.2.tgz", + "integrity": "sha512-Ek18ElVCf/wF/jEm1b92gTnigh94CtBNWiZ2ad+vTgW7cTmQxUY3I98BjHK68gZAJEWmybGBZgx9qv3QxLQB/Q==", + "requires": { + "fault": "^1.0.2", + "highlight.js": "~9.12.0" + } + }, "lru-cache": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", @@ -14941,9 +15054,9 @@ "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" }, "neo-async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz", - "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", "dev": true }, "nested-error-stacks": { @@ -15723,6 +15836,19 @@ } } }, + "parse-entities": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.2.tgz", + "integrity": "sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==", + "requires": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + } + }, "parse-glob": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", @@ -16056,6 +16182,14 @@ } } }, + "prismjs": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.17.1.tgz", + "integrity": "sha512-PrEDJAFdUGbOP6xK/UsfkC5ghJsPJviKgnQOoxaDbBjwc8op68Quupwt1DeAFoG8GImPhiKXAvvsH7wDSLsu1Q==", + "requires": { + "clipboard": "^2.0.0" + } + }, "private": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", @@ -16134,6 +16268,14 @@ "retry": "^0.10.0" } }, + "property-information": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.3.0.tgz", + "integrity": "sha512-IslotQn1hBCZDY7SaJ3zmCjVea219VTwmOk6Pu3z9haU9m4+T8GwaDubur+6NMHEU+Fjs/6/p66z6QULPkcL1w==", + "requires": { + "xtend": "^4.0.1" + } + }, "proxy-from-env": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", @@ -16519,6 +16661,16 @@ "resolved": "https://registry.npmjs.org/react-native-exception-handler/-/react-native-exception-handler-2.10.7.tgz", "integrity": "sha512-e2zv0BiP9SRdr1vLDUyC2WbWHfgNV1a3BhRxK1ENjXVRY8mu+dfaaIHhFXdvYue//MEuGUQstu61NZoiO1u2KA==" }, + "react-native-gesture-handler": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/react-native-gesture-handler/-/react-native-gesture-handler-1.3.0.tgz", + "integrity": "sha512-ASRFIXBuKRvqlmwkWJhV8yP2dTpvcqVrLNpd7FKVBFHYWr6SAxjGyO9Ik8w1lAxDhMlRP2IcJ9p9eq5X2WWeLQ==", + "requires": { + "hoist-non-react-statics": "^2.3.1", + "invariant": "^2.2.2", + "prop-types": "^15.5.10" + } + }, "react-native-haptic-feedback": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/react-native-haptic-feedback/-/react-native-haptic-feedback-1.8.2.tgz", @@ -16675,6 +16827,14 @@ "resolved": "https://registry.npmjs.org/react-native-svg/-/react-native-svg-9.4.0.tgz", "integrity": "sha512-IVJlVbS2dAPerPr927fEi4uXzrPXzlra5ddgyJXZZ2IKA2ZygyYWFZDM+vsQs+Vj20CfL8nOWszQQV57vdQgFg==" }, + "react-native-syntax-highlighter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/react-native-syntax-highlighter/-/react-native-syntax-highlighter-2.1.0.tgz", + "integrity": "sha512-upu8gpKT2ZeslXn2d763KwtzzhM9OUHGgJjIKKIUw1JnFAzVwQmKCaFGoI6PkQa7T1LVggBW5k5VoaLFhZDb+g==", + "requires": { + "react-syntax-highlighter": "^6.0.4" + } + }, "react-native-tab-view": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/react-native-tab-view/-/react-native-tab-view-1.3.5.tgz", @@ -16975,6 +17135,18 @@ } } }, + "react-syntax-highlighter": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-6.1.2.tgz", + "integrity": "sha512-ahNwcZ0FhUd8U5TQYcmAqC/pec6Q308mUAATKMcLFmNYkvGhN9wfmoqxzjACcccGb2e85d5ZnGpOiCIIzGO3yA==", + "requires": { + "babel-runtime": "^6.18.0", + "highlight.js": "~9.12.0", + "lowlight": "~1.9.1", + "prismjs": "^1.8.4", + "refractor": "^2.0.0" + } + }, "react-test-renderer": { "version": "16.8.6", "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.8.6.tgz", @@ -17473,6 +17645,16 @@ "integrity": "sha1-dJrO7H8/34tj+SegSAnpDFwLNGA=", "dev": true }, + "refractor": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/refractor/-/refractor-2.10.0.tgz", + "integrity": "sha512-maW2ClIkm9IYruuFYGTqKzj+m31heq92wlheW4h7bOstP+gf8bocmMec+j7ljLcaB1CAID85LMB3moye31jH1g==", + "requires": { + "hastscript": "^5.0.0", + "parse-entities": "^1.1.2", + "prismjs": "~1.17.0" + } + }, "regenerate": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", @@ -18292,6 +18474,12 @@ "object-assign": "^4.1.1" } }, + "select": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", + "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=", + "optional": true + }, "semver": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz", @@ -18851,6 +19039,11 @@ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" }, + "space-separated-tokens": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.4.tgz", + "integrity": "sha512-UyhMSmeIqZrQn2UdjYpxEkwY9JUrn8pP+7L4f91zRzOQuI8MF1FGLfYU9DKCYeLdo7LXMxwrX5zKFy7eeeVHuA==" + }, "spawn-wrap": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.2.tgz", @@ -19363,6 +19556,12 @@ "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", "dev": true }, + "tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", + "optional": true + }, "tinycolor2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz",