From 783b4b6b9b7225fcffb03f5847beeacbc7cb7054 Mon Sep 17 00:00:00 2001 From: Daniel Gale-Rosen Date: Tue, 23 May 2023 12:44:56 -0400 Subject: [PATCH 01/63] basic framework --- src/pages/home/report/ReportActionItem.js | 46 +++++++++++++++++++ .../home/report/ReportActionItemMessage.js | 7 ++- 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/src/pages/home/report/ReportActionItem.js b/src/pages/home/report/ReportActionItem.js index a318d181e460..a722f793246a 100644 --- a/src/pages/home/report/ReportActionItem.js +++ b/src/pages/home/report/ReportActionItem.js @@ -10,6 +10,7 @@ import reportActionPropTypes from './reportActionPropTypes'; import * as StyleUtils from '../../../styles/StyleUtils'; import PressableWithSecondaryInteraction from '../../../components/PressableWithSecondaryInteraction'; import Hoverable from '../../../components/Hoverable'; +import Button from '../../../components/Button'; import ReportActionItemSingle from './ReportActionItemSingle'; import ReportActionItemGrouped from './ReportActionItemGrouped'; import MoneyRequestAction from '../../../components/ReportActionItem/MoneyRequestAction'; @@ -105,6 +106,8 @@ const defaultProps = { function ReportActionItem(props) { const [isContextMenuActive, setIsContextMenuActive] = useState(ReportActionContextMenu.isActiveReportAction(props.action.reportActionID)); + const [isHidden, setIsHidden] = useState(true); + const [moderationDecision, setModerationDecision] = useState('approved'); const textInputRef = useRef(); const popoverAnchorRef = useRef(); @@ -120,6 +123,40 @@ function ReportActionItem(props) { focusTextInputAfterAnimation(textInputRef.current, 100); }, [isDraftEmpty]); + // hide the message if it is being moderated + useEffect(() => { + if (!props.action.moderationDecisions || _.isEmpty(props.action.moderationDecisions)) { + return; + } + + const decisions = props.action.moderationDecisions; + let lastDecision; + + decisions.foreach((decision) => { + // removed will always take precedence - there's no going back from that currently + if (decision.decision === 'removed') { + setModerationDecision(decision.decision); + setIsHidden(true); + return; + } + + // pending will always be the most recent if it exists + if (decision.decision === 'pending') { + setModerationDecision(decision.decision); + setIsHidden(true); + return; + } + + if (!lastDecision || lastDecision.timestamp < decision.timestamp) { + lastDecision = decision; + } + }) + + setModerationDecision(lastDecision.decision); + setIsHidden(moderationDecision === 'pending' || moderationDecision === 'hidden'); + + }, [props.action, moderationDecision]) + const toggleContextMenuFromActiveReportAction = useCallback(() => { setIsContextMenuActive(ReportActionContextMenu.isActiveReportAction(props.action.reportActionID)); }, [props.action.reportActionID]); @@ -243,6 +280,7 @@ function ReportActionItem(props) { {!props.draftMessage ? ( )} + {moderationDecision === 'approved' && + + } + ) : ( )} - {moderationDecision === 'approved' && + {!props.displayAsGroup && moderationDecision !== 'approved' && } ); @@ -368,6 +380,7 @@ function ReportActionItem(props) { wrapperStyles={[styles.chatItem, isWhisper ? styles.pt1 : {}]} shouldShowSubscriptAvatar={props.shouldShowSubscriptAvatar} report={props.report} + isHidden={isHidden} > {content} diff --git a/src/pages/home/report/ReportActionItemMessage.js b/src/pages/home/report/ReportActionItemMessage.js index c6ad45968bbd..057795079a63 100644 --- a/src/pages/home/report/ReportActionItemMessage.js +++ b/src/pages/home/report/ReportActionItemMessage.js @@ -1,5 +1,5 @@ import React from 'react'; -import {View} from 'react-native'; +import {View, Text} from 'react-native'; import PropTypes from 'prop-types'; import _ from 'underscore'; import lodashGet from 'lodash/get'; @@ -39,7 +39,7 @@ const ReportActionItemMessage = (props) => ( loading={props.action.isLoading} style={props.style} /> - )) : 'hi'} + )) : This message has been flagged as violating our community rules and the content has been hidden.} ); diff --git a/src/pages/home/report/ReportActionItemSingle.js b/src/pages/home/report/ReportActionItemSingle.js index f388faf1b5a4..ceb248dfb0ea 100644 --- a/src/pages/home/report/ReportActionItemSingle.js +++ b/src/pages/home/report/ReportActionItemSingle.js @@ -127,7 +127,9 @@ const ReportActionItemSingle = (props) => { ) : null} - {props.children} + + {props.children} + ); diff --git a/src/styles/styles.js b/src/styles/styles.js index 5d7f0952a627..7ef46639a694 100644 --- a/src/styles/styles.js +++ b/src/styles/styles.js @@ -1018,6 +1018,10 @@ const styles = { lineHeight: 16, }, + lh20: { + lineHeight: 20, + }, + lh140Percent: { lineHeight: '140%', }, From f831821c19322b6b5d43d0d1f3656a0e9f47cc29 Mon Sep 17 00:00:00 2001 From: Daniel Gale-Rosen Date: Tue, 23 May 2023 14:51:23 -0400 Subject: [PATCH 03/63] cleanup --- src/pages/home/report/ReportActionItem.js | 7 ++++--- src/pages/home/report/ReportActionItemSingle.js | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/pages/home/report/ReportActionItem.js b/src/pages/home/report/ReportActionItem.js index c23fc3b79ed4..957f135e9533 100644 --- a/src/pages/home/report/ReportActionItem.js +++ b/src/pages/home/report/ReportActionItem.js @@ -267,6 +267,7 @@ function ReportActionItem(props) { ); } else { const message = _.last(lodashGet(props.action, 'message', [{}])); + const hasBeenFlagged = moderationDecision !== 'approved'; const isAttachment = _.has(props.action, 'isAttachment') ? props.action.isAttachment : ReportUtils.isReportMessageAttachment(message); children = ( {!props.draftMessage ? ( - + - {props.displayAsGroup && moderationDecision !== 'approved' && + {props.displayAsGroup && hasBeenFlagged && } diff --git a/src/pages/home/report/ReportActionItemMessage.js b/src/pages/home/report/ReportActionItemMessage.js index 057795079a63..8b93cd1668d3 100644 --- a/src/pages/home/report/ReportActionItemMessage.js +++ b/src/pages/home/report/ReportActionItemMessage.js @@ -39,7 +39,7 @@ const ReportActionItemMessage = (props) => ( loading={props.action.isLoading} style={props.style} /> - )) : This message has been flagged as violating our community rules and the content has been hidden.} + )) : {props.translate('moderation.flaggedContent')}} ); From f49a93eabed5980d4a42df74e775f3a6df8da3d7 Mon Sep 17 00:00:00 2001 From: Daniel Gale-Rosen Date: Thu, 25 May 2023 21:17:27 -0400 Subject: [PATCH 14/63] use constants for decisions --- src/CONST.js | 2 ++ src/pages/home/report/ReportActionItem.js | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/CONST.js b/src/CONST.js index 182548b4d99e..b89af0a998bb 100755 --- a/src/CONST.js +++ b/src/CONST.js @@ -2432,6 +2432,8 @@ const CONST = { MODERATION: { MODERATOR_DECISION_PENDING: 'pending', MODERATOR_DECISION_PENDING_HIDE: 'pendingHide', + MODERATOR_DECISION_APPROVED: 'approved', + MODERATOR_DECISION: 'hidden', FLAG_SEVERITY_SPAM: 'spam', FLAG_SEVERITY_INCONSIDERATE: 'inconsiderate', }, diff --git a/src/pages/home/report/ReportActionItem.js b/src/pages/home/report/ReportActionItem.js index 0093a0e15f5c..f2faeffcf2ec 100644 --- a/src/pages/home/report/ReportActionItem.js +++ b/src/pages/home/report/ReportActionItem.js @@ -107,7 +107,7 @@ const defaultProps = { function ReportActionItem(props) { const [isContextMenuActive, setIsContextMenuActive] = useState(ReportActionContextMenu.isActiveReportAction(props.action.reportActionID)); const [isHidden, setIsHidden] = useState(false); - const [moderationDecision, setModerationDecision] = useState('approved'); + const [moderationDecision, setModerationDecision] = useState(CONST.MODERATION.MODERATOR_DECISION_APPROVED); const textInputRef = useRef(); const popoverAnchorRef = useRef(); @@ -129,7 +129,7 @@ function ReportActionItem(props) { // Right now we are only sending the latest moderationDecision to the frontend even though it is an array const latestDecision = props.action.moderationDecisions[0]; - if (latestDecision.decision === 'pendingHide' || latestDecision.decision === 'hidden') { + if (latestDecision.decision === CONST.MODERATION.MODERATOR_DECISION_PENDING_HIDE || latestDecision.decision === CONST.MODERATION.MODERATOR_DECISION_HIDDEN) { setIsHidden(true); } setModerationDecision(latestDecision.decision); @@ -245,7 +245,7 @@ function ReportActionItem(props) { ); } else { const message = _.last(lodashGet(props.action, 'message', [{}])); - const hasBeenFlagged = moderationDecision !== 'approved'; + const hasBeenFlagged = moderationDecision !== CONST.MODERATION.MODERATOR_DECISION_APPROVED; const isAttachment = _.has(props.action, 'isAttachment') ? props.action.isAttachment : ReportUtils.isReportMessageAttachment(message); children = ( {content} From b5083eef6571d7f735f674c73432bf547d3fda3d Mon Sep 17 00:00:00 2001 From: Daniel Gale-Rosen Date: Thu, 25 May 2023 21:19:36 -0400 Subject: [PATCH 15/63] fix constant and prettier --- src/CONST.js | 2 +- src/pages/home/report/ReportActionItem.js | 28 +++++++++++++------ .../home/report/ReportActionItemMessage.js | 28 +++++++++++-------- .../home/report/ReportActionItemSingle.js | 4 +-- 4 files changed, 38 insertions(+), 24 deletions(-) diff --git a/src/CONST.js b/src/CONST.js index b89af0a998bb..969f451bc2ba 100755 --- a/src/CONST.js +++ b/src/CONST.js @@ -2433,7 +2433,7 @@ const CONST = { MODERATOR_DECISION_PENDING: 'pending', MODERATOR_DECISION_PENDING_HIDE: 'pendingHide', MODERATOR_DECISION_APPROVED: 'approved', - MODERATOR_DECISION: 'hidden', + MODERATOR_DECISION_HIDDEN: 'hidden', FLAG_SEVERITY_SPAM: 'spam', FLAG_SEVERITY_INCONSIDERATE: 'inconsiderate', }, diff --git a/src/pages/home/report/ReportActionItem.js b/src/pages/home/report/ReportActionItem.js index f2faeffcf2ec..febe993320a4 100644 --- a/src/pages/home/report/ReportActionItem.js +++ b/src/pages/home/report/ReportActionItem.js @@ -133,7 +133,7 @@ function ReportActionItem(props) { setIsHidden(true); } setModerationDecision(latestDecision.decision); - }, [props.action, moderationDecision]) + }, [props.action, moderationDecision]); const toggleContextMenuFromActiveReportAction = useCallback(() => { setIsContextMenuActive(ReportActionContextMenu.isActiveReportAction(props.action.reportActionID)); @@ -263,18 +263,25 @@ function ReportActionItem(props) { isHidden={isHidden} style={[ !props.displayAsGroup && isAttachment ? styles.mt2 : undefined, - _.contains([..._.values(CONST.REPORT.ACTIONS.TYPE.POLICYCHANGELOG), CONST.REPORT.ACTIONS.TYPE.IOU], props.action.actionName) ? styles.colorMuted : undefined, + _.contains([..._.values(CONST.REPORT.ACTIONS.TYPE.POLICYCHANGELOG), CONST.REPORT.ACTIONS.TYPE.IOU], props.action.actionName) + ? styles.colorMuted + : undefined, ]} /> - {props.displayAsGroup && hasBeenFlagged && + {props.displayAsGroup && hasBeenFlagged && ( - } + )} ) : ( )} - {!props.displayAsGroup && hasBeenFlagged && + {!props.displayAsGroup && hasBeenFlagged && ( - } + )} ); } diff --git a/src/pages/home/report/ReportActionItemMessage.js b/src/pages/home/report/ReportActionItemMessage.js index 8b93cd1668d3..4d6c0b8dfb30 100644 --- a/src/pages/home/report/ReportActionItemMessage.js +++ b/src/pages/home/report/ReportActionItemMessage.js @@ -28,18 +28,22 @@ const defaultProps = { const ReportActionItemMessage = (props) => ( - {!props.isHidden ? _.map(_.compact(props.action.previousMessage || props.action.message), (fragment, index) => ( - - )) : {props.translate('moderation.flaggedContent')}} + {!props.isHidden ? ( + _.map(_.compact(props.action.previousMessage || props.action.message), (fragment, index) => ( + + )) + ) : ( + {props.translate('moderation.flaggedContent')} + )} ); diff --git a/src/pages/home/report/ReportActionItemSingle.js b/src/pages/home/report/ReportActionItemSingle.js index 69e342e2aa08..5dac6fdb1cb3 100644 --- a/src/pages/home/report/ReportActionItemSingle.js +++ b/src/pages/home/report/ReportActionItemSingle.js @@ -133,9 +133,7 @@ const ReportActionItemSingle = (props) => { ) : null} - - {props.children} - + {props.children} ); From b104d9b78ab96f85f2b1dba86bdf753e9b11eafd Mon Sep 17 00:00:00 2001 From: Daniel Gale-Rosen Date: Thu, 25 May 2023 21:27:59 -0400 Subject: [PATCH 16/63] act normal for pending --- src/pages/home/report/ReportActionItem.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/home/report/ReportActionItem.js b/src/pages/home/report/ReportActionItem.js index febe993320a4..679d75df801a 100644 --- a/src/pages/home/report/ReportActionItem.js +++ b/src/pages/home/report/ReportActionItem.js @@ -245,7 +245,7 @@ function ReportActionItem(props) { ); } else { const message = _.last(lodashGet(props.action, 'message', [{}])); - const hasBeenFlagged = moderationDecision !== CONST.MODERATION.MODERATOR_DECISION_APPROVED; + const hasBeenFlagged = moderationDecision !== CONST.MODERATION.MODERATOR_DECISION_APPROVED && moderationDecision !== CONST.MODERATION.MODERATOR_DECISION_PENDING; const isAttachment = _.has(props.action, 'isAttachment') ? props.action.isAttachment : ReportUtils.isReportMessageAttachment(message); children = ( {content} From 5e9a8c85b9a8613dad132bf350221f6b1a64ecbd Mon Sep 17 00:00:00 2001 From: Daniel Gale-Rosen Date: Thu, 25 May 2023 21:48:50 -0400 Subject: [PATCH 17/63] remove unnecessary conditional --- src/pages/home/report/ReportActionItem.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/home/report/ReportActionItem.js b/src/pages/home/report/ReportActionItem.js index 679d75df801a..1423ceab7773 100644 --- a/src/pages/home/report/ReportActionItem.js +++ b/src/pages/home/report/ReportActionItem.js @@ -123,7 +123,7 @@ function ReportActionItem(props) { // Hide the message if it is being moderated for a higher offense, or is hidden by a moderator // Removed messages should not be shown anyway and should not need this flow useEffect(() => { - if (!props.action.moderationDecisions || _.isEmpty(props.action.moderationDecisions)) { + if (_.isEmpty(props.action.moderationDecisions)) { return; } From e97ac5d2c1b665350e25540ade1ba525542a3164 Mon Sep 17 00:00:00 2001 From: Daniel Gale-Rosen Date: Thu, 25 May 2023 22:10:24 -0400 Subject: [PATCH 18/63] add proptype comment --- src/pages/home/report/ReportActionItemMessage.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/home/report/ReportActionItemMessage.js b/src/pages/home/report/ReportActionItemMessage.js index 4d6c0b8dfb30..a764eafb84b7 100644 --- a/src/pages/home/report/ReportActionItemMessage.js +++ b/src/pages/home/report/ReportActionItemMessage.js @@ -15,6 +15,7 @@ const propTypes = { /** Additional styles to add after local styles. */ style: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.object), PropTypes.object]), + /** Whether or not the message is hidden by moderation */ isHidden: PropTypes.bool, /** localization props */ From d2ac397ec70c0d28b4d7d955cfb6b9be4433faf8 Mon Sep 17 00:00:00 2001 From: dukenv0307 Date: Fri, 26 May 2023 11:13:09 +0700 Subject: [PATCH 19/63] fix: update height for text container --- src/components/MagicCodeInput.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/MagicCodeInput.js b/src/components/MagicCodeInput.js index 30c9b9ad4d9d..13fca0f735e6 100644 --- a/src/components/MagicCodeInput.js +++ b/src/components/MagicCodeInput.js @@ -293,7 +293,7 @@ function MagicCodeInput(props) { key={index} style={[styles.w15]} > - + {decomposeString(props.value, props.maxLength)[index] || ''} From f190a8fb8456e6a55ed4ee0686a89f34dd651de7 Mon Sep 17 00:00:00 2001 From: dukenv0307 Date: Fri, 26 May 2023 11:44:27 +0700 Subject: [PATCH 20/63] fix: lint --- src/components/MagicCodeInput.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/components/MagicCodeInput.js b/src/components/MagicCodeInput.js index 13fca0f735e6..dbe414e95a14 100644 --- a/src/components/MagicCodeInput.js +++ b/src/components/MagicCodeInput.js @@ -293,7 +293,14 @@ function MagicCodeInput(props) { key={index} style={[styles.w15]} > - + {decomposeString(props.value, props.maxLength)[index] || ''} From ce632161ae63e68c68a55b93b0f3f8f1d5a2e505 Mon Sep 17 00:00:00 2001 From: Hans Date: Fri, 26 May 2023 13:35:07 +0700 Subject: [PATCH 21/63] Fix overlay divider line --- src/pages/home/report/ReportActionItemParentAction.js | 6 +++++- src/pages/home/report/ReportActionsList.js | 4 ++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/pages/home/report/ReportActionItemParentAction.js b/src/pages/home/report/ReportActionItemParentAction.js index cc50b62a1774..2d5580305be5 100644 --- a/src/pages/home/report/ReportActionItemParentAction.js +++ b/src/pages/home/report/ReportActionItemParentAction.js @@ -17,6 +17,9 @@ import reportActionPropTypes from './reportActionPropTypes'; import * as ReportActionsUtils from '../../../libs/ReportActionsUtils'; const propTypes = { + /** Flag to show, hide the thread divider line */ + shouldHideThreadDividerLine: PropTypes.bool, + /** The id of the report */ reportID: PropTypes.string.isRequired, @@ -38,6 +41,7 @@ const propTypes = { const defaultProps = { report: {}, parentReportActions: {}, + shouldHideThreadDividerLine: false, }; const ReportActionItemParentAction = (props) => { @@ -67,7 +71,7 @@ const ReportActionItemParentAction = (props) => { /> )} - + {!props.shouldHideThreadDividerLine && } ); }; diff --git a/src/pages/home/report/ReportActionsList.js b/src/pages/home/report/ReportActionsList.js index 1a3b44c3f806..f601cb83a5fa 100644 --- a/src/pages/home/report/ReportActionsList.js +++ b/src/pages/home/report/ReportActionsList.js @@ -115,8 +115,12 @@ const ReportActionsList = (props) => { // When the new indicator should not be displayed we explicitly set it to null const shouldDisplayNewMarker = reportAction.reportActionID === newMarkerReportActionID; const shouldDisplayParentAction = reportAction.actionName === CONST.REPORT.ACTIONS.TYPE.CREATED && ReportUtils.isThread(report); + // check if the second message of the thread is unread, then hide the divider line. + const shouldHideThreadDividerLine = shouldDisplayParentAction && sortedReportActions.length > 1 && + sortedReportActions[sortedReportActions.length -2].reportActionID === newMarkerReportActionID; return shouldDisplayParentAction ? ( From f688bf780ac2956c5f0342bf4864be9782e478ed Mon Sep 17 00:00:00 2001 From: Hans Date: Fri, 26 May 2023 13:49:24 +0700 Subject: [PATCH 22/63] fix linting --- src/pages/home/report/ReportActionsList.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/home/report/ReportActionsList.js b/src/pages/home/report/ReportActionsList.js index f601cb83a5fa..ff5f59c2c007 100644 --- a/src/pages/home/report/ReportActionsList.js +++ b/src/pages/home/report/ReportActionsList.js @@ -116,8 +116,8 @@ const ReportActionsList = (props) => { const shouldDisplayNewMarker = reportAction.reportActionID === newMarkerReportActionID; const shouldDisplayParentAction = reportAction.actionName === CONST.REPORT.ACTIONS.TYPE.CREATED && ReportUtils.isThread(report); // check if the second message of the thread is unread, then hide the divider line. - const shouldHideThreadDividerLine = shouldDisplayParentAction && sortedReportActions.length > 1 && - sortedReportActions[sortedReportActions.length -2].reportActionID === newMarkerReportActionID; + const shouldHideThreadDividerLine = + shouldDisplayParentAction && sortedReportActions.length > 1 && sortedReportActions[sortedReportActions.length - 2].reportActionID === newMarkerReportActionID; return shouldDisplayParentAction ? ( Date: Thu, 18 May 2023 18:53:08 +0200 Subject: [PATCH 23/63] Pass `props.windowHeight` to `getBaseNavigationModalCardStyles` ...to work around Safari CSS issues. --- src/libs/Navigation/AppNavigator/AuthScreens.js | 7 +++++-- .../getBaseNavigationModalCardStyles.js | 2 +- .../getNavigationModalCardStyles/index.website.js | 12 +++++++----- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/libs/Navigation/AppNavigator/AuthScreens.js b/src/libs/Navigation/AppNavigator/AuthScreens.js index 0e523002a939..63e2cb9c4972 100644 --- a/src/libs/Navigation/AppNavigator/AuthScreens.js +++ b/src/libs/Navigation/AppNavigator/AuthScreens.js @@ -157,7 +157,7 @@ class AuthScreens extends React.Component { } shouldComponentUpdate(nextProps) { - return nextProps.isSmallScreenWidth !== this.props.isSmallScreenWidth; + return nextProps.windowHeight !== this.props.windowHeight || nextProps.isSmallScreenWidth !== this.props.isSmallScreenWidth; } componentWillUnmount() { @@ -184,7 +184,10 @@ class AuthScreens extends React.Component { }; const modalScreenOptions = { ...commonModalScreenOptions, - cardStyle: getNavigationModalCardStyle(this.props.isSmallScreenWidth), + cardStyle: getNavigationModalCardStyle({ + windowHeight: this.props.windowHeight, + isSmallScreenWidth: this.props.isSmallScreenWidth, + }), cardStyleInterpolator: (props) => modalCardStyleInterpolator(this.props.isSmallScreenWidth, false, props), cardOverlayEnabled: true, diff --git a/src/styles/getNavigationModalCardStyles/getBaseNavigationModalCardStyles.js b/src/styles/getNavigationModalCardStyles/getBaseNavigationModalCardStyles.js index 51691d801956..bddb639655a0 100644 --- a/src/styles/getNavigationModalCardStyles/getBaseNavigationModalCardStyles.js +++ b/src/styles/getNavigationModalCardStyles/getBaseNavigationModalCardStyles.js @@ -1,6 +1,6 @@ import variables from '../variables'; -export default (isSmallScreenWidth) => ({ +export default ({isSmallScreenWidth}) => ({ position: 'absolute', top: 0, right: 0, diff --git a/src/styles/getNavigationModalCardStyles/index.website.js b/src/styles/getNavigationModalCardStyles/index.website.js index 1b55c6891266..8f76cf8d17d5 100644 --- a/src/styles/getNavigationModalCardStyles/index.website.js +++ b/src/styles/getNavigationModalCardStyles/index.website.js @@ -1,9 +1,11 @@ import getBaseNavigationModalCardStyles from './getBaseNavigationModalCardStyles'; -export default (isSmallScreenWidth) => ({ - ...getBaseNavigationModalCardStyles(isSmallScreenWidth), +export default ({windowHeight, isSmallScreenWidth}) => ({ + ...getBaseNavigationModalCardStyles({isSmallScreenWidth}), - // This makes the modal card take up the full height of the screen on Desktop Safari and iOS Safari - // https://github.com/Expensify/App/pull/12509/files#r1018107162 - height: 'calc(100vh - 100%)', + // This height is passed from JavaScript, instead of using CSS expressions like "100%" or "100vh", to work around + // Safari issues: + // https://github.com/Expensify/App/issues/12005 + // https://github.com/Expensify/App/issues/17824 + height: `${windowHeight}px`, }); From 097ad8af24bf38c5b5dd17a648efe7add2595496 Mon Sep 17 00:00:00 2001 From: Daniel Gale-Rosen Date: Fri, 26 May 2023 16:26:34 -0400 Subject: [PATCH 24/63] address comments --- src/pages/home/report/ReportActionItem.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/pages/home/report/ReportActionItem.js b/src/pages/home/report/ReportActionItem.js index 1423ceab7773..d4a10fa8a985 100644 --- a/src/pages/home/report/ReportActionItem.js +++ b/src/pages/home/report/ReportActionItem.js @@ -123,17 +123,17 @@ function ReportActionItem(props) { // Hide the message if it is being moderated for a higher offense, or is hidden by a moderator // Removed messages should not be shown anyway and should not need this flow useEffect(() => { - if (_.isEmpty(props.action.moderationDecisions)) { + if (!props.action.actionName === CONST.REPORT.ACTIONS.TYPE.ADDCOMMENT || _.isEmpty(props.action.message[0].moderationDecisions)) { return; } // Right now we are only sending the latest moderationDecision to the frontend even though it is an array - const latestDecision = props.action.moderationDecisions[0]; + const latestDecision = props.action.message[0].moderationDecisions[0]; if (latestDecision.decision === CONST.MODERATION.MODERATOR_DECISION_PENDING_HIDE || latestDecision.decision === CONST.MODERATION.MODERATOR_DECISION_HIDDEN) { setIsHidden(true); } setModerationDecision(latestDecision.decision); - }, [props.action, moderationDecision]); + }, [props.action.message, props.action.actionName]); const toggleContextMenuFromActiveReportAction = useCallback(() => { setIsContextMenuActive(ReportActionContextMenu.isActiveReportAction(props.action.reportActionID)); @@ -245,8 +245,7 @@ function ReportActionItem(props) { ); } else { const message = _.last(lodashGet(props.action, 'message', [{}])); - const hasBeenFlagged = moderationDecision !== CONST.MODERATION.MODERATOR_DECISION_APPROVED && moderationDecision !== CONST.MODERATION.MODERATOR_DECISION_PENDING; - const isAttachment = _.has(props.action, 'isAttachment') ? props.action.isAttachment : ReportUtils.isReportMessageAttachment(message); + const hasBeenFlagged = !_.contains([CONST.MODERATION.MODERATOR_DECISION_APPROVED, CONST.MODERATION.MODERATOR_DECISION_PENDING], moderationDecision); const isAttachment = _.has(props.action, 'isAttachment') ? props.action.isAttachment : ReportUtils.isReportMessageAttachment(message); children = ( Date: Fri, 26 May 2023 17:01:51 -0400 Subject: [PATCH 25/63] prettier seriously? --- src/pages/home/report/ReportActionItem.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pages/home/report/ReportActionItem.js b/src/pages/home/report/ReportActionItem.js index d4a10fa8a985..d40b0a4e2cc6 100644 --- a/src/pages/home/report/ReportActionItem.js +++ b/src/pages/home/report/ReportActionItem.js @@ -245,7 +245,8 @@ function ReportActionItem(props) { ); } else { const message = _.last(lodashGet(props.action, 'message', [{}])); - const hasBeenFlagged = !_.contains([CONST.MODERATION.MODERATOR_DECISION_APPROVED, CONST.MODERATION.MODERATOR_DECISION_PENDING], moderationDecision); const isAttachment = _.has(props.action, 'isAttachment') ? props.action.isAttachment : ReportUtils.isReportMessageAttachment(message); + const hasBeenFlagged = !_.contains([CONST.MODERATION.MODERATOR_DECISION_APPROVED, CONST.MODERATION.MODERATOR_DECISION_PENDING], moderationDecision); + const isAttachment = _.has(props.action, 'isAttachment') ? props.action.isAttachment : ReportUtils.isReportMessageAttachment(message); children = ( Date: Fri, 26 May 2023 00:47:39 +0800 Subject: [PATCH 26/63] check if attachment is uploading --- src/libs/isReportMessageAttachment.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/isReportMessageAttachment.js b/src/libs/isReportMessageAttachment.js index db7df0df6c89..12cbfb0ec2cd 100644 --- a/src/libs/isReportMessageAttachment.js +++ b/src/libs/isReportMessageAttachment.js @@ -13,5 +13,5 @@ export default function isReportMessageAttachment({text, html}) { } const regex = new RegExp(` ${CONST.ATTACHMENT_SOURCE_ATTRIBUTE}="(.*)"`, 'i'); - return text === CONST.ATTACHMENT_MESSAGE_TEXT && !!html.match(regex); + return text === CONST.ATTACHMENT_MESSAGE_TEXT && (!!html.match(regex) || html === 'Uploading attachment...'); } From 96901062156cbe49b2382e24302aa7ec02d2444e Mon Sep 17 00:00:00 2001 From: Eric Han Date: Fri, 26 May 2023 01:11:05 +0800 Subject: [PATCH 27/63] don't show download button when attachment is uploading --- src/pages/home/report/ContextMenu/ContextMenuActions.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/home/report/ContextMenu/ContextMenuActions.js b/src/pages/home/report/ContextMenu/ContextMenuActions.js index 300d689aea52..d8387948bf59 100644 --- a/src/pages/home/report/ContextMenu/ContextMenuActions.js +++ b/src/pages/home/report/ContextMenu/ContextMenuActions.js @@ -88,7 +88,7 @@ export default [ shouldShow: (type, reportAction) => { const message = _.last(lodashGet(reportAction, 'message', [{}])); const isAttachment = _.has(reportAction, 'isAttachment') ? reportAction.isAttachment : ReportUtils.isReportMessageAttachment(message); - return isAttachment && reportAction.reportActionID; + return isAttachment && message.html !== 'Uploading attachment...' && reportAction.reportActionID; }, onPress: (closePopover, {reportAction}) => { const message = _.last(lodashGet(reportAction, 'message', [{}])); From 65ad7a14fdab7ab5a1940a26a2e40dfaac0e6066 Mon Sep 17 00:00:00 2001 From: Eric Han Date: Sat, 27 May 2023 05:56:09 +0800 Subject: [PATCH 28/63] define Uploading attachment... as a constant --- src/CONST.js | 4 ++++ src/libs/ReportUtils.js | 2 +- src/libs/isReportMessageAttachment.js | 2 +- src/pages/home/report/ContextMenu/ContextMenuActions.js | 2 +- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/CONST.js b/src/CONST.js index 182548b4d99e..57cf129574be 100755 --- a/src/CONST.js +++ b/src/CONST.js @@ -108,6 +108,8 @@ const CONST = { FAILED: 'failed', }, + + AVATAR_MAX_ATTACHMENT_SIZE: 6291456, AVATAR_ALLOWED_EXTENSIONS: ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'svg'], @@ -799,6 +801,8 @@ const CONST = { }, ATTACHMENT_MESSAGE_TEXT: '[Attachment]', + // This is a placeholder for attachment which is uploading + ATTACHMENT_UPLOADING_MESSAGE_HTML: 'Uploading attachment...', ATTACHMENT_SOURCE_ATTRIBUTE: 'data-expensify-source', ATTACHMENT_PREVIEW_ATTRIBUTE: 'src', ATTACHMENT_ORIGINAL_FILENAME_ATTRIBUTE: 'data-name', diff --git a/src/libs/ReportUtils.js b/src/libs/ReportUtils.js index fc229887fb75..6d56a27bba8b 100644 --- a/src/libs/ReportUtils.js +++ b/src/libs/ReportUtils.js @@ -1207,7 +1207,7 @@ function buildOptimisticAddCommentReportAction(text, file) { const commentText = getParsedComment(text); const isAttachment = _.isEmpty(text) && file !== undefined; const attachmentInfo = isAttachment ? file : {}; - const htmlForNewComment = isAttachment ? 'Uploading attachment...' : commentText; + const htmlForNewComment = isAttachment ? CONST.ATTACHMENT_UPLOADING_MESSAGE_HTML : commentText; // Remove HTML from text when applying optimistic offline comment const textForNewComment = isAttachment ? CONST.ATTACHMENT_MESSAGE_TEXT : parser.htmlToText(htmlForNewComment); diff --git a/src/libs/isReportMessageAttachment.js b/src/libs/isReportMessageAttachment.js index 12cbfb0ec2cd..b449c72eaa0d 100644 --- a/src/libs/isReportMessageAttachment.js +++ b/src/libs/isReportMessageAttachment.js @@ -13,5 +13,5 @@ export default function isReportMessageAttachment({text, html}) { } const regex = new RegExp(` ${CONST.ATTACHMENT_SOURCE_ATTRIBUTE}="(.*)"`, 'i'); - return text === CONST.ATTACHMENT_MESSAGE_TEXT && (!!html.match(regex) || html === 'Uploading attachment...'); + return text === CONST.ATTACHMENT_MESSAGE_TEXT && (!!html.match(regex) || html === CONST.ATTACHMENT_UPLOADING_MESSAGE_HTML); } diff --git a/src/pages/home/report/ContextMenu/ContextMenuActions.js b/src/pages/home/report/ContextMenu/ContextMenuActions.js index d8387948bf59..e155eb46b352 100644 --- a/src/pages/home/report/ContextMenu/ContextMenuActions.js +++ b/src/pages/home/report/ContextMenu/ContextMenuActions.js @@ -88,7 +88,7 @@ export default [ shouldShow: (type, reportAction) => { const message = _.last(lodashGet(reportAction, 'message', [{}])); const isAttachment = _.has(reportAction, 'isAttachment') ? reportAction.isAttachment : ReportUtils.isReportMessageAttachment(message); - return isAttachment && message.html !== 'Uploading attachment...' && reportAction.reportActionID; + return isAttachment && message.html !== CONST.ATTACHMENT_UPLOADING_MESSAGE_HTML && reportAction.reportActionID; }, onPress: (closePopover, {reportAction}) => { const message = _.last(lodashGet(reportAction, 'message', [{}])); From 47bc9796e01ab415a842cb08175670e6c9f4c4d2 Mon Sep 17 00:00:00 2001 From: Eric Han Date: Sat, 27 May 2023 05:59:13 +0800 Subject: [PATCH 29/63] remove unwanted new lines --- src/CONST.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/CONST.js b/src/CONST.js index 57cf129574be..5e98d3a7828c 100755 --- a/src/CONST.js +++ b/src/CONST.js @@ -108,8 +108,6 @@ const CONST = { FAILED: 'failed', }, - - AVATAR_MAX_ATTACHMENT_SIZE: 6291456, AVATAR_ALLOWED_EXTENSIONS: ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'svg'], From bddae4a41774e90011c2b7eeacbd29cb582dd4ff Mon Sep 17 00:00:00 2001 From: Pierre Michel Date: Fri, 26 May 2023 16:43:05 -0600 Subject: [PATCH 30/63] Fix: user could enter a number and a point and save successfully Signed-off-by: Pierre Michel --- src/pages/workspace/reimburse/WorkspaceRateAndUnitPage.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/workspace/reimburse/WorkspaceRateAndUnitPage.js b/src/pages/workspace/reimburse/WorkspaceRateAndUnitPage.js index 31d218f49a4f..eb8c321f2ff3 100644 --- a/src/pages/workspace/reimburse/WorkspaceRateAndUnitPage.js +++ b/src/pages/workspace/reimburse/WorkspaceRateAndUnitPage.js @@ -93,7 +93,7 @@ class WorkspaceRateAndUnitPage extends React.Component { validate(values) { const errors = {}; const decimalSeparator = this.props.toLocaleDigit('.'); - const rateValueRegex = RegExp(String.raw`^\d{1,8}([${getPermittedDecimalSeparator(decimalSeparator)}]\d{0,3})?$`, 'i'); + const rateValueRegex = RegExp(String.raw`^\d{1,8}([${getPermittedDecimalSeparator(decimalSeparator)}]\d{1,3})?$`, 'i'); if (!rateValueRegex.test(values.rate)) { errors.rate = this.props.translate('workspace.reimburse.invalidRateError'); } From 788a02692f60decd905917a5ed46d6bac1307e97 Mon Sep 17 00:00:00 2001 From: Robert Kozik Date: Sun, 28 May 2023 15:21:06 +0200 Subject: [PATCH 31/63] migrate PasswordForm to PressableWithFeedback --- src/pages/signin/PasswordForm.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/pages/signin/PasswordForm.js b/src/pages/signin/PasswordForm.js index 78eaf0e0a0e9..5f488f741f23 100755 --- a/src/pages/signin/PasswordForm.js +++ b/src/pages/signin/PasswordForm.js @@ -1,5 +1,5 @@ import React from 'react'; -import {TouchableOpacity, View} from 'react-native'; +import {View} from 'react-native'; import PropTypes from 'prop-types'; import {withOnyx} from 'react-native-onyx'; import _ from 'underscore'; @@ -23,6 +23,7 @@ import {withNetwork} from '../../components/OnyxProvider'; import networkPropTypes from '../../components/networkPropTypes'; import FormHelpMessage from '../../components/FormHelpMessage'; import Terms from './Terms'; +import PressableWithFeedback from '../../components/Pressable/PressableWithFeedback'; const propTypes = { /* Onyx Props */ @@ -191,12 +192,16 @@ class PasswordForm extends React.Component { hasError={passwordFieldHasError} /> - {this.props.translate('passwordForm.forgot')} - + From a30c3cd1ea7b931ce5de746295c89033ca09d2f8 Mon Sep 17 00:00:00 2001 From: Robert Kozik Date: Sun, 28 May 2023 15:27:58 +0200 Subject: [PATCH 32/63] migrate ChangeExpensifyLoginLink to PressableWithFeedback --- src/pages/signin/ChangeExpensifyLoginLink.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/pages/signin/ChangeExpensifyLoginLink.js b/src/pages/signin/ChangeExpensifyLoginLink.js index 4e033d947710..d43407470545 100755 --- a/src/pages/signin/ChangeExpensifyLoginLink.js +++ b/src/pages/signin/ChangeExpensifyLoginLink.js @@ -1,5 +1,5 @@ import React from 'react'; -import {TouchableOpacity, View} from 'react-native'; +import {View} from 'react-native'; import {withOnyx} from 'react-native-onyx'; import _ from 'underscore'; import PropTypes from 'prop-types'; @@ -8,6 +8,7 @@ import styles from '../../styles/styles'; import ONYXKEYS from '../../ONYXKEYS'; import withLocalize, {withLocalizePropTypes} from '../../components/withLocalize'; import compose from '../../libs/compose'; +import PressableWithFeedback from '../../components/Pressable/PressableWithFeedback'; const propTypes = { /** The credentials of the logged in person */ @@ -31,15 +32,17 @@ const defaultProps = { const ChangeExpensifyLoginLink = (props) => ( {!_.isEmpty(props.credentials.login) && {props.translate('loginForm.notYou', {user: props.formatPhoneNumber(props.credentials.login)})}} - {props.translate('common.goBack')} {'.'} - + ); From f449a749650fd4186c9595e003fe3744a2285330 Mon Sep 17 00:00:00 2001 From: Hans Date: Mon, 29 May 2023 10:02:37 +0700 Subject: [PATCH 33/63] revert podlock --- src/pages/home/report/ReportActionsList.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/pages/home/report/ReportActionsList.js b/src/pages/home/report/ReportActionsList.js index ff5f59c2c007..9fa82e3e1b3e 100644 --- a/src/pages/home/report/ReportActionsList.js +++ b/src/pages/home/report/ReportActionsList.js @@ -115,7 +115,6 @@ const ReportActionsList = (props) => { // When the new indicator should not be displayed we explicitly set it to null const shouldDisplayNewMarker = reportAction.reportActionID === newMarkerReportActionID; const shouldDisplayParentAction = reportAction.actionName === CONST.REPORT.ACTIONS.TYPE.CREATED && ReportUtils.isThread(report); - // check if the second message of the thread is unread, then hide the divider line. const shouldHideThreadDividerLine = shouldDisplayParentAction && sortedReportActions.length > 1 && sortedReportActions[sortedReportActions.length - 2].reportActionID === newMarkerReportActionID; return shouldDisplayParentAction ? ( From c1f3ddd4f2d3e14b08dc5ecc36400d32bffcf149 Mon Sep 17 00:00:00 2001 From: Robert Kozik Date: Mon, 29 May 2023 10:26:23 +0200 Subject: [PATCH 34/63] fix prettier problem in PasswrodForm.js --- src/pages/signin/PasswordForm.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/pages/signin/PasswordForm.js b/src/pages/signin/PasswordForm.js index 5f488f741f23..26ab6eb1423e 100755 --- a/src/pages/signin/PasswordForm.js +++ b/src/pages/signin/PasswordForm.js @@ -198,7 +198,6 @@ class PasswordForm extends React.Component { accessibilityRole="link" accessibilityLabel={this.props.translate('passwordForm.forgot')} hoverDimmingValue={1} - > {this.props.translate('passwordForm.forgot')} From 63915766d0ca4904dd5c1126983b3e3cb001c3a4 Mon Sep 17 00:00:00 2001 From: Robert Kozik Date: Mon, 29 May 2023 10:58:26 +0200 Subject: [PATCH 35/63] fix lint problems in ChangeExpensifyLoginLink.js --- src/pages/signin/ChangeExpensifyLoginLink.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/signin/ChangeExpensifyLoginLink.js b/src/pages/signin/ChangeExpensifyLoginLink.js index d43407470545..7541a2d84543 100755 --- a/src/pages/signin/ChangeExpensifyLoginLink.js +++ b/src/pages/signin/ChangeExpensifyLoginLink.js @@ -35,7 +35,7 @@ const ChangeExpensifyLoginLink = (props) => ( From 6d4eff56566c148512778c01eb3d131d38fc5942 Mon Sep 17 00:00:00 2001 From: Bernhard Owen Josephus Date: Mon, 29 May 2023 19:07:15 +0800 Subject: [PATCH 36/63] don't decode plain text --- src/components/Composer/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/Composer/index.js b/src/components/Composer/index.js index 1e27a1ff186e..836c8352fe9b 100755 --- a/src/components/Composer/index.js +++ b/src/components/Composer/index.js @@ -317,7 +317,7 @@ class Composer extends React.Component { // If HTML has emoji, then treat this as plain text. if (embeddedImages[0].dataset && embeddedImages[0].dataset.stringifyType === 'emoji') { const plainText = event.clipboardData.getData('text/plain'); - this.paste(Str.htmlDecode(plainText)); + this.paste(plainText); return; } fetch(embeddedImages[0].src) @@ -357,7 +357,7 @@ class Composer extends React.Component { const plainText = event.clipboardData.getData('text/plain'); - this.paste(Str.htmlDecode(plainText)); + this.paste(plainText); } /** From ca4082c314fa443100bd1e09b793f10de586f299 Mon Sep 17 00:00:00 2001 From: Bernhard Owen Josephus Date: Mon, 29 May 2023 19:07:43 +0800 Subject: [PATCH 37/63] remove unnecessary pasting logic --- src/components/Composer/index.js | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/src/components/Composer/index.js b/src/components/Composer/index.js index 836c8352fe9b..01ac13c3cb5b 100755 --- a/src/components/Composer/index.js +++ b/src/components/Composer/index.js @@ -142,7 +142,6 @@ class Composer extends React.Component { this.handlePaste = this.handlePaste.bind(this); this.handlePastedHTML = this.handlePastedHTML.bind(this); this.handleWheel = this.handleWheel.bind(this); - this.putSelectionInClipboard = this.putSelectionInClipboard.bind(this); this.shouldCallUpdateNumberOfLines = this.shouldCallUpdateNumberOfLines.bind(this); this.addCursorPositionToSelectionChange = this.addCursorPositionToSelectionChange.bind(this); this.textRef = React.createRef(null); @@ -164,7 +163,6 @@ class Composer extends React.Component { if (this.textInput) { this.textInput.addEventListener('paste', this.handlePaste); this.textInput.addEventListener('wheel', this.handleWheel); - this.textInput.addEventListener('keydown', this.putSelectionInClipboard); } } @@ -374,19 +372,6 @@ class Composer extends React.Component { event.stopPropagation(); } - putSelectionInClipboard(event) { - // If anything happens that isn't cmd+c or cmd+x, ignore the event because it's not a copy command - if (!event.metaKey || (event.key !== 'c' && event.key !== 'x')) { - return; - } - - // The user might have only highlighted a portion of the message to copy, so using the selection will ensure that - // the only stuff put into the clipboard is what the user selected. - const selectedText = event.target.value.substring(this.state.selection.start, this.state.selection.end); - - Clipboard.setHtml(selectedText, selectedText); - } - /** * We want to call updateNumberOfLines only when the parent doesn't provide value in props * as updateNumberOfLines is already being called when value changes in componentDidUpdate From 76a7fcebb94498a2a1e9bc1bb2ac256cb9fa6f3d Mon Sep 17 00:00:00 2001 From: Bernhard Owen Josephus Date: Mon, 29 May 2023 19:28:04 +0800 Subject: [PATCH 38/63] fix lint --- src/components/Composer/index.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/components/Composer/index.js b/src/components/Composer/index.js index 01ac13c3cb5b..eab4abe8a6fe 100755 --- a/src/components/Composer/index.js +++ b/src/components/Composer/index.js @@ -3,7 +3,6 @@ import {StyleSheet, View} from 'react-native'; import PropTypes from 'prop-types'; import _ from 'underscore'; import ExpensiMark from 'expensify-common/lib/ExpensiMark'; -import Str from 'expensify-common/lib/str'; import RNTextInput from '../RNTextInput'; import withLocalize, {withLocalizePropTypes} from '../withLocalize'; import Growl from '../../libs/Growl'; @@ -11,7 +10,6 @@ import themeColors from '../../styles/themes/default'; import updateIsFullComposerAvailable from '../../libs/ComposerUtils/updateIsFullComposerAvailable'; import * as ComposerUtils from '../../libs/ComposerUtils'; import * as Browser from '../../libs/Browser'; -import Clipboard from '../../libs/Clipboard'; import withWindowDimensions, {windowDimensionsPropTypes} from '../withWindowDimensions'; import compose from '../../libs/compose'; import styles from '../../styles/styles'; From efbc8906f9ce20812656e2f4ca33271fcfa75448 Mon Sep 17 00:00:00 2001 From: Konrad Bochnia Date: Mon, 29 May 2023 14:22:21 +0200 Subject: [PATCH 39/63] Migrate EmojiSkinToneList to functional component --- .../EmojiPicker/EmojiSkinToneList.js | 101 +++++++----------- 1 file changed, 40 insertions(+), 61 deletions(-) diff --git a/src/components/EmojiPicker/EmojiSkinToneList.js b/src/components/EmojiPicker/EmojiSkinToneList.js index bfd144b8309f..aa1b7bae0602 100644 --- a/src/components/EmojiPicker/EmojiSkinToneList.js +++ b/src/components/EmojiPicker/EmojiSkinToneList.js @@ -1,5 +1,5 @@ import _ from 'underscore'; -import React, {Component} from 'react'; +import React, {useState, useCallback} from 'react'; import {View, Pressable} from 'react-native'; import PropTypes from 'prop-types'; import styles from '../../styles/styles'; @@ -20,75 +20,54 @@ const propTypes = { ...withLocalizePropTypes, }; -class EmojiSkinToneList extends Component { - constructor(props) { - super(props); +function EmojiSkinToneList(props) { + const [highlightedIndex, setHighlightedIndex] = useState(-1); + const [isSkinToneListVisible, setIsSkinToneListVisible] = useState(false); - this.updateSelectedSkinTone = this.updateSelectedSkinTone.bind(this); - - this.state = { - highlightedIndex: -1, - isSkinToneListVisible: false, - }; - } - - componentDidMount() { - // Get the selected skinToneEmoji based on the index - const selectedEmoji = getSkinToneEmojiFromIndex(this.props.preferredSkinTone); - this.setState({highlightedIndex: selectedEmoji.skinTone}); - } - - componentDidUpdate(prevProps) { - // Update the highlighted skin tone only if the selected one changes - if (prevProps.preferredSkinTone === this.props.preferredSkinTone) { - return; - } - - const selectedEmoji = getSkinToneEmojiFromIndex(this.props.preferredSkinTone); - this.setState({highlightedIndex: selectedEmoji.skinTone}); - } + const toggleIsSkinToneListVisible = useCallback(() => { + setIsSkinToneListVisible((prev) => !prev); + }, []); /** * Pass the skinTone to props and hide the picker * @param {object} skinToneEmoji */ - updateSelectedSkinTone(skinToneEmoji) { - this.setState((prev) => ({isSkinToneListVisible: !prev.isSkinToneListVisible, highlightedIndex: skinToneEmoji.skinTone})); - this.props.updatePreferredSkinTone(skinToneEmoji.skinTone); + function updateSelectedSkinTone(skinToneEmoji) { + toggleIsSkinToneListVisible(); + setHighlightedIndex(skinToneEmoji.skinTone); + props.updatePreferredSkinTone(skinToneEmoji.skinTone); } - render() { - const selectedEmoji = getSkinToneEmojiFromIndex(this.props.preferredSkinTone); - return ( - - {!this.state.isSkinToneListVisible && ( - this.setState((prev) => ({isSkinToneListVisible: !prev.isSkinToneListVisible}))} - style={[styles.flex1, styles.flexRow, styles.alignSelfCenter, styles.justifyContentStart, styles.alignItemsCenter]} - > - - {selectedEmoji.code} - - {this.props.translate('emojiPicker.skinTonePickerLabel')} - - )} - {this.state.isSkinToneListVisible && ( - - {_.map(Emojis.skinTones, (skinToneEmoji) => ( - this.updateSelectedSkinTone(skinToneEmoji)} - onHoverIn={() => this.setState({highlightedIndex: skinToneEmoji.skinTone})} - onHoverOut={() => this.setState({highlightedIndex: selectedEmoji.skinTone})} - key={skinToneEmoji.code} - emoji={skinToneEmoji.code} - isHighlighted={skinToneEmoji.skinTone === this.state.highlightedIndex || skinToneEmoji.skinTone === selectedEmoji.skinTone} - /> - ))} + const currentSkinTone = getSkinToneEmojiFromIndex(props.preferredSkinTone); + return ( + + {!isSkinToneListVisible && ( + + + {currentSkinTone.code} - )} - - ); - } + {props.translate('emojiPicker.skinTonePickerLabel')} + + )} + {isSkinToneListVisible && ( + + {_.map(Emojis.skinTones, (skinToneEmoji) => ( + updateSelectedSkinTone(skinToneEmoji)} + onHoverIn={() => setHighlightedIndex(skinToneEmoji.skinTone)} + onHoverOut={() => setHighlightedIndex(currentSkinTone.skinTone)} + key={skinToneEmoji.code} + emoji={skinToneEmoji.code} + isHighlighted={skinToneEmoji.skinTone === highlightedIndex || skinToneEmoji.skinTone === currentSkinTone.skinTone} + /> + ))} + + )} + + ); } EmojiSkinToneList.propTypes = propTypes; From 65080f186fbc05bfa993857bd46133d18658cf6b Mon Sep 17 00:00:00 2001 From: Konrad Bochnia Date: Mon, 29 May 2023 15:02:42 +0200 Subject: [PATCH 40/63] Use null instead of -1 --- src/components/EmojiPicker/EmojiSkinToneList.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/EmojiPicker/EmojiSkinToneList.js b/src/components/EmojiPicker/EmojiSkinToneList.js index aa1b7bae0602..4ebb0ea2e1f4 100644 --- a/src/components/EmojiPicker/EmojiSkinToneList.js +++ b/src/components/EmojiPicker/EmojiSkinToneList.js @@ -21,7 +21,7 @@ const propTypes = { }; function EmojiSkinToneList(props) { - const [highlightedIndex, setHighlightedIndex] = useState(-1); + const [highlightedIndex, setHighlightedIndex] = useState(null); const [isSkinToneListVisible, setIsSkinToneListVisible] = useState(false); const toggleIsSkinToneListVisible = useCallback(() => { From 52e534b529859d0680ebc5dedb821daf0dcae8dd Mon Sep 17 00:00:00 2001 From: Wojciech Lewicki Date: Mon, 29 May 2023 21:42:58 +0200 Subject: [PATCH 41/63] fix: proper conditions in ReportActionItem --- src/pages/home/report/ReportActionItem.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/home/report/ReportActionItem.js b/src/pages/home/report/ReportActionItem.js index 5b44f3fa0ed6..9126409fe3a1 100644 --- a/src/pages/home/report/ReportActionItem.js +++ b/src/pages/home/report/ReportActionItem.js @@ -451,10 +451,10 @@ export default compose( (prevProps, nextProps) => prevProps.displayAsGroup === nextProps.displayAsGroup && prevProps.draftMessage === nextProps.draftMessage && - prevProps.isMostRecentIOUReportAction !== nextProps.isMostRecentIOUReportAction && + prevProps.isMostRecentIOUReportAction === nextProps.isMostRecentIOUReportAction && prevProps.hasOutstandingIOU === nextProps.hasOutstandingIOU && prevProps.shouldDisplayNewMarker === nextProps.shouldDisplayNewMarker && - !_.isEqual(prevProps.action, nextProps.action) && + _.isEqual(prevProps.action, nextProps.action) && lodashGet(prevProps.report, 'statusNum') === lodashGet(nextProps.report, 'statusNum') && lodashGet(prevProps.report, 'stateNum') === lodashGet(nextProps.report, 'stateNum') && prevProps.translate === nextProps.translate, From a2cc7fa4d73c81da53615ccc87b9764a75b442ca Mon Sep 17 00:00:00 2001 From: dukenv0307 Date: Tue, 30 May 2023 11:12:53 +0700 Subject: [PATCH 42/63] fix: create new function to calculate the height --- src/components/MagicCodeInput.js | 3 ++- src/styles/StyleUtils.js | 10 ++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/components/MagicCodeInput.js b/src/components/MagicCodeInput.js index dbe414e95a14..ce5f7e3a58e8 100644 --- a/src/components/MagicCodeInput.js +++ b/src/components/MagicCodeInput.js @@ -3,6 +3,7 @@ import {StyleSheet, View} from 'react-native'; import PropTypes from 'prop-types'; import _ from 'underscore'; import styles from '../styles/styles'; +import * as StyleUtils from '../styles/StyleUtils'; import * as ValidationUtils from '../libs/ValidationUtils'; import CONST from '../CONST'; import Text from './Text'; @@ -296,7 +297,7 @@ function MagicCodeInput(props) { Date: Tue, 30 May 2023 10:07:21 +0200 Subject: [PATCH 43/63] set the highlightedIndex to null on hover out --- src/components/EmojiPicker/EmojiSkinToneList.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/EmojiPicker/EmojiSkinToneList.js b/src/components/EmojiPicker/EmojiSkinToneList.js index 4ebb0ea2e1f4..a08b6eeb06c6 100644 --- a/src/components/EmojiPicker/EmojiSkinToneList.js +++ b/src/components/EmojiPicker/EmojiSkinToneList.js @@ -58,7 +58,7 @@ function EmojiSkinToneList(props) { updateSelectedSkinTone(skinToneEmoji)} onHoverIn={() => setHighlightedIndex(skinToneEmoji.skinTone)} - onHoverOut={() => setHighlightedIndex(currentSkinTone.skinTone)} + onHoverOut={() => setHighlightedIndex(null)} key={skinToneEmoji.code} emoji={skinToneEmoji.code} isHighlighted={skinToneEmoji.skinTone === highlightedIndex || skinToneEmoji.skinTone === currentSkinTone.skinTone} From a4f6f2a1ced9705d7ed114ebaae2011763f7b6e4 Mon Sep 17 00:00:00 2001 From: dukenv0307 Date: Tue, 30 May 2023 16:31:47 +0700 Subject: [PATCH 44/63] fix: lint --- src/styles/StyleUtils.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/styles/StyleUtils.js b/src/styles/StyleUtils.js index 5b37871a7551..4cd4259bbfb2 100644 --- a/src/styles/StyleUtils.js +++ b/src/styles/StyleUtils.js @@ -77,7 +77,7 @@ function getAvatarSize(size) { * @returns {Object} */ function getHeightOfMagicCodeInput() { - return {height: styles.magicCodeInputContainer.minHeight - styles.textInputContainer.borderBottomWidth} + return {height: styles.magicCodeInputContainer.minHeight - styles.textInputContainer.borderBottomWidth}; } /** @@ -1211,5 +1211,5 @@ export { getGoogleListViewStyle, getMentionStyle, getMentionTextColor, - getHeightOfMagicCodeInput + getHeightOfMagicCodeInput, }; From 9b95c251f1442b3732cc5c8e0008d125779b3710 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arkadiusz=20Chrab=C4=85szczewski?= Date: Tue, 30 May 2023 12:41:23 +0200 Subject: [PATCH 45/63] feat: reassure minimal setup --- .gitignore | 1 + dangerfile.js | 7 + package-lock.json | 2346 ++++++++++++++++++++- package.json | 2 + tests/perf-test/SidebarLinks.perf-test.js | 57 + tests/utils/LHNTestUtils.js | 49 +- 6 files changed, 2439 insertions(+), 23 deletions(-) create mode 100644 dangerfile.js create mode 100644 tests/perf-test/SidebarLinks.perf-test.js diff --git a/.gitignore b/.gitignore index 8265d5fd272b..94c646a04246 100644 --- a/.gitignore +++ b/.gitignore @@ -94,3 +94,4 @@ storybook-static # E2E test reports tests/e2e/results/ +.reassure diff --git a/dangerfile.js b/dangerfile.js new file mode 100644 index 000000000000..1fa05fde711f --- /dev/null +++ b/dangerfile.js @@ -0,0 +1,7 @@ +/* eslint-disable import/no-extraneous-dependencies */ +import path from 'path'; +import {dangerReassure} from 'reassure'; + +dangerReassure({ + inputFilePath: path.join(__dirname, './.reassure/output.md'), +}); diff --git a/package-lock.json b/package-lock.json index bb2cabc26736..47bd638ff7e2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -142,6 +142,7 @@ "concurrently": "^5.3.0", "copy-webpack-plugin": "^6.4.1", "css-loader": "^6.7.2", + "danger": "^11.2.6", "diff-so-fancy": "^1.3.0", "dotenv": "^16.0.3", "electron": "22.3.7", @@ -171,6 +172,7 @@ "react-native-performance-flipper-reporter": "^2.0.0", "react-native-svg-transformer": "^1.0.0", "react-test-renderer": "18.1.0", + "reassure": "^0.9.0", "setimmediate": "^1.0.5", "shellcheck": "^1.1.0", "style-loader": "^2.0.0", @@ -2043,10 +2045,11 @@ } }, "node_modules/@babel/runtime": { - "version": "7.18.9", - "license": "MIT", + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.3.tgz", + "integrity": "sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ==", "dependencies": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.13.11" }, "engines": { "node": ">=6.9.0" @@ -2131,6 +2134,252 @@ "integrity": "sha512-iZf+UWfL+DogJVpd/xMQyP6X6McYd6ArdYoPMiv/zlOTzeXXfQbYxBNJJBF6tThvsjLMbA8tLjkCdm9RWMFCCw==", "dev": true }, + "node_modules/@callstack/reassure-cli": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@callstack/reassure-cli/-/reassure-cli-0.9.0.tgz", + "integrity": "sha512-auoxqyilxkT5mDdEPJqRRY+ZGlrihJjFQpopcFd/15ng76OPVka3L48RMEY2wXkFXLaOOs6enNGb596jYPuEtQ==", + "dev": true, + "dependencies": { + "@callstack/reassure-compare": "0.5.0", + "@callstack/reassure-logger": "0.3.0", + "chalk": "4.1.2", + "simple-git": "^3.16.0", + "yargs": "^17.6.2" + }, + "bin": { + "reassure": "lib/commonjs/bin.js" + } + }, + "node_modules/@callstack/reassure-cli/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@callstack/reassure-cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@callstack/reassure-cli/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@callstack/reassure-cli/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@callstack/reassure-cli/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@callstack/reassure-cli/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@callstack/reassure-cli/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@callstack/reassure-cli/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@callstack/reassure-cli/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@callstack/reassure-cli/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@callstack/reassure-compare": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@callstack/reassure-compare/-/reassure-compare-0.5.0.tgz", + "integrity": "sha512-3sBeJ/+Hxjdb01KVb8LszO1kcJ8TXcrVnerUj+LYn2dkBOohAMqGYaOvCeoWsVEHJ+MIOzmvAGBJQRu69RoJdQ==", + "dev": true, + "dependencies": { + "@callstack/reassure-logger": "0.3.0", + "markdown-builder": "^0.9.0", + "markdown-table": "^2.0.0", + "zod": "^3.20.2" + } + }, + "node_modules/@callstack/reassure-danger": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@callstack/reassure-danger/-/reassure-danger-0.1.1.tgz", + "integrity": "sha512-lfza+qBdvVYtP7WvMTT+LfjBfuYsXZ4RxuBldsL8wJArGeCl3OZwUg+9bTo8v6kk/nY8memk5HxrCwWDSO24UA==", + "dev": true + }, + "node_modules/@callstack/reassure-logger": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@callstack/reassure-logger/-/reassure-logger-0.3.0.tgz", + "integrity": "sha512-JX5o+8qkIbIRL+cQn9XlQYdv9p/3L6J70zZX6NYi9j0VrSS9PZIRfo8ujMdLSqUNV6HZN1ay59RzuncLjVu0aQ==", + "dev": true, + "dependencies": { + "chalk": "4.1.2" + } + }, + "node_modules/@callstack/reassure-logger/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@callstack/reassure-logger/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@callstack/reassure-logger/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@callstack/reassure-logger/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@callstack/reassure-logger/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@callstack/reassure-logger/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@callstack/reassure-measure": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@callstack/reassure-measure/-/reassure-measure-0.5.0.tgz", + "integrity": "sha512-KwlmNYcspBOp7FIw6XOz5O9mnKB4cWCCyM6vG4nFUPHSWQ6yVdRkawVvoPIV5qJ2hw7zCzdtqRrLWQSTF4eKlg==", + "dev": true, + "dependencies": { + "@callstack/reassure-logger": "0.3.0", + "mathjs": "^11.5.0" + }, + "peerDependencies": { + "react": "*" + } + }, "node_modules/@cnakazawa/watch": { "version": "1.0.4", "dev": true, @@ -2571,6 +2820,70 @@ "dev": true, "license": "MIT" }, + "node_modules/@gitbeaker/core": { + "version": "21.7.0", + "resolved": "https://registry.npmjs.org/@gitbeaker/core/-/core-21.7.0.tgz", + "integrity": "sha512-cw72rE7tA27wc6JJe1WqeAj9v/6w0S7XJcEji+bRNjTlUfE1zgfW0Gf1mbGUi7F37SOABGCosQLfg9Qe63aIqA==", + "dev": true, + "dependencies": { + "@gitbeaker/requester-utils": "^21.7.0", + "form-data": "^3.0.0", + "li": "^1.3.0", + "xcase": "^2.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@gitbeaker/node": { + "version": "21.7.0", + "resolved": "https://registry.npmjs.org/@gitbeaker/node/-/node-21.7.0.tgz", + "integrity": "sha512-OdM3VcTKYYqboOsnbiPcO0XimXXpYK4gTjARBZ6BWc+1LQXKmqo+OH6oUbyxOoaFu9hHECafIt3WZU3NM4sZTg==", + "deprecated": "Please use its successor @gitbeaker/rest", + "dev": true, + "dependencies": { + "@gitbeaker/core": "^21.7.0", + "@gitbeaker/requester-utils": "^21.7.0", + "form-data": "^3.0.0", + "got": "^11.1.4", + "xcase": "^2.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@gitbeaker/requester-utils": { + "version": "21.7.0", + "resolved": "https://registry.npmjs.org/@gitbeaker/requester-utils/-/requester-utils-21.7.0.tgz", + "integrity": "sha512-eLTaVXlBnh8Qimj6QuMMA06mu/mLcJm3dy8nqhhn/Vm/D25sPrvpGwmbfFyvzj6QujPqtHvFfsCHtyZddL01qA==", + "dev": true, + "dependencies": { + "form-data": "^3.0.0", + "query-string": "^6.12.1", + "xcase": "^2.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@gitbeaker/requester-utils/node_modules/query-string": { + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.14.1.tgz", + "integrity": "sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw==", + "dev": true, + "dependencies": { + "decode-uri-component": "^0.2.0", + "filter-obj": "^1.1.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@gorhom/portal": { "version": "1.0.14", "license": "MIT", @@ -4230,6 +4543,21 @@ "react-native": "*" } }, + "node_modules/@kwsites/file-exists": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", + "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1" + } + }, + "node_modules/@kwsites/promise-deferred": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", + "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", + "dev": true + }, "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.4", "dev": true, @@ -4585,6 +4913,15 @@ "@octokit/core": ">=4" } }, + "node_modules/@octokit/plugin-request-log": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", + "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", + "dev": true, + "peerDependencies": { + "@octokit/core": ">=3" + } + }, "node_modules/@octokit/plugin-rest-endpoint-methods": { "version": "5.16.2", "dev": true, @@ -4667,6 +5004,101 @@ "@octokit/openapi-types": "^13.1.0" } }, + "node_modules/@octokit/rest": { + "version": "18.12.0", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.12.0.tgz", + "integrity": "sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==", + "dev": true, + "dependencies": { + "@octokit/core": "^3.5.1", + "@octokit/plugin-paginate-rest": "^2.16.8", + "@octokit/plugin-request-log": "^1.0.4", + "@octokit/plugin-rest-endpoint-methods": "^5.12.0" + } + }, + "node_modules/@octokit/rest/node_modules/@octokit/auth-token": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz", + "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==", + "dev": true, + "dependencies": { + "@octokit/types": "^6.0.3" + } + }, + "node_modules/@octokit/rest/node_modules/@octokit/core": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz", + "integrity": "sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==", + "dev": true, + "dependencies": { + "@octokit/auth-token": "^2.4.4", + "@octokit/graphql": "^4.5.8", + "@octokit/request": "^5.6.3", + "@octokit/request-error": "^2.0.5", + "@octokit/types": "^6.0.3", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + } + }, + "node_modules/@octokit/rest/node_modules/@octokit/endpoint": { + "version": "6.0.12", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz", + "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==", + "dev": true, + "dependencies": { + "@octokit/types": "^6.0.3", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + } + }, + "node_modules/@octokit/rest/node_modules/@octokit/graphql": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz", + "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==", + "dev": true, + "dependencies": { + "@octokit/request": "^5.6.0", + "@octokit/types": "^6.0.3", + "universal-user-agent": "^6.0.0" + } + }, + "node_modules/@octokit/rest/node_modules/@octokit/plugin-paginate-rest": { + "version": "2.21.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz", + "integrity": "sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==", + "dev": true, + "dependencies": { + "@octokit/types": "^6.40.0" + }, + "peerDependencies": { + "@octokit/core": ">=2" + } + }, + "node_modules/@octokit/rest/node_modules/@octokit/request": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz", + "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==", + "dev": true, + "dependencies": { + "@octokit/endpoint": "^6.0.1", + "@octokit/request-error": "^2.1.0", + "@octokit/types": "^6.16.1", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.7", + "universal-user-agent": "^6.0.0" + } + }, + "node_modules/@octokit/rest/node_modules/@octokit/request-error": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz", + "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", + "dev": true, + "dependencies": { + "@octokit/types": "^6.0.3", + "deprecation": "^2.0.0", + "once": "^1.4.0" + } + }, "node_modules/@octokit/types": { "version": "6.41.0", "dev": true, @@ -16755,6 +17187,24 @@ "version": "1.0.1", "license": "MIT" }, + "node_modules/async-retry": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.2.3.tgz", + "integrity": "sha512-tfDb02Th6CE6pJUF2gjW5ZVjsgwlucVXOEQMvEX9JgSJMs9gAX+Nz3xRuJBKuUYjTSYORqvDBORdAQ3LU59g7Q==", + "dev": true, + "dependencies": { + "retry": "0.12.0" + } + }, + "node_modules/async-retry/node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, "node_modules/asynckit": { "version": "0.4.0", "dev": true, @@ -18337,6 +18787,12 @@ "node": ">=0.4.0" } }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "dev": true + }, "node_modules/buffer-fill": { "version": "1.0.0", "dev": true, @@ -19378,6 +19834,19 @@ "node": ">=0.10.0" } }, + "node_modules/complex.js": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/complex.js/-/complex.js-2.1.1.tgz", + "integrity": "sha512-8njCHOTtFFLtegk6zQo0kkVX1rngygb/KQI6z1qZxlFI3scluC+LVTCFbrkWjBv4vvLlbQ9t88IPMC6k95VTTg==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, "node_modules/component-emitter": { "version": "1.3.0", "license": "MIT" @@ -20542,6 +21011,92 @@ "dev": true, "license": "BSD-2-Clause" }, + "node_modules/danger": { + "version": "11.2.6", + "resolved": "https://registry.npmjs.org/danger/-/danger-11.2.6.tgz", + "integrity": "sha512-EEeuDmUcxPGJ166q7Zzz1WEiV+e0qbPopaX4sXxds8U5doGMdw/8oOUOVye7JiHIBuss3KvQWt4YHZeD3jSCfw==", + "dev": true, + "dependencies": { + "@gitbeaker/node": "^21.3.0", + "@octokit/rest": "^18.12.0", + "async-retry": "1.2.3", + "chalk": "^2.3.0", + "commander": "^2.18.0", + "core-js": "^3.8.2", + "debug": "^4.1.1", + "fast-json-patch": "^3.0.0-1", + "get-stdin": "^6.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "hyperlinker": "^1.0.0", + "json5": "^2.1.0", + "jsonpointer": "^5.0.0", + "jsonwebtoken": "^9.0.0", + "lodash.find": "^4.6.0", + "lodash.includes": "^4.3.0", + "lodash.isobject": "^3.0.2", + "lodash.keys": "^4.0.8", + "lodash.mapvalues": "^4.6.0", + "lodash.memoize": "^4.1.2", + "memfs-or-file-map-to-github-branch": "^1.2.1", + "micromatch": "^4.0.4", + "node-cleanup": "^2.1.2", + "node-fetch": "^2.6.7", + "override-require": "^1.1.1", + "p-limit": "^2.1.0", + "parse-diff": "^0.7.0", + "parse-git-config": "^2.0.3", + "parse-github-url": "^1.0.2", + "parse-link-header": "^2.0.0", + "pinpoint": "^1.1.0", + "prettyjson": "^1.2.1", + "readline-sync": "^1.4.9", + "regenerator-runtime": "^0.13.9", + "require-from-string": "^2.0.2", + "supports-hyperlinks": "^1.0.1" + }, + "bin": { + "danger": "distribution/commands/danger.js", + "danger-ci": "distribution/commands/danger-ci.js", + "danger-init": "distribution/commands/danger-init.js", + "danger-js": "distribution/commands/danger.js", + "danger-local": "distribution/commands/danger-local.js", + "danger-pr": "distribution/commands/danger-pr.js", + "danger-process": "distribution/commands/danger-process.js", + "danger-reset-status": "distribution/commands/danger-reset-status.js", + "danger-runner": "distribution/commands/danger-runner.js" + }, + "engines": { + "node": ">=14.13.1" + } + }, + "node_modules/danger/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/danger/node_modules/fast-json-patch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz", + "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==", + "dev": true + }, + "node_modules/danger/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/data-urls": { "version": "3.0.2", "dev": true, @@ -21254,6 +21809,15 @@ "stream-shift": "^1.0.0" } }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, "node_modules/ee-first": { "version": "1.1.1", "license": "MIT" @@ -21920,6 +22484,12 @@ "version": "1.0.3", "license": "MIT" }, + "node_modules/escape-latex": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/escape-latex/-/escape-latex-1.2.0.tgz", + "integrity": "sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw==", + "dev": true + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "license": "MIT", @@ -23402,6 +23972,18 @@ "version": "2.0.0", "license": "MIT" }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/expect": { "version": "29.4.1", "license": "MIT", @@ -24512,6 +25094,19 @@ "node": ">= 0.6" } }, + "node_modules/fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, "node_modules/fragment-cache": { "version": "0.2.1", "license": "MIT", @@ -24542,6 +25137,15 @@ "readable-stream": "^2.0.0" } }, + "node_modules/fs-exists-sync": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", + "integrity": "sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/fs-extra": { "version": "9.1.0", "license": "MIT", @@ -24728,6 +25332,41 @@ "node": ">=6" } }, + "node_modules/git-config-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/git-config-path/-/git-config-path-1.0.1.tgz", + "integrity": "sha512-KcJ2dlrrP5DbBnYIZ2nlikALfRhKzNSX0stvv3ImJ+fvC4hXKoV+U+74SV0upg+jlQZbrtQzc0bu6/Zh+7aQbg==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "fs-exists-sync": "^0.1.0", + "homedir-polyfill": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/git-config-path/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/git-config-path/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/github-slugger": { "version": "1.4.0", "dev": true, @@ -25296,6 +25935,18 @@ "react-is": "^16.7.0" } }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/hosted-git-info": { "version": "4.1.0", "dev": true, @@ -25566,6 +26217,299 @@ "node": ">=10.17.0" } }, + "node_modules/husky": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/husky/-/husky-1.3.1.tgz", + "integrity": "sha512-86U6sVVVf4b5NYSZ0yvv88dRgBSSXXmHaiq5pP4KDj5JVzdwKgBjEtUPOm8hcoytezFwbU+7gotXNhpHdystlg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "cosmiconfig": "^5.0.7", + "execa": "^1.0.0", + "find-up": "^3.0.0", + "get-stdin": "^6.0.0", + "is-ci": "^2.0.0", + "pkg-dir": "^3.0.0", + "please-upgrade-node": "^3.1.1", + "read-pkg": "^4.0.1", + "run-node": "^1.0.0", + "slash": "^2.0.0" + }, + "bin": { + "husky-upgrade": "lib/upgrader/bin.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/husky/node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "node_modules/husky/node_modules/cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "dependencies": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/husky/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/husky/node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/husky/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/husky/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/husky/node_modules/import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", + "dev": true, + "dependencies": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/husky/node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/husky/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/husky/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/husky/node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dev": true, + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/husky/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/husky/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/husky/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/husky/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/husky/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/husky/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/husky/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/husky/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/husky/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/husky/node_modules/slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/husky/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/hyperlinker": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hyperlinker/-/hyperlinker-1.0.0.tgz", + "integrity": "sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/hyphenate-style-name": { "version": "1.0.4", "license": "BSD-3-Clause" @@ -25786,6 +26730,12 @@ "version": "2.0.4", "license": "ISC" }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, "node_modules/inline-style-parser": { "version": "0.1.1", "dev": true, @@ -26748,6 +27698,12 @@ "node": ">=8" } }, + "node_modules/javascript-natural-sort": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", + "integrity": "sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==", + "dev": true + }, "node_modules/jest": { "version": "29.4.1", "license": "MIT", @@ -29883,6 +30839,31 @@ "version": "0.0.0", "license": "Public Domain" }, + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", + "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", + "dev": true, + "dependencies": { + "jws": "^3.2.2", + "lodash": "^4.17.21", + "ms": "^2.1.1", + "semver": "^7.3.8" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, "node_modules/jsx-ast-utils": { "version": "3.3.3", "dev": true, @@ -29903,6 +30884,27 @@ "node": ">=8" } }, + "node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dev": true, + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dev": true, + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, "node_modules/keyv": { "version": "4.5.2", "dev": true, @@ -30027,6 +31029,12 @@ "node": ">= 0.8.0" } }, + "node_modules/li": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/li/-/li-1.3.0.tgz", + "integrity": "sha512-z34TU6GlMram52Tss5mt1m//ifRIpKH5Dqm7yUVOdHI+BQCs9qGPHFaCUTIzsWX7edN30aa2WrPwR7IO10FHaw==", + "dev": true + }, "node_modules/lie": { "version": "3.1.1", "license": "MIT", @@ -30138,10 +31146,46 @@ "version": "4.0.8", "license": "MIT" }, + "node_modules/lodash.find": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.find/-/lodash.find-4.6.0.tgz", + "integrity": "sha512-yaRZoAV3Xq28F1iafWN1+a0rflOej93l1DQUejs3SZ41h2O9UJBoS9aueGjPDgAl4B6tPC0NuuchLKaDQQ3Isg==", + "dev": true + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "dev": true + }, "node_modules/lodash.isequal": { "version": "4.5.0", "license": "MIT" }, + "node_modules/lodash.isobject": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz", + "integrity": "sha512-3/Qptq2vr7WeJbB4KHUSKlq8Pl7ASXi3UG6CMbBm8WRtXi8+GHm7mKaU3urfpSEzWe2wCIChs6/sdocUsTKJiA==", + "dev": true + }, + "node_modules/lodash.keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-4.2.0.tgz", + "integrity": "sha512-J79MkJcp7Df5mizHiVNpjoHXLi4HLjh9VLS/M7lQSGoQ+0oQ+lWEigREkqKyizPB1IawvQLLKY8mzEcm1tkyxQ==", + "dev": true + }, + "node_modules/lodash.mapvalues": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", + "integrity": "sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ==", + "dev": true + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, "node_modules/lodash.merge": { "version": "4.6.2", "dev": true, @@ -30596,6 +31640,15 @@ "node": ">=0.10.0" } }, + "node_modules/markdown-builder": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/markdown-builder/-/markdown-builder-0.9.0.tgz", + "integrity": "sha512-UovCyEEzMeKE7l88fbOk9SIJkOG7KXkg+TdudN8rvOtCtBO5uu1X27HSnM7LS/xH+vaShJLGpkBcYYcojWNx/g==", + "dev": true, + "dependencies": { + "husky": "^1.0.0-rc.14" + } + }, "node_modules/markdown-escapes": { "version": "1.0.4", "dev": true, @@ -30605,6 +31658,19 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/markdown-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", + "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", + "dev": true, + "dependencies": { + "repeat-string": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/matcher": { "version": "3.0.0", "dev": true, @@ -30616,6 +31682,29 @@ "node": ">=10" } }, + "node_modules/mathjs": { + "version": "11.8.0", + "resolved": "https://registry.npmjs.org/mathjs/-/mathjs-11.8.0.tgz", + "integrity": "sha512-I7r8HCoqUGyEiHQdeOCF2m2k9N+tcOHO3cZQ3tyJkMMBQMFqMR7dMQEboBMJAiFW2Um3PEItGPwcOc4P6KRqwg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.21.0", + "complex.js": "^2.1.1", + "decimal.js": "^10.4.3", + "escape-latex": "^1.2.0", + "fraction.js": "^4.2.0", + "javascript-natural-sort": "^0.7.1", + "seedrandom": "^3.0.5", + "tiny-emitter": "^2.1.0", + "typed-function": "^4.1.0" + }, + "bin": { + "mathjs": "bin/cli.js" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/md5.js": { "version": "1.3.5", "license": "MIT", @@ -30728,6 +31817,15 @@ "node": ">= 4.0.0" } }, + "node_modules/memfs-or-file-map-to-github-branch": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/memfs-or-file-map-to-github-branch/-/memfs-or-file-map-to-github-branch-1.2.1.tgz", + "integrity": "sha512-I/hQzJ2a/pCGR8fkSQ9l5Yx+FQ4e7X6blNHyWBm2ojeFLT3GVzGkTj7xnyWpdclrr7Nq4dmx3xrvu70m3ypzAQ==", + "dev": true, + "dependencies": { + "@octokit/rest": "^16.43.0 || ^17.11.0 || ^18.12.0" + } + }, "node_modules/memoizerific": { "version": "1.11.3", "dev": true, @@ -32424,6 +33522,12 @@ "license": "MIT", "optional": true }, + "node_modules/node-cleanup": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/node-cleanup/-/node-cleanup-2.1.2.tgz", + "integrity": "sha512-qN8v/s2PAJwGUtr1/hYTpNKlD6Y9rc4p8KSmJXyGdYGZsDGKXrGThikLFP9OCHFeLeEpQzPwiAtdIvBLqm//Hw==", + "dev": true + }, "node_modules/node-dir": { "version": "0.1.17", "license": "MIT", @@ -33163,6 +34267,12 @@ "node": ">=0.10.0" } }, + "node_modules/override-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/override-require/-/override-require-1.1.1.tgz", + "integrity": "sha512-eoJ9YWxFcXbrn2U8FKT6RV+/Kj7fiGAB1VvHzbYKt8xM5ZuKZgCGvnHzDxmreEjcBH28ejg5MiOH4iyY1mQnkg==", + "dev": true + }, "node_modules/p-all": { "version": "2.1.0", "dev": true, @@ -33353,6 +34463,12 @@ "safe-buffer": "^5.1.1" } }, + "node_modules/parse-diff": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/parse-diff/-/parse-diff-0.7.1.tgz", + "integrity": "sha512-1j3l8IKcy4yRK2W4o9EYvJLSzpAVwz4DXqCewYyx2vEwk2gcf3DBPqc8Fj4XV3K33OYJ08A8fWwyu/ykD/HUSg==", + "dev": true + }, "node_modules/parse-entities": { "version": "2.0.0", "dev": true, @@ -33370,6 +34486,32 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/parse-git-config": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/parse-git-config/-/parse-git-config-2.0.3.tgz", + "integrity": "sha512-Js7ueMZOVSZ3tP8C7E3KZiHv6QQl7lnJ+OkbxoaFazzSa2KyEHqApfGbU3XboUgUnq4ZuUmskUpYKTNx01fm5A==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.2", + "git-config-path": "^1.0.1", + "ini": "^1.3.5" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-github-url": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz", + "integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==", + "dev": true, + "bin": { + "parse-github-url": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/parse-json": { "version": "5.2.0", "license": "MIT", @@ -33386,6 +34528,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parse-link-header": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-link-header/-/parse-link-header-2.0.0.tgz", + "integrity": "sha512-xjU87V0VyHZybn2RrCX5TIFGxTVZE6zqqZWMPlIKiSKuWh/X5WZdt+w1Ki1nXB+8L/KtL+nZ4iq+sfI6MrhhMw==", + "dev": true, + "dependencies": { + "xtend": "~4.0.1" + } + }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/parse5": { "version": "6.0.1", "dev": true, @@ -33764,6 +34924,12 @@ "node": ">=0.10.0" } }, + "node_modules/pinpoint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pinpoint/-/pinpoint-1.1.0.tgz", + "integrity": "sha512-+04FTD9x7Cls2rihLlo57QDCcHoLBGn5Dk51SwtFBWkUWLxZaBXyNVpCw1S+atvE7GmnFjeaRZ0WLq3UYuqAdg==", + "dev": true + }, "node_modules/pirates": { "version": "4.0.5", "license": "MIT", @@ -33841,6 +35007,15 @@ "node": ">=6" } }, + "node_modules/please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dev": true, + "dependencies": { + "semver-compare": "^1.0.0" + } + }, "node_modules/plist": { "version": "3.0.6", "license": "MIT", @@ -34137,6 +35312,28 @@ "node": ">= 0.8" } }, + "node_modules/prettyjson": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/prettyjson/-/prettyjson-1.2.5.tgz", + "integrity": "sha512-rksPWtoZb2ZpT5OVgtmy0KHVM+Dca3iVwWY9ifwhcexfjebtgjg3wmrUt9PvJ59XIYBcknQeYHD8IAnVlh9lAw==", + "dev": true, + "dependencies": { + "colors": "1.4.0", + "minimist": "^1.2.0" + }, + "bin": { + "prettyjson": "bin/prettyjson" + } + }, + "node_modules/prettyjson/node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/process": { "version": "0.11.10", "license": "MIT", @@ -36223,6 +37420,26 @@ "resolved": "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz", "integrity": "sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==" }, + "node_modules/readline-sync": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz", + "integrity": "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/reassure": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/reassure/-/reassure-0.9.0.tgz", + "integrity": "sha512-FIf0GPchyPGItsrW5Wwff/NWVrfOcCUuJJSs4Nur6iRdQt8yvmCpcba4UyemdZ1KaFTIW1gKbAV3u2tuA7zmtQ==", + "dev": true, + "dependencies": { + "@callstack/reassure-cli": "0.9.0", + "@callstack/reassure-danger": "0.1.1", + "@callstack/reassure-measure": "0.5.0" + } + }, "node_modules/recast": { "version": "0.20.5", "resolved": "https://registry.npmjs.org/recast/-/recast-0.20.5.tgz", @@ -36282,8 +37499,9 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.13.9", - "license": "MIT" + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "node_modules/regenerator-transform": { "version": "0.15.0", @@ -36822,6 +38040,18 @@ "node": ">=0.12.0" } }, + "node_modules/run-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/run-node/-/run-node-1.0.0.tgz", + "integrity": "sha512-kc120TBlQ3mih1LSzdAJXo4xn/GWS2ec0l3S+syHDXP9uRr0JAT8Qd3mdMuyjqCzeZktgP3try92cEgf9Nks8A==", + "dev": true, + "bin": { + "run-node": "run-node" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "dev": true, @@ -37614,6 +38844,21 @@ "version": "3.0.7", "license": "ISC" }, + "node_modules/simple-git": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.19.0.tgz", + "integrity": "sha512-hyH2p9Ptxjf/xPuL7HfXbpYt9gKhC1yWDh3KYIAYJJePAKV7AEjLN4xhp7lozOdNiaJ9jlVvAbBymVlcS2jRiA==", + "dev": true, + "dependencies": { + "@kwsites/file-exists": "^1.1.1", + "@kwsites/promise-deferred": "^1.1.1", + "debug": "^4.3.4" + }, + "funding": { + "type": "github", + "url": "https://github.com/steveukx/git-js?sponsor=1" + } + }, "node_modules/simple-plist": { "version": "1.3.1", "license": "MIT", @@ -38707,6 +39952,28 @@ "node": ">=4" } }, + "node_modules/supports-hyperlinks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-1.0.1.tgz", + "integrity": "sha512-HHi5kVSefKaJkGYXbDuKbUGRVxqnWGn3J2e39CYcNJEfWciGq2zYtOhXLTlvrOZW1QU7VX67w7fMmWafHX9Pfw==", + "dev": true, + "dependencies": { + "has-flag": "^2.0.0", + "supports-color": "^5.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-hyperlinks/node_modules/has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "license": "MIT", @@ -39527,6 +40794,15 @@ "node": ">= 0.6" } }, + "node_modules/typed-function": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/typed-function/-/typed-function-4.1.0.tgz", + "integrity": "sha512-DGwUl6cioBW5gw2L+6SMupGwH/kZOqivy17E4nsh1JI9fKF87orMmlQx3KISQPmg3sfnOUGlwVkroosvgddrlg==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, "node_modules/typedarray": { "version": "0.0.6", "dev": true, @@ -41500,6 +42776,12 @@ "default-browser-id": "^1.0.4" } }, + "node_modules/xcase": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/xcase/-/xcase-2.0.1.tgz", + "integrity": "sha512-UmFXIPU+9Eg3E9m/728Bii0lAIuoc+6nbrNUKaRPJOFp91ih44qqGlWtxMB6kXFrRD6po+86ksHM5XHCfk6iPw==", + "dev": true + }, "node_modules/xcode": { "version": "3.0.1", "license": "Apache-2.0", @@ -41739,6 +43021,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/zod": { + "version": "3.21.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", + "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, "node_modules/zwitch": { "version": "1.0.5", "dev": true, @@ -42851,9 +44142,11 @@ } }, "@babel/runtime": { - "version": "7.18.9", + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.3.tgz", + "integrity": "sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ==", "requires": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.13.11" } }, "@babel/runtime-corejs3": { @@ -42920,6 +44213,196 @@ "integrity": "sha512-iZf+UWfL+DogJVpd/xMQyP6X6McYd6ArdYoPMiv/zlOTzeXXfQbYxBNJJBF6tThvsjLMbA8tLjkCdm9RWMFCCw==", "dev": true }, + "@callstack/reassure-cli": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@callstack/reassure-cli/-/reassure-cli-0.9.0.tgz", + "integrity": "sha512-auoxqyilxkT5mDdEPJqRRY+ZGlrihJjFQpopcFd/15ng76OPVka3L48RMEY2wXkFXLaOOs6enNGb596jYPuEtQ==", + "dev": true, + "requires": { + "@callstack/reassure-compare": "0.5.0", + "@callstack/reassure-logger": "0.3.0", + "chalk": "4.1.2", + "simple-git": "^3.16.0", + "yargs": "^17.6.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true + } + } + }, + "@callstack/reassure-compare": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@callstack/reassure-compare/-/reassure-compare-0.5.0.tgz", + "integrity": "sha512-3sBeJ/+Hxjdb01KVb8LszO1kcJ8TXcrVnerUj+LYn2dkBOohAMqGYaOvCeoWsVEHJ+MIOzmvAGBJQRu69RoJdQ==", + "dev": true, + "requires": { + "@callstack/reassure-logger": "0.3.0", + "markdown-builder": "^0.9.0", + "markdown-table": "^2.0.0", + "zod": "^3.20.2" + } + }, + "@callstack/reassure-danger": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@callstack/reassure-danger/-/reassure-danger-0.1.1.tgz", + "integrity": "sha512-lfza+qBdvVYtP7WvMTT+LfjBfuYsXZ4RxuBldsL8wJArGeCl3OZwUg+9bTo8v6kk/nY8memk5HxrCwWDSO24UA==", + "dev": true + }, + "@callstack/reassure-logger": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@callstack/reassure-logger/-/reassure-logger-0.3.0.tgz", + "integrity": "sha512-JX5o+8qkIbIRL+cQn9XlQYdv9p/3L6J70zZX6NYi9j0VrSS9PZIRfo8ujMdLSqUNV6HZN1ay59RzuncLjVu0aQ==", + "dev": true, + "requires": { + "chalk": "4.1.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@callstack/reassure-measure": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@callstack/reassure-measure/-/reassure-measure-0.5.0.tgz", + "integrity": "sha512-KwlmNYcspBOp7FIw6XOz5O9mnKB4cWCCyM6vG4nFUPHSWQ6yVdRkawVvoPIV5qJ2hw7zCzdtqRrLWQSTF4eKlg==", + "dev": true, + "requires": { + "@callstack/reassure-logger": "0.3.0", + "mathjs": "^11.5.0" + } + }, "@cnakazawa/watch": { "version": "1.0.4", "dev": true, @@ -43248,6 +44731,56 @@ "version": "1.1.3", "dev": true }, + "@gitbeaker/core": { + "version": "21.7.0", + "resolved": "https://registry.npmjs.org/@gitbeaker/core/-/core-21.7.0.tgz", + "integrity": "sha512-cw72rE7tA27wc6JJe1WqeAj9v/6w0S7XJcEji+bRNjTlUfE1zgfW0Gf1mbGUi7F37SOABGCosQLfg9Qe63aIqA==", + "dev": true, + "requires": { + "@gitbeaker/requester-utils": "^21.7.0", + "form-data": "^3.0.0", + "li": "^1.3.0", + "xcase": "^2.0.1" + } + }, + "@gitbeaker/node": { + "version": "21.7.0", + "resolved": "https://registry.npmjs.org/@gitbeaker/node/-/node-21.7.0.tgz", + "integrity": "sha512-OdM3VcTKYYqboOsnbiPcO0XimXXpYK4gTjARBZ6BWc+1LQXKmqo+OH6oUbyxOoaFu9hHECafIt3WZU3NM4sZTg==", + "dev": true, + "requires": { + "@gitbeaker/core": "^21.7.0", + "@gitbeaker/requester-utils": "^21.7.0", + "form-data": "^3.0.0", + "got": "^11.1.4", + "xcase": "^2.0.1" + } + }, + "@gitbeaker/requester-utils": { + "version": "21.7.0", + "resolved": "https://registry.npmjs.org/@gitbeaker/requester-utils/-/requester-utils-21.7.0.tgz", + "integrity": "sha512-eLTaVXlBnh8Qimj6QuMMA06mu/mLcJm3dy8nqhhn/Vm/D25sPrvpGwmbfFyvzj6QujPqtHvFfsCHtyZddL01qA==", + "dev": true, + "requires": { + "form-data": "^3.0.0", + "query-string": "^6.12.1", + "xcase": "^2.0.1" + }, + "dependencies": { + "query-string": { + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.14.1.tgz", + "integrity": "sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw==", + "dev": true, + "requires": { + "decode-uri-component": "^0.2.0", + "filter-obj": "^1.1.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + } + } + } + }, "@gorhom/portal": { "version": "1.0.14", "requires": { @@ -44339,6 +45872,21 @@ "version": "2.3.1", "requires": {} }, + "@kwsites/file-exists": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", + "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", + "dev": true, + "requires": { + "debug": "^4.1.1" + } + }, + "@kwsites/promise-deferred": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", + "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", + "dev": true + }, "@leichtgewicht/ip-codec": { "version": "2.0.4", "dev": true @@ -44590,6 +46138,13 @@ "@octokit/types": "^6.41.0" } }, + "@octokit/plugin-request-log": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", + "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", + "dev": true, + "requires": {} + }, "@octokit/plugin-rest-endpoint-methods": { "version": "5.16.2", "dev": true, @@ -44653,6 +46208,100 @@ } } }, + "@octokit/rest": { + "version": "18.12.0", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.12.0.tgz", + "integrity": "sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==", + "dev": true, + "requires": { + "@octokit/core": "^3.5.1", + "@octokit/plugin-paginate-rest": "^2.16.8", + "@octokit/plugin-request-log": "^1.0.4", + "@octokit/plugin-rest-endpoint-methods": "^5.12.0" + }, + "dependencies": { + "@octokit/auth-token": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz", + "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==", + "dev": true, + "requires": { + "@octokit/types": "^6.0.3" + } + }, + "@octokit/core": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz", + "integrity": "sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==", + "dev": true, + "requires": { + "@octokit/auth-token": "^2.4.4", + "@octokit/graphql": "^4.5.8", + "@octokit/request": "^5.6.3", + "@octokit/request-error": "^2.0.5", + "@octokit/types": "^6.0.3", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/endpoint": { + "version": "6.0.12", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz", + "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==", + "dev": true, + "requires": { + "@octokit/types": "^6.0.3", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/graphql": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz", + "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==", + "dev": true, + "requires": { + "@octokit/request": "^5.6.0", + "@octokit/types": "^6.0.3", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/plugin-paginate-rest": { + "version": "2.21.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz", + "integrity": "sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==", + "dev": true, + "requires": { + "@octokit/types": "^6.40.0" + } + }, + "@octokit/request": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz", + "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==", + "dev": true, + "requires": { + "@octokit/endpoint": "^6.0.1", + "@octokit/request-error": "^2.1.0", + "@octokit/types": "^6.16.1", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.7", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/request-error": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz", + "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", + "dev": true, + "requires": { + "@octokit/types": "^6.0.3", + "deprecation": "^2.0.0", + "once": "^1.4.0" + } + } + } + }, "@octokit/types": { "version": "6.41.0", "dev": true, @@ -52899,6 +54548,23 @@ "async-limiter": { "version": "1.0.1" }, + "async-retry": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.2.3.tgz", + "integrity": "sha512-tfDb02Th6CE6pJUF2gjW5ZVjsgwlucVXOEQMvEX9JgSJMs9gAX+Nz3xRuJBKuUYjTSYORqvDBORdAQ3LU59g7Q==", + "dev": true, + "requires": { + "retry": "0.12.0" + }, + "dependencies": { + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true + } + } + }, "asynckit": { "version": "0.4.0", "dev": true @@ -53991,6 +55657,12 @@ "version": "1.0.0", "dev": true }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "dev": true + }, "buffer-fill": { "version": "1.0.0", "dev": true @@ -54662,6 +56334,12 @@ "version": "0.1.2", "dev": true }, + "complex.js": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/complex.js/-/complex.js-2.1.1.tgz", + "integrity": "sha512-8njCHOTtFFLtegk6zQo0kkVX1rngygb/KQI6z1qZxlFI3scluC+LVTCFbrkWjBv4vvLlbQ9t88IPMC6k95VTTg==", + "dev": true + }, "component-emitter": { "version": "1.3.0" }, @@ -55443,6 +57121,74 @@ "version": "1.0.8", "dev": true }, + "danger": { + "version": "11.2.6", + "resolved": "https://registry.npmjs.org/danger/-/danger-11.2.6.tgz", + "integrity": "sha512-EEeuDmUcxPGJ166q7Zzz1WEiV+e0qbPopaX4sXxds8U5doGMdw/8oOUOVye7JiHIBuss3KvQWt4YHZeD3jSCfw==", + "dev": true, + "requires": { + "@gitbeaker/node": "^21.3.0", + "@octokit/rest": "^18.12.0", + "async-retry": "1.2.3", + "chalk": "^2.3.0", + "commander": "^2.18.0", + "core-js": "^3.8.2", + "debug": "^4.1.1", + "fast-json-patch": "^3.0.0-1", + "get-stdin": "^6.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "hyperlinker": "^1.0.0", + "json5": "^2.1.0", + "jsonpointer": "^5.0.0", + "jsonwebtoken": "^9.0.0", + "lodash.find": "^4.6.0", + "lodash.includes": "^4.3.0", + "lodash.isobject": "^3.0.2", + "lodash.keys": "^4.0.8", + "lodash.mapvalues": "^4.6.0", + "lodash.memoize": "^4.1.2", + "memfs-or-file-map-to-github-branch": "^1.2.1", + "micromatch": "^4.0.4", + "node-cleanup": "^2.1.2", + "node-fetch": "^2.6.7", + "override-require": "^1.1.1", + "p-limit": "^2.1.0", + "parse-diff": "^0.7.0", + "parse-git-config": "^2.0.3", + "parse-github-url": "^1.0.2", + "parse-link-header": "^2.0.0", + "pinpoint": "^1.1.0", + "prettyjson": "^1.2.1", + "readline-sync": "^1.4.9", + "regenerator-runtime": "^0.13.9", + "require-from-string": "^2.0.2", + "supports-hyperlinks": "^1.0.1" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "fast-json-patch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz", + "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + } + } + }, "data-urls": { "version": "3.0.2", "dev": true, @@ -55917,6 +57663,15 @@ "stream-shift": "^1.0.0" } }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, "ee-first": { "version": "1.1.1" }, @@ -56367,6 +58122,12 @@ "escape-html": { "version": "1.0.3" }, + "escape-latex": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/escape-latex/-/escape-latex-1.2.0.tgz", + "integrity": "sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw==", + "dev": true + }, "escape-string-regexp": { "version": "4.0.0" }, @@ -57326,6 +59087,15 @@ } } }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, "expect": { "version": "29.4.1", "requires": { @@ -58066,6 +59836,12 @@ "version": "0.2.0", "dev": true }, + "fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "dev": true + }, "fragment-cache": { "version": "0.2.1", "requires": { @@ -58086,6 +59862,12 @@ "readable-stream": "^2.0.0" } }, + "fs-exists-sync": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", + "integrity": "sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==", + "dev": true + }, "fs-extra": { "version": "9.1.0", "requires": { @@ -58196,6 +59978,34 @@ "getenv": { "version": "1.0.0" }, + "git-config-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/git-config-path/-/git-config-path-1.0.1.tgz", + "integrity": "sha512-KcJ2dlrrP5DbBnYIZ2nlikALfRhKzNSX0stvv3ImJ+fvC4hXKoV+U+74SV0upg+jlQZbrtQzc0bu6/Zh+7aQbg==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "fs-exists-sync": "^0.1.0", + "homedir-polyfill": "^1.0.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true + } + } + }, "github-slugger": { "version": "1.4.0", "dev": true @@ -58569,6 +60379,15 @@ "react-is": "^16.7.0" } }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, "hosted-git-info": { "version": "4.1.0", "dev": true, @@ -58736,6 +60555,225 @@ "human-signals": { "version": "2.1.0" }, + "husky": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/husky/-/husky-1.3.1.tgz", + "integrity": "sha512-86U6sVVVf4b5NYSZ0yvv88dRgBSSXXmHaiq5pP4KDj5JVzdwKgBjEtUPOm8hcoytezFwbU+7gotXNhpHdystlg==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.7", + "execa": "^1.0.0", + "find-up": "^3.0.0", + "get-stdin": "^6.0.0", + "is-ci": "^2.0.0", + "pkg-dir": "^3.0.0", + "please-upgrade-node": "^3.1.1", + "read-pkg": "^4.0.1", + "run-node": "^1.0.0", + "slash": "^2.0.0" + }, + "dependencies": { + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "hyperlinker": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hyperlinker/-/hyperlinker-1.0.0.tgz", + "integrity": "sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ==", + "dev": true + }, "hyphenate-style-name": { "version": "1.0.4" }, @@ -58857,6 +60895,12 @@ "inherits": { "version": "2.0.4" }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, "inline-style-parser": { "version": "0.1.1", "dev": true @@ -59401,6 +61445,12 @@ } } }, + "javascript-natural-sort": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", + "integrity": "sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==", + "dev": true + }, "jest": { "version": "29.4.1", "requires": { @@ -61480,6 +63530,24 @@ "jsonify": { "version": "0.0.0" }, + "jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "dev": true + }, + "jsonwebtoken": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", + "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", + "dev": true, + "requires": { + "jws": "^3.2.2", + "lodash": "^4.17.21", + "ms": "^2.1.1", + "semver": "^7.3.8" + } + }, "jsx-ast-utils": { "version": "3.3.3", "dev": true, @@ -61492,6 +63560,27 @@ "version": "3.1.0", "dev": true }, + "jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dev": true, + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dev": true, + "requires": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, "keyv": { "version": "4.5.2", "dev": true, @@ -61575,6 +63664,12 @@ "type-check": "~0.4.0" } }, + "li": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/li/-/li-1.3.0.tgz", + "integrity": "sha512-z34TU6GlMram52Tss5mt1m//ifRIpKH5Dqm7yUVOdHI+BQCs9qGPHFaCUTIzsWX7edN30aa2WrPwR7IO10FHaw==", + "dev": true + }, "lie": { "version": "3.1.1", "requires": { @@ -61651,9 +63746,45 @@ "lodash.debounce": { "version": "4.0.8" }, + "lodash.find": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.find/-/lodash.find-4.6.0.tgz", + "integrity": "sha512-yaRZoAV3Xq28F1iafWN1+a0rflOej93l1DQUejs3SZ41h2O9UJBoS9aueGjPDgAl4B6tPC0NuuchLKaDQQ3Isg==", + "dev": true + }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "dev": true + }, "lodash.isequal": { "version": "4.5.0" }, + "lodash.isobject": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz", + "integrity": "sha512-3/Qptq2vr7WeJbB4KHUSKlq8Pl7ASXi3UG6CMbBm8WRtXi8+GHm7mKaU3urfpSEzWe2wCIChs6/sdocUsTKJiA==", + "dev": true + }, + "lodash.keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-4.2.0.tgz", + "integrity": "sha512-J79MkJcp7Df5mizHiVNpjoHXLi4HLjh9VLS/M7lQSGoQ+0oQ+lWEigREkqKyizPB1IawvQLLKY8mzEcm1tkyxQ==", + "dev": true + }, + "lodash.mapvalues": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", + "integrity": "sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ==", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, "lodash.merge": { "version": "4.6.2", "dev": true @@ -61973,10 +64104,28 @@ "object-visit": "^1.0.0" } }, + "markdown-builder": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/markdown-builder/-/markdown-builder-0.9.0.tgz", + "integrity": "sha512-UovCyEEzMeKE7l88fbOk9SIJkOG7KXkg+TdudN8rvOtCtBO5uu1X27HSnM7LS/xH+vaShJLGpkBcYYcojWNx/g==", + "dev": true, + "requires": { + "husky": "^1.0.0-rc.14" + } + }, "markdown-escapes": { "version": "1.0.4", "dev": true }, + "markdown-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", + "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", + "dev": true, + "requires": { + "repeat-string": "^1.0.0" + } + }, "matcher": { "version": "3.0.0", "dev": true, @@ -61984,6 +64133,23 @@ "escape-string-regexp": "^4.0.0" } }, + "mathjs": { + "version": "11.8.0", + "resolved": "https://registry.npmjs.org/mathjs/-/mathjs-11.8.0.tgz", + "integrity": "sha512-I7r8HCoqUGyEiHQdeOCF2m2k9N+tcOHO3cZQ3tyJkMMBQMFqMR7dMQEboBMJAiFW2Um3PEItGPwcOc4P6KRqwg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.21.0", + "complex.js": "^2.1.1", + "decimal.js": "^10.4.3", + "escape-latex": "^1.2.0", + "fraction.js": "^4.2.0", + "javascript-natural-sort": "^0.7.1", + "seedrandom": "^3.0.5", + "tiny-emitter": "^2.1.0", + "typed-function": "^4.1.0" + } + }, "md5.js": { "version": "1.3.5", "requires": { @@ -62056,6 +64222,15 @@ "fs-monkey": "^1.0.3" } }, + "memfs-or-file-map-to-github-branch": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/memfs-or-file-map-to-github-branch/-/memfs-or-file-map-to-github-branch-1.2.1.tgz", + "integrity": "sha512-I/hQzJ2a/pCGR8fkSQ9l5Yx+FQ4e7X6blNHyWBm2ojeFLT3GVzGkTj7xnyWpdclrr7Nq4dmx3xrvu70m3ypzAQ==", + "dev": true, + "requires": { + "@octokit/rest": "^16.43.0 || ^17.11.0 || ^18.12.0" + } + }, "memoizerific": { "version": "1.11.3", "dev": true, @@ -63246,6 +65421,12 @@ "dev": true, "optional": true }, + "node-cleanup": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/node-cleanup/-/node-cleanup-2.1.2.tgz", + "integrity": "sha512-qN8v/s2PAJwGUtr1/hYTpNKlD6Y9rc4p8KSmJXyGdYGZsDGKXrGThikLFP9OCHFeLeEpQzPwiAtdIvBLqm//Hw==", + "dev": true + }, "node-dir": { "version": "0.1.17", "requires": { @@ -63739,6 +65920,12 @@ "os-tmpdir": { "version": "1.0.2" }, + "override-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/override-require/-/override-require-1.1.1.tgz", + "integrity": "sha512-eoJ9YWxFcXbrn2U8FKT6RV+/Kj7fiGAB1VvHzbYKt8xM5ZuKZgCGvnHzDxmreEjcBH28ejg5MiOH4iyY1mQnkg==", + "dev": true + }, "p-all": { "version": "2.1.0", "dev": true, @@ -63857,6 +66044,12 @@ "safe-buffer": "^5.1.1" } }, + "parse-diff": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/parse-diff/-/parse-diff-0.7.1.tgz", + "integrity": "sha512-1j3l8IKcy4yRK2W4o9EYvJLSzpAVwz4DXqCewYyx2vEwk2gcf3DBPqc8Fj4XV3K33OYJ08A8fWwyu/ykD/HUSg==", + "dev": true + }, "parse-entities": { "version": "2.0.0", "dev": true, @@ -63869,6 +66062,23 @@ "is-hexadecimal": "^1.0.0" } }, + "parse-git-config": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/parse-git-config/-/parse-git-config-2.0.3.tgz", + "integrity": "sha512-Js7ueMZOVSZ3tP8C7E3KZiHv6QQl7lnJ+OkbxoaFazzSa2KyEHqApfGbU3XboUgUnq4ZuUmskUpYKTNx01fm5A==", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "git-config-path": "^1.0.1", + "ini": "^1.3.5" + } + }, + "parse-github-url": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz", + "integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==", + "dev": true + }, "parse-json": { "version": "5.2.0", "requires": { @@ -63878,6 +66088,21 @@ "lines-and-columns": "^1.1.6" } }, + "parse-link-header": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-link-header/-/parse-link-header-2.0.0.tgz", + "integrity": "sha512-xjU87V0VyHZybn2RrCX5TIFGxTVZE6zqqZWMPlIKiSKuWh/X5WZdt+w1Ki1nXB+8L/KtL+nZ4iq+sfI6MrhhMw==", + "dev": true, + "requires": { + "xtend": "~4.0.1" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "dev": true + }, "parse5": { "version": "6.0.1", "dev": true @@ -64125,6 +66350,12 @@ "pinkie": "^2.0.0" } }, + "pinpoint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pinpoint/-/pinpoint-1.1.0.tgz", + "integrity": "sha512-+04FTD9x7Cls2rihLlo57QDCcHoLBGn5Dk51SwtFBWkUWLxZaBXyNVpCw1S+atvE7GmnFjeaRZ0WLq3UYuqAdg==", + "dev": true + }, "pirates": { "version": "4.0.5" }, @@ -64173,6 +66404,15 @@ } } }, + "please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dev": true, + "requires": { + "semver-compare": "^1.0.0" + } + }, "plist": { "version": "3.0.6", "requires": { @@ -64364,6 +66604,24 @@ "version": "1.0.3", "dev": true }, + "prettyjson": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/prettyjson/-/prettyjson-1.2.5.tgz", + "integrity": "sha512-rksPWtoZb2ZpT5OVgtmy0KHVM+Dca3iVwWY9ifwhcexfjebtgjg3wmrUt9PvJ59XIYBcknQeYHD8IAnVlh9lAw==", + "dev": true, + "requires": { + "colors": "1.4.0", + "minimist": "^1.2.0" + }, + "dependencies": { + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true + } + } + }, "process": { "version": "0.11.10" }, @@ -65752,6 +68010,23 @@ "resolved": "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz", "integrity": "sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==" }, + "readline-sync": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz", + "integrity": "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==", + "dev": true + }, + "reassure": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/reassure/-/reassure-0.9.0.tgz", + "integrity": "sha512-FIf0GPchyPGItsrW5Wwff/NWVrfOcCUuJJSs4Nur6iRdQt8yvmCpcba4UyemdZ1KaFTIW1gKbAV3u2tuA7zmtQ==", + "dev": true, + "requires": { + "@callstack/reassure-cli": "0.9.0", + "@callstack/reassure-danger": "0.1.1", + "@callstack/reassure-measure": "0.5.0" + } + }, "recast": { "version": "0.20.5", "resolved": "https://registry.npmjs.org/recast/-/recast-0.20.5.tgz", @@ -65794,7 +68069,9 @@ } }, "regenerator-runtime": { - "version": "0.13.9" + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "regenerator-transform": { "version": "0.15.0", @@ -66142,6 +68419,12 @@ "version": "2.4.1", "dev": true }, + "run-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/run-node/-/run-node-1.0.0.tgz", + "integrity": "sha512-kc120TBlQ3mih1LSzdAJXo4xn/GWS2ec0l3S+syHDXP9uRr0JAT8Qd3mdMuyjqCzeZktgP3try92cEgf9Nks8A==", + "dev": true + }, "run-parallel": { "version": "1.2.0", "dev": true, @@ -66697,6 +68980,17 @@ "signal-exit": { "version": "3.0.7" }, + "simple-git": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.19.0.tgz", + "integrity": "sha512-hyH2p9Ptxjf/xPuL7HfXbpYt9gKhC1yWDh3KYIAYJJePAKV7AEjLN4xhp7lozOdNiaJ9jlVvAbBymVlcS2jRiA==", + "dev": true, + "requires": { + "@kwsites/file-exists": "^1.1.1", + "@kwsites/promise-deferred": "^1.1.1", + "debug": "^4.3.4" + } + }, "simple-plist": { "version": "1.3.1", "requires": { @@ -67447,6 +69741,24 @@ "has-flag": "^3.0.0" } }, + "supports-hyperlinks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-1.0.1.tgz", + "integrity": "sha512-HHi5kVSefKaJkGYXbDuKbUGRVxqnWGn3J2e39CYcNJEfWciGq2zYtOhXLTlvrOZW1QU7VX67w7fMmWafHX9Pfw==", + "dev": true, + "requires": { + "has-flag": "^2.0.0", + "supports-color": "^5.0.0" + }, + "dependencies": { + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng==", + "dev": true + } + } + }, "supports-preserve-symlinks-flag": { "version": "1.0.0" }, @@ -67974,6 +70286,12 @@ "mime-types": "~2.1.24" } }, + "typed-function": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/typed-function/-/typed-function-4.1.0.tgz", + "integrity": "sha512-DGwUl6cioBW5gw2L+6SMupGwH/kZOqivy17E4nsh1JI9fKF87orMmlQx3KISQPmg3sfnOUGlwVkroosvgddrlg==", + "dev": true + }, "typedarray": { "version": "0.0.6", "dev": true @@ -69236,6 +71554,12 @@ "default-browser-id": "^1.0.4" } }, + "xcase": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/xcase/-/xcase-2.0.1.tgz", + "integrity": "sha512-UmFXIPU+9Eg3E9m/728Bii0lAIuoc+6nbrNUKaRPJOFp91ih44qqGlWtxMB6kXFrRD6po+86ksHM5XHCfk6iPw==", + "dev": true + }, "xcode": { "version": "3.0.1", "requires": { @@ -69389,6 +71713,12 @@ "yocto-queue": { "version": "0.1.0" }, + "zod": { + "version": "3.21.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", + "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", + "dev": true + }, "zwitch": { "version": "1.0.5", "dev": true diff --git a/package.json b/package.json index 99ebf1408d8e..8a06da2c6d17 100644 --- a/package.json +++ b/package.json @@ -177,6 +177,7 @@ "concurrently": "^5.3.0", "copy-webpack-plugin": "^6.4.1", "css-loader": "^6.7.2", + "danger": "^11.2.6", "diff-so-fancy": "^1.3.0", "dotenv": "^16.0.3", "electron": "22.3.7", @@ -206,6 +207,7 @@ "react-native-performance-flipper-reporter": "^2.0.0", "react-native-svg-transformer": "^1.0.0", "react-test-renderer": "18.1.0", + "reassure": "^0.9.0", "setimmediate": "^1.0.5", "shellcheck": "^1.1.0", "style-loader": "^2.0.0", diff --git a/tests/perf-test/SidebarLinks.perf-test.js b/tests/perf-test/SidebarLinks.perf-test.js new file mode 100644 index 000000000000..eb2a243d1c06 --- /dev/null +++ b/tests/perf-test/SidebarLinks.perf-test.js @@ -0,0 +1,57 @@ +import {measurePerformance} from 'reassure'; +import Onyx from 'react-native-onyx'; +import _ from 'underscore'; +import * as LHNTestUtils from '../utils/LHNTestUtils'; +import CONST from '../../src/CONST'; +import waitForPromisesToResolve from '../utils/waitForPromisesToResolve'; + +jest.mock('../../src/libs/Permissions'); +jest.mock('../../src/components/Icon/Expensicons'); + +const ONYXKEYS = { + PERSONAL_DETAILS: 'personalDetails', + NVP_PRIORITY_MODE: 'nvp_priorityMode', + SESSION: 'session', + BETAS: 'betas', + COLLECTION: { + REPORT: 'report_', + REPORT_ACTIONS: 'reportActions_', + }, + NETWORK: 'network', +}; + +beforeAll(() => + Onyx.init({ + keys: ONYXKEYS, + registerStorageEventListener: () => {}, + }), +); + +// Initialize the network key for OfflineWithFeedback +beforeEach(() => Onyx.merge(ONYXKEYS.NETWORK, {isOffline: false})); + +// Clear out Onyx after each test so that each test starts with a clean slate +afterEach(() => { + Onyx.clear(); +}); + +test('simple Sidebar render with hundred of reports', () => { + const mockReports = Array.from({length: 100}, (__, i) => { + const reportID = i + 1; + const emails = [`email${reportID}@test.com`]; + const reportKey = `${ONYXKEYS.COLLECTION.REPORT}${reportID}`; + const report = LHNTestUtils.getFakeReport(emails, 1, false); + return {[reportKey]: report}; + }); + const mockOnyxReports = _.assign({}, ...mockReports); + + return waitForPromisesToResolve() + .then(() => + Onyx.multiSet({ + [ONYXKEYS.NVP_PRIORITY_MODE]: CONST.PRIORITY_MODE.DEFAULT, + [ONYXKEYS.PERSONAL_DETAILS]: LHNTestUtils.fakePersonalDetails, + ...mockOnyxReports, + }), + ) + .then(() => measurePerformance()); +}); diff --git a/tests/utils/LHNTestUtils.js b/tests/utils/LHNTestUtils.js index eb107d23ce5f..327a08ca3e32 100644 --- a/tests/utils/LHNTestUtils.js +++ b/tests/utils/LHNTestUtils.js @@ -1,4 +1,5 @@ import React from 'react'; +import PropTypes from 'prop-types'; import {render} from '@testing-library/react-native'; import ComposeProviders from '../../src/components/ComposeProviders'; import OnyxProvider from '../../src/components/OnyxProvider'; @@ -168,22 +169,40 @@ function getDefaultRenderedSidebarLinks(reportIDFromRoute = '') { // and there are a lot of render warnings. It needs to be done like this because normally in // our app (App.js) is when the react application is wrapped in the context providers render( + + + , + ); + } + + /** + * @param {String} [reportIDFromRoute] + * @returns {JSX.Element} + */ + function MockedSidebarLinks({reportIDFromRoute}) { + return ( - - {}} - insets={{ - top: 0, - left: 0, - right: 0, - bottom: 0, - }} - isSmallScreenWidth={false} - reportIDFromRoute={reportIDFromRoute} - /> - - , + {}} + insets={{ + top: 0, + left: 0, + right: 0, + bottom: 0, + }} + isSmallScreenWidth={false} + reportIDFromRoute={reportIDFromRoute} + /> + ); } -export {fakePersonalDetails, getDefaultRenderedSidebarLinks, getAdvancedFakeReport, getFakeReport, getFakeReportAction}; +MockedSidebarLinks.propTypes = { + reportIDFromRoute: PropTypes.string, +}; + +MockedSidebarLinks.defaultProps = { + reportIDFromRoute: '', +}; + +export {fakePersonalDetails, getDefaultRenderedSidebarLinks, getAdvancedFakeReport, getFakeReport, getFakeReportAction, MockedSidebarLinks}; From c2f09faf1a47893b6b557aafd910c32dd3a6157f Mon Sep 17 00:00:00 2001 From: Konrad Bochnia Date: Tue, 30 May 2023 12:47:01 +0200 Subject: [PATCH 46/63] Update src/components/EmojiPicker/EmojiSkinToneList.js Co-authored-by: Sobit Neupane <073bct543.sobit@pcampus.edu.np> --- src/components/EmojiPicker/EmojiSkinToneList.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/EmojiPicker/EmojiSkinToneList.js b/src/components/EmojiPicker/EmojiSkinToneList.js index a08b6eeb06c6..b305a7876deb 100644 --- a/src/components/EmojiPicker/EmojiSkinToneList.js +++ b/src/components/EmojiPicker/EmojiSkinToneList.js @@ -71,5 +71,6 @@ function EmojiSkinToneList(props) { } EmojiSkinToneList.propTypes = propTypes; +EmojiSkinToneList.displayName = 'EmojiSkinToneList'; export default withLocalize(EmojiSkinToneList); From 0c6db43350bc3f167b805c54b13e0485ff50a7b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arkadiusz=20Chrab=C4=85szczewski?= Date: Tue, 30 May 2023 12:54:01 +0200 Subject: [PATCH 47/63] fix: prettier issues --- tests/utils/LHNTestUtils.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/tests/utils/LHNTestUtils.js b/tests/utils/LHNTestUtils.js index 327a08ca3e32..e872bc7ba929 100644 --- a/tests/utils/LHNTestUtils.js +++ b/tests/utils/LHNTestUtils.js @@ -170,17 +170,17 @@ function getDefaultRenderedSidebarLinks(reportIDFromRoute = '') { // our app (App.js) is when the react application is wrapped in the context providers render( - - , + + , ); - } +} - /** - * @param {String} [reportIDFromRoute] - * @returns {JSX.Element} - */ - function MockedSidebarLinks({reportIDFromRoute}) { - return ( +/** + * @param {String} [reportIDFromRoute] + * @returns {JSX.Element} + */ +function MockedSidebarLinks({reportIDFromRoute}) { + return ( {}} From d9d22f2b07492febe7088e1d571b9e7409a6f5a3 Mon Sep 17 00:00:00 2001 From: situchan Date: Tue, 30 May 2023 15:05:05 +0100 Subject: [PATCH 48/63] fix crash when open report for anonymous user --- src/libs/ReportUtils.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/libs/ReportUtils.js b/src/libs/ReportUtils.js index 249e862b753d..73908be35d5d 100644 --- a/src/libs/ReportUtils.js +++ b/src/libs/ReportUtils.js @@ -455,6 +455,11 @@ function isAllowedToComment(report) { return true; } + // If user opens public chat room directly from deep link after logout + if (!allPolicies) { + return false; + } + // If we've made it here, commenting on this report is restricted. // If the user is an admin, allow them to post. const policy = allPolicies[`${ONYXKEYS.COLLECTION.POLICY}${report.policyID}`]; From 686abf7494bf83d67a889687cc071e1632268712 Mon Sep 17 00:00:00 2001 From: situchan Date: Tue, 30 May 2023 15:40:19 +0100 Subject: [PATCH 49/63] fix console error on web splash --- src/libs/BootSplash/index.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/libs/BootSplash/index.js b/src/libs/BootSplash/index.js index b9b8692f687c..ff7ab5562b1f 100644 --- a/src/libs/BootSplash/index.js +++ b/src/libs/BootSplash/index.js @@ -9,9 +9,10 @@ function hide() { return document.fonts.ready.then(() => { const splash = document.getElementById('splash'); - splash.style.opacity = 0; + if (splash) splash.style.opacity = 0; return resolveAfter(250).then(() => { + if (!splash || !splash.parentNode) return; splash.parentNode.removeChild(splash); }); }); From 54ca45359319065586136b95aaed55041ba717b1 Mon Sep 17 00:00:00 2001 From: Situ Chandra Shil <108292595+situchan@users.noreply.github.com> Date: Tue, 30 May 2023 09:45:16 -0600 Subject: [PATCH 50/63] update comment Co-authored-by: Vit Horacek <36083550+mountiny@users.noreply.github.com> --- src/libs/ReportUtils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/ReportUtils.js b/src/libs/ReportUtils.js index 73908be35d5d..3de5af38a306 100644 --- a/src/libs/ReportUtils.js +++ b/src/libs/ReportUtils.js @@ -455,7 +455,7 @@ function isAllowedToComment(report) { return true; } - // If user opens public chat room directly from deep link after logout + // If unauthenticated user opens public chat room using deeplink, they do not have policies available and they cannot comment if (!allPolicies) { return false; } From 882c76434f718f1fee6d62df1423e79bdebaba90 Mon Sep 17 00:00:00 2001 From: OSBotify Date: Tue, 30 May 2023 17:14:16 +0000 Subject: [PATCH 51/63] Update version to 1.3.20-3 --- android/app/build.gradle | 4 ++-- ios/NewExpensify/Info.plist | 2 +- ios/NewExpensifyTests/Info.plist | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index b0fa64f57a50..0c8ebf1a9a37 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -106,8 +106,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1001032002 - versionName "1.3.20-2" + versionCode 1001032003 + versionName "1.3.20-3" } splits { diff --git a/ios/NewExpensify/Info.plist b/ios/NewExpensify/Info.plist index a67bdda052dd..47403abe9f5b 100644 --- a/ios/NewExpensify/Info.plist +++ b/ios/NewExpensify/Info.plist @@ -30,7 +30,7 @@ CFBundleVersion - 1.3.20.2 + 1.3.20.3 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/ios/NewExpensifyTests/Info.plist b/ios/NewExpensifyTests/Info.plist index 86d52d04cc68..6514699a9169 100644 --- a/ios/NewExpensifyTests/Info.plist +++ b/ios/NewExpensifyTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 1.3.20.2 + 1.3.20.3 diff --git a/package-lock.json b/package-lock.json index 85c26f0137c9..469011121990 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "new.expensify", - "version": "1.3.20-2", + "version": "1.3.20-3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "new.expensify", - "version": "1.3.20-2", + "version": "1.3.20-3", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index a9140c59591d..c95da84a6c54 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "new.expensify", - "version": "1.3.20-2", + "version": "1.3.20-3", "author": "Expensify, Inc.", "homepage": "https://new.expensify.com", "description": "New Expensify is the next generation of Expensify: a reimagination of payments based atop a foundation of chat.", From aa6fc3ac5fc77d7e7495777bfcbc4ac0c7307cfb Mon Sep 17 00:00:00 2001 From: Carlos Martins Date: Tue, 30 May 2023 11:55:28 -0600 Subject: [PATCH 52/63] rm reportTransactionWrapper --- src/styles/styles.js | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/styles/styles.js b/src/styles/styles.js index 5d7f0952a627..a0faca7e6268 100644 --- a/src/styles/styles.js +++ b/src/styles/styles.js @@ -2079,12 +2079,6 @@ const styles = { textTransform: 'capitalize', }, - reportTransactionWrapper: { - paddingVertical: 8, - display: 'flex', - flexDirection: 'row', - }, - settingsPageBackground: { flexDirection: 'column', width: '100%', From 7ee0b533a3d5a816a53f424e27c318c1c441804a Mon Sep 17 00:00:00 2001 From: situchan Date: Tue, 30 May 2023 19:57:29 +0100 Subject: [PATCH 53/63] fix blank screen appears for a moment when logout --- src/Expensify.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/Expensify.js b/src/Expensify.js index ff61485bc8f2..93167f6290ea 100644 --- a/src/Expensify.js +++ b/src/Expensify.js @@ -92,9 +92,15 @@ function Expensify(props) { const [isNavigationReady, setIsNavigationReady] = useState(false); const [isOnyxMigrated, setIsOnyxMigrated] = useState(false); const [isSplashHidden, setIsSplashHidden] = useState(false); + const [isCheckingPublicRoom, setIsCheckingPublicRoom] = useState(true); + + useEffect(() => { + if (props.isCheckingPublicRoom !== false) return; + setIsCheckingPublicRoom(false); + }, [props.isCheckingPublicRoom]); const isAuthenticated = useMemo(() => Boolean(lodashGet(props.session, 'authToken', null)), [props.session]); - const shouldInit = isNavigationReady && (!isAuthenticated || props.isSidebarLoaded) && !props.isCheckingPublicRoom; + const shouldInit = isNavigationReady && (!isAuthenticated || props.isSidebarLoaded) && !isCheckingPublicRoom; const shouldHideSplash = shouldInit && !isSplashHidden; const initializeClient = () => { @@ -197,7 +203,7 @@ function Expensify(props) { )} - {!props.isCheckingPublicRoom && ( + {!isCheckingPublicRoom && ( Date: Tue, 30 May 2023 14:00:58 -0600 Subject: [PATCH 54/63] update isCheckingPublicRoom condition MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Marco Chávez --- src/Expensify.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Expensify.js b/src/Expensify.js index 93167f6290ea..e21f04674211 100644 --- a/src/Expensify.js +++ b/src/Expensify.js @@ -95,7 +95,7 @@ function Expensify(props) { const [isCheckingPublicRoom, setIsCheckingPublicRoom] = useState(true); useEffect(() => { - if (props.isCheckingPublicRoom !== false) return; + if (props.isCheckingPublicRoom) return; setIsCheckingPublicRoom(false); }, [props.isCheckingPublicRoom]); From 8d2a92a9a20d9522beb1c61b6d73a7ee81daa04d Mon Sep 17 00:00:00 2001 From: situchan Date: Tue, 30 May 2023 21:04:55 +0100 Subject: [PATCH 55/63] rename state isCheckingPublicRoom to hasAttemptedToOpenPublicRoom --- src/Expensify.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Expensify.js b/src/Expensify.js index e21f04674211..e7c830ff2029 100644 --- a/src/Expensify.js +++ b/src/Expensify.js @@ -92,15 +92,15 @@ function Expensify(props) { const [isNavigationReady, setIsNavigationReady] = useState(false); const [isOnyxMigrated, setIsOnyxMigrated] = useState(false); const [isSplashHidden, setIsSplashHidden] = useState(false); - const [isCheckingPublicRoom, setIsCheckingPublicRoom] = useState(true); + const [hasAttemptedToOpenPublicRoom, setAttemptedToOpenPublicRoom] = useState(false); useEffect(() => { if (props.isCheckingPublicRoom) return; - setIsCheckingPublicRoom(false); + setAttemptedToOpenPublicRoom(true); }, [props.isCheckingPublicRoom]); const isAuthenticated = useMemo(() => Boolean(lodashGet(props.session, 'authToken', null)), [props.session]); - const shouldInit = isNavigationReady && (!isAuthenticated || props.isSidebarLoaded) && !isCheckingPublicRoom; + const shouldInit = isNavigationReady && (!isAuthenticated || props.isSidebarLoaded) && hasAttemptedToOpenPublicRoom; const shouldHideSplash = shouldInit && !isSplashHidden; const initializeClient = () => { @@ -203,7 +203,7 @@ function Expensify(props) { )} - {!isCheckingPublicRoom && ( + {hasAttemptedToOpenPublicRoom && ( Date: Tue, 30 May 2023 22:30:39 +0200 Subject: [PATCH 56/63] fix typo in accessibilityRole in ChangeExpensifyLoginLink.js Co-authored-by: Eugene Voloshchak --- src/pages/signin/ChangeExpensifyLoginLink.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/signin/ChangeExpensifyLoginLink.js b/src/pages/signin/ChangeExpensifyLoginLink.js index 7541a2d84543..0ea56a176af2 100755 --- a/src/pages/signin/ChangeExpensifyLoginLink.js +++ b/src/pages/signin/ChangeExpensifyLoginLink.js @@ -35,7 +35,7 @@ const ChangeExpensifyLoginLink = (props) => ( From 2d597e8402a76a51201b86756597db6f38fed5e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Ch=C3=A1vez?= Date: Tue, 30 May 2023 15:49:39 -0600 Subject: [PATCH 57/63] move lastOpenedPublicRoomID logic to main drawer --- .../AppNavigator/MainDrawerNavigator.js | 18 ++++++++++++++++++ src/pages/home/ReportScreen.js | 15 --------------- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/libs/Navigation/AppNavigator/MainDrawerNavigator.js b/src/libs/Navigation/AppNavigator/MainDrawerNavigator.js index 0fb315bffc7b..7b655eb8587a 100644 --- a/src/libs/Navigation/AppNavigator/MainDrawerNavigator.js +++ b/src/libs/Navigation/AppNavigator/MainDrawerNavigator.js @@ -10,6 +10,8 @@ import Permissions from '../../Permissions'; import Timing from '../../actions/Timing'; import CONST from '../../../CONST'; import * as App from '../../actions/App'; +import * as Report from '../../actions/Report'; +import * as Session from '../../actions/Session'; // Screens import ReportScreen from '../../../pages/home/ReportScreen'; @@ -38,6 +40,9 @@ const propTypes = { }), ), + /** The report ID of the last opened public room as anonymous user */ + lastOpenedPublicRoomID: PropTypes.string, + isFirstTimeNewExpensifyUser: PropTypes.bool, route: PropTypes.shape({ @@ -54,6 +59,7 @@ const defaultProps = { betas: [], policies: {}, isFirstTimeNewExpensifyUser: false, + lastOpenedPublicRoomID: null, }; /** @@ -91,6 +97,15 @@ class MainDrawerNavigator extends Component { this.isFromCache = _.size(props.reports) > 0; } + componentDidMount() { + if (!this.props.lastOpenedPublicRoomID || Session.isAnonymousUser()) { + return + } + // Re-open the last opened public room if the user logged in + Report.setLastOpenedPublicRoom(''); + Report.openReport(this.props.lastOpenedPublicRoomID); + } + shouldComponentUpdate(nextProps) { const initialNextParams = getInitialReportScreenParams( nextProps.reports, @@ -172,4 +187,7 @@ export default withOnyx({ isFirstTimeNewExpensifyUser: { key: ONYXKEYS.NVP_IS_FIRST_TIME_NEW_EXPENSIFY_USER, }, + lastOpenedPublicRoomID: { + key: ONYXKEYS.LAST_OPENED_PUBLIC_ROOM_ID, + }, })(MainDrawerNavigator); diff --git a/src/pages/home/ReportScreen.js b/src/pages/home/ReportScreen.js index df114df307f4..7d9c363273ef 100644 --- a/src/pages/home/ReportScreen.js +++ b/src/pages/home/ReportScreen.js @@ -40,7 +40,6 @@ import * as EmojiPickerAction from '../../libs/actions/EmojiPickerAction'; import TaskHeader from '../../components/TaskHeader'; import MoneyRequestHeader from '../../components/MoneyRequestHeader'; import * as ComposerActions from '../../libs/actions/Composer'; -import * as Session from '../../libs/actions/Session'; const propTypes = { /** Navigation route context info provided by react navigation */ @@ -84,9 +83,6 @@ const propTypes = { /** The account manager report ID */ accountManagerReportID: PropTypes.string, - /** The report ID of the last opened public room as anonymous user */ - lastOpenedPublicRoomID: PropTypes.string, - /** All of the personal details for everyone */ personalDetails: PropTypes.objectOf(personalDetailsPropType), @@ -107,7 +103,6 @@ const defaultProps = { policies: {}, accountManagerReportID: null, personalDetails: {}, - lastOpenedPublicRoomID: null, }; /** @@ -198,13 +193,6 @@ class ReportScreen extends React.Component { } fetchReportIfNeeded() { - // Re-open the last opened public room if the user logged in - if (this.props.lastOpenedPublicRoomID && !Session.isAnonymousUser()) { - Report.setLastOpenedPublicRoom(''); - Report.openReport(this.props.lastOpenedPublicRoomID); - return; - } - const reportIDFromPath = getReportID(this.props.route); // Report ID will be empty when the reports collection is empty. @@ -400,9 +388,6 @@ export default compose( withDrawerState, withNetwork(), withOnyx({ - lastOpenedPublicRoomID: { - key: ONYXKEYS.LAST_OPENED_PUBLIC_ROOM_ID, - }, isSidebarLoaded: { key: ONYXKEYS.IS_SIDEBAR_LOADED, }, From 86efdea9ed8ba47932873b50a7c19ad365869305 Mon Sep 17 00:00:00 2001 From: OSBotify Date: Tue, 30 May 2023 22:29:20 +0000 Subject: [PATCH 58/63] Update version to 1.3.20-4 --- android/app/build.gradle | 4 ++-- ios/NewExpensify/Info.plist | 2 +- ios/NewExpensifyTests/Info.plist | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 0c8ebf1a9a37..cc8ff2404013 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -106,8 +106,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1001032003 - versionName "1.3.20-3" + versionCode 1001032004 + versionName "1.3.20-4" } splits { diff --git a/ios/NewExpensify/Info.plist b/ios/NewExpensify/Info.plist index 47403abe9f5b..7799ee211bb9 100644 --- a/ios/NewExpensify/Info.plist +++ b/ios/NewExpensify/Info.plist @@ -30,7 +30,7 @@ CFBundleVersion - 1.3.20.3 + 1.3.20.4 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/ios/NewExpensifyTests/Info.plist b/ios/NewExpensifyTests/Info.plist index 6514699a9169..3d0811c1ba37 100644 --- a/ios/NewExpensifyTests/Info.plist +++ b/ios/NewExpensifyTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 1.3.20.3 + 1.3.20.4 diff --git a/package-lock.json b/package-lock.json index 469011121990..5befb3019c04 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "new.expensify", - "version": "1.3.20-3", + "version": "1.3.20-4", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "new.expensify", - "version": "1.3.20-3", + "version": "1.3.20-4", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index c95da84a6c54..9f46dd43fe9a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "new.expensify", - "version": "1.3.20-3", + "version": "1.3.20-4", "author": "Expensify, Inc.", "homepage": "https://new.expensify.com", "description": "New Expensify is the next generation of Expensify: a reimagination of payments based atop a foundation of chat.", From 7046333f0147d7ee4f747074cd187a879dd1ad3d Mon Sep 17 00:00:00 2001 From: Carlos Martins Date: Tue, 30 May 2023 16:58:24 -0600 Subject: [PATCH 59/63] rm OpenPaymentDetailsPage --- src/libs/actions/Report.js | 46 -------------------------------------- 1 file changed, 46 deletions(-) diff --git a/src/libs/actions/Report.js b/src/libs/actions/Report.js index 4b0ced46fffe..b526a8bf05e1 100644 --- a/src/libs/actions/Report.js +++ b/src/libs/actions/Report.js @@ -582,51 +582,6 @@ function readOldestAction(reportID, reportActionID) { ); } -/** - * Gets the IOUReport and the associated report actions. - * - * @param {String} chatReportID - * @param {Number} iouReportID - */ -function openPaymentDetailsPage(chatReportID, iouReportID) { - API.read( - 'OpenPaymentDetailsPage', - { - reportID: chatReportID, - iouReportID, - }, - { - optimisticData: [ - { - onyxMethod: Onyx.METHOD.MERGE, - key: ONYXKEYS.IOU, - value: { - loading: true, - }, - }, - ], - successData: [ - { - onyxMethod: Onyx.METHOD.MERGE, - key: ONYXKEYS.IOU, - value: { - loading: false, - }, - }, - ], - failureData: [ - { - onyxMethod: Onyx.METHOD.MERGE, - key: ONYXKEYS.IOU, - value: { - loading: false, - }, - }, - ], - }, - ); -} - /** * Gets transactions and data associated with the linked report (expense or IOU report) * @@ -1825,7 +1780,6 @@ export { openReportFromDeepLink, navigateToAndOpenReport, navigateToAndOpenChildReport, - openPaymentDetailsPage, updatePolicyRoomNameAndNavigate, openMoneyRequestsReportPage, clearPolicyRoomNameErrors, From 3df36b8e15faad2c8cea5bb844f7d2cd5adcae40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Ch=C3=A1vez?= Date: Tue, 30 May 2023 17:30:32 -0600 Subject: [PATCH 60/63] fix lint error --- src/libs/Navigation/AppNavigator/MainDrawerNavigator.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/Navigation/AppNavigator/MainDrawerNavigator.js b/src/libs/Navigation/AppNavigator/MainDrawerNavigator.js index 7b655eb8587a..78becd360621 100644 --- a/src/libs/Navigation/AppNavigator/MainDrawerNavigator.js +++ b/src/libs/Navigation/AppNavigator/MainDrawerNavigator.js @@ -99,7 +99,7 @@ class MainDrawerNavigator extends Component { componentDidMount() { if (!this.props.lastOpenedPublicRoomID || Session.isAnonymousUser()) { - return + return; } // Re-open the last opened public room if the user logged in Report.setLastOpenedPublicRoom(''); From b558ab5db18d0e11cd4893b8acd2d284f868f5c2 Mon Sep 17 00:00:00 2001 From: AngelNBazan Date: Tue, 30 May 2023 16:45:20 -0700 Subject: [PATCH 61/63] Fix: Parser Bug in IOU --- src/components/ReportActionItem/IOUPreview.js | 2 +- src/libs/ReportUtils.js | 11 ++++------- src/libs/actions/IOU.js | 12 ++++-------- 3 files changed, 9 insertions(+), 16 deletions(-) diff --git a/src/components/ReportActionItem/IOUPreview.js b/src/components/ReportActionItem/IOUPreview.js index ab706197351a..1f812ba43885 100644 --- a/src/components/ReportActionItem/IOUPreview.js +++ b/src/components/ReportActionItem/IOUPreview.js @@ -141,7 +141,7 @@ const IOUPreview = (props) => { const requestAmount = moneyRequestAction.amount; const requestCurrency = moneyRequestAction.currency; - const requestComment = Str.htmlDecode(moneyRequestAction.comment).trim(); + const requestComment = moneyRequestAction.comment.trim(); const getSettledMessage = () => { switch (lodashGet(props.action, 'originalMessage.paymentType', '')) { diff --git a/src/libs/ReportUtils.js b/src/libs/ReportUtils.js index ee822f700508..b271661c2f03 100644 --- a/src/libs/ReportUtils.js +++ b/src/libs/ReportUtils.js @@ -1269,7 +1269,7 @@ function getIOUReportActionMessage(type, total, comment, currency, paymentType = return [ { - html: getParsedComment(iouMessage), + html: iouMessage, text: iouMessage, isEdited: false, type: CONST.REPORT.MESSAGE.TYPE.COMMENT, @@ -1294,13 +1294,10 @@ function getIOUReportActionMessage(type, total, comment, currency, paymentType = */ function buildOptimisticIOUReportAction(type, amount, currency, comment, participants, transactionID, paymentType = '', iouReportID = '', isSettlingUp = false, isSendMoneyFlow = false) { const IOUReportID = iouReportID || generateReportID(); - const parser = new ExpensiMark(); - const commentText = getParsedComment(comment); - const textForNewComment = parser.htmlToText(commentText); - const textForNewCommentDecoded = Str.htmlDecode(textForNewComment); + const originalMessage = { amount, - comment: textForNewComment, + comment, currency, IOUTransactionID: transactionID, IOUReportID, @@ -1330,7 +1327,7 @@ function buildOptimisticIOUReportAction(type, amount, currency, comment, partici avatar: lodashGet(currentUserPersonalDetails, 'avatar', UserUtils.getDefaultAvatar(currentUserEmail)), isAttachment: false, originalMessage, - message: getIOUReportActionMessage(type, amount, textForNewCommentDecoded, currency, paymentType, isSettlingUp), + message: getIOUReportActionMessage(type, amount, comment, currency, paymentType, isSettlingUp), person: [ { style: 'strong', diff --git a/src/libs/actions/IOU.js b/src/libs/actions/IOU.js index 2f710d5a88a5..26ddd30bceb3 100644 --- a/src/libs/actions/IOU.js +++ b/src/libs/actions/IOU.js @@ -348,14 +348,13 @@ function requestMoney(report, amount, currency, payeeEmail, participant, comment ); // STEP 6: Make the request - const parsedComment = ReportUtils.getParsedComment(comment); API.write( 'RequestMoney', { debtorEmail: payerEmail, amount, currency, - comment: parsedComment, + comment, iouReportID: iouReport.reportID, chatReportID: chatReport.reportID, transactionID: optimisticTransaction.transactionID, @@ -628,7 +627,6 @@ function createSplitsAndOnyxData(participants, currentUserLogin, amount, comment */ function splitBill(participants, currentUserLogin, amount, comment, currency, existingGroupChatReportID = '') { const {groupData, splits, onyxData} = createSplitsAndOnyxData(participants, currentUserLogin, amount, comment, currency, existingGroupChatReportID); - const parsedComment = ReportUtils.getParsedComment(comment); API.write( 'SplitBill', @@ -637,7 +635,7 @@ function splitBill(participants, currentUserLogin, amount, comment, currency, ex amount, splits: JSON.stringify(splits), currency, - comment: parsedComment, + comment, transactionID: groupData.transactionID, reportActionID: groupData.reportActionID, createdReportActionID: groupData.createdReportActionID, @@ -657,7 +655,6 @@ function splitBill(participants, currentUserLogin, amount, comment, currency, ex */ function splitBillAndOpenReport(participants, currentUserLogin, amount, comment, currency) { const {groupData, splits, onyxData} = createSplitsAndOnyxData(participants, currentUserLogin, amount, comment, currency); - const parsedComment = ReportUtils.getParsedComment(comment); API.write( 'SplitBillAndOpenReport', @@ -666,7 +663,7 @@ function splitBillAndOpenReport(participants, currentUserLogin, amount, comment, amount, splits: JSON.stringify(splits), currency, - comment: parsedComment, + comment, transactionID: groupData.transactionID, reportActionID: groupData.reportActionID, createdReportActionID: groupData.createdReportActionID, @@ -825,12 +822,11 @@ function buildPayPalPaymentUrl(amount, submitterPayPalMeAddress, currency) { */ function getSendMoneyParams(report, amount, currency, comment, paymentMethodType, managerEmail, recipient) { const recipientEmail = OptionsListUtils.addSMSDomainIfPhoneNumber(recipient.login); - const parsedComment = ReportUtils.getParsedComment(comment); const newIOUReportDetails = JSON.stringify({ amount, currency, requestorEmail: recipientEmail, - comment: parsedComment, + comment, idempotencyKey: Str.guid(), }); From 4c303639036d00bd69d7b2aae38c44524d7084ed Mon Sep 17 00:00:00 2001 From: AngelNBazan Date: Tue, 30 May 2023 17:13:46 -0700 Subject: [PATCH 62/63] Removed STR --- src/components/ReportActionItem/IOUPreview.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/ReportActionItem/IOUPreview.js b/src/components/ReportActionItem/IOUPreview.js index 1f812ba43885..902c724aa614 100644 --- a/src/components/ReportActionItem/IOUPreview.js +++ b/src/components/ReportActionItem/IOUPreview.js @@ -4,7 +4,6 @@ import PropTypes from 'prop-types'; import {withOnyx} from 'react-native-onyx'; import lodashGet from 'lodash/get'; import _ from 'underscore'; -import Str from 'expensify-common/lib/str'; import compose from '../../libs/compose'; import styles from '../../styles/styles'; import ONYXKEYS from '../../ONYXKEYS'; From 747e67095d4019bd3f1e6a1830a48e611defa178 Mon Sep 17 00:00:00 2001 From: OSBotify Date: Wed, 31 May 2023 02:31:21 +0000 Subject: [PATCH 63/63] Update version to 1.3.20-5 --- android/app/build.gradle | 4 ++-- ios/NewExpensify/Info.plist | 2 +- ios/NewExpensifyTests/Info.plist | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index cc8ff2404013..ddd1d96877bf 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -106,8 +106,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1001032004 - versionName "1.3.20-4" + versionCode 1001032005 + versionName "1.3.20-5" } splits { diff --git a/ios/NewExpensify/Info.plist b/ios/NewExpensify/Info.plist index 7799ee211bb9..5435f66b9b84 100644 --- a/ios/NewExpensify/Info.plist +++ b/ios/NewExpensify/Info.plist @@ -30,7 +30,7 @@ CFBundleVersion - 1.3.20.4 + 1.3.20.5 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/ios/NewExpensifyTests/Info.plist b/ios/NewExpensifyTests/Info.plist index 3d0811c1ba37..572e3a408cc3 100644 --- a/ios/NewExpensifyTests/Info.plist +++ b/ios/NewExpensifyTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 1.3.20.4 + 1.3.20.5 diff --git a/package-lock.json b/package-lock.json index 5befb3019c04..071571b6751d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "new.expensify", - "version": "1.3.20-4", + "version": "1.3.20-5", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "new.expensify", - "version": "1.3.20-4", + "version": "1.3.20-5", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 9f46dd43fe9a..8604cbbf08de 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "new.expensify", - "version": "1.3.20-4", + "version": "1.3.20-5", "author": "Expensify, Inc.", "homepage": "https://new.expensify.com", "description": "New Expensify is the next generation of Expensify: a reimagination of payments based atop a foundation of chat.",