From 6fb66b91cafb483f4739f739816828fcaa01d455 Mon Sep 17 00:00:00 2001 From: dukenv0307 Date: Fri, 1 Dec 2023 13:13:03 +0700 Subject: [PATCH 001/288] go back to correct page in referral page --- src/pages/ReferralDetailsPage.js | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/src/pages/ReferralDetailsPage.js b/src/pages/ReferralDetailsPage.js index 60b5d23b39da..2f773d16a8ff 100644 --- a/src/pages/ReferralDetailsPage.js +++ b/src/pages/ReferralDetailsPage.js @@ -17,7 +17,6 @@ import Navigation from '@libs/Navigation/Navigation'; import useThemeStyles from '@styles/useThemeStyles'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; -import ROUTES from '@src/ROUTES'; const propTypes = { /** Navigation route context info provided by react navigation */ @@ -58,27 +57,13 @@ function ReferralDetailsPage({route, account}) { return `${CONST.REFERRAL_PROGRAM.LINK}/?thanks=${encodeURIComponent(email)}`; } - function getFallbackRoute() { - const fallbackRoutes = { - [CONST.REFERRAL_PROGRAM.CONTENT_TYPES.MONEY_REQUEST]: ROUTES.MONEY_REQUEST_PARTICIPANTS.getRoute(CONST.IOU.TYPE.REQUEST), - [CONST.REFERRAL_PROGRAM.CONTENT_TYPES.SEND_MONEY]: ROUTES.MONEY_REQUEST_PARTICIPANTS.getRoute(CONST.IOU.TYPE.SEND), - [CONST.REFERRAL_PROGRAM.CONTENT_TYPES.START_CHAT]: ROUTES.NEW_CHAT, - [CONST.REFERRAL_PROGRAM.CONTENT_TYPES.REFER_FRIEND]: ROUTES.SEARCH, - }; - - return fallbackRoutes[contentType]; - } - return ( - Navigation.goBack(getFallbackRoute())} - /> + Navigation.goBack(getFallbackRoute())} + onPress={() => Navigation.goBack()} pressOnEnter enterKeyEventListenerPriority={1} /> From 1f22bec902d8e96699377a9d10168752e4f8fc61 Mon Sep 17 00:00:00 2001 From: dukenv0307 Date: Mon, 4 Dec 2023 13:46:19 +0700 Subject: [PATCH 002/288] add fallback route for confirm button --- src/pages/ReferralDetailsPage.js | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/pages/ReferralDetailsPage.js b/src/pages/ReferralDetailsPage.js index 2f773d16a8ff..2b6bc9249bc6 100644 --- a/src/pages/ReferralDetailsPage.js +++ b/src/pages/ReferralDetailsPage.js @@ -1,5 +1,5 @@ import PropTypes from 'prop-types'; -import React from 'react'; +import React, {useMemo} from 'react'; import {View} from 'react-native'; import {withOnyx} from 'react-native-onyx'; import _ from 'underscore'; @@ -17,6 +17,7 @@ import Navigation from '@libs/Navigation/Navigation'; import useThemeStyles from '@styles/useThemeStyles'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; +import ROUTES from '@src/ROUTES'; const propTypes = { /** Navigation route context info provided by react navigation */ @@ -53,6 +54,17 @@ function ReferralDetailsPage({route, account}) { const shouldShowBody2 = isShareCode; const shouldShowClipboard = contentType === CONST.REFERRAL_PROGRAM.CONTENT_TYPES.REFER_FRIEND || isShareCode; + const fallBackRoute = useMemo(() => { + const fallbackRoutes = { + [CONST.REFERRAL_PROGRAM.CONTENT_TYPES.MONEY_REQUEST]: ROUTES.MONEY_REQUEST_PARTICIPANTS.getRoute(CONST.IOU.TYPE.REQUEST), + [CONST.REFERRAL_PROGRAM.CONTENT_TYPES.SEND_MONEY]: ROUTES.MONEY_REQUEST_PARTICIPANTS.getRoute(CONST.IOU.TYPE.SEND), + [CONST.REFERRAL_PROGRAM.CONTENT_TYPES.START_CHAT]: ROUTES.NEW_CHAT, + [CONST.REFERRAL_PROGRAM.CONTENT_TYPES.REFER_FRIEND]: ROUTES.SEARCH, + }; + + return fallbackRoutes[contentType]; + }, [contentType]); + function generateReferralURL(email) { return `${CONST.REFERRAL_PROGRAM.LINK}/?thanks=${encodeURIComponent(email)}`; } @@ -93,7 +105,7 @@ function ReferralDetailsPage({route, account}) { success style={[styles.w100]} text={translate('common.buttonConfirm')} - onPress={() => Navigation.goBack()} + onPress={() => Navigation.goBack(fallBackRoute)} pressOnEnter enterKeyEventListenerPriority={1} /> From 2c2b068bf13be2ebef31382f42e2c830679c8814 Mon Sep 17 00:00:00 2001 From: dukenv0307 Date: Mon, 25 Dec 2023 16:20:11 +0700 Subject: [PATCH 003/288] refactor referral route --- src/ROUTES.ts | 20 ++++++++++++++++ src/SCREENS.ts | 5 ++++ .../OptionsSelector/BaseOptionsSelector.js | 6 +++-- .../AppNavigator/ModalStackNavigators.tsx | 5 ++++ src/libs/Navigation/linkingConfig.ts | 5 ++++ src/pages/NewChatPage.js | 2 ++ src/pages/ReferralDetailsPage.js | 23 +++++++++++++++++-- src/pages/SearchPage.js | 2 ++ src/pages/ShareCodePage.js | 2 +- ...yForRefactorRequestParticipantsSelector.js | 14 +++++++++++ .../step/IOURequestStepParticipants.js | 2 ++ 11 files changed, 81 insertions(+), 5 deletions(-) diff --git a/src/ROUTES.ts b/src/ROUTES.ts index ca1fe9f0e81a..64de8064ba81 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -463,6 +463,26 @@ const ROUTES = { route: 'referral/:contentType', getRoute: (contentType: string) => `referral/${contentType}` as const, }, + REFERRAL_DETAILS_MODAL_REQUEST: { + route: 'create/request/participants/:transactionID/:reportID/referral/:contentType', + getRoute: (transactionID: string, reportID: string, contentType: string) => `create/request/participants/${transactionID}/${reportID}/referral/${contentType}` as const, + }, + REFERRAL_DETAILS_MODAL_START_CHAT: { + route: 'new/referral/:contentType', + getRoute: (contentType: string) => `new/referral/${contentType}` as const, + }, + REFERRAL_DETAILS_MODAL_SEND_MONEY: { + route: 'send/new/participants/referral/:contentType', + getRoute: (contentType: string) => `send/new/participants/referral/${contentType}` as const, + }, + REFERRAL_DETAILS_MODAL_REFER_FRIEND: { + route: 'search/referral/:contentType', + getRoute: (contentType: string) => `search/referral/${contentType}` as const, + }, + REFERRAL_DETAILS_MODAL_SHARE_CODE: { + route: 'settings/shareCode/referral/:contentType', + getRoute: (contentType: string) => `settings/shareCode/referral/${contentType}` as const, + }, // These are some one-off routes that will be removed once they're no longer needed (see GH issues for details) SAASTR: 'saastr', diff --git a/src/SCREENS.ts b/src/SCREENS.ts index 2cd263237866..b8282ce2d8b7 100644 --- a/src/SCREENS.ts +++ b/src/SCREENS.ts @@ -235,6 +235,11 @@ const SCREENS = { REIMBURSEMENT_ACCOUNT: 'ReimbursementAccount', GET_ASSISTANCE: 'GetAssistance', REFERRAL_DETAILS: 'Referral_Details', + REFERRAL_DETAILS_MONEY_REQUEST: 'Referral_Details_Money_Request', + REFERRAL_DETAILS_START_CHAT: 'Referral_Details_Start_Chat', + REFERRAL_DETAILS_SEND_MONEY: 'Referral_Details_Send_Money', + REFERRAL_DETAILS_REFER_FRIEND: 'Referral_Details_Refer_Friend', + REFERRAL_DETAILS_SHARE_CODE: 'Referral_Details_Share_Code', KEYBOARD_SHORTCUTS: 'KeyboardShortcuts', } as const; diff --git a/src/components/OptionsSelector/BaseOptionsSelector.js b/src/components/OptionsSelector/BaseOptionsSelector.js index 3c40b3cf1144..725d55cf5925 100755 --- a/src/components/OptionsSelector/BaseOptionsSelector.js +++ b/src/components/OptionsSelector/BaseOptionsSelector.js @@ -24,7 +24,6 @@ import KeyboardShortcut from '@libs/KeyboardShortcut'; import Navigation from '@libs/Navigation/Navigation'; import setSelection from '@libs/setSelection'; import CONST from '@src/CONST'; -import ROUTES from '@src/ROUTES'; import {defaultProps as optionsSelectorDefaultProps, propTypes as optionsSelectorPropTypes} from './optionsSelectorPropTypes'; const propTypes = { @@ -49,6 +48,9 @@ const propTypes = { /** Referral content type */ referralContentType: PropTypes.string, + /** Referral route */ + referralRoute: PropTypes.string, + ...optionsSelectorPropTypes, ...withLocalizePropTypes, ...withThemeStylesPropTypes, @@ -621,7 +623,7 @@ class BaseOptionsSelector extends Component { { - Navigation.navigate(ROUTES.REFERRAL_DETAILS_MODAL.getRoute(this.props.referralContentType)); + Navigation.navigate(this.props.referralRoute); }} style={[ this.props.themeStyles.p5, diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators.tsx index 256ea6d4eceb..37c751235086 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators.tsx +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators.tsx @@ -277,6 +277,11 @@ const SignInModalStackNavigator = createModalStackNavigator({ [SCREENS.REFERRAL_DETAILS]: () => require('../../../pages/ReferralDetailsPage').default as React.ComponentType, + [SCREENS.REFERRAL_DETAILS_MONEY_REQUEST]: () => require('../../../pages/ReferralDetailsPage').default as React.ComponentType, + [SCREENS.REFERRAL_DETAILS_START_CHAT]: () => require('../../../pages/ReferralDetailsPage').default as React.ComponentType, + [SCREENS.REFERRAL_DETAILS_SEND_MONEY]: () => require('../../../pages/ReferralDetailsPage').default as React.ComponentType, + [SCREENS.REFERRAL_DETAILS_REFER_FRIEND]: () => require('../../../pages/ReferralDetailsPage').default as React.ComponentType, + [SCREENS.REFERRAL_DETAILS_SHARE_CODE]: () => require('../../../pages/ReferralDetailsPage').default as React.ComponentType, }); export { diff --git a/src/libs/Navigation/linkingConfig.ts b/src/libs/Navigation/linkingConfig.ts index 0383455a5946..e5979bb78075 100644 --- a/src/libs/Navigation/linkingConfig.ts +++ b/src/libs/Navigation/linkingConfig.ts @@ -487,6 +487,11 @@ const linkingConfig: LinkingOptions = { [SCREENS.RIGHT_MODAL.REFERRAL]: { screens: { [SCREENS.REFERRAL_DETAILS]: ROUTES.REFERRAL_DETAILS_MODAL.route, + [SCREENS.REFERRAL_DETAILS_MONEY_REQUEST]: ROUTES.REFERRAL_DETAILS_MODAL_REQUEST.route, + [SCREENS.REFERRAL_DETAILS_START_CHAT]: ROUTES.REFERRAL_DETAILS_MODAL_START_CHAT.route, + [SCREENS.REFERRAL_DETAILS_SEND_MONEY]: ROUTES.REFERRAL_DETAILS_MODAL_SEND_MONEY.route, + [SCREENS.REFERRAL_DETAILS_REFER_FRIEND]: ROUTES.REFERRAL_DETAILS_MODAL_REFER_FRIEND.route, + [SCREENS.REFERRAL_DETAILS_SHARE_CODE]: ROUTES.REFERRAL_DETAILS_MODAL_SHARE_CODE.route, }, }, }, diff --git a/src/pages/NewChatPage.js b/src/pages/NewChatPage.js index d7abbab6e93f..60f4d7c1334a 100755 --- a/src/pages/NewChatPage.js +++ b/src/pages/NewChatPage.js @@ -22,6 +22,7 @@ import variables from '@styles/variables'; import * as Report from '@userActions/Report'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; +import ROUTES from '@src/ROUTES'; import personalDetailsPropType from './personalDetailsPropType'; import reportPropTypes from './reportPropTypes'; @@ -253,6 +254,7 @@ function NewChatPage({betas, isGroupChat, personalDetails, reports, translate, i shouldShowConfirmButton shouldShowReferralCTA referralContentType={CONST.REFERRAL_PROGRAM.CONTENT_TYPES.START_CHAT} + referralRoute={ROUTES.REFERRAL_DETAILS_MODAL_START_CHAT.getRoute(CONST.REFERRAL_PROGRAM.CONTENT_TYPES.START_CHAT)} confirmButtonText={selectedOptions.length > 1 ? translate('newChatPage.createGroup') : translate('newChatPage.createChat')} textInputAlert={isOffline ? `${translate('common.youAppearToBeOffline')} ${translate('search.resultsAreLimited')}` : ''} onConfirmSelection={createGroup} diff --git a/src/pages/ReferralDetailsPage.js b/src/pages/ReferralDetailsPage.js index fb02778db72d..49671a59a204 100644 --- a/src/pages/ReferralDetailsPage.js +++ b/src/pages/ReferralDetailsPage.js @@ -1,6 +1,5 @@ import PropTypes from 'prop-types'; -import React, {useMemo, useRef} from 'react'; -import {View} from 'react-native'; +import React, {useRef} from 'react'; import {withOnyx} from 'react-native-onyx'; import _ from 'underscore'; import ContextMenuItem from '@components/ContextMenuItem'; @@ -15,9 +14,11 @@ import useSingleExecution from '@hooks/useSingleExecution'; import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; import Clipboard from '@libs/Clipboard'; +import Navigation from '@libs/Navigation/Navigation'; import * as Link from '@userActions/Link'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; +import ROUTES from '@src/ROUTES'; import SCREENS from '@src/SCREENS'; import * as ReportActionContextMenu from './home/report/ContextMenu/ReportActionContextMenu'; @@ -25,6 +26,10 @@ const propTypes = { /** Navigation route context info provided by react navigation */ route: PropTypes.shape({ params: PropTypes.shape({ + /** The ID of the transaction being configured */ + transactionID: PropTypes.string, + /** The report ID of the IOU */ + reportID: PropTypes.string, /** The type of the content from where CTA was called */ contentType: PropTypes.string, }), @@ -48,6 +53,7 @@ function ReferralDetailsPage({route, account}) { const popoverAnchor = useRef(null); const {isExecuting, singleExecution} = useSingleExecution(); let {contentType} = route.params; + const {transactionID, reportID} = route.params; if (!_.includes(_.values(CONST.REFERRAL_PROGRAM.CONTENT_TYPES), contentType)) { contentType = CONST.REFERRAL_PROGRAM.CONTENT_TYPES.REFER_FRIEND; @@ -59,6 +65,18 @@ function ReferralDetailsPage({route, account}) { const shouldShowClipboard = contentType === CONST.REFERRAL_PROGRAM.CONTENT_TYPES.REFER_FRIEND || isShareCode; const referralLink = `${CONST.REFERRAL_PROGRAM.LINK}/?thanks=${encodeURIComponent(account.primaryLogin)}`; + function getFallbackRoute() { + const fallbackRoutes = { + [CONST.REFERRAL_PROGRAM.CONTENT_TYPES.MONEY_REQUEST]: ROUTES.MONEY_REQUEST_STEP_PARTICIPANTS.getRoute(CONST.IOU.TYPE.REQUEST, transactionID, reportID), + [CONST.REFERRAL_PROGRAM.CONTENT_TYPES.SEND_MONEY]: ROUTES.MONEY_REQUEST_PARTICIPANTS.getRoute(CONST.IOU.TYPE.SEND), + [CONST.REFERRAL_PROGRAM.CONTENT_TYPES.START_CHAT]: ROUTES.NEW_CHAT, + [CONST.REFERRAL_PROGRAM.CONTENT_TYPES.REFER_FRIEND]: ROUTES.SEARCH, + [CONST.REFERRAL_PROGRAM.CONTENT_TYPES.SHARE_CODE]: ROUTES.SETTINGS_SHARE_CODE, + }; + + return fallbackRoutes[contentType]; + } + return ( Navigation.navigate(getFallbackRoute())} > {contentHeader} {contentBody} diff --git a/src/pages/SearchPage.js b/src/pages/SearchPage.js index 061f43e73de8..da04fe70fba6 100755 --- a/src/pages/SearchPage.js +++ b/src/pages/SearchPage.js @@ -16,6 +16,7 @@ import * as Report from '@userActions/Report'; import Timing from '@userActions/Timing'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; +import ROUTES from '@src/ROUTES'; import personalDetailsPropType from './personalDetailsPropType'; import reportPropTypes from './reportPropTypes'; @@ -181,6 +182,7 @@ function SearchPage({betas, personalDetails, reports, isSearchingForReports}) { textInputLabel={translate('optionsSelector.nameEmailOrPhoneNumber')} shouldShowReferralCTA referralContentType={CONST.REFERRAL_PROGRAM.CONTENT_TYPES.REFER_FRIEND} + referralRoute={ROUTES.REFERRAL_DETAILS_MODAL_REFER_FRIEND.getRoute(CONST.REFERRAL_PROGRAM.CONTENT_TYPES.REFER_FRIEND)} textInputAlert={isOffline ? `${translate('common.youAppearToBeOffline')} ${translate('search.resultsAreLimited')}` : ''} onLayout={searchRendered} safeAreaPaddingBottomStyle={safeAreaPaddingBottomStyle} diff --git a/src/pages/ShareCodePage.js b/src/pages/ShareCodePage.js index 1f062a42f8bf..65c952016b5a 100644 --- a/src/pages/ShareCodePage.js +++ b/src/pages/ShareCodePage.js @@ -121,7 +121,7 @@ class ShareCodePage extends React.Component { Navigation.navigate(ROUTES.REFERRAL_DETAILS_MODAL.getRoute(CONST.REFERRAL_PROGRAM.CONTENT_TYPES.SHARE_CODE))} + onPress={() => Navigation.navigate(ROUTES.REFERRAL_DETAILS_MODAL_SHARE_CODE.getRoute(CONST.REFERRAL_PROGRAM.CONTENT_TYPES.SHARE_CODE))} /> diff --git a/src/pages/iou/request/MoneyTemporaryForRefactorRequestParticipantsSelector.js b/src/pages/iou/request/MoneyTemporaryForRefactorRequestParticipantsSelector.js index 4db9c4ce3fb7..c8d94d247278 100644 --- a/src/pages/iou/request/MoneyTemporaryForRefactorRequestParticipantsSelector.js +++ b/src/pages/iou/request/MoneyTemporaryForRefactorRequestParticipantsSelector.js @@ -20,6 +20,7 @@ import personalDetailsPropType from '@pages/personalDetailsPropType'; import reportPropTypes from '@pages/reportPropTypes'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; +import ROUTES from '@src/ROUTES'; const propTypes = { /** Beta features list */ @@ -63,6 +64,12 @@ const propTypes = { /** Whether we are searching for reports in the server */ isSearchingForReports: PropTypes.bool, + /** The report ID of the IOU */ + reportID: PropTypes.string.isRequired, + + /** The ID of the transaction being configured */ + transactionID: PropTypes.string.isRequired, + ...withLocalizePropTypes, }; @@ -89,6 +96,8 @@ function MoneyTemporaryForRefactorRequestParticipantsSelector({ iouType, iouRequestType, isSearchingForReports, + reportID, + transactionID, }) { const styles = useThemeStyles(); const [searchTerm, setSearchTerm] = useState(''); @@ -321,6 +330,11 @@ function MoneyTemporaryForRefactorRequestParticipantsSelector({ shouldShowOptions={isOptionsDataReady} shouldShowReferralCTA referralContentType={iouType === 'send' ? CONST.REFERRAL_PROGRAM.CONTENT_TYPES.SEND_MONEY : CONST.REFERRAL_PROGRAM.CONTENT_TYPES.MONEY_REQUEST} + referralRoute={ + iouType === 'send' + ? ROUTES.REFERRAL_DETAILS_MODAL_SEND_MONEY.getRoute(CONST.REFERRAL_PROGRAM.CONTENT_TYPES.SEND_MONEY) + : ROUTES.REFERRAL_DETAILS_MODAL_REQUEST.getRoute(transactionID, reportID, CONST.REFERRAL_PROGRAM.CONTENT_TYPES.MONEY_REQUEST) + } shouldPreventDefaultFocusOnSelectRow={!Browser.isMobile()} shouldDelayFocus footerContent={isAllowedToSplit && footerContent} diff --git a/src/pages/iou/request/step/IOURequestStepParticipants.js b/src/pages/iou/request/step/IOURequestStepParticipants.js index ec670b828146..4bb676cab7af 100644 --- a/src/pages/iou/request/step/IOURequestStepParticipants.js +++ b/src/pages/iou/request/step/IOURequestStepParticipants.js @@ -95,6 +95,8 @@ function IOURequestStepParticipants({ onParticipantsAdded={addParticipant} onFinish={goToNextStep} iouType={iouType} + reportID={reportID} + transactionID={transactionID} iouRequestType={iouRequestType} /> From eb332d633e2af1d0d83a5cde92ae9c4c1f343f20 Mon Sep 17 00:00:00 2001 From: Bartosz Grajdek Date: Wed, 3 Jan 2024 20:05:50 +0100 Subject: [PATCH 004/288] feat: add hold implementation --- assets/images/stopwatch.svg | 3 + src/ROUTES.ts | 4 + src/SCREENS.ts | 1 + src/components/Header.tsx | 9 +- src/components/HoldBanner.tsx | 22 +++ src/components/Icon/Expensicons.ts | 2 + src/components/MoneyRequestHeader.js | 29 +++- src/components/TextPill.tsx | 22 +++ src/languages/en.ts | 13 ++ src/languages/es.ts | 13 ++ .../AppNavigator/ModalStackNavigators.tsx | 1 + src/libs/Navigation/linkingConfig.ts | 1 + src/libs/ReportUtils.ts | 135 +++++++++++++++++- src/libs/TransactionUtils.ts | 8 ++ src/libs/actions/IOU.js | 109 ++++++++++++++ src/pages/iou/HoldReasonPage.js | 104 ++++++++++++++ src/types/onyx/Transaction.ts | 1 + 17 files changed, 472 insertions(+), 5 deletions(-) create mode 100644 assets/images/stopwatch.svg create mode 100644 src/components/HoldBanner.tsx create mode 100644 src/components/TextPill.tsx create mode 100644 src/pages/iou/HoldReasonPage.js diff --git a/assets/images/stopwatch.svg b/assets/images/stopwatch.svg new file mode 100644 index 000000000000..d27d6b0b7c36 --- /dev/null +++ b/assets/images/stopwatch.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ROUTES.ts b/src/ROUTES.ts index 49067d1c7b8f..27346d2ca690 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -278,6 +278,10 @@ const ROUTES = { route: ':iouType/new/category/:reportID?', getRoute: (iouType: string, reportID = '') => `${iouType}/new/category/${reportID}` as const, }, + MONEY_REQUEST_HOLD_REASON: { + route: ':iouType/edit/reason/:transactionID?', + getRoute: (iouType: string, transactionID: string, reportID: string, backTo: string) => `${iouType}/edit/reason/${transactionID}?backTo=${backTo}&reportID=${reportID}` as const, + }, MONEY_REQUEST_TAG: { route: ':iouType/new/tag/:reportID?', getRoute: (iouType: string, reportID = '') => `${iouType}/new/tag/${reportID}` as const, diff --git a/src/SCREENS.ts b/src/SCREENS.ts index 26a23e7efadc..d945c752a4cc 100644 --- a/src/SCREENS.ts +++ b/src/SCREENS.ts @@ -119,6 +119,7 @@ const SCREENS = { SCAN_TAB: 'scan', DISTANCE_TAB: 'distance', CREATE: 'Money_Request_Create', + HOLD: 'Money_Request_Hold_Reason', STEP_CONFIRMATION: 'Money_Request_Step_Confirmation', START: 'Money_Request_Start', STEP_AMOUNT: 'Money_Request_Step_Amount', diff --git a/src/components/Header.tsx b/src/components/Header.tsx index 4eac2c7a6994..8d21659e8fab 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -1,5 +1,5 @@ import React, {ReactNode} from 'react'; -import {StyleProp, TextStyle, View} from 'react-native'; +import {StyleProp, TextStyle, View, ViewStyle} from 'react-native'; import useThemeStyles from '@hooks/useThemeStyles'; import EnvironmentBadge from './EnvironmentBadge'; import Text from './Text'; @@ -16,12 +16,15 @@ type HeaderProps = { /** Additional text styles */ textStyles?: StyleProp; + + /** Additional text styles */ + containerStyles?: StyleProp; }; -function Header({title = '', subtitle = '', textStyles = [], shouldShowEnvironmentBadge = false}: HeaderProps) { +function Header({title = '', subtitle = '', textStyles = [], containerStyles = [], shouldShowEnvironmentBadge = false}: HeaderProps) { const styles = useThemeStyles(); return ( - + {typeof title === 'string' ? Boolean(title) && ( diff --git a/src/components/HoldBanner.tsx b/src/components/HoldBanner.tsx new file mode 100644 index 000000000000..af77d9076629 --- /dev/null +++ b/src/components/HoldBanner.tsx @@ -0,0 +1,22 @@ +import React from 'react'; +import {View} from 'react-native'; +import useLocalize from '@hooks/useLocalize'; +import useThemeStyles from '@hooks/useThemeStyles'; +import Text from './Text'; +import TextPill from './TextPill'; + +function HoldBanner() { + const styles = useThemeStyles(); + const {translate} = useLocalize(); + + return ( + + {translate('iou.hold')} + {translate('iou.requestOnHold')} + + ); +} + +HoldBanner.displayName = 'HoldBanner'; + +export default HoldBanner; diff --git a/src/components/Icon/Expensicons.ts b/src/components/Icon/Expensicons.ts index 2ddee8b2939b..d11998ad1111 100644 --- a/src/components/Icon/Expensicons.ts +++ b/src/components/Icon/Expensicons.ts @@ -115,6 +115,7 @@ import Linkedin from '@assets/images/social-linkedin.svg'; import Podcast from '@assets/images/social-podcast.svg'; import Twitter from '@assets/images/social-twitter.svg'; import Youtube from '@assets/images/social-youtube.svg'; +import Stopwatch from '@assets/images/stopwatch.svg'; import Sync from '@assets/images/sync.svg'; import Task from '@assets/images/task.svg'; import ThreeDots from '@assets/images/three-dots.svg'; @@ -243,6 +244,7 @@ export { RotateLeft, Send, Shield, + Stopwatch, Sync, Task, ThumbsUp, diff --git a/src/components/MoneyRequestHeader.js b/src/components/MoneyRequestHeader.js index 488630dd0590..a29c43ab4eaa 100644 --- a/src/components/MoneyRequestHeader.js +++ b/src/components/MoneyRequestHeader.js @@ -20,6 +20,7 @@ import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; import ConfirmModal from './ConfirmModal'; import HeaderWithBackButton from './HeaderWithBackButton'; +import HoldBanner from './HoldBanner'; import * as Expensicons from './Icon/Expensicons'; import MoneyRequestHeaderStatusBar from './MoneyRequestHeaderStatusBar'; import participantPropTypes from './participantPropTypes'; @@ -72,10 +73,12 @@ function MoneyRequestHeader({session, parentReport, report, parentReportAction, const moneyRequestReport = parentReport; const isSettled = ReportUtils.isSettled(moneyRequestReport.reportID); const isApproved = ReportUtils.isReportApproved(moneyRequestReport); + const isOnHold = TransactionUtils.isOnHold(transaction); const {isSmallScreenWidth, windowWidth} = useWindowDimensions(); // Only the requestor can take delete the request, admins can only edit it. const isActionOwner = lodashGet(parentReportAction, 'actorAccountID') === lodashGet(session, 'accountID', null); + const isPolicyAdmin = lodashGet(policy, 'role') === CONST.POLICY.ROLE.ADMIN; const deleteTransaction = useCallback(() => { IOU.deleteMoneyRequest(lodashGet(parentReportAction, 'originalMessage.IOUTransactionID'), parentReportAction, true); @@ -87,6 +90,22 @@ function MoneyRequestHeader({session, parentReport, report, parentReportAction, const canModifyRequest = isActionOwner && !isSettled && !isApproved && !ReportActionsUtils.isDeletedAction(parentReportAction); + const changeMoneyRequestStatus = () => { + if (!isOnHold) { + const activeRoute = encodeURIComponent(Navigation.getActiveRouteWithoutParams()); + Navigation.navigate( + ROUTES.MONEY_REQUEST_HOLD_REASON.getRoute( + lodashGet(policy, 'type'), + lodashGet(parentReportAction, 'originalMessage.IOUTransactionID'), + lodashGet(report, 'reportID'), + activeRoute, + ), + ); + } else { + IOU.unholdRequest(lodashGet(parentReportAction, 'originalMessage.IOUTransactionID'), lodashGet(report, 'reportID')); + } + }; + useEffect(() => { if (canModifyRequest) { return; @@ -95,6 +114,13 @@ function MoneyRequestHeader({session, parentReport, report, parentReportAction, setIsDeleteModalVisible(false); }, [canModifyRequest]); const threeDotsMenuItems = [HeaderUtils.getPinMenuItem(report)]; + if ((isPolicyAdmin || isActionOwner) && !isSettled && !isApproved && !ReportActionsUtils.isDeletedAction(parentReportAction)) { + threeDotsMenuItems.push({ + icon: Expensicons.Stopwatch, + text: !isOnHold ? translate('iou.holdRequest') : translate('iou.unholdRequest'), + onSelected: () => changeMoneyRequestStatus(), + }); + } if (canModifyRequest) { if (!TransactionUtils.hasReceipt(transaction)) { threeDotsMenuItems.push({ @@ -114,7 +140,7 @@ function MoneyRequestHeader({session, parentReport, report, parentReportAction, <> )} + {isOnHold && } {children}; +} + +TextPill.displayName = 'TextPill'; + +export default TextPill; diff --git a/src/languages/en.ts b/src/languages/en.ts index e223dd0a9aaf..13f31392aa05 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -627,6 +627,19 @@ export default { }, waitingOnEnabledWallet: ({submitterDisplayName}: WaitingOnBankAccountParams) => `Started settling up, payment is held until ${submitterDisplayName} enables their Wallet`, enableWallet: 'Enable Wallet', + hold: 'Hold', + holdRequest: 'Hold Request', + unholdRequest: 'Unhold Request', + explainHold: "Explain why you're holding this request.", + reason: 'Reason', + holdReasonRequired: 'A reason is required when holding.', + requestOnHold: 'This request was put on hold. Review the comments for next steps.', + confirmApprove: 'Confirm what to approve', + confirmApprovalAmount: 'Approve the entire report total or only the amount not on hold.', + confirmPay: 'Confirm what to pay', + confirmPayAmount: 'Pay all out-of-pocket spend or only the amount not on hold.', + payOnly: 'Pay only', + approveOnly: 'Approve only', set: 'set', changed: 'changed', removed: 'removed', diff --git a/src/languages/es.ts b/src/languages/es.ts index 42743f43a098..f04973010145 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -622,6 +622,19 @@ export default { }, waitingOnEnabledWallet: ({submitterDisplayName}: WaitingOnBankAccountParams) => `Inició el pago, pero no se procesará hasta que ${submitterDisplayName} active su Billetera`, enableWallet: 'Habilitar Billetera', + hold: 'En espera', + holdRequest: 'Solicitud de retención', + unholdRequest: 'Solicitud de cancelación de retención', + explainHold: 'Explique por qué mantiene esta solicitud.', + reason: 'Razón', + holdReasonRequired: 'Se requiere una razón al sostener.', + requestOnHold: 'Esta solicitud quedó en suspenso. Revise los comentarios para los próximos pasos.', + confirmApprove: 'Confirmar qué aprobar', + confirmApprovalAmount: 'Aprobar el total del informe completo o solo el monto no retenido.', + confirmPay: 'Confirmar que pagar', + confirmPayAmount: 'Pague todos los gastos de bolsillo o solo el monto no retenido.', + payOnly: 'Paga solo', + approveOnly: 'Aprobar sólo', set: 'estableció', changed: 'cambió', removed: 'eliminó', diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators.tsx index 151a795a7e36..231cf2385399 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators.tsx +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators.tsx @@ -95,6 +95,7 @@ const MoneyRequestModalStackNavigator = createModalStackNavigator require('../../../pages/iou/steps/MoneyRequestConfirmPage').default as React.ComponentType, [SCREENS.MONEY_REQUEST.CURRENCY]: () => require('../../../pages/iou/IOUCurrencySelection').default as React.ComponentType, [SCREENS.MONEY_REQUEST.DATE]: () => require('../../../pages/iou/MoneyRequestDatePage').default as React.ComponentType, + [SCREENS.MONEY_REQUEST.HOLD]: () => require('../../../pages/iou/HoldReasonPage').default as React.ComponentType, [SCREENS.MONEY_REQUEST.DESCRIPTION]: () => require('../../../pages/iou/MoneyRequestDescriptionPage').default as React.ComponentType, [SCREENS.MONEY_REQUEST.CATEGORY]: () => require('../../../pages/iou/MoneyRequestCategoryPage').default as React.ComponentType, [SCREENS.MONEY_REQUEST.TAG]: () => require('../../../pages/iou/MoneyRequestTagPage').default as React.ComponentType, diff --git a/src/libs/Navigation/linkingConfig.ts b/src/libs/Navigation/linkingConfig.ts index 5f7ecd10cc8c..21743a701f48 100644 --- a/src/libs/Navigation/linkingConfig.ts +++ b/src/libs/Navigation/linkingConfig.ts @@ -399,6 +399,7 @@ const linkingConfig: LinkingOptions = { [SCREENS.MONEY_REQUEST.STEP_DATE]: ROUTES.MONEY_REQUEST_STEP_DATE.route, [SCREENS.MONEY_REQUEST.STEP_DESCRIPTION]: ROUTES.MONEY_REQUEST_STEP_DESCRIPTION.route, [SCREENS.MONEY_REQUEST.STEP_DISTANCE]: ROUTES.MONEY_REQUEST_STEP_DISTANCE.route, + [SCREENS.MONEY_REQUEST.HOLD]: ROUTES.MONEY_REQUEST_HOLD_REASON.route, [SCREENS.MONEY_REQUEST.STEP_MERCHANT]: ROUTES.MONEY_REQUEST_STEP_MERCHANT.route, [SCREENS.MONEY_REQUEST.STEP_PARTICIPANTS]: ROUTES.MONEY_REQUEST_STEP_PARTICIPANTS.route, [SCREENS.MONEY_REQUEST.STEP_SCAN]: ROUTES.MONEY_REQUEST_STEP_SCAN.route, diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 470d9f3392d3..42920e63e004 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -2295,7 +2295,6 @@ function getParentNavigationSubtitle(report: OnyxEntry): ParentNavigatio /** * Navigate to the details page of a given report - * */ function navigateToDetailsPage(report: OnyxEntry) { const participantAccountIDs = report?.participantAccountIDs ?? []; @@ -3094,6 +3093,99 @@ function buildOptimisticCreatedReportAction(emailCreatingAction: string, created }; } +/** + * Returns the necessary reportAction onyx data to indicate that the transaction has been put on hold optimistically + * @param [created] - Action created time + */ +function buildOptimisticHoldReportAction(created = DateUtils.getDBTime()): OptimisticSubmittedReportAction { + return { + reportActionID: NumberUtils.rand64(), + actionName: CONST.REPORT.ACTIONS.TYPE.SUBMITTED, + pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, + actorAccountID: currentUserAccountID, + message: [ + { + type: CONST.REPORT.MESSAGE.TYPE.TEXT, + style: 'normal', + text: `held this request`, + }, + ], + person: [ + { + type: CONST.REPORT.MESSAGE.TYPE.TEXT, + style: 'normal', + text: allPersonalDetails?.[currentUserAccountID ?? '']?.displayName ?? currentUserEmail, + }, + ], + automatic: true, + avatar: allPersonalDetails?.[currentUserAccountID ?? '']?.avatar ?? UserUtils.getDefaultAvatarURL(currentUserAccountID), + created, + shouldShow: true, + }; +} + +/** + * Returns the necessary reportAction onyx data to indicate that the transaction has been removed from hold optimistically + * @param [created] - Action created time + */ +function buildOptimisticUnHoldReportAction(created = DateUtils.getDBTime()): OptimisticSubmittedReportAction { + return { + reportActionID: NumberUtils.rand64(), + actionName: CONST.REPORT.ACTIONS.TYPE.SUBMITTED, + pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, + actorAccountID: currentUserAccountID, + message: [ + { + type: CONST.REPORT.MESSAGE.TYPE.TEXT, + style: 'normal', + text: `unheld this request`, + }, + ], + person: [ + { + type: CONST.REPORT.MESSAGE.TYPE.TEXT, + style: 'normal', + text: allPersonalDetails?.[currentUserAccountID ?? '']?.displayName ?? currentUserEmail, + }, + ], + automatic: true, + avatar: allPersonalDetails?.[currentUserAccountID ?? '']?.avatar ?? UserUtils.getDefaultAvatarURL(currentUserAccountID), + created, + shouldShow: true, + }; +} + +/** + * Returns the necessary reportAction user comment user provided to put on hold optimistically + * @param [created] - Action created time + */ +function buildOptimisticHoldReportActionComment(comment: string, created = DateUtils.getDBTime()): OptimisticSubmittedReportAction { + return { + reportActionID: NumberUtils.rand64(), + actionName: CONST.REPORT.ACTIONS.TYPE.SUBMITTED, + pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, + actorAccountID: currentUserAccountID, + message: [ + { + type: CONST.REPORT.MESSAGE.TYPE.TEXT, + style: 'normal', + text: `${comment}`, + }, + ], + person: [ + { + type: CONST.REPORT.MESSAGE.TYPE.TEXT, + style: 'normal', + text: allPersonalDetails?.[currentUserAccountID ?? '']?.displayName ?? currentUserEmail, + }, + ], + automatic: true, + avatar: allPersonalDetails?.[currentUserAccountID ?? '']?.avatar ?? UserUtils.getDefaultAvatarURL(currentUserAccountID), + created, + shouldShow: true, + }; +} + /** * Returns the necessary reportAction onyx data to indicate that a task report has been edited */ @@ -4241,6 +4333,41 @@ function navigateToPrivateNotes(report: Report, session: Session) { Navigation.navigate(ROUTES.PRIVATE_NOTES_LIST.getRoute(report.reportID)); } +/** + * Check if Report has any held expenses + */ +function hasHeldExpenses(iouReportID: string): boolean { + const transactions = TransactionUtils.getAllReportTransactions(iouReportID); + return transactions.some((transaction) => TransactionUtils.isOnHold(transaction)); +} + +/** + * Check if all expenses in the Report are on hold + */ +function hasOnlyHeldExpenses(iouReportID: string): boolean { + const transactions = TransactionUtils.getAllReportTransactions(iouReportID); + return !transactions.some((transaction) => !TransactionUtils.isOnHold(transaction)); +} + +/** + * Return held and full amount formatted with used currency + */ +function getNonHeldAndFullAmount(iouReportID: string): string[] { + const transactions = TransactionUtils.getAllReportTransactions(iouReportID); + const usedCurrency = transactions[0].currency; + + let fullAmount = 0; + const nonheldAmount = transactions.reduce((previousValue, transaction) => { + fullAmount += transaction.amount * -1; + if (!TransactionUtils.isOnHold(transaction)) { + return previousValue + transaction.amount * -1; + } + return previousValue; + }, 0); + + return [CurrencyUtils.convertToDisplayString(nonheldAmount, usedCurrency), CurrencyUtils.convertToDisplayString(fullAmount, usedCurrency)]; +} + /** * Disable reply in thread action if: * @@ -4436,8 +4563,14 @@ export { shouldDisableWelcomeMessage, navigateToPrivateNotes, canEditWriteCapability, + hasHeldExpenses, + hasOnlyHeldExpenses, + getNonHeldAndFullAmount, hasSmartscanError, shouldAutoFocusOnKeyPress, + buildOptimisticHoldReportAction, + buildOptimisticHoldReportActionComment, + buildOptimisticUnHoldReportAction, shouldDisableThread, }; diff --git a/src/libs/TransactionUtils.ts b/src/libs/TransactionUtils.ts index 615bea7ff18d..df53823dba38 100644 --- a/src/libs/TransactionUtils.ts +++ b/src/libs/TransactionUtils.ts @@ -518,6 +518,13 @@ function getRecentTransactions(transactions: Record, size = 2): .slice(0, size); } +/** + * Check if transaction is on hold + */ +function isOnHold(transaction: Transaction): boolean { + return !!transaction.comment?.hold; +} + /** * this is the formulae to calculate tax */ @@ -568,6 +575,7 @@ export { isCardTransaction, isPending, isPosted, + isOnHold, getWaypoints, isAmountMissing, isMerchantMissing, diff --git a/src/libs/actions/IOU.js b/src/libs/actions/IOU.js index 511c299dda54..ef9627600d7a 100644 --- a/src/libs/actions/IOU.js +++ b/src/libs/actions/IOU.js @@ -3449,6 +3449,113 @@ function getIOUReportID(iou, route) { return lodashGet(route, 'params.reportID') || lodashGet(iou, 'participants.0.reportID', ''); } +/** + * Put money request on HOLD + * @param {string} transactionID + * @param {string} comment + * @param {string} reportID + */ +function putOnHold(transactionID, comment, reportID) { + const createdDate = new Date(); + const createdReportAction = ReportUtils.buildOptimisticHoldReportAction(createdDate); + const createdCommentReportAction = ReportUtils.buildOptimisticHoldReportActionComment(comment, new Date(createdDate.getTime() + 1)); + const transaction = allTransactions[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`]; + const transactionDetails = ReportUtils.getTransactionDetails(transaction); + + const optimisticData = [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`, + value: { + [createdReportAction.reportActionID]: createdReportAction, + [createdCommentReportAction.reportActionID]: createdCommentReportAction, + }, + }, + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, + value: { + comment: { + hold: createdReportAction.reportActionID, + }, + }, + }, + ]; + + const failureData = [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, + value: { + comment: { + hold: null, + }, + }, + }, + ]; + + API.write( + 'HoldRequest', + { + ...transactionDetails, + transactionID, + comment, + }, + {optimisticData, successData: [], failureData}, + ); +} + +/** + * Remove money request from HOLD + * @param {string} transactionID + * @param {string} reportID + */ +function unholdRequest(transactionID, reportID) { + const createdReportAction = ReportUtils.buildOptimisticUnHoldReportAction(); + const transaction = allTransactions[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`]; + const transactionDetails = ReportUtils.getTransactionDetails(transaction); + + const optimisticData = [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`, + value: { + [createdReportAction.reportActionID]: createdReportAction, + }, + }, + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, + value: { + comment: { + hold: null, + }, + }, + }, + ]; + + const successData = [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, + value: { + comment: { + hold: null, + }, + }, + }, + ]; + + API.write( + 'UnHoldRequest', + { + ...transactionDetails, + transactionID, + }, + {optimisticData, successData, failureData: []}, + ); +} + export { setMoneyRequestParticipants, createDistanceRequest, @@ -3503,5 +3610,7 @@ export { detachReceipt, getIOUReportID, editMoneyRequest, + putOnHold, + unholdRequest, resetMoneyRequestAmount_temporaryForRefactor, }; diff --git a/src/pages/iou/HoldReasonPage.js b/src/pages/iou/HoldReasonPage.js new file mode 100644 index 000000000000..777d35ca2002 --- /dev/null +++ b/src/pages/iou/HoldReasonPage.js @@ -0,0 +1,104 @@ +import lodashGet from 'lodash/get'; +import PropTypes from 'prop-types'; +import React, {useCallback, useRef} from 'react'; +import {View} from 'react-native'; +import _ from 'underscore'; +import FormProvider from '@components/Form/FormProvider'; +import InputWrapper from '@components/Form/InputWrapper'; +import HeaderWithBackButton from '@components/HeaderWithBackButton'; +import ScreenWrapper from '@components/ScreenWrapper'; +import Text from '@components/Text'; +import TextInput from '@components/TextInput'; +import useLocalize from '@hooks/useLocalize'; +import useThemeStyles from '@hooks/useThemeStyles'; +import Navigation from '@libs/Navigation/Navigation'; +import * as IOU from '@userActions/IOU'; +import CONST from '@src/CONST'; + +const propTypes = { + /** Navigation route context info provided by react navigation */ + route: PropTypes.shape({ + /** Route specific parameters used on this screen via route :iouType/new/category/:reportID? */ + params: PropTypes.shape({ + /** ID of the transaction the page was opened for */ + transactionID: PropTypes.string, + + /** ID of the report that user is providing hold reason to */ + reportID: PropTypes.string, + + /** Link to previous page */ + backTo: PropTypes.string, + }), + }).isRequired, +}; + +function HoldReasonPage({route}) { + const styles = useThemeStyles(); + const {translate} = useLocalize(); + const reasonRef = useRef(); + + const transactionID = lodashGet(route, 'params.transactionID', ''); + const reportID = lodashGet(route, 'params.reportID', ''); + const backTo = lodashGet(route, 'params.backTo', ''); + + const navigateBack = () => { + Navigation.navigate(backTo); + }; + + const onSubmit = (values) => { + IOU.putOnHold(transactionID, values.comment, reportID); + navigateBack(); + }; + + const validate = useCallback((value) => { + const errors = {}; + + if (_.isEmpty(value.comment)) { + errors.comment = 'common.error.fieldRequired'; + } + + return errors; + }, []); + + return ( + + + + {translate('iou.explainHold')} + + (reasonRef.current = e)} + autoFocus + /> + + + + ); +} + +HoldReasonPage.displayName = 'MoneyRequestHoldReasonPage'; +HoldReasonPage.propTypes = propTypes; + +export default HoldReasonPage; diff --git a/src/types/onyx/Transaction.ts b/src/types/onyx/Transaction.ts index 53bfc36a4e47..dee799499113 100644 --- a/src/types/onyx/Transaction.ts +++ b/src/types/onyx/Transaction.ts @@ -20,6 +20,7 @@ type Waypoint = { type WaypointCollection = Record; type Comment = { comment?: string; + hold?: string; waypoints?: WaypointCollection; isLoading?: boolean; type?: string; From c3268eff35a8c6af361ae2e1d0b6795431427219 Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Wed, 3 Jan 2024 14:18:38 -0500 Subject: [PATCH 005/288] feat(Violations): add transaction violation message to MoneyRequestPreview. --- .../ReportActionItem/MoneyRequestPreview.js | 17 ++++++++++++++++- src/languages/en.ts | 1 + src/languages/es.ts | 1 + src/libs/TransactionUtils.ts | 5 +++++ 4 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/components/ReportActionItem/MoneyRequestPreview.js b/src/components/ReportActionItem/MoneyRequestPreview.js index f0e818ddff4d..71b306043ecc 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview.js +++ b/src/components/ReportActionItem/MoneyRequestPreview.js @@ -28,6 +28,7 @@ import * as ReceiptUtils from '@libs/ReceiptUtils'; import * as ReportActionsUtils from '@libs/ReportActionsUtils'; import * as ReportUtils from '@libs/ReportUtils'; import * as TransactionUtils from '@libs/TransactionUtils'; +import {transactionViolationsPropType} from '@libs/Violations/propTypes'; import walletTermsPropTypes from '@pages/EnablePayments/walletTermsPropTypes'; import reportActionPropTypes from '@pages/home/report/reportActionPropTypes'; import iouReportPropTypes from '@pages/iouReportPropTypes'; @@ -104,6 +105,9 @@ const propTypes = { /** Whether a message is a whisper */ isWhisper: PropTypes.bool, + + /** All transactionViolations */ + transactionViolations: transactionViolationsPropType, }; const defaultProps = { @@ -123,6 +127,7 @@ const defaultProps = { transaction: {}, shouldShowPendingConversionMessage: false, isWhisper: false, + transactionViolations: {}, }; function MoneyRequestPreview(props) { @@ -155,7 +160,8 @@ function MoneyRequestPreview(props) { const description = requestComment; const hasReceipt = TransactionUtils.hasReceipt(props.transaction); const isScanning = hasReceipt && TransactionUtils.isReceiptBeingScanned(props.transaction); - const hasFieldErrors = TransactionUtils.hasMissingSmartscanFields(props.transaction); + const hasViolations = TransactionUtils.hasViolation(props.transaction.transactionId, props.transactionViolations); + const hasFieldErrors = TransactionUtils.hasMissingSmartscanFields(props.transaction) || hasViolations; const isDistanceRequest = TransactionUtils.isDistanceRequest(props.transaction); const isExpensifyCardTransaction = TransactionUtils.isExpensifyCardTransaction(props.transaction); const isSettled = ReportUtils.isSettled(props.iouReport.reportID); @@ -208,6 +214,12 @@ function MoneyRequestPreview(props) { } let message = translate('iou.cash'); + if (hasViolations) { + const violations = TransactionUtils.getTransactionViolations(props.transaction.transactionId, props.transactionViolations); + const firstViolationName = translate(`violations.${violations[0].name}`); + const isTooLong = violations.length > 1 || firstViolationName.length > 15; + message += ` • ${isTooLong ? translate('violations.reviewRequired') : firstViolationName}`; + } if (ReportUtils.isGroupPolicyExpenseReport(props.iouReport) && ReportUtils.isReportApproved(props.iouReport) && !ReportUtils.isSettled(props.iouReport)) { message += ` • ${translate('iou.approved')}`; } else if (props.iouReport.isWaitingOnBankAccount) { @@ -390,4 +402,7 @@ export default withOnyx({ walletTerms: { key: ONYXKEYS.WALLET_TERMS, }, + transactionViolations: { + key: ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS, + }, })(MoneyRequestPreview); diff --git a/src/languages/en.ts b/src/languages/en.ts index 6e177c1df141..654454939a8b 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -2074,6 +2074,7 @@ export default { perDayLimit: ({limit}: ViolationsPerDayLimitParams) => `Amount over daily ${limit}/person category limit`, receiptNotSmartScanned: 'Receipt not verified. Please confirm accuracy.', receiptRequired: ({amount, category}: ViolationsReceiptRequiredParams) => `Receipt required over ${amount} ${category ? ' category limit' : ''}`, + reviewRequired: 'dummy.violations.reviewRequired.EN', rter: ({brokenBankConnection, email, isAdmin, isTransactionOlderThan7Days, member}: ViolationsRterParams) => { if (brokenBankConnection) { return isAdmin diff --git a/src/languages/es.ts b/src/languages/es.ts index 990554b0b502..cce9b6a98eca 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -2561,6 +2561,7 @@ export default { perDayLimit: ({limit}: ViolationsPerDayLimitParams) => `Importe supera el límite diario de la categoría de ${limit}/persona`, receiptNotSmartScanned: 'Recibo no verificado. Por favor, confirma su exactitud', receiptRequired: ({amount, category}: ViolationsReceiptRequiredParams) => `Recibo obligatorio para importes sobre ${category ? 'el limite de la categoría de ' : ''}${amount}`, + reviewRequired: 'dummy.violations.reviewRequired>ES', rter: ({brokenBankConnection, isAdmin, email, isTransactionOlderThan7Days, member}: ViolationsRterParams) => { if (brokenBankConnection) { return isAdmin diff --git a/src/libs/TransactionUtils.ts b/src/libs/TransactionUtils.ts index 5cb962b27cdc..d669cc0d917d 100644 --- a/src/libs/TransactionUtils.ts +++ b/src/libs/TransactionUtils.ts @@ -526,6 +526,10 @@ function hasViolation(transactionID: string, transactionViolations: TransactionV return Boolean(transactionViolations[ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS + transactionID]?.some((violation: TransactionViolation) => violation.type === 'violation')); } +function getTransactionViolations(transactionID: string, transactionViolations: TransactionViolations): TransactionViolation[] | null { + return (transactionViolations[ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS + transactionID] as TransactionViolation[]) ?? null; +} + /** * this is the formulae to calculate tax */ @@ -564,6 +568,7 @@ export { getCategory, getBillable, getTag, + getTransactionViolations, getLinkedTransaction, getAllReportTransactions, hasReceipt, From 54006d9ef2e37eb2cbfbf1c1eb4cfbcaf61714f1 Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Wed, 3 Jan 2024 16:59:57 -0500 Subject: [PATCH 006/288] feat(Violations): fix broken import --- src/components/ViolationMessages.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/ViolationMessages.tsx b/src/components/ViolationMessages.tsx index 310c2deafee5..41ad44a54381 100644 --- a/src/components/ViolationMessages.tsx +++ b/src/components/ViolationMessages.tsx @@ -2,7 +2,7 @@ import React, {useMemo} from 'react'; import {View} from 'react-native'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; -import ViolationsUtils from '@libs/ViolationsUtils'; +import ViolationsUtils from '@libs/Violations/ViolationsUtils'; import {TransactionViolation} from '@src/types/onyx'; import Text from './Text'; From 92f340a97955f06f3b73a7e55e059566215ad794 Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Wed, 3 Jan 2024 17:00:54 -0500 Subject: [PATCH 007/288] feat(Violations): refactor for consistency and readability --- src/components/ReportActionItem/MoneyRequestPreview.js | 10 +++++----- src/libs/TransactionUtils.ts | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/components/ReportActionItem/MoneyRequestPreview.js b/src/components/ReportActionItem/MoneyRequestPreview.js index 71b306043ecc..4a79fc5f6232 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview.js +++ b/src/components/ReportActionItem/MoneyRequestPreview.js @@ -160,7 +160,7 @@ function MoneyRequestPreview(props) { const description = requestComment; const hasReceipt = TransactionUtils.hasReceipt(props.transaction); const isScanning = hasReceipt && TransactionUtils.isReceiptBeingScanned(props.transaction); - const hasViolations = TransactionUtils.hasViolation(props.transaction.transactionId, props.transactionViolations); + const hasViolations = TransactionUtils.hasViolation(props.transaction, props.transactionViolations); const hasFieldErrors = TransactionUtils.hasMissingSmartscanFields(props.transaction) || hasViolations; const isDistanceRequest = TransactionUtils.isDistanceRequest(props.transaction); const isExpensifyCardTransaction = TransactionUtils.isExpensifyCardTransaction(props.transaction); @@ -215,10 +215,10 @@ function MoneyRequestPreview(props) { let message = translate('iou.cash'); if (hasViolations) { - const violations = TransactionUtils.getTransactionViolations(props.transaction.transactionId, props.transactionViolations); - const firstViolationName = translate(`violations.${violations[0].name}`); - const isTooLong = violations.length > 1 || firstViolationName.length > 15; - message += ` • ${isTooLong ? translate('violations.reviewRequired') : firstViolationName}`; + const violations = TransactionUtils.getTransactionViolations(props.transaction, props.transactionViolations); + const violation = translate(`violations.${violations[0]?.name}`, violations[0]?.data); + const isTooLong = violations?.length > 1 || violation.length > 15; + message += ` • ${isTooLong ? translate('violations.reviewRequired') : violation}`; } if (ReportUtils.isGroupPolicyExpenseReport(props.iouReport) && ReportUtils.isReportApproved(props.iouReport) && !ReportUtils.isSettled(props.iouReport)) { message += ` • ${translate('iou.approved')}`; diff --git a/src/libs/TransactionUtils.ts b/src/libs/TransactionUtils.ts index d669cc0d917d..63f831b81706 100644 --- a/src/libs/TransactionUtils.ts +++ b/src/libs/TransactionUtils.ts @@ -522,11 +522,11 @@ function getRecentTransactions(transactions: Record, size = 2): /** * Checks if any violations for the provided transaction are of type 'violation' */ -function hasViolation(transactionID: string, transactionViolations: TransactionViolations): boolean { - return Boolean(transactionViolations[ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS + transactionID]?.some((violation: TransactionViolation) => violation.type === 'violation')); +function hasViolation(transaction: Transaction, transactionViolations: TransactionViolations): boolean { + return Boolean(transactionViolations[ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS + transaction.transactionID]?.some((violation: TransactionViolation) => violation.type === 'violation')); } -function getTransactionViolations(transactionID: string, transactionViolations: TransactionViolations): TransactionViolation[] | null { +function getTransactionViolations({transactionID}: Transaction, transactionViolations: TransactionViolations): TransactionViolation[] | null { return (transactionViolations[ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS + transactionID] as TransactionViolation[]) ?? null; } From 48c8083a6cf09c95e2e45f9667fb8a76a58bae8b Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Wed, 3 Jan 2024 17:03:48 -0500 Subject: [PATCH 008/288] feat(Violations): make dummy string < 15 chars> --- src/languages/en.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/languages/en.ts b/src/languages/en.ts index 654454939a8b..08f38fb58e3b 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -2074,7 +2074,7 @@ export default { perDayLimit: ({limit}: ViolationsPerDayLimitParams) => `Amount over daily ${limit}/person category limit`, receiptNotSmartScanned: 'Receipt not verified. Please confirm accuracy.', receiptRequired: ({amount, category}: ViolationsReceiptRequiredParams) => `Receipt required over ${amount} ${category ? ' category limit' : ''}`, - reviewRequired: 'dummy.violations.reviewRequired.EN', + reviewRequired: 'XreviewRequired', rter: ({brokenBankConnection, email, isAdmin, isTransactionOlderThan7Days, member}: ViolationsRterParams) => { if (brokenBankConnection) { return isAdmin From 2b51f6a68b802890c463b140b2ec3e5aaf99bcd4 Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Wed, 3 Jan 2024 17:09:26 -0500 Subject: [PATCH 009/288] fix lint --- src/components/ReportActionItem/MoneyRequestPreview.js | 4 ++-- src/libs/Violations/ViolationsUtils.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/ReportActionItem/MoneyRequestPreview.js b/src/components/ReportActionItem/MoneyRequestPreview.js index 4a79fc5f6232..5456f29f9109 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview.js +++ b/src/components/ReportActionItem/MoneyRequestPreview.js @@ -216,8 +216,8 @@ function MoneyRequestPreview(props) { let message = translate('iou.cash'); if (hasViolations) { const violations = TransactionUtils.getTransactionViolations(props.transaction, props.transactionViolations); - const violation = translate(`violations.${violations[0]?.name}`, violations[0]?.data); - const isTooLong = violations?.length > 1 || violation.length > 15; + const violation = translate(`violations.${violations[0].name}`, violations[0].data); + const isTooLong = violations.length > 1 || violation.length > 15; message += ` • ${isTooLong ? translate('violations.reviewRequired') : violation}`; } if (ReportUtils.isGroupPolicyExpenseReport(props.iouReport) && ReportUtils.isReportApproved(props.iouReport) && !ReportUtils.isSettled(props.iouReport)) { diff --git a/src/libs/Violations/ViolationsUtils.ts b/src/libs/Violations/ViolationsUtils.ts index 09c97ff1133c..0dd467220352 100644 --- a/src/libs/Violations/ViolationsUtils.ts +++ b/src/libs/Violations/ViolationsUtils.ts @@ -1,9 +1,9 @@ import reject from 'lodash/reject'; import Onyx from 'react-native-onyx'; +import {Phrase, PhraseParameters} from '@libs/Localize'; import {TranslationPaths} from '@src/languages/types'; import ONYXKEYS from '@src/ONYXKEYS'; import {PolicyCategories, PolicyTags, Transaction, TransactionViolation} from '@src/types/onyx'; -import {Phrase, PhraseParameters} from './Localize'; const ViolationsUtils = { /** From 062a878ea38a88e8151c83cf8f74aede1459243e Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Thu, 4 Jan 2024 17:09:42 -0500 Subject: [PATCH 010/288] feat(Violations): add translation --- src/languages/en.ts | 2 +- src/languages/es.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/languages/en.ts b/src/languages/en.ts index 08f38fb58e3b..2e1dbacb5bc3 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -2074,7 +2074,7 @@ export default { perDayLimit: ({limit}: ViolationsPerDayLimitParams) => `Amount over daily ${limit}/person category limit`, receiptNotSmartScanned: 'Receipt not verified. Please confirm accuracy.', receiptRequired: ({amount, category}: ViolationsReceiptRequiredParams) => `Receipt required over ${amount} ${category ? ' category limit' : ''}`, - reviewRequired: 'XreviewRequired', + reviewRequired: 'Review required', rter: ({brokenBankConnection, email, isAdmin, isTransactionOlderThan7Days, member}: ViolationsRterParams) => { if (brokenBankConnection) { return isAdmin diff --git a/src/languages/es.ts b/src/languages/es.ts index cce9b6a98eca..e264595ad978 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -2561,7 +2561,7 @@ export default { perDayLimit: ({limit}: ViolationsPerDayLimitParams) => `Importe supera el límite diario de la categoría de ${limit}/persona`, receiptNotSmartScanned: 'Recibo no verificado. Por favor, confirma su exactitud', receiptRequired: ({amount, category}: ViolationsReceiptRequiredParams) => `Recibo obligatorio para importes sobre ${category ? 'el limite de la categoría de ' : ''}${amount}`, - reviewRequired: 'dummy.violations.reviewRequired>ES', + reviewRequired: 'Revisión requerida', rter: ({brokenBankConnection, isAdmin, email, isTransactionOlderThan7Days, member}: ViolationsRterParams) => { if (brokenBankConnection) { return isAdmin From 62ee8237a09da6db21568b37cb26883f2036d7ce Mon Sep 17 00:00:00 2001 From: Bartosz Grajdek Date: Mon, 8 Jan 2024 21:45:34 +0100 Subject: [PATCH 011/288] feat: add proper permissions & style system messages --- src/CONST.ts | 2 + src/components/MoneyRequestHeader.js | 33 +++++++--- src/components/TextPill.tsx | 2 +- src/libs/ReportUtils.ts | 61 +++++++------------ src/libs/actions/IOU.js | 23 +++++-- .../home/report/ReportActionItemFragment.js | 35 ++++++++--- .../home/report/ReportActionItemMessage.tsx | 3 + .../home/report/ReportActionItemSingle.tsx | 1 + .../report/comment/TextCommentFragment.js | 2 +- src/types/onyx/OriginalMessage.ts | 14 +++++ 10 files changed, 115 insertions(+), 61 deletions(-) diff --git a/src/CONST.ts b/src/CONST.ts index 0c98645511d4..70899bc1eaa9 100755 --- a/src/CONST.ts +++ b/src/CONST.ts @@ -511,6 +511,7 @@ const CONST = { CHRONOSOOOLIST: 'CHRONOSOOOLIST', CLOSED: 'CLOSED', CREATED: 'CREATED', + HOLD: 'HOLD', IOU: 'IOU', MARKEDREIMBURSED: 'MARKEDREIMBURSED', MODIFIEDEXPENSE: 'MODIFIEDEXPENSE', @@ -594,6 +595,7 @@ const CONST = { REMOVE_FROM_ROOM: 'REMOVEFROMROOM', JOIN_ROOM: 'JOINROOM', }, + UNHOLD: 'UNHOLD', }, THREAD_DISABLED: ['CREATED'], }, diff --git a/src/components/MoneyRequestHeader.js b/src/components/MoneyRequestHeader.js index a29c43ab4eaa..048364596e86 100644 --- a/src/components/MoneyRequestHeader.js +++ b/src/components/MoneyRequestHeader.js @@ -76,6 +76,13 @@ function MoneyRequestHeader({session, parentReport, report, parentReportAction, const isOnHold = TransactionUtils.isOnHold(transaction); const {isSmallScreenWidth, windowWidth} = useWindowDimensions(); + console.log('report: ', report); + console.log('parentReport: ', parentReport); + console.log('parentReportAction: ', parentReportAction); + console.log('transaction: ', transaction); + console.log("lodashGet(policy, 'role'): ", lodashGet(policy, 'role')); + console.log("lodashGet(policy, 'type'): ", lodashGet(policy, 'type')); + // Only the requestor can take delete the request, admins can only edit it. const isActionOwner = lodashGet(parentReportAction, 'actorAccountID') === lodashGet(session, 'accountID', null); const isPolicyAdmin = lodashGet(policy, 'role') === CONST.POLICY.ROLE.ADMIN; @@ -88,7 +95,8 @@ function MoneyRequestHeader({session, parentReport, report, parentReportAction, const isScanning = TransactionUtils.hasReceipt(transaction) && TransactionUtils.isReceiptBeingScanned(transaction); const isPending = TransactionUtils.isExpensifyCardTransaction(transaction) && TransactionUtils.isPending(transaction); - const canModifyRequest = isActionOwner && !isSettled && !isApproved && !ReportActionsUtils.isDeletedAction(parentReportAction); + const isRequestModifiable = !isSettled && !isApproved && !ReportActionsUtils.isDeletedAction(parentReportAction); + const canModifyRequest = isActionOwner && isRequestModifiable; const changeMoneyRequestStatus = () => { if (!isOnHold) { @@ -113,14 +121,25 @@ function MoneyRequestHeader({session, parentReport, report, parentReportAction, setIsDeleteModalVisible(false); }, [canModifyRequest]); + const threeDotsMenuItems = [HeaderUtils.getPinMenuItem(report)]; - if ((isPolicyAdmin || isActionOwner) && !isSettled && !isApproved && !ReportActionsUtils.isDeletedAction(parentReportAction)) { - threeDotsMenuItems.push({ - icon: Expensicons.Stopwatch, - text: !isOnHold ? translate('iou.holdRequest') : translate('iou.unholdRequest'), - onSelected: () => changeMoneyRequestStatus(), - }); + if (isRequestModifiable) { + if (isOnHold && (ReportUtils.isHoldCreator(transaction, lodashGet(report, 'reportID')) || isPolicyAdmin)) { + threeDotsMenuItems.push({ + icon: Expensicons.Stopwatch, + text: translate('iou.unholdRequest'), + onSelected: () => changeMoneyRequestStatus(), + }); + } + if (!isOnHold && (lodashGet(parentReport, 'type') === 'iou' || isPolicyAdmin || isActionOwner)) { + threeDotsMenuItems.push({ + icon: Expensicons.Stopwatch, + text: translate('iou.holdRequest'), + onSelected: () => changeMoneyRequestStatus(), + }); + } } + if (canModifyRequest) { if (!TransactionUtils.hasReceipt(transaction)) { threeDotsMenuItems.push({ diff --git a/src/components/TextPill.tsx b/src/components/TextPill.tsx index 1104b5829d95..67dd8bf56ddc 100644 --- a/src/components/TextPill.tsx +++ b/src/components/TextPill.tsx @@ -14,7 +14,7 @@ type TextPillProps = { function TextPill({color, children}: TextPillProps) { const styles = useThemeStyles(); - return {children}; + return {children}; } TextPill.displayName = 'TextPill'; diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 42920e63e004..96ff9a71d1c0 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -3097,58 +3097,31 @@ function buildOptimisticCreatedReportAction(emailCreatingAction: string, created * Returns the necessary reportAction onyx data to indicate that the transaction has been put on hold optimistically * @param [created] - Action created time */ -function buildOptimisticHoldReportAction(created = DateUtils.getDBTime()): OptimisticSubmittedReportAction { +function buildOptimisticHoldReportAction(comment: string, created = DateUtils.getDBTime()): OptimisticSubmittedReportAction { return { reportActionID: NumberUtils.rand64(), - actionName: CONST.REPORT.ACTIONS.TYPE.SUBMITTED, + actionName: CONST.REPORT.ACTIONS.TYPE.HOLD, pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, actorAccountID: currentUserAccountID, message: [ { type: CONST.REPORT.MESSAGE.TYPE.TEXT, style: 'normal', - text: `held this request`, + text: `held this money request with the comment: ${comment}`, }, - ], - person: [ { - type: CONST.REPORT.MESSAGE.TYPE.TEXT, - style: 'normal', - text: allPersonalDetails?.[currentUserAccountID ?? '']?.displayName ?? currentUserEmail, - }, - ], - automatic: true, - avatar: allPersonalDetails?.[currentUserAccountID ?? '']?.avatar ?? UserUtils.getDefaultAvatarURL(currentUserAccountID), - created, - shouldShow: true, - }; -} - -/** - * Returns the necessary reportAction onyx data to indicate that the transaction has been removed from hold optimistically - * @param [created] - Action created time - */ -function buildOptimisticUnHoldReportAction(created = DateUtils.getDBTime()): OptimisticSubmittedReportAction { - return { - reportActionID: NumberUtils.rand64(), - actionName: CONST.REPORT.ACTIONS.TYPE.SUBMITTED, - pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, - actorAccountID: currentUserAccountID, - message: [ - { - type: CONST.REPORT.MESSAGE.TYPE.TEXT, - style: 'normal', - text: `unheld this request`, + type: CONST.REPORT.MESSAGE.TYPE.COMMENT, + text: comment, }, ], person: [ { type: CONST.REPORT.MESSAGE.TYPE.TEXT, - style: 'normal', + style: 'strong', text: allPersonalDetails?.[currentUserAccountID ?? '']?.displayName ?? currentUserEmail, }, ], - automatic: true, + automatic: false, avatar: allPersonalDetails?.[currentUserAccountID ?? '']?.avatar ?? UserUtils.getDefaultAvatarURL(currentUserAccountID), created, shouldShow: true, @@ -3156,20 +3129,20 @@ function buildOptimisticUnHoldReportAction(created = DateUtils.getDBTime()): Opt } /** - * Returns the necessary reportAction user comment user provided to put on hold optimistically + * Returns the necessary reportAction onyx data to indicate that the transaction has been removed from hold optimistically * @param [created] - Action created time */ -function buildOptimisticHoldReportActionComment(comment: string, created = DateUtils.getDBTime()): OptimisticSubmittedReportAction { +function buildOptimisticUnHoldReportAction(created = DateUtils.getDBTime()): OptimisticSubmittedReportAction { return { reportActionID: NumberUtils.rand64(), - actionName: CONST.REPORT.ACTIONS.TYPE.SUBMITTED, + actionName: CONST.REPORT.ACTIONS.TYPE.UNHOLD, pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, actorAccountID: currentUserAccountID, message: [ { type: CONST.REPORT.MESSAGE.TYPE.TEXT, style: 'normal', - text: `${comment}`, + text: `unheld this money request`, }, ], person: [ @@ -3179,7 +3152,7 @@ function buildOptimisticHoldReportActionComment(comment: string, created = DateU text: allPersonalDetails?.[currentUserAccountID ?? '']?.displayName ?? currentUserEmail, }, ], - automatic: true, + automatic: false, avatar: allPersonalDetails?.[currentUserAccountID ?? '']?.avatar ?? UserUtils.getDefaultAvatarURL(currentUserAccountID), created, shouldShow: true, @@ -4333,6 +4306,14 @@ function navigateToPrivateNotes(report: Report, session: Session) { Navigation.navigate(ROUTES.PRIVATE_NOTES_LIST.getRoute(report.reportID)); } +/** + * Check if Report has any held expenses + */ +function isHoldCreator(transaction: Transaction, reportID: string): boolean { + const holdReportAction = ReportActionsUtils.getReportAction(reportID, `${transaction.comment?.hold}`); + return isActionCreator(holdReportAction); +} + /** * Check if Report has any held expenses */ @@ -4563,13 +4544,13 @@ export { shouldDisableWelcomeMessage, navigateToPrivateNotes, canEditWriteCapability, + isHoldCreator, hasHeldExpenses, hasOnlyHeldExpenses, getNonHeldAndFullAmount, hasSmartscanError, shouldAutoFocusOnKeyPress, buildOptimisticHoldReportAction, - buildOptimisticHoldReportActionComment, buildOptimisticUnHoldReportAction, shouldDisableThread, }; diff --git a/src/libs/actions/IOU.js b/src/libs/actions/IOU.js index ef9627600d7a..f2e2553615ef 100644 --- a/src/libs/actions/IOU.js +++ b/src/libs/actions/IOU.js @@ -3457,8 +3457,7 @@ function getIOUReportID(iou, route) { */ function putOnHold(transactionID, comment, reportID) { const createdDate = new Date(); - const createdReportAction = ReportUtils.buildOptimisticHoldReportAction(createdDate); - const createdCommentReportAction = ReportUtils.buildOptimisticHoldReportActionComment(comment, new Date(createdDate.getTime() + 1)); + const createdReportAction = ReportUtils.buildOptimisticHoldReportAction(comment, DateUtils.getDBTime(createdDate)); const transaction = allTransactions[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`]; const transactionDetails = ReportUtils.getTransactionDetails(transaction); @@ -3468,7 +3467,6 @@ function putOnHold(transactionID, comment, reportID) { key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`, value: { [createdReportAction.reportActionID]: createdReportAction, - [createdCommentReportAction.reportActionID]: createdCommentReportAction, }, }, { @@ -3482,6 +3480,16 @@ function putOnHold(transactionID, comment, reportID) { }, ]; + const successData = [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`, + value: { + [createdReportAction.reportActionID]: null, + }, + }, + ]; + const failureData = [ { onyxMethod: Onyx.METHOD.MERGE, @@ -3501,7 +3509,7 @@ function putOnHold(transactionID, comment, reportID) { transactionID, comment, }, - {optimisticData, successData: [], failureData}, + {optimisticData, successData, failureData}, ); } @@ -3535,6 +3543,13 @@ function unholdRequest(transactionID, reportID) { ]; const successData = [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`, + value: { + [createdReportAction.reportActionID]: null, + }, + }, { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, diff --git a/src/pages/home/report/ReportActionItemFragment.js b/src/pages/home/report/ReportActionItemFragment.js index f05b3decc6d7..92ed637cbe62 100644 --- a/src/pages/home/report/ReportActionItemFragment.js +++ b/src/pages/home/report/ReportActionItemFragment.js @@ -65,6 +65,9 @@ const propTypes = { /** Whether the report action type is 'APPROVED' or 'SUBMITTED'. Used to style system messages from Old Dot */ isApprovedOrSubmittedReportAction: PropTypes.bool, + /** Whether the report action type is 'UNHOLD' or 'HOLD'. Used to style messages related to hold requests */ + isHoldReportAction: PropTypes.bool, + /** Used to format RTL display names in Old Dot system messages e.g. Arabic */ isFragmentContainingDisplayName: PropTypes.bool, @@ -89,6 +92,7 @@ const defaultProps = { actorIcon: {}, isThreadParentMessage: false, isApprovedOrSubmittedReportAction: false, + isHoldReportAction: false, isFragmentContainingDisplayName: false, displayAsGroup: false, }; @@ -131,14 +135,29 @@ function ReportActionItemFragment(props) { ); } case 'TEXT': { - return props.isApprovedOrSubmittedReportAction ? ( - - {props.isFragmentContainingDisplayName ? convertToLTR(props.fragment.text) : props.fragment.text} - - ) : ( + if (props.isApprovedOrSubmittedReportAction) { + return ( + + {props.isFragmentContainingDisplayName ? convertToLTR(props.fragment.text) : props.fragment.text} + + ); + } + + if (props.isHoldReportAction) { + return ( + + {props.isFragmentContainingDisplayName ? convertToLTR(props.fragment.text) : props.fragment.text} + + ); + } + + return ( type === action.actionName); + const isHoldReportAction = [CONST.REPORT.ACTIONS.TYPE.HOLD, CONST.REPORT.ACTIONS.TYPE.UNHOLD].some((type) => type === action.actionName); + /** * Get the ReportActionItemFragments * @param shouldWrapInText determines whether the fragments are wrapped in a Text component @@ -79,6 +81,7 @@ function ReportActionItemMessage({action, displayAsGroup, reportID, style, isHid style={style} displayAsGroup={displayAsGroup} isApprovedOrSubmittedReportAction={isApprovedOrSubmittedReportAction} + isHoldReportAction={isHoldReportAction} // Since system messages from Old Dot begin with the person who performed the action, // the first fragment will contain the person's display name and their email. We'll use this // to decide if the fragment should be from left to right for RTL display names e.g. Arabic for proper diff --git a/src/pages/home/report/ReportActionItemSingle.tsx b/src/pages/home/report/ReportActionItemSingle.tsx index 43b5630b2685..68a6ef96ae82 100644 --- a/src/pages/home/report/ReportActionItemSingle.tsx +++ b/src/pages/home/report/ReportActionItemSingle.tsx @@ -78,6 +78,7 @@ function ReportActionItemSingle({ const personalDetails = usePersonalDetails() ?? CONST.EMPTY_OBJECT; const actorAccountID = action.actionName === CONST.REPORT.ACTIONS.TYPE.REPORTPREVIEW && iouReport ? iouReport.managerID : action.actorAccountID; let displayName = ReportUtils.getDisplayNameForParticipant(actorAccountID); + console.log('actionTest', action, displayName); const {avatar, login, pendingFields, status, fallbackIcon} = personalDetails[actorAccountID ?? -1] ?? {}; // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing let actorHint = (login || (displayName ?? '')).replace(CONST.REGEX.MERGED_ACCOUNT_PREFIX, ''); diff --git a/src/pages/home/report/comment/TextCommentFragment.js b/src/pages/home/report/comment/TextCommentFragment.js index 3d6482344450..2c05be903dcb 100644 --- a/src/pages/home/report/comment/TextCommentFragment.js +++ b/src/pages/home/report/comment/TextCommentFragment.js @@ -50,7 +50,7 @@ function TextCommentFragment(props) { const theme = useTheme(); const styles = useThemeStyles(); const {fragment, styleAsDeleted} = props; - const {html, text} = fragment; + const {html = '', text} = fragment; // If the only difference between fragment.text and fragment.html is
tags // we render it as text, not as html. diff --git a/src/types/onyx/OriginalMessage.ts b/src/types/onyx/OriginalMessage.ts index 767f724dd571..6c9a1ad8280d 100644 --- a/src/types/onyx/OriginalMessage.ts +++ b/src/types/onyx/OriginalMessage.ts @@ -9,6 +9,8 @@ type OriginalMessageActionName = | 'CHRONOSOOOLIST' | 'CLOSED' | 'CREATED' + | 'HOLD' + | 'UNHOLD' | 'IOU' | 'MODIFIEDEXPENSE' | 'REIMBURSEMENTQUEUED' @@ -26,6 +28,16 @@ type OriginalMessageApproved = { }; type OriginalMessageSource = 'Chronos' | 'email' | 'ios' | 'android' | 'web' | ''; +type OriginalMessageHold = { + actionName: typeof CONST.REPORT.ACTIONS.TYPE.HOLD; + originalMessage: unknown; +}; + +type OriginalMessageUnHold = { + actionName: typeof CONST.REPORT.ACTIONS.TYPE.UNHOLD; + originalMessage: unknown; +}; + type IOUDetails = { amount: number; comment?: string; @@ -242,6 +254,8 @@ type OriginalMessage = | OriginalMessageSubmitted | OriginalMessageClosed | OriginalMessageCreated + | OriginalMessageHold + | OriginalMessageUnHold | OriginalMessageRenamed | OriginalMessageChronosOOOList | OriginalMessageReportPreview From 98c83dacb4cf632f62fb3387c611f6d228445c17 Mon Sep 17 00:00:00 2001 From: Bartosz Grajdek Date: Mon, 8 Jan 2024 21:47:14 +0100 Subject: [PATCH 012/288] fix: remove console log --- src/components/MoneyRequestHeader.js | 7 ------- src/pages/home/report/ReportActionItemSingle.tsx | 1 - 2 files changed, 8 deletions(-) diff --git a/src/components/MoneyRequestHeader.js b/src/components/MoneyRequestHeader.js index 048364596e86..7c64eb54fcf7 100644 --- a/src/components/MoneyRequestHeader.js +++ b/src/components/MoneyRequestHeader.js @@ -76,13 +76,6 @@ function MoneyRequestHeader({session, parentReport, report, parentReportAction, const isOnHold = TransactionUtils.isOnHold(transaction); const {isSmallScreenWidth, windowWidth} = useWindowDimensions(); - console.log('report: ', report); - console.log('parentReport: ', parentReport); - console.log('parentReportAction: ', parentReportAction); - console.log('transaction: ', transaction); - console.log("lodashGet(policy, 'role'): ", lodashGet(policy, 'role')); - console.log("lodashGet(policy, 'type'): ", lodashGet(policy, 'type')); - // Only the requestor can take delete the request, admins can only edit it. const isActionOwner = lodashGet(parentReportAction, 'actorAccountID') === lodashGet(session, 'accountID', null); const isPolicyAdmin = lodashGet(policy, 'role') === CONST.POLICY.ROLE.ADMIN; diff --git a/src/pages/home/report/ReportActionItemSingle.tsx b/src/pages/home/report/ReportActionItemSingle.tsx index 68a6ef96ae82..43b5630b2685 100644 --- a/src/pages/home/report/ReportActionItemSingle.tsx +++ b/src/pages/home/report/ReportActionItemSingle.tsx @@ -78,7 +78,6 @@ function ReportActionItemSingle({ const personalDetails = usePersonalDetails() ?? CONST.EMPTY_OBJECT; const actorAccountID = action.actionName === CONST.REPORT.ACTIONS.TYPE.REPORTPREVIEW && iouReport ? iouReport.managerID : action.actorAccountID; let displayName = ReportUtils.getDisplayNameForParticipant(actorAccountID); - console.log('actionTest', action, displayName); const {avatar, login, pendingFields, status, fallbackIcon} = personalDetails[actorAccountID ?? -1] ?? {}; // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing let actorHint = (login || (displayName ?? '')).replace(CONST.REGEX.MERGED_ACCOUNT_PREFIX, ''); From ba91d6e7ed66d225d3ffa2880956386d50dd9dff Mon Sep 17 00:00:00 2001 From: Bartosz Grajdek Date: Mon, 8 Jan 2024 21:59:26 +0100 Subject: [PATCH 013/288] fix: typecheck --- src/components/TextPill.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/TextPill.tsx b/src/components/TextPill.tsx index 7f3ad73fa0b5..73a376772ee3 100644 --- a/src/components/TextPill.tsx +++ b/src/components/TextPill.tsx @@ -10,7 +10,7 @@ type TextPillProps = { color?: string; /** Styles to apply to the text */ - textStyles: StyleProp; + textStyles?: StyleProp; children: React.ReactNode; }; From 3ea41321b126be3b4005a58d539ef79c3bad2da7 Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Tue, 9 Jan 2024 15:04:03 -0500 Subject: [PATCH 014/288] feat(Violations): fix import --- src/libs/Violations/ViolationsUtils.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/libs/Violations/ViolationsUtils.ts b/src/libs/Violations/ViolationsUtils.ts index f9971e713649..86f60ed04aa5 100644 --- a/src/libs/Violations/ViolationsUtils.ts +++ b/src/libs/Violations/ViolationsUtils.ts @@ -1,10 +1,9 @@ import reject from 'lodash/reject'; import Onyx from 'react-native-onyx'; +import type {Phrase, PhraseParameters} from '@libs/Localize'; import type {TranslationPaths} from '@src/languages/types'; import ONYXKEYS from '@src/ONYXKEYS'; import type {PolicyCategories, PolicyTags, Transaction, TransactionViolation} from '@src/types/onyx'; -import type {Phrase, PhraseParameters} from '../Localize'; - const ViolationsUtils = { /** @@ -135,7 +134,7 @@ const ViolationsUtils = { case 'nonExpensiworksExpense': return translate('violations.nonExpensiworksExpense'); case 'overAutoApprovalLimit': - return translate('violations.overAutoApprovalLimit', {formattedLimitAmount: violation.data?.formattedLimitAmount ?? ''}); + return translate('violations.overAutoApprovalLimit', {formattedLimitAmount: violation.data?.formattedLimit ?? ''}); case 'overCategoryLimit': return translate('violations.overCategoryLimit', {categoryLimit: violation.data?.categoryLimit ?? ''}); case 'overLimit': @@ -148,7 +147,7 @@ const ViolationsUtils = { return translate('violations.receiptNotSmartScanned'); case 'receiptRequired': return translate('violations.receiptRequired', { - amount: violation.data?.amount ?? '0', + formattedLimit: violation.data?.formattedLimit ?? '0', category: violation.data?.category ?? '', }); case 'rter': From dd39fd141627e40c0e3c7647d1511551b9ebec5f Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Tue, 9 Jan 2024 15:05:28 -0500 Subject: [PATCH 015/288] feat(Violations): move condition outside of component body to allow memoization --- .../ReportActionItem/MoneyRequestPreview.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/components/ReportActionItem/MoneyRequestPreview.js b/src/components/ReportActionItem/MoneyRequestPreview.js index 6b145d86d80a..c14175689934 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview.js +++ b/src/components/ReportActionItem/MoneyRequestPreview.js @@ -131,6 +131,13 @@ const defaultProps = { transactionViolations: {}, }; +// We should not render the component if there is no iouReport and it's not a split. +// Moved outside of the component scope to allow memoization of values later. +function MoneyRequestPreviewWrapper(props) { + // eslint-disable-next-line react/jsx-props-no-spreading + return _.isEmpty(props.iouReport) && !props.isBillSplit ? null : ; +} + function MoneyRequestPreview(props) { const theme = useTheme(); const styles = useThemeStyles(); @@ -138,10 +145,6 @@ function MoneyRequestPreview(props) { const {translate} = useLocalize(); const {isSmallScreenWidth, windowWidth} = useWindowDimensions(); - if (_.isEmpty(props.iouReport) && !props.isBillSplit) { - return null; - } - const sessionAccountID = lodashGet(props.session, 'accountID', null); const managerID = props.iouReport.managerID || ''; const ownerAccountID = props.iouReport.ownerAccountID || ''; From d037f7d7a27e347524b1bfd2f648307daf205a9a Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Tue, 9 Jan 2024 15:07:47 -0500 Subject: [PATCH 016/288] feat(Violations): update translations to handle null cases. correct data prop names. --- src/languages/en.ts | 4 ++-- src/languages/es.ts | 5 +++-- src/languages/types.ts | 4 ++-- src/types/onyx/TransactionViolation.ts | 2 +- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/languages/en.ts b/src/languages/en.ts index 8e94aecc1b79..1e723ea54cfe 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -2078,7 +2078,7 @@ export default { maxAge: ({maxAge}: ViolationsMaxAgeParams) => `Date older than ${maxAge} days`, missingCategory: 'Missing category', missingComment: 'Description required for selected category', - missingTag: ({tagName}: ViolationsMissingTagParams) => `Missing ${tagName ?? 'tag'}`, + missingTag: (params: ViolationsMissingTagParams) => `Missing ${params?.tagName ?? 'tag'}`, modifiedAmount: 'Amount greater than scanned receipt', modifiedDate: 'Date differs from scanned receipt', nonExpensiworksExpense: 'Non-Expensiworks expense', @@ -2088,7 +2088,7 @@ export default { overLimitAttendee: ({amount}: ViolationsOverLimitParams) => `Amount over ${amount}/person limit`, perDayLimit: ({limit}: ViolationsPerDayLimitParams) => `Amount over daily ${limit}/person category limit`, receiptNotSmartScanned: 'Receipt not verified. Please confirm accuracy.', - receiptRequired: ({amount, category}: ViolationsReceiptRequiredParams) => `Receipt required over ${amount} ${category ? ' category limit' : ''}`, + receiptRequired: (params: ViolationsReceiptRequiredParams) => `Receipt required${params ? ` over ${params.formattedLimit}${params.category ? ` category limit` : ''}` : ''}`, reviewRequired: 'Review required', rter: ({brokenBankConnection, email, isAdmin, isTransactionOlderThan7Days, member}: ViolationsRterParams) => { if (brokenBankConnection) { diff --git a/src/languages/es.ts b/src/languages/es.ts index 8760ef652d1d..cead5beb9c2a 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -2565,7 +2565,7 @@ export default { maxAge: ({maxAge}: ViolationsMaxAgeParams) => `Fecha de más de ${maxAge} días`, missingCategory: 'Falta categoría', missingComment: 'Descripción obligatoria para categoría seleccionada', - missingTag: ({tagName}: ViolationsMissingTagParams) => `Falta ${tagName}`, + missingTag: (params: ViolationsMissingTagParams) => `Falta ${params?.tagName ?? 'etiqueta'}`, modifiedAmount: 'Importe superior al del recibo escaneado', modifiedDate: 'Fecha difiere del recibo escaneado', nonExpensiworksExpense: 'Gasto no es de Expensiworks', @@ -2575,7 +2575,8 @@ export default { overLimitAttendee: ({amount}: ViolationsOverLimitParams) => `Importe supera el límite de ${amount}/persona`, perDayLimit: ({limit}: ViolationsPerDayLimitParams) => `Importe supera el límite diario de la categoría de ${limit}/persona`, receiptNotSmartScanned: 'Recibo no verificado. Por favor, confirma su exactitud', - receiptRequired: ({amount, category}: ViolationsReceiptRequiredParams) => `Recibo obligatorio para importes sobre ${category ? 'el limite de la categoría de ' : ''}${amount}`, + receiptRequired: (params: ViolationsReceiptRequiredParams) => + `Recibo obligatorio${params ? ` para importes sobre${params.category ? ` el limite de la categoría de` : ''} ${params.formattedLimit}` : ''}`, reviewRequired: 'Revisión requerida', rter: ({brokenBankConnection, isAdmin, email, isTransactionOlderThan7Days, member}: ViolationsRterParams) => { if (brokenBankConnection) { diff --git a/src/languages/types.ts b/src/languages/types.ts index 3185b7a8f6f1..e69b4bd49686 100644 --- a/src/languages/types.ts +++ b/src/languages/types.ts @@ -223,7 +223,7 @@ type ViolationsInvoiceMarkupParams = {invoiceMarkup?: number}; type ViolationsMaxAgeParams = {maxAge: number}; -type ViolationsMissingTagParams = {tagName?: string}; +type ViolationsMissingTagParams = {tagName?: string} | null; type ViolationsOverAutoApprovalLimitParams = {formattedLimitAmount: string}; @@ -233,7 +233,7 @@ type ViolationsOverLimitParams = {amount: string}; type ViolationsPerDayLimitParams = {limit: string}; -type ViolationsReceiptRequiredParams = {amount: string; category?: string}; +type ViolationsReceiptRequiredParams = {formattedLimit: string; category?: string} | null; type ViolationsRterParams = { brokenBankConnection: boolean; diff --git a/src/types/onyx/TransactionViolation.ts b/src/types/onyx/TransactionViolation.ts index 253e2e8e2a29..b01a5fe38a62 100644 --- a/src/types/onyx/TransactionViolation.ts +++ b/src/types/onyx/TransactionViolation.ts @@ -18,7 +18,7 @@ type TransactionViolation = { invoiceMarkup?: number; maxAge?: number; tagName?: string; - formattedLimitAmount?: string; + formattedLimit?: string; categoryLimit?: string; limit?: string; category?: string; From 3b87f1343846608b7be3d312250bf8b4fc692b6c Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Tue, 9 Jan 2024 15:36:39 -0500 Subject: [PATCH 017/288] feat(Violations): filter violations to remove 'notification' type messages --- src/components/ReportActionItem/MoneyRequestPreview.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/ReportActionItem/MoneyRequestPreview.js b/src/components/ReportActionItem/MoneyRequestPreview.js index c14175689934..dcc342e795d6 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview.js +++ b/src/components/ReportActionItem/MoneyRequestPreview.js @@ -222,7 +222,7 @@ function MoneyRequestPreview(props) { if (hasViolations) { const violations = TransactionUtils.getTransactionViolations(props.transaction, props.transactionViolations); const violation = translate(`violations.${violations[0].name}`, violations[0].data); - const isTooLong = violations.length > 1 || violation.length > 15; + const isTooLong = _.filter(violations, (v) => v.type === 'violation').length > 1 || violation.length > 15; message += ` • ${isTooLong ? translate('violations.reviewRequired') : violation}`; } if (ReportUtils.isPaidGroupPolicyExpenseReport(props.iouReport) && ReportUtils.isReportApproved(props.iouReport) && !ReportUtils.isSettled(props.iouReport)) { From ebcff3806996d04dcc8fb5b4dbf78e4f8d3b02d4 Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Tue, 9 Jan 2024 15:37:09 -0500 Subject: [PATCH 018/288] feat(Violations): memoize preview header text --- .../ReportActionItem/MoneyRequestPreview.js | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/components/ReportActionItem/MoneyRequestPreview.js b/src/components/ReportActionItem/MoneyRequestPreview.js index dcc342e795d6..4cbb9330f962 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview.js +++ b/src/components/ReportActionItem/MoneyRequestPreview.js @@ -1,7 +1,7 @@ import {truncate} from 'lodash'; import lodashGet from 'lodash/get'; import PropTypes from 'prop-types'; -import React from 'react'; +import React, {useMemo} from 'react'; import {View} from 'react-native'; import {withOnyx} from 'react-native-onyx'; import _ from 'underscore'; @@ -197,7 +197,7 @@ function MoneyRequestPreview(props) { showContextMenuForReport(event, props.contextMenuAnchor, props.chatReportID, props.action, props.checkIfContextMenuActive); }; - const getPreviewHeaderText = () => { + const previewHeaderText = useMemo(() => { if (isDistanceRequest) { return translate('common.distance'); } @@ -232,8 +232,20 @@ function MoneyRequestPreview(props) { } else if (props.iouReport.isCancelledIOU) { message += ` • ${translate('iou.canceled')}`; } - return message; - }; + return message + (isSettled && !props.iouReport.isCancelledIOU ? ` • ${getSettledMessage()}` : ''); + }, [ + getSettledMessage, + hasViolations, + isDistanceRequest, + isExpensifyCardTransaction, + isScanning, + isSettled, + props.iouReport, + props.isBillSplit, + props.transaction, + props.transactionViolations, + translate, + ]); const getDisplayAmountText = () => { if (isDistanceRequest) { @@ -294,9 +306,7 @@ function MoneyRequestPreview(props) { ) : ( - - {getPreviewHeaderText() + (isSettled && !props.iouReport.isCancelledIOU ? ` • ${getSettledMessage()}` : '')} - + {previewHeaderText} {!isSettled && hasFieldErrors && ( Date: Tue, 9 Jan 2024 15:38:04 -0500 Subject: [PATCH 019/288] feat(Violations): add proptypes and call wrapper component --- src/components/ReportActionItem/MoneyRequestPreview.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/components/ReportActionItem/MoneyRequestPreview.js b/src/components/ReportActionItem/MoneyRequestPreview.js index 4cbb9330f962..5c7d89f535b3 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview.js +++ b/src/components/ReportActionItem/MoneyRequestPreview.js @@ -397,6 +397,9 @@ function MoneyRequestPreview(props) { MoneyRequestPreview.propTypes = propTypes; MoneyRequestPreview.defaultProps = defaultProps; MoneyRequestPreview.displayName = 'MoneyRequestPreview'; +MoneyRequestPreviewWrapper.propTypes = propTypes; +MoneyRequestPreviewWrapper.defaultProps = defaultProps; +MoneyRequestPreviewWrapper.displayName = 'MoneyRequestPreviewWrapper'; export default withOnyx({ personalDetails: { @@ -420,4 +423,4 @@ export default withOnyx({ transactionViolations: { key: ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS, }, -})(MoneyRequestPreview); +})(MoneyRequestPreviewWrapper); From cd0f3a81fd156581b1d3b2dc80f83d2ffaa32899 Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Tue, 9 Jan 2024 15:38:10 -0500 Subject: [PATCH 020/288] feat(Violations): fix import --- src/libs/actions/IOU.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/actions/IOU.js b/src/libs/actions/IOU.js index f2584cb8accd..6d20c3badac5 100644 --- a/src/libs/actions/IOU.js +++ b/src/libs/actions/IOU.js @@ -22,7 +22,7 @@ import * as ReportActionsUtils from '@libs/ReportActionsUtils'; import * as ReportUtils from '@libs/ReportUtils'; import * as TransactionUtils from '@libs/TransactionUtils'; import * as UserUtils from '@libs/UserUtils'; -import ViolationsUtils from '@libs/ViolationsUtils'; +import ViolationsUtils from '@libs/Violations/ViolationsUtils'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; From 96470a37550bba0ff0bdb4634112d7294e3e6637 Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Tue, 9 Jan 2024 16:59:53 -0500 Subject: [PATCH 021/288] feat(Violations): memoize strings --- .../ReportActionItem/MoneyRequestPreview.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/components/ReportActionItem/MoneyRequestPreview.js b/src/components/ReportActionItem/MoneyRequestPreview.js index 5c7d89f535b3..738ba6c40f59 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview.js +++ b/src/components/ReportActionItem/MoneyRequestPreview.js @@ -186,12 +186,12 @@ function MoneyRequestPreview(props) { const receiptImages = hasReceipt ? [ReceiptUtils.getThumbnailAndImageURIs(props.transaction)] : []; - const getSettledMessage = () => { + const getSettledMessage = useMemo(() => { if (isExpensifyCardTransaction) { return translate('common.done'); } return translate('iou.settledExpensify'); - }; + }, [isExpensifyCardTransaction, translate]); const showContextMenu = (event) => { showContextMenuForReport(event, props.contextMenuAnchor, props.chatReportID, props.action, props.checkIfContextMenuActive); @@ -232,7 +232,7 @@ function MoneyRequestPreview(props) { } else if (props.iouReport.isCancelledIOU) { message += ` • ${translate('iou.canceled')}`; } - return message + (isSettled && !props.iouReport.isCancelledIOU ? ` • ${getSettledMessage()}` : ''); + return message + (isSettled && !props.iouReport.isCancelledIOU ? ` • ${getSettledMessage}` : ''); }, [ getSettledMessage, hasViolations, @@ -247,7 +247,7 @@ function MoneyRequestPreview(props) { translate, ]); - const getDisplayAmountText = () => { + const displayAmountText = useMemo(() => { if (isDistanceRequest) { return requestAmount && !hasPendingWaypoints ? CurrencyUtils.convertToDisplayString(requestAmount, props.transaction.currency) : translate('common.tbd'); } @@ -261,9 +261,9 @@ function MoneyRequestPreview(props) { } return CurrencyUtils.convertToDisplayString(requestAmount, requestCurrency); - }; + }, [hasPendingWaypoints, isDistanceRequest, isScanning, props.transaction, requestAmount, requestCurrency, translate]); - const getDisplayDeleteAmountText = () => { + const displayDeleteAmountText = useMemo(() => { const {amount, currency} = ReportUtils.getTransactionDetails(props.action.originalMessage); if (isDistanceRequest) { @@ -271,9 +271,9 @@ function MoneyRequestPreview(props) { } return CurrencyUtils.convertToDisplayString(amount, currency); - }; + }, [isDistanceRequest, props.action.originalMessage]); - const displayAmount = isDeleted ? getDisplayDeleteAmountText() : getDisplayAmountText(); + const displayAmount = isDeleted ? displayDeleteAmountText : displayAmountText; const childContainer = ( From 1387e34a837991d6497580ad6428d96992cfacbf Mon Sep 17 00:00:00 2001 From: Bartosz Grajdek Date: Wed, 10 Jan 2024 01:05:48 +0100 Subject: [PATCH 022/288] Permissions check --- src/components/MoneyRequestHeader.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/components/MoneyRequestHeader.js b/src/components/MoneyRequestHeader.js index 7c64eb54fcf7..5f889d78a5ef 100644 --- a/src/components/MoneyRequestHeader.js +++ b/src/components/MoneyRequestHeader.js @@ -79,6 +79,7 @@ function MoneyRequestHeader({session, parentReport, report, parentReportAction, // Only the requestor can take delete the request, admins can only edit it. const isActionOwner = lodashGet(parentReportAction, 'actorAccountID') === lodashGet(session, 'accountID', null); const isPolicyAdmin = lodashGet(policy, 'role') === CONST.POLICY.ROLE.ADMIN; + const isApprover = ReportUtils.isMoneyRequestReport(moneyRequestReport) && lodashGet(session, 'accountID', null) === moneyRequestReport.managerID; const deleteTransaction = useCallback(() => { IOU.deleteMoneyRequest(lodashGet(parentReportAction, 'originalMessage.IOUTransactionID'), parentReportAction, true); @@ -117,14 +118,16 @@ function MoneyRequestHeader({session, parentReport, report, parentReportAction, const threeDotsMenuItems = [HeaderUtils.getPinMenuItem(report)]; if (isRequestModifiable) { - if (isOnHold && (ReportUtils.isHoldCreator(transaction, lodashGet(report, 'reportID')) || isPolicyAdmin)) { + const isHoldCreator = ReportUtils.isHoldCreator(transaction, lodashGet(report, 'reportID')); + const isRequestIOU = lodashGet(parentReport, 'type') === 'iou'; + if (isOnHold && ((isRequestIOU && isHoldCreator) || (!isRequestIOU && (isPolicyAdmin || isActionOwner || isApprover)))) { threeDotsMenuItems.push({ icon: Expensicons.Stopwatch, text: translate('iou.unholdRequest'), onSelected: () => changeMoneyRequestStatus(), }); } - if (!isOnHold && (lodashGet(parentReport, 'type') === 'iou' || isPolicyAdmin || isActionOwner)) { + if (!isOnHold && (isRequestIOU || isPolicyAdmin || isActionOwner || isApprover)) { threeDotsMenuItems.push({ icon: Expensicons.Stopwatch, text: translate('iou.holdRequest'), From 5b0e92f9ed559f826d53ab2cfa41ca3baf7276ab Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Thu, 11 Jan 2024 13:49:29 -0500 Subject: [PATCH 023/288] lint --- src/libs/SidebarUtils.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libs/SidebarUtils.ts b/src/libs/SidebarUtils.ts index 2392a064ff37..6ffa6cc26450 100644 --- a/src/libs/SidebarUtils.ts +++ b/src/libs/SidebarUtils.ts @@ -129,8 +129,8 @@ function getOrderedReportIDs( const cachedReportsKey = JSON.stringify( [currentReportId, allReports, betas, policies, priorityMode, reportActionCount], /** - * Exclude some properties not to overwhelm a cached key value with huge data, - * which we don't need to store in a cacheKey + * Exclude some properties not to overwhelm a cached key value with huge data, + * which we don't need to store in a cacheKey */ (key, value: unknown) => (['participantAccountIDs', 'participants', 'lastMessageText', 'visibleChatMemberAccountIDs'].includes(key) ? undefined : value), ); From 37cfb7936a1c696bb7d0d0224d1784750e9b4752 Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Thu, 11 Jan 2024 13:53:48 -0500 Subject: [PATCH 024/288] feat(Violations): remove duplicate from merge --- src/CONST.ts | 36 ------------------------------------ 1 file changed, 36 deletions(-) diff --git a/src/CONST.ts b/src/CONST.ts index 1c15f62169fe..c14db74ff173 100755 --- a/src/CONST.ts +++ b/src/CONST.ts @@ -3104,42 +3104,6 @@ const CONST = { TAX_REQUIRED: 'taxRequired', }, - VIOLATIONS: { - ALL_TAG_LEVELS_REQUIRED: 'allTagLevelsRequired', - AUTO_REPORTED_REJECTED_EXPENSE: 'autoReportedRejectedExpense', - BILLABLE_EXPENSE: 'billableExpense', - CASH_EXPENSE_WITH_NO_RECEIPT: 'cashExpenseWithNoReceipt', - CATEGORY_OUT_OF_POLICY: 'categoryOutOfPolicy', - CONVERSION_SURCHARGE: 'conversionSurcharge', - CUSTOM_UNIT_OUT_OF_POLICY: 'customUnitOutOfPolicy', - DUPLICATED_TRANSACTION: 'duplicatedTransaction', - FIELD_REQUIRED: 'fieldRequired', - FUTURE_DATE: 'futureDate', - INVOICE_MARKUP: 'invoiceMarkup', - MAX_AGE: 'maxAge', - MISSING_CATEGORY: 'missingCategory', - MISSING_COMMENT: 'missingComment', - MISSING_TAG: 'missingTag', - MODIFIED_AMOUNT: 'modifiedAmount', - MODIFIED_DATE: 'modifiedDate', - NON_EXPENSIWORKS_EXPENSE: 'nonExpensiworksExpense', - OVER_AUTO_APPROVAL_LIMIT: 'overAutoApprovalLimit', - OVER_CATEGORY_LIMIT: 'overCategoryLimit', - OVER_LIMIT: 'overLimit', - OVER_LIMIT_ATTENDEE: 'overLimitAttendee', - PER_DAY_LIMIT: 'perDayLimit', - RECEIPT_NOT_SMART_SCANNED: 'receiptNotSmartScanned', - RECEIPT_REQUIRED: 'receiptRequired', - RTER: 'rter', - SMARTSCAN_FAILED: 'smartscanFailed', - SOME_TAG_LEVELS_REQUIRED: 'someTagLevelsRequired', - TAG_OUT_OF_POLICY: 'tagOutOfPolicy', - TAX_AMOUNT_CHANGED: 'taxAmountChanged', - TAX_OUT_OF_POLICY: 'taxOutOfPolicy', - TAX_RATE_CHANGED: 'taxRateChanged', - TAX_REQUIRED: 'taxRequired', - }, - /** Context menu types */ CONTEXT_MENU_TYPES: { LINK: 'LINK', From d166df1afb29b376f79adaee8d4c987c63b7962f Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Thu, 11 Jan 2024 13:54:29 -0500 Subject: [PATCH 025/288] feat(Violations): take transaction or transactionId for hasViolation --- src/libs/TransactionUtils.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/libs/TransactionUtils.ts b/src/libs/TransactionUtils.ts index 9cce4fd09b98..b2824e47e06c 100644 --- a/src/libs/TransactionUtils.ts +++ b/src/libs/TransactionUtils.ts @@ -524,8 +524,9 @@ function getRecentTransactions(transactions: Record, size = 2): /** * Checks if any violations for the provided transaction are of type 'violation' */ -function hasViolation(transaction: Transaction, transactionViolations: TransactionViolations): boolean { - return Boolean(transactionViolations[ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS + transaction.transactionID]?.some((violation: TransactionViolation) => violation.type === 'violation')); +function hasViolation(transaction: Transaction | string, transactionViolations: TransactionViolations): boolean { + const transactionId = typeof transaction === 'string' ? transaction : transaction.transactionID; + return Boolean(transactionViolations[ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS + transactionId]?.some((violation: TransactionViolation) => violation.type === 'violation')); } function getTransactionViolations({transactionID}: Transaction, transactionViolations: TransactionViolations): TransactionViolation[] | null { From 44229197e06e266e2540f33b8d5c911561044763 Mon Sep 17 00:00:00 2001 From: Lizzi Lindboe Date: Thu, 11 Jan 2024 14:47:23 -0500 Subject: [PATCH 026/288] feat(Violations): prettier --- src/libs/SidebarUtils.ts | 3 ++- src/libs/TransactionUtils.ts | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libs/SidebarUtils.ts b/src/libs/SidebarUtils.ts index 07bc248dd0ed..a58d79a79778 100644 --- a/src/libs/SidebarUtils.ts +++ b/src/libs/SidebarUtils.ts @@ -126,7 +126,8 @@ function getOrderedReportIDs( const reportActionCount = allReportActions?.[reportIDKey]?.length ?? 1; // Generate a unique cache key based on the function arguments - const cachedReportsKey = JSON.stringify([currentReportId, allReports, betas, policies, priorityMode, reportActionCount], + const cachedReportsKey = JSON.stringify( + [currentReportId, allReports, betas, policies, priorityMode, reportActionCount], /** * Exclude some properties not to overwhelm a cached key value with huge data, * which we don't need to store in a cacheKey diff --git a/src/libs/TransactionUtils.ts b/src/libs/TransactionUtils.ts index aedc881528a7..cd75b8eb03e3 100644 --- a/src/libs/TransactionUtils.ts +++ b/src/libs/TransactionUtils.ts @@ -533,7 +533,6 @@ function getTransactionViolations({transactionID}: Transaction, transactionViola return transactionViolations?.[ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS + transactionID] ?? null; } - /** * this is the formulae to calculate tax */ From ec74f831b88083175fa147d3ebb69cea73d4f842 Mon Sep 17 00:00:00 2001 From: Vadym Date: Mon, 15 Jan 2024 02:10:23 +0000 Subject: [PATCH 027/288] chore: migrates reactionPropTypes, BaseReactionList and HeaderReactionList to TS --- ...seReactionList.js => BaseReactionList.tsx} | 53 +++++++++---------- .../report/ReactionList/HeaderReactionList.js | 48 ----------------- .../ReactionList/HeaderReactionList.tsx | 48 +++++++++++++++++ .../report/ReactionList/reactionPropTypes.js | 17 ------ .../report/ReactionList/reactionPropTypes.ts | 13 +++++ 5 files changed, 86 insertions(+), 93 deletions(-) rename src/pages/home/report/ReactionList/{BaseReactionList.js => BaseReactionList.tsx} (69%) delete mode 100644 src/pages/home/report/ReactionList/HeaderReactionList.js create mode 100644 src/pages/home/report/ReactionList/HeaderReactionList.tsx delete mode 100644 src/pages/home/report/ReactionList/reactionPropTypes.js create mode 100644 src/pages/home/report/ReactionList/reactionPropTypes.ts diff --git a/src/pages/home/report/ReactionList/BaseReactionList.js b/src/pages/home/report/ReactionList/BaseReactionList.tsx similarity index 69% rename from src/pages/home/report/ReactionList/BaseReactionList.js rename to src/pages/home/report/ReactionList/BaseReactionList.tsx index 2d881d080c31..82541b28c9c8 100755 --- a/src/pages/home/report/ReactionList/BaseReactionList.js +++ b/src/pages/home/report/ReactionList/BaseReactionList.tsx @@ -1,36 +1,34 @@ /* eslint-disable rulesdir/onyx-props-must-have-default */ import Str from 'expensify-common/lib/str'; -import PropTypes from 'prop-types'; import React from 'react'; -import {FlatList} from 'react-native'; +import {FlatList, type FlatListProps} from 'react-native'; import OptionRow from '@components/OptionRow'; -import participantPropTypes from '@components/participantPropTypes'; -import withWindowDimensions from '@components/withWindowDimensions'; import useThemeStyles from '@hooks/useThemeStyles'; +import useWindowDimensions from '@hooks/useWindowDimensions'; import Navigation from '@libs/Navigation/Navigation'; import * as UserUtils from '@libs/UserUtils'; import variables from '@styles/variables'; import CONST from '@src/CONST'; import ROUTES from '@src/ROUTES'; +import type {PersonalDetails} from '@src/types/onyx'; import HeaderReactionList from './HeaderReactionList'; -import reactionPropTypes from './reactionPropTypes'; +import type {ReactionListProps} from './reactionPropTypes'; -const propTypes = { +type BaseReactionListProps = ReactionListProps & { /** * Array of personal detail objects */ - users: PropTypes.arrayOf(participantPropTypes).isRequired, + users: PersonalDetails[]; /** * Returns true if the current account has reacted to the report action (with the given skin tone). */ - hasUserReacted: PropTypes.bool, + hasUserReacted: boolean; - ...reactionPropTypes, -}; - -const defaultProps = { - hasUserReacted: false, + /** + * Returns true if the reaction list is visible + */ + isVisible: boolean; }; /** @@ -39,7 +37,7 @@ const defaultProps = { * @param {Number} index * @return {String} */ -const keyExtractor = (item, index) => `${item.login}+${index}`; +const keyExtractor: FlatListProps['keyExtractor'] = (item, index) => `${item.login}+${index}`; /** * This function will be used with FlatList getItemLayout property for optimization purpose that allows skipping @@ -51,14 +49,15 @@ const keyExtractor = (item, index) => `${item.login}+${index}`; * @param {Number} index row index * @returns {Object} */ -const getItemLayout = (_, index) => ({ +const getItemLayout = (_: any, index: number): {length: number; offset: number; index: number} => ({ index, length: variables.listItemHeightNormal, offset: variables.listItemHeightNormal * index, }); -function BaseReactionList(props) { - const styles = useThemeStyles(); +function BaseReactionList(props: BaseReactionListProps) { + const {isSmallScreenWidth} = useWindowDimensions(); + const {hoveredComponentBG, reactionListContainer, reactionListContainerFixedWidth, pv2} = useThemeStyles(); if (!props.isVisible) { return null; } @@ -72,25 +71,25 @@ function BaseReactionList(props) { * @param {Object} params.item * @return {React.Component} */ - const renderItem = ({item}) => ( + const renderItem: FlatListProps['renderItem'] = ({item}) => ( { - props.onClose(); + props.onClose && props.onClose(); Navigation.navigate(ROUTES.PROFILE.getRoute(item.accountID)); }} option={{ - text: Str.removeSMSDomain(item.displayName), + reportID: String(item.accountID), + text: Str.removeSMSDomain(item.displayName || ''), alternateText: Str.removeSMSDomain(item.login || ''), participantsList: [item], icons: [ { id: item.accountID, source: UserUtils.getAvatar(item.avatar, item.accountID), - name: item.login, + name: item.login || '', type: CONST.ICON_TYPE_AVATAR, }, ], @@ -113,15 +112,13 @@ function BaseReactionList(props) { renderItem={renderItem} keyExtractor={keyExtractor} getItemLayout={getItemLayout} - contentContainerStyle={styles.pv2} - style={[styles.reactionListContainer, !props.isSmallScreenWidth && styles.reactionListContainerFixedWidth]} + contentContainerStyle={pv2} + style={[reactionListContainer, !isSmallScreenWidth && reactionListContainerFixedWidth]} /> ); } -BaseReactionList.propTypes = propTypes; -BaseReactionList.defaultProps = defaultProps; BaseReactionList.displayName = 'BaseReactionList'; -export default withWindowDimensions(BaseReactionList); +export default BaseReactionList; diff --git a/src/pages/home/report/ReactionList/HeaderReactionList.js b/src/pages/home/report/ReactionList/HeaderReactionList.js deleted file mode 100644 index 04b124f969a9..000000000000 --- a/src/pages/home/report/ReactionList/HeaderReactionList.js +++ /dev/null @@ -1,48 +0,0 @@ -import PropTypes from 'prop-types'; -import React from 'react'; -import {View} from 'react-native'; -import Text from '@components/Text'; -import withLocalize, {withLocalizePropTypes} from '@components/withLocalize'; -import withWindowDimensions, {windowDimensionsPropTypes} from '@components/withWindowDimensions'; -import useStyleUtils from '@hooks/useStyleUtils'; -import useThemeStyles from '@hooks/useThemeStyles'; -import compose from '@libs/compose'; -import * as EmojiUtils from '@libs/EmojiUtils'; -import reactionPropTypes from './reactionPropTypes'; - -const propTypes = { - ...reactionPropTypes, - ...withLocalizePropTypes, - ...windowDimensionsPropTypes, - - /** - * Returns true if the current account has reacted to the report action (with the given skin tone). - */ - hasUserReacted: PropTypes.bool, -}; - -const defaultProps = { - hasUserReacted: false, -}; - -function HeaderReactionList(props) { - const styles = useThemeStyles(); - const StyleUtils = useStyleUtils(); - return ( - - - - {props.emojiCodes.join('')} - {props.emojiCount} - - {`:${EmojiUtils.getLocalizedEmojiName(props.emojiName, props.preferredLocale)}:`} - - - ); -} - -HeaderReactionList.propTypes = propTypes; -HeaderReactionList.defaultProps = defaultProps; -HeaderReactionList.displayName = 'HeaderReactionList'; - -export default compose(withWindowDimensions, withLocalize)(HeaderReactionList); diff --git a/src/pages/home/report/ReactionList/HeaderReactionList.tsx b/src/pages/home/report/ReactionList/HeaderReactionList.tsx new file mode 100644 index 000000000000..551059b697e6 --- /dev/null +++ b/src/pages/home/report/ReactionList/HeaderReactionList.tsx @@ -0,0 +1,48 @@ +import {View} from 'react-native'; +import Text from '@components/Text'; +import useLocalize from '@hooks/useLocalize'; +import useStyleUtils from '@hooks/useStyleUtils'; +import useThemeStyles from '@hooks/useThemeStyles'; +import useWindowDimensions from '@hooks/useWindowDimensions'; +import * as EmojiUtils from '@libs/EmojiUtils'; +import type {ReactionListProps} from './reactionPropTypes'; + +type HeaderReactionListProps = ReactionListProps & { + /** + * Returns true if the current account has reacted to the report action (with the given skin tone). + */ + hasUserReacted: boolean; +}; + +function HeaderReactionList(props: HeaderReactionListProps) { + const { + flexRow, + justifyContentBetween, + alignItemsCenter, + emojiReactionListHeader, + pt4, + emojiReactionListHeaderBubble, + miniQuickEmojiReactionText, + reactionCounterText, + reactionListHeaderText, + } = useThemeStyles(); + const {getEmojiReactionBubbleStyle, getEmojiReactionBubbleTextStyle, getEmojiReactionCounterTextStyle} = useStyleUtils(); + const {preferredLocale} = useLocalize(); + const {isSmallScreenWidth} = useWindowDimensions(); + + return ( + + + + {props.emojiCodes.join('')} + {props.emojiCount} + + {`:${EmojiUtils.getLocalizedEmojiName(props.emojiName, preferredLocale)}:`} + + + ); +} + +HeaderReactionList.displayName = 'HeaderReactionList'; + +export default HeaderReactionList; diff --git a/src/pages/home/report/ReactionList/reactionPropTypes.js b/src/pages/home/report/ReactionList/reactionPropTypes.js deleted file mode 100644 index 3421af230399..000000000000 --- a/src/pages/home/report/ReactionList/reactionPropTypes.js +++ /dev/null @@ -1,17 +0,0 @@ -import PropTypes from 'prop-types'; - -const propTypes = { - /** Hide the ReactionList modal popover */ - onClose: PropTypes.func, - - /** The emoji codes */ - emojiCodes: PropTypes.arrayOf(PropTypes.string).isRequired, - - /** The name of the emoji */ - emojiName: PropTypes.string.isRequired, - - /** Count of the emoji */ - emojiCount: PropTypes.number.isRequired, -}; - -export default propTypes; diff --git a/src/pages/home/report/ReactionList/reactionPropTypes.ts b/src/pages/home/report/ReactionList/reactionPropTypes.ts new file mode 100644 index 000000000000..d88316754600 --- /dev/null +++ b/src/pages/home/report/ReactionList/reactionPropTypes.ts @@ -0,0 +1,13 @@ +export type ReactionListProps = { + /** Hide the ReactionList modal popover */ + onClose?: () => void; + + /** The emoji codes */ + emojiCodes: string[]; + + /** The name of the emoji */ + emojiName: string; + + /** Count of the emoji */ + emojiCount: number; +}; From baaa5a5f2c2b5a1922c4caad957378f081b66583 Mon Sep 17 00:00:00 2001 From: Vadym Date: Tue, 16 Jan 2024 03:11:39 +0100 Subject: [PATCH 028/288] chore: migrates BasePopoverReactionList and ReactionList to TS --- ...ionList.js => BasePopoverReactionList.tsx} | 104 +++++++++++++----- .../ReactionList/PopoverReactionList/index.js | 67 ----------- .../PopoverReactionList/index.tsx | 60 ++++++++++ 3 files changed, 136 insertions(+), 95 deletions(-) rename src/pages/home/report/ReactionList/PopoverReactionList/{BasePopoverReactionList.js => BasePopoverReactionList.tsx} (65%) delete mode 100644 src/pages/home/report/ReactionList/PopoverReactionList/index.js create mode 100644 src/pages/home/report/ReactionList/PopoverReactionList/index.tsx diff --git a/src/pages/home/report/ReactionList/PopoverReactionList/BasePopoverReactionList.js b/src/pages/home/report/ReactionList/PopoverReactionList/BasePopoverReactionList.tsx similarity index 65% rename from src/pages/home/report/ReactionList/PopoverReactionList/BasePopoverReactionList.js rename to src/pages/home/report/ReactionList/PopoverReactionList/BasePopoverReactionList.tsx index a06ed18de957..8f532253fc43 100644 --- a/src/pages/home/report/ReactionList/PopoverReactionList/BasePopoverReactionList.js +++ b/src/pages/home/report/ReactionList/PopoverReactionList/BasePopoverReactionList.tsx @@ -1,36 +1,63 @@ import lodashGet from 'lodash/get'; -import PropTypes from 'prop-types'; import React from 'react'; import {Dimensions} from 'react-native'; import {withOnyx} from 'react-native-onyx'; +import type {OnyxEntry} from 'react-native-onyx'; import _ from 'underscore'; import PopoverWithMeasuredContent from '@components/PopoverWithMeasuredContent'; -import EmojiReactionsPropTypes from '@components/Reactions/EmojiReactionsPropTypes'; -import withCurrentUserPersonalDetails from '@components/withCurrentUserPersonalDetails'; -import withLocalize, {withLocalizePropTypes} from '@components/withLocalize'; +import withCurrentUserPersonalDetails, {type WithCurrentUserPersonalDetailsProps} from '@components/withCurrentUserPersonalDetails'; +import withLocalize, {type WithLocalizeProps} from '@components/withLocalize'; import compose from '@libs/compose'; import * as EmojiUtils from '@libs/EmojiUtils'; import * as PersonalDetailsUtils from '@libs/PersonalDetailsUtils'; import BaseReactionList from '@pages/home/report/ReactionList/BaseReactionList'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; +import type {ReportActionReactions} from '@src/types/onyx'; +import {ReportActionReaction} from '@src/types/onyx/ReportActionReactions'; -const propTypes = { - reportActionID: PropTypes.string, - emojiName: PropTypes.string, - emojiReactions: EmojiReactionsPropTypes, +type BasePopoverReactionListOnyxProps = { + /** The reactions for the report action */ + emojiReactions: OnyxEntry; +}; + +type BasePopoverReactionListProps = { + /** The ID of the report action */ + reportActionID: string; + + /** The emoji name */ + emojiName: string; - ...withLocalizePropTypes, + /** The ref of the action */ + ref: React.Ref; }; -const defaultProps = { - reportActionID: '', - emojiName: '', - emojiReactions: {}, +type BasePopoverReactionListWithLocalizeProps = WithLocalizeProps & WithCurrentUserPersonalDetailsProps; + +type BasePopoverReactionListPropsWithLocalWithOnyx = BasePopoverReactionListWithLocalizeProps & BasePopoverReactionListOnyxProps & BasePopoverReactionListProps; +type BasePopoverReactionListState = { + /** Whether the popover is visible */ + isPopoverVisible: boolean; + + /** The horizontal and vertical position (relative to the screen) where the popover will display. */ + popoverAnchorPosition: { + horizontal: number; + vertical: number; + }; + + /** The horizontal and vertical position (relative to the screen) where the cursor is. */ + cursorRelativePosition: { + horizontal: number; + vertical: number; + }; }; -class BasePopoverReactionList extends React.Component { - constructor(props) { +class BasePopoverReactionList extends React.Component { + reactionListAnchor: React.RefObject; + dimensionsEventListener: { + remove: () => void; + } | null; + constructor(props: BasePopoverReactionListPropsWithLocalWithOnyx) { super(props); this.state = { @@ -60,8 +87,9 @@ class BasePopoverReactionList extends React.Component { this.dimensionsEventListener = Dimensions.addEventListener('change', this.measureReactionListPosition); } - shouldComponentUpdate(nextProps, nextState) { + shouldComponentUpdate(nextProps: BasePopoverReactionListPropsWithLocalWithOnyx, nextState: BasePopoverReactionListState) { if (!this.state.isPopoverVisible && !nextState.isPopoverVisible) { + // If the popover is not visible, we don't need to update the component return false; } @@ -81,11 +109,13 @@ class BasePopoverReactionList extends React.Component { componentDidUpdate() { if (!this.state.isPopoverVisible) { + // If the popover is not visible, we don't need to update the component return; } // Hide the list when all reactions are removed - const isEmptyList = !_.some(lodashGet(this.props.emojiReactions, [this.props.emojiName, 'users'])); + const emojiReactions = lodashGet(this.props.emojiReactions, [this.props.emojiName, 'users']); + const isEmptyList = !emojiReactions || !_.some(emojiReactions); if (!isEmptyList) { return; } @@ -94,6 +124,7 @@ class BasePopoverReactionList extends React.Component { } componentWillUnmount() { + // Remove the event listener if (!this.dimensionsEventListener) { return; } @@ -106,11 +137,13 @@ class BasePopoverReactionList extends React.Component { * * @returns {Promise} */ - getReactionListMeasuredLocation() { + getReactionListMeasuredLocation(): Promise<{x: number; y: number}> { return new Promise((resolve) => { - if (this.reactionListAnchor.current) { - this.reactionListAnchor.current.measureInWindow((x, y) => resolve({x, y})); + const reactionListAnchor = this.reactionListAnchor.current as HTMLElement & {measureInWindow: (callback: (x: number, y: number) => void) => void}; + if (reactionListAnchor) { + reactionListAnchor.measureInWindow((x, y) => resolve({x, y})); } else { + // If the anchor is not available, we return 0, 0 resolve({x: 0, y: 0}); } }); @@ -123,8 +156,9 @@ class BasePopoverReactionList extends React.Component { * @param {String} emojiName * @returns {Object} */ - getReactionInformation(selectedReaction, emojiName) { + getReactionInformation(selectedReaction: ReportActionReaction | null | undefined, emojiName: string) { if (!selectedReaction) { + // If there is no reaction, we return default values return { emojiName: '', reactionCount: 0, @@ -152,9 +186,18 @@ class BasePopoverReactionList extends React.Component { * @param {Object} [event] - A press event. * @param {Element} reactionListAnchor - reactionListAnchor */ - showReactionList(event, reactionListAnchor) { + showReactionList( + event: { + nativeEvent: { + pageX: number; + pageY: number; + }; + }, + reactionListAnchor: HTMLElement, + ) { + // We get the cursor coordinates and the reactionListAnchor coordinates to calculate the popover position const nativeEvent = event.nativeEvent || {}; - this.reactionListAnchor.current = reactionListAnchor; + this.reactionListAnchor = {current: reactionListAnchor}; this.getReactionListMeasuredLocation().then(({x, y}) => { this.setState({ cursorRelativePosition: { @@ -175,6 +218,7 @@ class BasePopoverReactionList extends React.Component { */ measureReactionListPosition() { if (!this.state.isPopoverVisible) { + // If the popover is not visible, we don't need to update the component return; } this.getReactionListMeasuredLocation().then(({x, y}) => { @@ -200,7 +244,10 @@ class BasePopoverReactionList extends React.Component { } render() { + // Get the selected reaction const selectedReaction = this.state.isPopoverVisible ? lodashGet(this.props.emojiReactions, [this.props.emojiName]) : null; + + // Get the reaction information const {emojiName, emojiCodes, reactionCount, hasUserReacted, users} = this.getReactionInformation(selectedReaction, this.props.emojiName); return ( @@ -215,9 +262,12 @@ class BasePopoverReactionList extends React.Component { fullscreen withoutOverlay anchorRef={this.reactionListAnchor} + anchorAlignment={{ + horizontal: 'left', + vertical: 'top', + }} > ({ emojiReactions: { key: ({reportActionID}) => `${ONYXKEYS.COLLECTION.REPORT_ACTIONS_REACTIONS}${reportActionID}`, }, diff --git a/src/pages/home/report/ReactionList/PopoverReactionList/index.js b/src/pages/home/report/ReactionList/PopoverReactionList/index.js deleted file mode 100644 index 9f1e7b3113fc..000000000000 --- a/src/pages/home/report/ReactionList/PopoverReactionList/index.js +++ /dev/null @@ -1,67 +0,0 @@ -import PropTypes from 'prop-types'; -import React, {forwardRef, useImperativeHandle, useRef, useState} from 'react'; -import BasePopoverReactionList from './BasePopoverReactionList'; - -const propTypes = { - innerRef: PropTypes.oneOfType([PropTypes.func, PropTypes.object]), -}; - -const defaultProps = { - innerRef: () => {}, -}; - -function PopoverReactionList(props) { - const innerReactionListRef = useRef(); - const [reactionListReportActionID, setReactionListReportActionID] = useState(''); - const [reactionListEmojiName, setReactionListEmojiName] = useState(''); - - /** - * Show the ReactionList modal popover. - * - * @param {Object} [event] - A press event. - * @param {Element} reactionListAnchor - reactionListAnchor - * @param {String} emojiName - Name of emoji - * @param {String} reportActionID - ID of the report action - */ - const showReactionList = (event, reactionListAnchor, emojiName, reportActionID) => { - setReactionListReportActionID(reportActionID); - setReactionListEmojiName(emojiName); - innerReactionListRef.current.showReactionList(event, reactionListAnchor); - }; - - const hideReactionList = () => { - innerReactionListRef.current.hideReactionList(); - }; - - /** - * Whether PopoverReactionList is active for the Report Action. - * - * @param {Number|String} actionID - * @return {Boolean} - */ - const isActiveReportAction = (actionID) => Boolean(actionID) && reactionListReportActionID === actionID; - - useImperativeHandle(props.innerRef, () => ({showReactionList, hideReactionList, isActiveReportAction})); - - return ( - - ); -} - -PopoverReactionList.propTypes = propTypes; -PopoverReactionList.defaultProps = defaultProps; -PopoverReactionList.displayName = 'PopoverReactionList'; - -export default React.memo( - forwardRef((props, ref) => ( - - )), -); diff --git a/src/pages/home/report/ReactionList/PopoverReactionList/index.tsx b/src/pages/home/report/ReactionList/PopoverReactionList/index.tsx new file mode 100644 index 000000000000..e4a7aa42791b --- /dev/null +++ b/src/pages/home/report/ReactionList/PopoverReactionList/index.tsx @@ -0,0 +1,60 @@ +import React, {forwardRef, Ref, useImperativeHandle, useRef, useState} from 'react'; +import BasePopoverReactionList from './BasePopoverReactionList'; + +type PopoverReactionListProps = { + innerRef: Ref; +}; + +type InnerReactionListRefType = { + showReactionList: ( + event: { + nativeEvent: { + pageX: number; + pageY: number; + }; + }, + reactionListAnchor: HTMLElement, + ) => void; + hideReactionList: () => void; + isActiveReportAction: (actionID: number | string) => boolean; +}; + +const PopoverReactionList = (props: PopoverReactionListProps) => { + const innerReactionListRef = useRef(null); + const [reactionListReportActionID, setReactionListReportActionID] = useState(''); + const [reactionListEmojiName, setReactionListEmojiName] = useState(''); + + const showReactionList = (event: React.MouseEvent, reactionListAnchor: HTMLElement, emojiName: string, reportActionID: string) => { + setReactionListReportActionID(reportActionID); + setReactionListEmojiName(emojiName); + innerReactionListRef.current?.showReactionList(event, reactionListAnchor); + }; + + const hideReactionList = () => { + innerReactionListRef.current?.hideReactionList(); + }; + + const isActiveReportAction = (actionID: number | string) => Boolean(actionID) && reactionListReportActionID === actionID; + + useImperativeHandle(props.innerRef, () => ({showReactionList, hideReactionList, isActiveReportAction})); + + return ( + + ); +}; + +PopoverReactionList.displayName = 'PopoverReactionList'; + +export default React.memo( + forwardRef((props, ref) => ( + + )), +); From 28dfadc15e19eb23a9c361e336c698c4da4bf586 Mon Sep 17 00:00:00 2001 From: vadymbokatov <138146362+vadymbokatov@users.noreply.github.com> Date: Tue, 16 Jan 2024 10:07:10 +0100 Subject: [PATCH 029/288] Update src/pages/home/report/ReactionList/HeaderReactionList.tsx MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Błażej Kustra <46095609+blazejkustra@users.noreply.github.com> --- src/pages/home/report/ReactionList/HeaderReactionList.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/pages/home/report/ReactionList/HeaderReactionList.tsx b/src/pages/home/report/ReactionList/HeaderReactionList.tsx index 551059b697e6..869dd95baf1e 100644 --- a/src/pages/home/report/ReactionList/HeaderReactionList.tsx +++ b/src/pages/home/report/ReactionList/HeaderReactionList.tsx @@ -8,9 +8,7 @@ import * as EmojiUtils from '@libs/EmojiUtils'; import type {ReactionListProps} from './reactionPropTypes'; type HeaderReactionListProps = ReactionListProps & { - /** - * Returns true if the current account has reacted to the report action (with the given skin tone). - */ + /** Returns true if the current account has reacted to the report action (with the given skin tone). */ hasUserReacted: boolean; }; From 952c5232776b082eecb746119bf0e5b3e399eac3 Mon Sep 17 00:00:00 2001 From: Vadym Date: Tue, 16 Jan 2024 15:14:47 +0100 Subject: [PATCH 030/288] chore: renames the types file and fixes its linting errors --- src/pages/home/report/ReactionList/BaseReactionList.tsx | 2 +- src/pages/home/report/ReactionList/HeaderReactionList.tsx | 2 +- .../report/ReactionList/{reactionPropTypes.ts => types.ts} | 4 +++- 3 files changed, 5 insertions(+), 3 deletions(-) rename src/pages/home/report/ReactionList/{reactionPropTypes.ts => types.ts} (79%) diff --git a/src/pages/home/report/ReactionList/BaseReactionList.tsx b/src/pages/home/report/ReactionList/BaseReactionList.tsx index 82541b28c9c8..5d41d2f6656f 100755 --- a/src/pages/home/report/ReactionList/BaseReactionList.tsx +++ b/src/pages/home/report/ReactionList/BaseReactionList.tsx @@ -12,7 +12,7 @@ import CONST from '@src/CONST'; import ROUTES from '@src/ROUTES'; import type {PersonalDetails} from '@src/types/onyx'; import HeaderReactionList from './HeaderReactionList'; -import type {ReactionListProps} from './reactionPropTypes'; +import type {ReactionListProps} from './types'; type BaseReactionListProps = ReactionListProps & { /** diff --git a/src/pages/home/report/ReactionList/HeaderReactionList.tsx b/src/pages/home/report/ReactionList/HeaderReactionList.tsx index 869dd95baf1e..e715f6010fc3 100644 --- a/src/pages/home/report/ReactionList/HeaderReactionList.tsx +++ b/src/pages/home/report/ReactionList/HeaderReactionList.tsx @@ -5,7 +5,7 @@ import useStyleUtils from '@hooks/useStyleUtils'; import useThemeStyles from '@hooks/useThemeStyles'; import useWindowDimensions from '@hooks/useWindowDimensions'; import * as EmojiUtils from '@libs/EmojiUtils'; -import type {ReactionListProps} from './reactionPropTypes'; +import type {ReactionListProps} from './types'; type HeaderReactionListProps = ReactionListProps & { /** Returns true if the current account has reacted to the report action (with the given skin tone). */ diff --git a/src/pages/home/report/ReactionList/reactionPropTypes.ts b/src/pages/home/report/ReactionList/types.ts similarity index 79% rename from src/pages/home/report/ReactionList/reactionPropTypes.ts rename to src/pages/home/report/ReactionList/types.ts index d88316754600..ec03b141080d 100644 --- a/src/pages/home/report/ReactionList/reactionPropTypes.ts +++ b/src/pages/home/report/ReactionList/types.ts @@ -1,4 +1,4 @@ -export type ReactionListProps = { +type ReactionListProps = { /** Hide the ReactionList modal popover */ onClose?: () => void; @@ -11,3 +11,5 @@ export type ReactionListProps = { /** Count of the emoji */ emojiCount: number; }; + +export type {ReactionListProps}; From efe9d72aaa7f9079b0657c66619ebdfbd857b194 Mon Sep 17 00:00:00 2001 From: Vadym Date: Tue, 16 Jan 2024 16:52:08 +0100 Subject: [PATCH 031/288] chore: removes any typed and fixes linting errors on the index file --- .../BasePopoverReactionList.tsx | 2 ++ .../PopoverReactionList/index.tsx | 31 ++++++++----------- 2 files changed, 15 insertions(+), 18 deletions(-) diff --git a/src/pages/home/report/ReactionList/PopoverReactionList/BasePopoverReactionList.tsx b/src/pages/home/report/ReactionList/PopoverReactionList/BasePopoverReactionList.tsx index 8f532253fc43..f2c226d7856a 100644 --- a/src/pages/home/report/ReactionList/PopoverReactionList/BasePopoverReactionList.tsx +++ b/src/pages/home/report/ReactionList/PopoverReactionList/BasePopoverReactionList.tsx @@ -54,9 +54,11 @@ type BasePopoverReactionListState = { class BasePopoverReactionList extends React.Component { reactionListAnchor: React.RefObject; + dimensionsEventListener: { remove: () => void; } | null; + constructor(props: BasePopoverReactionListPropsWithLocalWithOnyx) { super(props); diff --git a/src/pages/home/report/ReactionList/PopoverReactionList/index.tsx b/src/pages/home/report/ReactionList/PopoverReactionList/index.tsx index e4a7aa42791b..8ac89cef6656 100644 --- a/src/pages/home/report/ReactionList/PopoverReactionList/index.tsx +++ b/src/pages/home/report/ReactionList/PopoverReactionList/index.tsx @@ -1,33 +1,28 @@ -import React, {forwardRef, Ref, useImperativeHandle, useRef, useState} from 'react'; +import React, {forwardRef, useImperativeHandle, useRef, useState} from 'react'; +import type {ForwardedRef} from 'react'; import BasePopoverReactionList from './BasePopoverReactionList'; type PopoverReactionListProps = { - innerRef: Ref; + ref: ForwardedRef; }; +type ShowReactionList = (event: React.MouseEvent, reactionListAnchor: HTMLElement, emojiName: string, reportActionID: string) => void; + type InnerReactionListRefType = { - showReactionList: ( - event: { - nativeEvent: { - pageX: number; - pageY: number; - }; - }, - reactionListAnchor: HTMLElement, - ) => void; + showReactionList: ShowReactionList; hideReactionList: () => void; isActiveReportAction: (actionID: number | string) => boolean; }; -const PopoverReactionList = (props: PopoverReactionListProps) => { +function PopoverReactionList(props: PopoverReactionListProps) { const innerReactionListRef = useRef(null); const [reactionListReportActionID, setReactionListReportActionID] = useState(''); const [reactionListEmojiName, setReactionListEmojiName] = useState(''); - const showReactionList = (event: React.MouseEvent, reactionListAnchor: HTMLElement, emojiName: string, reportActionID: string) => { + const showReactionList: ShowReactionList = (event, reactionListAnchor, emojiName, reportActionID) => { setReactionListReportActionID(reportActionID); setReactionListEmojiName(emojiName); - innerReactionListRef.current?.showReactionList(event, reactionListAnchor); + innerReactionListRef.current?.showReactionList(event, reactionListAnchor, emojiName, reportActionID); }; const hideReactionList = () => { @@ -36,7 +31,7 @@ const PopoverReactionList = (props: PopoverReactionListProps) => { const isActiveReportAction = (actionID: number | string) => Boolean(actionID) && reactionListReportActionID === actionID; - useImperativeHandle(props.innerRef, () => ({showReactionList, hideReactionList, isActiveReportAction})); + useImperativeHandle(props.ref, () => ({showReactionList, hideReactionList, isActiveReportAction})); return ( { emojiName={reactionListEmojiName} /> ); -}; +} PopoverReactionList.displayName = 'PopoverReactionList'; export default React.memo( - forwardRef((props, ref) => ( + forwardRef((props, ref) => ( )), ); From a303a5e6f55cef79a27cc54eec24d650b4e20bdb Mon Sep 17 00:00:00 2001 From: Vadym Date: Tue, 16 Jan 2024 17:22:07 +0100 Subject: [PATCH 032/288] fix: some linting errors and any types --- .../report/ReactionList/BaseReactionList.tsx | 36 ++++++++++--------- .../BasePopoverReactionList.tsx | 10 +++--- 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/src/pages/home/report/ReactionList/BaseReactionList.tsx b/src/pages/home/report/ReactionList/BaseReactionList.tsx index 5d41d2f6656f..80cbc834f344 100755 --- a/src/pages/home/report/ReactionList/BaseReactionList.tsx +++ b/src/pages/home/report/ReactionList/BaseReactionList.tsx @@ -1,7 +1,8 @@ /* eslint-disable rulesdir/onyx-props-must-have-default */ import Str from 'expensify-common/lib/str'; import React from 'react'; -import {FlatList, type FlatListProps} from 'react-native'; +import {FlatList} from 'react-native'; +import type {FlatListProps} from 'react-native'; import OptionRow from '@components/OptionRow'; import useThemeStyles from '@hooks/useThemeStyles'; import useWindowDimensions from '@hooks/useWindowDimensions'; @@ -33,9 +34,9 @@ type BaseReactionListProps = ReactionListProps & { /** * Create a unique key for each action in the FlatList. - * @param {Object} item - * @param {Number} index - * @return {String} + * @param item object + * @param index number + * @return string */ const keyExtractor: FlatListProps['keyExtractor'] = (item, index) => `${item.login}+${index}`; @@ -45,11 +46,11 @@ const keyExtractor: FlatListProps['keyExtractor'] = (item, inde * Generate and return an object with properties length(height of each individual row), * offset(distance of the current row from the top of the FlatList), index(current row index) * - * @param {*} _ FlatList item - * @param {Number} index row index - * @returns {Object} + * @param data FlatList item + * @param index number - row index + * @returns object */ -const getItemLayout = (_: any, index: number): {length: number; offset: number; index: number} => ({ +const getItemLayout = (data: ArrayLike | null | undefined, index: number): {length: number; offset: number; index: number} => ({ index, length: variables.listItemHeightNormal, offset: variables.listItemHeightNormal * index, @@ -67,9 +68,9 @@ function BaseReactionList(props: BaseReactionListProps) { * Items with the code "SPACER" return nothing and are used to fill rows up to 8 * so that the sticky headers function properly * - * @param {Object} params - * @param {Object} params.item - * @return {React.Component} + * @param params object + * @param params.item object + * @return React.Component */ const renderItem: FlatListProps['renderItem'] = ({item}) => ( { - props.onClose && props.onClose(); + if (props.onClose) { + props.onClose(); + } + Navigation.navigate(ROUTES.PROFILE.getRoute(item.accountID)); }} option={{ reportID: String(item.accountID), - text: Str.removeSMSDomain(item.displayName || ''), - alternateText: Str.removeSMSDomain(item.login || ''), + text: Str.removeSMSDomain(item.displayName ?? ''), + alternateText: Str.removeSMSDomain(item.login ?? ''), participantsList: [item], icons: [ { id: item.accountID, source: UserUtils.getAvatar(item.avatar, item.accountID), - name: item.login || '', + name: item.login ?? '', type: CONST.ICON_TYPE_AVATAR, }, ], - keyForList: item.login || String(item.accountID), + keyForList: item.login ?? String(item.accountID), }} /> ); diff --git a/src/pages/home/report/ReactionList/PopoverReactionList/BasePopoverReactionList.tsx b/src/pages/home/report/ReactionList/PopoverReactionList/BasePopoverReactionList.tsx index f2c226d7856a..4bee2e8d1d3c 100644 --- a/src/pages/home/report/ReactionList/PopoverReactionList/BasePopoverReactionList.tsx +++ b/src/pages/home/report/ReactionList/PopoverReactionList/BasePopoverReactionList.tsx @@ -5,8 +5,10 @@ import {withOnyx} from 'react-native-onyx'; import type {OnyxEntry} from 'react-native-onyx'; import _ from 'underscore'; import PopoverWithMeasuredContent from '@components/PopoverWithMeasuredContent'; -import withCurrentUserPersonalDetails, {type WithCurrentUserPersonalDetailsProps} from '@components/withCurrentUserPersonalDetails'; -import withLocalize, {type WithLocalizeProps} from '@components/withLocalize'; +import withCurrentUserPersonalDetails from '@components/withCurrentUserPersonalDetails'; +import type {WithCurrentUserPersonalDetailsProps} from '@components/withCurrentUserPersonalDetails'; +import withLocalize from '@components/withLocalize'; +import type {WithLocalizeProps} from '@components/withLocalize'; import compose from '@libs/compose'; import * as EmojiUtils from '@libs/EmojiUtils'; import * as PersonalDetailsUtils from '@libs/PersonalDetailsUtils'; @@ -14,7 +16,7 @@ import BaseReactionList from '@pages/home/report/ReactionList/BaseReactionList'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import type {ReportActionReactions} from '@src/types/onyx'; -import {ReportActionReaction} from '@src/types/onyx/ReportActionReactions'; +import type {ReportActionReaction} from '@src/types/onyx/ReportActionReactions'; type BasePopoverReactionListOnyxProps = { /** The reactions for the report action */ @@ -29,7 +31,7 @@ type BasePopoverReactionListProps = { emojiName: string; /** The ref of the action */ - ref: React.Ref; + ref: React.Ref; }; type BasePopoverReactionListWithLocalizeProps = WithLocalizeProps & WithCurrentUserPersonalDetailsProps; From f7518085c7c7dc5d35879ba6e726b3e090c193bf Mon Sep 17 00:00:00 2001 From: cdOut <88325488+cdOut@users.noreply.github.com> Date: Wed, 17 Jan 2024 12:05:58 +0100 Subject: [PATCH 033/288] feat: add implementation for educational interstitial --- src/ONYXKEYS.ts | 4 +++ src/components/MoneyRequestHeader.js | 41 +++++++++++++++++++++++- src/libs/actions/IOU.js | 5 +++ src/pages/ProcessMoneyRequestHoldPage.js | 3 +- 4 files changed, 51 insertions(+), 2 deletions(-) diff --git a/src/ONYXKEYS.ts b/src/ONYXKEYS.ts index 89ddbdc06883..8eaa78a41521 100755 --- a/src/ONYXKEYS.ts +++ b/src/ONYXKEYS.ts @@ -155,6 +155,9 @@ const ONYXKEYS = { /** Whether the user has tried focus mode yet */ NVP_TRY_FOCUS_MODE: 'tryFocusMode', + /** Whether the user has been shown the hold educational interstitial yet */ + NVP_HOLD_USE_EXPLAINED: 'holdUseExplained', + /** Boolean flag used to display the focus mode notification */ FOCUS_MODE_NOTIFICATION: 'focusModeNotification', @@ -390,6 +393,7 @@ type OnyxValues = { [ONYXKEYS.NVP_BLOCKED_FROM_CONCIERGE]: OnyxTypes.BlockedFromConcierge; [ONYXKEYS.NVP_PRIVATE_PUSH_NOTIFICATION_ID]: string; [ONYXKEYS.NVP_TRY_FOCUS_MODE]: boolean; + [ONYXKEYS.NVP_HOLD_USE_EXPLAINED]: boolean; [ONYXKEYS.FOCUS_MODE_NOTIFICATION]: boolean; [ONYXKEYS.NVP_LAST_PAYMENT_METHOD]: Record; [ONYXKEYS.NVP_RECENT_WAYPOINTS]: OnyxTypes.RecentWaypoint[]; diff --git a/src/components/MoneyRequestHeader.js b/src/components/MoneyRequestHeader.js index 5f889d78a5ef..4e69c9414a92 100644 --- a/src/components/MoneyRequestHeader.js +++ b/src/components/MoneyRequestHeader.js @@ -24,6 +24,7 @@ import HoldBanner from './HoldBanner'; import * as Expensicons from './Icon/Expensicons'; import MoneyRequestHeaderStatusBar from './MoneyRequestHeaderStatusBar'; import participantPropTypes from './participantPropTypes'; +import ProcessMoneyRequestHoldMenu from './ProcessMoneyRequestHoldMenu'; import transactionPropTypes from './transactionPropTypes'; const propTypes = { @@ -54,6 +55,8 @@ const propTypes = { /** All the data for the transaction */ transaction: transactionPropTypes, + + shownHoldUseExplaination: PropTypes.bool, }; const defaultProps = { @@ -63,10 +66,11 @@ const defaultProps = { parentReport: {}, parentReportAction: {}, transaction: {}, + shownHoldUseExplaination: true, policy: {}, }; -function MoneyRequestHeader({session, parentReport, report, parentReportAction, transaction, policy, personalDetails}) { +function MoneyRequestHeader({session, parentReport, report, parentReportAction, transaction, shownHoldUseExplaination, policy, personalDetails}) { const styles = useThemeStyles(); const {translate} = useLocalize(); const [isDeleteModalVisible, setIsDeleteModalVisible] = useState(false); @@ -136,6 +140,30 @@ function MoneyRequestHeader({session, parentReport, report, parentReportAction, } } + const [shouldShowHoldMenu, setShouldShowHoldMenu] = useState(false); + + useEffect(() => { + setShouldShowHoldMenu(isOnHold && !shownHoldUseExplaination); + }, [isOnHold, shownHoldUseExplaination]); + + // eslint-disable-next-line rulesdir/prefer-early-return + useEffect(() => { + if (shouldShowHoldMenu) { + if (isSmallScreenWidth) { + if (Navigation.getActiveRoute().slice(1) === ROUTES.PROCESS_MONEY_REQUEST_HOLD) { + Navigation.goBack(); + } + } else { + Navigation.navigate(ROUTES.PROCESS_MONEY_REQUEST_HOLD); + } + } + }, [isSmallScreenWidth, shouldShowHoldMenu]); + + const handleHoldRequestClose = () => { + setShouldShowHoldMenu(false); + IOU.setShownHoldUseExplaination(); + }; + if (canModifyRequest) { if (!TransactionUtils.hasReceipt(transaction)) { threeDotsMenuItems.push({ @@ -196,6 +224,13 @@ function MoneyRequestHeader({session, parentReport, report, parentReportAction, cancelText={translate('common.cancel')} danger /> + {isSmallScreenWidth && shouldShowHoldMenu && ( + + )} ); } @@ -225,5 +260,9 @@ export default compose( return `${ONYXKEYS.COLLECTION.TRANSACTION}${lodashGet(parentReportAction, 'originalMessage.IOUTransactionID', 0)}`; }, }, + shownHoldUseExplaination: { + key: ONYXKEYS.NVP_HOLD_USE_EXPLAINED, + initWithStoredValues: false, + }, }), )(MoneyRequestHeader); diff --git a/src/libs/actions/IOU.js b/src/libs/actions/IOU.js index db60b0a30cb1..c5fc3b1e37de 100644 --- a/src/libs/actions/IOU.js +++ b/src/libs/actions/IOU.js @@ -3484,6 +3484,10 @@ function setMoneyRequestReceipt(receiptPath, receiptFilename) { Onyx.merge(ONYXKEYS.IOU, {receiptPath, receiptFilename, merchant: ''}); } +function setShownHoldUseExplaination() { + Onyx.set(ONYXKEYS.NVP_HOLD_USE_EXPLAINED, true); +} + function setUpDistanceTransaction() { const transactionID = NumberUtils.rand64(); Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, { @@ -3725,6 +3729,7 @@ export { setMoneyRequestTaxAmount, setMoneyRequestTaxRate, setUpDistanceTransaction, + setShownHoldUseExplaination, navigateToNextPage, updateMoneyRequestDate, updateMoneyRequestMerchant, diff --git a/src/pages/ProcessMoneyRequestHoldPage.js b/src/pages/ProcessMoneyRequestHoldPage.js index c9de16f874a2..2e2340b9ec78 100644 --- a/src/pages/ProcessMoneyRequestHoldPage.js +++ b/src/pages/ProcessMoneyRequestHoldPage.js @@ -8,13 +8,14 @@ import TextPill from '@components/TextPill'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; import Navigation from '@libs/Navigation/Navigation'; +import * as IOU from '@userActions/IOU'; function ProcessMoneyRequestHoldPage() { const styles = useThemeStyles(); const {translate} = useLocalize(); const onConfirm = useCallback(() => { - // Currently only goes back, this will be changed after backends for hold will be merged + IOU.setShownHoldUseExplaination(); Navigation.goBack(); }, []); From e77b28d9e1083f24594e26be0700135098f380ac Mon Sep 17 00:00:00 2001 From: cdOut <88325488+cdOut@users.noreply.github.com> Date: Wed, 17 Jan 2024 12:13:36 +0100 Subject: [PATCH 034/288] fix: add correct spanish translations --- src/languages/es.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/languages/es.ts b/src/languages/es.ts index 06c764fc4449..3474f5d7167b 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -643,19 +643,19 @@ export default { }, waitingOnEnabledWallet: ({submitterDisplayName}: WaitingOnBankAccountParams) => `Inició el pago, pero no se procesará hasta que ${submitterDisplayName} active su Billetera`, enableWallet: 'Habilitar Billetera', - holdRequest: 'Solicitud de retención', - unholdRequest: 'Solicitud de cancelación de retención', - explainHold: 'Explique por qué mantiene esta solicitud.', + holdRequest: 'Retener Pedido', + unholdRequest: 'Cancelar Retención', + explainHold: 'Explica la razón para retener este pedido.', reason: 'Razón', - holdReasonRequired: 'Se requiere una razón al sostener.', - requestOnHold: 'Esta solicitud quedó en suspenso. Revise los comentarios para los próximos pasos.', + holdReasonRequired: 'Se requiere una razón para retener.', + requestOnHold: 'Este pedido está en retener. Revise los comentarios para los próximos pasos.', confirmApprove: 'Confirmar qué aprobar', confirmApprovalAmount: 'Aprobar el total del informe completo o solo el monto no retenido.', confirmPay: 'Confirmar que pagar', confirmPayAmount: 'Pague todos los gastos de bolsillo o solo el monto no retenido.', - payOnly: 'Paga solo', - approveOnly: 'Aprobar sólo', - hold: 'Hold', + payOnly: 'Solo pagar', + approveOnly: 'Solo aprobar', + hold: 'Retención', holdEducationalTitle: 'Esta solicitud está en', whatIsHoldTitle: '¿Qué es Hold?', whatIsHoldExplain: 'Hold es nuestra forma de agilizar la colaboración financiera. ¡"Rechazar" es tan duro!', From bc0a36a17f0080492ff63db5ec49b8a94de6467a Mon Sep 17 00:00:00 2001 From: Filip Solecki Date: Wed, 17 Jan 2024 17:01:05 +0100 Subject: [PATCH 035/288] ValuePicker migration --- ...electorModal.js => ValueSelectorModal.tsx} | 53 ++------ src/components/ValuePicker/index.js | 119 ------------------ src/components/ValuePicker/index.tsx | 64 ++++++++++ src/components/ValuePicker/types.ts | 58 +++++++++ 4 files changed, 135 insertions(+), 159 deletions(-) rename src/components/ValuePicker/{ValueSelectorModal.js => ValueSelectorModal.tsx} (51%) delete mode 100644 src/components/ValuePicker/index.js create mode 100644 src/components/ValuePicker/index.tsx create mode 100644 src/components/ValuePicker/types.ts diff --git a/src/components/ValuePicker/ValueSelectorModal.js b/src/components/ValuePicker/ValueSelectorModal.tsx similarity index 51% rename from src/components/ValuePicker/ValueSelectorModal.js rename to src/components/ValuePicker/ValueSelectorModal.tsx index e45ba873d8a3..61588b9f8e37 100644 --- a/src/components/ValuePicker/ValueSelectorModal.js +++ b/src/components/ValuePicker/ValueSelectorModal.tsx @@ -1,5 +1,3 @@ -import _ from 'lodash'; -import PropTypes from 'prop-types'; import React, {useEffect, useState} from 'react'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; import Modal from '@components/Modal'; @@ -7,45 +5,22 @@ import ScreenWrapper from '@components/ScreenWrapper'; import SelectionList from '@components/SelectionList'; import useThemeStyles from '@hooks/useThemeStyles'; import CONST from '@src/CONST'; +import type {ValuePickerItem, ValueSelectorModalProps} from './types'; -const propTypes = { - /** Whether the modal is visible */ - isVisible: PropTypes.bool.isRequired, - - /** Items to pick from */ - items: PropTypes.arrayOf(PropTypes.shape({value: PropTypes.string, label: PropTypes.string})), - - /** The selected item */ - selectedItem: PropTypes.shape({value: PropTypes.string, label: PropTypes.string}), - - /** Label for values */ - label: PropTypes.string, - - /** Function to call when the user selects a item */ - onItemSelected: PropTypes.func, - - /** Function to call when the user closes the modal */ - onClose: PropTypes.func, - - /** Whether to show the toolip text */ - shouldShowTooltips: PropTypes.bool, -}; - -const defaultProps = { - items: [], - selectedItem: {}, - label: '', - onClose: () => {}, - onItemSelected: () => {}, - shouldShowTooltips: true, -}; - -function ValueSelectorModal({items, selectedItem, label, isVisible, onClose, onItemSelected, shouldShowTooltips}) { +function ValueSelectorModal({items = [], selectedItem, label = '', isVisible, onClose, onItemSelected, shouldShowTooltips}: ValueSelectorModalProps) { const styles = useThemeStyles(); - const [sectionsData, setSectionsData] = useState([]); + const [sectionsData, setSectionsData] = useState([]); useEffect(() => { - const itemsData = _.map(items, (item) => ({value: item.value, alternateText: item.description, keyForList: item.value, text: item.label, isSelected: item === selectedItem})); + const itemsData = items.map((item, index) => ({ + value: item?.value, + alternateText: item?.description, + keyForList: item.value ?? '', + text: item?.label ?? '', + isSelected: item === selectedItem, + sectionIndex: 0, + index, + })); setSectionsData(itemsData); }, [items, selectedItem]); @@ -71,7 +46,7 @@ function ValueSelectorModal({items, selectedItem, label, isVisible, onClose, onI @@ -80,8 +55,6 @@ function ValueSelectorModal({items, selectedItem, label, isVisible, onClose, onI ); } -ValueSelectorModal.propTypes = propTypes; -ValueSelectorModal.defaultProps = defaultProps; ValueSelectorModal.displayName = 'ValueSelectorModal'; export default ValueSelectorModal; diff --git a/src/components/ValuePicker/index.js b/src/components/ValuePicker/index.js deleted file mode 100644 index d90529114af4..000000000000 --- a/src/components/ValuePicker/index.js +++ /dev/null @@ -1,119 +0,0 @@ -import _ from 'lodash'; -import PropTypes from 'prop-types'; -import React, {useState} from 'react'; -import {View} from 'react-native'; -import FormHelpMessage from '@components/FormHelpMessage'; -import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; -import refPropTypes from '@components/refPropTypes'; -import useStyleUtils from '@hooks/useStyleUtils'; -import useThemeStyles from '@hooks/useThemeStyles'; -import variables from '@styles/variables'; -import ValueSelectorModal from './ValueSelectorModal'; - -const propTypes = { - /** Form Error description */ - errorText: PropTypes.string, - - /** Item to display */ - value: PropTypes.string, - - /** A placeholder value to display */ - placeholder: PropTypes.string, - - /** Items to pick from */ - items: PropTypes.arrayOf(PropTypes.shape({value: PropTypes.string, label: PropTypes.string})), - - /** Label of picker */ - label: PropTypes.string, - - /** Callback to call when the input changes */ - onInputChange: PropTypes.func, - - /** Text to display under the main menu item */ - furtherDetails: PropTypes.string, - - /** A ref to forward to MenuItemWithTopDescription */ - forwardedRef: refPropTypes, - - /** Whether to show the toolip text */ - shouldShowTooltips: PropTypes.bool, -}; - -const defaultProps = { - value: undefined, - label: undefined, - placeholder: '', - items: {}, - forwardedRef: undefined, - errorText: '', - furtherDetails: undefined, - onInputChange: () => {}, - shouldShowTooltips: true, -}; - -function ValuePicker({value, label, items, placeholder, errorText, onInputChange, furtherDetails, shouldShowTooltips, forwardedRef}) { - const styles = useThemeStyles(); - const StyleUtils = useStyleUtils(); - const [isPickerVisible, setIsPickerVisible] = useState(false); - - const showPickerModal = () => { - setIsPickerVisible(true); - }; - - const hidePickerModal = () => { - setIsPickerVisible(false); - }; - - const updateInput = (item) => { - if (item.value !== value) { - onInputChange(item.value); - } - hidePickerModal(); - }; - - const descStyle = !value || value.length === 0 ? StyleUtils.getFontSizeStyle(variables.fontSizeLabel) : null; - const selectedItem = _.find(items, {value}); - const selectedLabel = selectedItem ? selectedItem.label : ''; - - return ( - - - - - - - - ); -} - -ValuePicker.propTypes = propTypes; -ValuePicker.defaultProps = defaultProps; -ValuePicker.displayName = 'ValuePicker'; - -const ValuePickerWithRef = React.forwardRef((props, ref) => ( - -)); - -ValuePickerWithRef.displayName = 'ValuePickerWithRef'; - -export default ValuePickerWithRef; diff --git a/src/components/ValuePicker/index.tsx b/src/components/ValuePicker/index.tsx new file mode 100644 index 000000000000..1137a3a00d81 --- /dev/null +++ b/src/components/ValuePicker/index.tsx @@ -0,0 +1,64 @@ +import React, {forwardRef, useState} from 'react'; +import type {ForwardedRef} from 'react'; +import {View} from 'react-native'; +import FormHelpMessage from '@components/FormHelpMessage'; +import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; +import useStyleUtils from '@hooks/useStyleUtils'; +import useThemeStyles from '@hooks/useThemeStyles'; +import variables from '@styles/variables'; +import type {ValuePickerItem, ValuePickerProps} from './types'; +import ValueSelectorModal from './ValueSelectorModal'; + +function ValuePicker({value, label, items, placeholder = '', errorText = '', onInputChange, furtherDetails, shouldShowTooltips = true}: ValuePickerProps, forwardedRef: ForwardedRef) { + const styles = useThemeStyles(); + const StyleUtils = useStyleUtils(); + const [isPickerVisible, setIsPickerVisible] = useState(false); + + const showPickerModal = () => { + setIsPickerVisible(true); + }; + + const hidePickerModal = () => { + setIsPickerVisible(false); + }; + + const updateInput = (item: ValuePickerItem) => { + if (item?.value && item.value !== value) { + onInputChange?.(item.value); + } + hidePickerModal(); + }; + + const descStyle = value?.length === 0 ? StyleUtils.getFontSizeStyle(variables.fontSizeLabel) : null; + const selectedItem = items?.find((item) => item.value === value); + + return ( + + + + + + + + ); +} + +ValuePicker.displayName = 'ValuePicker'; + +export default forwardRef(ValuePicker); diff --git a/src/components/ValuePicker/types.ts b/src/components/ValuePicker/types.ts new file mode 100644 index 000000000000..70bdfbe1f302 --- /dev/null +++ b/src/components/ValuePicker/types.ts @@ -0,0 +1,58 @@ +import type {RadioItem} from '@components/SelectionList/types'; + +type ValuePickerItem = RadioItem & { + value?: string; + label?: string; + description?: string; +}; + +type ValueSelectorModalProps = { + /** Whether the modal is visible */ + isVisible: boolean; + + /** Items to pick from */ + items?: ValuePickerItem[]; + + /** The selected item */ + selectedItem?: ValuePickerItem; + + /** Label for values */ + label?: string; + + /** Function to call when the user selects a item */ + onItemSelected: (item: ValuePickerItem) => void; + + /** Function to call when the user closes the modal */ + onClose: () => void; + + /** Whether to show the toolip text */ + shouldShowTooltips?: boolean; +}; + +type ValuePickerProps = { + /** Item to display */ + value?: string; + + /** Label of picker */ + label?: string; + + /** Items to pick from */ + items?: ValuePickerItem[]; + + /** A placeholder value to display */ + placeholder?: string; + + /** Form Error description */ + errorText?: string; + + /** Callback to call when the input changes */ + onInputChange?: (value: string) => void; + + /** Text to display under the main menu item */ + furtherDetails?: string; + + /** Whether to show the toolip text */ + shouldShowTooltips?: boolean; +}; + +export type {ValuePickerItem, ValueSelectorModalProps, ValuePickerProps}; From 8045ca6f214867395c2d0af3a99fcfcfba4b241e Mon Sep 17 00:00:00 2001 From: Filip Solecki Date: Wed, 17 Jan 2024 19:17:49 +0100 Subject: [PATCH 036/288] Add optional mark to props --- src/components/ValuePicker/ValueSelectorModal.tsx | 4 ++-- src/components/ValuePicker/types.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/ValuePicker/ValueSelectorModal.tsx b/src/components/ValuePicker/ValueSelectorModal.tsx index 61588b9f8e37..a7b5f494aa67 100644 --- a/src/components/ValuePicker/ValueSelectorModal.tsx +++ b/src/components/ValuePicker/ValueSelectorModal.tsx @@ -28,7 +28,7 @@ function ValueSelectorModal({items = [], selectedItem, label = '', isVisible, on onClose?.()} onModalHide={onClose} hideModalContentWhileAnimating useNativeDriver @@ -45,7 +45,7 @@ function ValueSelectorModal({items = [], selectedItem, label = '', isVisible, on /> onItemSelected?.(item)} initiallyFocusedOptionKey={selectedItem?.value} shouldStopPropagation shouldShowTooltips={shouldShowTooltips} diff --git a/src/components/ValuePicker/types.ts b/src/components/ValuePicker/types.ts index 70bdfbe1f302..285299bc0101 100644 --- a/src/components/ValuePicker/types.ts +++ b/src/components/ValuePicker/types.ts @@ -20,10 +20,10 @@ type ValueSelectorModalProps = { label?: string; /** Function to call when the user selects a item */ - onItemSelected: (item: ValuePickerItem) => void; + onItemSelected?: (item: ValuePickerItem) => void; /** Function to call when the user closes the modal */ - onClose: () => void; + onClose?: () => void; /** Whether to show the toolip text */ shouldShowTooltips?: boolean; From 00e958e057588cdb6bff53dc254e324546d21800 Mon Sep 17 00:00:00 2001 From: tienifr Date: Thu, 18 Jan 2024 18:33:45 +0700 Subject: [PATCH 037/288] fix: Pin & Delete request appear on Receipt image when quickly tap on receipt and 3-Dot menu --- src/components/Modal/BaseModal.tsx | 9 +++--- src/components/Modal/types.ts | 3 ++ src/components/Popover/index.tsx | 2 ++ .../PopoverWithoutOverlay/index.tsx | 2 +- src/components/ThreeDotsMenu/index.js | 30 ++++++++++++++++--- src/libs/actions/Modal.ts | 4 +-- src/types/onyx/Modal.ts | 2 ++ 7 files changed, 41 insertions(+), 11 deletions(-) diff --git a/src/components/Modal/BaseModal.tsx b/src/components/Modal/BaseModal.tsx index 6e5b4eddae9e..4bec71b5a2dd 100644 --- a/src/components/Modal/BaseModal.tsx +++ b/src/components/Modal/BaseModal.tsx @@ -38,6 +38,7 @@ function BaseModal( onLayout, avoidKeyboard = false, children, + isPopover = false, }: BaseModalProps, ref: React.ForwardedRef, ) { @@ -57,7 +58,7 @@ function BaseModal( */ const hideModal = useCallback( (callHideCallback = true) => { - Modal.willAlertModalBecomeVisible(false); + Modal.willAlertModalBecomeVisible(false, isPopover); if (shouldSetModalVisibility) { Modal.setModalVisibility(false); } @@ -69,14 +70,14 @@ function BaseModal( ComposerFocusManager.setReadyToFocus(); } }, - [shouldSetModalVisibility, onModalHide, fullscreen], + [shouldSetModalVisibility, onModalHide, fullscreen, isPopover], ); useEffect(() => { isVisibleRef.current = isVisible; let removeOnCloseListener: () => void; if (isVisible) { - Modal.willAlertModalBecomeVisible(true); + Modal.willAlertModalBecomeVisible(true, isPopover); // To handle closing any modal already visible when this modal is mounted, i.e. PopoverReportActionContextMenu removeOnCloseListener = Modal.setCloseModal(onClose); } @@ -87,7 +88,7 @@ function BaseModal( } removeOnCloseListener(); }; - }, [isVisible, wasVisible, onClose]); + }, [isVisible, wasVisible, onClose, isPopover]); useEffect( () => () => { diff --git a/src/components/Modal/types.ts b/src/components/Modal/types.ts index 0773f0741233..d6fdd4cabea8 100644 --- a/src/components/Modal/types.ts +++ b/src/components/Modal/types.ts @@ -59,6 +59,9 @@ type BaseModalProps = Partial & { * See: https://github.com/react-native-modal/react-native-modal/pull/116 * */ hideModalContentWhileAnimating?: boolean; + + /** Whether the modal is popover or not */ + isPopover?: boolean; }; export default BaseModalProps; diff --git a/src/components/Popover/index.tsx b/src/components/Popover/index.tsx index 762e79fab63c..246286abdcbc 100644 --- a/src/components/Popover/index.tsx +++ b/src/components/Popover/index.tsx @@ -69,6 +69,7 @@ function Popover(props: PopoverWithWindowDimensionsProps) { onLayout={onLayout} animationIn={animationIn} animationOut={animationOut} + isPopover />, document.body, ); @@ -100,6 +101,7 @@ function Popover(props: PopoverWithWindowDimensionsProps) { onLayout={onLayout} animationIn={animationIn} animationOut={animationOut} + isPopover /> ); } diff --git a/src/components/PopoverWithoutOverlay/index.tsx b/src/components/PopoverWithoutOverlay/index.tsx index 58d022ef9d65..437fb4946f86 100644 --- a/src/components/PopoverWithoutOverlay/index.tsx +++ b/src/components/PopoverWithoutOverlay/index.tsx @@ -59,7 +59,7 @@ function PopoverWithoutOverlay( close(anchorRef); Modal.onModalDidClose(); } - Modal.willAlertModalBecomeVisible(isVisible); + Modal.willAlertModalBecomeVisible(isVisible, true); return () => { if (!removeOnClose) { diff --git a/src/components/ThreeDotsMenu/index.js b/src/components/ThreeDotsMenu/index.js index 150487b2aa57..cc90067a2e70 100644 --- a/src/components/ThreeDotsMenu/index.js +++ b/src/components/ThreeDotsMenu/index.js @@ -1,6 +1,7 @@ import PropTypes from 'prop-types'; -import React, {useRef, useState} from 'react'; +import React, {useEffect, useRef, useState} from 'react'; import {View} from 'react-native'; +import {withOnyx} from 'react-native-onyx'; import _ from 'underscore'; import Icon from '@components/Icon'; import * as Expensicons from '@components/Icon/Expensicons'; @@ -13,6 +14,7 @@ import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; import * as Browser from '@libs/Browser'; import CONST from '@src/CONST'; +import ONYXKEYS from '@src/ONYXKEYS'; import ThreeDotsMenuItemPropTypes from './ThreeDotsMenuItemPropTypes'; const propTypes = { @@ -57,6 +59,13 @@ const propTypes = { /** Should we announce the Modal visibility changes? */ shouldSetModalVisibility: PropTypes.bool, + + /** Details about any modals being used */ + modal: PropTypes.shape({ + isVisible: PropTypes.bool, + willAlertModalBecomeVisible: PropTypes.bool, + isPopover: PropTypes.bool, + }), }; const defaultProps = { @@ -72,14 +81,16 @@ const defaultProps = { }, shouldOverlay: false, shouldSetModalVisibility: true, + modal: {}, }; -function ThreeDotsMenu({iconTooltip, icon, iconFill, iconStyles, onIconPress, menuItems, anchorPosition, anchorAlignment, shouldOverlay, shouldSetModalVisibility, disabled}) { +function ThreeDotsMenu({iconTooltip, icon, iconFill, iconStyles, onIconPress, menuItems, anchorPosition, anchorAlignment, shouldOverlay, shouldSetModalVisibility, disabled, modal}) { const theme = useTheme(); const styles = useThemeStyles(); const [isPopupMenuVisible, setPopupMenuVisible] = useState(false); const buttonRef = useRef(null); const {translate} = useLocalize(); + const isBehindModal = modal.willAlertModalBecomeVisible && !modal.isPopover && !shouldOverlay; const showPopoverMenu = () => { setPopupMenuVisible(true); @@ -89,6 +100,13 @@ function ThreeDotsMenu({iconTooltip, icon, iconFill, iconStyles, onIconPress, me setPopupMenuVisible(false); }; + useEffect(() => { + if (!isBehindModal || !isPopupMenuVisible) { + return; + } + hidePopoverMenu(); + }, [isBehindModal, isPopupMenuVisible]); + return ( <> @@ -126,7 +144,7 @@ function ThreeDotsMenu({iconTooltip, icon, iconFill, iconStyles, onIconPress, me Date: Thu, 18 Jan 2024 16:13:41 +0100 Subject: [PATCH 038/288] feat: migrate HoldReasonPage to ts --- .../{HoldReasonPage.js => HoldReasonPage.tsx} | 57 +++++++++---------- 1 file changed, 28 insertions(+), 29 deletions(-) rename src/pages/iou/{HoldReasonPage.js => HoldReasonPage.tsx} (64%) diff --git a/src/pages/iou/HoldReasonPage.js b/src/pages/iou/HoldReasonPage.tsx similarity index 64% rename from src/pages/iou/HoldReasonPage.js rename to src/pages/iou/HoldReasonPage.tsx index 777d35ca2002..035b1b98be90 100644 --- a/src/pages/iou/HoldReasonPage.js +++ b/src/pages/iou/HoldReasonPage.tsx @@ -1,8 +1,6 @@ -import lodashGet from 'lodash/get'; -import PropTypes from 'prop-types'; -import React, {useCallback, useRef} from 'react'; +import type {RouteProp} from '@react-navigation/native'; +import React, {useCallback} from 'react'; import {View} from 'react-native'; -import _ from 'underscore'; import FormProvider from '@components/Form/FormProvider'; import InputWrapper from '@components/Form/InputWrapper'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; @@ -12,48 +10,49 @@ import TextInput from '@components/TextInput'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; import Navigation from '@libs/Navigation/Navigation'; +import * as ValidationUtils from '@libs/ValidationUtils'; import * as IOU from '@userActions/IOU'; import CONST from '@src/CONST'; +import type {Route} from '@src/ROUTES'; -const propTypes = { - /** Navigation route context info provided by react navigation */ - route: PropTypes.shape({ - /** Route specific parameters used on this screen via route :iouType/new/category/:reportID? */ - params: PropTypes.shape({ - /** ID of the transaction the page was opened for */ - transactionID: PropTypes.string, +type HoldReasonPageRouteParams = { + /** ID of the transaction the page was opened for */ + transactionID: string; - /** ID of the report that user is providing hold reason to */ - reportID: PropTypes.string, + /** ID of the report that user is providing hold reason to */ + reportID: string; - /** Link to previous page */ - backTo: PropTypes.string, - }), - }).isRequired, + /** Link to previous page */ + backTo: Route; }; -function HoldReasonPage({route}) { +type HoldReasonPageProps = { + /** Navigation route context info provided by react navigation */ + route: RouteProp<{params: HoldReasonPageRouteParams}>; +}; + +type FormValues = {comment: string}; + +function HoldReasonPage({route}: HoldReasonPageProps) { const styles = useThemeStyles(); const {translate} = useLocalize(); - const reasonRef = useRef(); - const transactionID = lodashGet(route, 'params.transactionID', ''); - const reportID = lodashGet(route, 'params.reportID', ''); - const backTo = lodashGet(route, 'params.backTo', ''); + const {transactionID, reportID, backTo} = route.params; const navigateBack = () => { Navigation.navigate(backTo); }; - const onSubmit = (values) => { + const onSubmit = (values: FormValues) => { IOU.putOnHold(transactionID, values.comment, reportID); navigateBack(); }; - const validate = useCallback((value) => { - const errors = {}; + const validate = useCallback((values: FormValues) => { + const requiredFields = ['comment']; + const errors = ValidationUtils.getFieldRequiredErrors(values, requiredFields); - if (_.isEmpty(value.comment)) { + if (!values.comment) { errors.comment = 'common.error.fieldRequired'; } @@ -70,6 +69,7 @@ function HoldReasonPage({route}) { title={translate('iou.holdRequest')} onBackButtonPress={navigateBack} /> + {/** @ts-expect-error TODO: Remove this once FormProvider (https://github.com/Expensify/App/issues/31972) is migrated to TypeScript. */} {translate('iou.explainHold')} (reasonRef.current = e)} autoFocus /> @@ -99,6 +99,5 @@ function HoldReasonPage({route}) { } HoldReasonPage.displayName = 'MoneyRequestHoldReasonPage'; -HoldReasonPage.propTypes = propTypes; export default HoldReasonPage; From e06439574fdd6054acae8a483462cdc49e0d46ef Mon Sep 17 00:00:00 2001 From: Bartosz Grajdek Date: Thu, 18 Jan 2024 16:20:18 +0100 Subject: [PATCH 039/288] feat: migrate ProcessMoneyRequestHoldPage to ts --- ...essMoneyRequestHoldPage.js => ProcessMoneyRequestHoldPage.tsx} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/pages/{ProcessMoneyRequestHoldPage.js => ProcessMoneyRequestHoldPage.tsx} (100%) diff --git a/src/pages/ProcessMoneyRequestHoldPage.js b/src/pages/ProcessMoneyRequestHoldPage.tsx similarity index 100% rename from src/pages/ProcessMoneyRequestHoldPage.js rename to src/pages/ProcessMoneyRequestHoldPage.tsx From 38015459c9140e3fb4710dc2f71ee4730f778ee7 Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Mon, 22 Jan 2024 16:50:39 -0500 Subject: [PATCH 040/288] feat(Violations): fix dependency array --- src/components/ReportActionItem/MoneyRequestPreview.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/ReportActionItem/MoneyRequestPreview.js b/src/components/ReportActionItem/MoneyRequestPreview.js index b425c9e070e6..87b33ee6f3c4 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview.js +++ b/src/components/ReportActionItem/MoneyRequestPreview.js @@ -264,7 +264,7 @@ function MoneyRequestPreview(props) { } return CurrencyUtils.convertToDisplayString(requestAmount, requestCurrency); - }, [hasPendingWaypoints, isDistanceRequest, isScanning, props.transaction, requestAmount, requestCurrency, translate]); + }, [hasPendingWaypoints, isDistanceRequest, isScanning, isSettled, props.transaction, requestAmount, requestCurrency, translate]); const displayDeleteAmountText = useMemo(() => { const {amount, currency} = ReportUtils.getTransactionDetails(props.action.originalMessage); From 0129e58af57e4a81de7fb8eaed1e53543be24a93 Mon Sep 17 00:00:00 2001 From: Vadym Date: Tue, 23 Jan 2024 16:11:22 +0100 Subject: [PATCH 041/288] chore: converts BasePopoverReactionList to functional component --- src/hooks/useBasePopoverReactionList/index.ts | 134 +++++++ src/hooks/useBasePopoverReactionList/types.ts | 65 ++++ src/pages/home/ReportScreenContext.ts | 4 +- .../BasePopoverReactionList.tsx | 334 +++--------------- .../PopoverReactionList/index.tsx | 18 +- 5 files changed, 256 insertions(+), 299 deletions(-) create mode 100644 src/hooks/useBasePopoverReactionList/index.ts create mode 100644 src/hooks/useBasePopoverReactionList/types.ts diff --git a/src/hooks/useBasePopoverReactionList/index.ts b/src/hooks/useBasePopoverReactionList/index.ts new file mode 100644 index 000000000000..cccb8a99b526 --- /dev/null +++ b/src/hooks/useBasePopoverReactionList/index.ts @@ -0,0 +1,134 @@ +import {useEffect, useMemo, useRef, useState} from 'react'; +import type {SyntheticEvent} from 'react'; +import {Dimensions} from 'react-native'; +import * as EmojiUtils from '@libs/EmojiUtils'; +import * as PersonalDetailsUtils from '@libs/PersonalDetailsUtils'; +import type {BasePopoverReactionListHookProps, ReactionListAnchor, ShowReactionList} from './types'; + +export default function useBasePopoverReactionList({emojiName, emojiReactions, accountID, reportActionID, preferredLocale}: BasePopoverReactionListHookProps) { + const [isPopoverVisible, setIsPopoverVisible] = useState(false); + const [cursorRelativePosition, setCursorRelativePosition] = useState({horizontal: 0, vertical: 0}); + const [popoverAnchorPosition, setPopoverAnchorPosition] = useState({horizontal: 0, vertical: 0}); + const reactionListRef = useRef(null); + + // Get the selected reaction + const selectedReaction = useMemo(() => (isPopoverVisible ? emojiReactions?.emojiName : null), [isPopoverVisible, emojiReactions]); + + // custom methods + function getReactionInformation() { + if (!selectedReaction) { + // If there is no reaction, we return default values + return { + emojiName: '', + reactionCount: 0, + emojiCodes: [], + hasUserReacted: false, + users: [], + }; + } + + const {emojiCodes, reactionCount, hasUserReacted, userAccountIDs} = EmojiUtils.getEmojiReactionDetails(emojiName, selectedReaction, accountID); + + const users = PersonalDetailsUtils.getPersonalDetailsByIDs(userAccountIDs, accountID, true); + return { + emojiName, + emojiCodes, + reactionCount, + hasUserReacted, + users, + }; + } + + /** + * Get the BasePopoverReactionList anchor position + * We calculate the achor coordinates from measureInWindow async method + * + * @returns promise + */ + function getReactionListMeasuredLocation(): Promise<{x: number; y: number}> { + return new Promise((resolve) => { + const reactionListAnchor = reactionListRef.current; + if (reactionListAnchor && 'measureInWindow' in reactionListAnchor) { + reactionListAnchor.measureInWindow((x, y) => resolve({x, y})); + } else { + // If the anchor is not available or does not have the measureInWindow method, we return 0, 0 + resolve({x: 0, y: 0}); + } + }); + } + + /** + * Show the ReactionList modal popover. + * + * @param event - Object - A press event. + * @param reactionListAnchor - Element - reactionListAnchor + */ + const showReactionList: ShowReactionList = (event, reactionListAnchor) => { + // We get the cursor coordinates and the reactionListAnchor coordinates to calculate the popover position + const nativeEvent = (event as SyntheticEvent)?.nativeEvent || {}; + reactionListRef.current = reactionListAnchor; + getReactionListMeasuredLocation().then(({x, y}) => { + setCursorRelativePosition({horizontal: nativeEvent.pageX - x, vertical: nativeEvent.pageY - y}); + setPopoverAnchorPosition({ + horizontal: nativeEvent.pageX, + vertical: nativeEvent.pageY, + }); + setIsPopoverVisible(true); + }); + }; + + /** + * Hide the ReactionList modal popover. + */ + function hideReactionList() { + setIsPopoverVisible(false); + } + + useEffect(() => { + const dimensionsEventListener = Dimensions.addEventListener('change', () => { + if (!isPopoverVisible) { + // If the popover is not visible, we don't need to update the component + return; + } + getReactionListMeasuredLocation().then(({x, y}) => { + if (!x || !y) { + return; + } + setPopoverAnchorPosition({ + horizontal: cursorRelativePosition.horizontal + x, + vertical: cursorRelativePosition.vertical + y, + }); + }); + }); + + return () => { + dimensionsEventListener.remove(); + }; + }, [ + isPopoverVisible, + reportActionID, + preferredLocale, + cursorRelativePosition.horizontal, + cursorRelativePosition.vertical, + popoverAnchorPosition.horizontal, + popoverAnchorPosition.vertical, + ]); + + useEffect(() => { + if (!isPopoverVisible) { + // If the popover is not visible, we don't need to update the component + return; + } + + // Hide the list when all reactions are removed + const emojiReactionsList = emojiReactions?.emojiName.users; + const isEmptyList = Array.isArray(emojiReactionsList) && !emojiReactionsList.some((emojiReaction) => emojiReaction); + if (!isEmptyList) { + return; + } + + hideReactionList(); + }); + + return {isPopoverVisible, cursorRelativePosition, popoverAnchorPosition, getReactionInformation, hideReactionList, reactionListRef, showReactionList}; +} diff --git a/src/hooks/useBasePopoverReactionList/types.ts b/src/hooks/useBasePopoverReactionList/types.ts new file mode 100644 index 000000000000..e4ba9263b41b --- /dev/null +++ b/src/hooks/useBasePopoverReactionList/types.ts @@ -0,0 +1,65 @@ +import type {OnyxEntry} from 'react-native-onyx'; +import type {LocaleContextProps} from '@components/LocaleContextProvider'; +import type {WithCurrentUserPersonalDetailsProps} from '@components/withCurrentUserPersonalDetails'; +import type {ReactionListAnchor, ReactionListEvent} from '@pages/home/ReportScreenContext'; +import type {ReportActionReactions} from '@src/types/onyx'; + +type BasePopoverReactionListOnyxProps = { + /** The reactions for the report action */ + emojiReactions: OnyxEntry; +}; + +type BasePopoverReactionListProps = { + /** The ID of the report action */ + reportActionID: string; + + /** The emoji name */ + emojiName: string; +}; + +type BasePopoverReactionListHookProps = BasePopoverReactionListProps & { + /** The reactions for the report action */ + emojiReactions: OnyxEntry; + + /** The current user's account ID */ + accountID: WithCurrentUserPersonalDetailsProps['currentUserPersonalDetails']['accountID']; + + preferredLocale: LocaleContextProps['preferredLocale']; +}; + +type BasePopoverReactionListPropsWithLocalWithOnyx = WithCurrentUserPersonalDetailsProps & BasePopoverReactionListOnyxProps & BasePopoverReactionListProps; +type BasePopoverReactionListState = { + /** Whether the popover is visible */ + isPopoverVisible: boolean; + + /** The horizontal and vertical position (relative to the screen) where the popover will display. */ + popoverAnchorPosition: { + horizontal: number; + vertical: number; + }; + + /** The horizontal and vertical position (relative to the screen) where the cursor is. */ + cursorRelativePosition: { + horizontal: number; + vertical: number; + }; +}; + +type ShowReactionList = (event: ReactionListEvent | undefined, reactionListAnchor: ReactionListAnchor) => void; + +type InnerReactionListRefType = { + showReactionList: ShowReactionList; + hideReactionList: () => void; + isActiveReportAction: (actionID: number | string) => boolean; +}; + +export type { + BasePopoverReactionListProps, + BasePopoverReactionListHookProps, + BasePopoverReactionListPropsWithLocalWithOnyx, + BasePopoverReactionListState, + BasePopoverReactionListOnyxProps, + ShowReactionList, + ReactionListAnchor, + InnerReactionListRefType, +}; diff --git a/src/pages/home/ReportScreenContext.ts b/src/pages/home/ReportScreenContext.ts index 3b4e574e01a1..e9440ab932d6 100644 --- a/src/pages/home/ReportScreenContext.ts +++ b/src/pages/home/ReportScreenContext.ts @@ -1,10 +1,10 @@ -import type {RefObject} from 'react'; +import type {RefObject, SyntheticEvent} from 'react'; import {createContext} from 'react'; import type {FlatList, GestureResponderEvent, View} from 'react-native'; type ReactionListAnchor = View | HTMLDivElement | null; -type ReactionListEvent = GestureResponderEvent | MouseEvent; +type ReactionListEvent = GestureResponderEvent | MouseEvent | SyntheticEvent; type ReactionListRef = { showReactionList: (event: ReactionListEvent | undefined, reactionListAnchor: ReactionListAnchor, emojiName: string, reportActionID: string) => void; diff --git a/src/pages/home/report/ReactionList/PopoverReactionList/BasePopoverReactionList.tsx b/src/pages/home/report/ReactionList/PopoverReactionList/BasePopoverReactionList.tsx index 4bee2e8d1d3c..3f5fdeb6428f 100644 --- a/src/pages/home/report/ReactionList/PopoverReactionList/BasePopoverReactionList.tsx +++ b/src/pages/home/report/ReactionList/PopoverReactionList/BasePopoverReactionList.tsx @@ -1,297 +1,61 @@ -import lodashGet from 'lodash/get'; import React from 'react'; -import {Dimensions} from 'react-native'; import {withOnyx} from 'react-native-onyx'; -import type {OnyxEntry} from 'react-native-onyx'; -import _ from 'underscore'; import PopoverWithMeasuredContent from '@components/PopoverWithMeasuredContent'; import withCurrentUserPersonalDetails from '@components/withCurrentUserPersonalDetails'; -import type {WithCurrentUserPersonalDetailsProps} from '@components/withCurrentUserPersonalDetails'; -import withLocalize from '@components/withLocalize'; -import type {WithLocalizeProps} from '@components/withLocalize'; -import compose from '@libs/compose'; -import * as EmojiUtils from '@libs/EmojiUtils'; -import * as PersonalDetailsUtils from '@libs/PersonalDetailsUtils'; +import useBasePopoverReactionList from '@hooks/useBasePopoverReactionList'; +import type {BasePopoverReactionListOnyxProps, BasePopoverReactionListPropsWithLocalWithOnyx} from '@hooks/useBasePopoverReactionList/types'; +import useLocalize from '@hooks/useLocalize'; import BaseReactionList from '@pages/home/report/ReactionList/BaseReactionList'; -import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; -import type {ReportActionReactions} from '@src/types/onyx'; -import type {ReportActionReaction} from '@src/types/onyx/ReportActionReactions'; -type BasePopoverReactionListOnyxProps = { - /** The reactions for the report action */ - emojiReactions: OnyxEntry; -}; - -type BasePopoverReactionListProps = { - /** The ID of the report action */ - reportActionID: string; - - /** The emoji name */ - emojiName: string; - - /** The ref of the action */ - ref: React.Ref; -}; - -type BasePopoverReactionListWithLocalizeProps = WithLocalizeProps & WithCurrentUserPersonalDetailsProps; - -type BasePopoverReactionListPropsWithLocalWithOnyx = BasePopoverReactionListWithLocalizeProps & BasePopoverReactionListOnyxProps & BasePopoverReactionListProps; -type BasePopoverReactionListState = { - /** Whether the popover is visible */ - isPopoverVisible: boolean; - - /** The horizontal and vertical position (relative to the screen) where the popover will display. */ - popoverAnchorPosition: { - horizontal: number; - vertical: number; - }; - - /** The horizontal and vertical position (relative to the screen) where the cursor is. */ - cursorRelativePosition: { - horizontal: number; - vertical: number; - }; -}; - -class BasePopoverReactionList extends React.Component { - reactionListAnchor: React.RefObject; - - dimensionsEventListener: { - remove: () => void; - } | null; - - constructor(props: BasePopoverReactionListPropsWithLocalWithOnyx) { - super(props); - - this.state = { - isPopoverVisible: false, - cursorRelativePosition: { - horizontal: 0, - vertical: 0, - }, - - // The horizontal and vertical position (relative to the screen) where the popover will display. - popoverAnchorPosition: { - horizontal: 0, - vertical: 0, - }, - }; - - this.reactionListAnchor = React.createRef(); - this.showReactionList = this.showReactionList.bind(this); - this.hideReactionList = this.hideReactionList.bind(this); - this.measureReactionListPosition = this.measureReactionListPosition.bind(this); - this.getReactionListMeasuredLocation = this.getReactionListMeasuredLocation.bind(this); - this.getReactionInformation = this.getReactionInformation.bind(this); - this.dimensionsEventListener = null; - } - - componentDidMount() { - this.dimensionsEventListener = Dimensions.addEventListener('change', this.measureReactionListPosition); - } - - shouldComponentUpdate(nextProps: BasePopoverReactionListPropsWithLocalWithOnyx, nextState: BasePopoverReactionListState) { - if (!this.state.isPopoverVisible && !nextState.isPopoverVisible) { - // If the popover is not visible, we don't need to update the component - return false; - } - - const previousLocale = lodashGet(this.props, 'preferredLocale', CONST.LOCALES.DEFAULT); - const nextLocale = lodashGet(nextProps, 'preferredLocale', CONST.LOCALES.DEFAULT); - const prevReaction = lodashGet(this.props.emojiReactions, this.props.emojiName); - const nextReaction = lodashGet(nextProps.emojiReactions, nextProps.emojiName); - - return ( - this.props.reportActionID !== nextProps.reportActionID || - this.props.emojiName !== nextProps.emojiName || - !_.isEqual(prevReaction, nextReaction) || - !_.isEqual(this.state, nextState) || - previousLocale !== nextLocale - ); - } - - componentDidUpdate() { - if (!this.state.isPopoverVisible) { - // If the popover is not visible, we don't need to update the component - return; - } - - // Hide the list when all reactions are removed - const emojiReactions = lodashGet(this.props.emojiReactions, [this.props.emojiName, 'users']); - const isEmptyList = !emojiReactions || !_.some(emojiReactions); - if (!isEmptyList) { - return; - } - - this.hideReactionList(); - } - - componentWillUnmount() { - // Remove the event listener - if (!this.dimensionsEventListener) { - return; - } - this.dimensionsEventListener.remove(); - } - - /** - * Get the BasePopoverReactionList anchor position - * We calculate the achor coordinates from measureInWindow async method - * - * @returns {Promise} - */ - getReactionListMeasuredLocation(): Promise<{x: number; y: number}> { - return new Promise((resolve) => { - const reactionListAnchor = this.reactionListAnchor.current as HTMLElement & {measureInWindow: (callback: (x: number, y: number) => void) => void}; - if (reactionListAnchor) { - reactionListAnchor.measureInWindow((x, y) => resolve({x, y})); - } else { - // If the anchor is not available, we return 0, 0 - resolve({x: 0, y: 0}); - } - }); - } - - /** - * Get the reaction information. - * - * @param {Object} selectedReaction - * @param {String} emojiName - * @returns {Object} - */ - getReactionInformation(selectedReaction: ReportActionReaction | null | undefined, emojiName: string) { - if (!selectedReaction) { - // If there is no reaction, we return default values - return { - emojiName: '', - reactionCount: 0, - emojiCodes: [], - hasUserReacted: false, - users: [], - }; - } - - const {emojiCodes, reactionCount, hasUserReacted, userAccountIDs} = EmojiUtils.getEmojiReactionDetails(emojiName, selectedReaction, this.props.currentUserPersonalDetails.accountID); - - const users = PersonalDetailsUtils.getPersonalDetailsByIDs(userAccountIDs, this.props.currentUserPersonalDetails.accountID, true); - return { - emojiName, - emojiCodes, - reactionCount, - hasUserReacted, - users, - }; - } - - /** - * Show the ReactionList modal popover. - * - * @param {Object} [event] - A press event. - * @param {Element} reactionListAnchor - reactionListAnchor - */ - showReactionList( - event: { - nativeEvent: { - pageX: number; - pageY: number; - }; - }, - reactionListAnchor: HTMLElement, - ) { - // We get the cursor coordinates and the reactionListAnchor coordinates to calculate the popover position - const nativeEvent = event.nativeEvent || {}; - this.reactionListAnchor = {current: reactionListAnchor}; - this.getReactionListMeasuredLocation().then(({x, y}) => { - this.setState({ - cursorRelativePosition: { - horizontal: nativeEvent.pageX - x, - vertical: nativeEvent.pageY - y, - }, - popoverAnchorPosition: { - horizontal: nativeEvent.pageX, - vertical: nativeEvent.pageY, - }, - isPopoverVisible: true, - }); - }); - } - - /** - * This gets called on Dimensions change to find the anchor coordinates for the action BasePopoverReactionList. - */ - measureReactionListPosition() { - if (!this.state.isPopoverVisible) { - // If the popover is not visible, we don't need to update the component - return; - } - this.getReactionListMeasuredLocation().then(({x, y}) => { - if (!x || !y) { - return; - } - this.setState((prev) => ({ - popoverAnchorPosition: { - horizontal: prev.cursorRelativePosition.horizontal + x, - vertical: prev.cursorRelativePosition.vertical + y, - }, - })); - }); - } - - /** - * Hide the ReactionList modal popover. - */ - hideReactionList() { - this.setState({ - isPopoverVisible: false, - }); - } - - render() { - // Get the selected reaction - const selectedReaction = this.state.isPopoverVisible ? lodashGet(this.props.emojiReactions, [this.props.emojiName]) : null; - - // Get the reaction information - const {emojiName, emojiCodes, reactionCount, hasUserReacted, users} = this.getReactionInformation(selectedReaction, this.props.emojiName); - - return ( - - - - ); - } +function BasePopoverReactionList(props: BasePopoverReactionListPropsWithLocalWithOnyx) { + // hooks + const {emojiReactions, emojiName, reportActionID, currentUserPersonalDetails} = props; + const {preferredLocale} = useLocalize(); + const {isPopoverVisible, hideReactionList, popoverAnchorPosition, reactionListRef, getReactionInformation} = useBasePopoverReactionList({ + emojiName, + emojiReactions, + accountID: currentUserPersonalDetails.accountID, + reportActionID, + preferredLocale, + }); + // Get the reaction information + const {emojiCodes, reactionCount, hasUserReacted, users} = getReactionInformation(); + + return ( + + + + ); } -export default compose( - // @ts-ignore TODO: Fix this when the type is fixed - withLocalize, - withCurrentUserPersonalDetails, - withOnyx({ +export default withCurrentUserPersonalDetails( + withOnyx({ emojiReactions: { key: ({reportActionID}) => `${ONYXKEYS.COLLECTION.REPORT_ACTIONS_REACTIONS}${reportActionID}`, }, - }), -)(BasePopoverReactionList); + })(BasePopoverReactionList), +); diff --git a/src/pages/home/report/ReactionList/PopoverReactionList/index.tsx b/src/pages/home/report/ReactionList/PopoverReactionList/index.tsx index 8ac89cef6656..610146559786 100644 --- a/src/pages/home/report/ReactionList/PopoverReactionList/index.tsx +++ b/src/pages/home/report/ReactionList/PopoverReactionList/index.tsx @@ -1,17 +1,11 @@ import React, {forwardRef, useImperativeHandle, useRef, useState} from 'react'; import type {ForwardedRef} from 'react'; +import type {InnerReactionListRefType} from '@hooks/useBasePopoverReactionList/types'; +import type {ReactionListRef} from '@pages/home/ReportScreenContext'; import BasePopoverReactionList from './BasePopoverReactionList'; type PopoverReactionListProps = { - ref: ForwardedRef; -}; - -type ShowReactionList = (event: React.MouseEvent, reactionListAnchor: HTMLElement, emojiName: string, reportActionID: string) => void; - -type InnerReactionListRefType = { - showReactionList: ShowReactionList; - hideReactionList: () => void; - isActiveReportAction: (actionID: number | string) => boolean; + ref: ForwardedRef; }; function PopoverReactionList(props: PopoverReactionListProps) { @@ -19,10 +13,10 @@ function PopoverReactionList(props: PopoverReactionListProps) { const [reactionListReportActionID, setReactionListReportActionID] = useState(''); const [reactionListEmojiName, setReactionListEmojiName] = useState(''); - const showReactionList: ShowReactionList = (event, reactionListAnchor, emojiName, reportActionID) => { + const showReactionList: ReactionListRef['showReactionList'] = (event, reactionListAnchor, emojiName, reportActionID) => { setReactionListReportActionID(reportActionID); setReactionListEmojiName(emojiName); - innerReactionListRef.current?.showReactionList(event, reactionListAnchor, emojiName, reportActionID); + innerReactionListRef.current?.showReactionList(event, reactionListAnchor); }; const hideReactionList = () => { @@ -45,7 +39,7 @@ function PopoverReactionList(props: PopoverReactionListProps) { PopoverReactionList.displayName = 'PopoverReactionList'; export default React.memo( - forwardRef((props, ref) => ( + forwardRef((props, ref) => ( Date: Wed, 24 Jan 2024 09:12:01 +0100 Subject: [PATCH 042/288] fix: correct shownHoldUseExplaination saving in onyx --- src/components/MoneyRequestHeader.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/components/MoneyRequestHeader.js b/src/components/MoneyRequestHeader.js index 75a63693e2ab..5c69d7a88c3f 100644 --- a/src/components/MoneyRequestHeader.js +++ b/src/components/MoneyRequestHeader.js @@ -66,7 +66,7 @@ const defaultProps = { parentReport: {}, parentReportAction: {}, transaction: {}, - shownHoldUseExplaination: true, + shownHoldUseExplaination: false, policy: {}, }; @@ -146,21 +146,21 @@ function MoneyRequestHeader({session, parentReport, report, parentReportAction, setShouldShowHoldMenu(isOnHold && !shownHoldUseExplaination); }, [isOnHold, shownHoldUseExplaination]); - // eslint-disable-next-line rulesdir/prefer-early-return useEffect(() => { - if (shouldShowHoldMenu) { - if (isSmallScreenWidth) { - if (Navigation.getActiveRoute().slice(1) === ROUTES.PROCESS_MONEY_REQUEST_HOLD) { - Navigation.goBack(); - } - } else { - Navigation.navigate(ROUTES.PROCESS_MONEY_REQUEST_HOLD); + if (!shouldShowHoldMenu) { + return; + } + + if (isSmallScreenWidth) { + if (Navigation.getActiveRoute().slice(1) === ROUTES.PROCESS_MONEY_REQUEST_HOLD) { + Navigation.goBack(); } + } else { + Navigation.navigate(ROUTES.PROCESS_MONEY_REQUEST_HOLD); } }, [isSmallScreenWidth, shouldShowHoldMenu]); const handleHoldRequestClose = () => { - setShouldShowHoldMenu(false); IOU.setShownHoldUseExplaination(); }; From 97dc65d73938224c703f4f4cfd55a13b507c62f0 Mon Sep 17 00:00:00 2001 From: cdOut <88325488+cdOut@users.noreply.github.com> Date: Wed, 24 Jan 2024 09:16:46 +0100 Subject: [PATCH 043/288] fix: update spanish translation to correct values --- src/languages/es.ts | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/languages/es.ts b/src/languages/es.ts index 837cb9594fc0..ff741c0c9750 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -646,26 +646,26 @@ export default { }, waitingOnEnabledWallet: ({submitterDisplayName}: WaitingOnBankAccountParams) => `Inició el pago, pero no se procesará hasta que ${submitterDisplayName} active su Billetera`, enableWallet: 'Habilitar Billetera', - holdRequest: 'Retener Pedido', - unholdRequest: 'Cancelar Retención', - explainHold: 'Explica la razón para retener este pedido.', + holdRequest: 'Bloquear solicitud de dinero', + unholdRequest: 'Desbloquear solicitud de dinero', + explainHold: 'Explica la razón para bloquear esta solicitud.', reason: 'Razón', - holdReasonRequired: 'Se requiere una razón para retener.', - requestOnHold: 'Este pedido está en retener. Revise los comentarios para los próximos pasos.', - confirmApprove: 'Confirmar qué aprobar', - confirmApprovalAmount: 'Aprobar el total del informe completo o solo el monto no retenido.', - confirmPay: 'Confirmar que pagar', - confirmPayAmount: 'Pague todos los gastos de bolsillo o solo el monto no retenido.', + holdReasonRequired: 'Se requiere una razón para bloquear.', + requestOnHold: 'Este solicitud está bloqueada. Revisa los comentarios para saber como proceder.', + confirmApprove: 'Confirma que quieres aprobar', + confirmApprovalAmount: 'Aprobar el total o solo la parte no bloqueada.', + confirmPay: 'Confirma que quieres pagar', + confirmPayAmount: 'Pagar todos los gastos por cuenta propia o solo el monto no bloqueado.', payOnly: 'Solo pagar', approveOnly: 'Solo aprobar', - hold: 'Retención', - holdEducationalTitle: 'Esta solicitud está en', - whatIsHoldTitle: '¿Qué es Hold?', - whatIsHoldExplain: 'Hold es nuestra forma de agilizar la colaboración financiera. ¡"Rechazar" es tan duro!', - holdIsTemporaryTitle: 'Hold suele ser temporal', - holdIsTemporaryExplain: 'Debido a que hold se utiliza para aclarar confusión o aclarar un detalle importante antes del pago, no es permanente.', + hold: 'Bloqueada', + holdEducationalTitle: 'Esta solicitud está', + whatIsHoldTitle: '¿Qué es Bloquear?', + whatIsHoldExplain: 'Bloquear es nuestra forma de agilizar la colaboración financiera. ¡"Rechazar" es tan duro!', + holdIsTemporaryTitle: 'Bloquear suele ser temporal', + holdIsTemporaryExplain: 'Se utiliza bloquear para aclarar confusión o aclarar un detalle importante antes del pago, no es permanente.', deleteHoldTitle: 'Eliminar lo que no se pagará', - deleteHoldExplain: 'En el raro caso de que algo se ponga en hold y no se pague, la persona que solicita el pago debe eliminarlo.', + deleteHoldExplain: 'En el raro caso de que algo se bloquear y no se pague, la persona que solicita el pago debe eliminarlo.', set: 'estableció', changed: 'cambió', removed: 'eliminó', From 1954ddc5ed42cc97ff005236184de74cfc317b30 Mon Sep 17 00:00:00 2001 From: Vadym Date: Wed, 24 Jan 2024 09:40:09 +0100 Subject: [PATCH 044/288] chore: fixes the linting error regarding the named export --- src/pages/home/report/ReactionList/BaseReactionList.tsx | 2 +- src/pages/home/report/ReactionList/HeaderReactionList.tsx | 2 +- src/pages/home/report/ReactionList/types.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/pages/home/report/ReactionList/BaseReactionList.tsx b/src/pages/home/report/ReactionList/BaseReactionList.tsx index 80cbc834f344..f1002bddcddc 100755 --- a/src/pages/home/report/ReactionList/BaseReactionList.tsx +++ b/src/pages/home/report/ReactionList/BaseReactionList.tsx @@ -13,7 +13,7 @@ import CONST from '@src/CONST'; import ROUTES from '@src/ROUTES'; import type {PersonalDetails} from '@src/types/onyx'; import HeaderReactionList from './HeaderReactionList'; -import type {ReactionListProps} from './types'; +import type ReactionListProps from './types'; type BaseReactionListProps = ReactionListProps & { /** diff --git a/src/pages/home/report/ReactionList/HeaderReactionList.tsx b/src/pages/home/report/ReactionList/HeaderReactionList.tsx index e715f6010fc3..bf6c7c1192a5 100644 --- a/src/pages/home/report/ReactionList/HeaderReactionList.tsx +++ b/src/pages/home/report/ReactionList/HeaderReactionList.tsx @@ -5,7 +5,7 @@ import useStyleUtils from '@hooks/useStyleUtils'; import useThemeStyles from '@hooks/useThemeStyles'; import useWindowDimensions from '@hooks/useWindowDimensions'; import * as EmojiUtils from '@libs/EmojiUtils'; -import type {ReactionListProps} from './types'; +import type ReactionListProps from './types'; type HeaderReactionListProps = ReactionListProps & { /** Returns true if the current account has reacted to the report action (with the given skin tone). */ diff --git a/src/pages/home/report/ReactionList/types.ts b/src/pages/home/report/ReactionList/types.ts index ec03b141080d..eb5dfe1d998e 100644 --- a/src/pages/home/report/ReactionList/types.ts +++ b/src/pages/home/report/ReactionList/types.ts @@ -12,4 +12,4 @@ type ReactionListProps = { emojiCount: number; }; -export type {ReactionListProps}; +export default ReactionListProps; From ffe26d60a5dc6916dcec7c9f913d87f9c4c988e5 Mon Sep 17 00:00:00 2001 From: vadymbokatov <138146362+vadymbokatov@users.noreply.github.com> Date: Wed, 24 Jan 2024 14:44:48 +0100 Subject: [PATCH 045/288] Update src/pages/home/report/ReactionList/PopoverReactionList/index.tsx MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Błażej Kustra <46095609+blazejkustra@users.noreply.github.com> --- .../report/ReactionList/PopoverReactionList/index.tsx | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/pages/home/report/ReactionList/PopoverReactionList/index.tsx b/src/pages/home/report/ReactionList/PopoverReactionList/index.tsx index 610146559786..4368f5a609ab 100644 --- a/src/pages/home/report/ReactionList/PopoverReactionList/index.tsx +++ b/src/pages/home/report/ReactionList/PopoverReactionList/index.tsx @@ -38,12 +38,4 @@ function PopoverReactionList(props: PopoverReactionListProps) { PopoverReactionList.displayName = 'PopoverReactionList'; -export default React.memo( - forwardRef((props, ref) => ( - - )), -); +export default React.memo(forwardRef(PopoverReactionList)); From a1a4f17f6c44190a5f63b131e0b76056d87a93e4 Mon Sep 17 00:00:00 2001 From: vadymbokatov <138146362+vadymbokatov@users.noreply.github.com> Date: Wed, 24 Jan 2024 14:45:38 +0100 Subject: [PATCH 046/288] Update src/pages/home/report/ReactionList/BaseReactionList.tsx MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Błażej Kustra <46095609+blazejkustra@users.noreply.github.com> --- src/pages/home/report/ReactionList/BaseReactionList.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/pages/home/report/ReactionList/BaseReactionList.tsx b/src/pages/home/report/ReactionList/BaseReactionList.tsx index f1002bddcddc..bec68ba268ff 100755 --- a/src/pages/home/report/ReactionList/BaseReactionList.tsx +++ b/src/pages/home/report/ReactionList/BaseReactionList.tsx @@ -78,9 +78,7 @@ function BaseReactionList(props: BaseReactionListProps) { style={{maxWidth: variables.mobileResponsiveWidthBreakpoint}} hoverStyle={hoveredComponentBG} onSelectRow={() => { - if (props.onClose) { - props.onClose(); - } + props.onClose?.(); Navigation.navigate(ROUTES.PROFILE.getRoute(item.accountID)); }} From 1059ccfb9be071330b004b744a2e46abb3d7e77d Mon Sep 17 00:00:00 2001 From: vadymbokatov <138146362+vadymbokatov@users.noreply.github.com> Date: Wed, 24 Jan 2024 14:46:05 +0100 Subject: [PATCH 047/288] Update src/pages/home/report/ReactionList/BaseReactionList.tsx MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Błażej Kustra <46095609+blazejkustra@users.noreply.github.com> --- src/pages/home/report/ReactionList/BaseReactionList.tsx | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/pages/home/report/ReactionList/BaseReactionList.tsx b/src/pages/home/report/ReactionList/BaseReactionList.tsx index bec68ba268ff..c905630f547c 100755 --- a/src/pages/home/report/ReactionList/BaseReactionList.tsx +++ b/src/pages/home/report/ReactionList/BaseReactionList.tsx @@ -68,9 +68,6 @@ function BaseReactionList(props: BaseReactionListProps) { * Items with the code "SPACER" return nothing and are used to fill rows up to 8 * so that the sticky headers function properly * - * @param params object - * @param params.item object - * @return React.Component */ const renderItem: FlatListProps['renderItem'] = ({item}) => ( Date: Wed, 24 Jan 2024 14:46:53 +0100 Subject: [PATCH 048/288] Update src/pages/home/report/ReactionList/PopoverReactionList/BasePopoverReactionList.tsx MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Błażej Kustra <46095609+blazejkustra@users.noreply.github.com> --- .../ReactionList/PopoverReactionList/BasePopoverReactionList.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/pages/home/report/ReactionList/PopoverReactionList/BasePopoverReactionList.tsx b/src/pages/home/report/ReactionList/PopoverReactionList/BasePopoverReactionList.tsx index 3f5fdeb6428f..5ef74a62ec67 100644 --- a/src/pages/home/report/ReactionList/PopoverReactionList/BasePopoverReactionList.tsx +++ b/src/pages/home/report/ReactionList/PopoverReactionList/BasePopoverReactionList.tsx @@ -9,7 +9,6 @@ import BaseReactionList from '@pages/home/report/ReactionList/BaseReactionList'; import ONYXKEYS from '@src/ONYXKEYS'; function BasePopoverReactionList(props: BasePopoverReactionListPropsWithLocalWithOnyx) { - // hooks const {emojiReactions, emojiName, reportActionID, currentUserPersonalDetails} = props; const {preferredLocale} = useLocalize(); const {isPopoverVisible, hideReactionList, popoverAnchorPosition, reactionListRef, getReactionInformation} = useBasePopoverReactionList({ From f165f6d5b60baf6b6b57305c8ec8f9557ebee518 Mon Sep 17 00:00:00 2001 From: cdOut <88325488+cdOut@users.noreply.github.com> Date: Wed, 24 Jan 2024 14:49:48 +0100 Subject: [PATCH 049/288] fix: init with stored value for shownHoldUseExplaination --- src/components/MoneyRequestHeader.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/MoneyRequestHeader.js b/src/components/MoneyRequestHeader.js index 5c69d7a88c3f..2997d00bdd52 100644 --- a/src/components/MoneyRequestHeader.js +++ b/src/components/MoneyRequestHeader.js @@ -271,7 +271,7 @@ export default compose( }, shownHoldUseExplaination: { key: ONYXKEYS.NVP_HOLD_USE_EXPLAINED, - initWithStoredValues: false, + initWithStoredValues: true, }, }), )(MoneyRequestHeader); From ffca03ed05404e85a1cc271cace70016c03d2c57 Mon Sep 17 00:00:00 2001 From: Vadym Date: Wed, 24 Jan 2024 16:22:38 +0100 Subject: [PATCH 050/288] fix: ref object not getting passed as the second arg --- .../report/ReactionList/PopoverReactionList/index.tsx | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/pages/home/report/ReactionList/PopoverReactionList/index.tsx b/src/pages/home/report/ReactionList/PopoverReactionList/index.tsx index 4368f5a609ab..75b8e080b301 100644 --- a/src/pages/home/report/ReactionList/PopoverReactionList/index.tsx +++ b/src/pages/home/report/ReactionList/PopoverReactionList/index.tsx @@ -4,11 +4,7 @@ import type {InnerReactionListRefType} from '@hooks/useBasePopoverReactionList/t import type {ReactionListRef} from '@pages/home/ReportScreenContext'; import BasePopoverReactionList from './BasePopoverReactionList'; -type PopoverReactionListProps = { - ref: ForwardedRef; -}; - -function PopoverReactionList(props: PopoverReactionListProps) { +function PopoverReactionList(props: unknown, ref: ForwardedRef) { const innerReactionListRef = useRef(null); const [reactionListReportActionID, setReactionListReportActionID] = useState(''); const [reactionListEmojiName, setReactionListEmojiName] = useState(''); @@ -25,7 +21,7 @@ function PopoverReactionList(props: PopoverReactionListProps) { const isActiveReportAction = (actionID: number | string) => Boolean(actionID) && reactionListReportActionID === actionID; - useImperativeHandle(props.ref, () => ({showReactionList, hideReactionList, isActiveReportAction})); + useImperativeHandle(ref, () => ({showReactionList, hideReactionList, isActiveReportAction})); return ( Date: Wed, 24 Jan 2024 16:25:41 +0100 Subject: [PATCH 051/288] fix: types naming convention --- src/hooks/useBasePopoverReactionList/types.ts | 4 ++-- .../home/report/ReactionList/PopoverReactionList/index.tsx | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/hooks/useBasePopoverReactionList/types.ts b/src/hooks/useBasePopoverReactionList/types.ts index e4ba9263b41b..49620ccd9370 100644 --- a/src/hooks/useBasePopoverReactionList/types.ts +++ b/src/hooks/useBasePopoverReactionList/types.ts @@ -47,7 +47,7 @@ type BasePopoverReactionListState = { type ShowReactionList = (event: ReactionListEvent | undefined, reactionListAnchor: ReactionListAnchor) => void; -type InnerReactionListRefType = { +type InnerReactionListRef = { showReactionList: ShowReactionList; hideReactionList: () => void; isActiveReportAction: (actionID: number | string) => boolean; @@ -61,5 +61,5 @@ export type { BasePopoverReactionListOnyxProps, ShowReactionList, ReactionListAnchor, - InnerReactionListRefType, + InnerReactionListRef, }; diff --git a/src/pages/home/report/ReactionList/PopoverReactionList/index.tsx b/src/pages/home/report/ReactionList/PopoverReactionList/index.tsx index 75b8e080b301..e7899c814568 100644 --- a/src/pages/home/report/ReactionList/PopoverReactionList/index.tsx +++ b/src/pages/home/report/ReactionList/PopoverReactionList/index.tsx @@ -1,11 +1,11 @@ import React, {forwardRef, useImperativeHandle, useRef, useState} from 'react'; import type {ForwardedRef} from 'react'; -import type {InnerReactionListRefType} from '@hooks/useBasePopoverReactionList/types'; +import type {InnerReactionListRef} from '@hooks/useBasePopoverReactionList/types'; import type {ReactionListRef} from '@pages/home/ReportScreenContext'; import BasePopoverReactionList from './BasePopoverReactionList'; function PopoverReactionList(props: unknown, ref: ForwardedRef) { - const innerReactionListRef = useRef(null); + const innerReactionListRef = useRef(null); const [reactionListReportActionID, setReactionListReportActionID] = useState(''); const [reactionListEmojiName, setReactionListEmojiName] = useState(''); From cebd4dcc436ec9a1f9f618f29c4f0a84265e6eb5 Mon Sep 17 00:00:00 2001 From: Vadym Date: Wed, 24 Jan 2024 16:37:36 +0100 Subject: [PATCH 052/288] chore: removes unneeded JSDocs --- .../report/ReactionList/BaseReactionList.tsx | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/src/pages/home/report/ReactionList/BaseReactionList.tsx b/src/pages/home/report/ReactionList/BaseReactionList.tsx index c905630f547c..80ffd11e59ba 100755 --- a/src/pages/home/report/ReactionList/BaseReactionList.tsx +++ b/src/pages/home/report/ReactionList/BaseReactionList.tsx @@ -32,24 +32,8 @@ type BaseReactionListProps = ReactionListProps & { isVisible: boolean; }; -/** - * Create a unique key for each action in the FlatList. - * @param item object - * @param index number - * @return string - */ const keyExtractor: FlatListProps['keyExtractor'] = (item, index) => `${item.login}+${index}`; -/** - * This function will be used with FlatList getItemLayout property for optimization purpose that allows skipping - * the measurement of dynamic content if we know the size (height or width) of items ahead of time. - * Generate and return an object with properties length(height of each individual row), - * offset(distance of the current row from the top of the FlatList), index(current row index) - * - * @param data FlatList item - * @param index number - row index - * @returns object - */ const getItemLayout = (data: ArrayLike | null | undefined, index: number): {length: number; offset: number; index: number} => ({ index, length: variables.listItemHeightNormal, From 3f8233674cb94e7a6a92ebdb4c517ec4b29aac95 Mon Sep 17 00:00:00 2001 From: Vadym Date: Wed, 24 Jan 2024 16:51:22 +0100 Subject: [PATCH 053/288] chore: makes isVisible prop optional --- src/pages/home/report/ReactionList/BaseReactionList.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/home/report/ReactionList/BaseReactionList.tsx b/src/pages/home/report/ReactionList/BaseReactionList.tsx index 80ffd11e59ba..a49c4d832f30 100755 --- a/src/pages/home/report/ReactionList/BaseReactionList.tsx +++ b/src/pages/home/report/ReactionList/BaseReactionList.tsx @@ -29,7 +29,7 @@ type BaseReactionListProps = ReactionListProps & { /** * Returns true if the reaction list is visible */ - isVisible: boolean; + isVisible?: boolean; }; const keyExtractor: FlatListProps['keyExtractor'] = (item, index) => `${item.login}+${index}`; From c155fe3ba4fefe04ee8979f48c05fee7ed8d4011 Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Wed, 24 Jan 2024 13:19:31 -0500 Subject: [PATCH 054/288] feat(Violations): make translations consistent --- src/languages/en.ts | 13 +++--- src/languages/es.ts | 15 ++++--- src/languages/types.ts | 12 +++--- src/libs/Violations/ViolationsUtils.ts | 60 ++++++++++++++++---------- 4 files changed, 57 insertions(+), 43 deletions(-) diff --git a/src/languages/en.ts b/src/languages/en.ts index 7a4cc6ec4559..8ca47f88cea2 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -83,7 +83,6 @@ import type { ViolationsInvoiceMarkupParams, ViolationsMaxAgeParams, ViolationsMissingTagParams, - ViolationsOverAutoApprovalLimitParams, ViolationsOverCategoryLimitParams, ViolationsOverLimitParams, ViolationsPerDayLimitParams, @@ -2086,7 +2085,7 @@ export default { allTagLevelsRequired: 'All tags required', autoReportedRejectedExpense: ({rejectReason, rejectedBy}: ViolationsAutoReportedRejectedExpenseParams) => `${rejectedBy} rejected this expense with the comment "${rejectReason}"`, billableExpense: 'Billable no longer valid', - cashExpenseWithNoReceipt: ({amount}: ViolationsCashExpenseWithNoReceiptParams) => `Receipt required over ${amount}`, + cashExpenseWithNoReceipt: ({formattedLimit}: ViolationsCashExpenseWithNoReceiptParams) => `Receipt required${formattedLimit ? ` over ${formattedLimit}` : ''}`, categoryOutOfPolicy: 'Category no longer valid', conversionSurcharge: ({surcharge}: ViolationsConversionSurchargeParams) => `Applied ${surcharge}% conversion surcharge`, customUnitOutOfPolicy: 'Unit no longer valid', @@ -2101,11 +2100,11 @@ export default { modifiedAmount: 'Amount greater than scanned receipt', modifiedDate: 'Date differs from scanned receipt', nonExpensiworksExpense: 'Non-Expensiworks expense', - overAutoApprovalLimit: ({formattedLimitAmount}: ViolationsOverAutoApprovalLimitParams) => `Expense exceeds auto approval limit of ${formattedLimitAmount}`, - overCategoryLimit: ({categoryLimit}: ViolationsOverCategoryLimitParams) => `Amount over ${categoryLimit}/person category limit`, - overLimit: ({amount}: ViolationsOverLimitParams) => `Amount over ${amount}/person limit`, - overLimitAttendee: ({amount}: ViolationsOverLimitParams) => `Amount over ${amount}/person limit`, - perDayLimit: ({limit}: ViolationsPerDayLimitParams) => `Amount over daily ${limit}/person category limit`, + overAutoApprovalLimit: ({formattedLimit}: ViolationsOverLimitParams) => `Expense exceeds auto approval limit of ${formattedLimit}`, + overCategoryLimit: ({formattedLimit}: ViolationsOverCategoryLimitParams) => `Amount over ${formattedLimit}/person category limit`, + overLimit: ({formattedLimit}: ViolationsOverLimitParams) => `Amount over ${formattedLimit}/person limit`, + overLimitAttendee: ({formattedLimit}: ViolationsOverLimitParams) => `Amount over ${formattedLimit}/person limit`, + perDayLimit: ({formattedLimit}: ViolationsPerDayLimitParams) => `Amount over daily ${formattedLimit}/person category limit`, receiptNotSmartScanned: 'Receipt not verified. Please confirm accuracy.', receiptRequired: (params: ViolationsReceiptRequiredParams) => `Receipt required${params ? ` over ${params.formattedLimit}${params.category ? ` category limit` : ''}` : ''}`, reviewRequired: 'Review required', diff --git a/src/languages/es.ts b/src/languages/es.ts index 07cb81827d11..411c62ee42f2 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -2573,9 +2573,9 @@ export default { allTagLevelsRequired: 'Todas las etiquetas son obligatorias', autoReportedRejectedExpense: ({rejectedBy, rejectReason}: ViolationsAutoReportedRejectedExpenseParams) => `${rejectedBy} rechazó la solicitud y comentó "${rejectReason}"`, billableExpense: 'La opción facturable ya no es válida', - cashExpenseWithNoReceipt: ({amount}: ViolationsCashExpenseWithNoReceiptParams) => `Recibo obligatorio para montos mayores a ${amount}`, + cashExpenseWithNoReceipt: ({formattedLimit}: ViolationsCashExpenseWithNoReceiptParams) => `Recibo obligatorio para montos mayores a ${formattedLimit}`, categoryOutOfPolicy: 'La categoría ya no es válida', - conversionSurcharge: ({surcharge}: ViolationsConversionSurchargeParams) => `${surcharge}% de recargo aplicado`, + conversionSurcharge: ({surcharge}: ViolationsConversionSurchargeParams = {}) => `${surcharge}% de recargo aplicado`, customUnitOutOfPolicy: 'Unidad ya no es válida', duplicatedTransaction: 'Potencial duplicado', fieldRequired: 'Los campos del informe son obligatorios', @@ -2588,11 +2588,12 @@ export default { modifiedAmount: 'Importe superior al del recibo escaneado', modifiedDate: 'Fecha difiere del recibo escaneado', nonExpensiworksExpense: 'Gasto no es de Expensiworks', - overAutoApprovalLimit: ({formattedLimitAmount}: ViolationsOverAutoApprovalLimitParams) => `Importe supera el límite de aprobación automática de ${formattedLimitAmount}`, - overCategoryLimit: ({categoryLimit}: ViolationsOverCategoryLimitParams) => `Importe supera el límite para la categoría de ${categoryLimit}/persona`, - overLimit: ({amount}: ViolationsOverLimitParams) => `Importe supera el límite de ${amount}/persona`, - overLimitAttendee: ({amount}: ViolationsOverLimitParams) => `Importe supera el límite de ${amount}/persona`, - perDayLimit: ({limit}: ViolationsPerDayLimitParams) => `Importe supera el límite diario de la categoría de ${limit}/persona`, + overAutoApprovalLimit: ({formattedLimit}: ViolationsOverAutoApprovalLimitParams) => + `Importe supera el límite de aprobación automática${formattedLimit ? ` de ${formattedLimit}` : ''}`, + overCategoryLimit: ({formattedLimit}: ViolationsOverCategoryLimitParams) => `Importe supera el límite para la categoría${formattedLimit ? ` de ${formattedLimit}/persona` : ''}`, + overLimit: ({formattedLimit}: ViolationsOverLimitParams) => `Importe supera el límite${formattedLimit ? ` de ${formattedLimit}/persona` : ''}`, + overLimitAttendee: ({formattedLimit}: ViolationsOverLimitParams) => `Importe supera el límite${formattedLimit ? ` de ${formattedLimit}/persona` : ''}`, + perDayLimit: ({formattedLimit}: ViolationsPerDayLimitParams) => `Importe supera el límite diario de la categoría${formattedLimit ? ` de ${formattedLimit}/persona` : ''}`, receiptNotSmartScanned: 'Recibo no verificado. Por favor, confirma su exactitud', receiptRequired: (params: ViolationsReceiptRequiredParams) => `Recibo obligatorio${params ? ` para importes sobre${params.category ? ` el limite de la categoría de` : ''} ${params.formattedLimit}` : ''}`, diff --git a/src/languages/types.ts b/src/languages/types.ts index e69b4bd49686..2168f324b331 100644 --- a/src/languages/types.ts +++ b/src/languages/types.ts @@ -215,7 +215,7 @@ type WalletProgramParams = {walletProgram: string}; type ViolationsAutoReportedRejectedExpenseParams = {rejectedBy: string; rejectReason: string}; -type ViolationsCashExpenseWithNoReceiptParams = {amount: string}; +type ViolationsCashExpenseWithNoReceiptParams = {formattedLimit?: string}; type ViolationsConversionSurchargeParams = {surcharge?: number}; @@ -225,15 +225,15 @@ type ViolationsMaxAgeParams = {maxAge: number}; type ViolationsMissingTagParams = {tagName?: string} | null; -type ViolationsOverAutoApprovalLimitParams = {formattedLimitAmount: string}; +type ViolationsOverAutoApprovalLimitParams = {formattedLimit?: string}; -type ViolationsOverCategoryLimitParams = {categoryLimit: string}; +type ViolationsOverCategoryLimitParams = {formattedLimit?: string}; -type ViolationsOverLimitParams = {amount: string}; +type ViolationsOverLimitParams = {formattedLimit?: string}; -type ViolationsPerDayLimitParams = {limit: string}; +type ViolationsPerDayLimitParams = {formattedLimit?: string}; -type ViolationsReceiptRequiredParams = {formattedLimit: string; category?: string} | null; +type ViolationsReceiptRequiredParams = {formattedLimit?: string; category?: string} | null; type ViolationsRterParams = { brokenBankConnection: boolean; diff --git a/src/libs/Violations/ViolationsUtils.ts b/src/libs/Violations/ViolationsUtils.ts index 86f60ed04aa5..5b94116e36e6 100644 --- a/src/libs/Violations/ViolationsUtils.ts +++ b/src/libs/Violations/ViolationsUtils.ts @@ -93,22 +93,39 @@ const ViolationsUtils = { violation: TransactionViolation, translate: (phraseKey: TKey, ...phraseParameters: PhraseParameters>) => string, ): string { + const { + brokenBankConnection = false, + isAdmin = false, + email, + isTransactionOlderThan7Days = false, + member, + category, + rejectedBy = '', + rejectReason = '', + formattedLimit, + surcharge, + invoiceMarkup, + maxAge = 0, + tagName, + taxName, + } = violation.data ?? {}; + switch (violation.name) { case 'allTagLevelsRequired': return translate('violations.allTagLevelsRequired'); case 'autoReportedRejectedExpense': return translate('violations.autoReportedRejectedExpense', { - rejectedBy: violation.data?.rejectedBy ?? '', - rejectReason: violation.data?.rejectReason ?? '', + rejectedBy, + rejectReason, }); case 'billableExpense': return translate('violations.billableExpense'); case 'cashExpenseWithNoReceipt': - return translate('violations.cashExpenseWithNoReceipt', {amount: violation.data?.amount ?? ''}); + return translate('violations.cashExpenseWithNoReceipt', {formattedLimit}); case 'categoryOutOfPolicy': return translate('violations.categoryOutOfPolicy'); case 'conversionSurcharge': - return translate('violations.conversionSurcharge', {surcharge: violation.data?.surcharge}); + return translate('violations.conversionSurcharge', {surcharge}); case 'customUnitOutOfPolicy': return translate('violations.customUnitOutOfPolicy'); case 'duplicatedTransaction': @@ -118,15 +135,15 @@ const ViolationsUtils = { case 'futureDate': return translate('violations.futureDate'); case 'invoiceMarkup': - return translate('violations.invoiceMarkup', {invoiceMarkup: violation.data?.invoiceMarkup}); + return translate('violations.invoiceMarkup', {invoiceMarkup}); case 'maxAge': - return translate('violations.maxAge', {maxAge: violation.data?.maxAge ?? 0}); + return translate('violations.maxAge', {maxAge}); case 'missingCategory': return translate('violations.missingCategory'); case 'missingComment': return translate('violations.missingComment'); case 'missingTag': - return translate('violations.missingTag', {tagName: violation.data?.tagName}); + return translate('violations.missingTag', {tagName}); case 'modifiedAmount': return translate('violations.modifiedAmount'); case 'modifiedDate': @@ -134,40 +151,37 @@ const ViolationsUtils = { case 'nonExpensiworksExpense': return translate('violations.nonExpensiworksExpense'); case 'overAutoApprovalLimit': - return translate('violations.overAutoApprovalLimit', {formattedLimitAmount: violation.data?.formattedLimit ?? ''}); + return translate('violations.overAutoApprovalLimit', {formattedLimit}); case 'overCategoryLimit': - return translate('violations.overCategoryLimit', {categoryLimit: violation.data?.categoryLimit ?? ''}); + return translate('violations.overCategoryLimit', {formattedLimit}); case 'overLimit': - return translate('violations.overLimit', {amount: violation.data?.amount ?? ''}); + return translate('violations.overLimit', {formattedLimit}); case 'overLimitAttendee': - return translate('violations.overLimitAttendee', {amount: violation.data?.amount ?? ''}); + return translate('violations.overLimitAttendee', {formattedLimit}); case 'perDayLimit': - return translate('violations.perDayLimit', {limit: violation.data?.limit ?? ''}); + return translate('violations.perDayLimit', {formattedLimit}); case 'receiptNotSmartScanned': return translate('violations.receiptNotSmartScanned'); case 'receiptRequired': - return translate('violations.receiptRequired', { - formattedLimit: violation.data?.formattedLimit ?? '0', - category: violation.data?.category ?? '', - }); + return translate('violations.receiptRequired', {formattedLimit, category}); case 'rter': return translate('violations.rter', { - brokenBankConnection: violation.data?.brokenBankConnection ?? false, - isAdmin: violation.data?.isAdmin ?? false, - email: violation.data?.email, - isTransactionOlderThan7Days: Boolean(violation.data?.isTransactionOlderThan7Days), - member: violation.data?.member, + brokenBankConnection, + isAdmin, + email, + isTransactionOlderThan7Days, + member, }); case 'smartscanFailed': return translate('violations.smartscanFailed'); case 'someTagLevelsRequired': return translate('violations.someTagLevelsRequired'); case 'tagOutOfPolicy': - return translate('violations.tagOutOfPolicy', {tagName: violation.data?.tagName}); + return translate('violations.tagOutOfPolicy', {tagName}); case 'taxAmountChanged': return translate('violations.taxAmountChanged'); case 'taxOutOfPolicy': - return translate('violations.taxOutOfPolicy', {taxName: violation.data?.taxName}); + return translate('violations.taxOutOfPolicy', {taxName}); case 'taxRateChanged': return translate('violations.taxRateChanged'); case 'taxRequired': From ef89600453a3a98a85b308a1aa6e78cc9b83bfff Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Wed, 24 Jan 2024 13:59:13 -0500 Subject: [PATCH 055/288] feat(Violations): refactor translations --- src/languages/en.ts | 2 +- src/languages/es.ts | 6 +++--- src/languages/types.ts | 4 ++-- src/libs/Violations/ViolationsUtils.ts | 6 +++--- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/languages/en.ts b/src/languages/en.ts index 7bde214af13f..38d848b013ea 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -2096,7 +2096,7 @@ export default { maxAge: ({maxAge}: ViolationsMaxAgeParams) => `Date older than ${maxAge} days`, missingCategory: 'Missing category', missingComment: 'Description required for selected category', - missingTag: (params: ViolationsMissingTagParams) => `Missing ${params?.tagName ?? 'tag'}`, + missingTag: ({tagName}: ViolationsMissingTagParams) => `Missing ${tagName ?? 'tag'}`, modifiedAmount: 'Amount greater than scanned receipt', modifiedDate: 'Date differs from scanned receipt', nonExpensiworksExpense: 'Non-Expensiworks expense', diff --git a/src/languages/es.ts b/src/languages/es.ts index 5326369965a8..9dd1a5145d98 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -2584,7 +2584,7 @@ export default { maxAge: ({maxAge}: ViolationsMaxAgeParams) => `Fecha de más de ${maxAge} días`, missingCategory: 'Falta categoría', missingComment: 'Descripción obligatoria para la categoría seleccionada', - missingTag: (params: ViolationsMissingTagParams) => `Falta ${params?.tagName ?? 'etiqueta'}`, + missingTag: ({tagName}: ViolationsMissingTagParams) => `Falta ${tagName ?? 'etiqueta'}`, modifiedAmount: 'Importe superior al del recibo escaneado', modifiedDate: 'Fecha difiere del recibo escaneado', nonExpensiworksExpense: 'Gasto no proviene de Expensiworks', @@ -2595,8 +2595,8 @@ export default { overLimitAttendee: ({formattedLimit}: ViolationsOverLimitParams) => `Importe supera el límite${formattedLimit ? ` de ${formattedLimit}/persona` : ''}`, perDayLimit: ({formattedLimit}: ViolationsPerDayLimitParams) => `Importe supera el límite diario de la categoría${formattedLimit ? ` de ${formattedLimit}/persona` : ''}`, receiptNotSmartScanned: 'Recibo no verificado. Por favor, confirma su exactitud', - receiptRequired: (params: ViolationsReceiptRequiredParams) => - `Recibo obligatorio${params ? ` para importes sobre${params.category ? ` el limite de la categoría de` : ''} ${params.formattedLimit}` : ''}`, + receiptRequired: ({category, formattedLimit}: ViolationsReceiptRequiredParams) => + `Recibo obligatorio${category || formattedLimit ? ` para importes sobre${category ? ` el limite de la categoría de` : ''} ${formattedLimit}` : ''}`, reviewRequired: 'Revisión requerida', rter: ({brokenBankConnection, isAdmin, email, isTransactionOlderThan7Days, member}: ViolationsRterParams) => { if (brokenBankConnection) { diff --git a/src/languages/types.ts b/src/languages/types.ts index e2449800703c..fd96c9c8c1dd 100644 --- a/src/languages/types.ts +++ b/src/languages/types.ts @@ -223,7 +223,7 @@ type ViolationsInvoiceMarkupParams = {invoiceMarkup?: number}; type ViolationsMaxAgeParams = {maxAge: number}; -type ViolationsMissingTagParams = {tagName?: string} | null; +type ViolationsMissingTagParams = {tagName?: string}; type ViolationsOverAutoApprovalLimitParams = {formattedLimit?: string}; @@ -233,7 +233,7 @@ type ViolationsOverLimitParams = {formattedLimit?: string}; type ViolationsPerDayLimitParams = {formattedLimit?: string}; -type ViolationsReceiptRequiredParams = {formattedLimit?: string; category?: string} | null; +type ViolationsReceiptRequiredParams = {formattedLimit?: string; category?: string}; type ViolationsRterParams = { brokenBankConnection: boolean; diff --git a/src/libs/Violations/ViolationsUtils.ts b/src/libs/Violations/ViolationsUtils.ts index 5b94116e36e6..20c29b0fb208 100644 --- a/src/libs/Violations/ViolationsUtils.ts +++ b/src/libs/Violations/ViolationsUtils.ts @@ -103,10 +103,10 @@ const ViolationsUtils = { rejectedBy = '', rejectReason = '', formattedLimit, - surcharge, - invoiceMarkup, + surcharge = 0, + invoiceMarkup = 0, maxAge = 0, - tagName, + tagName = 'etiqueta', taxName, } = violation.data ?? {}; From ac5f0889d73ca657b25c097ead4cb5159fad02f9 Mon Sep 17 00:00:00 2001 From: Vadym Date: Wed, 24 Jan 2024 20:09:46 +0100 Subject: [PATCH 056/288] fix: menu ref not getting forwarded and menu not showing up --- src/hooks/useBasePopoverReactionList/index.ts | 12 ++++++------ .../home/report/ReactionList/HeaderReactionList.tsx | 1 + .../PopoverReactionList/BasePopoverReactionList.tsx | 12 ++++++++---- .../ReactionList/PopoverReactionList/index.tsx | 4 ++++ 4 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/hooks/useBasePopoverReactionList/index.ts b/src/hooks/useBasePopoverReactionList/index.ts index cccb8a99b526..64c5f6d8efc0 100644 --- a/src/hooks/useBasePopoverReactionList/index.ts +++ b/src/hooks/useBasePopoverReactionList/index.ts @@ -1,4 +1,4 @@ -import {useEffect, useMemo, useRef, useState} from 'react'; +import {useEffect, useRef, useState} from 'react'; import type {SyntheticEvent} from 'react'; import {Dimensions} from 'react-native'; import * as EmojiUtils from '@libs/EmojiUtils'; @@ -11,11 +11,10 @@ export default function useBasePopoverReactionList({emojiName, emojiReactions, a const [popoverAnchorPosition, setPopoverAnchorPosition] = useState({horizontal: 0, vertical: 0}); const reactionListRef = useRef(null); - // Get the selected reaction - const selectedReaction = useMemo(() => (isPopoverVisible ? emojiReactions?.emojiName : null), [isPopoverVisible, emojiReactions]); - // custom methods function getReactionInformation() { + const selectedReaction = emojiReactions?.[emojiName]; + if (!selectedReaction) { // If there is no reaction, we return default values return { @@ -121,8 +120,9 @@ export default function useBasePopoverReactionList({emojiName, emojiReactions, a } // Hide the list when all reactions are removed - const emojiReactionsList = emojiReactions?.emojiName.users; - const isEmptyList = Array.isArray(emojiReactionsList) && !emojiReactionsList.some((emojiReaction) => emojiReaction); + const users = emojiReactions?.[emojiName].users; + const isEmptyList = users && Object.keys(users).length === 0; + if (!isEmptyList) { return; } diff --git a/src/pages/home/report/ReactionList/HeaderReactionList.tsx b/src/pages/home/report/ReactionList/HeaderReactionList.tsx index bf6c7c1192a5..5742566e115c 100644 --- a/src/pages/home/report/ReactionList/HeaderReactionList.tsx +++ b/src/pages/home/report/ReactionList/HeaderReactionList.tsx @@ -1,3 +1,4 @@ +import React from 'react'; import {View} from 'react-native'; import Text from '@components/Text'; import useLocalize from '@hooks/useLocalize'; diff --git a/src/pages/home/report/ReactionList/PopoverReactionList/BasePopoverReactionList.tsx b/src/pages/home/report/ReactionList/PopoverReactionList/BasePopoverReactionList.tsx index 5ef74a62ec67..6a464c46cce8 100644 --- a/src/pages/home/report/ReactionList/PopoverReactionList/BasePopoverReactionList.tsx +++ b/src/pages/home/report/ReactionList/PopoverReactionList/BasePopoverReactionList.tsx @@ -1,4 +1,5 @@ -import React from 'react'; +import React, {forwardRef, useImperativeHandle} from 'react'; +import type {ForwardedRef} from 'react'; import {withOnyx} from 'react-native-onyx'; import PopoverWithMeasuredContent from '@components/PopoverWithMeasuredContent'; import withCurrentUserPersonalDetails from '@components/withCurrentUserPersonalDetails'; @@ -6,12 +7,13 @@ import useBasePopoverReactionList from '@hooks/useBasePopoverReactionList'; import type {BasePopoverReactionListOnyxProps, BasePopoverReactionListPropsWithLocalWithOnyx} from '@hooks/useBasePopoverReactionList/types'; import useLocalize from '@hooks/useLocalize'; import BaseReactionList from '@pages/home/report/ReactionList/BaseReactionList'; +import type {ReactionListRef} from '@pages/home/ReportScreenContext'; import ONYXKEYS from '@src/ONYXKEYS'; -function BasePopoverReactionList(props: BasePopoverReactionListPropsWithLocalWithOnyx) { +function BasePopoverReactionList(props: BasePopoverReactionListPropsWithLocalWithOnyx, ref: ForwardedRef>) { const {emojiReactions, emojiName, reportActionID, currentUserPersonalDetails} = props; const {preferredLocale} = useLocalize(); - const {isPopoverVisible, hideReactionList, popoverAnchorPosition, reactionListRef, getReactionInformation} = useBasePopoverReactionList({ + const {isPopoverVisible, hideReactionList, showReactionList, popoverAnchorPosition, reactionListRef, getReactionInformation} = useBasePopoverReactionList({ emojiName, emojiReactions, accountID: currentUserPersonalDetails.accountID, @@ -21,6 +23,8 @@ function BasePopoverReactionList(props: BasePopoverReactionListPropsWithLocalWit // Get the reaction information const {emojiCodes, reactionCount, hasUserReacted, users} = getReactionInformation(); + useImperativeHandle(ref, () => ({hideReactionList, showReactionList})); + return ( `${ONYXKEYS.COLLECTION.REPORT_ACTIONS_REACTIONS}${reportActionID}`, }, - })(BasePopoverReactionList), + })(forwardRef(BasePopoverReactionList)), ); diff --git a/src/pages/home/report/ReactionList/PopoverReactionList/index.tsx b/src/pages/home/report/ReactionList/PopoverReactionList/index.tsx index e7899c814568..2cdcac65feae 100644 --- a/src/pages/home/report/ReactionList/PopoverReactionList/index.tsx +++ b/src/pages/home/report/ReactionList/PopoverReactionList/index.tsx @@ -23,6 +23,10 @@ function PopoverReactionList(props: unknown, ref: ForwardedRef) useImperativeHandle(ref, () => ({showReactionList, hideReactionList, isActiveReportAction})); + if (reactionListReportActionID === '' || reactionListEmojiName === '') { + return null; + } + return ( Date: Wed, 24 Jan 2024 14:14:57 -0500 Subject: [PATCH 057/288] feat(Violations): extract MoneyRequestPreviewWrapper and PropTypes --- .../ReportActionItem/MoneyRequestPreview.js | 139 +----------------- .../MoneyRequestPreviewWrapper.js | 41 ++++++ .../moneyRequestPreviewPropTypes.js | 103 +++++++++++++ 3 files changed, 147 insertions(+), 136 deletions(-) create mode 100644 src/components/ReportActionItem/MoneyRequestPreviewWrapper.js create mode 100644 src/components/ReportActionItem/moneyRequestPreviewPropTypes.js diff --git a/src/components/ReportActionItem/MoneyRequestPreview.js b/src/components/ReportActionItem/MoneyRequestPreview.js index 87b33ee6f3c4..9319f71631ed 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview.js +++ b/src/components/ReportActionItem/MoneyRequestPreview.js @@ -1,10 +1,8 @@ import ExpensiMark from 'expensify-common/lib/ExpensiMark'; import {truncate} from 'lodash'; import lodashGet from 'lodash/get'; -import PropTypes from 'prop-types'; import React, {useMemo} from 'react'; import {View} from 'react-native'; -import {withOnyx} from 'react-native-onyx'; import _ from 'underscore'; import Icon from '@components/Icon'; import * as Expensicons from '@components/Icon/Expensicons'; @@ -12,11 +10,9 @@ import MoneyRequestSkeletonView from '@components/MoneyRequestSkeletonView'; import MultipleAvatars from '@components/MultipleAvatars'; import OfflineWithFeedback from '@components/OfflineWithFeedback'; import PressableWithFeedback from '@components/Pressable/PressableWithoutFeedback'; -import refPropTypes from '@components/refPropTypes'; import RenderHTML from '@components/RenderHTML'; import {showContextMenuForReport} from '@components/ShowContextMenuContext'; import Text from '@components/Text'; -import transactionPropTypes from '@components/transactionPropTypes'; import useLocalize from '@hooks/useLocalize'; import useStyleUtils from '@hooks/useStyleUtils'; import useTheme from '@hooks/useTheme'; @@ -31,115 +27,13 @@ import * as ReceiptUtils from '@libs/ReceiptUtils'; import * as ReportActionsUtils from '@libs/ReportActionsUtils'; import * as ReportUtils from '@libs/ReportUtils'; import * as TransactionUtils from '@libs/TransactionUtils'; -import {transactionViolationsPropType} from '@libs/Violations/propTypes'; -import walletTermsPropTypes from '@pages/EnablePayments/walletTermsPropTypes'; -import reportActionPropTypes from '@pages/home/report/reportActionPropTypes'; -import iouReportPropTypes from '@pages/iouReportPropTypes'; -import reportPropTypes from '@pages/reportPropTypes'; import * as PaymentMethods from '@userActions/PaymentMethods'; import * as Report from '@userActions/Report'; import CONST from '@src/CONST'; import * as Localize from '@src/libs/Localize'; -import ONYXKEYS from '@src/ONYXKEYS'; +import PropTypes from './moneyRequestPreviewPropTypes'; import ReportActionItemImages from './ReportActionItemImages'; -const propTypes = { - /** The active IOUReport, used for Onyx subscription */ - // eslint-disable-next-line react/no-unused-prop-types - iouReportID: PropTypes.string.isRequired, - - /** The associated chatReport */ - chatReportID: PropTypes.string.isRequired, - - /** Callback for the preview pressed */ - onPreviewPressed: PropTypes.func, - - /** All the data of the action, used for showing context menu */ - action: PropTypes.shape(reportActionPropTypes), - - /** Popover context menu anchor, used for showing context menu */ - contextMenuAnchor: refPropTypes, - - /** Callback for updating context menu active state, used for showing context menu */ - checkIfContextMenuActive: PropTypes.func, - - /** Extra styles to pass to View wrapper */ - // eslint-disable-next-line react/forbid-prop-types - containerStyles: PropTypes.arrayOf(PropTypes.object), - - /* Onyx Props */ - - /** chatReport associated with iouReport */ - chatReport: reportPropTypes, - - /** IOU report data object */ - iouReport: iouReportPropTypes, - - /** True if this is this IOU is a split instead of a 1:1 request */ - isBillSplit: PropTypes.bool.isRequired, - - /** True if the IOU Preview card is hovered */ - isHovered: PropTypes.bool, - - /** All of the personal details for everyone */ - personalDetails: PropTypes.objectOf( - PropTypes.shape({ - /** This is either the user's full name, or their login if full name is an empty string */ - displayName: PropTypes.string, - }), - ), - - /** The transaction attached to the action.message.iouTransactionID */ - transaction: transactionPropTypes, - - /** Session info for the currently logged in user. */ - session: PropTypes.shape({ - /** Currently logged in user email */ - email: PropTypes.string, - }), - - /** Information about the user accepting the terms for payments */ - walletTerms: walletTermsPropTypes, - - /** Whether or not an IOU report contains money requests in a different currency - * that are either created or cancelled offline, and thus haven't been converted to the report's currency yet - */ - shouldShowPendingConversionMessage: PropTypes.bool, - - /** Whether a message is a whisper */ - isWhisper: PropTypes.bool, - - /** All transactionViolations */ - transactionViolations: transactionViolationsPropType, -}; - -const defaultProps = { - iouReport: {}, - onPreviewPressed: null, - action: undefined, - contextMenuAnchor: undefined, - checkIfContextMenuActive: () => {}, - containerStyles: [], - walletTerms: {}, - chatReport: {}, - isHovered: false, - personalDetails: {}, - session: { - email: null, - }, - transaction: {}, - shouldShowPendingConversionMessage: false, - isWhisper: false, - transactionViolations: {}, -}; - -// We should not render the component if there is no iouReport and it's not a split. -// Moved outside of the component scope to allow memoization of values later. -function MoneyRequestPreviewWrapper(props) { - // eslint-disable-next-line react/jsx-props-no-spreading - return _.isEmpty(props.iouReport) && !props.isBillSplit ? null : ; -} - function MoneyRequestPreview(props) { const theme = useTheme(); const styles = useThemeStyles(); @@ -398,33 +292,6 @@ function MoneyRequestPreview(props) { ); } -MoneyRequestPreview.propTypes = propTypes; -MoneyRequestPreview.defaultProps = defaultProps; +MoneyRequestPreview.propTypes = PropTypes.propTypes; +MoneyRequestPreview.defaultProps = PropTypes.defaultProps; MoneyRequestPreview.displayName = 'MoneyRequestPreview'; -MoneyRequestPreviewWrapper.propTypes = propTypes; -MoneyRequestPreviewWrapper.defaultProps = defaultProps; -MoneyRequestPreviewWrapper.displayName = 'MoneyRequestPreviewWrapper'; - -export default withOnyx({ - personalDetails: { - key: ONYXKEYS.PERSONAL_DETAILS_LIST, - }, - chatReport: { - key: ({chatReportID}) => `${ONYXKEYS.COLLECTION.REPORT}${chatReportID}`, - }, - iouReport: { - key: ({iouReportID}) => `${ONYXKEYS.COLLECTION.REPORT}${iouReportID}`, - }, - session: { - key: ONYXKEYS.SESSION, - }, - transaction: { - key: ({action}) => `${ONYXKEYS.COLLECTION.TRANSACTION}${(action && action.originalMessage && action.originalMessage.IOUTransactionID) || 0}`, - }, - walletTerms: { - key: ONYXKEYS.WALLET_TERMS, - }, - transactionViolations: { - key: ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS, - }, -})(MoneyRequestPreviewWrapper); diff --git a/src/components/ReportActionItem/MoneyRequestPreviewWrapper.js b/src/components/ReportActionItem/MoneyRequestPreviewWrapper.js new file mode 100644 index 000000000000..221e0fd86c94 --- /dev/null +++ b/src/components/ReportActionItem/MoneyRequestPreviewWrapper.js @@ -0,0 +1,41 @@ +// We should not render the component if there is no iouReport and it's not a split. +// Moved outside of the component scope to allow memoization of values later. +import React from 'react'; +import {withOnyx} from 'react-native-onyx'; +import _ from 'underscore'; +import ONYXKEYS from '@src/ONYXKEYS'; +import MoneyRequestPreview from './MoneyRequestPreview'; +import MoneyRequestPreviewPropTypes from './moneyRequestPreviewPropTypes'; + +function MoneyRequestPreviewWrapper(props) { + // eslint-disable-next-line react/jsx-props-no-spreading + return _.isEmpty(props.iouReport) && !props.isBillSplit ? null : ; +} + +MoneyRequestPreviewWrapper.propTypes = MoneyRequestPreviewPropTypes.propTypes; +MoneyRequestPreviewWrapper.defaultProps = MoneyRequestPreviewPropTypes.defaultProps; +MoneyRequestPreviewWrapper.displayName = 'MoneyRequestPreviewWrapper'; + +export default withOnyx({ + personalDetails: { + key: ONYXKEYS.PERSONAL_DETAILS_LIST, + }, + chatReport: { + key: ({chatReportID}) => `${ONYXKEYS.COLLECTION.REPORT}${chatReportID}`, + }, + iouReport: { + key: ({iouReportID}) => `${ONYXKEYS.COLLECTION.REPORT}${iouReportID}`, + }, + session: { + key: ONYXKEYS.SESSION, + }, + transaction: { + key: ({action}) => `${ONYXKEYS.COLLECTION.TRANSACTION}${(action && action.originalMessage && action.originalMessage.IOUTransactionID) || 0}`, + }, + walletTerms: { + key: ONYXKEYS.WALLET_TERMS, + }, + transactionViolations: { + key: ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS, + }, +})(MoneyRequestPreviewWrapper); diff --git a/src/components/ReportActionItem/moneyRequestPreviewPropTypes.js b/src/components/ReportActionItem/moneyRequestPreviewPropTypes.js new file mode 100644 index 000000000000..27612727e7b6 --- /dev/null +++ b/src/components/ReportActionItem/moneyRequestPreviewPropTypes.js @@ -0,0 +1,103 @@ +import PropTypes from 'prop-types'; +import refPropTypes from '@components/refPropTypes'; +import transactionPropTypes from '@components/transactionPropTypes'; +import {transactionViolationsPropType} from '@libs/Violations/propTypes'; +import walletTermsPropTypes from '@pages/EnablePayments/walletTermsPropTypes'; +import reportActionPropTypes from '@pages/home/report/reportActionPropTypes'; +import iouReportPropTypes from '@pages/iouReportPropTypes'; +import reportPropTypes from '@pages/reportPropTypes'; + +const propTypes = { + /** The active IOUReport, used for Onyx subscription */ + // eslint-disable-next-line react/no-unused-prop-types + iouReportID: PropTypes.string.isRequired, + + /** The associated chatReport */ + chatReportID: PropTypes.string.isRequired, + + /** Callback for the preview pressed */ + onPreviewPressed: PropTypes.func, + + /** All the data of the action, used for showing context menu */ + action: PropTypes.shape(reportActionPropTypes), + + /** Popover context menu anchor, used for showing context menu */ + contextMenuAnchor: refPropTypes, + + /** Callback for updating context menu active state, used for showing context menu */ + checkIfContextMenuActive: PropTypes.func, + + /** Extra styles to pass to View wrapper */ + // eslint-disable-next-line react/forbid-prop-types + containerStyles: PropTypes.arrayOf(PropTypes.object), + + /* Onyx Props */ + + /** chatReport associated with iouReport */ + chatReport: reportPropTypes, + + /** IOU report data object */ + iouReport: iouReportPropTypes, + + /** True if this is this IOU is a split instead of a 1:1 request */ + isBillSplit: PropTypes.bool.isRequired, + + /** True if the IOU Preview card is hovered */ + isHovered: PropTypes.bool, + + /** All of the personal details for everyone */ + personalDetails: PropTypes.objectOf( + PropTypes.shape({ + /** This is either the user's full name, or their login if full name is an empty string */ + displayName: PropTypes.string, + }), + ), + + /** The transaction attached to the action.message.iouTransactionID */ + transaction: transactionPropTypes, + + /** Session info for the currently logged in user. */ + session: PropTypes.shape({ + /** Currently logged in user email */ + email: PropTypes.string, + }), + + /** Information about the user accepting the terms for payments */ + walletTerms: walletTermsPropTypes, + + /** Whether or not an IOU report contains money requests in a different currency + * that are either created or cancelled offline, and thus haven't been converted to the report's currency yet + */ + shouldShowPendingConversionMessage: PropTypes.bool, + + /** Whether a message is a whisper */ + isWhisper: PropTypes.bool, + + /** All transactionViolations */ + transactionViolations: transactionViolationsPropType, +}; + +const defaultProps = { + iouReport: {}, + onPreviewPressed: null, + action: undefined, + contextMenuAnchor: undefined, + checkIfContextMenuActive: () => {}, + containerStyles: [], + walletTerms: {}, + chatReport: {}, + isHovered: false, + personalDetails: {}, + session: { + email: null, + }, + transaction: {}, + shouldShowPendingConversionMessage: false, + isWhisper: false, + transactionViolations: {}, +}; + +export default { + propTypes, + defaultProps, +}; From 71c3790c22ea6581b4fef450cd4b76427552f87e Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Wed, 24 Jan 2024 14:16:08 -0500 Subject: [PATCH 058/288] feat(Violations): restore comment --- src/components/ReportActionItem/MoneyRequestPreviewWrapper.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/ReportActionItem/MoneyRequestPreviewWrapper.js b/src/components/ReportActionItem/MoneyRequestPreviewWrapper.js index 221e0fd86c94..942c1e80b02e 100644 --- a/src/components/ReportActionItem/MoneyRequestPreviewWrapper.js +++ b/src/components/ReportActionItem/MoneyRequestPreviewWrapper.js @@ -7,6 +7,8 @@ import ONYXKEYS from '@src/ONYXKEYS'; import MoneyRequestPreview from './MoneyRequestPreview'; import MoneyRequestPreviewPropTypes from './moneyRequestPreviewPropTypes'; +// We should not render the component if there is no iouReport and it's not a split. +// Moved outside of the component scope to allow for easier use of hooks in the main component. function MoneyRequestPreviewWrapper(props) { // eslint-disable-next-line react/jsx-props-no-spreading return _.isEmpty(props.iouReport) && !props.isBillSplit ? null : ; From 789ff025cb33f91ea6194ea3edba0c8904307257 Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Wed, 24 Jan 2024 14:16:54 -0500 Subject: [PATCH 059/288] feat(Violations): use lodash --- src/components/ReportActionItem/MoneyRequestPreviewWrapper.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/ReportActionItem/MoneyRequestPreviewWrapper.js b/src/components/ReportActionItem/MoneyRequestPreviewWrapper.js index 942c1e80b02e..15a15cf3002f 100644 --- a/src/components/ReportActionItem/MoneyRequestPreviewWrapper.js +++ b/src/components/ReportActionItem/MoneyRequestPreviewWrapper.js @@ -1,8 +1,8 @@ // We should not render the component if there is no iouReport and it's not a split. // Moved outside of the component scope to allow memoization of values later. +import lodashIsEmpty from 'lodash/isEmpty'; import React from 'react'; import {withOnyx} from 'react-native-onyx'; -import _ from 'underscore'; import ONYXKEYS from '@src/ONYXKEYS'; import MoneyRequestPreview from './MoneyRequestPreview'; import MoneyRequestPreviewPropTypes from './moneyRequestPreviewPropTypes'; @@ -11,7 +11,7 @@ import MoneyRequestPreviewPropTypes from './moneyRequestPreviewPropTypes'; // Moved outside of the component scope to allow for easier use of hooks in the main component. function MoneyRequestPreviewWrapper(props) { // eslint-disable-next-line react/jsx-props-no-spreading - return _.isEmpty(props.iouReport) && !props.isBillSplit ? null : ; + return lodashIsEmpty(props.iouReport) && !props.isBillSplit ? null : ; } MoneyRequestPreviewWrapper.propTypes = MoneyRequestPreviewPropTypes.propTypes; From 41856044c4d73fadeb4b5e592bb769df0042c7b9 Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Wed, 24 Jan 2024 14:22:08 -0500 Subject: [PATCH 060/288] feat(Violations): simplify --- src/components/ReportActionItem/MoneyRequestPreview.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/components/ReportActionItem/MoneyRequestPreview.js b/src/components/ReportActionItem/MoneyRequestPreview.js index 9319f71631ed..e33b194403bc 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview.js +++ b/src/components/ReportActionItem/MoneyRequestPreview.js @@ -129,7 +129,11 @@ function MoneyRequestPreview(props) { } else if (props.iouReport.isCancelledIOU) { message += ` • ${translate('iou.canceled')}`; } - return message + (isSettled && !props.iouReport.isCancelledIOU ? ` • ${getSettledMessage}` : ''); + + if (isSettled && !props.iouReport.isCancelledIOU) { + message += ` • ${getSettledMessage}`; + } + return message; }, [ getSettledMessage, hasViolations, From 02a3ff070d5f6e96ef72a385346446b4a79250e2 Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Wed, 24 Jan 2024 16:58:14 -0500 Subject: [PATCH 061/288] WIP --- .../ReportActionItem/MoneyRequestPreview.js | 2 +- ...pper.js => MoneyRequestPreviewWrapper.tsx} | 35 +++++++++++++++++-- ...pes.js => moneyRequestPreviewPropTypes.ts} | 0 3 files changed, 33 insertions(+), 4 deletions(-) rename src/components/ReportActionItem/{MoneyRequestPreviewWrapper.js => MoneyRequestPreviewWrapper.tsx} (54%) rename src/components/ReportActionItem/{moneyRequestPreviewPropTypes.js => moneyRequestPreviewPropTypes.ts} (100%) diff --git a/src/components/ReportActionItem/MoneyRequestPreview.js b/src/components/ReportActionItem/MoneyRequestPreview.js index e33b194403bc..99a31d9d945d 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview.js +++ b/src/components/ReportActionItem/MoneyRequestPreview.js @@ -34,7 +34,7 @@ import * as Localize from '@src/libs/Localize'; import PropTypes from './moneyRequestPreviewPropTypes'; import ReportActionItemImages from './ReportActionItemImages'; -function MoneyRequestPreview(props) { +export default function MoneyRequestPreview(props) { const theme = useTheme(); const styles = useThemeStyles(); const StyleUtils = useStyleUtils(); diff --git a/src/components/ReportActionItem/MoneyRequestPreviewWrapper.js b/src/components/ReportActionItem/MoneyRequestPreviewWrapper.tsx similarity index 54% rename from src/components/ReportActionItem/MoneyRequestPreviewWrapper.js rename to src/components/ReportActionItem/MoneyRequestPreviewWrapper.tsx index 15a15cf3002f..9964be443525 100644 --- a/src/components/ReportActionItem/MoneyRequestPreviewWrapper.js +++ b/src/components/ReportActionItem/MoneyRequestPreviewWrapper.tsx @@ -1,15 +1,44 @@ // We should not render the component if there is no iouReport and it's not a split. // Moved outside of the component scope to allow memoization of values later. import lodashIsEmpty from 'lodash/isEmpty'; +import type {Ref} from 'react'; import React from 'react'; +import type {StyleProp, ViewStyle} from 'react-native'; +import type {OnyxCollection, OnyxEntry} from 'react-native-onyx'; import {withOnyx} from 'react-native-onyx'; +import type {Text as RNText} from 'react-native/Libraries/Text/Text'; import ONYXKEYS from '@src/ONYXKEYS'; +import type {PersonalDetailsList, Report, ReportAction, Session, Transaction, TransactionViolation, WalletTerms} from '@src/types/onyx'; import MoneyRequestPreview from './MoneyRequestPreview'; import MoneyRequestPreviewPropTypes from './moneyRequestPreviewPropTypes'; +type MoneyRequestPreviewOnyxProps = { + chatReport: OnyxEntry; + iouReport: OnyxEntry; + personalDetails: OnyxEntry; + session: OnyxEntry; + transaction: OnyxEntry; + transactionViolations: OnyxCollection; + walletTerms: OnyxEntry; +}; + +type MoneyRequestPreviewProps = { + action?: OnyxEntry; + chatReportID?: string | null; + checkIfContextMenuActive: () => void; + containerStyles: StyleProp; + contextMenuAnchor?: Ref; + iouReportID?: string | null; + isBillSplit: boolean; + isHovered: boolean; + isWhisper: boolean; + onPreviewPressed: (() => void) | null; + shouldShowPendingConversionMessage: boolean; +} & MoneyRequestPreviewOnyxProps; + // We should not render the component if there is no iouReport and it's not a split. // Moved outside of the component scope to allow for easier use of hooks in the main component. -function MoneyRequestPreviewWrapper(props) { +function MoneyRequestPreviewWrapper(props: MoneyRequestPreviewProps) { // eslint-disable-next-line react/jsx-props-no-spreading return lodashIsEmpty(props.iouReport) && !props.isBillSplit ? null : ; } @@ -18,7 +47,7 @@ MoneyRequestPreviewWrapper.propTypes = MoneyRequestPreviewPropTypes.propTypes; MoneyRequestPreviewWrapper.defaultProps = MoneyRequestPreviewPropTypes.defaultProps; MoneyRequestPreviewWrapper.displayName = 'MoneyRequestPreviewWrapper'; -export default withOnyx({ +export default withOnyx({ personalDetails: { key: ONYXKEYS.PERSONAL_DETAILS_LIST, }, @@ -32,7 +61,7 @@ export default withOnyx({ key: ONYXKEYS.SESSION, }, transaction: { - key: ({action}) => `${ONYXKEYS.COLLECTION.TRANSACTION}${(action && action.originalMessage && action.originalMessage.IOUTransactionID) || 0}`, + key: ({action}) => `${ONYXKEYS.COLLECTION.TRANSACTION}${action?.originalMessage?.IOUTransactionID || 0}`, }, walletTerms: { key: ONYXKEYS.WALLET_TERMS, diff --git a/src/components/ReportActionItem/moneyRequestPreviewPropTypes.js b/src/components/ReportActionItem/moneyRequestPreviewPropTypes.ts similarity index 100% rename from src/components/ReportActionItem/moneyRequestPreviewPropTypes.js rename to src/components/ReportActionItem/moneyRequestPreviewPropTypes.ts From 69f4e5e8c72c6622f5f0d9e9077c5d686baf1d00 Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Thu, 25 Jan 2024 13:31:27 -0500 Subject: [PATCH 062/288] feat(Violations): properly type personalDetails to allow for refactoring of MoneyRequestPreview --- src/libs/OptionsListUtils.js | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/src/libs/OptionsListUtils.js b/src/libs/OptionsListUtils.js index 2973228af51f..a40b4f391ac5 100644 --- a/src/libs/OptionsListUtils.js +++ b/src/libs/OptionsListUtils.js @@ -24,6 +24,32 @@ import * as TaskUtils from './TaskUtils'; import * as TransactionUtils from './TransactionUtils'; import * as UserUtils from './UserUtils'; +/** PersonalDetails JSDoc + * @typedef {Object} PersonalDetails + * @property {number} accountID - ID of the current user from their personal details + * @property {string} [firstName] - First name of the current user from their personal details + * @property {string} [lastName] - Last name of the current user from their personal details + * @property {string} [displayName] - Display name of the current user from their personal details + * @property {boolean} [validated] - Is current user validated + * @property {string} [phoneNumber] - Phone number of the current user from their personal details + * @property {AvatarSource} avatar - Avatar URL of the current user from their personal details + * @property {string} [avatarThumbnail] - Avatar thumbnail URL of the current user from their personal details + * @property {boolean} [avatarUploading] - Flag to set when Avatar uploading + * @property {string} [login] - Login of the current user from their personal details + * @property {string} [pronouns] - Pronouns of the current user from their personal details + * @property {string} [localCurrencyCode] - Local currency for the user + * @property {Timezone} [timezone] - Timezone of the current user from their personal details + * @property {boolean} [isLoading] - Whether we are loading the data via the API + * @property {Object} [errorFields] - Field-specific server side errors keyed by microtime + * @property {Object} [pendingFields] - Field-specific pending states for offline UI status + * @property {string} [fallbackIcon] - A fallback avatar icon to display when there is an error on loading avatar from remote URL + * @property {Status} [status] - Status of the current user from their personal details + */ + +/** PersonalDetailsList JSDoc + * @typedef {Object.} PersonalDetailsList + */ + /** * OptionsListUtils is used to build a list options passed to the OptionsList component. Several different UI views can * be configured to display different results based on the options passed to the private getOptions() method. Public @@ -138,12 +164,11 @@ function addSMSDomainIfPhoneNumber(login) { } /** - * Returns avatar data for a list of user accountIDs - * - * @param {Array} accountIDs - * @param {Object} personalDetails + * Returns avatar data for a list of user accountIDs* + * @param {Array.} accountIDs + * @param {PersonalDetailsList} personalDetails * @param {Object} defaultValues {login: accountID} In workspace invite page, when new user is added we pass available data to opt in - * @returns {Object} + * @returns {Array.<{id: number, source: any, type: string, name: string}>} Array of avatar info objects */ function getAvatarsForAccountIDs(accountIDs, personalDetails, defaultValues = {}) { const reversedDefaultValues = {}; From d642ac4d513f26bf2c3f18cc912b61d84e04e687 Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Thu, 25 Jan 2024 13:33:12 -0500 Subject: [PATCH 063/288] feat(Violations): add user defined type guard to isMoneyRequestAction --- src/libs/ReportActionsUtils.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libs/ReportActionsUtils.ts b/src/libs/ReportActionsUtils.ts index 3154f578c309..d25e202f643f 100644 --- a/src/libs/ReportActionsUtils.ts +++ b/src/libs/ReportActionsUtils.ts @@ -6,7 +6,7 @@ import OnyxUtils from 'react-native-onyx/lib/utils'; import type {ValueOf} from 'type-fest'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; -import type {ActionName, ChangeLog, OriginalMessageReimbursementDequeued} from '@src/types/onyx/OriginalMessage'; +import type {ActionName, ChangeLog, OriginalMessageIOU, OriginalMessageReimbursementDequeued} from '@src/types/onyx/OriginalMessage'; import type Report from '@src/types/onyx/Report'; import type {Message, ReportActionBase, ReportActions} from '@src/types/onyx/ReportAction'; import type ReportAction from '@src/types/onyx/ReportAction'; @@ -99,7 +99,7 @@ function isPendingRemove(reportAction: OnyxEntry | EmptyObject): b return reportAction?.message?.[0]?.moderationDecision?.decision === CONST.MODERATION.MODERATOR_DECISION_PENDING_REMOVE; } -function isMoneyRequestAction(reportAction: OnyxEntry): boolean { +function isMoneyRequestAction(reportAction: OnyxEntry): reportAction is ReportAction & OriginalMessageIOU { return reportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.IOU; } From 1824128521eac42739be896d5da2ead1a8437b16 Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Thu, 25 Jan 2024 13:33:42 -0500 Subject: [PATCH 064/288] feat(Violations): add typescript types to MoneyRequestPreviewWrapper and extract props --- .../MoneyRequestPreviewWrapper.tsx | 36 ++----------------- .../moneyRequestPreviewProps.ts | 32 +++++++++++++++++ 2 files changed, 35 insertions(+), 33 deletions(-) create mode 100644 src/components/ReportActionItem/moneyRequestPreviewProps.ts diff --git a/src/components/ReportActionItem/MoneyRequestPreviewWrapper.tsx b/src/components/ReportActionItem/MoneyRequestPreviewWrapper.tsx index 9964be443525..e290f1056071 100644 --- a/src/components/ReportActionItem/MoneyRequestPreviewWrapper.tsx +++ b/src/components/ReportActionItem/MoneyRequestPreviewWrapper.tsx @@ -1,40 +1,12 @@ // We should not render the component if there is no iouReport and it's not a split. // Moved outside of the component scope to allow memoization of values later. import lodashIsEmpty from 'lodash/isEmpty'; -import type {Ref} from 'react'; import React from 'react'; -import type {StyleProp, ViewStyle} from 'react-native'; -import type {OnyxCollection, OnyxEntry} from 'react-native-onyx'; import {withOnyx} from 'react-native-onyx'; -import type {Text as RNText} from 'react-native/Libraries/Text/Text'; +import * as ReportActionsUtils from '@libs/ReportActionsUtils'; import ONYXKEYS from '@src/ONYXKEYS'; -import type {PersonalDetailsList, Report, ReportAction, Session, Transaction, TransactionViolation, WalletTerms} from '@src/types/onyx'; import MoneyRequestPreview from './MoneyRequestPreview'; -import MoneyRequestPreviewPropTypes from './moneyRequestPreviewPropTypes'; - -type MoneyRequestPreviewOnyxProps = { - chatReport: OnyxEntry; - iouReport: OnyxEntry; - personalDetails: OnyxEntry; - session: OnyxEntry; - transaction: OnyxEntry; - transactionViolations: OnyxCollection; - walletTerms: OnyxEntry; -}; - -type MoneyRequestPreviewProps = { - action?: OnyxEntry; - chatReportID?: string | null; - checkIfContextMenuActive: () => void; - containerStyles: StyleProp; - contextMenuAnchor?: Ref; - iouReportID?: string | null; - isBillSplit: boolean; - isHovered: boolean; - isWhisper: boolean; - onPreviewPressed: (() => void) | null; - shouldShowPendingConversionMessage: boolean; -} & MoneyRequestPreviewOnyxProps; +import type {MoneyRequestPreviewOnyxProps, MoneyRequestPreviewProps} from './moneyRequestPreviewProps'; // We should not render the component if there is no iouReport and it's not a split. // Moved outside of the component scope to allow for easier use of hooks in the main component. @@ -43,8 +15,6 @@ function MoneyRequestPreviewWrapper(props: MoneyRequestPreviewProps) { return lodashIsEmpty(props.iouReport) && !props.isBillSplit ? null : ; } -MoneyRequestPreviewWrapper.propTypes = MoneyRequestPreviewPropTypes.propTypes; -MoneyRequestPreviewWrapper.defaultProps = MoneyRequestPreviewPropTypes.defaultProps; MoneyRequestPreviewWrapper.displayName = 'MoneyRequestPreviewWrapper'; export default withOnyx({ @@ -61,7 +31,7 @@ export default withOnyx( key: ONYXKEYS.SESSION, }, transaction: { - key: ({action}) => `${ONYXKEYS.COLLECTION.TRANSACTION}${action?.originalMessage?.IOUTransactionID || 0}`, + key: ({action}) => `${ONYXKEYS.COLLECTION.TRANSACTION}${ReportActionsUtils.isMoneyRequestAction(action) ? action?.originalMessage?.IOUTransactionID : 0 ?? 0}`, }, walletTerms: { key: ONYXKEYS.WALLET_TERMS, diff --git a/src/components/ReportActionItem/moneyRequestPreviewProps.ts b/src/components/ReportActionItem/moneyRequestPreviewProps.ts new file mode 100644 index 000000000000..620d93c23399 --- /dev/null +++ b/src/components/ReportActionItem/moneyRequestPreviewProps.ts @@ -0,0 +1,32 @@ +import type {Ref} from 'react'; +// eslint-disable-next-line no-restricted-imports +import type {Text as RNText, StyleProp, ViewStyle} from 'react-native'; +import type {OnyxCollection, OnyxEntry} from 'react-native-onyx'; +import type {PersonalDetailsList, Report, Session, Transaction, TransactionViolation, WalletTerms} from '@src/types/onyx'; +import type {OriginalMessageIOU} from '@src/types/onyx/OriginalMessage'; +import type {ReportActionBase} from '@src/types/onyx/ReportAction'; + +type MoneyRequestPreviewOnyxProps = { + chatReport: OnyxEntry; + iouReport: OnyxEntry; + personalDetails: OnyxEntry; + session: OnyxEntry; + transaction: OnyxEntry; + transactionViolations: OnyxCollection; + walletTerms: OnyxEntry; +}; +type MoneyRequestPreviewProps = { + action: OnyxEntry; + chatReportID: string; + checkIfContextMenuActive: () => void; + containerStyles: StyleProp; + contextMenuAnchor?: Ref; + iouReportID: string; + isBillSplit: boolean; + isHovered: boolean; + isWhisper: boolean; + onPreviewPressed: (() => void) | null; + shouldShowPendingConversionMessage: boolean; +} & MoneyRequestPreviewOnyxProps; + +export type {MoneyRequestPreviewProps, MoneyRequestPreviewOnyxProps}; From b64181c38ee322c3a0912d7e5d375bd6eb648c69 Mon Sep 17 00:00:00 2001 From: Filip Solecki Date: Fri, 26 Jan 2024 13:09:00 +0100 Subject: [PATCH 065/288] review fixes --- src/components/SelectionList/BaseListItem.tsx | 4 +- .../SelectionList/BaseSelectionList.tsx | 4 +- .../SelectionList/RadioListItem.tsx | 4 +- src/components/SelectionList/UserListItem.tsx | 4 +- .../SelectionList/index.android.tsx | 4 +- src/components/SelectionList/index.ios.tsx | 4 +- src/components/SelectionList/index.tsx | 4 +- src/components/SelectionList/types.ts | 50 ++++--------------- .../ValuePicker/ValueSelectorModal.tsx | 8 ++- src/components/ValuePicker/index.tsx | 2 +- src/components/ValuePicker/types.ts | 6 +-- 11 files changed, 31 insertions(+), 63 deletions(-) diff --git a/src/components/SelectionList/BaseListItem.tsx b/src/components/SelectionList/BaseListItem.tsx index 71845931ba52..3ee59fb5a579 100644 --- a/src/components/SelectionList/BaseListItem.tsx +++ b/src/components/SelectionList/BaseListItem.tsx @@ -11,10 +11,10 @@ import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; import CONST from '@src/CONST'; import RadioListItem from './RadioListItem'; -import type {BaseListItemProps, RadioItem, User} from './types'; +import type {BaseListItemProps, ListItem} from './types'; import UserListItem from './UserListItem'; -function BaseListItem({ +function BaseListItem({ item, isFocused = false, isDisabled = false, diff --git a/src/components/SelectionList/BaseSelectionList.tsx b/src/components/SelectionList/BaseSelectionList.tsx index d97c47c84ee7..2143f76d351f 100644 --- a/src/components/SelectionList/BaseSelectionList.tsx +++ b/src/components/SelectionList/BaseSelectionList.tsx @@ -22,9 +22,9 @@ import variables from '@styles/variables'; import CONST from '@src/CONST'; import {isEmptyObject} from '@src/types/utils/EmptyObject'; import BaseListItem from './BaseListItem'; -import type {BaseSelectionListProps, ButtonOrCheckBoxRoles, FlattenedSectionsReturn, RadioItem, Section, SectionListDataType, User} from './types'; +import type {BaseSelectionListProps, ButtonOrCheckBoxRoles, FlattenedSectionsReturn, ListItem, Section, SectionListDataType} from './types'; -function BaseSelectionList( +function BaseSelectionList( { sections, canSelectMultiple = false, diff --git a/src/components/SelectionList/RadioListItem.tsx b/src/components/SelectionList/RadioListItem.tsx index 769eaa80df4b..e666fa6865da 100644 --- a/src/components/SelectionList/RadioListItem.tsx +++ b/src/components/SelectionList/RadioListItem.tsx @@ -3,9 +3,9 @@ import {View} from 'react-native'; import Text from '@components/Text'; import Tooltip from '@components/Tooltip'; import useThemeStyles from '@hooks/useThemeStyles'; -import type {RadioListItemProps} from './types'; +import type {ListItemProps} from './types'; -function RadioListItem({item, showTooltip, textStyles, alternateTextStyles}: RadioListItemProps) { +function RadioListItem({item, showTooltip, textStyles, alternateTextStyles}: ListItemProps) { const styles = useThemeStyles(); return ( diff --git a/src/components/SelectionList/UserListItem.tsx b/src/components/SelectionList/UserListItem.tsx index 3c973ad0bbea..016d4c74d65e 100644 --- a/src/components/SelectionList/UserListItem.tsx +++ b/src/components/SelectionList/UserListItem.tsx @@ -4,9 +4,9 @@ import SubscriptAvatar from '@components/SubscriptAvatar'; import Text from '@components/Text'; import Tooltip from '@components/Tooltip'; import useThemeStyles from '@hooks/useThemeStyles'; -import type {UserListItemProps} from './types'; +import type {ListItemProps} from './types'; -function UserListItem({item, textStyles, alternateTextStyles, showTooltip, style}: UserListItemProps) { +function UserListItem({item, textStyles, alternateTextStyles, showTooltip, style}: ListItemProps) { const styles = useThemeStyles(); return ( <> diff --git a/src/components/SelectionList/index.android.tsx b/src/components/SelectionList/index.android.tsx index 8487c6e2cc67..46f2af8356f6 100644 --- a/src/components/SelectionList/index.android.tsx +++ b/src/components/SelectionList/index.android.tsx @@ -3,9 +3,9 @@ import type {ForwardedRef} from 'react'; import {Keyboard} from 'react-native'; import type {TextInput} from 'react-native'; import BaseSelectionList from './BaseSelectionList'; -import type {BaseSelectionListProps, RadioItem, User} from './types'; +import type {BaseSelectionListProps, ListItem} from './types'; -function SelectionList(props: BaseSelectionListProps, ref: ForwardedRef) { +function SelectionList(props: BaseSelectionListProps, ref: ForwardedRef) { return ( (props: BaseSelectionListProps, ref: ForwardedRef) { +function SelectionList(props: BaseSelectionListProps, ref: ForwardedRef) { return ( // eslint-disable-next-line react/jsx-props-no-spreading diff --git a/src/components/SelectionList/index.tsx b/src/components/SelectionList/index.tsx index 93754926cacb..2446e1b4f5c1 100644 --- a/src/components/SelectionList/index.tsx +++ b/src/components/SelectionList/index.tsx @@ -4,9 +4,9 @@ import {Keyboard} from 'react-native'; import type {TextInput} from 'react-native'; import * as DeviceCapabilities from '@libs/DeviceCapabilities'; import BaseSelectionList from './BaseSelectionList'; -import type {BaseSelectionListProps, RadioItem, User} from './types'; +import type {BaseSelectionListProps, ListItem} from './types'; -function SelectionList(props: BaseSelectionListProps, ref: ForwardedRef) { +function SelectionList(props: BaseSelectionListProps, ref: ForwardedRef) { const [isScreenTouched, setIsScreenTouched] = useState(false); const touchStart = () => setIsScreenTouched(true); diff --git a/src/components/SelectionList/types.ts b/src/components/SelectionList/types.ts index a82ddef6febb..c939279dc684 100644 --- a/src/components/SelectionList/types.ts +++ b/src/components/SelectionList/types.ts @@ -32,7 +32,7 @@ type CommonListItemProps = { rightHandSideComponent?: ((item: TItem) => ReactElement) | ReactElement | null; }; -type User = { +type ListItem = { /** Text to display */ text: string; @@ -75,49 +75,21 @@ type User = { index?: number; }; -type UserListItemProps = CommonListItemProps & { +type ListItemProps = CommonListItemProps & { /** The section list item */ - item: User; + item: ListItem; /** Additional styles to apply to text */ style?: StyleProp; }; -type RadioItem = { - /** Text to display */ - text: string; - - /** Alternate text to display */ - alternateText?: string; - - /** Key used internally by React */ - keyForList: string; - - /** Whether this option is selected */ - isSelected?: boolean; - - /** Whether this option is disabled for selection */ - isDisabled?: boolean; - - /** Represents the index of the section it came from */ - sectionIndex?: number; - - /** Represents the index of the option within the section it came from */ - index?: number; -}; - -type RadioListItemProps = CommonListItemProps & { - /** The section list item */ - item: RadioItem; -}; - -type BaseListItemProps = CommonListItemProps & { +type BaseListItemProps = CommonListItemProps & { item: TItem; shouldPreventDefaultFocusOnSelectRow?: boolean; keyForList?: string; }; -type Section = { +type Section = { /** Title of the section */ title?: string; @@ -131,7 +103,7 @@ type Section = { isDisabled?: boolean; }; -type BaseSelectionListProps = Partial & { +type BaseSelectionListProps = Partial & { /** Sections for the section list */ sections: Array>>; @@ -237,7 +209,7 @@ type ItemLayout = { offset: number; }; -type FlattenedSectionsReturn = { +type FlattenedSectionsReturn = { allOptions: TItem[]; selectedOptions: TItem[]; disabledOptionsIndexes: number[]; @@ -247,17 +219,15 @@ type FlattenedSectionsReturn = { type ButtonOrCheckBoxRoles = 'button' | 'checkbox'; -type SectionListDataType = SectionListData>; +type SectionListDataType = SectionListData>; export type { BaseSelectionListProps, CommonListItemProps, - UserListItemProps, Section, - RadioListItemProps, BaseListItemProps, - User, - RadioItem, + ListItem, + ListItemProps, FlattenedSectionsReturn, ItemLayout, ButtonOrCheckBoxRoles, diff --git a/src/components/ValuePicker/ValueSelectorModal.tsx b/src/components/ValuePicker/ValueSelectorModal.tsx index a7b5f494aa67..98e276dcc9ec 100644 --- a/src/components/ValuePicker/ValueSelectorModal.tsx +++ b/src/components/ValuePicker/ValueSelectorModal.tsx @@ -7,19 +7,17 @@ import useThemeStyles from '@hooks/useThemeStyles'; import CONST from '@src/CONST'; import type {ValuePickerItem, ValueSelectorModalProps} from './types'; -function ValueSelectorModal({items = [], selectedItem, label = '', isVisible, onClose, onItemSelected, shouldShowTooltips}: ValueSelectorModalProps) { +function ValueSelectorModal({items = [], selectedItem, label = '', isVisible, onClose, onItemSelected, shouldShowTooltips = true}: ValueSelectorModalProps) { const styles = useThemeStyles(); const [sectionsData, setSectionsData] = useState([]); useEffect(() => { - const itemsData = items.map((item, index) => ({ + const itemsData = items.map((item) => ({ value: item?.value, alternateText: item?.description, keyForList: item.value ?? '', text: item?.label ?? '', isSelected: item === selectedItem, - sectionIndex: 0, - index, })); setSectionsData(itemsData); }, [items, selectedItem]); @@ -34,7 +32,7 @@ function ValueSelectorModal({items = [], selectedItem, label = '', isVisible, on useNativeDriver > item.value === value); return ( diff --git a/src/components/ValuePicker/types.ts b/src/components/ValuePicker/types.ts index 285299bc0101..2f29f820b818 100644 --- a/src/components/ValuePicker/types.ts +++ b/src/components/ValuePicker/types.ts @@ -1,9 +1,9 @@ -import type {RadioItem} from '@components/SelectionList/types'; - -type ValuePickerItem = RadioItem & { +type ValuePickerItem = { value?: string; label?: string; description?: string; + text: string; + keyForList: string; }; type ValueSelectorModalProps = { From 9633be5b555d71e14f7026b65066a64880ba784e Mon Sep 17 00:00:00 2001 From: Filip Solecki Date: Fri, 26 Jan 2024 13:51:53 +0100 Subject: [PATCH 066/288] Change onInputChange function type --- src/components/ValuePicker/index.tsx | 2 +- src/components/ValuePicker/types.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/ValuePicker/index.tsx b/src/components/ValuePicker/index.tsx index 8d42bb49c4fc..795395615b45 100644 --- a/src/components/ValuePicker/index.tsx +++ b/src/components/ValuePicker/index.tsx @@ -23,7 +23,7 @@ function ValuePicker({value, label, items, placeholder = '', errorText = '', onI }; const updateInput = (item: ValuePickerItem) => { - if (item?.value && item.value !== value) { + if (item.value !== value) { onInputChange?.(item.value); } hidePickerModal(); diff --git a/src/components/ValuePicker/types.ts b/src/components/ValuePicker/types.ts index 2f29f820b818..1ff2e113f606 100644 --- a/src/components/ValuePicker/types.ts +++ b/src/components/ValuePicker/types.ts @@ -46,7 +46,7 @@ type ValuePickerProps = { errorText?: string; /** Callback to call when the input changes */ - onInputChange?: (value: string) => void; + onInputChange?: (value: string | undefined) => void; /** Text to display under the main menu item */ furtherDetails?: string; From 5af50d4f9d9b6f5c513872891a7de2bbd196efaa Mon Sep 17 00:00:00 2001 From: Vadym Date: Fri, 26 Jan 2024 15:47:34 +0100 Subject: [PATCH 067/288] chore: makes hasUserReacted optional with default value --- .../report/ReactionList/BaseReactionList.tsx | 19 +++++++++---------- .../ReactionList/HeaderReactionList.tsx | 14 +++++++------- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/pages/home/report/ReactionList/BaseReactionList.tsx b/src/pages/home/report/ReactionList/BaseReactionList.tsx index a49c4d832f30..09471faf0b42 100755 --- a/src/pages/home/report/ReactionList/BaseReactionList.tsx +++ b/src/pages/home/report/ReactionList/BaseReactionList.tsx @@ -24,7 +24,7 @@ type BaseReactionListProps = ReactionListProps & { /** * Returns true if the current account has reacted to the report action (with the given skin tone). */ - hasUserReacted: boolean; + hasUserReacted?: boolean; /** * Returns true if the reaction list is visible @@ -40,10 +40,10 @@ const getItemLayout = (data: ArrayLike | null | undefined, inde offset: variables.listItemHeightNormal * index, }); -function BaseReactionList(props: BaseReactionListProps) { +function BaseReactionList({hasUserReacted = false, users, isVisible = false, emojiCodes, emojiCount, emojiName, onClose}: BaseReactionListProps) { const {isSmallScreenWidth} = useWindowDimensions(); const {hoveredComponentBG, reactionListContainer, reactionListContainerFixedWidth, pv2} = useThemeStyles(); - if (!props.isVisible) { + if (!isVisible) { return null; } @@ -59,7 +59,7 @@ function BaseReactionList(props: BaseReactionListProps) { style={{maxWidth: variables.mobileResponsiveWidthBreakpoint}} hoverStyle={hoveredComponentBG} onSelectRow={() => { - props.onClose?.(); + onClose?.(); Navigation.navigate(ROUTES.PROFILE.getRoute(item.accountID)); }} @@ -84,14 +84,13 @@ function BaseReactionList(props: BaseReactionListProps) { return ( <> & { /** Returns true if the current account has reacted to the report action (with the given skin tone). */ - hasUserReacted: boolean; + hasUserReacted?: boolean; }; -function HeaderReactionList(props: HeaderReactionListProps) { +function HeaderReactionList({emojiCodes, emojiCount, emojiName, hasUserReacted = false}: HeaderReactionListProps) { const { flexRow, justifyContentBetween, @@ -32,11 +32,11 @@ function HeaderReactionList(props: HeaderReactionListProps) { return ( - - {props.emojiCodes.join('')} - {props.emojiCount} + + {emojiCodes.join('')} + {emojiCount} - {`:${EmojiUtils.getLocalizedEmojiName(props.emojiName, preferredLocale)}:`} + {`:${EmojiUtils.getLocalizedEmojiName(emojiName, preferredLocale)}:`} ); From ce370cd4af2b566b6fcbfca4b4aaf3233f8763d4 Mon Sep 17 00:00:00 2001 From: Vadym Date: Fri, 26 Jan 2024 15:52:42 +0100 Subject: [PATCH 068/288] chore: removes unneeded JSDocs returns and comments --- src/hooks/useBasePopoverReactionList/index.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/hooks/useBasePopoverReactionList/index.ts b/src/hooks/useBasePopoverReactionList/index.ts index 64c5f6d8efc0..ae7afc230bf9 100644 --- a/src/hooks/useBasePopoverReactionList/index.ts +++ b/src/hooks/useBasePopoverReactionList/index.ts @@ -11,7 +11,6 @@ export default function useBasePopoverReactionList({emojiName, emojiReactions, a const [popoverAnchorPosition, setPopoverAnchorPosition] = useState({horizontal: 0, vertical: 0}); const reactionListRef = useRef(null); - // custom methods function getReactionInformation() { const selectedReaction = emojiReactions?.[emojiName]; @@ -41,8 +40,6 @@ export default function useBasePopoverReactionList({emojiName, emojiReactions, a /** * Get the BasePopoverReactionList anchor position * We calculate the achor coordinates from measureInWindow async method - * - * @returns promise */ function getReactionListMeasuredLocation(): Promise<{x: number; y: number}> { return new Promise((resolve) => { From 3fa2b09f585f5ba2567c4dc33d391802186fa5ac Mon Sep 17 00:00:00 2001 From: Vadym Date: Fri, 26 Jan 2024 15:57:07 +0100 Subject: [PATCH 069/288] fix: reuses the AnchorPosition type --- src/hooks/useBasePopoverReactionList/types.ts | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/hooks/useBasePopoverReactionList/types.ts b/src/hooks/useBasePopoverReactionList/types.ts index 49620ccd9370..2993b2b8acb6 100644 --- a/src/hooks/useBasePopoverReactionList/types.ts +++ b/src/hooks/useBasePopoverReactionList/types.ts @@ -2,6 +2,7 @@ import type {OnyxEntry} from 'react-native-onyx'; import type {LocaleContextProps} from '@components/LocaleContextProvider'; import type {WithCurrentUserPersonalDetailsProps} from '@components/withCurrentUserPersonalDetails'; import type {ReactionListAnchor, ReactionListEvent} from '@pages/home/ReportScreenContext'; +import type {AnchorPosition} from '@src/styles'; import type {ReportActionReactions} from '@src/types/onyx'; type BasePopoverReactionListOnyxProps = { @@ -33,16 +34,10 @@ type BasePopoverReactionListState = { isPopoverVisible: boolean; /** The horizontal and vertical position (relative to the screen) where the popover will display. */ - popoverAnchorPosition: { - horizontal: number; - vertical: number; - }; + popoverAnchorPosition: AnchorPosition; /** The horizontal and vertical position (relative to the screen) where the cursor is. */ - cursorRelativePosition: { - horizontal: number; - vertical: number; - }; + cursorRelativePosition: AnchorPosition; }; type ShowReactionList = (event: ReactionListEvent | undefined, reactionListAnchor: ReactionListAnchor) => void; From 480a662dae34d3a497766ac62fb5dbc9b186db2e Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Fri, 26 Jan 2024 17:04:37 -0500 Subject: [PATCH 070/288] create types compatible with MoneyRequestView's propTypes --- .../MoneyRequestPreview.js | 4 +- .../MoneyRequestPreviewWrapper.tsx | 3 +- .../MoneyRequestPreview/index.ts | 3 + .../moneyRequestPreviewPropTypes.ts | 2 +- .../moneyRequestPreviewProps.ts | 72 +++++++++++++++++++ .../moneyRequestPreviewProps.ts | 32 --------- src/languages/es.ts | 2 +- 7 files changed, 81 insertions(+), 37 deletions(-) rename src/components/ReportActionItem/{ => MoneyRequestPreview}/MoneyRequestPreview.js (99%) rename src/components/ReportActionItem/{ => MoneyRequestPreview}/MoneyRequestPreviewWrapper.tsx (91%) create mode 100644 src/components/ReportActionItem/MoneyRequestPreview/index.ts rename src/components/ReportActionItem/{ => MoneyRequestPreview}/moneyRequestPreviewPropTypes.ts (96%) create mode 100644 src/components/ReportActionItem/MoneyRequestPreview/moneyRequestPreviewProps.ts delete mode 100644 src/components/ReportActionItem/moneyRequestPreviewProps.ts diff --git a/src/components/ReportActionItem/MoneyRequestPreview.js b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreview.js similarity index 99% rename from src/components/ReportActionItem/MoneyRequestPreview.js rename to src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreview.js index 99a31d9d945d..e486f7575a04 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview.js +++ b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreview.js @@ -11,6 +11,7 @@ import MultipleAvatars from '@components/MultipleAvatars'; import OfflineWithFeedback from '@components/OfflineWithFeedback'; import PressableWithFeedback from '@components/Pressable/PressableWithoutFeedback'; import RenderHTML from '@components/RenderHTML'; +import ReportActionItemImages from '@components/ReportActionItem/ReportActionItemImages'; import {showContextMenuForReport} from '@components/ShowContextMenuContext'; import Text from '@components/Text'; import useLocalize from '@hooks/useLocalize'; @@ -22,6 +23,7 @@ import ControlSelection from '@libs/ControlSelection'; import * as CurrencyUtils from '@libs/CurrencyUtils'; import * as DeviceCapabilities from '@libs/DeviceCapabilities'; import * as IOUUtils from '@libs/IOUUtils'; +import * as Localize from '@libs/Localize'; import * as OptionsListUtils from '@libs/OptionsListUtils'; import * as ReceiptUtils from '@libs/ReceiptUtils'; import * as ReportActionsUtils from '@libs/ReportActionsUtils'; @@ -30,9 +32,7 @@ import * as TransactionUtils from '@libs/TransactionUtils'; import * as PaymentMethods from '@userActions/PaymentMethods'; import * as Report from '@userActions/Report'; import CONST from '@src/CONST'; -import * as Localize from '@src/libs/Localize'; import PropTypes from './moneyRequestPreviewPropTypes'; -import ReportActionItemImages from './ReportActionItemImages'; export default function MoneyRequestPreview(props) { const theme = useTheme(); diff --git a/src/components/ReportActionItem/MoneyRequestPreviewWrapper.tsx b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewWrapper.tsx similarity index 91% rename from src/components/ReportActionItem/MoneyRequestPreviewWrapper.tsx rename to src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewWrapper.tsx index e290f1056071..f00411adc158 100644 --- a/src/components/ReportActionItem/MoneyRequestPreviewWrapper.tsx +++ b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewWrapper.tsx @@ -5,6 +5,7 @@ import React from 'react'; import {withOnyx} from 'react-native-onyx'; import * as ReportActionsUtils from '@libs/ReportActionsUtils'; import ONYXKEYS from '@src/ONYXKEYS'; +import type {ReportAction} from '@src/types/onyx'; import MoneyRequestPreview from './MoneyRequestPreview'; import type {MoneyRequestPreviewOnyxProps, MoneyRequestPreviewProps} from './moneyRequestPreviewProps'; @@ -31,7 +32,7 @@ export default withOnyx( key: ONYXKEYS.SESSION, }, transaction: { - key: ({action}) => `${ONYXKEYS.COLLECTION.TRANSACTION}${ReportActionsUtils.isMoneyRequestAction(action) ? action?.originalMessage?.IOUTransactionID : 0 ?? 0}`, + key: ({action}) => `${ONYXKEYS.COLLECTION.TRANSACTION}${ReportActionsUtils.isMoneyRequestAction(action as ReportAction) ? action?.originalMessage?.IOUTransactionID : 0 ?? 0}`, }, walletTerms: { key: ONYXKEYS.WALLET_TERMS, diff --git a/src/components/ReportActionItem/MoneyRequestPreview/index.ts b/src/components/ReportActionItem/MoneyRequestPreview/index.ts new file mode 100644 index 000000000000..7102d862765a --- /dev/null +++ b/src/components/ReportActionItem/MoneyRequestPreview/index.ts @@ -0,0 +1,3 @@ +import MoneyRequestPreviewWrapper from './MoneyRequestPreviewWrapper'; + +export default MoneyRequestPreviewWrapper; diff --git a/src/components/ReportActionItem/moneyRequestPreviewPropTypes.ts b/src/components/ReportActionItem/MoneyRequestPreview/moneyRequestPreviewPropTypes.ts similarity index 96% rename from src/components/ReportActionItem/moneyRequestPreviewPropTypes.ts rename to src/components/ReportActionItem/MoneyRequestPreview/moneyRequestPreviewPropTypes.ts index 27612727e7b6..22c1366119f3 100644 --- a/src/components/ReportActionItem/moneyRequestPreviewPropTypes.ts +++ b/src/components/ReportActionItem/MoneyRequestPreview/moneyRequestPreviewPropTypes.ts @@ -29,7 +29,7 @@ const propTypes = { /** Extra styles to pass to View wrapper */ // eslint-disable-next-line react/forbid-prop-types - containerStyles: PropTypes.arrayOf(PropTypes.object), + containerStyles: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.object), PropTypes.object, PropTypes.bool]), /* Onyx Props */ diff --git a/src/components/ReportActionItem/MoneyRequestPreview/moneyRequestPreviewProps.ts b/src/components/ReportActionItem/MoneyRequestPreview/moneyRequestPreviewProps.ts new file mode 100644 index 000000000000..070e38667ee8 --- /dev/null +++ b/src/components/ReportActionItem/MoneyRequestPreview/moneyRequestPreviewProps.ts @@ -0,0 +1,72 @@ +import type {Ref} from 'react'; +// eslint-disable-next-line no-restricted-imports +import type {Text as RNText, StyleProp, ViewStyle} from 'react-native'; +import type {OnyxCollection, OnyxEntry} from 'react-native-onyx'; +import type CONST from '@src/CONST'; +import type {PersonalDetailsList, Report, Session, Transaction, TransactionViolation, WalletTerms} from '@src/types/onyx'; +import type {OriginalMessageIOU} from '@src/types/onyx/OriginalMessage'; +import type {ReportActionBase} from '@src/types/onyx/ReportAction'; + +// typescript version of reportActionFragmentPropType +type MoneyRequestFragment = { + /** The type of the action item fragment. Used to render a corresponding component */ + type: string; + + /** The text content of the fragment. */ + text: string; + + /** Used to apply additional styling. Style refers to a predetermined constant and not a class name. e.g. 'normal' or 'strong' */ + style?: string; + + /** ID of a report */ + reportID?: string; + + /** ID of a policy */ + policyID?: string; + + /** The target of a link fragment e.g. '_blank' */ + target?: string; + + /** The destination of a link fragment e.g. 'https://www.expensify.com' */ + href?: string; + + /** An additional avatar url - not the main avatar url but used within a message. */ + iconUrl?: string; + + /** Fragment edited flag */ + isEdited?: boolean; +}; + +// We need to override some of these to match the more general reportActionPropType +type MoneyRequestAction = Omit & { + person: MoneyRequestFragment[]; + reportActionID: string; + created: string; + actionName: (typeof CONST.REPORT.ACTIONS.TYPE)[keyof typeof CONST.REPORT.ACTIONS.TYPE]; + originalMessage: OriginalMessageIOU; +}; + +type MoneyRequestPreviewOnyxProps = { + chatReport: OnyxEntry; + iouReport: OnyxEntry; + personalDetails: OnyxEntry; + session: OnyxEntry; + transaction: OnyxEntry; + transactionViolations: OnyxCollection; + walletTerms: OnyxEntry; +}; +type MoneyRequestPreviewProps = { + action: MoneyRequestAction; + chatReportID: string; + checkIfContextMenuActive: () => void; + containerStyles: StyleProp; + contextMenuAnchor?: Ref; + iouReportID: string; + isBillSplit: boolean; + isHovered: boolean; + isWhisper: boolean; + onPreviewPressed: (() => void) | null; + shouldShowPendingConversionMessage: boolean; +} & MoneyRequestPreviewOnyxProps; + +export type {MoneyRequestPreviewProps, MoneyRequestPreviewOnyxProps}; diff --git a/src/components/ReportActionItem/moneyRequestPreviewProps.ts b/src/components/ReportActionItem/moneyRequestPreviewProps.ts deleted file mode 100644 index 620d93c23399..000000000000 --- a/src/components/ReportActionItem/moneyRequestPreviewProps.ts +++ /dev/null @@ -1,32 +0,0 @@ -import type {Ref} from 'react'; -// eslint-disable-next-line no-restricted-imports -import type {Text as RNText, StyleProp, ViewStyle} from 'react-native'; -import type {OnyxCollection, OnyxEntry} from 'react-native-onyx'; -import type {PersonalDetailsList, Report, Session, Transaction, TransactionViolation, WalletTerms} from '@src/types/onyx'; -import type {OriginalMessageIOU} from '@src/types/onyx/OriginalMessage'; -import type {ReportActionBase} from '@src/types/onyx/ReportAction'; - -type MoneyRequestPreviewOnyxProps = { - chatReport: OnyxEntry; - iouReport: OnyxEntry; - personalDetails: OnyxEntry; - session: OnyxEntry; - transaction: OnyxEntry; - transactionViolations: OnyxCollection; - walletTerms: OnyxEntry; -}; -type MoneyRequestPreviewProps = { - action: OnyxEntry; - chatReportID: string; - checkIfContextMenuActive: () => void; - containerStyles: StyleProp; - contextMenuAnchor?: Ref; - iouReportID: string; - isBillSplit: boolean; - isHovered: boolean; - isWhisper: boolean; - onPreviewPressed: (() => void) | null; - shouldShowPendingConversionMessage: boolean; -} & MoneyRequestPreviewOnyxProps; - -export type {MoneyRequestPreviewProps, MoneyRequestPreviewOnyxProps}; diff --git a/src/languages/es.ts b/src/languages/es.ts index 9dd1a5145d98..394333ebb23a 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -2596,7 +2596,7 @@ export default { perDayLimit: ({formattedLimit}: ViolationsPerDayLimitParams) => `Importe supera el límite diario de la categoría${formattedLimit ? ` de ${formattedLimit}/persona` : ''}`, receiptNotSmartScanned: 'Recibo no verificado. Por favor, confirma su exactitud', receiptRequired: ({category, formattedLimit}: ViolationsReceiptRequiredParams) => - `Recibo obligatorio${category || formattedLimit ? ` para importes sobre${category ? ` el limite de la categoría de` : ''} ${formattedLimit}` : ''}`, + `Recibo obligatorio${!category && !formattedLimit ? '' : ` para importes sobre${category ? ` el limite de la categoría de` : ''} ${formattedLimit}`}`, reviewRequired: 'Revisión requerida', rter: ({brokenBankConnection, isAdmin, email, isTransactionOlderThan7Days, member}: ViolationsRterParams) => { if (brokenBankConnection) { From dde9079eb50da52c3e6930b43d40fd903e3c1dfc Mon Sep 17 00:00:00 2001 From: tienifr Date: Mon, 29 Jan 2024 16:18:40 +0700 Subject: [PATCH 071/288] fix three dot --- src/components/Modal/BaseModal.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/Modal/BaseModal.tsx b/src/components/Modal/BaseModal.tsx index ad3bf2d6a057..5fb3bcdfe652 100644 --- a/src/components/Modal/BaseModal.tsx +++ b/src/components/Modal/BaseModal.tsx @@ -60,7 +60,7 @@ function BaseModal( */ const hideModal = useCallback( (callHideCallback = true) => { - Modal.willAlertModalBecomeVisible(false, isPopover); + Modal.willAlertModalBecomeVisible(false); if (shouldSetModalVisibility) { Modal.setModalVisibility(false); } @@ -72,14 +72,14 @@ function BaseModal( ComposerFocusManager.setReadyToFocus(); } }, - [shouldSetModalVisibility, onModalHide, fullscreen, isPopover], + [shouldSetModalVisibility, onModalHide, fullscreen], ); useEffect(() => { isVisibleRef.current = isVisible; let removeOnCloseListener: () => void; if (isVisible) { - Modal.willAlertModalBecomeVisible(true, isPopover); + Modal.willAlertModalBecomeVisible(true, isPopover || type === CONST.MODAL.MODAL_TYPE.BOTTOM_DOCKED); // To handle closing any modal already visible when this modal is mounted, i.e. PopoverReportActionContextMenu removeOnCloseListener = Modal.setCloseModal(onClose); } @@ -90,7 +90,7 @@ function BaseModal( } removeOnCloseListener(); }; - }, [isVisible, wasVisible, onClose, isPopover]); + }, [isVisible, wasVisible, onClose, isPopover, type]); useEffect( () => () => { From a1ebabc5215a313dc31ee4f6a3a1bcd7f527aee0 Mon Sep 17 00:00:00 2001 From: tienifr Date: Mon, 29 Jan 2024 16:29:14 +0700 Subject: [PATCH 072/288] add comment --- src/libs/actions/Modal.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libs/actions/Modal.ts b/src/libs/actions/Modal.ts index 985fe4680d1f..6351d0165544 100644 --- a/src/libs/actions/Modal.ts +++ b/src/libs/actions/Modal.ts @@ -72,6 +72,7 @@ function setModalVisibility(isVisible: boolean) { /** * Allows other parts of app to know that an alert modal is about to open. * This will trigger as soon as a modal is opened but not yet visible while animation is running. + * isPopover indicates that the next open modal is popover or bottom docked */ function willAlertModalBecomeVisible(isVisible: boolean, isPopover = false) { Onyx.merge(ONYXKEYS.MODAL, {willAlertModalBecomeVisible: isVisible, isPopover}); From eea8acf7602f7014e3ffb06d3111e0499fe52f0c Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Mon, 29 Jan 2024 13:32:05 -0500 Subject: [PATCH 073/288] WIP --- .../{MoneyRequestPreview => }/MoneyRequestPreview.js | 4 ++-- .../MoneyRequestPreview/MoneyRequestPreviewWrapper.tsx | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) rename src/components/ReportActionItem/{MoneyRequestPreview => }/MoneyRequestPreview.js (99%) diff --git a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreview.js b/src/components/ReportActionItem/MoneyRequestPreview.js similarity index 99% rename from src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreview.js rename to src/components/ReportActionItem/MoneyRequestPreview.js index e486f7575a04..3479ff8a70d2 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreview.js +++ b/src/components/ReportActionItem/MoneyRequestPreview.js @@ -11,7 +11,6 @@ import MultipleAvatars from '@components/MultipleAvatars'; import OfflineWithFeedback from '@components/OfflineWithFeedback'; import PressableWithFeedback from '@components/Pressable/PressableWithoutFeedback'; import RenderHTML from '@components/RenderHTML'; -import ReportActionItemImages from '@components/ReportActionItem/ReportActionItemImages'; import {showContextMenuForReport} from '@components/ShowContextMenuContext'; import Text from '@components/Text'; import useLocalize from '@hooks/useLocalize'; @@ -32,7 +31,8 @@ import * as TransactionUtils from '@libs/TransactionUtils'; import * as PaymentMethods from '@userActions/PaymentMethods'; import * as Report from '@userActions/Report'; import CONST from '@src/CONST'; -import PropTypes from './moneyRequestPreviewPropTypes'; +import PropTypes from './MoneyRequestPreview/moneyRequestPreviewPropTypes'; +import ReportActionItemImages from './ReportActionItemImages'; export default function MoneyRequestPreview(props) { const theme = useTheme(); diff --git a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewWrapper.tsx b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewWrapper.tsx index f00411adc158..2f6f71fbe1ba 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewWrapper.tsx +++ b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewWrapper.tsx @@ -6,7 +6,7 @@ import {withOnyx} from 'react-native-onyx'; import * as ReportActionsUtils from '@libs/ReportActionsUtils'; import ONYXKEYS from '@src/ONYXKEYS'; import type {ReportAction} from '@src/types/onyx'; -import MoneyRequestPreview from './MoneyRequestPreview'; +import MoneyRequestPreview from '.'; import type {MoneyRequestPreviewOnyxProps, MoneyRequestPreviewProps} from './moneyRequestPreviewProps'; // We should not render the component if there is no iouReport and it's not a split. @@ -32,7 +32,7 @@ export default withOnyx( key: ONYXKEYS.SESSION, }, transaction: { - key: ({action}) => `${ONYXKEYS.COLLECTION.TRANSACTION}${ReportActionsUtils.isMoneyRequestAction(action as ReportAction) ? action?.originalMessage?.IOUTransactionID : 0 ?? 0}`, + key: ({action}) => `${ONYXKEYS.COLLECTION.TRANSACTION}${ReportActionsUtils.isMoneyRequestAction(action) ? action?.originalMessage?.IOUTransactionID : 0 ?? 0}`, }, walletTerms: { key: ONYXKEYS.WALLET_TERMS, From 58f7ed50876990988b1a2972bac4500bf893cb44 Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Mon, 29 Jan 2024 15:46:28 -0500 Subject: [PATCH 074/288] feat(Violations): use types from merged branch and rename components --- .../ReportActionItem/MoneyRequestAction.tsx | 4 +- .../MoneyRequestPreviewContent.tsx} | 104 ++-------------- .../MoneyRequestPreviewWrapper.tsx | 11 +- .../MoneyRequestPreview/index.ts | 3 - .../moneyRequestPreviewProps.ts | 116 +++++++++--------- 5 files changed, 73 insertions(+), 165 deletions(-) rename src/components/ReportActionItem/{MoneyRequestPreview.tsx => MoneyRequestPreview/MoneyRequestPreviewContent.tsx} (80%) delete mode 100644 src/components/ReportActionItem/MoneyRequestPreview/index.ts diff --git a/src/components/ReportActionItem/MoneyRequestAction.tsx b/src/components/ReportActionItem/MoneyRequestAction.tsx index 51c814c1b2c6..27ab4c5a5ce3 100644 --- a/src/components/ReportActionItem/MoneyRequestAction.tsx +++ b/src/components/ReportActionItem/MoneyRequestAction.tsx @@ -18,7 +18,7 @@ import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; import type * as OnyxTypes from '@src/types/onyx'; import {isEmptyObject} from '@src/types/utils/EmptyObject'; -import MoneyRequestPreview from './MoneyRequestPreview'; +import MoneyRequestPreviewContent from './MoneyRequestPreview/MoneyRequestPreviewContent'; type MoneyRequestActionOnyxProps = { /** Chat report associated with iouReport */ @@ -121,7 +121,7 @@ function MoneyRequestAction({ return isDeletedParentAction || isReversedTransaction ? ( ${translate(isReversedTransaction ? 'parentReportAction.reversedTransaction' : 'parentReportAction.deletedRequest')}`} /> ) : ( - ; - - /** Chat report associated with iouReport */ - chatReport: OnyxEntry; - - /** IOU report data object */ - iouReport: OnyxEntry; - - /** Session info for the currently logged in user. */ - session: OnyxEntry; - - /** The transaction attached to the action.message.iouTransactionID */ - transaction: OnyxEntry; - - /** Information about the user accepting the terms for payments */ - walletTerms: OnyxEntry; -}; - -type MoneyRequestPreviewProps = MoneyRequestPreviewOnyxProps & { - /** The active IOUReport, used for Onyx subscription */ - // The iouReportID is used inside withOnyx HOC - // eslint-disable-next-line react/no-unused-prop-types - iouReportID: string; - - /** The associated chatReport */ - chatReportID: string; - - /** The ID of the current report */ - reportID: string; - - /** Callback for the preview pressed */ - onPreviewPressed: (event?: GestureResponderEvent | KeyboardEvent) => void; - - /** All the data of the action, used for showing context menu */ - action: OnyxTypes.ReportAction; - - /** Popover context menu anchor, used for showing context menu */ - contextMenuAnchor?: ContextMenuAnchor; - - /** Callback for updating context menu active state, used for showing context menu */ - checkIfContextMenuActive?: () => void; - - /** Extra styles to pass to View wrapper */ - containerStyles?: StyleProp; - - /** True if this is this IOU is a split instead of a 1:1 request */ - isBillSplit: boolean; - - /** True if the IOU Preview card is hovered */ - isHovered?: boolean; - - /** Whether or not an IOU report contains money requests in a different currency - * that are either created or cancelled offline, and thus haven't been converted to the report's currency yet - */ - shouldShowPendingConversionMessage?: boolean; - - /** Whether a message is a whisper */ - isWhisper?: boolean; -}; +import {isEmptyObject} from '@src/types/utils/EmptyObject'; +import type {MoneyRequestPreviewProps} from './moneyRequestPreviewProps'; -function MoneyRequestPreview({ +function MoneyRequestPreviewContent({ iouReport, isBillSplit, session, @@ -360,28 +294,6 @@ function MoneyRequestPreview({ ); } -MoneyRequestPreview.displayName = 'MoneyRequestPreview'; +MoneyRequestPreviewContent.displayName = 'MoneyRequestPreview'; -export default withOnyx({ - personalDetails: { - key: ONYXKEYS.PERSONAL_DETAILS_LIST, - }, - chatReport: { - key: ({chatReportID}) => `${ONYXKEYS.COLLECTION.REPORT}${chatReportID}`, - }, - iouReport: { - key: ({iouReportID}) => `${ONYXKEYS.COLLECTION.REPORT}${iouReportID}`, - }, - session: { - key: ONYXKEYS.SESSION, - }, - transaction: { - key: ({action}) => { - const originalMessage = action?.actionName === CONST.REPORT.ACTIONS.TYPE.IOU ? action.originalMessage : undefined; - return `${ONYXKEYS.COLLECTION.TRANSACTION}${originalMessage?.IOUTransactionID ?? 0}`; - }, - }, - walletTerms: { - key: ONYXKEYS.WALLET_TERMS, - }, -})(MoneyRequestPreview); +export default MoneyRequestPreviewContent; diff --git a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewWrapper.tsx b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewWrapper.tsx index 2f6f71fbe1ba..4cebd503482e 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewWrapper.tsx +++ b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewWrapper.tsx @@ -5,18 +5,17 @@ import React from 'react'; import {withOnyx} from 'react-native-onyx'; import * as ReportActionsUtils from '@libs/ReportActionsUtils'; import ONYXKEYS from '@src/ONYXKEYS'; -import type {ReportAction} from '@src/types/onyx'; -import MoneyRequestPreview from '.'; +import MoneyRequestPreviewContent from './MoneyRequestPreviewContent'; import type {MoneyRequestPreviewOnyxProps, MoneyRequestPreviewProps} from './moneyRequestPreviewProps'; // We should not render the component if there is no iouReport and it's not a split. // Moved outside of the component scope to allow for easier use of hooks in the main component. -function MoneyRequestPreviewWrapper(props: MoneyRequestPreviewProps) { +function MoneyRequestPreview(props: MoneyRequestPreviewProps) { // eslint-disable-next-line react/jsx-props-no-spreading - return lodashIsEmpty(props.iouReport) && !props.isBillSplit ? null : ; + return lodashIsEmpty(props.iouReport) && !props.isBillSplit ? null : ; } -MoneyRequestPreviewWrapper.displayName = 'MoneyRequestPreviewWrapper'; +MoneyRequestPreview.displayName = 'MoneyRequestPreview'; export default withOnyx({ personalDetails: { @@ -40,4 +39,4 @@ export default withOnyx( transactionViolations: { key: ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS, }, -})(MoneyRequestPreviewWrapper); +})(MoneyRequestPreview); diff --git a/src/components/ReportActionItem/MoneyRequestPreview/index.ts b/src/components/ReportActionItem/MoneyRequestPreview/index.ts deleted file mode 100644 index 7102d862765a..000000000000 --- a/src/components/ReportActionItem/MoneyRequestPreview/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import MoneyRequestPreviewWrapper from './MoneyRequestPreviewWrapper'; - -export default MoneyRequestPreviewWrapper; diff --git a/src/components/ReportActionItem/MoneyRequestPreview/moneyRequestPreviewProps.ts b/src/components/ReportActionItem/MoneyRequestPreview/moneyRequestPreviewProps.ts index 070e38667ee8..1d58dbc35c74 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview/moneyRequestPreviewProps.ts +++ b/src/components/ReportActionItem/MoneyRequestPreview/moneyRequestPreviewProps.ts @@ -1,72 +1,72 @@ -import type {Ref} from 'react'; -// eslint-disable-next-line no-restricted-imports -import type {Text as RNText, StyleProp, ViewStyle} from 'react-native'; -import type {OnyxCollection, OnyxEntry} from 'react-native-onyx'; -import type CONST from '@src/CONST'; -import type {PersonalDetailsList, Report, Session, Transaction, TransactionViolation, WalletTerms} from '@src/types/onyx'; -import type {OriginalMessageIOU} from '@src/types/onyx/OriginalMessage'; -import type {ReportActionBase} from '@src/types/onyx/ReportAction'; +import type {GestureResponderEvent, StyleProp, ViewStyle} from 'react-native'; +import type {OnyxCollection} from 'react-native-onyx'; +import type {OnyxEntry} from 'react-native-onyx/lib/types'; +import type {ContextMenuAnchor} from '@pages/home/report/ContextMenu/ReportActionContextMenu'; +import type * as OnyxTypes from '@src/types/onyx'; -// typescript version of reportActionFragmentPropType -type MoneyRequestFragment = { - /** The type of the action item fragment. Used to render a corresponding component */ - type: string; - - /** The text content of the fragment. */ - text: string; - - /** Used to apply additional styling. Style refers to a predetermined constant and not a class name. e.g. 'normal' or 'strong' */ - style?: string; +type MoneyRequestPreviewOnyxProps = { + /** All of the personal details for everyone */ + personalDetails: OnyxEntry; - /** ID of a report */ - reportID?: string; + /** Chat report associated with iouReport */ + chatReport: OnyxEntry; - /** ID of a policy */ - policyID?: string; + /** IOU report data object */ + iouReport: OnyxEntry; - /** The target of a link fragment e.g. '_blank' */ - target?: string; + /** Session info for the currently logged in user. */ + session: OnyxEntry; - /** The destination of a link fragment e.g. 'https://www.expensify.com' */ - href?: string; + /** The transaction attached to the action.message.iouTransactionID */ + transaction: OnyxEntry; - /** An additional avatar url - not the main avatar url but used within a message. */ - iconUrl?: string; + /** The transaction violations attached to the action.message.iouTransactionID */ + transactionViolations: OnyxCollection; - /** Fragment edited flag */ - isEdited?: boolean; + /** Information about the user accepting the terms for payments */ + walletTerms: OnyxEntry; }; -// We need to override some of these to match the more general reportActionPropType -type MoneyRequestAction = Omit & { - person: MoneyRequestFragment[]; - reportActionID: string; - created: string; - actionName: (typeof CONST.REPORT.ACTIONS.TYPE)[keyof typeof CONST.REPORT.ACTIONS.TYPE]; - originalMessage: OriginalMessageIOU; -}; +type MoneyRequestPreviewProps = MoneyRequestPreviewOnyxProps & { + /** The active IOUReport, used for Onyx subscription */ + // The iouReportID is used inside withOnyx HOC + // eslint-disable-next-line react/no-unused-prop-types + iouReportID: string; -type MoneyRequestPreviewOnyxProps = { - chatReport: OnyxEntry; - iouReport: OnyxEntry; - personalDetails: OnyxEntry; - session: OnyxEntry; - transaction: OnyxEntry; - transactionViolations: OnyxCollection; - walletTerms: OnyxEntry; -}; -type MoneyRequestPreviewProps = { - action: MoneyRequestAction; + /** The associated chatReport */ chatReportID: string; - checkIfContextMenuActive: () => void; - containerStyles: StyleProp; - contextMenuAnchor?: Ref; - iouReportID: string; + + /** The ID of the current report */ + reportID: string; + + /** Callback for the preview pressed */ + onPreviewPressed: (event?: GestureResponderEvent | KeyboardEvent) => void; + + /** All the data of the action, used for showing context menu */ + action: OnyxTypes.ReportAction; + + /** Popover context menu anchor, used for showing context menu */ + contextMenuAnchor?: ContextMenuAnchor; + + /** Callback for updating context menu active state, used for showing context menu */ + checkIfContextMenuActive?: () => void; + + /** Extra styles to pass to View wrapper */ + containerStyles?: StyleProp; + + /** True if this is this IOU is a split instead of a 1:1 request */ isBillSplit: boolean; - isHovered: boolean; - isWhisper: boolean; - onPreviewPressed: (() => void) | null; - shouldShowPendingConversionMessage: boolean; -} & MoneyRequestPreviewOnyxProps; + + /** True if the IOU Preview card is hovered */ + isHovered?: boolean; + + /** Whether or not an IOU report contains money requests in a different currency + * that are either created or cancelled offline, and thus haven't been converted to the report's currency yet + */ + shouldShowPendingConversionMessage?: boolean; + + /** Whether a message is a whisper */ + isWhisper?: boolean; +}; export type {MoneyRequestPreviewProps, MoneyRequestPreviewOnyxProps}; From 3982df6872a9803ae41b875ad8f563705482971e Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Mon, 29 Jan 2024 17:26:00 -0500 Subject: [PATCH 075/288] feat(Violations): rename component & file --- .../ReportActionItem/MoneyRequestAction.tsx | 4 +- ...neyRequestPreviewWrapper.tsx => index.tsx} | 0 .../moneyRequestPreviewPropTypes.ts | 103 ------------------ 3 files changed, 2 insertions(+), 105 deletions(-) rename src/components/ReportActionItem/MoneyRequestPreview/{MoneyRequestPreviewWrapper.tsx => index.tsx} (100%) delete mode 100644 src/components/ReportActionItem/MoneyRequestPreview/moneyRequestPreviewPropTypes.ts diff --git a/src/components/ReportActionItem/MoneyRequestAction.tsx b/src/components/ReportActionItem/MoneyRequestAction.tsx index 27ab4c5a5ce3..51c814c1b2c6 100644 --- a/src/components/ReportActionItem/MoneyRequestAction.tsx +++ b/src/components/ReportActionItem/MoneyRequestAction.tsx @@ -18,7 +18,7 @@ import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; import type * as OnyxTypes from '@src/types/onyx'; import {isEmptyObject} from '@src/types/utils/EmptyObject'; -import MoneyRequestPreviewContent from './MoneyRequestPreview/MoneyRequestPreviewContent'; +import MoneyRequestPreview from './MoneyRequestPreview'; type MoneyRequestActionOnyxProps = { /** Chat report associated with iouReport */ @@ -121,7 +121,7 @@ function MoneyRequestAction({ return isDeletedParentAction || isReversedTransaction ? ( ${translate(isReversedTransaction ? 'parentReportAction.reversedTransaction' : 'parentReportAction.deletedRequest')}`} /> ) : ( - {}, - containerStyles: [], - walletTerms: {}, - chatReport: {}, - isHovered: false, - personalDetails: {}, - session: { - email: null, - }, - transaction: {}, - shouldShowPendingConversionMessage: false, - isWhisper: false, - transactionViolations: {}, -}; - -export default { - propTypes, - defaultProps, -}; From afc6324b2197abb1d4627f626db2b4c7c3a1dcf5 Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Mon, 29 Jan 2024 17:59:15 -0500 Subject: [PATCH 076/288] feat(Violations): restore violations logic --- .../MoneyRequestPreviewContent.tsx | 18 ++++++++++++------ .../MoneyRequestPreview/index.tsx | 2 +- .../{moneyRequestPreviewProps.ts => types.ts} | 0 src/libs/ReportUtils.ts | 6 ++++-- src/libs/TransactionUtils.ts | 4 ++-- 5 files changed, 19 insertions(+), 11 deletions(-) rename src/components/ReportActionItem/MoneyRequestPreview/{moneyRequestPreviewProps.ts => types.ts} (100%) diff --git a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx index 1679393093e6..3d5caaeb47e7 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx +++ b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx @@ -29,13 +29,14 @@ import * as ReceiptUtils from '@libs/ReceiptUtils'; import * as ReportActionsUtils from '@libs/ReportActionsUtils'; import * as ReportUtils from '@libs/ReportUtils'; import * as TransactionUtils from '@libs/TransactionUtils'; +import ViolationsUtils from '@libs/Violations/ViolationsUtils'; import * as PaymentMethods from '@userActions/PaymentMethods'; import * as Report from '@userActions/Report'; import CONST from '@src/CONST'; import type {IOUMessage} from '@src/types/onyx/OriginalMessage'; import type {EmptyObject} from '@src/types/utils/EmptyObject'; import {isEmptyObject} from '@src/types/utils/EmptyObject'; -import type {MoneyRequestPreviewProps} from './moneyRequestPreviewProps'; +import type {MoneyRequestPreviewProps} from './types'; function MoneyRequestPreviewContent({ iouReport, @@ -55,6 +56,7 @@ function MoneyRequestPreviewContent({ shouldShowPendingConversionMessage = false, isHovered = false, isWhisper = false, + transactionViolations, }: MoneyRequestPreviewProps) { const theme = useTheme(); const styles = useThemeStyles(); @@ -63,10 +65,6 @@ function MoneyRequestPreviewContent({ const {isSmallScreenWidth, windowWidth} = useWindowDimensions(); const parser = new ExpensiMark(); - if (isEmptyObject(iouReport) && !isBillSplit) { - return null; - } - const sessionAccountID = session?.accountID; const managerID = iouReport?.managerID ?? -1; const ownerAccountID = iouReport?.ownerAccountID ?? -1; @@ -87,6 +85,7 @@ function MoneyRequestPreviewContent({ const requestMerchant = truncate(merchant, {length: CONST.REQUEST_PREVIEW.MAX_LENGTH}); const hasReceipt = TransactionUtils.hasReceipt(transaction); const isScanning = hasReceipt && TransactionUtils.isReceiptBeingScanned(transaction); + const hasViolations = transaction && TransactionUtils.hasViolation(transaction, transactionViolations); const hasFieldErrors = TransactionUtils.hasMissingSmartscanFields(transaction); const isDistanceRequest = TransactionUtils.isDistanceRequest(transaction); const isExpensifyCardTransaction = TransactionUtils.isExpensifyCardTransaction(transaction); @@ -140,7 +139,14 @@ function MoneyRequestPreviewContent({ } let message = translate('iou.cash'); - if (ReportUtils.isPaidGroupPolicyExpenseReport(iouReport) && ReportUtils.isReportApproved(iouReport) && !ReportUtils.isSettled(iouReport?.reportID)) { + if (hasViolations && transaction) { + const violations = TransactionUtils.getTransactionViolations(transaction, transactionViolations); + if (violations?.[0]) { + const violationMessage = ViolationsUtils.getViolationTranslation(violations?.[0], translate); + const isTooLong = violations.filter((v) => v.type === 'violation').length > 1 || violationMessage.length > 15; + message += ` • ${isTooLong ? translate('violations.reviewRequired') : violationMessage}`; + } + } else if (ReportUtils.isPaidGroupPolicyExpenseReport(iouReport) && ReportUtils.isReportApproved(iouReport) && !ReportUtils.isSettled(iouReport)) { message += ` • ${translate('iou.approved')}`; } else if (iouReport?.isWaitingOnBankAccount) { message += ` • ${translate('iou.pending')}`; diff --git a/src/components/ReportActionItem/MoneyRequestPreview/index.tsx b/src/components/ReportActionItem/MoneyRequestPreview/index.tsx index 4cebd503482e..81e36a423f66 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview/index.tsx +++ b/src/components/ReportActionItem/MoneyRequestPreview/index.tsx @@ -6,7 +6,7 @@ import {withOnyx} from 'react-native-onyx'; import * as ReportActionsUtils from '@libs/ReportActionsUtils'; import ONYXKEYS from '@src/ONYXKEYS'; import MoneyRequestPreviewContent from './MoneyRequestPreviewContent'; -import type {MoneyRequestPreviewOnyxProps, MoneyRequestPreviewProps} from './moneyRequestPreviewProps'; +import type {MoneyRequestPreviewOnyxProps, MoneyRequestPreviewProps} from './types'; // We should not render the component if there is no iouReport and it's not a split. // Moved outside of the component scope to allow for easier use of hooks in the main component. diff --git a/src/components/ReportActionItem/MoneyRequestPreview/moneyRequestPreviewProps.ts b/src/components/ReportActionItem/MoneyRequestPreview/types.ts similarity index 100% rename from src/components/ReportActionItem/MoneyRequestPreview/moneyRequestPreviewProps.ts rename to src/components/ReportActionItem/MoneyRequestPreview/types.ts diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index be447cf2ea9d..21937e7606df 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -691,10 +691,12 @@ function hasParticipantInArray(report: Report, policyMemberAccountIDs: number[]) /** * Whether the Money Request report is settled */ -function isSettled(reportID: string | undefined): boolean { - if (!allReports) { +function isSettled(reportOrID: Report | OnyxEntry | string | undefined): boolean { + if (!allReports || !reportOrID) { return false; } + const reportID = typeof reportOrID === 'string' ? reportOrID : reportOrID?.reportID; + const report: Report | EmptyObject = allReports[`${ONYXKEYS.COLLECTION.REPORT}${reportID}`] ?? {}; if (isEmptyObject(report) || report.isWaitingOnBankAccount) { return false; diff --git a/src/libs/TransactionUtils.ts b/src/libs/TransactionUtils.ts index ffbe414c58dd..97a1c3e95d6b 100644 --- a/src/libs/TransactionUtils.ts +++ b/src/libs/TransactionUtils.ts @@ -531,8 +531,8 @@ function getRecentTransactions(transactions: Record, size = 2): /** * Checks if any violations for the provided transaction are of type 'violation' */ -function hasViolation(transaction: Transaction | string, transactionViolations: OnyxCollection): boolean { - const transactionID = typeof transaction === 'string' ? transaction : transaction.transactionID; +function hasViolation(transactionOrID: Transaction | string, transactionViolations: OnyxCollection): boolean { + const transactionID = typeof transactionOrID === 'string' ? transactionOrID : transactionOrID.transactionID; return Boolean(transactionViolations?.[ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS + transactionID]?.some((violation: TransactionViolation) => violation.type === 'violation')); } From 1d734de4ccfc0c091376b7595c62b40981603b07 Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Mon, 29 Jan 2024 18:09:03 -0500 Subject: [PATCH 077/288] feat(Violations): handle null case --- .../MoneyRequestPreview/MoneyRequestPreviewContent.tsx | 5 +++-- src/libs/TransactionUtils.ts | 5 ++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx index 3d5caaeb47e7..47e3b30ecb99 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx +++ b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx @@ -85,8 +85,9 @@ function MoneyRequestPreviewContent({ const requestMerchant = truncate(merchant, {length: CONST.REQUEST_PREVIEW.MAX_LENGTH}); const hasReceipt = TransactionUtils.hasReceipt(transaction); const isScanning = hasReceipt && TransactionUtils.isReceiptBeingScanned(transaction); - const hasViolations = transaction && TransactionUtils.hasViolation(transaction, transactionViolations); + const hasViolations = TransactionUtils.hasViolation(transaction, transactionViolations); const hasFieldErrors = TransactionUtils.hasMissingSmartscanFields(transaction); + const shouldShowRBR = hasViolations || hasFieldErrors; const isDistanceRequest = TransactionUtils.isDistanceRequest(transaction); const isExpensifyCardTransaction = TransactionUtils.isExpensifyCardTransaction(transaction); const isSettled = ReportUtils.isSettled(iouReport?.reportID); @@ -213,7 +214,7 @@ function MoneyRequestPreviewContent({ {getPreviewHeaderText() + (isSettled && !iouReport?.isCancelledIOU ? ` • ${getSettledMessage()}` : '')} - {!isSettled && hasFieldErrors && ( + {!isSettled && shouldShowRBR && ( , size = 2): /** * Checks if any violations for the provided transaction are of type 'violation' */ -function hasViolation(transactionOrID: Transaction | string, transactionViolations: OnyxCollection): boolean { +function hasViolation(transactionOrID: Transaction | OnyxEntry | string, transactionViolations: OnyxCollection): boolean { + if (!transactionOrID) { + return false; + } const transactionID = typeof transactionOrID === 'string' ? transactionOrID : transactionOrID.transactionID; return Boolean(transactionViolations?.[ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS + transactionID]?.some((violation: TransactionViolation) => violation.type === 'violation')); } From 7a03998f753b3bfcdaa35b9a0c3e50d3f2343638 Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Mon, 29 Jan 2024 18:11:33 -0500 Subject: [PATCH 078/288] feat(Violations): remove nullish coalescing from narrowed type --- .../MoneyRequestPreview/MoneyRequestPreviewContent.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx index 47e3b30ecb99..32f4e29eced3 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx +++ b/src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx @@ -143,7 +143,7 @@ function MoneyRequestPreviewContent({ if (hasViolations && transaction) { const violations = TransactionUtils.getTransactionViolations(transaction, transactionViolations); if (violations?.[0]) { - const violationMessage = ViolationsUtils.getViolationTranslation(violations?.[0], translate); + const violationMessage = ViolationsUtils.getViolationTranslation(violations[0], translate); const isTooLong = violations.filter((v) => v.type === 'violation').length > 1 || violationMessage.length > 15; message += ` • ${isTooLong ? translate('violations.reviewRequired') : violationMessage}`; } From 89451556b7d6fc1bb845687363aa2765c3bd8b6e Mon Sep 17 00:00:00 2001 From: tienifr Date: Tue, 30 Jan 2024 14:55:58 +0700 Subject: [PATCH 079/288] fix: Focus mode - User priority mode is switched back to focus automatically --- src/libs/actions/User.ts | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/libs/actions/User.ts b/src/libs/actions/User.ts index f118797fa659..8b8f6ef4a5da 100644 --- a/src/libs/actions/User.ts +++ b/src/libs/actions/User.ts @@ -582,13 +582,11 @@ function updateChatPriorityMode(mode: ValueOf, autom }, ]; - if (autoSwitchedToFocusMode) { - optimisticData.push({ - onyxMethod: Onyx.METHOD.MERGE, - key: ONYXKEYS.NVP_TRY_FOCUS_MODE, - value: true, - }); - } + optimisticData.push({ + onyxMethod: Onyx.METHOD.MERGE, + key: ONYXKEYS.NVP_TRY_FOCUS_MODE, + value: true, + }); const parameters: UpdateChatPriorityModeParams = { value: mode, From ddf8c630eaaa4a75a035c3c0915902c96d5e38be Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Tue, 30 Jan 2024 13:40:09 -0500 Subject: [PATCH 080/288] feat(Violations): resolve type errors and import issues --- src/components/ReportActionItem/MoneyRequestAction.tsx | 2 +- .../ReportActionItem/MoneyRequestPreview/types.ts | 3 +-- src/components/ReportActionItem/MoneyRequestView.tsx | 4 ++-- src/components/ReportActionItem/ReportActionItemImage.tsx | 2 +- src/libs/OptionsListUtils.ts | 5 +++-- src/libs/TransactionUtils.ts | 7 ++++++- .../report/ContextMenu/PopoverReportActionContextMenu.tsx | 2 +- src/types/onyx/Transaction.ts | 2 +- 8 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/components/ReportActionItem/MoneyRequestAction.tsx b/src/components/ReportActionItem/MoneyRequestAction.tsx index 51c814c1b2c6..ff29bf5b0ee8 100644 --- a/src/components/ReportActionItem/MoneyRequestAction.tsx +++ b/src/components/ReportActionItem/MoneyRequestAction.tsx @@ -1,7 +1,7 @@ import React from 'react'; import type {StyleProp, ViewStyle} from 'react-native'; import {withOnyx} from 'react-native-onyx'; -import type {OnyxEntry} from 'react-native-onyx/lib/types'; +import type {OnyxEntry} from 'react-native-onyx'; import RenderHTML from '@components/RenderHTML'; import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; diff --git a/src/components/ReportActionItem/MoneyRequestPreview/types.ts b/src/components/ReportActionItem/MoneyRequestPreview/types.ts index 1d58dbc35c74..17dd42b2f794 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview/types.ts +++ b/src/components/ReportActionItem/MoneyRequestPreview/types.ts @@ -1,6 +1,5 @@ import type {GestureResponderEvent, StyleProp, ViewStyle} from 'react-native'; -import type {OnyxCollection} from 'react-native-onyx'; -import type {OnyxEntry} from 'react-native-onyx/lib/types'; +import type {OnyxCollection, OnyxEntry} from 'react-native-onyx'; import type {ContextMenuAnchor} from '@pages/home/report/ContextMenu/ReportActionContextMenu'; import type * as OnyxTypes from '@src/types/onyx'; diff --git a/src/components/ReportActionItem/MoneyRequestView.tsx b/src/components/ReportActionItem/MoneyRequestView.tsx index 877094ca509a..223599924348 100644 --- a/src/components/ReportActionItem/MoneyRequestView.tsx +++ b/src/components/ReportActionItem/MoneyRequestView.tsx @@ -137,10 +137,10 @@ function MoneyRequestView({ // Flags for showing categories and tags // transactionCategory can be an empty string // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing - const shouldShowCategory = isPolicyExpenseChat && (transactionCategory || OptionsListUtils.hasEnabledOptions(Object.values(policyCategories ?? {}))); + const shouldShowCategory = isPolicyExpenseChat && (transactionCategory || OptionsListUtils.hasEnabledOptions(policyCategories ?? {})); // transactionTag can be an empty string // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing - const shouldShowTag = isPolicyExpenseChat && (transactionTag || OptionsListUtils.hasEnabledOptions(Object.values(policyTagsList))); + const shouldShowTag = isPolicyExpenseChat && (transactionTag || OptionsListUtils.hasEnabledOptions(policyTagsList)); const shouldShowBillable = isPolicyExpenseChat && (!!transactionBillable || !(policy?.disabledFields?.defaultBillable ?? true)); const {getViolationsForField} = useViolations(transactionViolations ?? []); diff --git a/src/components/ReportActionItem/ReportActionItemImage.tsx b/src/components/ReportActionItem/ReportActionItemImage.tsx index c014a71a4789..089402d51bf2 100644 --- a/src/components/ReportActionItem/ReportActionItemImage.tsx +++ b/src/components/ReportActionItem/ReportActionItemImage.tsx @@ -3,7 +3,7 @@ import React from 'react'; import type {ReactElement} from 'react'; import {View} from 'react-native'; import type {ImageSourcePropType} from 'react-native'; -import type {OnyxEntry} from 'react-native-onyx/lib/types'; +import type {OnyxEntry} from 'react-native-onyx'; import AttachmentModal from '@components/AttachmentModal'; import EReceiptThumbnail from '@components/EReceiptThumbnail'; import Image from '@components/Image'; diff --git a/src/libs/OptionsListUtils.ts b/src/libs/OptionsListUtils.ts index be24cfb36f59..65a6293f3bab 100644 --- a/src/libs/OptionsListUtils.ts +++ b/src/libs/OptionsListUtils.ts @@ -19,6 +19,7 @@ import type { PolicyCategories, PolicyCategory, PolicyTag, + PolicyTags, Report, ReportAction, ReportActions, @@ -782,8 +783,8 @@ function getEnabledCategoriesCount(options: PolicyCategories): number { /** * Verifies that there is at least one enabled option */ -function hasEnabledOptions(options: PolicyCategory[] | PolicyTag[]): boolean { - return options.some((option) => option.enabled); +function hasEnabledOptions(options: PolicyCategories | PolicyTags): boolean { + return Object.values(options).some((option) => option.enabled); } /** diff --git a/src/libs/TransactionUtils.ts b/src/libs/TransactionUtils.ts index bd3d08425b7d..58b65ab7fb5f 100644 --- a/src/libs/TransactionUtils.ts +++ b/src/libs/TransactionUtils.ts @@ -539,7 +539,12 @@ function hasViolation(transactionOrID: Transaction | OnyxEntry | st return Boolean(transactionViolations?.[ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS + transactionID]?.some((violation: TransactionViolation) => violation.type === 'violation')); } -function getTransactionViolations({transactionID}: Transaction, transactionViolations: OnyxCollection): TransactionViolation[] | null { +function getTransactionViolations(transactionOrID: OnyxEntry | string, transactionViolations: OnyxCollection): TransactionViolation[] | null { + if (!transactionOrID) { + return null; + } + const transactionID = typeof transactionOrID === 'string' ? transactionOrID : transactionOrID.transactionID; + return transactionViolations?.[ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS + transactionID] ?? null; } diff --git a/src/pages/home/report/ContextMenu/PopoverReportActionContextMenu.tsx b/src/pages/home/report/ContextMenu/PopoverReportActionContextMenu.tsx index f37eabaa7c1d..272548214ece 100644 --- a/src/pages/home/report/ContextMenu/PopoverReportActionContextMenu.tsx +++ b/src/pages/home/report/ContextMenu/PopoverReportActionContextMenu.tsx @@ -67,7 +67,7 @@ function PopoverReportActionContextMenu(_props: never, ref: ForwardedRef(null); const anchorRef = useRef(null); const dimensionsEventListener = useRef(null); - const contextMenuAnchorRef = useRef(null); + const contextMenuAnchorRef = useRef(null); const contextMenuTargetNode = useRef(null); const onPopoverShow = useRef(() => {}); diff --git a/src/types/onyx/Transaction.ts b/src/types/onyx/Transaction.ts index 3a652ba0ef8c..65dd9d6edaa9 100644 --- a/src/types/onyx/Transaction.ts +++ b/src/types/onyx/Transaction.ts @@ -78,7 +78,7 @@ type Transaction = { routes?: Routes; transactionID: string; tag: string; - pendingFields?: Partial<{[K in TransactionPendingFieldsKey]: ValueOf}>; + pendingFields?: Partial<{[K in keyof Transaction | keyof Comment]: ValueOf}>; /** Card Transactions */ From 3aea37c9c6d4a8356c3bbe58ce734a4e86795c62 Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Tue, 30 Jan 2024 18:35:07 -0500 Subject: [PATCH 081/288] feat(Violations): pass ReceiptError properly down to DotIndicatorMessage --- src/components/DotIndicatorMessage.tsx | 20 +++++++---- src/components/MessagesRow.tsx | 3 +- src/components/OfflineWithFeedback.tsx | 14 ++++---- .../ReportActionItem/MoneyRequestView.tsx | 35 +++++++++++++++++-- src/libs/ErrorUtils.ts | 21 ++++++++++- src/libs/Violations/ViolationsUtils.ts | 2 +- src/types/onyx/Transaction.ts | 2 +- 7 files changed, 75 insertions(+), 22 deletions(-) diff --git a/src/components/DotIndicatorMessage.tsx b/src/components/DotIndicatorMessage.tsx index d18704fdfb05..ac4dcb4cd30a 100644 --- a/src/components/DotIndicatorMessage.tsx +++ b/src/components/DotIndicatorMessage.tsx @@ -7,14 +7,14 @@ import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; import fileDownload from '@libs/fileDownload'; import * as Localize from '@libs/Localize'; +import type {MaybePhraseKey} from '@libs/Localize'; import CONST from '@src/CONST'; +import type {ReceiptError} from '@src/types/onyx/Transaction'; import Icon from './Icon'; import * as Expensicons from './Icon/Expensicons'; import {PressableWithoutFeedback} from './Pressable'; import Text from './Text'; -type ReceiptError = {error?: string; source: string; filename: string}; - type DotIndicatorMessageProps = { /** * In most cases this should just be errors from onxyData @@ -23,7 +23,7 @@ type DotIndicatorMessageProps = { * timestamp: 'message', * } */ - messages: Record; + messages: Record; /** The type of message, 'error' shows a red dot, 'success' shows a green dot */ type: 'error' | 'success'; @@ -36,11 +36,17 @@ type DotIndicatorMessageProps = { }; /** Check if the error includes a receipt. */ -function isReceiptError(message: string | ReceiptError): message is ReceiptError { +function isReceiptError(message: unknown): message is ReceiptError { if (typeof message === 'string') { return false; } - return (message?.error ?? '') === CONST.IOU.RECEIPT_ERROR; + if (Array.isArray(message)) { + return false; + } + if (Object.keys(message as Record).length === 0) { + return false; + } + return ((message as Record)?.error ?? '') === CONST.IOU.RECEIPT_ERROR; } function DotIndicatorMessage({messages = {}, style, type, textStyles}: DotIndicatorMessageProps) { @@ -53,12 +59,12 @@ function DotIndicatorMessage({messages = {}, style, type, textStyles}: DotIndica } // Fetch the keys, sort them, and map through each key to get the corresponding message - const sortedMessages = Object.keys(messages) + const sortedMessages: Array = Object.keys(messages) .sort() .map((key) => messages[key]); // Removing duplicates using Set and transforming the result into an array - const uniqueMessages = [...new Set(sortedMessages)].map((message) => Localize.translateIfPhraseKey(message)); + const uniqueMessages: Array = [...new Set(sortedMessages)].map((message) => (isReceiptError(message) ? message : Localize.translateIfPhraseKey(message))); const isErrorMessage = type === 'error'; diff --git a/src/components/MessagesRow.tsx b/src/components/MessagesRow.tsx index cfec6fd292e9..7c764ec94fcd 100644 --- a/src/components/MessagesRow.tsx +++ b/src/components/MessagesRow.tsx @@ -6,6 +6,7 @@ import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; import type * as Localize from '@libs/Localize'; import CONST from '@src/CONST'; +import type {ReceiptError} from '@src/types/onyx/Transaction'; import {isEmptyObject} from '@src/types/utils/EmptyObject'; import DotIndicatorMessage from './DotIndicatorMessage'; import Icon from './Icon'; @@ -15,7 +16,7 @@ import Tooltip from './Tooltip'; type MessagesRowProps = { /** The messages to display */ - messages: Record; + messages: Record; /** The type of message, 'error' shows a red dot, 'success' shows a green dot */ type: 'error' | 'success'; diff --git a/src/components/OfflineWithFeedback.tsx b/src/components/OfflineWithFeedback.tsx index 1a8f313af267..9086c0c21ea7 100644 --- a/src/components/OfflineWithFeedback.tsx +++ b/src/components/OfflineWithFeedback.tsx @@ -1,13 +1,15 @@ -import React, {useCallback} from 'react'; +import React, {useCallback, useMemo} from 'react'; import type {ImageStyle, StyleProp, TextStyle, ViewStyle} from 'react-native'; import {View} from 'react-native'; import useNetwork from '@hooks/useNetwork'; import useStyleUtils from '@hooks/useStyleUtils'; import useThemeStyles from '@hooks/useThemeStyles'; +import {removeErrorsWithNullMessage} from '@libs/ErrorUtils'; import mapChildrenFlat from '@libs/mapChildrenFlat'; import shouldRenderOffscreen from '@libs/shouldRenderOffscreen'; import CONST from '@src/CONST'; import type * as OnyxCommon from '@src/types/onyx/OnyxCommon'; +import type {ReceiptErrors} from '@src/types/onyx/Transaction'; import type ChildrenProps from '@src/types/utils/ChildrenProps'; import {isEmptyObject} from '@src/types/utils/EmptyObject'; import MessagesRow from './MessagesRow'; @@ -26,7 +28,7 @@ type OfflineWithFeedbackProps = ChildrenProps & { shouldHideOnDelete?: boolean; /** The errors to display */ - errors?: OnyxCommon.Errors | null; + errors?: OnyxCommon.Errors | ReceiptErrors | null; /** Whether we should show the error messages */ shouldShowErrorMessages?: boolean; @@ -58,11 +60,6 @@ type OfflineWithFeedbackProps = ChildrenProps & { type StrikethroughProps = Partial & {style: Array}; -function omitBy(obj: Record | undefined | null, predicate: (value: T) => boolean) { - // eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/no-unused-vars - return Object.fromEntries(Object.entries(obj ?? {}).filter(([_, value]) => !predicate(value))); -} - function OfflineWithFeedback({ pendingAction, canDismissError = true, @@ -84,7 +81,8 @@ function OfflineWithFeedback({ const hasErrors = !isEmptyObject(errors ?? {}); // Some errors have a null message. This is used to apply opacity only and to avoid showing redundant messages. - const errorMessages = omitBy(errors, (e) => e === null); + const errorMessages = useMemo(() => removeErrorsWithNullMessage(errors), [errors]); + const hasErrorMessages = !isEmptyObject(errorMessages); const isOfflinePendingAction = !!isOffline && !!pendingAction; const isUpdateOrDeleteError = hasErrors && (pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE || pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE); diff --git a/src/components/ReportActionItem/MoneyRequestView.tsx b/src/components/ReportActionItem/MoneyRequestView.tsx index 760ed13d3831..7ebc33518d88 100644 --- a/src/components/ReportActionItem/MoneyRequestView.tsx +++ b/src/components/ReportActionItem/MoneyRequestView.tsx @@ -1,4 +1,4 @@ -import React, {useCallback} from 'react'; +import React, {useCallback, useMemo} from 'react'; import {View} from 'react-native'; import {withOnyx} from 'react-native-onyx'; import type {OnyxEntry} from 'react-native-onyx'; @@ -34,7 +34,8 @@ import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; import type * as OnyxTypes from '@src/types/onyx'; -import type {TransactionPendingFieldsKey} from '@src/types/onyx/Transaction'; +import type {Errors} from '@src/types/onyx/OnyxCommon'; +import type {ReceiptError, ReceiptErrors, TransactionPendingFieldsKey} from '@src/types/onyx/Transaction'; import ReportActionItemImage from './ReportActionItemImage'; type MoneyRequestViewTransactionOnyxProps = { @@ -198,6 +199,31 @@ function MoneyRequestView({ const pendingAction = transaction?.pendingAction; const getPendingFieldAction = (fieldPath: TransactionPendingFieldsKey) => transaction?.pendingFields?.[fieldPath] ?? pendingAction; + const errors: Errors | null = useMemo(() => { + if (!transaction) { + return null; + } + + const transactionErrors = transaction.errors; + + if (transactionErrors) { + const errorKeys = Object.keys(transactionErrors) as Array; + + if (typeof transactionErrors[errorKeys[0]] === 'string') { + // transactionErrors is of type "Errors" + return transactionErrors as Errors; + } + // transactionErrors is of type "ReceiptErrors" + return errorKeys.reduce((acc, key) => { + const receiptError: ReceiptError = (transactionErrors as ReceiptErrors)[key]; + acc[key] = receiptError.error ?? ''; + return acc; + }, {} as Errors); + } + + return null; + }, [transaction]); + return ( @@ -205,9 +231,12 @@ function MoneyRequestView({ {hasReceipt && ( { + if (!transaction) { + return; + } Transaction.clearError(transaction.transactionID); }} > diff --git a/src/libs/ErrorUtils.ts b/src/libs/ErrorUtils.ts index 2466a262b4b9..39ec7f5768de 100644 --- a/src/libs/ErrorUtils.ts +++ b/src/libs/ErrorUtils.ts @@ -2,6 +2,7 @@ import CONST from '@src/CONST'; import type {TranslationFlatObject, TranslationPaths} from '@src/languages/types'; import type {ErrorFields, Errors} from '@src/types/onyx/OnyxCommon'; import type Response from '@src/types/onyx/Response'; +import type {ReceiptErrors} from '@src/types/onyx/Transaction'; import DateUtils from './DateUtils'; import * as Localize from './Localize'; @@ -119,4 +120,22 @@ function addErrorMessage(errors: ErrorsList, inpu } } -export {getAuthenticateErrorMessage, getMicroSecondOnyxError, getMicroSecondOnyxErrorObject, getLatestErrorMessage, getLatestErrorField, getEarliestErrorField, addErrorMessage}; +function removeErrorsWithNullMessage(errors: Errors | ReceiptErrors | null | undefined) { + if (!errors) { + return errors; + } + const nonNullEntries = Object.entries(errors).filter(([, message]) => message !== null); + + return Object.fromEntries(nonNullEntries); +} + +export { + getAuthenticateErrorMessage, + getMicroSecondOnyxError, + getMicroSecondOnyxErrorObject, + getLatestErrorMessage, + getLatestErrorField, + getEarliestErrorField, + addErrorMessage, + removeErrorsWithNullMessage, +}; diff --git a/src/libs/Violations/ViolationsUtils.ts b/src/libs/Violations/ViolationsUtils.ts index 20c29b0fb208..de4b03720677 100644 --- a/src/libs/Violations/ViolationsUtils.ts +++ b/src/libs/Violations/ViolationsUtils.ts @@ -106,7 +106,7 @@ const ViolationsUtils = { surcharge = 0, invoiceMarkup = 0, maxAge = 0, - tagName = 'etiqueta', + tagName, taxName, } = violation.data ?? {}; diff --git a/src/types/onyx/Transaction.ts b/src/types/onyx/Transaction.ts index dc777267b78f..1724d6c27b2f 100644 --- a/src/types/onyx/Transaction.ts +++ b/src/types/onyx/Transaction.ts @@ -103,4 +103,4 @@ type Transaction = { }; export default Transaction; -export type {WaypointCollection, Comment, Receipt, Waypoint, ReceiptError, TransactionPendingFieldsKey}; +export type {WaypointCollection, Comment, Receipt, Waypoint, ReceiptError, ReceiptErrors, TransactionPendingFieldsKey}; From cfdfb2d610946e58322a09a4282b298ff5a65b7c Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Tue, 30 Jan 2024 19:17:51 -0500 Subject: [PATCH 082/288] feat(Violations): removed unused imports --- src/libs/OptionsListUtils.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/libs/OptionsListUtils.ts b/src/libs/OptionsListUtils.ts index 65a6293f3bab..3cf6785fcc0b 100644 --- a/src/libs/OptionsListUtils.ts +++ b/src/libs/OptionsListUtils.ts @@ -17,8 +17,6 @@ import type { PersonalDetailsList, Policy, PolicyCategories, - PolicyCategory, - PolicyTag, PolicyTags, Report, ReportAction, From 4075baaa6482639b2eb2c5e794d13c2a654f5488 Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Tue, 30 Jan 2024 19:18:53 -0500 Subject: [PATCH 083/288] feat(Violations): handle null case of OnyxEntry. --- src/libs/ReceiptUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/ReceiptUtils.ts b/src/libs/ReceiptUtils.ts index cbffb5b454b3..444b9b0f3954 100644 --- a/src/libs/ReceiptUtils.ts +++ b/src/libs/ReceiptUtils.ts @@ -37,7 +37,7 @@ function getThumbnailAndImageURIs(transaction: OnyxEntry, receiptPa } // URI to image, i.e. blob:new.expensify.com/9ef3a018-4067-47c6-b29f-5f1bd35f213d or expensify.com/receipts/w_e616108497ef940b7210ec6beb5a462d01a878f4.jpg // If there're errors, we need to display them in preview. We can store many files in errors, but we just need to get the last one - const errors = _.findLast(transaction.errors) as ReceiptError | undefined; + const errors = _.findLast(transaction?.errors) as ReceiptError | undefined; const path = errors?.source ?? transaction?.receipt?.source ?? receiptPath ?? ''; // filename of uploaded image or last part of remote URI const filename = errors?.filename ?? transaction?.filename ?? receiptFileName ?? ''; From 9f5e655ab101714b7a3c8ee4a8c1fbe5b6d3e242 Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Wed, 31 Jan 2024 13:45:52 -0500 Subject: [PATCH 084/288] nullishly coalesce --- src/libs/SidebarUtils.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/libs/SidebarUtils.ts b/src/libs/SidebarUtils.ts index c61c6d940a48..5c2a2b748da3 100644 --- a/src/libs/SidebarUtils.ts +++ b/src/libs/SidebarUtils.ts @@ -56,11 +56,7 @@ let currentUserAccountID: number | undefined; Onyx.connect({ key: ONYXKEYS.SESSION, callback: (session) => { - if (!session) { - return; - } - - currentUserAccountID = session.accountID; + currentUserAccountID = session?.accountID; }, }); From 1e8cff31160ef05ee63f43dcd60691681547f27e Mon Sep 17 00:00:00 2001 From: Filip Solecki Date: Thu, 1 Feb 2024 10:38:25 +0100 Subject: [PATCH 085/288] Fix typing for ValuePicker --- src/components/Form/types.ts | 5 +++-- .../ValuePicker/ValueSelectorModal.tsx | 16 +++------------- src/components/ValuePicker/index.tsx | 2 +- src/components/ValuePicker/types.ts | 8 +++----- src/pages/workspace/WorkspaceNewRoomPage.js | 9 ++++----- 5 files changed, 14 insertions(+), 26 deletions(-) diff --git a/src/components/Form/types.ts b/src/components/Form/types.ts index 447f3205ad68..7af027a5c0c7 100644 --- a/src/components/Form/types.ts +++ b/src/components/Form/types.ts @@ -6,6 +6,7 @@ import type CheckboxWithLabel from '@components/CheckboxWithLabel'; import type Picker from '@components/Picker'; import type SingleChoiceQuestion from '@components/SingleChoiceQuestion'; import type TextInput from '@components/TextInput'; +import type ValuePicker from '@components/ValuePicker'; import type {OnyxFormKey, OnyxValues} from '@src/ONYXKEYS'; import type Form from '@src/types/onyx/Form'; import type {BaseForm, FormValueType} from '@src/types/onyx/Form'; @@ -15,9 +16,9 @@ import type {BaseForm, FormValueType} from '@src/types/onyx/Form'; * when adding new inputs or removing old ones. * * TODO: Add remaining inputs here once these components are migrated to Typescript: - * CountrySelector | StatePicker | DatePicker | EmojiPickerButtonDropdown | RoomNameInput | ValuePicker + * CountrySelector | StatePicker | DatePicker | EmojiPickerButtonDropdown | RoomNameInput */ -type ValidInputs = typeof TextInput | typeof AmountTextInput | typeof SingleChoiceQuestion | typeof CheckboxWithLabel | typeof Picker | typeof AddressSearch; +type ValidInputs = typeof TextInput | typeof AmountTextInput | typeof SingleChoiceQuestion | typeof CheckboxWithLabel | typeof Picker | typeof AddressSearch | typeof ValuePicker; type ValueTypeKey = 'string' | 'boolean' | 'date'; diff --git a/src/components/ValuePicker/ValueSelectorModal.tsx b/src/components/ValuePicker/ValueSelectorModal.tsx index 98e276dcc9ec..18b601463d20 100644 --- a/src/components/ValuePicker/ValueSelectorModal.tsx +++ b/src/components/ValuePicker/ValueSelectorModal.tsx @@ -1,26 +1,16 @@ -import React, {useEffect, useState} from 'react'; +import React, {useMemo} from 'react'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; import Modal from '@components/Modal'; import ScreenWrapper from '@components/ScreenWrapper'; import SelectionList from '@components/SelectionList'; import useThemeStyles from '@hooks/useThemeStyles'; import CONST from '@src/CONST'; -import type {ValuePickerItem, ValueSelectorModalProps} from './types'; +import type {ValueSelectorModalProps} from './types'; function ValueSelectorModal({items = [], selectedItem, label = '', isVisible, onClose, onItemSelected, shouldShowTooltips = true}: ValueSelectorModalProps) { const styles = useThemeStyles(); - const [sectionsData, setSectionsData] = useState([]); - useEffect(() => { - const itemsData = items.map((item) => ({ - value: item?.value, - alternateText: item?.description, - keyForList: item.value ?? '', - text: item?.label ?? '', - isSelected: item === selectedItem, - })); - setSectionsData(itemsData); - }, [items, selectedItem]); + const sectionsData = useMemo(() => items.map((item) => ({...item, isSelected: item === selectedItem, keyForList: item.value ?? ''})), [items, selectedItem]); return ( _.map(PolicyUtils.getActivePolicies(props.policies), (policy) => ({ - label: policy.name, - key: policy.id, + text: policy.name, value: policy.id, })), [props.policies], @@ -222,7 +221,7 @@ function WorkspaceNewRoomPage(props) { () => _.map(CONST.REPORT.WRITE_CAPABILITIES, (value) => ({ value, - label: translate(`writeCapabilityPage.writeCapability.${value}`), + text: translate(`writeCapabilityPage.writeCapability.${value}`), })), [translate], ); @@ -232,9 +231,9 @@ function WorkspaceNewRoomPage(props) { _.map( _.filter(_.values(CONST.REPORT.VISIBILITY), (visibilityOption) => visibilityOption !== CONST.REPORT.VISIBILITY.PUBLIC_ANNOUNCE), (visibilityOption) => ({ - label: translate(`newRoomPage.visibilityOptions.${visibilityOption}`), + text: translate(`newRoomPage.visibilityOptions.${visibilityOption}`), value: visibilityOption, - description: translate(`newRoomPage.${visibilityOption}Description`), + alternateText: translate(`newRoomPage.${visibilityOption}Description`), }), ), [translate], From 8cd7fcd2b6fdfb8403d29c7a22427d3e8c6249f7 Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Thu, 1 Feb 2024 12:57:27 -0500 Subject: [PATCH 086/288] feat(Violations): move isReceiptError to ErrorUtils.ts --- src/components/DotIndicatorMessage.tsx | 17 ++--------------- .../ReportActionItem/MoneyRequestView.tsx | 14 +++++++++----- src/libs/ErrorUtils.ts | 17 ++++++++++++++++- 3 files changed, 27 insertions(+), 21 deletions(-) diff --git a/src/components/DotIndicatorMessage.tsx b/src/components/DotIndicatorMessage.tsx index ac4dcb4cd30a..81297c74f63f 100644 --- a/src/components/DotIndicatorMessage.tsx +++ b/src/components/DotIndicatorMessage.tsx @@ -5,9 +5,10 @@ import {View} from 'react-native'; import useStyleUtils from '@hooks/useStyleUtils'; import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; +import {isReceiptError} from '@libs/ErrorUtils'; import fileDownload from '@libs/fileDownload'; -import * as Localize from '@libs/Localize'; import type {MaybePhraseKey} from '@libs/Localize'; +import * as Localize from '@libs/Localize'; import CONST from '@src/CONST'; import type {ReceiptError} from '@src/types/onyx/Transaction'; import Icon from './Icon'; @@ -35,20 +36,6 @@ type DotIndicatorMessageProps = { textStyles?: StyleProp; }; -/** Check if the error includes a receipt. */ -function isReceiptError(message: unknown): message is ReceiptError { - if (typeof message === 'string') { - return false; - } - if (Array.isArray(message)) { - return false; - } - if (Object.keys(message as Record).length === 0) { - return false; - } - return ((message as Record)?.error ?? '') === CONST.IOU.RECEIPT_ERROR; -} - function DotIndicatorMessage({messages = {}, style, type, textStyles}: DotIndicatorMessageProps) { const theme = useTheme(); const styles = useThemeStyles(); diff --git a/src/components/ReportActionItem/MoneyRequestView.tsx b/src/components/ReportActionItem/MoneyRequestView.tsx index 7ebc33518d88..e935e1955ed3 100644 --- a/src/components/ReportActionItem/MoneyRequestView.tsx +++ b/src/components/ReportActionItem/MoneyRequestView.tsx @@ -20,6 +20,7 @@ import type {ViolationField} from '@hooks/useViolations'; import useWindowDimensions from '@hooks/useWindowDimensions'; import * as CardUtils from '@libs/CardUtils'; import * as CurrencyUtils from '@libs/CurrencyUtils'; +import {isReceiptError} from '@libs/ErrorUtils'; import Navigation from '@libs/Navigation/Navigation'; import * as OptionsListUtils from '@libs/OptionsListUtils'; import * as PolicyUtils from '@libs/PolicyUtils'; @@ -35,7 +36,7 @@ import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; import type * as OnyxTypes from '@src/types/onyx'; import type {Errors} from '@src/types/onyx/OnyxCommon'; -import type {ReceiptError, ReceiptErrors, TransactionPendingFieldsKey} from '@src/types/onyx/Transaction'; +import type {ReceiptErrors, TransactionPendingFieldsKey} from '@src/types/onyx/Transaction'; import ReportActionItemImage from './ReportActionItemImage'; type MoneyRequestViewTransactionOnyxProps = { @@ -207,15 +208,18 @@ function MoneyRequestView({ const transactionErrors = transaction.errors; if (transactionErrors) { - const errorKeys = Object.keys(transactionErrors) as Array; + const errorKeys = Object.keys(transactionErrors); - if (typeof transactionErrors[errorKeys[0]] === 'string') { - // transactionErrors is of type "Errors" + const firstError = transactionErrors[errorKeys[0]]; + + if (!isReceiptError(firstError) && typeof firstError === 'string') { + // transactionErrors is of type "Errors", but we need to assert it here + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion return transactionErrors as Errors; } // transactionErrors is of type "ReceiptErrors" return errorKeys.reduce((acc, key) => { - const receiptError: ReceiptError = (transactionErrors as ReceiptErrors)[key]; + const receiptError = (transactionErrors as ReceiptErrors)[key]; acc[key] = receiptError.error ?? ''; return acc; }, {} as Errors); diff --git a/src/libs/ErrorUtils.ts b/src/libs/ErrorUtils.ts index 39ec7f5768de..1152a60562b6 100644 --- a/src/libs/ErrorUtils.ts +++ b/src/libs/ErrorUtils.ts @@ -2,7 +2,7 @@ import CONST from '@src/CONST'; import type {TranslationFlatObject, TranslationPaths} from '@src/languages/types'; import type {ErrorFields, Errors} from '@src/types/onyx/OnyxCommon'; import type Response from '@src/types/onyx/Response'; -import type {ReceiptErrors} from '@src/types/onyx/Transaction'; +import type {ReceiptError, ReceiptErrors} from '@src/types/onyx/Transaction'; import DateUtils from './DateUtils'; import * as Localize from './Localize'; @@ -129,6 +129,20 @@ function removeErrorsWithNullMessage(errors: Errors | ReceiptErrors | null | und return Object.fromEntries(nonNullEntries); } +/** Check if the error includes a receipt. */ +function isReceiptError(message: unknown): message is ReceiptError { + if (typeof message === 'string') { + return false; + } + if (Array.isArray(message)) { + return false; + } + if (Object.keys(message as Record).length === 0) { + return false; + } + return ((message as Record)?.error ?? '') === CONST.IOU.RECEIPT_ERROR; +} + export { getAuthenticateErrorMessage, getMicroSecondOnyxError, @@ -138,4 +152,5 @@ export { getEarliestErrorField, addErrorMessage, removeErrorsWithNullMessage, + isReceiptError, }; From 7b77145ab4cbd131e9916b46ad9c936c429a4b8a Mon Sep 17 00:00:00 2001 From: Bartosz Grajdek Date: Sun, 4 Feb 2024 15:31:33 +0100 Subject: [PATCH 087/288] fix: typecheck --- src/pages/home/report/ReportActionItemFragment.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/home/report/ReportActionItemFragment.tsx b/src/pages/home/report/ReportActionItemFragment.tsx index 630b4b4dbad8..7c090ff309f2 100644 --- a/src/pages/home/report/ReportActionItemFragment.tsx +++ b/src/pages/home/report/ReportActionItemFragment.tsx @@ -51,7 +51,7 @@ type ReportActionItemFragmentProps = { isApprovedOrSubmittedReportAction?: boolean; /** Whether the report action type is 'UNHOLD' or 'HOLD'. Used to style messages related to hold requests */ - isHoldReportAction: boolean, + isHoldReportAction?: boolean, /** Used to format RTL display names in Old Dot system messages e.g. Arabic */ isFragmentContainingDisplayName?: boolean; From ee77f762c1f0a4d82ebd50e0728560fdb96ca08b Mon Sep 17 00:00:00 2001 From: Bartosz Grajdek Date: Sun, 4 Feb 2024 15:36:53 +0100 Subject: [PATCH 088/288] fix: lint --- src/components/MoneyRequestHeader.js | 2 +- src/pages/home/report/ReportActionItemFragment.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/MoneyRequestHeader.js b/src/components/MoneyRequestHeader.js index 1adc160959f9..cde70c1a0f2d 100644 --- a/src/components/MoneyRequestHeader.js +++ b/src/components/MoneyRequestHeader.js @@ -23,8 +23,8 @@ import HeaderWithBackButton from './HeaderWithBackButton'; import HoldBanner from './HoldBanner'; import * as Expensicons from './Icon/Expensicons'; import MoneyRequestHeaderStatusBar from './MoneyRequestHeaderStatusBar'; -import ProcessMoneyRequestHoldMenu from './ProcessMoneyRequestHoldMenu'; import {usePersonalDetails} from './OnyxProvider'; +import ProcessMoneyRequestHoldMenu from './ProcessMoneyRequestHoldMenu'; import transactionPropTypes from './transactionPropTypes'; const propTypes = { diff --git a/src/pages/home/report/ReportActionItemFragment.tsx b/src/pages/home/report/ReportActionItemFragment.tsx index 7c090ff309f2..e762f07cf20f 100644 --- a/src/pages/home/report/ReportActionItemFragment.tsx +++ b/src/pages/home/report/ReportActionItemFragment.tsx @@ -51,7 +51,7 @@ type ReportActionItemFragmentProps = { isApprovedOrSubmittedReportAction?: boolean; /** Whether the report action type is 'UNHOLD' or 'HOLD'. Used to style messages related to hold requests */ - isHoldReportAction?: boolean, + isHoldReportAction?: boolean; /** Used to format RTL display names in Old Dot system messages e.g. Arabic */ isFragmentContainingDisplayName?: boolean; From 287a7a18b2757d36cdc03982b3ebeb346d8dbe32 Mon Sep 17 00:00:00 2001 From: Bartosz Grajdek Date: Sun, 4 Feb 2024 15:46:51 +0100 Subject: [PATCH 089/288] refactor: form types --- src/ONYXKEYS.ts | 2 ++ src/pages/iou/HoldReasonPage.tsx | 14 +++++--------- src/types/onyx/Form.ts | 5 +++++ src/types/onyx/index.ts | 2 ++ 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/ONYXKEYS.ts b/src/ONYXKEYS.ts index 4fa439b743c6..4b767808f0ea 100755 --- a/src/ONYXKEYS.ts +++ b/src/ONYXKEYS.ts @@ -342,6 +342,7 @@ const ONYXKEYS = { MONEY_REQUEST_AMOUNT_FORM_DRAFT: 'moneyRequestAmountFormDraft', MONEY_REQUEST_DATE_FORM: 'moneyRequestCreatedForm', MONEY_REQUEST_DATE_FORM_DRAFT: 'moneyRequestCreatedFormDraft', + MONEY_REQUEST_HOLD: 'moneyHoldReasonForm', NEW_CONTACT_METHOD_FORM: 'newContactMethodForm', NEW_CONTACT_METHOD_FORM_DRAFT: 'newContactMethodFormDraft', WAYPOINT_FORM: 'waypointForm', @@ -531,6 +532,7 @@ type OnyxValues = { [ONYXKEYS.FORMS.MONEY_REQUEST_AMOUNT_FORM_DRAFT]: OnyxTypes.Form; [ONYXKEYS.FORMS.MONEY_REQUEST_DATE_FORM]: OnyxTypes.Form; [ONYXKEYS.FORMS.MONEY_REQUEST_DATE_FORM_DRAFT]: OnyxTypes.Form; + [ONYXKEYS.FORMS.MONEY_REQUEST_HOLD]: OnyxTypes.MoneyRequestHoldReasonForm; [ONYXKEYS.FORMS.NEW_CONTACT_METHOD_FORM]: OnyxTypes.Form; [ONYXKEYS.FORMS.NEW_CONTACT_METHOD_FORM_DRAFT]: OnyxTypes.Form; [ONYXKEYS.FORMS.WAYPOINT_FORM]: OnyxTypes.Form; diff --git a/src/pages/iou/HoldReasonPage.tsx b/src/pages/iou/HoldReasonPage.tsx index 035b1b98be90..6f7060b58c88 100644 --- a/src/pages/iou/HoldReasonPage.tsx +++ b/src/pages/iou/HoldReasonPage.tsx @@ -12,8 +12,9 @@ import useThemeStyles from '@hooks/useThemeStyles'; import Navigation from '@libs/Navigation/Navigation'; import * as ValidationUtils from '@libs/ValidationUtils'; import * as IOU from '@userActions/IOU'; -import CONST from '@src/CONST'; import type {Route} from '@src/ROUTES'; +import type {OnyxFormValuesFields} from "@components/Form/types"; +import type ONYXKEYS from "@src/ONYXKEYS"; type HoldReasonPageRouteParams = { /** ID of the transaction the page was opened for */ @@ -31,8 +32,6 @@ type HoldReasonPageProps = { route: RouteProp<{params: HoldReasonPageRouteParams}>; }; -type FormValues = {comment: string}; - function HoldReasonPage({route}: HoldReasonPageProps) { const styles = useThemeStyles(); const {translate} = useLocalize(); @@ -43,12 +42,12 @@ function HoldReasonPage({route}: HoldReasonPageProps) { Navigation.navigate(backTo); }; - const onSubmit = (values: FormValues) => { + const onSubmit = (values: OnyxFormValuesFields) => { IOU.putOnHold(transactionID, values.comment, reportID); navigateBack(); }; - const validate = useCallback((values: FormValues) => { + const validate = useCallback((values: OnyxFormValuesFields) => { const requiredFields = ['comment']; const errors = ValidationUtils.getFieldRequiredErrors(values, requiredFields); @@ -69,9 +68,8 @@ function HoldReasonPage({route}: HoldReasonPageProps) { title={translate('iou.holdRequest')} onBackButtonPress={navigateBack} /> - {/** @ts-expect-error TODO: Remove this once FormProvider (https://github.com/Expensify/App/issues/31972) is migrated to TypeScript. */} {translate('iou.explainHold')} diff --git a/src/types/onyx/Form.ts b/src/types/onyx/Form.ts index 48f386afcbb0..91402aab1e5e 100644 --- a/src/types/onyx/Form.ts +++ b/src/types/onyx/Form.ts @@ -31,6 +31,10 @@ type DisplayNameForm = Form<{ lastName: string; }>; +type MoneyRequestHoldReasonForm = Form<{ + comment: string; +}>; + type NewRoomForm = Form<{ roomName?: string; welcomeMessage?: string; @@ -76,6 +80,7 @@ export type { PrivateNotesForm, DisplayNameForm, FormValueType, + MoneyRequestHoldReasonForm, NewRoomForm, BaseForm, IKnowATeacherForm, diff --git a/src/types/onyx/index.ts b/src/types/onyx/index.ts index d0ac2ce395fa..1f6c10a2ba0a 100644 --- a/src/types/onyx/index.ts +++ b/src/types/onyx/index.ts @@ -16,6 +16,7 @@ import type { DisplayNameForm, IKnowATeacherForm, IntroSchoolPrincipalForm, + MoneyRequestHoldReasonForm, NewRoomForm, PrivateNotesForm, ReportFieldEditForm, @@ -107,6 +108,7 @@ export type { LoginList, MapboxAccessToken, Modal, + MoneyRequestHoldReasonForm, Network, OnyxUpdateEvent, OnyxUpdatesFromServer, From cb658e97916a21face7eb80a75cedb727fcc9177 Mon Sep 17 00:00:00 2001 From: Bartosz Grajdek Date: Sun, 4 Feb 2024 15:47:26 +0100 Subject: [PATCH 090/288] fix: lint --- src/pages/iou/HoldReasonPage.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/iou/HoldReasonPage.tsx b/src/pages/iou/HoldReasonPage.tsx index 6f7060b58c88..611b7235e7e5 100644 --- a/src/pages/iou/HoldReasonPage.tsx +++ b/src/pages/iou/HoldReasonPage.tsx @@ -3,6 +3,7 @@ import React, {useCallback} from 'react'; import {View} from 'react-native'; import FormProvider from '@components/Form/FormProvider'; import InputWrapper from '@components/Form/InputWrapper'; +import type {OnyxFormValuesFields} from '@components/Form/types'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; import ScreenWrapper from '@components/ScreenWrapper'; import Text from '@components/Text'; @@ -12,9 +13,8 @@ import useThemeStyles from '@hooks/useThemeStyles'; import Navigation from '@libs/Navigation/Navigation'; import * as ValidationUtils from '@libs/ValidationUtils'; import * as IOU from '@userActions/IOU'; +import type ONYXKEYS from '@src/ONYXKEYS'; import type {Route} from '@src/ROUTES'; -import type {OnyxFormValuesFields} from "@components/Form/types"; -import type ONYXKEYS from "@src/ONYXKEYS"; type HoldReasonPageRouteParams = { /** ID of the transaction the page was opened for */ From aad73997cae3cfb2460bfd4810e91a444a3a5b56 Mon Sep 17 00:00:00 2001 From: Bartosz Grajdek Date: Sun, 4 Feb 2024 15:52:54 +0100 Subject: [PATCH 091/288] fix: FormActions typecheck --- src/ONYXKEYS.ts | 6 ++++-- src/pages/iou/HoldReasonPage.tsx | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/ONYXKEYS.ts b/src/ONYXKEYS.ts index 4b767808f0ea..ec90f611c676 100755 --- a/src/ONYXKEYS.ts +++ b/src/ONYXKEYS.ts @@ -342,7 +342,8 @@ const ONYXKEYS = { MONEY_REQUEST_AMOUNT_FORM_DRAFT: 'moneyRequestAmountFormDraft', MONEY_REQUEST_DATE_FORM: 'moneyRequestCreatedForm', MONEY_REQUEST_DATE_FORM_DRAFT: 'moneyRequestCreatedFormDraft', - MONEY_REQUEST_HOLD: 'moneyHoldReasonForm', + MONEY_REQUEST_HOLD_FORM: 'moneyHoldReasonForm', + MONEY_REQUEST_HOLD_FORM_DRAFT: 'moneyHoldReasonFormDraft', NEW_CONTACT_METHOD_FORM: 'newContactMethodForm', NEW_CONTACT_METHOD_FORM_DRAFT: 'newContactMethodFormDraft', WAYPOINT_FORM: 'waypointForm', @@ -532,7 +533,8 @@ type OnyxValues = { [ONYXKEYS.FORMS.MONEY_REQUEST_AMOUNT_FORM_DRAFT]: OnyxTypes.Form; [ONYXKEYS.FORMS.MONEY_REQUEST_DATE_FORM]: OnyxTypes.Form; [ONYXKEYS.FORMS.MONEY_REQUEST_DATE_FORM_DRAFT]: OnyxTypes.Form; - [ONYXKEYS.FORMS.MONEY_REQUEST_HOLD]: OnyxTypes.MoneyRequestHoldReasonForm; + [ONYXKEYS.FORMS.MONEY_REQUEST_HOLD_FORM]: OnyxTypes.MoneyRequestHoldReasonForm; + [ONYXKEYS.FORMS.MONEY_REQUEST_HOLD_FORM_DRAFT]: OnyxTypes.MoneyRequestHoldReasonForm; [ONYXKEYS.FORMS.NEW_CONTACT_METHOD_FORM]: OnyxTypes.Form; [ONYXKEYS.FORMS.NEW_CONTACT_METHOD_FORM_DRAFT]: OnyxTypes.Form; [ONYXKEYS.FORMS.WAYPOINT_FORM]: OnyxTypes.Form; diff --git a/src/pages/iou/HoldReasonPage.tsx b/src/pages/iou/HoldReasonPage.tsx index 611b7235e7e5..6caea59202b2 100644 --- a/src/pages/iou/HoldReasonPage.tsx +++ b/src/pages/iou/HoldReasonPage.tsx @@ -42,12 +42,12 @@ function HoldReasonPage({route}: HoldReasonPageProps) { Navigation.navigate(backTo); }; - const onSubmit = (values: OnyxFormValuesFields) => { + const onSubmit = (values: OnyxFormValuesFields) => { IOU.putOnHold(transactionID, values.comment, reportID); navigateBack(); }; - const validate = useCallback((values: OnyxFormValuesFields) => { + const validate = useCallback((values: OnyxFormValuesFields) => { const requiredFields = ['comment']; const errors = ValidationUtils.getFieldRequiredErrors(values, requiredFields); From 6a3b8daf009b857d4782c87dce8fb26a5f2a452f Mon Sep 17 00:00:00 2001 From: Bartosz Grajdek Date: Mon, 5 Feb 2024 00:29:43 +0100 Subject: [PATCH 092/288] refactor: change names & make remove unnecessary conditions --- src/components/Header.tsx | 7 ++----- src/components/MoneyRequestHeader.js | 16 ++++++++-------- src/libs/ReportUtils.ts | 18 ------------------ src/libs/actions/IOU.js | 9 +-------- 4 files changed, 11 insertions(+), 39 deletions(-) diff --git a/src/components/Header.tsx b/src/components/Header.tsx index 315583a3311a..c21e8606553f 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -18,15 +18,12 @@ type HeaderProps = { /** Additional text styles */ textStyles?: StyleProp; - - /** Additional text styles */ - containerStyles?: StyleProp; }; -function Header({title = '', subtitle = '', textStyles = [], containerStyles = [], shouldShowEnvironmentBadge = false}: HeaderProps) { +function Header({title = '', subtitle = '', textStyles = [], shouldShowEnvironmentBadge = false}: HeaderProps) { const styles = useThemeStyles(); return ( - + {typeof title === 'string' ? Boolean(title) && ( diff --git a/src/components/MoneyRequestHeader.js b/src/components/MoneyRequestHeader.js index cde70c1a0f2d..dc2838a891c6 100644 --- a/src/components/MoneyRequestHeader.js +++ b/src/components/MoneyRequestHeader.js @@ -72,6 +72,7 @@ function MoneyRequestHeader({session, parentReport, report, parentReportAction, const styles = useThemeStyles(); const {translate} = useLocalize(); const [isDeleteModalVisible, setIsDeleteModalVisible] = useState(false); + const [shouldShowHoldMenu, setShouldShowHoldMenu] = useState(false); const moneyRequestReport = parentReport; const isSettled = ReportUtils.isSettled(moneyRequestReport.reportID); const isApproved = ReportUtils.isReportApproved(moneyRequestReport); @@ -95,7 +96,9 @@ function MoneyRequestHeader({session, parentReport, report, parentReportAction, const canModifyRequest = isActionOwner && isRequestModifiable; const changeMoneyRequestStatus = () => { - if (!isOnHold) { + if (isOnHold) { + IOU.unholdRequest(lodashGet(parentReportAction, 'originalMessage.IOUTransactionID'), lodashGet(report, 'reportID')); + } else { const activeRoute = encodeURIComponent(Navigation.getActiveRouteWithoutParams()); Navigation.navigate( ROUTES.MONEY_REQUEST_HOLD_REASON.getRoute( @@ -105,8 +108,6 @@ function MoneyRequestHeader({session, parentReport, report, parentReportAction, activeRoute, ), ); - } else { - IOU.unholdRequest(lodashGet(parentReportAction, 'originalMessage.IOUTransactionID'), lodashGet(report, 'reportID')); } }; @@ -120,16 +121,17 @@ function MoneyRequestHeader({session, parentReport, report, parentReportAction, const threeDotsMenuItems = [HeaderUtils.getPinMenuItem(report)]; if (isRequestModifiable) { - const isHoldCreator = ReportUtils.isHoldCreator(transaction, lodashGet(report, 'reportID')); const isRequestIOU = lodashGet(parentReport, 'type') === 'iou'; - if (isOnHold && ((isRequestIOU && isHoldCreator) || (!isRequestIOU && (isPolicyAdmin || isActionOwner || isApprover)))) { + const isHoldCreator = ReportUtils.isHoldCreator(transaction, lodashGet(report, 'reportID')) && isRequestIOU; + const canModifyStatus = isPolicyAdmin || isActionOwner || isApprover; + if (isOnHold && (isHoldCreator || canModifyStatus)) { threeDotsMenuItems.push({ icon: Expensicons.Stopwatch, text: translate('iou.unholdRequest'), onSelected: () => changeMoneyRequestStatus(), }); } - if (!isOnHold && (isRequestIOU || isPolicyAdmin || isActionOwner || isApprover)) { + if (!isOnHold && (isRequestIOU || canModifyStatus)) { threeDotsMenuItems.push({ icon: Expensicons.Stopwatch, text: translate('iou.holdRequest'), @@ -138,8 +140,6 @@ function MoneyRequestHeader({session, parentReport, report, parentReportAction, } } - const [shouldShowHoldMenu, setShouldShowHoldMenu] = useState(false); - useEffect(() => { setShouldShowHoldMenu(isOnHold && !shownHoldUseExplaination); }, [isOnHold, shownHoldUseExplaination]); diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 0651466792c3..848564ae7125 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -4713,22 +4713,6 @@ function isHoldCreator(transaction: Transaction, reportID: string): boolean { return isActionCreator(holdReportAction); } -/** - * Check if Report has any held expenses - */ -function hasHeldExpenses(iouReportID: string): boolean { - const transactions = TransactionUtils.getAllReportTransactions(iouReportID); - return transactions.some((transaction) => TransactionUtils.isOnHold(transaction)); -} - -/** - * Check if all expenses in the Report are on hold - */ -function hasOnlyHeldExpenses(iouReportID: string): boolean { - const transactions = TransactionUtils.getAllReportTransactions(iouReportID); - return !transactions.some((transaction) => !TransactionUtils.isOnHold(transaction)); -} - /** * Checks if thread replies should be displayed */ @@ -5026,8 +5010,6 @@ export { navigateToPrivateNotes, canEditWriteCapability, isHoldCreator, - hasHeldExpenses, - hasOnlyHeldExpenses, hasSmartscanError, shouldAutoFocusOnKeyPress, buildOptimisticHoldReportAction, diff --git a/src/libs/actions/IOU.js b/src/libs/actions/IOU.js index ef5a5a18e8b6..c3bf8dc44839 100644 --- a/src/libs/actions/IOU.js +++ b/src/libs/actions/IOU.js @@ -3760,10 +3760,7 @@ function getIOUReportID(iou, route) { * @param {string} reportID */ function putOnHold(transactionID, comment, reportID) { - const createdDate = new Date(); - const createdReportAction = ReportUtils.buildOptimisticHoldReportAction(comment, DateUtils.getDBTime(createdDate)); - const transaction = allTransactions[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`]; - const transactionDetails = ReportUtils.getTransactionDetails(transaction); + const createdReportAction = ReportUtils.buildOptimisticHoldReportAction(comment); const optimisticData = [ { @@ -3809,7 +3806,6 @@ function putOnHold(transactionID, comment, reportID) { API.write( 'HoldRequest', { - ...transactionDetails, transactionID, comment, }, @@ -3824,8 +3820,6 @@ function putOnHold(transactionID, comment, reportID) { */ function unholdRequest(transactionID, reportID) { const createdReportAction = ReportUtils.buildOptimisticUnHoldReportAction(); - const transaction = allTransactions[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`]; - const transactionDetails = ReportUtils.getTransactionDetails(transaction); const optimisticData = [ { @@ -3868,7 +3862,6 @@ function unholdRequest(transactionID, reportID) { API.write( 'UnHoldRequest', { - ...transactionDetails, transactionID, }, {optimisticData, successData, failureData: []}, From f42c90d0a4826c9f7a4be0bd270334a685952b0b Mon Sep 17 00:00:00 2001 From: Bartosz Grajdek Date: Mon, 5 Feb 2024 00:41:16 +0100 Subject: [PATCH 093/288] fix: lint --- src/components/Header.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Header.tsx b/src/components/Header.tsx index c21e8606553f..25532107016f 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -1,6 +1,6 @@ import type {ReactNode} from 'react'; import React from 'react'; -import type {StyleProp, TextStyle, ViewStyle} from 'react-native'; +import type {StyleProp, TextStyle} from 'react-native'; import {View} from 'react-native'; import useThemeStyles from '@hooks/useThemeStyles'; import EnvironmentBadge from './EnvironmentBadge'; From 72dee1d56db92fa67da0fabd852453fc645687a3 Mon Sep 17 00:00:00 2001 From: dukenv0307 Date: Mon, 5 Feb 2024 11:07:15 +0700 Subject: [PATCH 094/288] Add policy avatar --- src/libs/ReportUtils.ts | 9 ++++++--- src/pages/home/ReportScreen.js | 2 ++ src/types/onyx/Report.ts | 3 +++ 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 568ce49ff961..ad9fd58ae5d1 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -1458,9 +1458,11 @@ function getIconsForParticipants(participants: number[], personalDetails: OnyxCo */ function getWorkspaceIcon(report: OnyxEntry, policy: OnyxEntry = null): Icon { const workspaceName = getPolicyName(report, false, policy); - const policyExpenseChatAvatarSource = allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${report?.policyID}`]?.avatar - ? allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${report?.policyID}`]?.avatar - : getDefaultWorkspaceAvatar(workspaceName); + // disabling to protect against empty strings + // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing + const policyAvatarURL = report?.policyAvatar || allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${report?.policyID}`]?.avatar; + // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing + const policyExpenseChatAvatarSource = policyAvatarURL || getDefaultWorkspaceAvatar(workspaceName); const workspaceIcon: Icon = { source: policyExpenseChatAvatarSource ?? '', @@ -1553,6 +1555,7 @@ function getIcons( return [domainIcon]; } if (isAdminRoom(report) || isAnnounceRoom(report) || isChatRoom(report) || isArchivedRoom(report)) { + console.log('run in here'); const workspaceIcon = getWorkspaceIcon(report, policy); return [workspaceIcon]; } diff --git a/src/pages/home/ReportScreen.js b/src/pages/home/ReportScreen.js index bfe27910c943..d903bc10bbf7 100644 --- a/src/pages/home/ReportScreen.js +++ b/src/pages/home/ReportScreen.js @@ -205,6 +205,7 @@ function ReportScreen({ visibility: reportProp.visibility, oldPolicyName: reportProp.oldPolicyName, policyName: reportProp.policyName, + policyAvatar: reportProp.policyAvatar, isOptimisticReport: reportProp.isOptimisticReport, }), [ @@ -241,6 +242,7 @@ function ReportScreen({ reportProp.visibility, reportProp.oldPolicyName, reportProp.policyName, + reportProp.policyAvatar, reportProp.isOptimisticReport, ], ); diff --git a/src/types/onyx/Report.ts b/src/types/onyx/Report.ts index d26bdd4f282e..f7493480273a 100644 --- a/src/types/onyx/Report.ts +++ b/src/types/onyx/Report.ts @@ -64,6 +64,9 @@ type Report = { /** The current user's notification preference for this report */ notificationPreference?: NotificationPreference; + /** The policy avatar to use, if any */ + policyAvatar?: string | null; + /** The policy name to use */ policyName?: string | null; From 1e3e91e0c2bd882ceb5d605ce5743cd0c6a7c212 Mon Sep 17 00:00:00 2001 From: dukenv0307 Date: Mon, 5 Feb 2024 11:09:12 +0700 Subject: [PATCH 095/288] fix lint --- src/libs/ReportUtils.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index ad9fd58ae5d1..cb806fa43620 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -1555,7 +1555,6 @@ function getIcons( return [domainIcon]; } if (isAdminRoom(report) || isAnnounceRoom(report) || isChatRoom(report) || isArchivedRoom(report)) { - console.log('run in here'); const workspaceIcon = getWorkspaceIcon(report, policy); return [workspaceIcon]; } From 2cb572ae9ffa5572541d7a6a6eadf896b68a5c57 Mon Sep 17 00:00:00 2001 From: Bartosz Grajdek Date: Mon, 5 Feb 2024 12:29:04 +0100 Subject: [PATCH 096/288] fix: add prop comment --- src/components/MoneyRequestHeader.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/MoneyRequestHeader.js b/src/components/MoneyRequestHeader.js index dc2838a891c6..2527ae40db2c 100644 --- a/src/components/MoneyRequestHeader.js +++ b/src/components/MoneyRequestHeader.js @@ -53,6 +53,7 @@ const propTypes = { /** All the data for the transaction */ transaction: transactionPropTypes, + /** Whether we should show the Hold Interstitial explaining the feature */ shownHoldUseExplaination: PropTypes.bool, }; From 73b15d0c8110140d68205904689803edc922839d Mon Sep 17 00:00:00 2001 From: hkopser99 <144170694+hkopser99@users.noreply.github.com> Date: Mon, 5 Feb 2024 22:52:41 +0100 Subject: [PATCH 097/288] TS Migration #25175: Update and rename AppDownloadLinks.js to AppDownloadLinks.tsx Updates related to Typescript Migration #25175. -Migrated component to Typescript -Extended MenuItemProps type as DownloadMenuItem type -Typed menu items as an array of DownloadMenuItems -Removed withWindowDimensions/withLocalize PropTypes and compose() from export per guidelines on migration -Used Hooks for localize instead for translation -Removed _ in JSX mapping of menu items. Saw other TSX files that removes and I was getting ESLint warnings. _ is noted as a best practice but given other TSX files have removed I followed suit. I also saw old ESlint ignores being used when removing _ but I didn't get flagged without this. -Removed onKeyDown attribute and blur() from MenuItem. I saw this nowhere else in the codebase and the removal had no impact on app use functionality (please advise if there's something I am missing but it appeared antiquated) -This component receives props from Navigation but I do not see elsewhere in the codebase that we are explicitly listing these as props via typescript (navigation props should inherintly apply to all pages) -TS warnings made me list translationKey as type TranslationPaths (warning only appears when not providing the translate from useLocalize() with a '' - others working on TS migrations may want to know this) -No ESlint warnings -No VSCode warnings or errors -No errors when testing -Only issue was on iOS simulator there's no App Store app so it doesn't know how to handle the download iOS click but the link is fine and it works everywhere else. -No other components or other files in codebase import this file so change from .js to .tsx should not require changes to imports anywhere. This component is routed to via its name as with other pages in codebase. --- ...pDownloadLinks.js => AppDownloadLinks.tsx} | 82 +++++++++---------- 1 file changed, 41 insertions(+), 41 deletions(-) rename src/pages/settings/{AppDownloadLinks.js => AppDownloadLinks.tsx} (58%) diff --git a/src/pages/settings/AppDownloadLinks.js b/src/pages/settings/AppDownloadLinks.tsx similarity index 58% rename from src/pages/settings/AppDownloadLinks.js rename to src/pages/settings/AppDownloadLinks.tsx index 522e15d8e9a8..f5932250cad9 100644 --- a/src/pages/settings/AppDownloadLinks.js +++ b/src/pages/settings/AppDownloadLinks.tsx @@ -1,87 +1,87 @@ -import React from 'react'; +import React, {useRef} from 'react'; import {ScrollView} from 'react-native'; -import _ from 'underscore'; +import useLocalize from '@hooks/useLocalize'; +import useThemeStyles from '@hooks/useThemeStyles'; +import Navigation from '@libs/Navigation/Navigation'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; import * as Expensicons from '@components/Icon/Expensicons'; import MenuItem from '@components/MenuItem'; import ScreenWrapper from '@components/ScreenWrapper'; -import withLocalize, {withLocalizePropTypes} from '@components/withLocalize'; -import withWindowDimensions, {windowDimensionsPropTypes} from '@components/withWindowDimensions'; -import useThemeStyles from '@hooks/useThemeStyles'; -import compose from '@libs/compose'; -import Navigation from '@libs/Navigation/Navigation'; import * as ReportActionContextMenu from '@pages/home/report/ContextMenu/ReportActionContextMenu'; import * as Link from '@userActions/Link'; +import type { View } from 'react-native'; +import type { TranslationPaths } from '@src/languages/types'; +import type { MenuItemProps } from '@components/MenuItem'; import CONST from '@src/CONST'; +import ROUTES from '@src/ROUTES'; -const propTypes = { - ...withLocalizePropTypes, - ...windowDimensionsPropTypes, -}; - -function AppDownloadLinksPage(props) { +function AppDownloadLinksPage() { const styles = useThemeStyles(); - let popoverAnchor; + const { translate } = useLocalize(); + const popoverAnchor = useRef(null); - const menuItems = [ + type DownloadMenuItem = MenuItemProps & { + translationKey: TranslationPaths, + openAppDownloadLink: () => void, + downloadLink: string, + }; + + const menuItems: DownloadMenuItem[] = [ { translationKey: 'initialSettingsPage.appDownloadLinks.android.label', - icon: Expensicons.Android, - iconRight: Expensicons.NewWindow, - action: () => { + openAppDownloadLink: () => { Link.openExternalLink(CONST.APP_DOWNLOAD_LINKS.ANDROID); }, - link: CONST.APP_DOWNLOAD_LINKS.ANDROID, + downloadLink: CONST.APP_DOWNLOAD_LINKS.ANDROID, + icon: Expensicons.Android, + iconRight: Expensicons.NewWindow, }, { translationKey: 'initialSettingsPage.appDownloadLinks.ios.label', - icon: Expensicons.Apple, - iconRight: Expensicons.NewWindow, - action: () => { + openAppDownloadLink: () => { Link.openExternalLink(CONST.APP_DOWNLOAD_LINKS.IOS, true); }, - link: CONST.APP_DOWNLOAD_LINKS.IOS, + downloadLink: CONST.APP_DOWNLOAD_LINKS.IOS, + icon: Expensicons.Apple, + iconRight: Expensicons.NewWindow, }, { translationKey: 'initialSettingsPage.appDownloadLinks.desktop.label', - icon: Expensicons.Monitor, - iconRight: Expensicons.NewWindow, - action: () => { + openAppDownloadLink: () => { Link.openExternalLink(CONST.APP_DOWNLOAD_LINKS.DESKTOP); }, - link: CONST.APP_DOWNLOAD_LINKS.DESKTOP, + downloadLink: CONST.APP_DOWNLOAD_LINKS.DESKTOP, + icon: Expensicons.Monitor, + iconRight: Expensicons.NewWindow, }, ]; return ( Navigation.goBack()} + title={translate('initialSettingsPage.aboutPage.appDownloadLinks')} + onBackButtonPress={() => Navigation.goBack(ROUTES.SETTINGS_ABOUT)} /> - {_.map(menuItems, (item) => ( + {menuItems.map((item: DownloadMenuItem) => ( item.action()} - onSecondaryInteraction={(e) => ReportActionContextMenu.showContextMenu(CONST.CONTEXT_MENU_TYPES.LINK, e, item.link, popoverAnchor)} - onKeyDown={(event) => { - event.target.blur(); - }} - ref={(el) => (popoverAnchor = el)} - title={props.translate(item.translationKey)} + onPress={item.openAppDownloadLink} + onSecondaryInteraction={(e) => ReportActionContextMenu.showContextMenu(CONST.CONTEXT_MENU_TYPES.LINK, e, item.downloadLink, popoverAnchor.current)} + ref={popoverAnchor} + title={translate(item.translationKey)} icon={item.icon} - iconRight={item.iconRight} + iconRight={item.iconRight} shouldBlockSelection shouldShowRightIcon - /> + /> ))} ); } -AppDownloadLinksPage.propTypes = propTypes; AppDownloadLinksPage.displayName = 'AppDownloadLinksPage'; -export default compose(withWindowDimensions, withLocalize)(AppDownloadLinksPage); +export default AppDownloadLinksPage; + From a6ffc90c3eeb0a52be530572ab268427b84d2afe Mon Sep 17 00:00:00 2001 From: dukenv0307 Date: Tue, 6 Feb 2024 14:55:30 +0700 Subject: [PATCH 098/288] update total amount when offline and change currency --- .../ReportActionItem/MoneyRequestAction.tsx | 2 +- src/libs/IOUUtils.ts | 4 +- src/libs/actions/IOU.ts | 49 +++++++++++-------- 3 files changed, 31 insertions(+), 24 deletions(-) diff --git a/src/components/ReportActionItem/MoneyRequestAction.tsx b/src/components/ReportActionItem/MoneyRequestAction.tsx index ff29bf5b0ee8..35314a4dad11 100644 --- a/src/components/ReportActionItem/MoneyRequestAction.tsx +++ b/src/components/ReportActionItem/MoneyRequestAction.tsx @@ -93,7 +93,7 @@ function MoneyRequestAction({ // If the childReportID is not present, we need to create a new thread const childReportID = action?.childReportID ?? '0'; - if (!childReportID) { + if (!Number(childReportID)) { const thread = ReportUtils.buildTransactionThread(action, requestReportID); const userLogins = PersonalDetailsUtils.getLoginsByAccountIDs(thread.participantAccountIDs ?? []); Report.openReport(thread.reportID, userLogins, thread, action.reportActionID); diff --git a/src/libs/IOUUtils.ts b/src/libs/IOUUtils.ts index d70f4fc08102..eaca60414b3a 100644 --- a/src/libs/IOUUtils.ts +++ b/src/libs/IOUUtils.ts @@ -55,10 +55,10 @@ function calculateAmount(numberOfParticipants: number, total: number, currency: * @param isDeleting - whether the user is deleting the request */ function updateIOUOwnerAndTotal>(iouReport: TReport, actorAccountID: number, amount: number, currency: string, isDeleting = false): TReport { - if (currency !== iouReport?.currency) { + if(!iouReport?.currency){ return iouReport; } - + // Make a copy so we don't mutate the original object const iouReportUpdate = {...iouReport}; diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index 569b6b26b728..297f1096b0ca 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -1053,28 +1053,35 @@ function getUpdateMoneyRequestParams( // Should only update if the transaction matches the currency of the report, else we wait for the update // from the server with the currency conversion let updatedMoneyRequestReport = {...iouReport}; - if (updatedTransaction?.currency === iouReport?.currency && updatedTransaction?.modifiedAmount) { - const diff = TransactionUtils.getAmount(transaction, true) - TransactionUtils.getAmount(updatedTransaction, true); - if (ReportUtils.isExpenseReport(iouReport) && typeof updatedMoneyRequestReport.total === 'number') { - updatedMoneyRequestReport.total += diff; - } else { - updatedMoneyRequestReport = iouReport - ? IOUUtils.updateIOUOwnerAndTotal(iouReport, updatedReportAction.actorAccountID ?? -1, diff, TransactionUtils.getCurrency(transaction), false) - : {}; - } - - updatedMoneyRequestReport.cachedTotal = CurrencyUtils.convertToDisplayString(updatedMoneyRequestReport.total, updatedTransaction.currency); - optimisticData.push({ - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT}${iouReport?.reportID}`, - value: updatedMoneyRequestReport, - }); - successData.push({ - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT}${iouReport?.reportID}`, - value: {pendingAction: null}, - }); + let diff = 0; + const isExpenseReport = ReportUtils.isExpenseReport(iouReport); + const updatedCurrency = TransactionUtils.getCurrency(updatedTransaction); + const currentCurrency = TransactionUtils.getCurrency(transaction); + if (updatedCurrency === iouReport?.currency && currentCurrency !== iouReport?.currency) { + diff = TransactionUtils.getAmount(updatedTransaction, isExpenseReport); + } else if (updatedCurrency !== iouReport?.currency && currentCurrency === iouReport?.currency) { + diff = -TransactionUtils.getAmount(updatedTransaction, isExpenseReport); + } else if (updatedCurrency === iouReport?.currency && updatedTransaction?.modifiedAmount) { + diff = TransactionUtils.getAmount(updatedTransaction, isExpenseReport) - TransactionUtils.getAmount(transaction, isExpenseReport); + } + if (isExpenseReport && typeof updatedMoneyRequestReport.total === 'number') { + updatedMoneyRequestReport.total += diff; + } else { + updatedMoneyRequestReport = iouReport + ? IOUUtils.updateIOUOwnerAndTotal(iouReport, updatedReportAction.actorAccountID ?? -1, diff, TransactionUtils.getCurrency(updatedTransaction), false) + : {}; } + updatedMoneyRequestReport.cachedTotal = CurrencyUtils.convertToDisplayString(updatedMoneyRequestReport.total, updatedTransaction?.modifiedCurrency); + optimisticData.push({ + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT}${iouReport?.reportID}`, + value: updatedMoneyRequestReport, + }); + successData.push({ + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT}${iouReport?.reportID}`, + value: {pendingAction: null}, + }); } // Optimistically modify the transaction From 774b28935b75f7a51f1ca329ad79721ca0c87a20 Mon Sep 17 00:00:00 2001 From: Krishna Gupta Date: Tue, 6 Feb 2024 14:21:42 +0530 Subject: [PATCH 099/288] fix: Assigned cards tile uses cardholderName- lastFourDigits instead of bankName - lastFourDigits. Signed-off-by: Krishna Gupta --- src/pages/settings/Wallet/PaymentMethodList.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pages/settings/Wallet/PaymentMethodList.js b/src/pages/settings/Wallet/PaymentMethodList.js index 0c708442cec6..d5bb268f0f86 100644 --- a/src/pages/settings/Wallet/PaymentMethodList.js +++ b/src/pages/settings/Wallet/PaymentMethodList.js @@ -227,9 +227,10 @@ function PaymentMethodList({ // In the case a user has been assigned multiple physical Expensify Cards under one domain, display the Card with PAN const expensifyCardDescription = numberPhysicalExpensifyCards > 1 ? CardUtils.getCardDescription(card.cardID) : translate('walletPage.expensifyCard'); + const cartTitle = card.lastFourPAN ? `${card.bank} - ${card.lastFourPAN}` : card.bank; return { key: card.cardID, - title: isExpensifyCard ? expensifyCardDescription : card.cardName, + title: isExpensifyCard ? expensifyCardDescription : cartTitle, description: card.domainName, onPress: isExpensifyCard ? () => Navigation.navigate(ROUTES.SETTINGS_WALLET_DOMAINCARD.getRoute(card.domainName)) : () => {}, shouldShowRightIcon: isExpensifyCard, From b2ce3f01984eb8b8247fb7e12fce6df0b14319c7 Mon Sep 17 00:00:00 2001 From: dukenv0307 Date: Tue, 6 Feb 2024 15:54:01 +0700 Subject: [PATCH 100/288] fix lint --- src/components/ReportActionItem/MoneyRequestAction.tsx | 2 +- src/libs/IOUUtils.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/ReportActionItem/MoneyRequestAction.tsx b/src/components/ReportActionItem/MoneyRequestAction.tsx index 35314a4dad11..ff29bf5b0ee8 100644 --- a/src/components/ReportActionItem/MoneyRequestAction.tsx +++ b/src/components/ReportActionItem/MoneyRequestAction.tsx @@ -93,7 +93,7 @@ function MoneyRequestAction({ // If the childReportID is not present, we need to create a new thread const childReportID = action?.childReportID ?? '0'; - if (!Number(childReportID)) { + if (!childReportID) { const thread = ReportUtils.buildTransactionThread(action, requestReportID); const userLogins = PersonalDetailsUtils.getLoginsByAccountIDs(thread.participantAccountIDs ?? []); Report.openReport(thread.reportID, userLogins, thread, action.reportActionID); diff --git a/src/libs/IOUUtils.ts b/src/libs/IOUUtils.ts index eaca60414b3a..55317c9c050c 100644 --- a/src/libs/IOUUtils.ts +++ b/src/libs/IOUUtils.ts @@ -55,10 +55,10 @@ function calculateAmount(numberOfParticipants: number, total: number, currency: * @param isDeleting - whether the user is deleting the request */ function updateIOUOwnerAndTotal>(iouReport: TReport, actorAccountID: number, amount: number, currency: string, isDeleting = false): TReport { - if(!iouReport?.currency){ + if (!iouReport?.currency) { return iouReport; } - + // Make a copy so we don't mutate the original object const iouReportUpdate = {...iouReport}; From 89abd0225021556c32db86e552b5ddbb2d695ce5 Mon Sep 17 00:00:00 2001 From: dukenv0307 Date: Tue, 6 Feb 2024 16:04:18 +0700 Subject: [PATCH 101/288] Revert "Add policy avatar" This reverts commit 72dee1d56db92fa67da0fabd852453fc645687a3. --- src/libs/ReportUtils.ts | 8 +++----- src/pages/home/ReportScreen.js | 2 -- src/types/onyx/Report.ts | 3 --- 3 files changed, 3 insertions(+), 10 deletions(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index cde5b8b1a5e2..965ee5d8433b 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -1446,11 +1446,9 @@ function getIconsForParticipants(participants: number[], personalDetails: OnyxCo */ function getWorkspaceIcon(report: OnyxEntry, policy: OnyxEntry = null): Icon { const workspaceName = getPolicyName(report, false, policy); - // disabling to protect against empty strings - // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing - const policyAvatarURL = report?.policyAvatar || allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${report?.policyID}`]?.avatar; - // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing - const policyExpenseChatAvatarSource = policyAvatarURL || getDefaultWorkspaceAvatar(workspaceName); + const policyExpenseChatAvatarSource = allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${report?.policyID}`]?.avatar + ? allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${report?.policyID}`]?.avatar + : getDefaultWorkspaceAvatar(workspaceName); const workspaceIcon: Icon = { source: policyExpenseChatAvatarSource ?? '', diff --git a/src/pages/home/ReportScreen.js b/src/pages/home/ReportScreen.js index d903bc10bbf7..bfe27910c943 100644 --- a/src/pages/home/ReportScreen.js +++ b/src/pages/home/ReportScreen.js @@ -205,7 +205,6 @@ function ReportScreen({ visibility: reportProp.visibility, oldPolicyName: reportProp.oldPolicyName, policyName: reportProp.policyName, - policyAvatar: reportProp.policyAvatar, isOptimisticReport: reportProp.isOptimisticReport, }), [ @@ -242,7 +241,6 @@ function ReportScreen({ reportProp.visibility, reportProp.oldPolicyName, reportProp.policyName, - reportProp.policyAvatar, reportProp.isOptimisticReport, ], ); diff --git a/src/types/onyx/Report.ts b/src/types/onyx/Report.ts index 1b8d026898c0..fbd61a9c5365 100644 --- a/src/types/onyx/Report.ts +++ b/src/types/onyx/Report.ts @@ -64,9 +64,6 @@ type Report = { /** The current user's notification preference for this report */ notificationPreference?: NotificationPreference; - /** The policy avatar to use, if any */ - policyAvatar?: string | null; - /** The policy name to use */ policyName?: string | null; From 312ddbc75e9e274806d99e86eebfa09e4a6e0b53 Mon Sep 17 00:00:00 2001 From: dukenv0307 Date: Tue, 6 Feb 2024 16:04:33 +0700 Subject: [PATCH 102/288] Revert "fix lint" This reverts commit 1e3e91e0c2bd882ceb5d605ce5743cd0c6a7c212. --- src/libs/ReportUtils.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 965ee5d8433b..bd0708878443 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -1541,6 +1541,7 @@ function getIcons( return [domainIcon]; } if (isAdminRoom(report) || isAnnounceRoom(report) || isChatRoom(report) || isArchivedRoom(report)) { + console.log('run in here'); const workspaceIcon = getWorkspaceIcon(report, policy); return [workspaceIcon]; } From c8a3c4c472d12e37d2471bdc506fb00107687158 Mon Sep 17 00:00:00 2001 From: dukenv0307 Date: Tue, 6 Feb 2024 16:06:35 +0700 Subject: [PATCH 103/288] remove useless code --- src/libs/ReportUtils.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index bd0708878443..965ee5d8433b 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -1541,7 +1541,6 @@ function getIcons( return [domainIcon]; } if (isAdminRoom(report) || isAnnounceRoom(report) || isChatRoom(report) || isArchivedRoom(report)) { - console.log('run in here'); const workspaceIcon = getWorkspaceIcon(report, policy); return [workspaceIcon]; } From 7114321da6dd80f78cad2ad886e55bf33b1f41da Mon Sep 17 00:00:00 2001 From: ruben-rebelo Date: Tue, 6 Feb 2024 09:56:29 +0000 Subject: [PATCH 104/288] [TS migration] Migrate react-native-permissions mock --- __mocks__/react-native-permissions.js | 84 ------------------- __mocks__/react-native-permissions.ts | 76 +++++++++++++++++ .../modules/react-native-permissions.d.ts | 1 + 3 files changed, 77 insertions(+), 84 deletions(-) delete mode 100644 __mocks__/react-native-permissions.js create mode 100644 __mocks__/react-native-permissions.ts create mode 100644 src/types/modules/react-native-permissions.d.ts diff --git a/__mocks__/react-native-permissions.js b/__mocks__/react-native-permissions.js deleted file mode 100644 index e4cc02123e7f..000000000000 --- a/__mocks__/react-native-permissions.js +++ /dev/null @@ -1,84 +0,0 @@ -const {PERMISSIONS} = require('react-native-permissions/dist/commonjs/permissions'); -const {RESULTS} = require('react-native-permissions/dist/commonjs/results'); -const _ = require('underscore'); - -export {PERMISSIONS, RESULTS}; - -const openLimitedPhotoLibraryPicker = jest.fn(() => {}); -const openSettings = jest.fn(() => {}); -const check = jest.fn(() => RESULTS.GRANTED); -const request = jest.fn(() => RESULTS.GRANTED); -const checkLocationAccuracy = jest.fn(() => 'full'); -const requestLocationAccuracy = jest.fn(() => 'full'); - -const notificationOptions = ['alert', 'badge', 'sound', 'carPlay', 'criticalAlert', 'provisional']; - -const notificationSettings = { - alert: true, - badge: true, - sound: true, - carPlay: true, - criticalAlert: true, - provisional: true, - lockScreen: true, - notificationCenter: true, -}; - -const checkNotifications = jest.fn(() => ({ - status: RESULTS.GRANTED, - settings: notificationSettings, -})); - -const requestNotifications = jest.fn((options) => ({ - status: RESULTS.GRANTED, - settings: _.chain(options) - .filter((option) => _.contains(notificationOptions, option)) - .reduce((acc, option) => ({...acc, [option]: true}), { - lockScreen: true, - notificationCenter: true, - }) - .value(), -})); - -const checkMultiple = jest.fn((permissions) => - _.reduce(permissions, (acc, permission) => ({ - ...acc, - [permission]: RESULTS.GRANTED, - })), -); - -const requestMultiple = jest.fn((permissions) => - _.reduce(permissions, (acc, permission) => ({ - ...acc, - [permission]: RESULTS.GRANTED, - })), -); - -export default { - PERMISSIONS, - RESULTS, - - check, - checkLocationAccuracy, - checkMultiple, - checkNotifications, - openLimitedPhotoLibraryPicker, - openSettings, - request, - requestLocationAccuracy, - requestMultiple, - requestNotifications, -}; - -export { - openLimitedPhotoLibraryPicker, - openSettings, - check, - request, - checkLocationAccuracy, - requestLocationAccuracy, - checkNotifications, - requestNotifications, - checkMultiple, - requestMultiple, -}; diff --git a/__mocks__/react-native-permissions.ts b/__mocks__/react-native-permissions.ts new file mode 100644 index 000000000000..f8bfe3cd6376 --- /dev/null +++ b/__mocks__/react-native-permissions.ts @@ -0,0 +1,76 @@ +import {PERMISSIONS, RESULTS} from 'react-native-permissions/dist/commonjs/permissions'; +import type {ValueOf} from 'type-fest'; + +type Results = ValueOf; +type ResultsCollection = Record; +type NotificationSettings = Record; + +const openLimitedPhotoLibraryPicker: jest.Mock = jest.fn(() => {}); +const openSettings: jest.Mock = jest.fn(() => {}); +const check: jest.Mock = jest.fn(() => RESULTS.GRANTED as string); +const request: jest.Mock = jest.fn(() => RESULTS.GRANTED as string); +const checkLocationAccuracy: jest.Mock = jest.fn(() => 'full'); +const requestLocationAccuracy: jest.Mock = jest.fn(() => 'full'); + +const notificationOptions: string[] = ['alert', 'badge', 'sound', 'carPlay', 'criticalAlert', 'provisional']; + +const notificationSettings: NotificationSettings = { + alert: true, + badge: true, + sound: true, + carPlay: true, + criticalAlert: true, + provisional: true, + lockScreen: true, + notificationCenter: true, +}; + +const checkNotifications: jest.Mock<{status: Results; settings: typeof notificationSettings}> = jest.fn(() => ({ + status: RESULTS.GRANTED, + settings: notificationSettings, +})); + +const requestNotifications: jest.Mock<{status: Results; settings: typeof notificationSettings}> = jest.fn((options: Record) => ({ + status: RESULTS.GRANTED, + settings: Object.keys(options) + .filter((option: string) => notificationOptions.includes(option)) + .reduce((acc: ResultsCollection, option: string) => ({...acc, [option]: true}), { + lockScreen: true, + notificationCenter: true, + }), +})); + +const checkMultiple: jest.Mock = jest.fn((permissions: string[]) => + permissions.reduce( + (acc: ResultsCollection, permission: string) => ({ + ...acc, + [permission]: RESULTS.GRANTED, + }), + {}, + ), +); + +const requestMultiple: jest.Mock = jest.fn((permissions: string[]) => + permissions.reduce( + (acc: ResultsCollection, permission: string) => ({ + ...acc, + [permission]: RESULTS.GRANTED, + }), + {}, + ), +); + +export { + PERMISSIONS, + RESULTS, + check, + checkLocationAccuracy, + checkMultiple, + checkNotifications, + openLimitedPhotoLibraryPicker, + openSettings, + request, + requestLocationAccuracy, + requestMultiple, + requestNotifications, +}; diff --git a/src/types/modules/react-native-permissions.d.ts b/src/types/modules/react-native-permissions.d.ts new file mode 100644 index 000000000000..fa9a73cc8f25 --- /dev/null +++ b/src/types/modules/react-native-permissions.d.ts @@ -0,0 +1 @@ +declare module 'react-native-permissions/dist/commonjs/permissions'; From 9b283367fe625f2583cd29de3847441dce1349d8 Mon Sep 17 00:00:00 2001 From: ruben-rebelo Date: Tue, 6 Feb 2024 14:10:40 +0000 Subject: [PATCH 105/288] [TS migration] Migrate config.local from e2e to Typescript --- tests/e2e/README.md | 4 ++-- tests/e2e/{config.local.js => config.local.ts} | 5 +++-- tests/e2e/testRunner.js | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) rename tests/e2e/{config.local.js => config.local.ts} (88%) diff --git a/tests/e2e/README.md b/tests/e2e/README.md index a142530d4388..64d11d3b2ca4 100644 --- a/tests/e2e/README.md +++ b/tests/e2e/README.md @@ -25,11 +25,11 @@ Ideally you want to run these tests on your branch before you want to merge your The tests can be run with the following CLI options: -- `--config`: Extend/Overwrite the default config with your values, e.g. `--config config.local.js` +- `--config`: Extend/Overwrite the default config with your values, e.g. `--config config.local.ts` - `--includes`: Expects a string/regexp to filter the tests to run, e.g. `--includes "login|signup"` - `--skipInstallDeps`: Skips the `npm install` step, useful during development - `--development`: Applies some default configurations: - - Sets the config to `config.local.js`, which executes the tests with fewer iterations + - Sets the config to `config.local.ts`, which executes the tests with fewer iterations - Runs the tests only on the current branch - `--buildMode`: There are three build modes, the default is `full`: 1. **full**: rebuilds the full native app in (e2e) release mode diff --git a/tests/e2e/config.local.js b/tests/e2e/config.local.ts similarity index 88% rename from tests/e2e/config.local.js rename to tests/e2e/config.local.ts index 45b946b91aeb..0ad64170885f 100644 --- a/tests/e2e/config.local.js +++ b/tests/e2e/config.local.ts @@ -1,9 +1,10 @@ -module.exports = { +const config = { MAIN_APP_PACKAGE: 'com.expensify.chat.e2e', DELTA_APP_PACKAGE: 'com.expensify.chat.e2edelta', MAIN_APP_PATH: './android/app/build/outputs/apk/e2e/release/app-e2e-release.apk', DELTA_APP_PATH: './android/app/build/outputs/apk/e2edelta/release/app-e2edelta-release.apk', - BOOT_COOL_DOWN: 1 * 1000, RUNS: 8, }; + +module.exports = config; diff --git a/tests/e2e/testRunner.js b/tests/e2e/testRunner.js index 98faff32397d..6fa594e3e2eb 100644 --- a/tests/e2e/testRunner.js +++ b/tests/e2e/testRunner.js @@ -73,7 +73,7 @@ let buildMode = 'full'; // When we are in dev mode we want to apply certain default params and configs const isDevMode = args.includes('--development'); if (isDevMode) { - setConfigPath('config.local.js'); + setConfigPath('config.local.ts'); buildMode = 'js-only'; } From a5aa7d0fc748b3d595a5ab80dd4dcd40d72b9004 Mon Sep 17 00:00:00 2001 From: dukenv0307 Date: Tue, 6 Feb 2024 21:56:24 +0700 Subject: [PATCH 106/288] revert change --- src/SCREENS.ts | 5 ----- .../OptionsSelector/BaseOptionsSelector.js | 3 --- .../AppNavigator/ModalStackNavigators.tsx | 5 ----- src/pages/NewChatPage.js | 1 - src/pages/ReferralDetailsPage.tsx | 14 -------------- src/pages/SearchPage.js | 2 -- ...poraryForRefactorRequestParticipantsSelector.js | 1 - 7 files changed, 31 deletions(-) diff --git a/src/SCREENS.ts b/src/SCREENS.ts index 61aa208f0a98..e2f0e9745561 100644 --- a/src/SCREENS.ts +++ b/src/SCREENS.ts @@ -250,11 +250,6 @@ const SCREENS = { REIMBURSEMENT_ACCOUNT: 'ReimbursementAccount', GET_ASSISTANCE: 'GetAssistance', REFERRAL_DETAILS: 'Referral_Details', - REFERRAL_DETAILS_MONEY_REQUEST: 'Referral_Details_Money_Request', - REFERRAL_DETAILS_START_CHAT: 'Referral_Details_Start_Chat', - REFERRAL_DETAILS_SEND_MONEY: 'Referral_Details_Send_Money', - REFERRAL_DETAILS_REFER_FRIEND: 'Referral_Details_Refer_Friend', - REFERRAL_DETAILS_SHARE_CODE: 'Referral_Details_Share_Code', KEYBOARD_SHORTCUTS: 'KeyboardShortcuts', } as const; diff --git a/src/components/OptionsSelector/BaseOptionsSelector.js b/src/components/OptionsSelector/BaseOptionsSelector.js index 5c860c7be178..345680e809f3 100755 --- a/src/components/OptionsSelector/BaseOptionsSelector.js +++ b/src/components/OptionsSelector/BaseOptionsSelector.js @@ -47,9 +47,6 @@ const propTypes = { /** Referral content type */ referralContentType: PropTypes.string, - /** Referral route */ - referralRoute: PropTypes.string, - ...optionsSelectorPropTypes, ...withLocalizePropTypes, ...withThemeStylesPropTypes, diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators.tsx index 5fdb3b8d846e..110c13fa07bf 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators.tsx +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators.tsx @@ -282,11 +282,6 @@ const SignInModalStackNavigator = createModalStackNavigator({ [SCREENS.REFERRAL_DETAILS]: () => require('../../../pages/ReferralDetailsPage').default as React.ComponentType, - [SCREENS.REFERRAL_DETAILS_MONEY_REQUEST]: () => require('../../../pages/ReferralDetailsPage').default as React.ComponentType, - [SCREENS.REFERRAL_DETAILS_START_CHAT]: () => require('../../../pages/ReferralDetailsPage').default as React.ComponentType, - [SCREENS.REFERRAL_DETAILS_SEND_MONEY]: () => require('../../../pages/ReferralDetailsPage').default as React.ComponentType, - [SCREENS.REFERRAL_DETAILS_REFER_FRIEND]: () => require('../../../pages/ReferralDetailsPage').default as React.ComponentType, - [SCREENS.REFERRAL_DETAILS_SHARE_CODE]: () => require('../../../pages/ReferralDetailsPage').default as React.ComponentType, }); const ProcessMoneyRequestHoldStackNavigator = createModalStackNavigator({ diff --git a/src/pages/NewChatPage.js b/src/pages/NewChatPage.js index 420dc487ef71..44131de01fa6 100755 --- a/src/pages/NewChatPage.js +++ b/src/pages/NewChatPage.js @@ -24,7 +24,6 @@ import * as Report from '@userActions/Report'; import * as User from '@userActions/User'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; -import ROUTES from '@src/ROUTES'; import personalDetailsPropType from './personalDetailsPropType'; import reportPropTypes from './reportPropTypes'; diff --git a/src/pages/ReferralDetailsPage.tsx b/src/pages/ReferralDetailsPage.tsx index 38d7fe7110ee..f5a5aef14373 100644 --- a/src/pages/ReferralDetailsPage.tsx +++ b/src/pages/ReferralDetailsPage.tsx @@ -18,7 +18,6 @@ import type {ReferralDetailsNavigatorParamList} from '@libs/Navigation/types'; import * as Link from '@userActions/Link'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; -import ROUTES from '@src/ROUTES'; import SCREENS from '@src/SCREENS'; import type {Account} from '@src/types/onyx'; import * as ReportActionContextMenu from './home/report/ContextMenu/ReportActionContextMenu'; @@ -37,7 +36,6 @@ function ReferralDetailsPage({route, account}: ReferralDetailsPageProps) { const popoverAnchor = useRef(null); const {isExecuting, singleExecution} = useSingleExecution(); let {contentType} = route.params; - const {transactionID, reportID} = route.params; if (!Object.values(CONST.REFERRAL_PROGRAM.CONTENT_TYPES).includes(contentType)) { contentType = CONST.REFERRAL_PROGRAM.CONTENT_TYPES.REFER_FRIEND; @@ -49,18 +47,6 @@ function ReferralDetailsPage({route, account}: ReferralDetailsPageProps) { const shouldShowClipboard = contentType === CONST.REFERRAL_PROGRAM.CONTENT_TYPES.REFER_FRIEND || isShareCode; const referralLink = `${CONST.REFERRAL_PROGRAM.LINK}${account?.primaryLogin ? `/?thanks=${account.primaryLogin}` : ''}`; - function getFallbackRoute() { - const fallbackRoutes = { - [CONST.REFERRAL_PROGRAM.CONTENT_TYPES.MONEY_REQUEST]: ROUTES.MONEY_REQUEST_STEP_PARTICIPANTS.getRoute(CONST.IOU.TYPE.REQUEST, transactionID, reportID), - [CONST.REFERRAL_PROGRAM.CONTENT_TYPES.SEND_MONEY]: ROUTES.MONEY_REQUEST_PARTICIPANTS.getRoute(CONST.IOU.TYPE.SEND), - [CONST.REFERRAL_PROGRAM.CONTENT_TYPES.START_CHAT]: ROUTES.NEW_CHAT, - [CONST.REFERRAL_PROGRAM.CONTENT_TYPES.REFER_FRIEND]: ROUTES.SEARCH, - [CONST.REFERRAL_PROGRAM.CONTENT_TYPES.SHARE_CODE]: ROUTES.SETTINGS_SHARE_CODE, - }; - - return fallbackRoutes[contentType]; - } - return ( Date: Tue, 6 Feb 2024 22:16:31 +0700 Subject: [PATCH 107/288] add new solution --- src/ROUTES.ts | 2 +- src/components/ReferralProgramCTA.tsx | 2 +- src/libs/Navigation/types.ts | 1 + src/pages/ReferralDetailsPage.tsx | 10 ++++++++++ src/pages/ShareCodePage.tsx | 2 +- 5 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/ROUTES.ts b/src/ROUTES.ts index 016e4267803b..328884b3b4bb 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -488,7 +488,7 @@ const ROUTES = { // Referral program promotion REFERRAL_DETAILS_MODAL: { route: 'referral/:contentType', - getRoute: (contentType: string) => `referral/${contentType}` as const, + getRoute: (contentType: string, backTo?: string) => getUrlWithBackToParam(`referral/${contentType}`, backTo), }, PROCESS_MONEY_REQUEST_HOLD: 'hold-request-educational', } as const; diff --git a/src/components/ReferralProgramCTA.tsx b/src/components/ReferralProgramCTA.tsx index f1c7539cc6b5..d6a07a25e7b9 100644 --- a/src/components/ReferralProgramCTA.tsx +++ b/src/components/ReferralProgramCTA.tsx @@ -30,7 +30,7 @@ function ReferralProgramCTA({referralContentType, onCloseButtonPress = () => {}} return ( { - Navigation.navigate(ROUTES.REFERRAL_DETAILS_MODAL.getRoute(referralContentType)); + Navigation.navigate(ROUTES.REFERRAL_DETAILS_MODAL.getRoute(referralContentType, Navigation.getActiveRouteWithoutParams())); }} style={[styles.w100, styles.br2, styles.highlightBG, styles.flexRow, styles.justifyContentBetween, styles.alignItemsCenter, {gap: 10, padding: 10}, styles.pl5]} accessibilityLabel="referral" diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index 48ef69f27768..53cf6a91b700 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -341,6 +341,7 @@ type SignInNavigatorParamList = { type ReferralDetailsNavigatorParamList = { [SCREENS.REFERRAL_DETAILS]: { contentType: ValueOf; + backTo: string; }; }; diff --git a/src/pages/ReferralDetailsPage.tsx b/src/pages/ReferralDetailsPage.tsx index f5a5aef14373..d8a27e171933 100644 --- a/src/pages/ReferralDetailsPage.tsx +++ b/src/pages/ReferralDetailsPage.tsx @@ -14,10 +14,12 @@ import useSingleExecution from '@hooks/useSingleExecution'; import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; import Clipboard from '@libs/Clipboard'; +import Navigation from '@libs/Navigation/Navigation'; import type {ReferralDetailsNavigatorParamList} from '@libs/Navigation/types'; import * as Link from '@userActions/Link'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; +import type {Route} from '@src/ROUTES'; import SCREENS from '@src/SCREENS'; import type {Account} from '@src/types/onyx'; import * as ReportActionContextMenu from './home/report/ContextMenu/ReportActionContextMenu'; @@ -36,6 +38,7 @@ function ReferralDetailsPage({route, account}: ReferralDetailsPageProps) { const popoverAnchor = useRef(null); const {isExecuting, singleExecution} = useSingleExecution(); let {contentType} = route.params; + const {backTo} = route.params; if (!Object.values(CONST.REFERRAL_PROGRAM.CONTENT_TYPES).includes(contentType)) { contentType = CONST.REFERRAL_PROGRAM.CONTENT_TYPES.REFER_FRIEND; @@ -60,6 +63,13 @@ function ReferralDetailsPage({route, account}: ReferralDetailsPageProps) { headerContainerStyles={[styles.staticHeaderImage, styles.justifyContentEnd]} backgroundColor={theme.PAGE_THEMES[SCREENS.REFERRAL_DETAILS].backgroundColor} testID={ReferralDetailsPage.displayName} + onBackButtonPress={() => { + if (backTo) { + Navigation.goBack(backTo as Route); + return; + } + Navigation.goBack(); + }} > {contentHeader} {contentBody} diff --git a/src/pages/ShareCodePage.tsx b/src/pages/ShareCodePage.tsx index 831f0eb8f1d8..5e703b392b04 100644 --- a/src/pages/ShareCodePage.tsx +++ b/src/pages/ShareCodePage.tsx @@ -116,7 +116,7 @@ function ShareCodePage({report, session, currentUserPersonalDetails}: ShareCodeP Navigation.navigate(ROUTES.REFERRAL_DETAILS_MODAL.getRoute(CONST.REFERRAL_PROGRAM.CONTENT_TYPES.SHARE_CODE))} + onPress={() => Navigation.navigate(ROUTES.REFERRAL_DETAILS_MODAL.getRoute(CONST.REFERRAL_PROGRAM.CONTENT_TYPES.SHARE_CODE, Navigation.getActiveRouteWithoutParams()))} /> From 71c38ffa1487c169df66c31b984f18925da33f86 Mon Sep 17 00:00:00 2001 From: tienifr Date: Tue, 6 Feb 2024 23:44:30 +0700 Subject: [PATCH 108/288] fix: cannot unselect disabled category --- src/libs/OptionsListUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/OptionsListUtils.ts b/src/libs/OptionsListUtils.ts index b6518b361381..03a18538155b 100644 --- a/src/libs/OptionsListUtils.ts +++ b/src/libs/OptionsListUtils.ts @@ -973,7 +973,7 @@ function getCategoryListSections( } const selectedOptionNames = selectedOptions.map((selectedOption) => selectedOption.name); - const enabledAndSelectedCategories = sortedCategories.filter((category) => category.enabled || selectedOptionNames.includes(category.name)); + const enabledAndSelectedCategories = [...selectedOptions, ...sortedCategories.filter((category) => category.enabled && !selectedOptionNames.includes(category.name))]; const numberOfVisibleCategories = enabledAndSelectedCategories.length; if (numberOfVisibleCategories < CONST.CATEGORY_LIST_THRESHOLD) { From 36f335d36dc9221c0b1e7eed9e3dfb54eb36ecbe Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Tue, 6 Feb 2024 12:38:05 -0500 Subject: [PATCH 109/288] feat(Violations): handle null case --- src/libs/ErrorUtils.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libs/ErrorUtils.ts b/src/libs/ErrorUtils.ts index 692e0fe2756d..ad8bae9eea4f 100644 --- a/src/libs/ErrorUtils.ts +++ b/src/libs/ErrorUtils.ts @@ -39,7 +39,7 @@ function getAuthenticateErrorMessage(response: Response): keyof TranslationFlatO * Method used to get an error object with microsecond as the key. * @param error - error key or message to be saved */ -function getMicroSecondOnyxError(error: string): Errors { +function getMicroSecondOnyxError(error: string | null): Errors { return {[DateUtils.getMicroseconds()]: error}; } @@ -64,7 +64,7 @@ function getLatestErrorMessage(onyxData: T const key = Object.keys(errors).sort().reverse()[0]; - return errors[key]; + return errors[key] ?? ''; } function getLatestErrorMessageField(onyxData: TOnyxData): Errors { From 7164120ab9687df1b5f08c17b5775fc66c69455e Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Tue, 6 Feb 2024 12:38:56 -0500 Subject: [PATCH 110/288] feat(Violations): remove unused imports --- src/components/OfflineWithFeedback.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/OfflineWithFeedback.tsx b/src/components/OfflineWithFeedback.tsx index b298449b1215..975d154b885b 100644 --- a/src/components/OfflineWithFeedback.tsx +++ b/src/components/OfflineWithFeedback.tsx @@ -1,10 +1,9 @@ -import React, {useCallback, useMemo} from 'react'; +import React, {useCallback} from 'react'; import type {ImageStyle, StyleProp, TextStyle, ViewStyle} from 'react-native'; import {View} from 'react-native'; import useNetwork from '@hooks/useNetwork'; import useStyleUtils from '@hooks/useStyleUtils'; import useThemeStyles from '@hooks/useThemeStyles'; -import {removeErrorsWithNullMessage} from '@libs/ErrorUtils'; import mapChildrenFlat from '@libs/mapChildrenFlat'; import shouldRenderOffscreen from '@libs/shouldRenderOffscreen'; import CONST from '@src/CONST'; From 3297913db780c51e7100672a3fdb61aff5e66f26 Mon Sep 17 00:00:00 2001 From: hkopser99 <144170694+hkopser99@users.noreply.github.com> Date: Tue, 6 Feb 2024 21:59:50 +0100 Subject: [PATCH 111/288] Update AppDownloadLinks.tsx --- src/pages/settings/AppDownloadLinks.tsx | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/src/pages/settings/AppDownloadLinks.tsx b/src/pages/settings/AppDownloadLinks.tsx index f5932250cad9..009c00996d7a 100644 --- a/src/pages/settings/AppDownloadLinks.tsx +++ b/src/pages/settings/AppDownloadLinks.tsx @@ -1,29 +1,29 @@ import React, {useRef} from 'react'; import {ScrollView} from 'react-native'; -import useLocalize from '@hooks/useLocalize'; -import useThemeStyles from '@hooks/useThemeStyles'; -import Navigation from '@libs/Navigation/Navigation'; +import type {View} from 'react-native'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; import * as Expensicons from '@components/Icon/Expensicons'; import MenuItem from '@components/MenuItem'; +import type {MenuItemProps} from '@components/MenuItem'; import ScreenWrapper from '@components/ScreenWrapper'; +import useLocalize from '@hooks/useLocalize'; +import useThemeStyles from '@hooks/useThemeStyles'; +import Navigation from '@libs/Navigation/Navigation'; import * as ReportActionContextMenu from '@pages/home/report/ContextMenu/ReportActionContextMenu'; import * as Link from '@userActions/Link'; -import type { View } from 'react-native'; -import type { TranslationPaths } from '@src/languages/types'; -import type { MenuItemProps } from '@components/MenuItem'; import CONST from '@src/CONST'; +import type {TranslationPaths} from '@src/languages/types'; import ROUTES from '@src/ROUTES'; function AppDownloadLinksPage() { const styles = useThemeStyles(); - const { translate } = useLocalize(); + const {translate} = useLocalize(); const popoverAnchor = useRef(null); type DownloadMenuItem = MenuItemProps & { - translationKey: TranslationPaths, - openAppDownloadLink: () => void, - downloadLink: string, + translationKey: TranslationPaths; + openAppDownloadLink: () => void; + downloadLink: string; }; const menuItems: DownloadMenuItem[] = [ @@ -71,10 +71,10 @@ function AppDownloadLinksPage() { ref={popoverAnchor} title={translate(item.translationKey)} icon={item.icon} - iconRight={item.iconRight} + iconRight={item.iconRight} shouldBlockSelection shouldShowRightIcon - /> + /> ))} @@ -84,4 +84,3 @@ function AppDownloadLinksPage() { AppDownloadLinksPage.displayName = 'AppDownloadLinksPage'; export default AppDownloadLinksPage; - From 148af58b52b5d9dd35c0e461e312f8b1024fbd3a Mon Sep 17 00:00:00 2001 From: Robert Kozik Date: Tue, 6 Feb 2024 21:18:15 +0100 Subject: [PATCH 112/288] reintroduce animated input for Markdown composer --- src/components/AnimatedMarkdownTextInput.tsx | 37 ++++++++++++++++++++ src/components/Composer/index.native.tsx | 4 +-- 2 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 src/components/AnimatedMarkdownTextInput.tsx diff --git a/src/components/AnimatedMarkdownTextInput.tsx b/src/components/AnimatedMarkdownTextInput.tsx new file mode 100644 index 000000000000..f51c54fbe1e9 --- /dev/null +++ b/src/components/AnimatedMarkdownTextInput.tsx @@ -0,0 +1,37 @@ +import type {ForwardedRef} from 'react'; +import React from 'react'; +import type {MarkdownTextInputProps} from '@expensify/react-native-live-markdown'; +import type {TextInput} from 'react-native'; +import {MarkdownTextInput} from '@expensify/react-native-live-markdown'; +import Animated from 'react-native-reanimated'; +import useTheme from '@hooks/useTheme'; + +// Convert the underlying TextInput into an Animated component so that we can take an animated ref and pass it to a worklet +const AnimatedTextInput = Animated.createAnimatedComponent(MarkdownTextInput); + +type AnimatedTextInputRef = typeof AnimatedTextInput & TextInput & HTMLInputElement; + +function RNTextInputWithRef(props: MarkdownTextInputProps, ref: ForwardedRef) { + const theme = useTheme(); + + return ( + { + if (typeof ref !== 'function') { + return; + } + ref(refHandle as AnimatedTextInputRef); + }} + // eslint-disable-next-line + {...props} + /> + ); +} + +RNTextInputWithRef.displayName = 'RNTextInputWithRef'; + +export default React.forwardRef(RNTextInputWithRef); +export type {AnimatedTextInputRef}; diff --git a/src/components/Composer/index.native.tsx b/src/components/Composer/index.native.tsx index a3c037211d4c..15d4825049ac 100644 --- a/src/components/Composer/index.native.tsx +++ b/src/components/Composer/index.native.tsx @@ -1,9 +1,9 @@ -import {MarkdownTextInput} from '@expensify/react-native-live-markdown'; import type {ForwardedRef} from 'react'; import React, {useCallback, useEffect, useMemo, useRef} from 'react'; import type {TextInput} from 'react-native'; import {StyleSheet} from 'react-native'; -import type {AnimatedTextInputRef} from '@components/RNTextInput'; +import type {AnimatedTextInputRef} from '@components/AnimatedMarkdownTextInput'; +import MarkdownTextInput from '@components/AnimatedMarkdownTextInput'; import useMarkdownStyle from '@hooks/useMarkdownStyle'; import useResetComposerFocus from '@hooks/useResetComposerFocus'; import useStyleUtils from '@hooks/useStyleUtils'; From 5a13a561790f81c138e4230f88ec5b46d4bb5f06 Mon Sep 17 00:00:00 2001 From: Bernhard Owen Josephus Date: Wed, 7 Feb 2024 15:37:34 +0800 Subject: [PATCH 113/288] don't early return if email is empty --- src/libs/actions/Policy.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libs/actions/Policy.ts b/src/libs/actions/Policy.ts index 866206895d5e..2fdb449627d2 100644 --- a/src/libs/actions/Policy.ts +++ b/src/libs/actions/Policy.ts @@ -1562,7 +1562,7 @@ function createWorkspaceFromIOUPayment(iouReport: Report | EmptyObject): string const policyID = generatePolicyID(); const workspaceName = generateDefaultWorkspaceName(sessionEmail); const employeeAccountID = iouReport.ownerAccountID; - const employeeEmail = iouReport.ownerEmail; + const employeeEmail = iouReport.ownerEmail ?? ''; const {customUnits, customUnitID, customUnitRateID} = buildOptimisticCustomUnits(); const oldPersonalPolicyID = iouReport.policyID; const iouReportID = iouReport.reportID; @@ -1582,7 +1582,7 @@ function createWorkspaceFromIOUPayment(iouReport: Report | EmptyObject): string expenseCreatedReportActionID: workspaceChatCreatedReportActionID, } = ReportUtils.buildOptimisticWorkspaceChats(policyID, workspaceName); - if (!employeeAccountID || !employeeEmail) { + if (!employeeAccountID) { return; } From c0c76652433710a5494ce73ae836f62e550cb8af Mon Sep 17 00:00:00 2001 From: Robert Kozik Date: Wed, 7 Feb 2024 10:13:56 +0100 Subject: [PATCH 114/288] run prettier --- src/components/AnimatedMarkdownTextInput.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/AnimatedMarkdownTextInput.tsx b/src/components/AnimatedMarkdownTextInput.tsx index f51c54fbe1e9..ce40fba6c159 100644 --- a/src/components/AnimatedMarkdownTextInput.tsx +++ b/src/components/AnimatedMarkdownTextInput.tsx @@ -1,8 +1,8 @@ +import type {MarkdownTextInputProps} from '@expensify/react-native-live-markdown'; +import {MarkdownTextInput} from '@expensify/react-native-live-markdown'; import type {ForwardedRef} from 'react'; import React from 'react'; -import type {MarkdownTextInputProps} from '@expensify/react-native-live-markdown'; import type {TextInput} from 'react-native'; -import {MarkdownTextInput} from '@expensify/react-native-live-markdown'; import Animated from 'react-native-reanimated'; import useTheme from '@hooks/useTheme'; From 7c5889effa9707b60a0b8f9bc560fed5d90b027b Mon Sep 17 00:00:00 2001 From: dukenv0307 Date: Wed, 7 Feb 2024 16:18:28 +0700 Subject: [PATCH 115/288] create a new function to update the total of money request report --- src/libs/actions/IOU.ts | 65 +++++++++++++++++++++++++++-------------- 1 file changed, 43 insertions(+), 22 deletions(-) diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index 297f1096b0ca..bd2d22fc6b9f 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -969,6 +969,48 @@ function createDistanceRequest( Report.notifyNewAction(chatReport.reportID, userAccountID); } +/** + * We will update the total of money request report when we update a transaction if + * + * - change the currency from different currency to the currency of the iou report + * - change the currency from the currency of iou report to different currency + * - change the amount and the currency of the transaction is the currency of the report + */ +function getUpdatedMoneyRequestReport( + iouReport: OnyxEntry, + updatedTransaction: OnyxTypes.Transaction | null, + transaction: OnyxTypes.Transaction | null, + updatedReportAction: OnyxEntry, +): OnyxEntry { + if (!iouReport) { + return null; + } + let updatedMoneyRequestReport = {...iouReport}; + let diff = 0; + const isExpenseReport = ReportUtils.isExpenseReport(iouReport); + const updatedCurrency = TransactionUtils.getCurrency(updatedTransaction); + const currentCurrency = TransactionUtils.getCurrency(transaction); + + if (updatedCurrency === iouReport?.currency && currentCurrency !== iouReport?.currency) { + // add the diff with the total if we change the currency from different currency to the currency of the iou report + diff = TransactionUtils.getAmount(updatedTransaction, isExpenseReport); + } else if (updatedCurrency !== iouReport?.currency && currentCurrency === iouReport?.currency) { + // subtract the diff with the total if we change the currency from the currency of iou report to different currency + diff = -TransactionUtils.getAmount(updatedTransaction, isExpenseReport); + } else if (updatedCurrency === iouReport?.currency && updatedTransaction?.modifiedAmount) { + // get the diff between the updated amount and the current amount if we change the amount and the currency of the transaction is the currency of the report + diff = TransactionUtils.getAmount(updatedTransaction, isExpenseReport) - TransactionUtils.getAmount(transaction, isExpenseReport); + } + if (isExpenseReport && typeof updatedMoneyRequestReport.total === 'number') { + // For expense report, the amount is negative so we should subtract total from diff + updatedMoneyRequestReport.total -= diff; + } else { + updatedMoneyRequestReport = IOUUtils.updateIOUOwnerAndTotal(iouReport, updatedReportAction?.actorAccountID ?? -1, diff, TransactionUtils.getCurrency(updatedTransaction), false); + } + updatedMoneyRequestReport.cachedTotal = CurrencyUtils.convertToDisplayString(updatedMoneyRequestReport.total, updatedTransaction?.modifiedCurrency); + return updatedMoneyRequestReport; +} + /** * @param transactionChanges * @param [transactionChanges.created] Present when updated the date field @@ -1050,28 +1092,7 @@ function getUpdateMoneyRequestParams( }); // Step 4: Compute the IOU total and update the report preview message (and report header) so LHN amount owed is correct. - // Should only update if the transaction matches the currency of the report, else we wait for the update - // from the server with the currency conversion - let updatedMoneyRequestReport = {...iouReport}; - let diff = 0; - const isExpenseReport = ReportUtils.isExpenseReport(iouReport); - const updatedCurrency = TransactionUtils.getCurrency(updatedTransaction); - const currentCurrency = TransactionUtils.getCurrency(transaction); - if (updatedCurrency === iouReport?.currency && currentCurrency !== iouReport?.currency) { - diff = TransactionUtils.getAmount(updatedTransaction, isExpenseReport); - } else if (updatedCurrency !== iouReport?.currency && currentCurrency === iouReport?.currency) { - diff = -TransactionUtils.getAmount(updatedTransaction, isExpenseReport); - } else if (updatedCurrency === iouReport?.currency && updatedTransaction?.modifiedAmount) { - diff = TransactionUtils.getAmount(updatedTransaction, isExpenseReport) - TransactionUtils.getAmount(transaction, isExpenseReport); - } - if (isExpenseReport && typeof updatedMoneyRequestReport.total === 'number') { - updatedMoneyRequestReport.total += diff; - } else { - updatedMoneyRequestReport = iouReport - ? IOUUtils.updateIOUOwnerAndTotal(iouReport, updatedReportAction.actorAccountID ?? -1, diff, TransactionUtils.getCurrency(updatedTransaction), false) - : {}; - } - updatedMoneyRequestReport.cachedTotal = CurrencyUtils.convertToDisplayString(updatedMoneyRequestReport.total, updatedTransaction?.modifiedCurrency); + const updatedMoneyRequestReport = getUpdatedMoneyRequestReport(iouReport, updatedTransaction, transaction, updatedReportAction as OnyxTypes.ReportAction); optimisticData.push({ onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT}${iouReport?.reportID}`, From 4ba03739d7c8f4b8b5b891614982d5c4323f3ce1 Mon Sep 17 00:00:00 2001 From: Robert Kozik Date: Wed, 7 Feb 2024 10:38:43 +0100 Subject: [PATCH 116/288] rename wrapping component to RNMarkdownTextInput --- src/components/Composer/index.native.tsx | 4 ++-- ...nimatedMarkdownTextInput.tsx => RNMarkdownTextInput.tsx} | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) rename src/components/{AnimatedMarkdownTextInput.tsx => RNMarkdownTextInput.tsx} (84%) diff --git a/src/components/Composer/index.native.tsx b/src/components/Composer/index.native.tsx index 15d4825049ac..592b62b68c4e 100644 --- a/src/components/Composer/index.native.tsx +++ b/src/components/Composer/index.native.tsx @@ -2,8 +2,8 @@ import type {ForwardedRef} from 'react'; import React, {useCallback, useEffect, useMemo, useRef} from 'react'; import type {TextInput} from 'react-native'; import {StyleSheet} from 'react-native'; -import type {AnimatedTextInputRef} from '@components/AnimatedMarkdownTextInput'; -import MarkdownTextInput from '@components/AnimatedMarkdownTextInput'; +import type {AnimatedTextInputRef} from '@components/RNMarkdownTextInput'; +import MarkdownTextInput from '@components/RNMarkdownTextInput'; import useMarkdownStyle from '@hooks/useMarkdownStyle'; import useResetComposerFocus from '@hooks/useResetComposerFocus'; import useStyleUtils from '@hooks/useStyleUtils'; diff --git a/src/components/AnimatedMarkdownTextInput.tsx b/src/components/RNMarkdownTextInput.tsx similarity index 84% rename from src/components/AnimatedMarkdownTextInput.tsx rename to src/components/RNMarkdownTextInput.tsx index ce40fba6c159..ca761c1ee285 100644 --- a/src/components/AnimatedMarkdownTextInput.tsx +++ b/src/components/RNMarkdownTextInput.tsx @@ -11,7 +11,7 @@ const AnimatedTextInput = Animated.createAnimatedComponent(MarkdownTextInput); type AnimatedTextInputRef = typeof AnimatedTextInput & TextInput & HTMLInputElement; -function RNTextInputWithRef(props: MarkdownTextInputProps, ref: ForwardedRef) { +function RNMarkdownTextInput(props: MarkdownTextInputProps, ref: ForwardedRef) { const theme = useTheme(); return ( @@ -31,7 +31,7 @@ function RNTextInputWithRef(props: MarkdownTextInputProps, ref: ForwardedRef Date: Wed, 7 Feb 2024 17:02:24 +0700 Subject: [PATCH 117/288] create a function to compute diff amount --- src/libs/actions/IOU.ts | 49 ++++++++++++++++++----------------------- 1 file changed, 21 insertions(+), 28 deletions(-) diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index bd2d22fc6b9f..ba54eac56fdb 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -970,45 +970,28 @@ function createDistanceRequest( } /** - * We will update the total of money request report when we update a transaction if - * - * - change the currency from different currency to the currency of the iou report - * - change the currency from the currency of iou report to different currency - * - change the amount and the currency of the transaction is the currency of the report + * Compute the diff amount when we update the transaction */ -function getUpdatedMoneyRequestReport( - iouReport: OnyxEntry, - updatedTransaction: OnyxTypes.Transaction | null, - transaction: OnyxTypes.Transaction | null, - updatedReportAction: OnyxEntry, -): OnyxEntry { +function computeDiffAmount(iouReport: OnyxEntry, updatedTransaction: OnyxEntry, transaction: OnyxEntry): number { if (!iouReport) { - return null; + return 0; } - let updatedMoneyRequestReport = {...iouReport}; - let diff = 0; const isExpenseReport = ReportUtils.isExpenseReport(iouReport); const updatedCurrency = TransactionUtils.getCurrency(updatedTransaction); const currentCurrency = TransactionUtils.getCurrency(transaction); if (updatedCurrency === iouReport?.currency && currentCurrency !== iouReport?.currency) { // add the diff with the total if we change the currency from different currency to the currency of the iou report - diff = TransactionUtils.getAmount(updatedTransaction, isExpenseReport); - } else if (updatedCurrency !== iouReport?.currency && currentCurrency === iouReport?.currency) { + return TransactionUtils.getAmount(updatedTransaction, isExpenseReport); + } if (updatedCurrency !== iouReport?.currency && currentCurrency === iouReport?.currency) { // subtract the diff with the total if we change the currency from the currency of iou report to different currency - diff = -TransactionUtils.getAmount(updatedTransaction, isExpenseReport); - } else if (updatedCurrency === iouReport?.currency && updatedTransaction?.modifiedAmount) { + return -TransactionUtils.getAmount(updatedTransaction, isExpenseReport); + } if (updatedCurrency === iouReport?.currency && updatedTransaction?.modifiedAmount) { // get the diff between the updated amount and the current amount if we change the amount and the currency of the transaction is the currency of the report - diff = TransactionUtils.getAmount(updatedTransaction, isExpenseReport) - TransactionUtils.getAmount(transaction, isExpenseReport); + return TransactionUtils.getAmount(updatedTransaction, isExpenseReport) - TransactionUtils.getAmount(transaction, isExpenseReport); } - if (isExpenseReport && typeof updatedMoneyRequestReport.total === 'number') { - // For expense report, the amount is negative so we should subtract total from diff - updatedMoneyRequestReport.total -= diff; - } else { - updatedMoneyRequestReport = IOUUtils.updateIOUOwnerAndTotal(iouReport, updatedReportAction?.actorAccountID ?? -1, diff, TransactionUtils.getCurrency(updatedTransaction), false); - } - updatedMoneyRequestReport.cachedTotal = CurrencyUtils.convertToDisplayString(updatedMoneyRequestReport.total, updatedTransaction?.modifiedCurrency); - return updatedMoneyRequestReport; + + return 0; } /** @@ -1092,7 +1075,17 @@ function getUpdateMoneyRequestParams( }); // Step 4: Compute the IOU total and update the report preview message (and report header) so LHN amount owed is correct. - const updatedMoneyRequestReport = getUpdatedMoneyRequestReport(iouReport, updatedTransaction, transaction, updatedReportAction as OnyxTypes.ReportAction); + let updatedMoneyRequestReport = {...iouReport}; + const diff = computeDiffAmount(iouReport, updatedTransaction, transaction); + + if (ReportUtils.isExpenseReport(iouReport) && typeof updatedMoneyRequestReport.total === 'number') { + // For expense report, the amount is negative so we should subtract total from diff + updatedMoneyRequestReport.total -= diff; + } else { + updatedMoneyRequestReport = IOUUtils.updateIOUOwnerAndTotal(iouReport, updatedReportAction?.actorAccountID ?? -1, diff, TransactionUtils.getCurrency(updatedTransaction), false); + } + updatedMoneyRequestReport.cachedTotal = CurrencyUtils.convertToDisplayString(updatedMoneyRequestReport.total, updatedTransaction?.modifiedCurrency); + optimisticData.push({ onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT}${iouReport?.reportID}`, From 0626907cda6fa904489462cf04dd8dd7b2d2768a Mon Sep 17 00:00:00 2001 From: dukenv0307 Date: Wed, 7 Feb 2024 17:07:05 +0700 Subject: [PATCH 118/288] fix ts error --- src/libs/actions/IOU.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index ba54eac56fdb..209ff2df04d6 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -1082,7 +1082,9 @@ function getUpdateMoneyRequestParams( // For expense report, the amount is negative so we should subtract total from diff updatedMoneyRequestReport.total -= diff; } else { - updatedMoneyRequestReport = IOUUtils.updateIOUOwnerAndTotal(iouReport, updatedReportAction?.actorAccountID ?? -1, diff, TransactionUtils.getCurrency(updatedTransaction), false); + updatedMoneyRequestReport = iouReport + ? IOUUtils.updateIOUOwnerAndTotal(iouReport, updatedReportAction.actorAccountID ?? -1, diff, TransactionUtils.getCurrency(transaction), false) + : {}; } updatedMoneyRequestReport.cachedTotal = CurrencyUtils.convertToDisplayString(updatedMoneyRequestReport.total, updatedTransaction?.modifiedCurrency); From 271bd238cda8b36d14f089962a20ea2e06195b6f Mon Sep 17 00:00:00 2001 From: dukenv0307 Date: Wed, 7 Feb 2024 17:12:37 +0700 Subject: [PATCH 119/288] fix prettier --- src/libs/actions/IOU.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index 209ff2df04d6..3acbf3c03895 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -983,10 +983,12 @@ function computeDiffAmount(iouReport: OnyxEntry, updatedTransa if (updatedCurrency === iouReport?.currency && currentCurrency !== iouReport?.currency) { // add the diff with the total if we change the currency from different currency to the currency of the iou report return TransactionUtils.getAmount(updatedTransaction, isExpenseReport); - } if (updatedCurrency !== iouReport?.currency && currentCurrency === iouReport?.currency) { + } + if (updatedCurrency !== iouReport?.currency && currentCurrency === iouReport?.currency) { // subtract the diff with the total if we change the currency from the currency of iou report to different currency return -TransactionUtils.getAmount(updatedTransaction, isExpenseReport); - } if (updatedCurrency === iouReport?.currency && updatedTransaction?.modifiedAmount) { + } + if (updatedCurrency === iouReport?.currency && updatedTransaction?.modifiedAmount) { // get the diff between the updated amount and the current amount if we change the amount and the currency of the transaction is the currency of the report return TransactionUtils.getAmount(updatedTransaction, isExpenseReport) - TransactionUtils.getAmount(transaction, isExpenseReport); } @@ -1083,8 +1085,8 @@ function getUpdateMoneyRequestParams( updatedMoneyRequestReport.total -= diff; } else { updatedMoneyRequestReport = iouReport - ? IOUUtils.updateIOUOwnerAndTotal(iouReport, updatedReportAction.actorAccountID ?? -1, diff, TransactionUtils.getCurrency(transaction), false) - : {}; + ? IOUUtils.updateIOUOwnerAndTotal(iouReport, updatedReportAction.actorAccountID ?? -1, diff, TransactionUtils.getCurrency(transaction), false) + : {}; } updatedMoneyRequestReport.cachedTotal = CurrencyUtils.convertToDisplayString(updatedMoneyRequestReport.total, updatedTransaction?.modifiedCurrency); From aed151f80f85210509a6bea160ba5e7c4489408b Mon Sep 17 00:00:00 2001 From: Jakub Butkiewicz Date: Wed, 7 Feb 2024 12:28:55 +0100 Subject: [PATCH 120/288] ref: move versionUpdaterTest to TS --- .github/libs/versionUpdater.js | 4 ++-- tests/unit/{versionUpdaterTest.js => versionUpdaterTest.ts} | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) rename tests/unit/{versionUpdaterTest.js => versionUpdaterTest.ts} (97%) diff --git a/.github/libs/versionUpdater.js b/.github/libs/versionUpdater.js index 78e8085621bd..61c8028e4e65 100644 --- a/.github/libs/versionUpdater.js +++ b/.github/libs/versionUpdater.js @@ -65,8 +65,8 @@ const incrementPatch = (major, minor, patch) => { /** * Increments a build version * - * @param {Number} version - * @param {Number} level + * @param {String} version + * @param {String} level * @returns {String} */ const incrementVersion = (version, level) => { diff --git a/tests/unit/versionUpdaterTest.js b/tests/unit/versionUpdaterTest.ts similarity index 97% rename from tests/unit/versionUpdaterTest.js rename to tests/unit/versionUpdaterTest.ts index 2e88f8dde3f7..d80f3f06be6d 100644 --- a/tests/unit/versionUpdaterTest.js +++ b/tests/unit/versionUpdaterTest.ts @@ -1,7 +1,7 @@ -const versionUpdater = require('../../.github/libs/versionUpdater'); +import versionUpdater from '../../.github/libs/versionUpdater'; const VERSION = '2.3.9-80'; -const VERSION_NUMBER = [2, 3, 9, 80]; +const VERSION_NUMBER = [2, 3, 9, 80] as const; describe('versionUpdater', () => { describe('getVersionNumberFromString', () => { From a15914cc282cc0b4baaf524901ac78f3baccce5e Mon Sep 17 00:00:00 2001 From: Jakub Butkiewicz Date: Wed, 7 Feb 2024 14:10:48 +0100 Subject: [PATCH 121/288] fix: github action types --- .../actions/javascript/bumpVersion/index.js | 4 +- .../createOrUpdateStagingDeploy/index.js | 2598 ++++++++--------- .../getDeployPullRequestList/index.js | 2598 ++++++++--------- .../javascript/getPreviousVersion/index.js | 4 +- 4 files changed, 2602 insertions(+), 2602 deletions(-) diff --git a/.github/actions/javascript/bumpVersion/index.js b/.github/actions/javascript/bumpVersion/index.js index 1132c137061e..1683894c67e4 100644 --- a/.github/actions/javascript/bumpVersion/index.js +++ b/.github/actions/javascript/bumpVersion/index.js @@ -173,8 +173,8 @@ const incrementPatch = (major, minor, patch) => { /** * Increments a build version * - * @param {Number} version - * @param {Number} level + * @param {String} version + * @param {String} level * @returns {String} */ const incrementVersion = (version, level) => { diff --git a/.github/actions/javascript/createOrUpdateStagingDeploy/index.js b/.github/actions/javascript/createOrUpdateStagingDeploy/index.js index 4116862da777..33965216b880 100644 --- a/.github/actions/javascript/createOrUpdateStagingDeploy/index.js +++ b/.github/actions/javascript/createOrUpdateStagingDeploy/index.js @@ -978,8 +978,8 @@ const incrementPatch = (major, minor, patch) => { /** * Increments a build version * - * @param {Number} version - * @param {Number} level + * @param {String} version + * @param {String} level * @returns {String} */ const incrementVersion = (version, level) => { @@ -14468,1303 +14468,1303 @@ exports.parseURL = __nccwpck_require__(33).parseURL; /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; - -const punycode = __nccwpck_require__(5477); -const tr46 = __nccwpck_require__(2299); - -const specialSchemes = { - ftp: 21, - file: null, - gopher: 70, - http: 80, - https: 443, - ws: 80, - wss: 443 -}; - -const failure = Symbol("failure"); - -function countSymbols(str) { - return punycode.ucs2.decode(str).length; -} - -function at(input, idx) { - const c = input[idx]; - return isNaN(c) ? undefined : String.fromCodePoint(c); -} - -function isASCIIDigit(c) { - return c >= 0x30 && c <= 0x39; -} - -function isASCIIAlpha(c) { - return (c >= 0x41 && c <= 0x5A) || (c >= 0x61 && c <= 0x7A); -} - -function isASCIIAlphanumeric(c) { - return isASCIIAlpha(c) || isASCIIDigit(c); -} - -function isASCIIHex(c) { - return isASCIIDigit(c) || (c >= 0x41 && c <= 0x46) || (c >= 0x61 && c <= 0x66); -} - -function isSingleDot(buffer) { - return buffer === "." || buffer.toLowerCase() === "%2e"; -} - -function isDoubleDot(buffer) { - buffer = buffer.toLowerCase(); - return buffer === ".." || buffer === "%2e." || buffer === ".%2e" || buffer === "%2e%2e"; -} - -function isWindowsDriveLetterCodePoints(cp1, cp2) { - return isASCIIAlpha(cp1) && (cp2 === 58 || cp2 === 124); -} - -function isWindowsDriveLetterString(string) { - return string.length === 2 && isASCIIAlpha(string.codePointAt(0)) && (string[1] === ":" || string[1] === "|"); -} - -function isNormalizedWindowsDriveLetterString(string) { - return string.length === 2 && isASCIIAlpha(string.codePointAt(0)) && string[1] === ":"; -} - -function containsForbiddenHostCodePoint(string) { - return string.search(/\u0000|\u0009|\u000A|\u000D|\u0020|#|%|\/|:|\?|@|\[|\\|\]/) !== -1; -} - -function containsForbiddenHostCodePointExcludingPercent(string) { - return string.search(/\u0000|\u0009|\u000A|\u000D|\u0020|#|\/|:|\?|@|\[|\\|\]/) !== -1; -} - -function isSpecialScheme(scheme) { - return specialSchemes[scheme] !== undefined; -} - -function isSpecial(url) { - return isSpecialScheme(url.scheme); -} - -function defaultPort(scheme) { - return specialSchemes[scheme]; -} - -function percentEncode(c) { - let hex = c.toString(16).toUpperCase(); - if (hex.length === 1) { - hex = "0" + hex; - } - - return "%" + hex; -} - -function utf8PercentEncode(c) { - const buf = new Buffer(c); - - let str = ""; - - for (let i = 0; i < buf.length; ++i) { - str += percentEncode(buf[i]); - } - - return str; -} - -function utf8PercentDecode(str) { - const input = new Buffer(str); - const output = []; - for (let i = 0; i < input.length; ++i) { - if (input[i] !== 37) { - output.push(input[i]); - } else if (input[i] === 37 && isASCIIHex(input[i + 1]) && isASCIIHex(input[i + 2])) { - output.push(parseInt(input.slice(i + 1, i + 3).toString(), 16)); - i += 2; - } else { - output.push(input[i]); - } - } - return new Buffer(output).toString(); -} - -function isC0ControlPercentEncode(c) { - return c <= 0x1F || c > 0x7E; -} - -const extraPathPercentEncodeSet = new Set([32, 34, 35, 60, 62, 63, 96, 123, 125]); -function isPathPercentEncode(c) { - return isC0ControlPercentEncode(c) || extraPathPercentEncodeSet.has(c); -} - -const extraUserinfoPercentEncodeSet = - new Set([47, 58, 59, 61, 64, 91, 92, 93, 94, 124]); -function isUserinfoPercentEncode(c) { - return isPathPercentEncode(c) || extraUserinfoPercentEncodeSet.has(c); -} - -function percentEncodeChar(c, encodeSetPredicate) { - const cStr = String.fromCodePoint(c); - - if (encodeSetPredicate(c)) { - return utf8PercentEncode(cStr); - } - - return cStr; -} - -function parseIPv4Number(input) { - let R = 10; - - if (input.length >= 2 && input.charAt(0) === "0" && input.charAt(1).toLowerCase() === "x") { - input = input.substring(2); - R = 16; - } else if (input.length >= 2 && input.charAt(0) === "0") { - input = input.substring(1); - R = 8; - } - - if (input === "") { - return 0; - } - - const regex = R === 10 ? /[^0-9]/ : (R === 16 ? /[^0-9A-Fa-f]/ : /[^0-7]/); - if (regex.test(input)) { - return failure; - } - - return parseInt(input, R); -} - -function parseIPv4(input) { - const parts = input.split("."); - if (parts[parts.length - 1] === "") { - if (parts.length > 1) { - parts.pop(); - } - } - - if (parts.length > 4) { - return input; - } - - const numbers = []; - for (const part of parts) { - if (part === "") { - return input; - } - const n = parseIPv4Number(part); - if (n === failure) { - return input; - } - - numbers.push(n); - } - - for (let i = 0; i < numbers.length - 1; ++i) { - if (numbers[i] > 255) { - return failure; - } - } - if (numbers[numbers.length - 1] >= Math.pow(256, 5 - numbers.length)) { - return failure; - } - - let ipv4 = numbers.pop(); - let counter = 0; - - for (const n of numbers) { - ipv4 += n * Math.pow(256, 3 - counter); - ++counter; - } - - return ipv4; -} - -function serializeIPv4(address) { - let output = ""; - let n = address; - - for (let i = 1; i <= 4; ++i) { - output = String(n % 256) + output; - if (i !== 4) { - output = "." + output; - } - n = Math.floor(n / 256); - } - - return output; -} - -function parseIPv6(input) { - const address = [0, 0, 0, 0, 0, 0, 0, 0]; - let pieceIndex = 0; - let compress = null; - let pointer = 0; - - input = punycode.ucs2.decode(input); - - if (input[pointer] === 58) { - if (input[pointer + 1] !== 58) { - return failure; - } - - pointer += 2; - ++pieceIndex; - compress = pieceIndex; - } - - while (pointer < input.length) { - if (pieceIndex === 8) { - return failure; - } - - if (input[pointer] === 58) { - if (compress !== null) { - return failure; - } - ++pointer; - ++pieceIndex; - compress = pieceIndex; - continue; - } - - let value = 0; - let length = 0; - - while (length < 4 && isASCIIHex(input[pointer])) { - value = value * 0x10 + parseInt(at(input, pointer), 16); - ++pointer; - ++length; - } - - if (input[pointer] === 46) { - if (length === 0) { - return failure; - } - - pointer -= length; - - if (pieceIndex > 6) { - return failure; - } - - let numbersSeen = 0; - - while (input[pointer] !== undefined) { - let ipv4Piece = null; - - if (numbersSeen > 0) { - if (input[pointer] === 46 && numbersSeen < 4) { - ++pointer; - } else { - return failure; - } - } - - if (!isASCIIDigit(input[pointer])) { - return failure; - } - - while (isASCIIDigit(input[pointer])) { - const number = parseInt(at(input, pointer)); - if (ipv4Piece === null) { - ipv4Piece = number; - } else if (ipv4Piece === 0) { - return failure; - } else { - ipv4Piece = ipv4Piece * 10 + number; - } - if (ipv4Piece > 255) { - return failure; - } - ++pointer; - } - - address[pieceIndex] = address[pieceIndex] * 0x100 + ipv4Piece; - - ++numbersSeen; - - if (numbersSeen === 2 || numbersSeen === 4) { - ++pieceIndex; - } - } - - if (numbersSeen !== 4) { - return failure; - } - - break; - } else if (input[pointer] === 58) { - ++pointer; - if (input[pointer] === undefined) { - return failure; - } - } else if (input[pointer] !== undefined) { - return failure; - } - - address[pieceIndex] = value; - ++pieceIndex; - } - - if (compress !== null) { - let swaps = pieceIndex - compress; - pieceIndex = 7; - while (pieceIndex !== 0 && swaps > 0) { - const temp = address[compress + swaps - 1]; - address[compress + swaps - 1] = address[pieceIndex]; - address[pieceIndex] = temp; - --pieceIndex; - --swaps; - } - } else if (compress === null && pieceIndex !== 8) { - return failure; - } - - return address; -} - -function serializeIPv6(address) { - let output = ""; - const seqResult = findLongestZeroSequence(address); - const compress = seqResult.idx; - let ignore0 = false; - - for (let pieceIndex = 0; pieceIndex <= 7; ++pieceIndex) { - if (ignore0 && address[pieceIndex] === 0) { - continue; - } else if (ignore0) { - ignore0 = false; - } - - if (compress === pieceIndex) { - const separator = pieceIndex === 0 ? "::" : ":"; - output += separator; - ignore0 = true; - continue; - } - - output += address[pieceIndex].toString(16); - - if (pieceIndex !== 7) { - output += ":"; - } - } - - return output; -} - -function parseHost(input, isSpecialArg) { - if (input[0] === "[") { - if (input[input.length - 1] !== "]") { - return failure; - } - - return parseIPv6(input.substring(1, input.length - 1)); - } - - if (!isSpecialArg) { - return parseOpaqueHost(input); - } - - const domain = utf8PercentDecode(input); - const asciiDomain = tr46.toASCII(domain, false, tr46.PROCESSING_OPTIONS.NONTRANSITIONAL, false); - if (asciiDomain === null) { - return failure; - } - - if (containsForbiddenHostCodePoint(asciiDomain)) { - return failure; - } - - const ipv4Host = parseIPv4(asciiDomain); - if (typeof ipv4Host === "number" || ipv4Host === failure) { - return ipv4Host; - } - - return asciiDomain; -} - -function parseOpaqueHost(input) { - if (containsForbiddenHostCodePointExcludingPercent(input)) { - return failure; - } - - let output = ""; - const decoded = punycode.ucs2.decode(input); - for (let i = 0; i < decoded.length; ++i) { - output += percentEncodeChar(decoded[i], isC0ControlPercentEncode); - } - return output; -} - -function findLongestZeroSequence(arr) { - let maxIdx = null; - let maxLen = 1; // only find elements > 1 - let currStart = null; - let currLen = 0; - - for (let i = 0; i < arr.length; ++i) { - if (arr[i] !== 0) { - if (currLen > maxLen) { - maxIdx = currStart; - maxLen = currLen; - } - - currStart = null; - currLen = 0; - } else { - if (currStart === null) { - currStart = i; - } - ++currLen; - } - } - - // if trailing zeros - if (currLen > maxLen) { - maxIdx = currStart; - maxLen = currLen; - } - - return { - idx: maxIdx, - len: maxLen - }; -} - -function serializeHost(host) { - if (typeof host === "number") { - return serializeIPv4(host); - } - - // IPv6 serializer - if (host instanceof Array) { - return "[" + serializeIPv6(host) + "]"; - } - - return host; -} - -function trimControlChars(url) { - return url.replace(/^[\u0000-\u001F\u0020]+|[\u0000-\u001F\u0020]+$/g, ""); -} - -function trimTabAndNewline(url) { - return url.replace(/\u0009|\u000A|\u000D/g, ""); -} - -function shortenPath(url) { - const path = url.path; - if (path.length === 0) { - return; - } - if (url.scheme === "file" && path.length === 1 && isNormalizedWindowsDriveLetter(path[0])) { - return; - } - - path.pop(); -} - -function includesCredentials(url) { - return url.username !== "" || url.password !== ""; -} - -function cannotHaveAUsernamePasswordPort(url) { - return url.host === null || url.host === "" || url.cannotBeABaseURL || url.scheme === "file"; -} - -function isNormalizedWindowsDriveLetter(string) { - return /^[A-Za-z]:$/.test(string); -} - -function URLStateMachine(input, base, encodingOverride, url, stateOverride) { - this.pointer = 0; - this.input = input; - this.base = base || null; - this.encodingOverride = encodingOverride || "utf-8"; - this.stateOverride = stateOverride; - this.url = url; - this.failure = false; - this.parseError = false; - - if (!this.url) { - this.url = { - scheme: "", - username: "", - password: "", - host: null, - port: null, - path: [], - query: null, - fragment: null, - - cannotBeABaseURL: false - }; - - const res = trimControlChars(this.input); - if (res !== this.input) { - this.parseError = true; - } - this.input = res; - } - - const res = trimTabAndNewline(this.input); - if (res !== this.input) { - this.parseError = true; - } - this.input = res; - - this.state = stateOverride || "scheme start"; - - this.buffer = ""; - this.atFlag = false; - this.arrFlag = false; - this.passwordTokenSeenFlag = false; - - this.input = punycode.ucs2.decode(this.input); - - for (; this.pointer <= this.input.length; ++this.pointer) { - const c = this.input[this.pointer]; - const cStr = isNaN(c) ? undefined : String.fromCodePoint(c); - - // exec state machine - const ret = this["parse " + this.state](c, cStr); - if (!ret) { - break; // terminate algorithm - } else if (ret === failure) { - this.failure = true; - break; - } - } -} - -URLStateMachine.prototype["parse scheme start"] = function parseSchemeStart(c, cStr) { - if (isASCIIAlpha(c)) { - this.buffer += cStr.toLowerCase(); - this.state = "scheme"; - } else if (!this.stateOverride) { - this.state = "no scheme"; - --this.pointer; - } else { - this.parseError = true; - return failure; - } - - return true; -}; - -URLStateMachine.prototype["parse scheme"] = function parseScheme(c, cStr) { - if (isASCIIAlphanumeric(c) || c === 43 || c === 45 || c === 46) { - this.buffer += cStr.toLowerCase(); - } else if (c === 58) { - if (this.stateOverride) { - if (isSpecial(this.url) && !isSpecialScheme(this.buffer)) { - return false; - } - - if (!isSpecial(this.url) && isSpecialScheme(this.buffer)) { - return false; - } - - if ((includesCredentials(this.url) || this.url.port !== null) && this.buffer === "file") { - return false; - } - - if (this.url.scheme === "file" && (this.url.host === "" || this.url.host === null)) { - return false; - } - } - this.url.scheme = this.buffer; - this.buffer = ""; - if (this.stateOverride) { - return false; - } - if (this.url.scheme === "file") { - if (this.input[this.pointer + 1] !== 47 || this.input[this.pointer + 2] !== 47) { - this.parseError = true; - } - this.state = "file"; - } else if (isSpecial(this.url) && this.base !== null && this.base.scheme === this.url.scheme) { - this.state = "special relative or authority"; - } else if (isSpecial(this.url)) { - this.state = "special authority slashes"; - } else if (this.input[this.pointer + 1] === 47) { - this.state = "path or authority"; - ++this.pointer; - } else { - this.url.cannotBeABaseURL = true; - this.url.path.push(""); - this.state = "cannot-be-a-base-URL path"; - } - } else if (!this.stateOverride) { - this.buffer = ""; - this.state = "no scheme"; - this.pointer = -1; - } else { - this.parseError = true; - return failure; - } - - return true; -}; - -URLStateMachine.prototype["parse no scheme"] = function parseNoScheme(c) { - if (this.base === null || (this.base.cannotBeABaseURL && c !== 35)) { - return failure; - } else if (this.base.cannotBeABaseURL && c === 35) { - this.url.scheme = this.base.scheme; - this.url.path = this.base.path.slice(); - this.url.query = this.base.query; - this.url.fragment = ""; - this.url.cannotBeABaseURL = true; - this.state = "fragment"; - } else if (this.base.scheme === "file") { - this.state = "file"; - --this.pointer; - } else { - this.state = "relative"; - --this.pointer; - } - - return true; -}; - -URLStateMachine.prototype["parse special relative or authority"] = function parseSpecialRelativeOrAuthority(c) { - if (c === 47 && this.input[this.pointer + 1] === 47) { - this.state = "special authority ignore slashes"; - ++this.pointer; - } else { - this.parseError = true; - this.state = "relative"; - --this.pointer; - } - - return true; -}; - -URLStateMachine.prototype["parse path or authority"] = function parsePathOrAuthority(c) { - if (c === 47) { - this.state = "authority"; - } else { - this.state = "path"; - --this.pointer; - } - - return true; -}; - -URLStateMachine.prototype["parse relative"] = function parseRelative(c) { - this.url.scheme = this.base.scheme; - if (isNaN(c)) { - this.url.username = this.base.username; - this.url.password = this.base.password; - this.url.host = this.base.host; - this.url.port = this.base.port; - this.url.path = this.base.path.slice(); - this.url.query = this.base.query; - } else if (c === 47) { - this.state = "relative slash"; - } else if (c === 63) { - this.url.username = this.base.username; - this.url.password = this.base.password; - this.url.host = this.base.host; - this.url.port = this.base.port; - this.url.path = this.base.path.slice(); - this.url.query = ""; - this.state = "query"; - } else if (c === 35) { - this.url.username = this.base.username; - this.url.password = this.base.password; - this.url.host = this.base.host; - this.url.port = this.base.port; - this.url.path = this.base.path.slice(); - this.url.query = this.base.query; - this.url.fragment = ""; - this.state = "fragment"; - } else if (isSpecial(this.url) && c === 92) { - this.parseError = true; - this.state = "relative slash"; - } else { - this.url.username = this.base.username; - this.url.password = this.base.password; - this.url.host = this.base.host; - this.url.port = this.base.port; - this.url.path = this.base.path.slice(0, this.base.path.length - 1); - - this.state = "path"; - --this.pointer; - } - - return true; -}; - -URLStateMachine.prototype["parse relative slash"] = function parseRelativeSlash(c) { - if (isSpecial(this.url) && (c === 47 || c === 92)) { - if (c === 92) { - this.parseError = true; - } - this.state = "special authority ignore slashes"; - } else if (c === 47) { - this.state = "authority"; - } else { - this.url.username = this.base.username; - this.url.password = this.base.password; - this.url.host = this.base.host; - this.url.port = this.base.port; - this.state = "path"; - --this.pointer; - } - - return true; -}; - -URLStateMachine.prototype["parse special authority slashes"] = function parseSpecialAuthoritySlashes(c) { - if (c === 47 && this.input[this.pointer + 1] === 47) { - this.state = "special authority ignore slashes"; - ++this.pointer; - } else { - this.parseError = true; - this.state = "special authority ignore slashes"; - --this.pointer; - } - - return true; -}; - -URLStateMachine.prototype["parse special authority ignore slashes"] = function parseSpecialAuthorityIgnoreSlashes(c) { - if (c !== 47 && c !== 92) { - this.state = "authority"; - --this.pointer; - } else { - this.parseError = true; - } - - return true; -}; - -URLStateMachine.prototype["parse authority"] = function parseAuthority(c, cStr) { - if (c === 64) { - this.parseError = true; - if (this.atFlag) { - this.buffer = "%40" + this.buffer; - } - this.atFlag = true; - - // careful, this is based on buffer and has its own pointer (this.pointer != pointer) and inner chars - const len = countSymbols(this.buffer); - for (let pointer = 0; pointer < len; ++pointer) { - const codePoint = this.buffer.codePointAt(pointer); - - if (codePoint === 58 && !this.passwordTokenSeenFlag) { - this.passwordTokenSeenFlag = true; - continue; - } - const encodedCodePoints = percentEncodeChar(codePoint, isUserinfoPercentEncode); - if (this.passwordTokenSeenFlag) { - this.url.password += encodedCodePoints; - } else { - this.url.username += encodedCodePoints; - } - } - this.buffer = ""; - } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || - (isSpecial(this.url) && c === 92)) { - if (this.atFlag && this.buffer === "") { - this.parseError = true; - return failure; - } - this.pointer -= countSymbols(this.buffer) + 1; - this.buffer = ""; - this.state = "host"; - } else { - this.buffer += cStr; - } - - return true; -}; - -URLStateMachine.prototype["parse hostname"] = -URLStateMachine.prototype["parse host"] = function parseHostName(c, cStr) { - if (this.stateOverride && this.url.scheme === "file") { - --this.pointer; - this.state = "file host"; - } else if (c === 58 && !this.arrFlag) { - if (this.buffer === "") { - this.parseError = true; - return failure; - } - - const host = parseHost(this.buffer, isSpecial(this.url)); - if (host === failure) { - return failure; - } - - this.url.host = host; - this.buffer = ""; - this.state = "port"; - if (this.stateOverride === "hostname") { - return false; - } - } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || - (isSpecial(this.url) && c === 92)) { - --this.pointer; - if (isSpecial(this.url) && this.buffer === "") { - this.parseError = true; - return failure; - } else if (this.stateOverride && this.buffer === "" && - (includesCredentials(this.url) || this.url.port !== null)) { - this.parseError = true; - return false; - } - - const host = parseHost(this.buffer, isSpecial(this.url)); - if (host === failure) { - return failure; - } - - this.url.host = host; - this.buffer = ""; - this.state = "path start"; - if (this.stateOverride) { - return false; - } - } else { - if (c === 91) { - this.arrFlag = true; - } else if (c === 93) { - this.arrFlag = false; - } - this.buffer += cStr; - } - - return true; -}; - -URLStateMachine.prototype["parse port"] = function parsePort(c, cStr) { - if (isASCIIDigit(c)) { - this.buffer += cStr; - } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || - (isSpecial(this.url) && c === 92) || - this.stateOverride) { - if (this.buffer !== "") { - const port = parseInt(this.buffer); - if (port > Math.pow(2, 16) - 1) { - this.parseError = true; - return failure; - } - this.url.port = port === defaultPort(this.url.scheme) ? null : port; - this.buffer = ""; - } - if (this.stateOverride) { - return false; - } - this.state = "path start"; - --this.pointer; - } else { - this.parseError = true; - return failure; - } - - return true; -}; - -const fileOtherwiseCodePoints = new Set([47, 92, 63, 35]); - -URLStateMachine.prototype["parse file"] = function parseFile(c) { - this.url.scheme = "file"; - - if (c === 47 || c === 92) { - if (c === 92) { - this.parseError = true; - } - this.state = "file slash"; - } else if (this.base !== null && this.base.scheme === "file") { - if (isNaN(c)) { - this.url.host = this.base.host; - this.url.path = this.base.path.slice(); - this.url.query = this.base.query; - } else if (c === 63) { - this.url.host = this.base.host; - this.url.path = this.base.path.slice(); - this.url.query = ""; - this.state = "query"; - } else if (c === 35) { - this.url.host = this.base.host; - this.url.path = this.base.path.slice(); - this.url.query = this.base.query; - this.url.fragment = ""; - this.state = "fragment"; - } else { - if (this.input.length - this.pointer - 1 === 0 || // remaining consists of 0 code points - !isWindowsDriveLetterCodePoints(c, this.input[this.pointer + 1]) || - (this.input.length - this.pointer - 1 >= 2 && // remaining has at least 2 code points - !fileOtherwiseCodePoints.has(this.input[this.pointer + 2]))) { - this.url.host = this.base.host; - this.url.path = this.base.path.slice(); - shortenPath(this.url); - } else { - this.parseError = true; - } - - this.state = "path"; - --this.pointer; - } - } else { - this.state = "path"; - --this.pointer; - } - - return true; -}; - -URLStateMachine.prototype["parse file slash"] = function parseFileSlash(c) { - if (c === 47 || c === 92) { - if (c === 92) { - this.parseError = true; - } - this.state = "file host"; - } else { - if (this.base !== null && this.base.scheme === "file") { - if (isNormalizedWindowsDriveLetterString(this.base.path[0])) { - this.url.path.push(this.base.path[0]); - } else { - this.url.host = this.base.host; - } - } - this.state = "path"; - --this.pointer; - } - - return true; -}; - -URLStateMachine.prototype["parse file host"] = function parseFileHost(c, cStr) { - if (isNaN(c) || c === 47 || c === 92 || c === 63 || c === 35) { - --this.pointer; - if (!this.stateOverride && isWindowsDriveLetterString(this.buffer)) { - this.parseError = true; - this.state = "path"; - } else if (this.buffer === "") { - this.url.host = ""; - if (this.stateOverride) { - return false; - } - this.state = "path start"; - } else { - let host = parseHost(this.buffer, isSpecial(this.url)); - if (host === failure) { - return failure; - } - if (host === "localhost") { - host = ""; - } - this.url.host = host; - - if (this.stateOverride) { - return false; - } - - this.buffer = ""; - this.state = "path start"; - } - } else { - this.buffer += cStr; - } - - return true; -}; - -URLStateMachine.prototype["parse path start"] = function parsePathStart(c) { - if (isSpecial(this.url)) { - if (c === 92) { - this.parseError = true; - } - this.state = "path"; - - if (c !== 47 && c !== 92) { - --this.pointer; - } - } else if (!this.stateOverride && c === 63) { - this.url.query = ""; - this.state = "query"; - } else if (!this.stateOverride && c === 35) { - this.url.fragment = ""; - this.state = "fragment"; - } else if (c !== undefined) { - this.state = "path"; - if (c !== 47) { - --this.pointer; - } - } - - return true; -}; - -URLStateMachine.prototype["parse path"] = function parsePath(c) { - if (isNaN(c) || c === 47 || (isSpecial(this.url) && c === 92) || - (!this.stateOverride && (c === 63 || c === 35))) { - if (isSpecial(this.url) && c === 92) { - this.parseError = true; - } - - if (isDoubleDot(this.buffer)) { - shortenPath(this.url); - if (c !== 47 && !(isSpecial(this.url) && c === 92)) { - this.url.path.push(""); - } - } else if (isSingleDot(this.buffer) && c !== 47 && - !(isSpecial(this.url) && c === 92)) { - this.url.path.push(""); - } else if (!isSingleDot(this.buffer)) { - if (this.url.scheme === "file" && this.url.path.length === 0 && isWindowsDriveLetterString(this.buffer)) { - if (this.url.host !== "" && this.url.host !== null) { - this.parseError = true; - this.url.host = ""; - } - this.buffer = this.buffer[0] + ":"; - } - this.url.path.push(this.buffer); - } - this.buffer = ""; - if (this.url.scheme === "file" && (c === undefined || c === 63 || c === 35)) { - while (this.url.path.length > 1 && this.url.path[0] === "") { - this.parseError = true; - this.url.path.shift(); - } - } - if (c === 63) { - this.url.query = ""; - this.state = "query"; - } - if (c === 35) { - this.url.fragment = ""; - this.state = "fragment"; - } - } else { - // TODO: If c is not a URL code point and not "%", parse error. - - if (c === 37 && - (!isASCIIHex(this.input[this.pointer + 1]) || - !isASCIIHex(this.input[this.pointer + 2]))) { - this.parseError = true; - } - - this.buffer += percentEncodeChar(c, isPathPercentEncode); - } - - return true; -}; - -URLStateMachine.prototype["parse cannot-be-a-base-URL path"] = function parseCannotBeABaseURLPath(c) { - if (c === 63) { - this.url.query = ""; - this.state = "query"; - } else if (c === 35) { - this.url.fragment = ""; - this.state = "fragment"; - } else { - // TODO: Add: not a URL code point - if (!isNaN(c) && c !== 37) { - this.parseError = true; - } - - if (c === 37 && - (!isASCIIHex(this.input[this.pointer + 1]) || - !isASCIIHex(this.input[this.pointer + 2]))) { - this.parseError = true; - } - - if (!isNaN(c)) { - this.url.path[0] = this.url.path[0] + percentEncodeChar(c, isC0ControlPercentEncode); - } - } - - return true; -}; - -URLStateMachine.prototype["parse query"] = function parseQuery(c, cStr) { - if (isNaN(c) || (!this.stateOverride && c === 35)) { - if (!isSpecial(this.url) || this.url.scheme === "ws" || this.url.scheme === "wss") { - this.encodingOverride = "utf-8"; - } - - const buffer = new Buffer(this.buffer); // TODO: Use encoding override instead - for (let i = 0; i < buffer.length; ++i) { - if (buffer[i] < 0x21 || buffer[i] > 0x7E || buffer[i] === 0x22 || buffer[i] === 0x23 || - buffer[i] === 0x3C || buffer[i] === 0x3E) { - this.url.query += percentEncode(buffer[i]); - } else { - this.url.query += String.fromCodePoint(buffer[i]); - } - } - - this.buffer = ""; - if (c === 35) { - this.url.fragment = ""; - this.state = "fragment"; - } - } else { - // TODO: If c is not a URL code point and not "%", parse error. - if (c === 37 && - (!isASCIIHex(this.input[this.pointer + 1]) || - !isASCIIHex(this.input[this.pointer + 2]))) { - this.parseError = true; - } - - this.buffer += cStr; - } - - return true; -}; - -URLStateMachine.prototype["parse fragment"] = function parseFragment(c) { - if (isNaN(c)) { // do nothing - } else if (c === 0x0) { - this.parseError = true; - } else { - // TODO: If c is not a URL code point and not "%", parse error. - if (c === 37 && - (!isASCIIHex(this.input[this.pointer + 1]) || - !isASCIIHex(this.input[this.pointer + 2]))) { - this.parseError = true; - } - - this.url.fragment += percentEncodeChar(c, isC0ControlPercentEncode); - } - - return true; -}; - -function serializeURL(url, excludeFragment) { - let output = url.scheme + ":"; - if (url.host !== null) { - output += "//"; - - if (url.username !== "" || url.password !== "") { - output += url.username; - if (url.password !== "") { - output += ":" + url.password; - } - output += "@"; - } - - output += serializeHost(url.host); - - if (url.port !== null) { - output += ":" + url.port; - } - } else if (url.host === null && url.scheme === "file") { - output += "//"; - } - - if (url.cannotBeABaseURL) { - output += url.path[0]; - } else { - for (const string of url.path) { - output += "/" + string; - } - } - - if (url.query !== null) { - output += "?" + url.query; - } - - if (!excludeFragment && url.fragment !== null) { - output += "#" + url.fragment; - } - - return output; -} - -function serializeOrigin(tuple) { - let result = tuple.scheme + "://"; - result += serializeHost(tuple.host); - - if (tuple.port !== null) { - result += ":" + tuple.port; - } - - return result; -} - -module.exports.serializeURL = serializeURL; - -module.exports.serializeURLOrigin = function (url) { - // https://url.spec.whatwg.org/#concept-url-origin - switch (url.scheme) { - case "blob": - try { - return module.exports.serializeURLOrigin(module.exports.parseURL(url.path[0])); - } catch (e) { - // serializing an opaque origin returns "null" - return "null"; - } - case "ftp": - case "gopher": - case "http": - case "https": - case "ws": - case "wss": - return serializeOrigin({ - scheme: url.scheme, - host: url.host, - port: url.port - }); - case "file": - // spec says "exercise to the reader", chrome says "file://" - return "file://"; - default: - // serializing an opaque origin returns "null" - return "null"; - } -}; - -module.exports.basicURLParse = function (input, options) { - if (options === undefined) { - options = {}; - } - - const usm = new URLStateMachine(input, options.baseURL, options.encodingOverride, options.url, options.stateOverride); - if (usm.failure) { - return "failure"; - } - - return usm.url; -}; - -module.exports.setTheUsername = function (url, username) { - url.username = ""; - const decoded = punycode.ucs2.decode(username); - for (let i = 0; i < decoded.length; ++i) { - url.username += percentEncodeChar(decoded[i], isUserinfoPercentEncode); - } -}; - -module.exports.setThePassword = function (url, password) { - url.password = ""; - const decoded = punycode.ucs2.decode(password); - for (let i = 0; i < decoded.length; ++i) { - url.password += percentEncodeChar(decoded[i], isUserinfoPercentEncode); - } -}; - -module.exports.serializeHost = serializeHost; - -module.exports.cannotHaveAUsernamePasswordPort = cannotHaveAUsernamePasswordPort; - -module.exports.serializeInteger = function (integer) { - return String(integer); -}; - -module.exports.parseURL = function (input, options) { - if (options === undefined) { - options = {}; - } - - // We don't handle blobs, so this just delegates: - return module.exports.basicURLParse(input, { baseURL: options.baseURL, encodingOverride: options.encodingOverride }); -}; + +const punycode = __nccwpck_require__(5477); +const tr46 = __nccwpck_require__(2299); + +const specialSchemes = { + ftp: 21, + file: null, + gopher: 70, + http: 80, + https: 443, + ws: 80, + wss: 443 +}; + +const failure = Symbol("failure"); + +function countSymbols(str) { + return punycode.ucs2.decode(str).length; +} + +function at(input, idx) { + const c = input[idx]; + return isNaN(c) ? undefined : String.fromCodePoint(c); +} + +function isASCIIDigit(c) { + return c >= 0x30 && c <= 0x39; +} + +function isASCIIAlpha(c) { + return (c >= 0x41 && c <= 0x5A) || (c >= 0x61 && c <= 0x7A); +} + +function isASCIIAlphanumeric(c) { + return isASCIIAlpha(c) || isASCIIDigit(c); +} + +function isASCIIHex(c) { + return isASCIIDigit(c) || (c >= 0x41 && c <= 0x46) || (c >= 0x61 && c <= 0x66); +} + +function isSingleDot(buffer) { + return buffer === "." || buffer.toLowerCase() === "%2e"; +} + +function isDoubleDot(buffer) { + buffer = buffer.toLowerCase(); + return buffer === ".." || buffer === "%2e." || buffer === ".%2e" || buffer === "%2e%2e"; +} + +function isWindowsDriveLetterCodePoints(cp1, cp2) { + return isASCIIAlpha(cp1) && (cp2 === 58 || cp2 === 124); +} + +function isWindowsDriveLetterString(string) { + return string.length === 2 && isASCIIAlpha(string.codePointAt(0)) && (string[1] === ":" || string[1] === "|"); +} + +function isNormalizedWindowsDriveLetterString(string) { + return string.length === 2 && isASCIIAlpha(string.codePointAt(0)) && string[1] === ":"; +} + +function containsForbiddenHostCodePoint(string) { + return string.search(/\u0000|\u0009|\u000A|\u000D|\u0020|#|%|\/|:|\?|@|\[|\\|\]/) !== -1; +} + +function containsForbiddenHostCodePointExcludingPercent(string) { + return string.search(/\u0000|\u0009|\u000A|\u000D|\u0020|#|\/|:|\?|@|\[|\\|\]/) !== -1; +} + +function isSpecialScheme(scheme) { + return specialSchemes[scheme] !== undefined; +} + +function isSpecial(url) { + return isSpecialScheme(url.scheme); +} + +function defaultPort(scheme) { + return specialSchemes[scheme]; +} + +function percentEncode(c) { + let hex = c.toString(16).toUpperCase(); + if (hex.length === 1) { + hex = "0" + hex; + } + + return "%" + hex; +} + +function utf8PercentEncode(c) { + const buf = new Buffer(c); + + let str = ""; + + for (let i = 0; i < buf.length; ++i) { + str += percentEncode(buf[i]); + } + + return str; +} + +function utf8PercentDecode(str) { + const input = new Buffer(str); + const output = []; + for (let i = 0; i < input.length; ++i) { + if (input[i] !== 37) { + output.push(input[i]); + } else if (input[i] === 37 && isASCIIHex(input[i + 1]) && isASCIIHex(input[i + 2])) { + output.push(parseInt(input.slice(i + 1, i + 3).toString(), 16)); + i += 2; + } else { + output.push(input[i]); + } + } + return new Buffer(output).toString(); +} + +function isC0ControlPercentEncode(c) { + return c <= 0x1F || c > 0x7E; +} + +const extraPathPercentEncodeSet = new Set([32, 34, 35, 60, 62, 63, 96, 123, 125]); +function isPathPercentEncode(c) { + return isC0ControlPercentEncode(c) || extraPathPercentEncodeSet.has(c); +} + +const extraUserinfoPercentEncodeSet = + new Set([47, 58, 59, 61, 64, 91, 92, 93, 94, 124]); +function isUserinfoPercentEncode(c) { + return isPathPercentEncode(c) || extraUserinfoPercentEncodeSet.has(c); +} + +function percentEncodeChar(c, encodeSetPredicate) { + const cStr = String.fromCodePoint(c); + + if (encodeSetPredicate(c)) { + return utf8PercentEncode(cStr); + } + + return cStr; +} + +function parseIPv4Number(input) { + let R = 10; + + if (input.length >= 2 && input.charAt(0) === "0" && input.charAt(1).toLowerCase() === "x") { + input = input.substring(2); + R = 16; + } else if (input.length >= 2 && input.charAt(0) === "0") { + input = input.substring(1); + R = 8; + } + + if (input === "") { + return 0; + } + + const regex = R === 10 ? /[^0-9]/ : (R === 16 ? /[^0-9A-Fa-f]/ : /[^0-7]/); + if (regex.test(input)) { + return failure; + } + + return parseInt(input, R); +} + +function parseIPv4(input) { + const parts = input.split("."); + if (parts[parts.length - 1] === "") { + if (parts.length > 1) { + parts.pop(); + } + } + + if (parts.length > 4) { + return input; + } + + const numbers = []; + for (const part of parts) { + if (part === "") { + return input; + } + const n = parseIPv4Number(part); + if (n === failure) { + return input; + } + + numbers.push(n); + } + + for (let i = 0; i < numbers.length - 1; ++i) { + if (numbers[i] > 255) { + return failure; + } + } + if (numbers[numbers.length - 1] >= Math.pow(256, 5 - numbers.length)) { + return failure; + } + + let ipv4 = numbers.pop(); + let counter = 0; + + for (const n of numbers) { + ipv4 += n * Math.pow(256, 3 - counter); + ++counter; + } + + return ipv4; +} + +function serializeIPv4(address) { + let output = ""; + let n = address; + + for (let i = 1; i <= 4; ++i) { + output = String(n % 256) + output; + if (i !== 4) { + output = "." + output; + } + n = Math.floor(n / 256); + } + + return output; +} + +function parseIPv6(input) { + const address = [0, 0, 0, 0, 0, 0, 0, 0]; + let pieceIndex = 0; + let compress = null; + let pointer = 0; + + input = punycode.ucs2.decode(input); + + if (input[pointer] === 58) { + if (input[pointer + 1] !== 58) { + return failure; + } + + pointer += 2; + ++pieceIndex; + compress = pieceIndex; + } + + while (pointer < input.length) { + if (pieceIndex === 8) { + return failure; + } + + if (input[pointer] === 58) { + if (compress !== null) { + return failure; + } + ++pointer; + ++pieceIndex; + compress = pieceIndex; + continue; + } + + let value = 0; + let length = 0; + + while (length < 4 && isASCIIHex(input[pointer])) { + value = value * 0x10 + parseInt(at(input, pointer), 16); + ++pointer; + ++length; + } + + if (input[pointer] === 46) { + if (length === 0) { + return failure; + } + + pointer -= length; + + if (pieceIndex > 6) { + return failure; + } + + let numbersSeen = 0; + + while (input[pointer] !== undefined) { + let ipv4Piece = null; + + if (numbersSeen > 0) { + if (input[pointer] === 46 && numbersSeen < 4) { + ++pointer; + } else { + return failure; + } + } + + if (!isASCIIDigit(input[pointer])) { + return failure; + } + + while (isASCIIDigit(input[pointer])) { + const number = parseInt(at(input, pointer)); + if (ipv4Piece === null) { + ipv4Piece = number; + } else if (ipv4Piece === 0) { + return failure; + } else { + ipv4Piece = ipv4Piece * 10 + number; + } + if (ipv4Piece > 255) { + return failure; + } + ++pointer; + } + + address[pieceIndex] = address[pieceIndex] * 0x100 + ipv4Piece; + + ++numbersSeen; + + if (numbersSeen === 2 || numbersSeen === 4) { + ++pieceIndex; + } + } + + if (numbersSeen !== 4) { + return failure; + } + + break; + } else if (input[pointer] === 58) { + ++pointer; + if (input[pointer] === undefined) { + return failure; + } + } else if (input[pointer] !== undefined) { + return failure; + } + + address[pieceIndex] = value; + ++pieceIndex; + } + + if (compress !== null) { + let swaps = pieceIndex - compress; + pieceIndex = 7; + while (pieceIndex !== 0 && swaps > 0) { + const temp = address[compress + swaps - 1]; + address[compress + swaps - 1] = address[pieceIndex]; + address[pieceIndex] = temp; + --pieceIndex; + --swaps; + } + } else if (compress === null && pieceIndex !== 8) { + return failure; + } + + return address; +} + +function serializeIPv6(address) { + let output = ""; + const seqResult = findLongestZeroSequence(address); + const compress = seqResult.idx; + let ignore0 = false; + + for (let pieceIndex = 0; pieceIndex <= 7; ++pieceIndex) { + if (ignore0 && address[pieceIndex] === 0) { + continue; + } else if (ignore0) { + ignore0 = false; + } + + if (compress === pieceIndex) { + const separator = pieceIndex === 0 ? "::" : ":"; + output += separator; + ignore0 = true; + continue; + } + + output += address[pieceIndex].toString(16); + + if (pieceIndex !== 7) { + output += ":"; + } + } + + return output; +} + +function parseHost(input, isSpecialArg) { + if (input[0] === "[") { + if (input[input.length - 1] !== "]") { + return failure; + } + + return parseIPv6(input.substring(1, input.length - 1)); + } + + if (!isSpecialArg) { + return parseOpaqueHost(input); + } + + const domain = utf8PercentDecode(input); + const asciiDomain = tr46.toASCII(domain, false, tr46.PROCESSING_OPTIONS.NONTRANSITIONAL, false); + if (asciiDomain === null) { + return failure; + } + + if (containsForbiddenHostCodePoint(asciiDomain)) { + return failure; + } + + const ipv4Host = parseIPv4(asciiDomain); + if (typeof ipv4Host === "number" || ipv4Host === failure) { + return ipv4Host; + } + + return asciiDomain; +} + +function parseOpaqueHost(input) { + if (containsForbiddenHostCodePointExcludingPercent(input)) { + return failure; + } + + let output = ""; + const decoded = punycode.ucs2.decode(input); + for (let i = 0; i < decoded.length; ++i) { + output += percentEncodeChar(decoded[i], isC0ControlPercentEncode); + } + return output; +} + +function findLongestZeroSequence(arr) { + let maxIdx = null; + let maxLen = 1; // only find elements > 1 + let currStart = null; + let currLen = 0; + + for (let i = 0; i < arr.length; ++i) { + if (arr[i] !== 0) { + if (currLen > maxLen) { + maxIdx = currStart; + maxLen = currLen; + } + + currStart = null; + currLen = 0; + } else { + if (currStart === null) { + currStart = i; + } + ++currLen; + } + } + + // if trailing zeros + if (currLen > maxLen) { + maxIdx = currStart; + maxLen = currLen; + } + + return { + idx: maxIdx, + len: maxLen + }; +} + +function serializeHost(host) { + if (typeof host === "number") { + return serializeIPv4(host); + } + + // IPv6 serializer + if (host instanceof Array) { + return "[" + serializeIPv6(host) + "]"; + } + + return host; +} + +function trimControlChars(url) { + return url.replace(/^[\u0000-\u001F\u0020]+|[\u0000-\u001F\u0020]+$/g, ""); +} + +function trimTabAndNewline(url) { + return url.replace(/\u0009|\u000A|\u000D/g, ""); +} + +function shortenPath(url) { + const path = url.path; + if (path.length === 0) { + return; + } + if (url.scheme === "file" && path.length === 1 && isNormalizedWindowsDriveLetter(path[0])) { + return; + } + + path.pop(); +} + +function includesCredentials(url) { + return url.username !== "" || url.password !== ""; +} + +function cannotHaveAUsernamePasswordPort(url) { + return url.host === null || url.host === "" || url.cannotBeABaseURL || url.scheme === "file"; +} + +function isNormalizedWindowsDriveLetter(string) { + return /^[A-Za-z]:$/.test(string); +} + +function URLStateMachine(input, base, encodingOverride, url, stateOverride) { + this.pointer = 0; + this.input = input; + this.base = base || null; + this.encodingOverride = encodingOverride || "utf-8"; + this.stateOverride = stateOverride; + this.url = url; + this.failure = false; + this.parseError = false; + + if (!this.url) { + this.url = { + scheme: "", + username: "", + password: "", + host: null, + port: null, + path: [], + query: null, + fragment: null, + + cannotBeABaseURL: false + }; + + const res = trimControlChars(this.input); + if (res !== this.input) { + this.parseError = true; + } + this.input = res; + } + + const res = trimTabAndNewline(this.input); + if (res !== this.input) { + this.parseError = true; + } + this.input = res; + + this.state = stateOverride || "scheme start"; + + this.buffer = ""; + this.atFlag = false; + this.arrFlag = false; + this.passwordTokenSeenFlag = false; + + this.input = punycode.ucs2.decode(this.input); + + for (; this.pointer <= this.input.length; ++this.pointer) { + const c = this.input[this.pointer]; + const cStr = isNaN(c) ? undefined : String.fromCodePoint(c); + + // exec state machine + const ret = this["parse " + this.state](c, cStr); + if (!ret) { + break; // terminate algorithm + } else if (ret === failure) { + this.failure = true; + break; + } + } +} + +URLStateMachine.prototype["parse scheme start"] = function parseSchemeStart(c, cStr) { + if (isASCIIAlpha(c)) { + this.buffer += cStr.toLowerCase(); + this.state = "scheme"; + } else if (!this.stateOverride) { + this.state = "no scheme"; + --this.pointer; + } else { + this.parseError = true; + return failure; + } + + return true; +}; + +URLStateMachine.prototype["parse scheme"] = function parseScheme(c, cStr) { + if (isASCIIAlphanumeric(c) || c === 43 || c === 45 || c === 46) { + this.buffer += cStr.toLowerCase(); + } else if (c === 58) { + if (this.stateOverride) { + if (isSpecial(this.url) && !isSpecialScheme(this.buffer)) { + return false; + } + + if (!isSpecial(this.url) && isSpecialScheme(this.buffer)) { + return false; + } + + if ((includesCredentials(this.url) || this.url.port !== null) && this.buffer === "file") { + return false; + } + + if (this.url.scheme === "file" && (this.url.host === "" || this.url.host === null)) { + return false; + } + } + this.url.scheme = this.buffer; + this.buffer = ""; + if (this.stateOverride) { + return false; + } + if (this.url.scheme === "file") { + if (this.input[this.pointer + 1] !== 47 || this.input[this.pointer + 2] !== 47) { + this.parseError = true; + } + this.state = "file"; + } else if (isSpecial(this.url) && this.base !== null && this.base.scheme === this.url.scheme) { + this.state = "special relative or authority"; + } else if (isSpecial(this.url)) { + this.state = "special authority slashes"; + } else if (this.input[this.pointer + 1] === 47) { + this.state = "path or authority"; + ++this.pointer; + } else { + this.url.cannotBeABaseURL = true; + this.url.path.push(""); + this.state = "cannot-be-a-base-URL path"; + } + } else if (!this.stateOverride) { + this.buffer = ""; + this.state = "no scheme"; + this.pointer = -1; + } else { + this.parseError = true; + return failure; + } + + return true; +}; + +URLStateMachine.prototype["parse no scheme"] = function parseNoScheme(c) { + if (this.base === null || (this.base.cannotBeABaseURL && c !== 35)) { + return failure; + } else if (this.base.cannotBeABaseURL && c === 35) { + this.url.scheme = this.base.scheme; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + this.url.fragment = ""; + this.url.cannotBeABaseURL = true; + this.state = "fragment"; + } else if (this.base.scheme === "file") { + this.state = "file"; + --this.pointer; + } else { + this.state = "relative"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse special relative or authority"] = function parseSpecialRelativeOrAuthority(c) { + if (c === 47 && this.input[this.pointer + 1] === 47) { + this.state = "special authority ignore slashes"; + ++this.pointer; + } else { + this.parseError = true; + this.state = "relative"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse path or authority"] = function parsePathOrAuthority(c) { + if (c === 47) { + this.state = "authority"; + } else { + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse relative"] = function parseRelative(c) { + this.url.scheme = this.base.scheme; + if (isNaN(c)) { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + } else if (c === 47) { + this.state = "relative slash"; + } else if (c === 63) { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.url.path = this.base.path.slice(); + this.url.query = ""; + this.state = "query"; + } else if (c === 35) { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + this.url.fragment = ""; + this.state = "fragment"; + } else if (isSpecial(this.url) && c === 92) { + this.parseError = true; + this.state = "relative slash"; + } else { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.url.path = this.base.path.slice(0, this.base.path.length - 1); + + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse relative slash"] = function parseRelativeSlash(c) { + if (isSpecial(this.url) && (c === 47 || c === 92)) { + if (c === 92) { + this.parseError = true; + } + this.state = "special authority ignore slashes"; + } else if (c === 47) { + this.state = "authority"; + } else { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse special authority slashes"] = function parseSpecialAuthoritySlashes(c) { + if (c === 47 && this.input[this.pointer + 1] === 47) { + this.state = "special authority ignore slashes"; + ++this.pointer; + } else { + this.parseError = true; + this.state = "special authority ignore slashes"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse special authority ignore slashes"] = function parseSpecialAuthorityIgnoreSlashes(c) { + if (c !== 47 && c !== 92) { + this.state = "authority"; + --this.pointer; + } else { + this.parseError = true; + } + + return true; +}; + +URLStateMachine.prototype["parse authority"] = function parseAuthority(c, cStr) { + if (c === 64) { + this.parseError = true; + if (this.atFlag) { + this.buffer = "%40" + this.buffer; + } + this.atFlag = true; + + // careful, this is based on buffer and has its own pointer (this.pointer != pointer) and inner chars + const len = countSymbols(this.buffer); + for (let pointer = 0; pointer < len; ++pointer) { + const codePoint = this.buffer.codePointAt(pointer); + + if (codePoint === 58 && !this.passwordTokenSeenFlag) { + this.passwordTokenSeenFlag = true; + continue; + } + const encodedCodePoints = percentEncodeChar(codePoint, isUserinfoPercentEncode); + if (this.passwordTokenSeenFlag) { + this.url.password += encodedCodePoints; + } else { + this.url.username += encodedCodePoints; + } + } + this.buffer = ""; + } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || + (isSpecial(this.url) && c === 92)) { + if (this.atFlag && this.buffer === "") { + this.parseError = true; + return failure; + } + this.pointer -= countSymbols(this.buffer) + 1; + this.buffer = ""; + this.state = "host"; + } else { + this.buffer += cStr; + } + + return true; +}; + +URLStateMachine.prototype["parse hostname"] = +URLStateMachine.prototype["parse host"] = function parseHostName(c, cStr) { + if (this.stateOverride && this.url.scheme === "file") { + --this.pointer; + this.state = "file host"; + } else if (c === 58 && !this.arrFlag) { + if (this.buffer === "") { + this.parseError = true; + return failure; + } + + const host = parseHost(this.buffer, isSpecial(this.url)); + if (host === failure) { + return failure; + } + + this.url.host = host; + this.buffer = ""; + this.state = "port"; + if (this.stateOverride === "hostname") { + return false; + } + } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || + (isSpecial(this.url) && c === 92)) { + --this.pointer; + if (isSpecial(this.url) && this.buffer === "") { + this.parseError = true; + return failure; + } else if (this.stateOverride && this.buffer === "" && + (includesCredentials(this.url) || this.url.port !== null)) { + this.parseError = true; + return false; + } + + const host = parseHost(this.buffer, isSpecial(this.url)); + if (host === failure) { + return failure; + } + + this.url.host = host; + this.buffer = ""; + this.state = "path start"; + if (this.stateOverride) { + return false; + } + } else { + if (c === 91) { + this.arrFlag = true; + } else if (c === 93) { + this.arrFlag = false; + } + this.buffer += cStr; + } + + return true; +}; + +URLStateMachine.prototype["parse port"] = function parsePort(c, cStr) { + if (isASCIIDigit(c)) { + this.buffer += cStr; + } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || + (isSpecial(this.url) && c === 92) || + this.stateOverride) { + if (this.buffer !== "") { + const port = parseInt(this.buffer); + if (port > Math.pow(2, 16) - 1) { + this.parseError = true; + return failure; + } + this.url.port = port === defaultPort(this.url.scheme) ? null : port; + this.buffer = ""; + } + if (this.stateOverride) { + return false; + } + this.state = "path start"; + --this.pointer; + } else { + this.parseError = true; + return failure; + } + + return true; +}; + +const fileOtherwiseCodePoints = new Set([47, 92, 63, 35]); + +URLStateMachine.prototype["parse file"] = function parseFile(c) { + this.url.scheme = "file"; + + if (c === 47 || c === 92) { + if (c === 92) { + this.parseError = true; + } + this.state = "file slash"; + } else if (this.base !== null && this.base.scheme === "file") { + if (isNaN(c)) { + this.url.host = this.base.host; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + } else if (c === 63) { + this.url.host = this.base.host; + this.url.path = this.base.path.slice(); + this.url.query = ""; + this.state = "query"; + } else if (c === 35) { + this.url.host = this.base.host; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + this.url.fragment = ""; + this.state = "fragment"; + } else { + if (this.input.length - this.pointer - 1 === 0 || // remaining consists of 0 code points + !isWindowsDriveLetterCodePoints(c, this.input[this.pointer + 1]) || + (this.input.length - this.pointer - 1 >= 2 && // remaining has at least 2 code points + !fileOtherwiseCodePoints.has(this.input[this.pointer + 2]))) { + this.url.host = this.base.host; + this.url.path = this.base.path.slice(); + shortenPath(this.url); + } else { + this.parseError = true; + } + + this.state = "path"; + --this.pointer; + } + } else { + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse file slash"] = function parseFileSlash(c) { + if (c === 47 || c === 92) { + if (c === 92) { + this.parseError = true; + } + this.state = "file host"; + } else { + if (this.base !== null && this.base.scheme === "file") { + if (isNormalizedWindowsDriveLetterString(this.base.path[0])) { + this.url.path.push(this.base.path[0]); + } else { + this.url.host = this.base.host; + } + } + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse file host"] = function parseFileHost(c, cStr) { + if (isNaN(c) || c === 47 || c === 92 || c === 63 || c === 35) { + --this.pointer; + if (!this.stateOverride && isWindowsDriveLetterString(this.buffer)) { + this.parseError = true; + this.state = "path"; + } else if (this.buffer === "") { + this.url.host = ""; + if (this.stateOverride) { + return false; + } + this.state = "path start"; + } else { + let host = parseHost(this.buffer, isSpecial(this.url)); + if (host === failure) { + return failure; + } + if (host === "localhost") { + host = ""; + } + this.url.host = host; + + if (this.stateOverride) { + return false; + } + + this.buffer = ""; + this.state = "path start"; + } + } else { + this.buffer += cStr; + } + + return true; +}; + +URLStateMachine.prototype["parse path start"] = function parsePathStart(c) { + if (isSpecial(this.url)) { + if (c === 92) { + this.parseError = true; + } + this.state = "path"; + + if (c !== 47 && c !== 92) { + --this.pointer; + } + } else if (!this.stateOverride && c === 63) { + this.url.query = ""; + this.state = "query"; + } else if (!this.stateOverride && c === 35) { + this.url.fragment = ""; + this.state = "fragment"; + } else if (c !== undefined) { + this.state = "path"; + if (c !== 47) { + --this.pointer; + } + } + + return true; +}; + +URLStateMachine.prototype["parse path"] = function parsePath(c) { + if (isNaN(c) || c === 47 || (isSpecial(this.url) && c === 92) || + (!this.stateOverride && (c === 63 || c === 35))) { + if (isSpecial(this.url) && c === 92) { + this.parseError = true; + } + + if (isDoubleDot(this.buffer)) { + shortenPath(this.url); + if (c !== 47 && !(isSpecial(this.url) && c === 92)) { + this.url.path.push(""); + } + } else if (isSingleDot(this.buffer) && c !== 47 && + !(isSpecial(this.url) && c === 92)) { + this.url.path.push(""); + } else if (!isSingleDot(this.buffer)) { + if (this.url.scheme === "file" && this.url.path.length === 0 && isWindowsDriveLetterString(this.buffer)) { + if (this.url.host !== "" && this.url.host !== null) { + this.parseError = true; + this.url.host = ""; + } + this.buffer = this.buffer[0] + ":"; + } + this.url.path.push(this.buffer); + } + this.buffer = ""; + if (this.url.scheme === "file" && (c === undefined || c === 63 || c === 35)) { + while (this.url.path.length > 1 && this.url.path[0] === "") { + this.parseError = true; + this.url.path.shift(); + } + } + if (c === 63) { + this.url.query = ""; + this.state = "query"; + } + if (c === 35) { + this.url.fragment = ""; + this.state = "fragment"; + } + } else { + // TODO: If c is not a URL code point and not "%", parse error. + + if (c === 37 && + (!isASCIIHex(this.input[this.pointer + 1]) || + !isASCIIHex(this.input[this.pointer + 2]))) { + this.parseError = true; + } + + this.buffer += percentEncodeChar(c, isPathPercentEncode); + } + + return true; +}; + +URLStateMachine.prototype["parse cannot-be-a-base-URL path"] = function parseCannotBeABaseURLPath(c) { + if (c === 63) { + this.url.query = ""; + this.state = "query"; + } else if (c === 35) { + this.url.fragment = ""; + this.state = "fragment"; + } else { + // TODO: Add: not a URL code point + if (!isNaN(c) && c !== 37) { + this.parseError = true; + } + + if (c === 37 && + (!isASCIIHex(this.input[this.pointer + 1]) || + !isASCIIHex(this.input[this.pointer + 2]))) { + this.parseError = true; + } + + if (!isNaN(c)) { + this.url.path[0] = this.url.path[0] + percentEncodeChar(c, isC0ControlPercentEncode); + } + } + + return true; +}; + +URLStateMachine.prototype["parse query"] = function parseQuery(c, cStr) { + if (isNaN(c) || (!this.stateOverride && c === 35)) { + if (!isSpecial(this.url) || this.url.scheme === "ws" || this.url.scheme === "wss") { + this.encodingOverride = "utf-8"; + } + + const buffer = new Buffer(this.buffer); // TODO: Use encoding override instead + for (let i = 0; i < buffer.length; ++i) { + if (buffer[i] < 0x21 || buffer[i] > 0x7E || buffer[i] === 0x22 || buffer[i] === 0x23 || + buffer[i] === 0x3C || buffer[i] === 0x3E) { + this.url.query += percentEncode(buffer[i]); + } else { + this.url.query += String.fromCodePoint(buffer[i]); + } + } + + this.buffer = ""; + if (c === 35) { + this.url.fragment = ""; + this.state = "fragment"; + } + } else { + // TODO: If c is not a URL code point and not "%", parse error. + if (c === 37 && + (!isASCIIHex(this.input[this.pointer + 1]) || + !isASCIIHex(this.input[this.pointer + 2]))) { + this.parseError = true; + } + + this.buffer += cStr; + } + + return true; +}; + +URLStateMachine.prototype["parse fragment"] = function parseFragment(c) { + if (isNaN(c)) { // do nothing + } else if (c === 0x0) { + this.parseError = true; + } else { + // TODO: If c is not a URL code point and not "%", parse error. + if (c === 37 && + (!isASCIIHex(this.input[this.pointer + 1]) || + !isASCIIHex(this.input[this.pointer + 2]))) { + this.parseError = true; + } + + this.url.fragment += percentEncodeChar(c, isC0ControlPercentEncode); + } + + return true; +}; + +function serializeURL(url, excludeFragment) { + let output = url.scheme + ":"; + if (url.host !== null) { + output += "//"; + + if (url.username !== "" || url.password !== "") { + output += url.username; + if (url.password !== "") { + output += ":" + url.password; + } + output += "@"; + } + + output += serializeHost(url.host); + + if (url.port !== null) { + output += ":" + url.port; + } + } else if (url.host === null && url.scheme === "file") { + output += "//"; + } + + if (url.cannotBeABaseURL) { + output += url.path[0]; + } else { + for (const string of url.path) { + output += "/" + string; + } + } + + if (url.query !== null) { + output += "?" + url.query; + } + + if (!excludeFragment && url.fragment !== null) { + output += "#" + url.fragment; + } + + return output; +} + +function serializeOrigin(tuple) { + let result = tuple.scheme + "://"; + result += serializeHost(tuple.host); + + if (tuple.port !== null) { + result += ":" + tuple.port; + } + + return result; +} + +module.exports.serializeURL = serializeURL; + +module.exports.serializeURLOrigin = function (url) { + // https://url.spec.whatwg.org/#concept-url-origin + switch (url.scheme) { + case "blob": + try { + return module.exports.serializeURLOrigin(module.exports.parseURL(url.path[0])); + } catch (e) { + // serializing an opaque origin returns "null" + return "null"; + } + case "ftp": + case "gopher": + case "http": + case "https": + case "ws": + case "wss": + return serializeOrigin({ + scheme: url.scheme, + host: url.host, + port: url.port + }); + case "file": + // spec says "exercise to the reader", chrome says "file://" + return "file://"; + default: + // serializing an opaque origin returns "null" + return "null"; + } +}; + +module.exports.basicURLParse = function (input, options) { + if (options === undefined) { + options = {}; + } + + const usm = new URLStateMachine(input, options.baseURL, options.encodingOverride, options.url, options.stateOverride); + if (usm.failure) { + return "failure"; + } + + return usm.url; +}; + +module.exports.setTheUsername = function (url, username) { + url.username = ""; + const decoded = punycode.ucs2.decode(username); + for (let i = 0; i < decoded.length; ++i) { + url.username += percentEncodeChar(decoded[i], isUserinfoPercentEncode); + } +}; + +module.exports.setThePassword = function (url, password) { + url.password = ""; + const decoded = punycode.ucs2.decode(password); + for (let i = 0; i < decoded.length; ++i) { + url.password += percentEncodeChar(decoded[i], isUserinfoPercentEncode); + } +}; + +module.exports.serializeHost = serializeHost; + +module.exports.cannotHaveAUsernamePasswordPort = cannotHaveAUsernamePasswordPort; + +module.exports.serializeInteger = function (integer) { + return String(integer); +}; + +module.exports.parseURL = function (input, options) { + if (options === undefined) { + options = {}; + } + + // We don't handle blobs, so this just delegates: + return module.exports.basicURLParse(input, { baseURL: options.baseURL, encodingOverride: options.encodingOverride }); +}; /***/ }), diff --git a/.github/actions/javascript/getDeployPullRequestList/index.js b/.github/actions/javascript/getDeployPullRequestList/index.js index ac5d0e26998a..07e5d0c93a63 100644 --- a/.github/actions/javascript/getDeployPullRequestList/index.js +++ b/.github/actions/javascript/getDeployPullRequestList/index.js @@ -921,8 +921,8 @@ const incrementPatch = (major, minor, patch) => { /** * Increments a build version * - * @param {Number} version - * @param {Number} level + * @param {String} version + * @param {String} level * @returns {String} */ const incrementVersion = (version, level) => { @@ -11700,1303 +11700,1303 @@ exports.parseURL = __nccwpck_require__(33).parseURL; /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; - -const punycode = __nccwpck_require__(5477); -const tr46 = __nccwpck_require__(2299); - -const specialSchemes = { - ftp: 21, - file: null, - gopher: 70, - http: 80, - https: 443, - ws: 80, - wss: 443 -}; - -const failure = Symbol("failure"); - -function countSymbols(str) { - return punycode.ucs2.decode(str).length; -} - -function at(input, idx) { - const c = input[idx]; - return isNaN(c) ? undefined : String.fromCodePoint(c); -} - -function isASCIIDigit(c) { - return c >= 0x30 && c <= 0x39; -} - -function isASCIIAlpha(c) { - return (c >= 0x41 && c <= 0x5A) || (c >= 0x61 && c <= 0x7A); -} - -function isASCIIAlphanumeric(c) { - return isASCIIAlpha(c) || isASCIIDigit(c); -} - -function isASCIIHex(c) { - return isASCIIDigit(c) || (c >= 0x41 && c <= 0x46) || (c >= 0x61 && c <= 0x66); -} - -function isSingleDot(buffer) { - return buffer === "." || buffer.toLowerCase() === "%2e"; -} - -function isDoubleDot(buffer) { - buffer = buffer.toLowerCase(); - return buffer === ".." || buffer === "%2e." || buffer === ".%2e" || buffer === "%2e%2e"; -} - -function isWindowsDriveLetterCodePoints(cp1, cp2) { - return isASCIIAlpha(cp1) && (cp2 === 58 || cp2 === 124); -} - -function isWindowsDriveLetterString(string) { - return string.length === 2 && isASCIIAlpha(string.codePointAt(0)) && (string[1] === ":" || string[1] === "|"); -} - -function isNormalizedWindowsDriveLetterString(string) { - return string.length === 2 && isASCIIAlpha(string.codePointAt(0)) && string[1] === ":"; -} - -function containsForbiddenHostCodePoint(string) { - return string.search(/\u0000|\u0009|\u000A|\u000D|\u0020|#|%|\/|:|\?|@|\[|\\|\]/) !== -1; -} - -function containsForbiddenHostCodePointExcludingPercent(string) { - return string.search(/\u0000|\u0009|\u000A|\u000D|\u0020|#|\/|:|\?|@|\[|\\|\]/) !== -1; -} - -function isSpecialScheme(scheme) { - return specialSchemes[scheme] !== undefined; -} - -function isSpecial(url) { - return isSpecialScheme(url.scheme); -} - -function defaultPort(scheme) { - return specialSchemes[scheme]; -} - -function percentEncode(c) { - let hex = c.toString(16).toUpperCase(); - if (hex.length === 1) { - hex = "0" + hex; - } - - return "%" + hex; -} - -function utf8PercentEncode(c) { - const buf = new Buffer(c); - - let str = ""; - - for (let i = 0; i < buf.length; ++i) { - str += percentEncode(buf[i]); - } - - return str; -} - -function utf8PercentDecode(str) { - const input = new Buffer(str); - const output = []; - for (let i = 0; i < input.length; ++i) { - if (input[i] !== 37) { - output.push(input[i]); - } else if (input[i] === 37 && isASCIIHex(input[i + 1]) && isASCIIHex(input[i + 2])) { - output.push(parseInt(input.slice(i + 1, i + 3).toString(), 16)); - i += 2; - } else { - output.push(input[i]); - } - } - return new Buffer(output).toString(); -} - -function isC0ControlPercentEncode(c) { - return c <= 0x1F || c > 0x7E; -} - -const extraPathPercentEncodeSet = new Set([32, 34, 35, 60, 62, 63, 96, 123, 125]); -function isPathPercentEncode(c) { - return isC0ControlPercentEncode(c) || extraPathPercentEncodeSet.has(c); -} - -const extraUserinfoPercentEncodeSet = - new Set([47, 58, 59, 61, 64, 91, 92, 93, 94, 124]); -function isUserinfoPercentEncode(c) { - return isPathPercentEncode(c) || extraUserinfoPercentEncodeSet.has(c); -} - -function percentEncodeChar(c, encodeSetPredicate) { - const cStr = String.fromCodePoint(c); - - if (encodeSetPredicate(c)) { - return utf8PercentEncode(cStr); - } - - return cStr; -} - -function parseIPv4Number(input) { - let R = 10; - - if (input.length >= 2 && input.charAt(0) === "0" && input.charAt(1).toLowerCase() === "x") { - input = input.substring(2); - R = 16; - } else if (input.length >= 2 && input.charAt(0) === "0") { - input = input.substring(1); - R = 8; - } - - if (input === "") { - return 0; - } - - const regex = R === 10 ? /[^0-9]/ : (R === 16 ? /[^0-9A-Fa-f]/ : /[^0-7]/); - if (regex.test(input)) { - return failure; - } - - return parseInt(input, R); -} - -function parseIPv4(input) { - const parts = input.split("."); - if (parts[parts.length - 1] === "") { - if (parts.length > 1) { - parts.pop(); - } - } - - if (parts.length > 4) { - return input; - } - - const numbers = []; - for (const part of parts) { - if (part === "") { - return input; - } - const n = parseIPv4Number(part); - if (n === failure) { - return input; - } - - numbers.push(n); - } - - for (let i = 0; i < numbers.length - 1; ++i) { - if (numbers[i] > 255) { - return failure; - } - } - if (numbers[numbers.length - 1] >= Math.pow(256, 5 - numbers.length)) { - return failure; - } - - let ipv4 = numbers.pop(); - let counter = 0; - - for (const n of numbers) { - ipv4 += n * Math.pow(256, 3 - counter); - ++counter; - } - - return ipv4; -} - -function serializeIPv4(address) { - let output = ""; - let n = address; - - for (let i = 1; i <= 4; ++i) { - output = String(n % 256) + output; - if (i !== 4) { - output = "." + output; - } - n = Math.floor(n / 256); - } - - return output; -} - -function parseIPv6(input) { - const address = [0, 0, 0, 0, 0, 0, 0, 0]; - let pieceIndex = 0; - let compress = null; - let pointer = 0; - - input = punycode.ucs2.decode(input); - - if (input[pointer] === 58) { - if (input[pointer + 1] !== 58) { - return failure; - } - - pointer += 2; - ++pieceIndex; - compress = pieceIndex; - } - - while (pointer < input.length) { - if (pieceIndex === 8) { - return failure; - } - - if (input[pointer] === 58) { - if (compress !== null) { - return failure; - } - ++pointer; - ++pieceIndex; - compress = pieceIndex; - continue; - } - - let value = 0; - let length = 0; - - while (length < 4 && isASCIIHex(input[pointer])) { - value = value * 0x10 + parseInt(at(input, pointer), 16); - ++pointer; - ++length; - } - - if (input[pointer] === 46) { - if (length === 0) { - return failure; - } - - pointer -= length; - - if (pieceIndex > 6) { - return failure; - } - - let numbersSeen = 0; - - while (input[pointer] !== undefined) { - let ipv4Piece = null; - - if (numbersSeen > 0) { - if (input[pointer] === 46 && numbersSeen < 4) { - ++pointer; - } else { - return failure; - } - } - - if (!isASCIIDigit(input[pointer])) { - return failure; - } - - while (isASCIIDigit(input[pointer])) { - const number = parseInt(at(input, pointer)); - if (ipv4Piece === null) { - ipv4Piece = number; - } else if (ipv4Piece === 0) { - return failure; - } else { - ipv4Piece = ipv4Piece * 10 + number; - } - if (ipv4Piece > 255) { - return failure; - } - ++pointer; - } - - address[pieceIndex] = address[pieceIndex] * 0x100 + ipv4Piece; - - ++numbersSeen; - - if (numbersSeen === 2 || numbersSeen === 4) { - ++pieceIndex; - } - } - - if (numbersSeen !== 4) { - return failure; - } - - break; - } else if (input[pointer] === 58) { - ++pointer; - if (input[pointer] === undefined) { - return failure; - } - } else if (input[pointer] !== undefined) { - return failure; - } - - address[pieceIndex] = value; - ++pieceIndex; - } - - if (compress !== null) { - let swaps = pieceIndex - compress; - pieceIndex = 7; - while (pieceIndex !== 0 && swaps > 0) { - const temp = address[compress + swaps - 1]; - address[compress + swaps - 1] = address[pieceIndex]; - address[pieceIndex] = temp; - --pieceIndex; - --swaps; - } - } else if (compress === null && pieceIndex !== 8) { - return failure; - } - - return address; -} - -function serializeIPv6(address) { - let output = ""; - const seqResult = findLongestZeroSequence(address); - const compress = seqResult.idx; - let ignore0 = false; - - for (let pieceIndex = 0; pieceIndex <= 7; ++pieceIndex) { - if (ignore0 && address[pieceIndex] === 0) { - continue; - } else if (ignore0) { - ignore0 = false; - } - - if (compress === pieceIndex) { - const separator = pieceIndex === 0 ? "::" : ":"; - output += separator; - ignore0 = true; - continue; - } - - output += address[pieceIndex].toString(16); - - if (pieceIndex !== 7) { - output += ":"; - } - } - - return output; -} - -function parseHost(input, isSpecialArg) { - if (input[0] === "[") { - if (input[input.length - 1] !== "]") { - return failure; - } - - return parseIPv6(input.substring(1, input.length - 1)); - } - - if (!isSpecialArg) { - return parseOpaqueHost(input); - } - - const domain = utf8PercentDecode(input); - const asciiDomain = tr46.toASCII(domain, false, tr46.PROCESSING_OPTIONS.NONTRANSITIONAL, false); - if (asciiDomain === null) { - return failure; - } - - if (containsForbiddenHostCodePoint(asciiDomain)) { - return failure; - } - - const ipv4Host = parseIPv4(asciiDomain); - if (typeof ipv4Host === "number" || ipv4Host === failure) { - return ipv4Host; - } - - return asciiDomain; -} - -function parseOpaqueHost(input) { - if (containsForbiddenHostCodePointExcludingPercent(input)) { - return failure; - } - - let output = ""; - const decoded = punycode.ucs2.decode(input); - for (let i = 0; i < decoded.length; ++i) { - output += percentEncodeChar(decoded[i], isC0ControlPercentEncode); - } - return output; -} - -function findLongestZeroSequence(arr) { - let maxIdx = null; - let maxLen = 1; // only find elements > 1 - let currStart = null; - let currLen = 0; - - for (let i = 0; i < arr.length; ++i) { - if (arr[i] !== 0) { - if (currLen > maxLen) { - maxIdx = currStart; - maxLen = currLen; - } - - currStart = null; - currLen = 0; - } else { - if (currStart === null) { - currStart = i; - } - ++currLen; - } - } - - // if trailing zeros - if (currLen > maxLen) { - maxIdx = currStart; - maxLen = currLen; - } - - return { - idx: maxIdx, - len: maxLen - }; -} - -function serializeHost(host) { - if (typeof host === "number") { - return serializeIPv4(host); - } - - // IPv6 serializer - if (host instanceof Array) { - return "[" + serializeIPv6(host) + "]"; - } - - return host; -} - -function trimControlChars(url) { - return url.replace(/^[\u0000-\u001F\u0020]+|[\u0000-\u001F\u0020]+$/g, ""); -} - -function trimTabAndNewline(url) { - return url.replace(/\u0009|\u000A|\u000D/g, ""); -} - -function shortenPath(url) { - const path = url.path; - if (path.length === 0) { - return; - } - if (url.scheme === "file" && path.length === 1 && isNormalizedWindowsDriveLetter(path[0])) { - return; - } - - path.pop(); -} - -function includesCredentials(url) { - return url.username !== "" || url.password !== ""; -} - -function cannotHaveAUsernamePasswordPort(url) { - return url.host === null || url.host === "" || url.cannotBeABaseURL || url.scheme === "file"; -} - -function isNormalizedWindowsDriveLetter(string) { - return /^[A-Za-z]:$/.test(string); -} - -function URLStateMachine(input, base, encodingOverride, url, stateOverride) { - this.pointer = 0; - this.input = input; - this.base = base || null; - this.encodingOverride = encodingOverride || "utf-8"; - this.stateOverride = stateOverride; - this.url = url; - this.failure = false; - this.parseError = false; - - if (!this.url) { - this.url = { - scheme: "", - username: "", - password: "", - host: null, - port: null, - path: [], - query: null, - fragment: null, - - cannotBeABaseURL: false - }; - - const res = trimControlChars(this.input); - if (res !== this.input) { - this.parseError = true; - } - this.input = res; - } - - const res = trimTabAndNewline(this.input); - if (res !== this.input) { - this.parseError = true; - } - this.input = res; - - this.state = stateOverride || "scheme start"; - - this.buffer = ""; - this.atFlag = false; - this.arrFlag = false; - this.passwordTokenSeenFlag = false; - - this.input = punycode.ucs2.decode(this.input); - - for (; this.pointer <= this.input.length; ++this.pointer) { - const c = this.input[this.pointer]; - const cStr = isNaN(c) ? undefined : String.fromCodePoint(c); - - // exec state machine - const ret = this["parse " + this.state](c, cStr); - if (!ret) { - break; // terminate algorithm - } else if (ret === failure) { - this.failure = true; - break; - } - } -} - -URLStateMachine.prototype["parse scheme start"] = function parseSchemeStart(c, cStr) { - if (isASCIIAlpha(c)) { - this.buffer += cStr.toLowerCase(); - this.state = "scheme"; - } else if (!this.stateOverride) { - this.state = "no scheme"; - --this.pointer; - } else { - this.parseError = true; - return failure; - } - - return true; -}; - -URLStateMachine.prototype["parse scheme"] = function parseScheme(c, cStr) { - if (isASCIIAlphanumeric(c) || c === 43 || c === 45 || c === 46) { - this.buffer += cStr.toLowerCase(); - } else if (c === 58) { - if (this.stateOverride) { - if (isSpecial(this.url) && !isSpecialScheme(this.buffer)) { - return false; - } - - if (!isSpecial(this.url) && isSpecialScheme(this.buffer)) { - return false; - } - - if ((includesCredentials(this.url) || this.url.port !== null) && this.buffer === "file") { - return false; - } - - if (this.url.scheme === "file" && (this.url.host === "" || this.url.host === null)) { - return false; - } - } - this.url.scheme = this.buffer; - this.buffer = ""; - if (this.stateOverride) { - return false; - } - if (this.url.scheme === "file") { - if (this.input[this.pointer + 1] !== 47 || this.input[this.pointer + 2] !== 47) { - this.parseError = true; - } - this.state = "file"; - } else if (isSpecial(this.url) && this.base !== null && this.base.scheme === this.url.scheme) { - this.state = "special relative or authority"; - } else if (isSpecial(this.url)) { - this.state = "special authority slashes"; - } else if (this.input[this.pointer + 1] === 47) { - this.state = "path or authority"; - ++this.pointer; - } else { - this.url.cannotBeABaseURL = true; - this.url.path.push(""); - this.state = "cannot-be-a-base-URL path"; - } - } else if (!this.stateOverride) { - this.buffer = ""; - this.state = "no scheme"; - this.pointer = -1; - } else { - this.parseError = true; - return failure; - } - - return true; -}; - -URLStateMachine.prototype["parse no scheme"] = function parseNoScheme(c) { - if (this.base === null || (this.base.cannotBeABaseURL && c !== 35)) { - return failure; - } else if (this.base.cannotBeABaseURL && c === 35) { - this.url.scheme = this.base.scheme; - this.url.path = this.base.path.slice(); - this.url.query = this.base.query; - this.url.fragment = ""; - this.url.cannotBeABaseURL = true; - this.state = "fragment"; - } else if (this.base.scheme === "file") { - this.state = "file"; - --this.pointer; - } else { - this.state = "relative"; - --this.pointer; - } - - return true; -}; - -URLStateMachine.prototype["parse special relative or authority"] = function parseSpecialRelativeOrAuthority(c) { - if (c === 47 && this.input[this.pointer + 1] === 47) { - this.state = "special authority ignore slashes"; - ++this.pointer; - } else { - this.parseError = true; - this.state = "relative"; - --this.pointer; - } - - return true; -}; - -URLStateMachine.prototype["parse path or authority"] = function parsePathOrAuthority(c) { - if (c === 47) { - this.state = "authority"; - } else { - this.state = "path"; - --this.pointer; - } - - return true; -}; - -URLStateMachine.prototype["parse relative"] = function parseRelative(c) { - this.url.scheme = this.base.scheme; - if (isNaN(c)) { - this.url.username = this.base.username; - this.url.password = this.base.password; - this.url.host = this.base.host; - this.url.port = this.base.port; - this.url.path = this.base.path.slice(); - this.url.query = this.base.query; - } else if (c === 47) { - this.state = "relative slash"; - } else if (c === 63) { - this.url.username = this.base.username; - this.url.password = this.base.password; - this.url.host = this.base.host; - this.url.port = this.base.port; - this.url.path = this.base.path.slice(); - this.url.query = ""; - this.state = "query"; - } else if (c === 35) { - this.url.username = this.base.username; - this.url.password = this.base.password; - this.url.host = this.base.host; - this.url.port = this.base.port; - this.url.path = this.base.path.slice(); - this.url.query = this.base.query; - this.url.fragment = ""; - this.state = "fragment"; - } else if (isSpecial(this.url) && c === 92) { - this.parseError = true; - this.state = "relative slash"; - } else { - this.url.username = this.base.username; - this.url.password = this.base.password; - this.url.host = this.base.host; - this.url.port = this.base.port; - this.url.path = this.base.path.slice(0, this.base.path.length - 1); - - this.state = "path"; - --this.pointer; - } - - return true; -}; - -URLStateMachine.prototype["parse relative slash"] = function parseRelativeSlash(c) { - if (isSpecial(this.url) && (c === 47 || c === 92)) { - if (c === 92) { - this.parseError = true; - } - this.state = "special authority ignore slashes"; - } else if (c === 47) { - this.state = "authority"; - } else { - this.url.username = this.base.username; - this.url.password = this.base.password; - this.url.host = this.base.host; - this.url.port = this.base.port; - this.state = "path"; - --this.pointer; - } - - return true; -}; - -URLStateMachine.prototype["parse special authority slashes"] = function parseSpecialAuthoritySlashes(c) { - if (c === 47 && this.input[this.pointer + 1] === 47) { - this.state = "special authority ignore slashes"; - ++this.pointer; - } else { - this.parseError = true; - this.state = "special authority ignore slashes"; - --this.pointer; - } - - return true; -}; - -URLStateMachine.prototype["parse special authority ignore slashes"] = function parseSpecialAuthorityIgnoreSlashes(c) { - if (c !== 47 && c !== 92) { - this.state = "authority"; - --this.pointer; - } else { - this.parseError = true; - } - - return true; -}; - -URLStateMachine.prototype["parse authority"] = function parseAuthority(c, cStr) { - if (c === 64) { - this.parseError = true; - if (this.atFlag) { - this.buffer = "%40" + this.buffer; - } - this.atFlag = true; - - // careful, this is based on buffer and has its own pointer (this.pointer != pointer) and inner chars - const len = countSymbols(this.buffer); - for (let pointer = 0; pointer < len; ++pointer) { - const codePoint = this.buffer.codePointAt(pointer); - - if (codePoint === 58 && !this.passwordTokenSeenFlag) { - this.passwordTokenSeenFlag = true; - continue; - } - const encodedCodePoints = percentEncodeChar(codePoint, isUserinfoPercentEncode); - if (this.passwordTokenSeenFlag) { - this.url.password += encodedCodePoints; - } else { - this.url.username += encodedCodePoints; - } - } - this.buffer = ""; - } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || - (isSpecial(this.url) && c === 92)) { - if (this.atFlag && this.buffer === "") { - this.parseError = true; - return failure; - } - this.pointer -= countSymbols(this.buffer) + 1; - this.buffer = ""; - this.state = "host"; - } else { - this.buffer += cStr; - } - - return true; -}; - -URLStateMachine.prototype["parse hostname"] = -URLStateMachine.prototype["parse host"] = function parseHostName(c, cStr) { - if (this.stateOverride && this.url.scheme === "file") { - --this.pointer; - this.state = "file host"; - } else if (c === 58 && !this.arrFlag) { - if (this.buffer === "") { - this.parseError = true; - return failure; - } - - const host = parseHost(this.buffer, isSpecial(this.url)); - if (host === failure) { - return failure; - } - - this.url.host = host; - this.buffer = ""; - this.state = "port"; - if (this.stateOverride === "hostname") { - return false; - } - } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || - (isSpecial(this.url) && c === 92)) { - --this.pointer; - if (isSpecial(this.url) && this.buffer === "") { - this.parseError = true; - return failure; - } else if (this.stateOverride && this.buffer === "" && - (includesCredentials(this.url) || this.url.port !== null)) { - this.parseError = true; - return false; - } - - const host = parseHost(this.buffer, isSpecial(this.url)); - if (host === failure) { - return failure; - } - - this.url.host = host; - this.buffer = ""; - this.state = "path start"; - if (this.stateOverride) { - return false; - } - } else { - if (c === 91) { - this.arrFlag = true; - } else if (c === 93) { - this.arrFlag = false; - } - this.buffer += cStr; - } - - return true; -}; - -URLStateMachine.prototype["parse port"] = function parsePort(c, cStr) { - if (isASCIIDigit(c)) { - this.buffer += cStr; - } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || - (isSpecial(this.url) && c === 92) || - this.stateOverride) { - if (this.buffer !== "") { - const port = parseInt(this.buffer); - if (port > Math.pow(2, 16) - 1) { - this.parseError = true; - return failure; - } - this.url.port = port === defaultPort(this.url.scheme) ? null : port; - this.buffer = ""; - } - if (this.stateOverride) { - return false; - } - this.state = "path start"; - --this.pointer; - } else { - this.parseError = true; - return failure; - } - - return true; -}; - -const fileOtherwiseCodePoints = new Set([47, 92, 63, 35]); - -URLStateMachine.prototype["parse file"] = function parseFile(c) { - this.url.scheme = "file"; - - if (c === 47 || c === 92) { - if (c === 92) { - this.parseError = true; - } - this.state = "file slash"; - } else if (this.base !== null && this.base.scheme === "file") { - if (isNaN(c)) { - this.url.host = this.base.host; - this.url.path = this.base.path.slice(); - this.url.query = this.base.query; - } else if (c === 63) { - this.url.host = this.base.host; - this.url.path = this.base.path.slice(); - this.url.query = ""; - this.state = "query"; - } else if (c === 35) { - this.url.host = this.base.host; - this.url.path = this.base.path.slice(); - this.url.query = this.base.query; - this.url.fragment = ""; - this.state = "fragment"; - } else { - if (this.input.length - this.pointer - 1 === 0 || // remaining consists of 0 code points - !isWindowsDriveLetterCodePoints(c, this.input[this.pointer + 1]) || - (this.input.length - this.pointer - 1 >= 2 && // remaining has at least 2 code points - !fileOtherwiseCodePoints.has(this.input[this.pointer + 2]))) { - this.url.host = this.base.host; - this.url.path = this.base.path.slice(); - shortenPath(this.url); - } else { - this.parseError = true; - } - - this.state = "path"; - --this.pointer; - } - } else { - this.state = "path"; - --this.pointer; - } - - return true; -}; - -URLStateMachine.prototype["parse file slash"] = function parseFileSlash(c) { - if (c === 47 || c === 92) { - if (c === 92) { - this.parseError = true; - } - this.state = "file host"; - } else { - if (this.base !== null && this.base.scheme === "file") { - if (isNormalizedWindowsDriveLetterString(this.base.path[0])) { - this.url.path.push(this.base.path[0]); - } else { - this.url.host = this.base.host; - } - } - this.state = "path"; - --this.pointer; - } - - return true; -}; - -URLStateMachine.prototype["parse file host"] = function parseFileHost(c, cStr) { - if (isNaN(c) || c === 47 || c === 92 || c === 63 || c === 35) { - --this.pointer; - if (!this.stateOverride && isWindowsDriveLetterString(this.buffer)) { - this.parseError = true; - this.state = "path"; - } else if (this.buffer === "") { - this.url.host = ""; - if (this.stateOverride) { - return false; - } - this.state = "path start"; - } else { - let host = parseHost(this.buffer, isSpecial(this.url)); - if (host === failure) { - return failure; - } - if (host === "localhost") { - host = ""; - } - this.url.host = host; - - if (this.stateOverride) { - return false; - } - - this.buffer = ""; - this.state = "path start"; - } - } else { - this.buffer += cStr; - } - - return true; -}; - -URLStateMachine.prototype["parse path start"] = function parsePathStart(c) { - if (isSpecial(this.url)) { - if (c === 92) { - this.parseError = true; - } - this.state = "path"; - - if (c !== 47 && c !== 92) { - --this.pointer; - } - } else if (!this.stateOverride && c === 63) { - this.url.query = ""; - this.state = "query"; - } else if (!this.stateOverride && c === 35) { - this.url.fragment = ""; - this.state = "fragment"; - } else if (c !== undefined) { - this.state = "path"; - if (c !== 47) { - --this.pointer; - } - } - - return true; -}; - -URLStateMachine.prototype["parse path"] = function parsePath(c) { - if (isNaN(c) || c === 47 || (isSpecial(this.url) && c === 92) || - (!this.stateOverride && (c === 63 || c === 35))) { - if (isSpecial(this.url) && c === 92) { - this.parseError = true; - } - - if (isDoubleDot(this.buffer)) { - shortenPath(this.url); - if (c !== 47 && !(isSpecial(this.url) && c === 92)) { - this.url.path.push(""); - } - } else if (isSingleDot(this.buffer) && c !== 47 && - !(isSpecial(this.url) && c === 92)) { - this.url.path.push(""); - } else if (!isSingleDot(this.buffer)) { - if (this.url.scheme === "file" && this.url.path.length === 0 && isWindowsDriveLetterString(this.buffer)) { - if (this.url.host !== "" && this.url.host !== null) { - this.parseError = true; - this.url.host = ""; - } - this.buffer = this.buffer[0] + ":"; - } - this.url.path.push(this.buffer); - } - this.buffer = ""; - if (this.url.scheme === "file" && (c === undefined || c === 63 || c === 35)) { - while (this.url.path.length > 1 && this.url.path[0] === "") { - this.parseError = true; - this.url.path.shift(); - } - } - if (c === 63) { - this.url.query = ""; - this.state = "query"; - } - if (c === 35) { - this.url.fragment = ""; - this.state = "fragment"; - } - } else { - // TODO: If c is not a URL code point and not "%", parse error. - - if (c === 37 && - (!isASCIIHex(this.input[this.pointer + 1]) || - !isASCIIHex(this.input[this.pointer + 2]))) { - this.parseError = true; - } - - this.buffer += percentEncodeChar(c, isPathPercentEncode); - } - - return true; -}; - -URLStateMachine.prototype["parse cannot-be-a-base-URL path"] = function parseCannotBeABaseURLPath(c) { - if (c === 63) { - this.url.query = ""; - this.state = "query"; - } else if (c === 35) { - this.url.fragment = ""; - this.state = "fragment"; - } else { - // TODO: Add: not a URL code point - if (!isNaN(c) && c !== 37) { - this.parseError = true; - } - - if (c === 37 && - (!isASCIIHex(this.input[this.pointer + 1]) || - !isASCIIHex(this.input[this.pointer + 2]))) { - this.parseError = true; - } - - if (!isNaN(c)) { - this.url.path[0] = this.url.path[0] + percentEncodeChar(c, isC0ControlPercentEncode); - } - } - - return true; -}; - -URLStateMachine.prototype["parse query"] = function parseQuery(c, cStr) { - if (isNaN(c) || (!this.stateOverride && c === 35)) { - if (!isSpecial(this.url) || this.url.scheme === "ws" || this.url.scheme === "wss") { - this.encodingOverride = "utf-8"; - } - - const buffer = new Buffer(this.buffer); // TODO: Use encoding override instead - for (let i = 0; i < buffer.length; ++i) { - if (buffer[i] < 0x21 || buffer[i] > 0x7E || buffer[i] === 0x22 || buffer[i] === 0x23 || - buffer[i] === 0x3C || buffer[i] === 0x3E) { - this.url.query += percentEncode(buffer[i]); - } else { - this.url.query += String.fromCodePoint(buffer[i]); - } - } - - this.buffer = ""; - if (c === 35) { - this.url.fragment = ""; - this.state = "fragment"; - } - } else { - // TODO: If c is not a URL code point and not "%", parse error. - if (c === 37 && - (!isASCIIHex(this.input[this.pointer + 1]) || - !isASCIIHex(this.input[this.pointer + 2]))) { - this.parseError = true; - } - - this.buffer += cStr; - } - - return true; -}; - -URLStateMachine.prototype["parse fragment"] = function parseFragment(c) { - if (isNaN(c)) { // do nothing - } else if (c === 0x0) { - this.parseError = true; - } else { - // TODO: If c is not a URL code point and not "%", parse error. - if (c === 37 && - (!isASCIIHex(this.input[this.pointer + 1]) || - !isASCIIHex(this.input[this.pointer + 2]))) { - this.parseError = true; - } - - this.url.fragment += percentEncodeChar(c, isC0ControlPercentEncode); - } - - return true; -}; - -function serializeURL(url, excludeFragment) { - let output = url.scheme + ":"; - if (url.host !== null) { - output += "//"; - - if (url.username !== "" || url.password !== "") { - output += url.username; - if (url.password !== "") { - output += ":" + url.password; - } - output += "@"; - } - - output += serializeHost(url.host); - - if (url.port !== null) { - output += ":" + url.port; - } - } else if (url.host === null && url.scheme === "file") { - output += "//"; - } - - if (url.cannotBeABaseURL) { - output += url.path[0]; - } else { - for (const string of url.path) { - output += "/" + string; - } - } - - if (url.query !== null) { - output += "?" + url.query; - } - - if (!excludeFragment && url.fragment !== null) { - output += "#" + url.fragment; - } - - return output; -} - -function serializeOrigin(tuple) { - let result = tuple.scheme + "://"; - result += serializeHost(tuple.host); - - if (tuple.port !== null) { - result += ":" + tuple.port; - } - - return result; -} - -module.exports.serializeURL = serializeURL; - -module.exports.serializeURLOrigin = function (url) { - // https://url.spec.whatwg.org/#concept-url-origin - switch (url.scheme) { - case "blob": - try { - return module.exports.serializeURLOrigin(module.exports.parseURL(url.path[0])); - } catch (e) { - // serializing an opaque origin returns "null" - return "null"; - } - case "ftp": - case "gopher": - case "http": - case "https": - case "ws": - case "wss": - return serializeOrigin({ - scheme: url.scheme, - host: url.host, - port: url.port - }); - case "file": - // spec says "exercise to the reader", chrome says "file://" - return "file://"; - default: - // serializing an opaque origin returns "null" - return "null"; - } -}; - -module.exports.basicURLParse = function (input, options) { - if (options === undefined) { - options = {}; - } - - const usm = new URLStateMachine(input, options.baseURL, options.encodingOverride, options.url, options.stateOverride); - if (usm.failure) { - return "failure"; - } - - return usm.url; -}; - -module.exports.setTheUsername = function (url, username) { - url.username = ""; - const decoded = punycode.ucs2.decode(username); - for (let i = 0; i < decoded.length; ++i) { - url.username += percentEncodeChar(decoded[i], isUserinfoPercentEncode); - } -}; - -module.exports.setThePassword = function (url, password) { - url.password = ""; - const decoded = punycode.ucs2.decode(password); - for (let i = 0; i < decoded.length; ++i) { - url.password += percentEncodeChar(decoded[i], isUserinfoPercentEncode); - } -}; - -module.exports.serializeHost = serializeHost; - -module.exports.cannotHaveAUsernamePasswordPort = cannotHaveAUsernamePasswordPort; - -module.exports.serializeInteger = function (integer) { - return String(integer); -}; - -module.exports.parseURL = function (input, options) { - if (options === undefined) { - options = {}; - } - - // We don't handle blobs, so this just delegates: - return module.exports.basicURLParse(input, { baseURL: options.baseURL, encodingOverride: options.encodingOverride }); -}; + +const punycode = __nccwpck_require__(5477); +const tr46 = __nccwpck_require__(2299); + +const specialSchemes = { + ftp: 21, + file: null, + gopher: 70, + http: 80, + https: 443, + ws: 80, + wss: 443 +}; + +const failure = Symbol("failure"); + +function countSymbols(str) { + return punycode.ucs2.decode(str).length; +} + +function at(input, idx) { + const c = input[idx]; + return isNaN(c) ? undefined : String.fromCodePoint(c); +} + +function isASCIIDigit(c) { + return c >= 0x30 && c <= 0x39; +} + +function isASCIIAlpha(c) { + return (c >= 0x41 && c <= 0x5A) || (c >= 0x61 && c <= 0x7A); +} + +function isASCIIAlphanumeric(c) { + return isASCIIAlpha(c) || isASCIIDigit(c); +} + +function isASCIIHex(c) { + return isASCIIDigit(c) || (c >= 0x41 && c <= 0x46) || (c >= 0x61 && c <= 0x66); +} + +function isSingleDot(buffer) { + return buffer === "." || buffer.toLowerCase() === "%2e"; +} + +function isDoubleDot(buffer) { + buffer = buffer.toLowerCase(); + return buffer === ".." || buffer === "%2e." || buffer === ".%2e" || buffer === "%2e%2e"; +} + +function isWindowsDriveLetterCodePoints(cp1, cp2) { + return isASCIIAlpha(cp1) && (cp2 === 58 || cp2 === 124); +} + +function isWindowsDriveLetterString(string) { + return string.length === 2 && isASCIIAlpha(string.codePointAt(0)) && (string[1] === ":" || string[1] === "|"); +} + +function isNormalizedWindowsDriveLetterString(string) { + return string.length === 2 && isASCIIAlpha(string.codePointAt(0)) && string[1] === ":"; +} + +function containsForbiddenHostCodePoint(string) { + return string.search(/\u0000|\u0009|\u000A|\u000D|\u0020|#|%|\/|:|\?|@|\[|\\|\]/) !== -1; +} + +function containsForbiddenHostCodePointExcludingPercent(string) { + return string.search(/\u0000|\u0009|\u000A|\u000D|\u0020|#|\/|:|\?|@|\[|\\|\]/) !== -1; +} + +function isSpecialScheme(scheme) { + return specialSchemes[scheme] !== undefined; +} + +function isSpecial(url) { + return isSpecialScheme(url.scheme); +} + +function defaultPort(scheme) { + return specialSchemes[scheme]; +} + +function percentEncode(c) { + let hex = c.toString(16).toUpperCase(); + if (hex.length === 1) { + hex = "0" + hex; + } + + return "%" + hex; +} + +function utf8PercentEncode(c) { + const buf = new Buffer(c); + + let str = ""; + + for (let i = 0; i < buf.length; ++i) { + str += percentEncode(buf[i]); + } + + return str; +} + +function utf8PercentDecode(str) { + const input = new Buffer(str); + const output = []; + for (let i = 0; i < input.length; ++i) { + if (input[i] !== 37) { + output.push(input[i]); + } else if (input[i] === 37 && isASCIIHex(input[i + 1]) && isASCIIHex(input[i + 2])) { + output.push(parseInt(input.slice(i + 1, i + 3).toString(), 16)); + i += 2; + } else { + output.push(input[i]); + } + } + return new Buffer(output).toString(); +} + +function isC0ControlPercentEncode(c) { + return c <= 0x1F || c > 0x7E; +} + +const extraPathPercentEncodeSet = new Set([32, 34, 35, 60, 62, 63, 96, 123, 125]); +function isPathPercentEncode(c) { + return isC0ControlPercentEncode(c) || extraPathPercentEncodeSet.has(c); +} + +const extraUserinfoPercentEncodeSet = + new Set([47, 58, 59, 61, 64, 91, 92, 93, 94, 124]); +function isUserinfoPercentEncode(c) { + return isPathPercentEncode(c) || extraUserinfoPercentEncodeSet.has(c); +} + +function percentEncodeChar(c, encodeSetPredicate) { + const cStr = String.fromCodePoint(c); + + if (encodeSetPredicate(c)) { + return utf8PercentEncode(cStr); + } + + return cStr; +} + +function parseIPv4Number(input) { + let R = 10; + + if (input.length >= 2 && input.charAt(0) === "0" && input.charAt(1).toLowerCase() === "x") { + input = input.substring(2); + R = 16; + } else if (input.length >= 2 && input.charAt(0) === "0") { + input = input.substring(1); + R = 8; + } + + if (input === "") { + return 0; + } + + const regex = R === 10 ? /[^0-9]/ : (R === 16 ? /[^0-9A-Fa-f]/ : /[^0-7]/); + if (regex.test(input)) { + return failure; + } + + return parseInt(input, R); +} + +function parseIPv4(input) { + const parts = input.split("."); + if (parts[parts.length - 1] === "") { + if (parts.length > 1) { + parts.pop(); + } + } + + if (parts.length > 4) { + return input; + } + + const numbers = []; + for (const part of parts) { + if (part === "") { + return input; + } + const n = parseIPv4Number(part); + if (n === failure) { + return input; + } + + numbers.push(n); + } + + for (let i = 0; i < numbers.length - 1; ++i) { + if (numbers[i] > 255) { + return failure; + } + } + if (numbers[numbers.length - 1] >= Math.pow(256, 5 - numbers.length)) { + return failure; + } + + let ipv4 = numbers.pop(); + let counter = 0; + + for (const n of numbers) { + ipv4 += n * Math.pow(256, 3 - counter); + ++counter; + } + + return ipv4; +} + +function serializeIPv4(address) { + let output = ""; + let n = address; + + for (let i = 1; i <= 4; ++i) { + output = String(n % 256) + output; + if (i !== 4) { + output = "." + output; + } + n = Math.floor(n / 256); + } + + return output; +} + +function parseIPv6(input) { + const address = [0, 0, 0, 0, 0, 0, 0, 0]; + let pieceIndex = 0; + let compress = null; + let pointer = 0; + + input = punycode.ucs2.decode(input); + + if (input[pointer] === 58) { + if (input[pointer + 1] !== 58) { + return failure; + } + + pointer += 2; + ++pieceIndex; + compress = pieceIndex; + } + + while (pointer < input.length) { + if (pieceIndex === 8) { + return failure; + } + + if (input[pointer] === 58) { + if (compress !== null) { + return failure; + } + ++pointer; + ++pieceIndex; + compress = pieceIndex; + continue; + } + + let value = 0; + let length = 0; + + while (length < 4 && isASCIIHex(input[pointer])) { + value = value * 0x10 + parseInt(at(input, pointer), 16); + ++pointer; + ++length; + } + + if (input[pointer] === 46) { + if (length === 0) { + return failure; + } + + pointer -= length; + + if (pieceIndex > 6) { + return failure; + } + + let numbersSeen = 0; + + while (input[pointer] !== undefined) { + let ipv4Piece = null; + + if (numbersSeen > 0) { + if (input[pointer] === 46 && numbersSeen < 4) { + ++pointer; + } else { + return failure; + } + } + + if (!isASCIIDigit(input[pointer])) { + return failure; + } + + while (isASCIIDigit(input[pointer])) { + const number = parseInt(at(input, pointer)); + if (ipv4Piece === null) { + ipv4Piece = number; + } else if (ipv4Piece === 0) { + return failure; + } else { + ipv4Piece = ipv4Piece * 10 + number; + } + if (ipv4Piece > 255) { + return failure; + } + ++pointer; + } + + address[pieceIndex] = address[pieceIndex] * 0x100 + ipv4Piece; + + ++numbersSeen; + + if (numbersSeen === 2 || numbersSeen === 4) { + ++pieceIndex; + } + } + + if (numbersSeen !== 4) { + return failure; + } + + break; + } else if (input[pointer] === 58) { + ++pointer; + if (input[pointer] === undefined) { + return failure; + } + } else if (input[pointer] !== undefined) { + return failure; + } + + address[pieceIndex] = value; + ++pieceIndex; + } + + if (compress !== null) { + let swaps = pieceIndex - compress; + pieceIndex = 7; + while (pieceIndex !== 0 && swaps > 0) { + const temp = address[compress + swaps - 1]; + address[compress + swaps - 1] = address[pieceIndex]; + address[pieceIndex] = temp; + --pieceIndex; + --swaps; + } + } else if (compress === null && pieceIndex !== 8) { + return failure; + } + + return address; +} + +function serializeIPv6(address) { + let output = ""; + const seqResult = findLongestZeroSequence(address); + const compress = seqResult.idx; + let ignore0 = false; + + for (let pieceIndex = 0; pieceIndex <= 7; ++pieceIndex) { + if (ignore0 && address[pieceIndex] === 0) { + continue; + } else if (ignore0) { + ignore0 = false; + } + + if (compress === pieceIndex) { + const separator = pieceIndex === 0 ? "::" : ":"; + output += separator; + ignore0 = true; + continue; + } + + output += address[pieceIndex].toString(16); + + if (pieceIndex !== 7) { + output += ":"; + } + } + + return output; +} + +function parseHost(input, isSpecialArg) { + if (input[0] === "[") { + if (input[input.length - 1] !== "]") { + return failure; + } + + return parseIPv6(input.substring(1, input.length - 1)); + } + + if (!isSpecialArg) { + return parseOpaqueHost(input); + } + + const domain = utf8PercentDecode(input); + const asciiDomain = tr46.toASCII(domain, false, tr46.PROCESSING_OPTIONS.NONTRANSITIONAL, false); + if (asciiDomain === null) { + return failure; + } + + if (containsForbiddenHostCodePoint(asciiDomain)) { + return failure; + } + + const ipv4Host = parseIPv4(asciiDomain); + if (typeof ipv4Host === "number" || ipv4Host === failure) { + return ipv4Host; + } + + return asciiDomain; +} + +function parseOpaqueHost(input) { + if (containsForbiddenHostCodePointExcludingPercent(input)) { + return failure; + } + + let output = ""; + const decoded = punycode.ucs2.decode(input); + for (let i = 0; i < decoded.length; ++i) { + output += percentEncodeChar(decoded[i], isC0ControlPercentEncode); + } + return output; +} + +function findLongestZeroSequence(arr) { + let maxIdx = null; + let maxLen = 1; // only find elements > 1 + let currStart = null; + let currLen = 0; + + for (let i = 0; i < arr.length; ++i) { + if (arr[i] !== 0) { + if (currLen > maxLen) { + maxIdx = currStart; + maxLen = currLen; + } + + currStart = null; + currLen = 0; + } else { + if (currStart === null) { + currStart = i; + } + ++currLen; + } + } + + // if trailing zeros + if (currLen > maxLen) { + maxIdx = currStart; + maxLen = currLen; + } + + return { + idx: maxIdx, + len: maxLen + }; +} + +function serializeHost(host) { + if (typeof host === "number") { + return serializeIPv4(host); + } + + // IPv6 serializer + if (host instanceof Array) { + return "[" + serializeIPv6(host) + "]"; + } + + return host; +} + +function trimControlChars(url) { + return url.replace(/^[\u0000-\u001F\u0020]+|[\u0000-\u001F\u0020]+$/g, ""); +} + +function trimTabAndNewline(url) { + return url.replace(/\u0009|\u000A|\u000D/g, ""); +} + +function shortenPath(url) { + const path = url.path; + if (path.length === 0) { + return; + } + if (url.scheme === "file" && path.length === 1 && isNormalizedWindowsDriveLetter(path[0])) { + return; + } + + path.pop(); +} + +function includesCredentials(url) { + return url.username !== "" || url.password !== ""; +} + +function cannotHaveAUsernamePasswordPort(url) { + return url.host === null || url.host === "" || url.cannotBeABaseURL || url.scheme === "file"; +} + +function isNormalizedWindowsDriveLetter(string) { + return /^[A-Za-z]:$/.test(string); +} + +function URLStateMachine(input, base, encodingOverride, url, stateOverride) { + this.pointer = 0; + this.input = input; + this.base = base || null; + this.encodingOverride = encodingOverride || "utf-8"; + this.stateOverride = stateOverride; + this.url = url; + this.failure = false; + this.parseError = false; + + if (!this.url) { + this.url = { + scheme: "", + username: "", + password: "", + host: null, + port: null, + path: [], + query: null, + fragment: null, + + cannotBeABaseURL: false + }; + + const res = trimControlChars(this.input); + if (res !== this.input) { + this.parseError = true; + } + this.input = res; + } + + const res = trimTabAndNewline(this.input); + if (res !== this.input) { + this.parseError = true; + } + this.input = res; + + this.state = stateOverride || "scheme start"; + + this.buffer = ""; + this.atFlag = false; + this.arrFlag = false; + this.passwordTokenSeenFlag = false; + + this.input = punycode.ucs2.decode(this.input); + + for (; this.pointer <= this.input.length; ++this.pointer) { + const c = this.input[this.pointer]; + const cStr = isNaN(c) ? undefined : String.fromCodePoint(c); + + // exec state machine + const ret = this["parse " + this.state](c, cStr); + if (!ret) { + break; // terminate algorithm + } else if (ret === failure) { + this.failure = true; + break; + } + } +} + +URLStateMachine.prototype["parse scheme start"] = function parseSchemeStart(c, cStr) { + if (isASCIIAlpha(c)) { + this.buffer += cStr.toLowerCase(); + this.state = "scheme"; + } else if (!this.stateOverride) { + this.state = "no scheme"; + --this.pointer; + } else { + this.parseError = true; + return failure; + } + + return true; +}; + +URLStateMachine.prototype["parse scheme"] = function parseScheme(c, cStr) { + if (isASCIIAlphanumeric(c) || c === 43 || c === 45 || c === 46) { + this.buffer += cStr.toLowerCase(); + } else if (c === 58) { + if (this.stateOverride) { + if (isSpecial(this.url) && !isSpecialScheme(this.buffer)) { + return false; + } + + if (!isSpecial(this.url) && isSpecialScheme(this.buffer)) { + return false; + } + + if ((includesCredentials(this.url) || this.url.port !== null) && this.buffer === "file") { + return false; + } + + if (this.url.scheme === "file" && (this.url.host === "" || this.url.host === null)) { + return false; + } + } + this.url.scheme = this.buffer; + this.buffer = ""; + if (this.stateOverride) { + return false; + } + if (this.url.scheme === "file") { + if (this.input[this.pointer + 1] !== 47 || this.input[this.pointer + 2] !== 47) { + this.parseError = true; + } + this.state = "file"; + } else if (isSpecial(this.url) && this.base !== null && this.base.scheme === this.url.scheme) { + this.state = "special relative or authority"; + } else if (isSpecial(this.url)) { + this.state = "special authority slashes"; + } else if (this.input[this.pointer + 1] === 47) { + this.state = "path or authority"; + ++this.pointer; + } else { + this.url.cannotBeABaseURL = true; + this.url.path.push(""); + this.state = "cannot-be-a-base-URL path"; + } + } else if (!this.stateOverride) { + this.buffer = ""; + this.state = "no scheme"; + this.pointer = -1; + } else { + this.parseError = true; + return failure; + } + + return true; +}; + +URLStateMachine.prototype["parse no scheme"] = function parseNoScheme(c) { + if (this.base === null || (this.base.cannotBeABaseURL && c !== 35)) { + return failure; + } else if (this.base.cannotBeABaseURL && c === 35) { + this.url.scheme = this.base.scheme; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + this.url.fragment = ""; + this.url.cannotBeABaseURL = true; + this.state = "fragment"; + } else if (this.base.scheme === "file") { + this.state = "file"; + --this.pointer; + } else { + this.state = "relative"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse special relative or authority"] = function parseSpecialRelativeOrAuthority(c) { + if (c === 47 && this.input[this.pointer + 1] === 47) { + this.state = "special authority ignore slashes"; + ++this.pointer; + } else { + this.parseError = true; + this.state = "relative"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse path or authority"] = function parsePathOrAuthority(c) { + if (c === 47) { + this.state = "authority"; + } else { + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse relative"] = function parseRelative(c) { + this.url.scheme = this.base.scheme; + if (isNaN(c)) { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + } else if (c === 47) { + this.state = "relative slash"; + } else if (c === 63) { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.url.path = this.base.path.slice(); + this.url.query = ""; + this.state = "query"; + } else if (c === 35) { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + this.url.fragment = ""; + this.state = "fragment"; + } else if (isSpecial(this.url) && c === 92) { + this.parseError = true; + this.state = "relative slash"; + } else { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.url.path = this.base.path.slice(0, this.base.path.length - 1); + + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse relative slash"] = function parseRelativeSlash(c) { + if (isSpecial(this.url) && (c === 47 || c === 92)) { + if (c === 92) { + this.parseError = true; + } + this.state = "special authority ignore slashes"; + } else if (c === 47) { + this.state = "authority"; + } else { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse special authority slashes"] = function parseSpecialAuthoritySlashes(c) { + if (c === 47 && this.input[this.pointer + 1] === 47) { + this.state = "special authority ignore slashes"; + ++this.pointer; + } else { + this.parseError = true; + this.state = "special authority ignore slashes"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse special authority ignore slashes"] = function parseSpecialAuthorityIgnoreSlashes(c) { + if (c !== 47 && c !== 92) { + this.state = "authority"; + --this.pointer; + } else { + this.parseError = true; + } + + return true; +}; + +URLStateMachine.prototype["parse authority"] = function parseAuthority(c, cStr) { + if (c === 64) { + this.parseError = true; + if (this.atFlag) { + this.buffer = "%40" + this.buffer; + } + this.atFlag = true; + + // careful, this is based on buffer and has its own pointer (this.pointer != pointer) and inner chars + const len = countSymbols(this.buffer); + for (let pointer = 0; pointer < len; ++pointer) { + const codePoint = this.buffer.codePointAt(pointer); + + if (codePoint === 58 && !this.passwordTokenSeenFlag) { + this.passwordTokenSeenFlag = true; + continue; + } + const encodedCodePoints = percentEncodeChar(codePoint, isUserinfoPercentEncode); + if (this.passwordTokenSeenFlag) { + this.url.password += encodedCodePoints; + } else { + this.url.username += encodedCodePoints; + } + } + this.buffer = ""; + } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || + (isSpecial(this.url) && c === 92)) { + if (this.atFlag && this.buffer === "") { + this.parseError = true; + return failure; + } + this.pointer -= countSymbols(this.buffer) + 1; + this.buffer = ""; + this.state = "host"; + } else { + this.buffer += cStr; + } + + return true; +}; + +URLStateMachine.prototype["parse hostname"] = +URLStateMachine.prototype["parse host"] = function parseHostName(c, cStr) { + if (this.stateOverride && this.url.scheme === "file") { + --this.pointer; + this.state = "file host"; + } else if (c === 58 && !this.arrFlag) { + if (this.buffer === "") { + this.parseError = true; + return failure; + } + + const host = parseHost(this.buffer, isSpecial(this.url)); + if (host === failure) { + return failure; + } + + this.url.host = host; + this.buffer = ""; + this.state = "port"; + if (this.stateOverride === "hostname") { + return false; + } + } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || + (isSpecial(this.url) && c === 92)) { + --this.pointer; + if (isSpecial(this.url) && this.buffer === "") { + this.parseError = true; + return failure; + } else if (this.stateOverride && this.buffer === "" && + (includesCredentials(this.url) || this.url.port !== null)) { + this.parseError = true; + return false; + } + + const host = parseHost(this.buffer, isSpecial(this.url)); + if (host === failure) { + return failure; + } + + this.url.host = host; + this.buffer = ""; + this.state = "path start"; + if (this.stateOverride) { + return false; + } + } else { + if (c === 91) { + this.arrFlag = true; + } else if (c === 93) { + this.arrFlag = false; + } + this.buffer += cStr; + } + + return true; +}; + +URLStateMachine.prototype["parse port"] = function parsePort(c, cStr) { + if (isASCIIDigit(c)) { + this.buffer += cStr; + } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || + (isSpecial(this.url) && c === 92) || + this.stateOverride) { + if (this.buffer !== "") { + const port = parseInt(this.buffer); + if (port > Math.pow(2, 16) - 1) { + this.parseError = true; + return failure; + } + this.url.port = port === defaultPort(this.url.scheme) ? null : port; + this.buffer = ""; + } + if (this.stateOverride) { + return false; + } + this.state = "path start"; + --this.pointer; + } else { + this.parseError = true; + return failure; + } + + return true; +}; + +const fileOtherwiseCodePoints = new Set([47, 92, 63, 35]); + +URLStateMachine.prototype["parse file"] = function parseFile(c) { + this.url.scheme = "file"; + + if (c === 47 || c === 92) { + if (c === 92) { + this.parseError = true; + } + this.state = "file slash"; + } else if (this.base !== null && this.base.scheme === "file") { + if (isNaN(c)) { + this.url.host = this.base.host; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + } else if (c === 63) { + this.url.host = this.base.host; + this.url.path = this.base.path.slice(); + this.url.query = ""; + this.state = "query"; + } else if (c === 35) { + this.url.host = this.base.host; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + this.url.fragment = ""; + this.state = "fragment"; + } else { + if (this.input.length - this.pointer - 1 === 0 || // remaining consists of 0 code points + !isWindowsDriveLetterCodePoints(c, this.input[this.pointer + 1]) || + (this.input.length - this.pointer - 1 >= 2 && // remaining has at least 2 code points + !fileOtherwiseCodePoints.has(this.input[this.pointer + 2]))) { + this.url.host = this.base.host; + this.url.path = this.base.path.slice(); + shortenPath(this.url); + } else { + this.parseError = true; + } + + this.state = "path"; + --this.pointer; + } + } else { + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse file slash"] = function parseFileSlash(c) { + if (c === 47 || c === 92) { + if (c === 92) { + this.parseError = true; + } + this.state = "file host"; + } else { + if (this.base !== null && this.base.scheme === "file") { + if (isNormalizedWindowsDriveLetterString(this.base.path[0])) { + this.url.path.push(this.base.path[0]); + } else { + this.url.host = this.base.host; + } + } + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse file host"] = function parseFileHost(c, cStr) { + if (isNaN(c) || c === 47 || c === 92 || c === 63 || c === 35) { + --this.pointer; + if (!this.stateOverride && isWindowsDriveLetterString(this.buffer)) { + this.parseError = true; + this.state = "path"; + } else if (this.buffer === "") { + this.url.host = ""; + if (this.stateOverride) { + return false; + } + this.state = "path start"; + } else { + let host = parseHost(this.buffer, isSpecial(this.url)); + if (host === failure) { + return failure; + } + if (host === "localhost") { + host = ""; + } + this.url.host = host; + + if (this.stateOverride) { + return false; + } + + this.buffer = ""; + this.state = "path start"; + } + } else { + this.buffer += cStr; + } + + return true; +}; + +URLStateMachine.prototype["parse path start"] = function parsePathStart(c) { + if (isSpecial(this.url)) { + if (c === 92) { + this.parseError = true; + } + this.state = "path"; + + if (c !== 47 && c !== 92) { + --this.pointer; + } + } else if (!this.stateOverride && c === 63) { + this.url.query = ""; + this.state = "query"; + } else if (!this.stateOverride && c === 35) { + this.url.fragment = ""; + this.state = "fragment"; + } else if (c !== undefined) { + this.state = "path"; + if (c !== 47) { + --this.pointer; + } + } + + return true; +}; + +URLStateMachine.prototype["parse path"] = function parsePath(c) { + if (isNaN(c) || c === 47 || (isSpecial(this.url) && c === 92) || + (!this.stateOverride && (c === 63 || c === 35))) { + if (isSpecial(this.url) && c === 92) { + this.parseError = true; + } + + if (isDoubleDot(this.buffer)) { + shortenPath(this.url); + if (c !== 47 && !(isSpecial(this.url) && c === 92)) { + this.url.path.push(""); + } + } else if (isSingleDot(this.buffer) && c !== 47 && + !(isSpecial(this.url) && c === 92)) { + this.url.path.push(""); + } else if (!isSingleDot(this.buffer)) { + if (this.url.scheme === "file" && this.url.path.length === 0 && isWindowsDriveLetterString(this.buffer)) { + if (this.url.host !== "" && this.url.host !== null) { + this.parseError = true; + this.url.host = ""; + } + this.buffer = this.buffer[0] + ":"; + } + this.url.path.push(this.buffer); + } + this.buffer = ""; + if (this.url.scheme === "file" && (c === undefined || c === 63 || c === 35)) { + while (this.url.path.length > 1 && this.url.path[0] === "") { + this.parseError = true; + this.url.path.shift(); + } + } + if (c === 63) { + this.url.query = ""; + this.state = "query"; + } + if (c === 35) { + this.url.fragment = ""; + this.state = "fragment"; + } + } else { + // TODO: If c is not a URL code point and not "%", parse error. + + if (c === 37 && + (!isASCIIHex(this.input[this.pointer + 1]) || + !isASCIIHex(this.input[this.pointer + 2]))) { + this.parseError = true; + } + + this.buffer += percentEncodeChar(c, isPathPercentEncode); + } + + return true; +}; + +URLStateMachine.prototype["parse cannot-be-a-base-URL path"] = function parseCannotBeABaseURLPath(c) { + if (c === 63) { + this.url.query = ""; + this.state = "query"; + } else if (c === 35) { + this.url.fragment = ""; + this.state = "fragment"; + } else { + // TODO: Add: not a URL code point + if (!isNaN(c) && c !== 37) { + this.parseError = true; + } + + if (c === 37 && + (!isASCIIHex(this.input[this.pointer + 1]) || + !isASCIIHex(this.input[this.pointer + 2]))) { + this.parseError = true; + } + + if (!isNaN(c)) { + this.url.path[0] = this.url.path[0] + percentEncodeChar(c, isC0ControlPercentEncode); + } + } + + return true; +}; + +URLStateMachine.prototype["parse query"] = function parseQuery(c, cStr) { + if (isNaN(c) || (!this.stateOverride && c === 35)) { + if (!isSpecial(this.url) || this.url.scheme === "ws" || this.url.scheme === "wss") { + this.encodingOverride = "utf-8"; + } + + const buffer = new Buffer(this.buffer); // TODO: Use encoding override instead + for (let i = 0; i < buffer.length; ++i) { + if (buffer[i] < 0x21 || buffer[i] > 0x7E || buffer[i] === 0x22 || buffer[i] === 0x23 || + buffer[i] === 0x3C || buffer[i] === 0x3E) { + this.url.query += percentEncode(buffer[i]); + } else { + this.url.query += String.fromCodePoint(buffer[i]); + } + } + + this.buffer = ""; + if (c === 35) { + this.url.fragment = ""; + this.state = "fragment"; + } + } else { + // TODO: If c is not a URL code point and not "%", parse error. + if (c === 37 && + (!isASCIIHex(this.input[this.pointer + 1]) || + !isASCIIHex(this.input[this.pointer + 2]))) { + this.parseError = true; + } + + this.buffer += cStr; + } + + return true; +}; + +URLStateMachine.prototype["parse fragment"] = function parseFragment(c) { + if (isNaN(c)) { // do nothing + } else if (c === 0x0) { + this.parseError = true; + } else { + // TODO: If c is not a URL code point and not "%", parse error. + if (c === 37 && + (!isASCIIHex(this.input[this.pointer + 1]) || + !isASCIIHex(this.input[this.pointer + 2]))) { + this.parseError = true; + } + + this.url.fragment += percentEncodeChar(c, isC0ControlPercentEncode); + } + + return true; +}; + +function serializeURL(url, excludeFragment) { + let output = url.scheme + ":"; + if (url.host !== null) { + output += "//"; + + if (url.username !== "" || url.password !== "") { + output += url.username; + if (url.password !== "") { + output += ":" + url.password; + } + output += "@"; + } + + output += serializeHost(url.host); + + if (url.port !== null) { + output += ":" + url.port; + } + } else if (url.host === null && url.scheme === "file") { + output += "//"; + } + + if (url.cannotBeABaseURL) { + output += url.path[0]; + } else { + for (const string of url.path) { + output += "/" + string; + } + } + + if (url.query !== null) { + output += "?" + url.query; + } + + if (!excludeFragment && url.fragment !== null) { + output += "#" + url.fragment; + } + + return output; +} + +function serializeOrigin(tuple) { + let result = tuple.scheme + "://"; + result += serializeHost(tuple.host); + + if (tuple.port !== null) { + result += ":" + tuple.port; + } + + return result; +} + +module.exports.serializeURL = serializeURL; + +module.exports.serializeURLOrigin = function (url) { + // https://url.spec.whatwg.org/#concept-url-origin + switch (url.scheme) { + case "blob": + try { + return module.exports.serializeURLOrigin(module.exports.parseURL(url.path[0])); + } catch (e) { + // serializing an opaque origin returns "null" + return "null"; + } + case "ftp": + case "gopher": + case "http": + case "https": + case "ws": + case "wss": + return serializeOrigin({ + scheme: url.scheme, + host: url.host, + port: url.port + }); + case "file": + // spec says "exercise to the reader", chrome says "file://" + return "file://"; + default: + // serializing an opaque origin returns "null" + return "null"; + } +}; + +module.exports.basicURLParse = function (input, options) { + if (options === undefined) { + options = {}; + } + + const usm = new URLStateMachine(input, options.baseURL, options.encodingOverride, options.url, options.stateOverride); + if (usm.failure) { + return "failure"; + } + + return usm.url; +}; + +module.exports.setTheUsername = function (url, username) { + url.username = ""; + const decoded = punycode.ucs2.decode(username); + for (let i = 0; i < decoded.length; ++i) { + url.username += percentEncodeChar(decoded[i], isUserinfoPercentEncode); + } +}; + +module.exports.setThePassword = function (url, password) { + url.password = ""; + const decoded = punycode.ucs2.decode(password); + for (let i = 0; i < decoded.length; ++i) { + url.password += percentEncodeChar(decoded[i], isUserinfoPercentEncode); + } +}; + +module.exports.serializeHost = serializeHost; + +module.exports.cannotHaveAUsernamePasswordPort = cannotHaveAUsernamePasswordPort; + +module.exports.serializeInteger = function (integer) { + return String(integer); +}; + +module.exports.parseURL = function (input, options) { + if (options === undefined) { + options = {}; + } + + // We don't handle blobs, so this just delegates: + return module.exports.basicURLParse(input, { baseURL: options.baseURL, encodingOverride: options.encodingOverride }); +}; /***/ }), diff --git a/.github/actions/javascript/getPreviousVersion/index.js b/.github/actions/javascript/getPreviousVersion/index.js index 63498e68fcdf..85e458af6947 100644 --- a/.github/actions/javascript/getPreviousVersion/index.js +++ b/.github/actions/javascript/getPreviousVersion/index.js @@ -74,8 +74,8 @@ const incrementPatch = (major, minor, patch) => { /** * Increments a build version * - * @param {Number} version - * @param {Number} level + * @param {String} version + * @param {String} level * @returns {String} */ const incrementVersion = (version, level) => { From fb9af0c9513656a97d531ee2f679a3e97bac2bea Mon Sep 17 00:00:00 2001 From: Bartosz Grajdek Date: Wed, 7 Feb 2024 14:11:37 +0100 Subject: [PATCH 122/288] fix: permissions & typecheck --- src/components/MoneyRequestHeader.js | 2 +- src/libs/actions/IOU.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/MoneyRequestHeader.js b/src/components/MoneyRequestHeader.js index 2527ae40db2c..5a9a7da29672 100644 --- a/src/components/MoneyRequestHeader.js +++ b/src/components/MoneyRequestHeader.js @@ -125,7 +125,7 @@ function MoneyRequestHeader({session, parentReport, report, parentReportAction, const isRequestIOU = lodashGet(parentReport, 'type') === 'iou'; const isHoldCreator = ReportUtils.isHoldCreator(transaction, lodashGet(report, 'reportID')) && isRequestIOU; const canModifyStatus = isPolicyAdmin || isActionOwner || isApprover; - if (isOnHold && (isHoldCreator || canModifyStatus)) { + if (isOnHold && (isHoldCreator || (!isRequestIOU && canModifyStatus))) { threeDotsMenuItems.push({ icon: Expensicons.Stopwatch, text: translate('iou.unholdRequest'), diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index e2bf0d25ed42..c30fe0a8cc8b 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -3653,7 +3653,7 @@ function putOnHold(transactionID: string, comment: string, reportID: string) { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`, value: { - [createdReportAction.reportActionID]: createdReportAction, + [createdReportAction.reportActionID]: createdReportAction as ReportAction, }, }, { @@ -3710,7 +3710,7 @@ function unholdRequest(transactionID: string, reportID: string) { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`, value: { - [createdReportAction.reportActionID]: createdReportAction, + [createdReportAction.reportActionID]: createdReportAction as ReportAction, }, }, { From 9f2dd51282766be7d05ebcd11f8cdab945b476a3 Mon Sep 17 00:00:00 2001 From: Bartosz Grajdek Date: Wed, 7 Feb 2024 14:14:37 +0100 Subject: [PATCH 123/288] fix: add testID to ProcessMoneyRequestHoldPage --- src/pages/ProcessMoneyRequestHoldPage.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/ProcessMoneyRequestHoldPage.tsx b/src/pages/ProcessMoneyRequestHoldPage.tsx index 2e2340b9ec78..f97991ec32f5 100644 --- a/src/pages/ProcessMoneyRequestHoldPage.tsx +++ b/src/pages/ProcessMoneyRequestHoldPage.tsx @@ -35,6 +35,7 @@ function ProcessMoneyRequestHoldPage() { title={translate('common.back')} footer={footerComponent} onBackButtonPress={() => Navigation.goBack()} + testID={ProcessMoneyRequestHoldPage.displayName} > From b1b7451b5e460639040a44194215b3db11291f77 Mon Sep 17 00:00:00 2001 From: vadymbokatov <138146362+vadymbokatov@users.noreply.github.com> Date: Thu, 8 Feb 2024 10:09:36 +0100 Subject: [PATCH 124/288] Update src/hooks/useBasePopoverReactionList/index.ts Co-authored-by: Getabalew Tesfaye <75031127+getusha@users.noreply.github.com> --- src/hooks/useBasePopoverReactionList/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hooks/useBasePopoverReactionList/index.ts b/src/hooks/useBasePopoverReactionList/index.ts index ae7afc230bf9..5f598d9eb1dd 100644 --- a/src/hooks/useBasePopoverReactionList/index.ts +++ b/src/hooks/useBasePopoverReactionList/index.ts @@ -117,7 +117,7 @@ export default function useBasePopoverReactionList({emojiName, emojiReactions, a } // Hide the list when all reactions are removed - const users = emojiReactions?.[emojiName].users; + const users = emojiReactions?.[emojiName]?.users; const isEmptyList = users && Object.keys(users).length === 0; if (!isEmptyList) { From 619e8bce02addcc4641e2e5973a0d7371564f814 Mon Sep 17 00:00:00 2001 From: Wojciech Boman Date: Thu, 8 Feb 2024 14:54:17 +0100 Subject: [PATCH 125/288] Upgrade @rnmapbox/maps --- ios/Podfile.lock | 30 +++++++++++++++--------------- package-lock.json | 8 ++++---- package.json | 2 +- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 1664c982ce50..751ecbede06e 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -263,12 +263,12 @@ PODS: - lottie-react-native (6.4.1): - lottie-ios (~> 4.3.3) - React-Core - - MapboxCommon (23.6.0) - - MapboxCoreMaps (10.14.0): - - MapboxCommon (~> 23.6) - - MapboxMaps (10.14.0): - - MapboxCommon (= 23.6.0) - - MapboxCoreMaps (= 10.14.0) + - MapboxCommon (23.8.6) + - MapboxCoreMaps (10.16.4): + - MapboxCommon (~> 23.8) + - MapboxMaps (10.16.4): + - MapboxCommon (= 23.8.6) + - MapboxCoreMaps (= 10.16.4) - MapboxMobileEvents (= 1.0.10) - Turf (~> 2.0) - MapboxMobileEvents (1.0.10) @@ -1414,14 +1414,14 @@ PODS: - React-Core - RNLocalize (2.2.6): - React-Core - - rnmapbox-maps (10.0.11): - - MapboxMaps (~> 10.14.0) + - rnmapbox-maps (10.1.11): + - MapboxMaps (~> 10.16.4) - React - React-Core - - rnmapbox-maps/DynamicLibrary (= 10.0.11) + - rnmapbox-maps/DynamicLibrary (= 10.1.11) - Turf - - rnmapbox-maps/DynamicLibrary (10.0.11): - - MapboxMaps (~> 10.14.0) + - rnmapbox-maps/DynamicLibrary (10.1.11): + - MapboxMaps (~> 10.16.4) - React - React-Core - Turf @@ -1881,9 +1881,9 @@ SPEC CHECKSUMS: libwebp: 1786c9f4ff8a279e4dac1e8f385004d5fc253009 lottie-ios: 3d98679b41fa6fd6aff2352b3953dbd3df8a397e lottie-react-native: a2ae9c27c273b060b2affff2957bc0ff7fdca353 - MapboxCommon: 4a0251dd470ee37e7fadda8e285c01921a5e1eb0 - MapboxCoreMaps: eb07203bbb0b1509395db5ab89cd3ad6c2e3c04c - MapboxMaps: af50ec61a7eb3b032c3f7962c6bd671d93d2a209 + MapboxCommon: 90f76693dc02438acbb5ea9a5b266a4c0eb1c875 + MapboxCoreMaps: 7b07d1ca8c454a4381daf09df901b9d6bf90bce0 + MapboxMaps: cbb38845a9bf49b124f0e937975d560a4e01894e MapboxMobileEvents: de50b3a4de180dd129c326e09cd12c8adaaa46d6 nanopb: a0ba3315591a9ae0a16a309ee504766e90db0c96 Onfido: 564f60c39819635ec5b549285a1eec278cc9ba67 @@ -1968,7 +1968,7 @@ SPEC CHECKSUMS: RNGestureHandler: 25b969a1ffc806b9f9ad2e170d4a3b049c6af85e RNGoogleSignin: ccaa4a81582cf713eea562c5dd9dc1961a715fd0 RNLocalize: d4b8af4e442d4bcca54e68fc687a2129b4d71a81 - rnmapbox-maps: 6f638ec002aa6e906a6f766d69cd45f968d98e64 + rnmapbox-maps: fcf7f1cbdc8bd7569c267d07284e8a5c7bee06ed RNPermissions: 9b086c8f05b2e2faa587fdc31f4c5ab4509728aa RNReactNativeHapticFeedback: 1e3efeca9628ff9876ee7cdd9edec1b336913f8c RNReanimated: 57f436e7aa3d277fbfed05e003230b43428157c0 diff --git a/package-lock.json b/package-lock.json index 7e5eae30c680..012283307cd2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -40,7 +40,7 @@ "@react-navigation/native": "6.1.8", "@react-navigation/stack": "6.3.16", "@react-ng/bounds-observer": "^0.2.1", - "@rnmapbox/maps": "^10.0.11", + "@rnmapbox/maps": "^10.1.11", "@shopify/flash-list": "^1.6.3", "@ua/react-native-airship": "^15.3.1", "@vue/preload-webpack-plugin": "^2.0.0", @@ -10332,9 +10332,9 @@ } }, "node_modules/@rnmapbox/maps": { - "version": "10.0.11", - "resolved": "https://registry.npmjs.org/@rnmapbox/maps/-/maps-10.0.11.tgz", - "integrity": "sha512-CqaAOEV2nYjZzAwSd7RceGIVVIyDO0G/Vqdvgen20LDuejX9N9Yqw7BrMH8MgIH3FNFxtjwyXiw6aVtybpke0w==", + "version": "10.1.11", + "resolved": "https://registry.npmjs.org/@rnmapbox/maps/-/maps-10.1.11.tgz", + "integrity": "sha512-cizpwPOqMsrIHNcdiCngbr7uuWFYO/b6hLI3P+akRQULEVAbvoXOVVN1//h8LhCgUxmu9RQ1it5BamoyvdcftA==", "dependencies": { "@turf/along": "6.5.0", "@turf/distance": "6.5.0", diff --git a/package.json b/package.json index b05a72143e33..680e519205a0 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,7 @@ "@react-navigation/native": "6.1.8", "@react-navigation/stack": "6.3.16", "@react-ng/bounds-observer": "^0.2.1", - "@rnmapbox/maps": "^10.0.11", + "@rnmapbox/maps": "^10.1.11", "@shopify/flash-list": "^1.6.3", "@ua/react-native-airship": "^15.3.1", "@vue/preload-webpack-plugin": "^2.0.0", From e9761c395dfd8b46a0b0838103eff055f3baa3b8 Mon Sep 17 00:00:00 2001 From: Vadym Date: Thu, 8 Feb 2024 15:45:03 +0100 Subject: [PATCH 126/288] fix: adds the missing dependencies in the useEffect --- src/hooks/useBasePopoverReactionList/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hooks/useBasePopoverReactionList/index.ts b/src/hooks/useBasePopoverReactionList/index.ts index 5f598d9eb1dd..3134526e8507 100644 --- a/src/hooks/useBasePopoverReactionList/index.ts +++ b/src/hooks/useBasePopoverReactionList/index.ts @@ -125,7 +125,7 @@ export default function useBasePopoverReactionList({emojiName, emojiReactions, a } hideReactionList(); - }); + }, [emojiReactions, emojiName, isPopoverVisible, reportActionID, preferredLocale]); return {isPopoverVisible, cursorRelativePosition, popoverAnchorPosition, getReactionInformation, hideReactionList, reactionListRef, showReactionList}; } From d50f50c97b0632ee8538fac0afa670183f815b94 Mon Sep 17 00:00:00 2001 From: Bartosz Grajdek Date: Thu, 8 Feb 2024 16:00:53 +0100 Subject: [PATCH 127/288] feat: upgrade react-native-camera-roll --- package-lock.json | 12 +++++++----- package.json | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 11099886bfb0..0c014c28abcf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,7 +26,7 @@ "@oguzhnatly/react-native-image-manipulator": "github:Expensify/react-native-image-manipulator#5cdae3d4455b03a04c57f50be3863e2fe6c92c52", "@onfido/react-native-sdk": "8.3.0", "@react-native-async-storage/async-storage": "1.21.0", - "@react-native-camera-roll/camera-roll": "5.4.0", + "@react-native-camera-roll/camera-roll": "7.4.0", "@react-native-clipboard/clipboard": "^1.12.1", "@react-native-community/geolocation": "^3.0.6", "@react-native-community/netinfo": "11.2.1", @@ -8708,10 +8708,12 @@ } }, "node_modules/@react-native-camera-roll/camera-roll": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@react-native-camera-roll/camera-roll/-/camera-roll-5.4.0.tgz", - "integrity": "sha512-SMEhc+2hQWubwzxR6Zac0CmrJ2rdoHHBo0ibG2iNMsxR0dnU5AdRGnYF/tyK9i20/i7ZNxn+qsEJ69shpkd6gg==", - "license": "MIT", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@react-native-camera-roll/camera-roll/-/camera-roll-7.4.0.tgz", + "integrity": "sha512-y0bVpMJLaFphYvMMx1BsqgMA0kXq9CKxKYNnt4ocUvwJj5Rp4TZ233rzJoDqz1oxd56Tz5f1g+yhYN5RImKl8Q==", + "engines": { + "node": ">= 18.17.0" + }, "peerDependencies": { "react-native": ">=0.59" } diff --git a/package.json b/package.json index 71983e0e1679..47bb5a056d80 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,7 @@ "@oguzhnatly/react-native-image-manipulator": "github:Expensify/react-native-image-manipulator#5cdae3d4455b03a04c57f50be3863e2fe6c92c52", "@onfido/react-native-sdk": "8.3.0", "@react-native-async-storage/async-storage": "1.21.0", - "@react-native-camera-roll/camera-roll": "5.4.0", + "@react-native-camera-roll/camera-roll": "7.4.0", "@react-native-clipboard/clipboard": "^1.12.1", "@react-native-community/geolocation": "^3.0.6", "@react-native-community/netinfo": "11.2.1", From 65d4fea333c4f4e35fb5c4339892c4de0d3f5298 Mon Sep 17 00:00:00 2001 From: ren-jones <153645623+ren-jones@users.noreply.github.com> Date: Thu, 8 Feb 2024 10:20:23 -0600 Subject: [PATCH 128/288] Create create-a-workspace-for-yourself.md New help article for getting started guides --- .../create-a-workspace-for-yourself.md | 221 ++++++++++++++++++ 1 file changed, 221 insertions(+) create mode 100644 docs/articles/expensify-classic/getting-started/create-a-workspace-for-yourself.md diff --git a/docs/articles/expensify-classic/getting-started/create-a-workspace-for-yourself.md b/docs/articles/expensify-classic/getting-started/create-a-workspace-for-yourself.md new file mode 100644 index 000000000000..dad26150f962 --- /dev/null +++ b/docs/articles/expensify-classic/getting-started/create-a-workspace-for-yourself.md @@ -0,0 +1,221 @@ +--- +title: Create a workspace for yourself +description: Get started with Expensify by creating an individual workspace for yourself +--- +
+ +# Overview + +Welcome to Expensify! If you are a freelancer or tracking your personal expenses, follow the steps below to get started. + +# 1. Download the mobile app + +Upload your expenses and check your reports right from your phone by downloading the Expensify mobile app. You can search for “Expensify” in the app store, or tap one of the links below. + +[iOS](https://apps.apple.com/us/app/expensify-expense-tracker/id471713959) +| [Android](https://play.google.com/store/apps/details?id=org.me.mobiexpensifyg&hl=en_US&gl=US) + +# 2. Meet Concierge + +Your personal assistant, Concierge, lives on your Expensify Home page on both desktop and the mobile app. + +Concierge will walk you through setting up your account and also provide: +- Reminders to do things like submit your expenses +- Alerts when more information is needed on an expense report +- Updates on new and improved account features + +You can also get support at any time by clicking the green chat bubble in the right corner. This will open a chat with Concierge where you can ask questions and receive direct support. + +# 3. Create a workspace + +All Expensify accounts automatically come with an individual workspace already set up. You can use this space for your personal expenses, or you can create a group workspace—even if you will be the only person in the group. + +Here’s how to determine whether a personal or group workspace might be best for you: +- A *personal workspace* is a private workspace just for you. +- A *group workspace* allows you to use the workspace individually or add additional members. You can also create expense approval flows and connect accounting, HR, and travel integrations. + +## Set up your individual workspace + +
    +
  1. Hover over Settings, then click Workspaces.
  2. +
  3. Click the Individual tab on the left.
  4. +
  5. Select the policy type that best fits your needs.
  6. +
  7. Set up your workspace details including the workspace name, expense rules, categories, and more.
  8. +
+ +## Create a group workspace + +
    +
  1. Hover over Settings, then click Workspaces.
  2. +
  3. Click the Group tab on the left.
  4. +
  5. Click New Workspace.
  6. +
  7. Set up your workspace details including the workspace name, expense rules, categories, and more.
  8. +
+ +# 4. Add an expense + +You can create an expense automatically by SmartScanning a receipt, or you can enter them manually. + +## SmartScan a receipt + +You can upload pictures of your receipts to Expensify and SmartScan will automatically capture the receipt details including the merchant, date, total, and currency. + +{% include selector.html values="desktop, mobile" %} + +{% include option.html value="desktop" % +
    +
  1. Click the Expenses tab.
  2. +
  3. Click the + icon in the top right and select Scan Receipt.
  4. +
  5. Upload a saved image of a receipt.
  6. +
+{% include end-option.html %} + +{% include option.html value="mobile" %} +
    +
  1. Open the mobile app and tap the camera icon in the bottom right corner.
  2. +
  3. Upload or take a photo of your receipt.
  4. +
      +
    • Upload a photo: Click the photo icon in the left corner and select the image from your device.
    • +
    • Take a photo: Click the camera icon in the right corner to select the mode, make sure all of the transaction details are clearly visible, and then take the photo.
    • +
        +
      • Normal Mode: Upload one receipt.
      • +
      • Rapid Fire Mode: Upload multiple receipts at once.
      • +
+{% include end-option.html %} + +{% include end-selector.html %} + +You can open any receipt and select **Fill out details myself** to add or edit the merchant, date, total, description, category, or add attendees who took part in the expense. You can also split the expense if multiple expenses are included on one receipt. + +{% include info.html %} +You can also email receipts to SmartScan by sending them to receipts@expensify.com from an email address tied to your Expensify account (either a primary or secondary email). SmartScan will automatically pull all of the details from the receipt, fill them in for you, and add the receipt to the Expenses tab on your account. +{% include end-info.html %} + +## Manually enter an expense + +{% include selector.html values="desktop, mobile" %} + +{% include option.html value="desktop" %} + +
    +
  1. Click the Expenses tab.
  2. +
  3. Click the + icon in the top right.
  4. +
  5. Select the type of expense and enter the expense details.
  6. +
      +
    • Manually create: Manually enter receipt details.
    • +
    • Scan receipt: Upload a saved image of a receipt.
    • +
    • Create multiple: Upload expenses in bulk.
    • +
    • Time: Create an expense based on hours.
    • +
    • Distance: Create an expense based on distance.
    • +
        +
      • Manually Create: Manually enter the distance details for the expense.
      • +
      • Create from Map: Enter the start and end destination and Expensify will help you create a receipt for the trip.
      • +
      +
    +
  7. Click Save.
  8. +
+{% include end-option.html %} + +{% include option.html value="mobile" %} +
    +
  1. Tap the ☰ menu icon in the top left.
  2. +
  3. Tap Expenses.
  4. +
  5. Tap the + icon in the top right.
  6. +
  7. Tap the correct expense type and enter the expense details.
  8. +
      +
    • Manually create: Manually enter receipt details.
    • +
    • Time: Enter work time and rate.
    • +
    • Manually create (Distance): Manually enter trip details by total distance.
    • +
    • Odometer: Manually enter trip details by start and end odometer readings.
    • +
    • Start GPS: Track distance while using the Expensify app to automatically calculate the distance in real time during the trip.
    • +
    +
  9. Tap Save.
  10. +
+{% include end-option.html %} + +{% include end-selector.html %} + +# 5. Connect your expense accounts + +You can connect your bank account(s) and personal credit card(s) to import and track your transactions in Expensify. This will: +- Automatically sync your bank/card transactions with your Expensify account +- Merge any expenses added with SmartScan with the tracked bank expense +- Generate IRS-compliant eReceipts (if enabled for the workspace) + +{% include selector.html values="desktop, mobile" %} + +{% include option.html value="desktop" %} +
    +
  1. Hover over Settings, then click Account.
  2. +
  3. Click the Credit Card Import tab on the left.
  4. +
  5. Click Import Bank/Card.
  6. +
  7. Choose your bank from the list or use the search box.
  8. +
      +
    • If your bank isn’t listed, you can import your expenses as a CSV by clicking the X and selecting Import Transactions from File.
    • +
    +
  9. Select a transaction start date (up to 90 days), then click Take me there.
  10. +
  11. Enter the username and password you use to sign into the bank online.
  12. +
  13. Select the account(s) you want to import.
  14. +
  15. Once you have successfully imported your card(s), you can click Update to refresh the latest transactions.
  16. +
+{% include end-option.html %} + +{% include option.html value="mobile" %} +
    +
  1. Tap the ☰ menu icon in the top left.
  2. +
  3. Tap Settings.
  4. +
  5. Tap Import a Card.
  6. +
  7. Choose your bank from the list or use the search box.
  8. +
      +
    • If your bank isn’t listed, you can import your expenses as a CSV by clicking the X and selecting Import Transactions from File.
    • +
    +
  9. Select a transaction start date (up to 90 days), then click Take me there.
  10. +
  11. Enter the username and password you use to sign into the bank online.
  12. +
  13. Select the account(s) you want to import.
  14. +
  15. Once you have successfully imported your card(s), you can click Update to refresh the latest transactions.
  16. +
+{% include end-option.html %} + +{% include end-selector.html %} + +# 6. See your spending insights + +The Insights dashboard allows you to monitor all aspects of company spend across categories, employees, projects, departments, and more. You can see trends in real time, forecast company budgets, and build unlimited custom reports with help from our trained specialist team. + +{% include info.html %} +This process is currently not available from the mobile app and must be completed from the Expensify website. +{% include end-info.html %} + +
    +
  1. Click the Insights tab.
  2. +
  3. Use the To and From filters to select a specific date range. The current month is shown by default.
  4. +
  5. Use the other filters to select the data you want to view insights for.
  6. +
      +
    • To view your expense insights across all workspaces, tags, employees, etc., ensure “All” is selected for each filter.
    • +
    • To view expense insights for specific workspaces, tags, employees, etc., select the desired data for each applicable filter.
    • +
    +
  7. Scroll down to see the various data graphs.
  8. +
  9. To view the specific expenses that are included in the graph, click the ☰ icon in the View Raw Data column.
  10. +
+ +# 7. Secure your account + +Add an extra layer of security to help keep your financial data safe and secure by enabling two-factor authentication. This will require you to enter a code generated by your preferred authenticator app (like Google Authenticator or Microsoft Authenticator) when you log in. + +
    +
  1. Hover over Settings, then click Account.
  2. +
  3. Under the Account Details tab, scroll down to the Two Factor Authentication section and enable the toggle.
  4. +
  5. Save a copy of your backup codes. This step is critical—You will lose access to your account if you cannot use your authenticator app and do not have your recovery codes.
  6. +
      +
    • Click Download to save a copy of your backup codes to your computer.
    • +
    • Click Copy to paste the codes into a document or other secure location.
    • +
    +
  7. Click Continue.
  8. +
  9. Download or open your authenticator app and either:
  10. +
      +
    • Scan the QR code shown on your computer screen.
    • +
    • Enter the 6-digit code from your authenticator app into Expensify and click Verify.
    • +
    +
+ +When you log in to Expensify in the future, you’ll be emailed a magic code that you’ll use to log in with. Then you’ll be prompted to open your authenticator app to get the 6-digit code and enter it into Expensify. A new code regenerates every few seconds, so the code is always different. If the code time runs out, you can generate a new code as needed. From 4b710dc4d1a60f796c02069876279b5d15a037b6 Mon Sep 17 00:00:00 2001 From: ren-jones <153645623+ren-jones@users.noreply.github.com> Date: Thu, 8 Feb 2024 17:06:49 -0600 Subject: [PATCH 129/288] Update docs/articles/expensify-classic/getting-started/create-a-workspace-for-yourself.md Add closing } Co-authored-by: Rushat Gabhane --- .../getting-started/create-a-workspace-for-yourself.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/articles/expensify-classic/getting-started/create-a-workspace-for-yourself.md b/docs/articles/expensify-classic/getting-started/create-a-workspace-for-yourself.md index dad26150f962..3563ce2367c6 100644 --- a/docs/articles/expensify-classic/getting-started/create-a-workspace-for-yourself.md +++ b/docs/articles/expensify-classic/getting-started/create-a-workspace-for-yourself.md @@ -62,7 +62,7 @@ You can upload pictures of your receipts to Expensify and SmartScan will automat {% include selector.html values="desktop, mobile" %} -{% include option.html value="desktop" % +{% include option.html value="desktop" %}
  1. Click the Expenses tab.
  2. Click the + icon in the top right and select Scan Receipt.
  3. From 330ffaeaf8fe3f201856a02395b40d0aa31a8cd8 Mon Sep 17 00:00:00 2001 From: ren-jones <153645623+ren-jones@users.noreply.github.com> Date: Thu, 8 Feb 2024 17:13:14 -0600 Subject: [PATCH 130/288] Update create-a-workspace-for-yourself.md Added missing closing tags --- .../getting-started/create-a-workspace-for-yourself.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/articles/expensify-classic/getting-started/create-a-workspace-for-yourself.md b/docs/articles/expensify-classic/getting-started/create-a-workspace-for-yourself.md index 3563ce2367c6..69dea87ad8ea 100644 --- a/docs/articles/expensify-classic/getting-started/create-a-workspace-for-yourself.md +++ b/docs/articles/expensify-classic/getting-started/create-a-workspace-for-yourself.md @@ -80,6 +80,8 @@ You can upload pictures of your receipts to Expensify and SmartScan will automat
    • Normal Mode: Upload one receipt.
    • Rapid Fire Mode: Upload multiple receipts at once.
    • +
    +
{% include end-option.html %} From c29b7e0f0bec165e7a717c9ec6794472663473bb Mon Sep 17 00:00:00 2001 From: ruben-rebelo Date: Fri, 9 Feb 2024 09:28:11 +0000 Subject: [PATCH 131/288] [TS migration][config.local] Code improvements --- tests/e2e/config.local.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/e2e/config.local.ts b/tests/e2e/config.local.ts index 0ad64170885f..40f7afde3985 100644 --- a/tests/e2e/config.local.ts +++ b/tests/e2e/config.local.ts @@ -1,4 +1,6 @@ -const config = { +type Config = Record; + +const config: Config = { MAIN_APP_PACKAGE: 'com.expensify.chat.e2e', DELTA_APP_PACKAGE: 'com.expensify.chat.e2edelta', MAIN_APP_PATH: './android/app/build/outputs/apk/e2e/release/app-e2e-release.apk', @@ -7,4 +9,4 @@ const config = { RUNS: 8, }; -module.exports = config; +export default config; From 989a2a7b43b4d047903c8615619a26e2190fe45f Mon Sep 17 00:00:00 2001 From: ruben-rebelo Date: Fri, 9 Feb 2024 11:47:27 +0000 Subject: [PATCH 132/288] [TS migration] Code improvements --- __mocks__/react-native-permissions.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/__mocks__/react-native-permissions.ts b/__mocks__/react-native-permissions.ts index f8bfe3cd6376..77b7b8e6e248 100644 --- a/__mocks__/react-native-permissions.ts +++ b/__mocks__/react-native-permissions.ts @@ -4,6 +4,7 @@ import type {ValueOf} from 'type-fest'; type Results = ValueOf; type ResultsCollection = Record; type NotificationSettings = Record; +type Notification = {status: Results; settings: typeof notificationSettings} const openLimitedPhotoLibraryPicker: jest.Mock = jest.fn(() => {}); const openSettings: jest.Mock = jest.fn(() => {}); @@ -25,12 +26,12 @@ const notificationSettings: NotificationSettings = { notificationCenter: true, }; -const checkNotifications: jest.Mock<{status: Results; settings: typeof notificationSettings}> = jest.fn(() => ({ +const checkNotifications: jest.Mock = jest.fn(() => ({ status: RESULTS.GRANTED, settings: notificationSettings, })); -const requestNotifications: jest.Mock<{status: Results; settings: typeof notificationSettings}> = jest.fn((options: Record) => ({ +const requestNotifications: jest.Mock = jest.fn((options: Record) => ({ status: RESULTS.GRANTED, settings: Object.keys(options) .filter((option: string) => notificationOptions.includes(option)) From 32d775d9150036ec2846b319ed9201d4c53626f3 Mon Sep 17 00:00:00 2001 From: ruben-rebelo Date: Fri, 9 Feb 2024 11:52:14 +0000 Subject: [PATCH 133/288] [TS migration] Lint fixed --- __mocks__/react-native-permissions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/__mocks__/react-native-permissions.ts b/__mocks__/react-native-permissions.ts index 77b7b8e6e248..e6f1aabff4c8 100644 --- a/__mocks__/react-native-permissions.ts +++ b/__mocks__/react-native-permissions.ts @@ -4,7 +4,7 @@ import type {ValueOf} from 'type-fest'; type Results = ValueOf; type ResultsCollection = Record; type NotificationSettings = Record; -type Notification = {status: Results; settings: typeof notificationSettings} +type Notification = {status: Results; settings: typeof notificationSettings}; const openLimitedPhotoLibraryPicker: jest.Mock = jest.fn(() => {}); const openSettings: jest.Mock = jest.fn(() => {}); From 9fd3606094bd84222c3cf76af49ec0d256637bc8 Mon Sep 17 00:00:00 2001 From: ren-jones <153645623+ren-jones@users.noreply.github.com> Date: Fri, 9 Feb 2024 08:18:42 -0600 Subject: [PATCH 134/288] Rename create-a-workspace-for-yourself.md to Create-a-workspace-for-yourself.md Capitalized first word in title (For article titles, we're using sentence case - only the first word will be capitalized). Folders will use title case. --- ...rkspace-for-yourself.md => Create-a-workspace-for-yourself.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/articles/expensify-classic/getting-started/{create-a-workspace-for-yourself.md => Create-a-workspace-for-yourself.md} (100%) diff --git a/docs/articles/expensify-classic/getting-started/create-a-workspace-for-yourself.md b/docs/articles/expensify-classic/getting-started/Create-a-workspace-for-yourself.md similarity index 100% rename from docs/articles/expensify-classic/getting-started/create-a-workspace-for-yourself.md rename to docs/articles/expensify-classic/getting-started/Create-a-workspace-for-yourself.md From 6e08aef1427e176de6699cbc35e73305722f95fd Mon Sep 17 00:00:00 2001 From: someone-here Date: Fri, 9 Feb 2024 20:19:58 +0530 Subject: [PATCH 135/288] Change the global create and DM create tooltips to read Create --- src/components/FloatingActionButton.tsx | 2 +- src/languages/en.ts | 1 + src/languages/es.ts | 1 + .../report/ReportActionCompose/AttachmentPickerWithMenuItems.js | 2 +- 4 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/components/FloatingActionButton.tsx b/src/components/FloatingActionButton.tsx index 17da0cebbd5f..728736348f1e 100644 --- a/src/components/FloatingActionButton.tsx +++ b/src/components/FloatingActionButton.tsx @@ -103,7 +103,7 @@ function FloatingActionButton({onPress, isActive, accessibilityLabel, role}: Flo }; return ( - + )} - + { From e6854394b21a81c0a936690d4b79183099f8e938 Mon Sep 17 00:00:00 2001 From: dukenv0307 Date: Sun, 11 Feb 2024 01:39:48 +0700 Subject: [PATCH 136/288] consistent system paid message --- src/libs/ReportUtils.ts | 8 ++++++-- .../home/report/ContextMenu/ContextMenuActions.tsx | 10 +++++++++- src/pages/home/report/ReportActionItemMessage.tsx | 2 +- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 26280f95447d..4884f9ecd319 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -2232,6 +2232,7 @@ function getReportPreviewMessage( isPreviewMessageForParentChatReport = false, policy: OnyxEntry = null, isForListPreview = false, + shouldHidePayer = false, ): string { const reportActionMessage = reportAction?.message?.[0].html ?? ''; @@ -2296,7 +2297,10 @@ function getReportPreviewMessage( if (isSettled(report.reportID) || (report.isWaitingOnBankAccount && isPreviewMessageForParentChatReport)) { // A settled report preview message can come in three formats "paid ... elsewhere" or "paid ... with Expensify" let translatePhraseKey: TranslationPaths = 'iou.paidElsewhereWithAmount'; - if ( + + if (isPreviewMessageForParentChatReport) { + translatePhraseKey = 'iou.payerPaidAmount'; + } else if ( [CONST.IOU.PAYMENT_TYPE.VBBA, CONST.IOU.PAYMENT_TYPE.EXPENSIFY].some((paymentType) => paymentType === originalMessage?.paymentType) || !!reportActionMessage.match(/ (with Expensify|using Expensify)$/) || report.isWaitingOnBankAccount @@ -2304,7 +2308,7 @@ function getReportPreviewMessage( translatePhraseKey = 'iou.paidWithExpensifyWithAmount'; } - let actualPayerName = report.managerID === currentUserAccountID ? '' : getDisplayNameForParticipant(report.managerID, true); + let actualPayerName = report.managerID === currentUserAccountID || shouldHidePayer ? '' : getDisplayNameForParticipant(report.managerID, true); actualPayerName = actualPayerName && isForListPreview && !isPreviewMessageForParentChatReport ? `${actualPayerName}:` : actualPayerName; const payerDisplayName = isPreviewMessageForParentChatReport ? payerName : actualPayerName; diff --git a/src/pages/home/report/ContextMenu/ContextMenuActions.tsx b/src/pages/home/report/ContextMenu/ContextMenuActions.tsx index 64a7d1813255..cb34ffccb0ce 100644 --- a/src/pages/home/report/ContextMenu/ContextMenuActions.tsx +++ b/src/pages/home/report/ContextMenu/ContextMenuActions.tsx @@ -354,7 +354,15 @@ const ContextMenuActions: ContextMenuAction[] = [ const modifyExpenseMessage = ModifiedExpenseMessage.getForReportAction(reportID, reportAction); Clipboard.setString(modifyExpenseMessage); } else if (ReportActionsUtils.isMoneyRequestAction(reportAction)) { - const displayMessage = ReportUtils.getIOUReportActionDisplayMessage(reportAction); + const displayMessage = ReportUtils.getReportPreviewMessage( + ReportUtils.getReport(ReportUtils.getOriginalReportID(reportID, reportAction)), + reportAction, + false, + false, + null, + false, + true, + ); Clipboard.setString(displayMessage); } else if (ReportActionsUtils.isCreatedTaskReportAction(reportAction)) { const taskPreviewMessage = TaskUtils.getTaskCreatedMessage(reportAction); diff --git a/src/pages/home/report/ReportActionItemMessage.tsx b/src/pages/home/report/ReportActionItemMessage.tsx index 0ffb8b9f6964..ad571eb66f10 100644 --- a/src/pages/home/report/ReportActionItemMessage.tsx +++ b/src/pages/home/report/ReportActionItemMessage.tsx @@ -58,7 +58,7 @@ function ReportActionItemMessage({action, displayAsGroup, reportID, style, isHid const originalMessage = action.actionName === CONST.REPORT.ACTIONS.TYPE.IOU ? action.originalMessage : null; const iouReportID = originalMessage?.IOUReportID; if (iouReportID) { - iouMessage = ReportUtils.getReportPreviewMessage(ReportUtils.getReport(iouReportID), action); + iouMessage = ReportUtils.getReportPreviewMessage(ReportUtils.getReport(iouReportID), action, false, false, null, false, true); } } From e520939240f1ad8f2d23e4e0554ee40f722209b4 Mon Sep 17 00:00:00 2001 From: Cong Pham Date: Sun, 11 Feb 2024 11:00:15 +0700 Subject: [PATCH 137/288] 36218 cached viewport height conflict event --- src/hooks/useDebouncedState.ts | 2 +- src/hooks/useWindowDimensions/index.ts | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/hooks/useDebouncedState.ts b/src/hooks/useDebouncedState.ts index 3677c85f3081..6fda8f7d54d4 100644 --- a/src/hooks/useDebouncedState.ts +++ b/src/hooks/useDebouncedState.ts @@ -17,7 +17,7 @@ import CONST from '@src/CONST'; * @example * const [value, debouncedValue, setValue] = useDebouncedState("", 300); */ -function useDebouncedState(initialValue: T, delay = CONST.TIMING.SEARCH_OPTION_LIST_DEBOUNCE_TIME): [T, T, (value: T) => void] { +function useDebouncedState(initialValue: T, delay: number = CONST.TIMING.SEARCH_OPTION_LIST_DEBOUNCE_TIME): [T, T, (value: T) => void] { const [value, setValue] = useState(initialValue); const [debouncedValue, setDebouncedValue] = useState(initialValue); const debouncedSetDebouncedValue = useRef(debounce(setDebouncedValue, delay)).current; diff --git a/src/hooks/useWindowDimensions/index.ts b/src/hooks/useWindowDimensions/index.ts index 4ba2c4ad9b41..1d905ce55d79 100644 --- a/src/hooks/useWindowDimensions/index.ts +++ b/src/hooks/useWindowDimensions/index.ts @@ -1,8 +1,10 @@ -import {useEffect, useRef, useState} from 'react'; +import {useEffect, useRef} from 'react'; // eslint-disable-next-line no-restricted-imports import {Dimensions, useWindowDimensions} from 'react-native'; +import useDebouncedState from '@hooks/useDebouncedState'; import * as Browser from '@libs/Browser'; import variables from '@styles/variables'; +import CONST from '@src/CONST'; import type WindowDimensions from './types'; const initalViewportHeight = window.visualViewport?.height ?? window.innerHeight; @@ -23,7 +25,7 @@ export default function (useCachedViewportHeight = false): WindowDimensions { const isMediumScreenWidth = windowWidth > variables.mobileResponsiveWidthBreakpoint && windowWidth <= variables.tabletResponsiveWidthBreakpoint; const isLargeScreenWidth = windowWidth > variables.tabletResponsiveWidthBreakpoint; - const [cachedViewportHeight, setCachedViewportHeight] = useState(windowHeight); + const [, cachedViewportHeight, setCachedViewportHeight] = useDebouncedState(windowHeight, CONST.TIMING.RESIZE_DEBOUNCE_TIME); const handleFocusIn = useRef((event: FocusEvent) => { const targetElement = event.target as HTMLElement; @@ -66,6 +68,7 @@ export default function (useCachedViewportHeight = false): WindowDimensions { return; } setCachedViewportHeight(windowHeight); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [windowHeight, isCachedViewportHeight]); useEffect(() => { From 290cf709d377304b362e725f8c083de31e0fbd2a Mon Sep 17 00:00:00 2001 From: someone-here Date: Sun, 11 Feb 2024 18:51:08 +0530 Subject: [PATCH 138/288] Additional modifications --- src/languages/en.ts | 1 - src/languages/es.ts | 1 - .../report/ReportActionCompose/AttachmentPickerWithMenuItems.js | 2 +- tests/perf-test/ReportActionCompose.perf-test.js | 2 +- 4 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/languages/en.ts b/src/languages/en.ts index 5a47c62880b9..b2e869f244b7 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -422,7 +422,6 @@ export default { oneMoment: "One moment while we redirect you to your company's single sign-on portal.", }, reportActionCompose: { - addAction: 'Actions', dropToUpload: 'Drop to upload', sendAttachment: 'Send attachment', addAttachment: 'Add attachment', diff --git a/src/languages/es.ts b/src/languages/es.ts index c2ceecee6256..58bf9879fe30 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -412,7 +412,6 @@ export default { oneMoment: 'Un momento mientras te redirigimos al portal de inicio de sesión único de tu empresa.', }, reportActionCompose: { - addAction: 'Acción', dropToUpload: 'Suelta el archivo aquí para compartirlo', sendAttachment: 'Enviar adjunto', addAttachment: 'Añadir archivo adjunto', diff --git a/src/pages/home/report/ReportActionCompose/AttachmentPickerWithMenuItems.js b/src/pages/home/report/ReportActionCompose/AttachmentPickerWithMenuItems.js index 211668cc6656..62abfcf8545a 100644 --- a/src/pages/home/report/ReportActionCompose/AttachmentPickerWithMenuItems.js +++ b/src/pages/home/report/ReportActionCompose/AttachmentPickerWithMenuItems.js @@ -293,7 +293,7 @@ function AttachmentPickerWithMenuItems({ style={styles.composerSizeButton} disabled={isBlockedFromConcierge || disabled} role={CONST.ROLE.BUTTON} - accessibilityLabel={translate('reportActionCompose.addAction')} + accessibilityLabel={translate('common.create')} > { const scenario = async () => { // Query for the attachment button - const hintAttachmentButtonText = Localize.translateLocal('reportActionCompose.addAction'); + const hintAttachmentButtonText = Localize.translateLocal('common.new'); const attachmentButton = await screen.findByLabelText(hintAttachmentButtonText); fireEvent.press(attachmentButton, mockEvent); From 563f076798c0e17ed05de0259f6d17146df73295 Mon Sep 17 00:00:00 2001 From: Bernhard Owen Josephus Date: Mon, 12 Feb 2024 17:15:40 +0800 Subject: [PATCH 139/288] don't apply padding if loading --- src/pages/home/HeaderView.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/home/HeaderView.js b/src/pages/home/HeaderView.js index 29f2264dc77d..d02e2eb76d9f 100644 --- a/src/pages/home/HeaderView.js +++ b/src/pages/home/HeaderView.js @@ -217,7 +217,7 @@ function HeaderView(props) { dataSet={{dragArea: true}} > - + {isLoading ? ( ) : ( From 73b0501a31fa41e688831c60ce8dc771e77c84d5 Mon Sep 17 00:00:00 2001 From: Bernhard Owen Josephus Date: Mon, 12 Feb 2024 17:44:06 +0800 Subject: [PATCH 140/288] prevent setting selection bigger than the length --- src/pages/iou/steps/MoneyRequestAmountForm.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/pages/iou/steps/MoneyRequestAmountForm.js b/src/pages/iou/steps/MoneyRequestAmountForm.js index 0722bf3f6d41..9106ff28589e 100644 --- a/src/pages/iou/steps/MoneyRequestAmountForm.js +++ b/src/pages/iou/steps/MoneyRequestAmountForm.js @@ -296,7 +296,10 @@ function MoneyRequestAmountForm({amount, taxAmount, currency, isEditing, forward if (!shouldUpdateSelection) { return; } - setSelection(e.nativeEvent.selection); + const maxSelection = formattedAmount.length; + const start = Math.min(e.nativeEvent.selection.start, maxSelection); + const end = Math.min(e.nativeEvent.selection.end, maxSelection); + setSelection({start, end}); }} onKeyPress={textInputKeyPress} /> From 0e0399d3d31cebe1c4382d5ccea051c494ca8925 Mon Sep 17 00:00:00 2001 From: ruben-rebelo Date: Mon, 12 Feb 2024 09:49:13 +0000 Subject: [PATCH 141/288] [TS migration] Small code improvements --- __mocks__/react-native-permissions.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/__mocks__/react-native-permissions.ts b/__mocks__/react-native-permissions.ts index e6f1aabff4c8..a1497c7cc2ac 100644 --- a/__mocks__/react-native-permissions.ts +++ b/__mocks__/react-native-permissions.ts @@ -4,7 +4,7 @@ import type {ValueOf} from 'type-fest'; type Results = ValueOf; type ResultsCollection = Record; type NotificationSettings = Record; -type Notification = {status: Results; settings: typeof notificationSettings}; +type Notification = {status: Results; settings: NotificationSettings}; const openLimitedPhotoLibraryPicker: jest.Mock = jest.fn(() => {}); const openSettings: jest.Mock = jest.fn(() => {}); @@ -35,7 +35,7 @@ const requestNotifications: jest.Mock = jest.fn((options: Record notificationOptions.includes(option)) - .reduce((acc: ResultsCollection, option: string) => ({...acc, [option]: true}), { + .reduce((acc: NotificationSettings, option: string) => ({...acc, [option]: true}), { lockScreen: true, notificationCenter: true, }), From fd779ad3a12bf819dea1d3667fc4e5765bb71cdb Mon Sep 17 00:00:00 2001 From: Robert Kozik Date: Mon, 12 Feb 2024 10:15:49 +0100 Subject: [PATCH 142/288] add review suggestions --- src/components/Composer/index.native.tsx | 6 +++--- src/components/RNMarkdownTextInput.tsx | 16 ++++++++-------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/components/Composer/index.native.tsx b/src/components/Composer/index.native.tsx index 592b62b68c4e..166be722c794 100644 --- a/src/components/Composer/index.native.tsx +++ b/src/components/Composer/index.native.tsx @@ -2,7 +2,7 @@ import type {ForwardedRef} from 'react'; import React, {useCallback, useEffect, useMemo, useRef} from 'react'; import type {TextInput} from 'react-native'; import {StyleSheet} from 'react-native'; -import type {AnimatedTextInputRef} from '@components/RNMarkdownTextInput'; +import type {AnimatedMarkdownTextInputRef} from '@components/RNMarkdownTextInput'; import MarkdownTextInput from '@components/RNMarkdownTextInput'; import useMarkdownStyle from '@hooks/useMarkdownStyle'; import useResetComposerFocus from '@hooks/useResetComposerFocus'; @@ -31,7 +31,7 @@ function Composer( }: ComposerProps, ref: ForwardedRef, ) { - const textInput = useRef(null); + const textInput = useRef(null); const {isFocused, shouldResetFocus} = useResetComposerFocus(textInput); const theme = useTheme(); const markdownStyle = useMarkdownStyle(); @@ -42,7 +42,7 @@ function Composer( * Set the TextInput Ref * @param {Element} el */ - const setTextInputRef = useCallback((el: AnimatedTextInputRef) => { + const setTextInputRef = useCallback((el: AnimatedMarkdownTextInputRef) => { textInput.current = el; if (typeof ref !== 'function' || textInput.current === null) { return; diff --git a/src/components/RNMarkdownTextInput.tsx b/src/components/RNMarkdownTextInput.tsx index ca761c1ee285..d36af6e13826 100644 --- a/src/components/RNMarkdownTextInput.tsx +++ b/src/components/RNMarkdownTextInput.tsx @@ -7,15 +7,15 @@ import Animated from 'react-native-reanimated'; import useTheme from '@hooks/useTheme'; // Convert the underlying TextInput into an Animated component so that we can take an animated ref and pass it to a worklet -const AnimatedTextInput = Animated.createAnimatedComponent(MarkdownTextInput); +const AnimatedMarkdownTextInput = Animated.createAnimatedComponent(MarkdownTextInput); -type AnimatedTextInputRef = typeof AnimatedTextInput & TextInput & HTMLInputElement; +type AnimatedMarkdownTextInputRef = typeof AnimatedMarkdownTextInput & TextInput & HTMLInputElement; -function RNMarkdownTextInput(props: MarkdownTextInputProps, ref: ForwardedRef) { +function RNMarkdownTextInputWithRef(props: MarkdownTextInputProps, ref: ForwardedRef) { const theme = useTheme(); return ( - Date: Mon, 12 Feb 2024 13:42:08 +0100 Subject: [PATCH 143/288] Update AppDownloadLinks.tsx Moved Type declaration out of component scope. --- src/pages/settings/AppDownloadLinks.tsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/pages/settings/AppDownloadLinks.tsx b/src/pages/settings/AppDownloadLinks.tsx index 009c00996d7a..5ded324e5b45 100644 --- a/src/pages/settings/AppDownloadLinks.tsx +++ b/src/pages/settings/AppDownloadLinks.tsx @@ -15,17 +15,17 @@ import CONST from '@src/CONST'; import type {TranslationPaths} from '@src/languages/types'; import ROUTES from '@src/ROUTES'; +type DownloadMenuItem = MenuItemProps & { + translationKey: TranslationPaths; + openAppDownloadLink: () => void; + downloadLink: string; +}; + function AppDownloadLinksPage() { const styles = useThemeStyles(); const {translate} = useLocalize(); const popoverAnchor = useRef(null); - type DownloadMenuItem = MenuItemProps & { - translationKey: TranslationPaths; - openAppDownloadLink: () => void; - downloadLink: string; - }; - const menuItems: DownloadMenuItem[] = [ { translationKey: 'initialSettingsPage.appDownloadLinks.android.label', From 129f4512f3947c55a0ed2153431dcc31445eecac Mon Sep 17 00:00:00 2001 From: Jakub Butkiewicz Date: Mon, 12 Feb 2024 15:34:08 +0100 Subject: [PATCH 144/288] ref: move FileUtilsTest to TS --- tests/unit/{FileUtilsTest.js => FileUtilsTest.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tests/unit/{FileUtilsTest.js => FileUtilsTest.ts} (100%) diff --git a/tests/unit/FileUtilsTest.js b/tests/unit/FileUtilsTest.ts similarity index 100% rename from tests/unit/FileUtilsTest.js rename to tests/unit/FileUtilsTest.ts From 562ad49843f65a0c82d2ee469ee8ab08d6f24e3b Mon Sep 17 00:00:00 2001 From: Jakub Butkiewicz Date: Mon, 12 Feb 2024 16:41:50 +0100 Subject: [PATCH 145/288] fix: run gj-actions-build to fix validate gh action step --- .../createOrUpdateStagingDeploy/index.js | 2594 ++++++++--------- .../getDeployPullRequestList/index.js | 2594 ++++++++--------- 2 files changed, 2594 insertions(+), 2594 deletions(-) diff --git a/.github/actions/javascript/createOrUpdateStagingDeploy/index.js b/.github/actions/javascript/createOrUpdateStagingDeploy/index.js index 33965216b880..10a85fa94557 100644 --- a/.github/actions/javascript/createOrUpdateStagingDeploy/index.js +++ b/.github/actions/javascript/createOrUpdateStagingDeploy/index.js @@ -14468,1303 +14468,1303 @@ exports.parseURL = __nccwpck_require__(33).parseURL; /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; - -const punycode = __nccwpck_require__(5477); -const tr46 = __nccwpck_require__(2299); - -const specialSchemes = { - ftp: 21, - file: null, - gopher: 70, - http: 80, - https: 443, - ws: 80, - wss: 443 -}; - -const failure = Symbol("failure"); - -function countSymbols(str) { - return punycode.ucs2.decode(str).length; -} - -function at(input, idx) { - const c = input[idx]; - return isNaN(c) ? undefined : String.fromCodePoint(c); -} - -function isASCIIDigit(c) { - return c >= 0x30 && c <= 0x39; -} - -function isASCIIAlpha(c) { - return (c >= 0x41 && c <= 0x5A) || (c >= 0x61 && c <= 0x7A); -} - -function isASCIIAlphanumeric(c) { - return isASCIIAlpha(c) || isASCIIDigit(c); -} - -function isASCIIHex(c) { - return isASCIIDigit(c) || (c >= 0x41 && c <= 0x46) || (c >= 0x61 && c <= 0x66); -} - -function isSingleDot(buffer) { - return buffer === "." || buffer.toLowerCase() === "%2e"; -} - -function isDoubleDot(buffer) { - buffer = buffer.toLowerCase(); - return buffer === ".." || buffer === "%2e." || buffer === ".%2e" || buffer === "%2e%2e"; -} - -function isWindowsDriveLetterCodePoints(cp1, cp2) { - return isASCIIAlpha(cp1) && (cp2 === 58 || cp2 === 124); -} - -function isWindowsDriveLetterString(string) { - return string.length === 2 && isASCIIAlpha(string.codePointAt(0)) && (string[1] === ":" || string[1] === "|"); -} - -function isNormalizedWindowsDriveLetterString(string) { - return string.length === 2 && isASCIIAlpha(string.codePointAt(0)) && string[1] === ":"; -} - -function containsForbiddenHostCodePoint(string) { - return string.search(/\u0000|\u0009|\u000A|\u000D|\u0020|#|%|\/|:|\?|@|\[|\\|\]/) !== -1; -} - -function containsForbiddenHostCodePointExcludingPercent(string) { - return string.search(/\u0000|\u0009|\u000A|\u000D|\u0020|#|\/|:|\?|@|\[|\\|\]/) !== -1; -} - -function isSpecialScheme(scheme) { - return specialSchemes[scheme] !== undefined; -} - -function isSpecial(url) { - return isSpecialScheme(url.scheme); -} - -function defaultPort(scheme) { - return specialSchemes[scheme]; -} - -function percentEncode(c) { - let hex = c.toString(16).toUpperCase(); - if (hex.length === 1) { - hex = "0" + hex; - } - - return "%" + hex; -} - -function utf8PercentEncode(c) { - const buf = new Buffer(c); - - let str = ""; - - for (let i = 0; i < buf.length; ++i) { - str += percentEncode(buf[i]); - } - - return str; -} - -function utf8PercentDecode(str) { - const input = new Buffer(str); - const output = []; - for (let i = 0; i < input.length; ++i) { - if (input[i] !== 37) { - output.push(input[i]); - } else if (input[i] === 37 && isASCIIHex(input[i + 1]) && isASCIIHex(input[i + 2])) { - output.push(parseInt(input.slice(i + 1, i + 3).toString(), 16)); - i += 2; - } else { - output.push(input[i]); - } - } - return new Buffer(output).toString(); -} - -function isC0ControlPercentEncode(c) { - return c <= 0x1F || c > 0x7E; -} - -const extraPathPercentEncodeSet = new Set([32, 34, 35, 60, 62, 63, 96, 123, 125]); -function isPathPercentEncode(c) { - return isC0ControlPercentEncode(c) || extraPathPercentEncodeSet.has(c); -} - -const extraUserinfoPercentEncodeSet = - new Set([47, 58, 59, 61, 64, 91, 92, 93, 94, 124]); -function isUserinfoPercentEncode(c) { - return isPathPercentEncode(c) || extraUserinfoPercentEncodeSet.has(c); -} - -function percentEncodeChar(c, encodeSetPredicate) { - const cStr = String.fromCodePoint(c); - - if (encodeSetPredicate(c)) { - return utf8PercentEncode(cStr); - } - - return cStr; -} - -function parseIPv4Number(input) { - let R = 10; - - if (input.length >= 2 && input.charAt(0) === "0" && input.charAt(1).toLowerCase() === "x") { - input = input.substring(2); - R = 16; - } else if (input.length >= 2 && input.charAt(0) === "0") { - input = input.substring(1); - R = 8; - } - - if (input === "") { - return 0; - } - - const regex = R === 10 ? /[^0-9]/ : (R === 16 ? /[^0-9A-Fa-f]/ : /[^0-7]/); - if (regex.test(input)) { - return failure; - } - - return parseInt(input, R); -} - -function parseIPv4(input) { - const parts = input.split("."); - if (parts[parts.length - 1] === "") { - if (parts.length > 1) { - parts.pop(); - } - } - - if (parts.length > 4) { - return input; - } - - const numbers = []; - for (const part of parts) { - if (part === "") { - return input; - } - const n = parseIPv4Number(part); - if (n === failure) { - return input; - } - - numbers.push(n); - } - - for (let i = 0; i < numbers.length - 1; ++i) { - if (numbers[i] > 255) { - return failure; - } - } - if (numbers[numbers.length - 1] >= Math.pow(256, 5 - numbers.length)) { - return failure; - } - - let ipv4 = numbers.pop(); - let counter = 0; - - for (const n of numbers) { - ipv4 += n * Math.pow(256, 3 - counter); - ++counter; - } - - return ipv4; -} - -function serializeIPv4(address) { - let output = ""; - let n = address; - - for (let i = 1; i <= 4; ++i) { - output = String(n % 256) + output; - if (i !== 4) { - output = "." + output; - } - n = Math.floor(n / 256); - } - - return output; -} - -function parseIPv6(input) { - const address = [0, 0, 0, 0, 0, 0, 0, 0]; - let pieceIndex = 0; - let compress = null; - let pointer = 0; - - input = punycode.ucs2.decode(input); - - if (input[pointer] === 58) { - if (input[pointer + 1] !== 58) { - return failure; - } - - pointer += 2; - ++pieceIndex; - compress = pieceIndex; - } - - while (pointer < input.length) { - if (pieceIndex === 8) { - return failure; - } - - if (input[pointer] === 58) { - if (compress !== null) { - return failure; - } - ++pointer; - ++pieceIndex; - compress = pieceIndex; - continue; - } - - let value = 0; - let length = 0; - - while (length < 4 && isASCIIHex(input[pointer])) { - value = value * 0x10 + parseInt(at(input, pointer), 16); - ++pointer; - ++length; - } - - if (input[pointer] === 46) { - if (length === 0) { - return failure; - } - - pointer -= length; - - if (pieceIndex > 6) { - return failure; - } - - let numbersSeen = 0; - - while (input[pointer] !== undefined) { - let ipv4Piece = null; - - if (numbersSeen > 0) { - if (input[pointer] === 46 && numbersSeen < 4) { - ++pointer; - } else { - return failure; - } - } - - if (!isASCIIDigit(input[pointer])) { - return failure; - } - - while (isASCIIDigit(input[pointer])) { - const number = parseInt(at(input, pointer)); - if (ipv4Piece === null) { - ipv4Piece = number; - } else if (ipv4Piece === 0) { - return failure; - } else { - ipv4Piece = ipv4Piece * 10 + number; - } - if (ipv4Piece > 255) { - return failure; - } - ++pointer; - } - - address[pieceIndex] = address[pieceIndex] * 0x100 + ipv4Piece; - - ++numbersSeen; - - if (numbersSeen === 2 || numbersSeen === 4) { - ++pieceIndex; - } - } - - if (numbersSeen !== 4) { - return failure; - } - - break; - } else if (input[pointer] === 58) { - ++pointer; - if (input[pointer] === undefined) { - return failure; - } - } else if (input[pointer] !== undefined) { - return failure; - } - - address[pieceIndex] = value; - ++pieceIndex; - } - - if (compress !== null) { - let swaps = pieceIndex - compress; - pieceIndex = 7; - while (pieceIndex !== 0 && swaps > 0) { - const temp = address[compress + swaps - 1]; - address[compress + swaps - 1] = address[pieceIndex]; - address[pieceIndex] = temp; - --pieceIndex; - --swaps; - } - } else if (compress === null && pieceIndex !== 8) { - return failure; - } - - return address; -} - -function serializeIPv6(address) { - let output = ""; - const seqResult = findLongestZeroSequence(address); - const compress = seqResult.idx; - let ignore0 = false; - - for (let pieceIndex = 0; pieceIndex <= 7; ++pieceIndex) { - if (ignore0 && address[pieceIndex] === 0) { - continue; - } else if (ignore0) { - ignore0 = false; - } - - if (compress === pieceIndex) { - const separator = pieceIndex === 0 ? "::" : ":"; - output += separator; - ignore0 = true; - continue; - } - - output += address[pieceIndex].toString(16); - - if (pieceIndex !== 7) { - output += ":"; - } - } - - return output; -} - -function parseHost(input, isSpecialArg) { - if (input[0] === "[") { - if (input[input.length - 1] !== "]") { - return failure; - } - - return parseIPv6(input.substring(1, input.length - 1)); - } - - if (!isSpecialArg) { - return parseOpaqueHost(input); - } - - const domain = utf8PercentDecode(input); - const asciiDomain = tr46.toASCII(domain, false, tr46.PROCESSING_OPTIONS.NONTRANSITIONAL, false); - if (asciiDomain === null) { - return failure; - } - - if (containsForbiddenHostCodePoint(asciiDomain)) { - return failure; - } - - const ipv4Host = parseIPv4(asciiDomain); - if (typeof ipv4Host === "number" || ipv4Host === failure) { - return ipv4Host; - } - - return asciiDomain; -} - -function parseOpaqueHost(input) { - if (containsForbiddenHostCodePointExcludingPercent(input)) { - return failure; - } - - let output = ""; - const decoded = punycode.ucs2.decode(input); - for (let i = 0; i < decoded.length; ++i) { - output += percentEncodeChar(decoded[i], isC0ControlPercentEncode); - } - return output; -} - -function findLongestZeroSequence(arr) { - let maxIdx = null; - let maxLen = 1; // only find elements > 1 - let currStart = null; - let currLen = 0; - - for (let i = 0; i < arr.length; ++i) { - if (arr[i] !== 0) { - if (currLen > maxLen) { - maxIdx = currStart; - maxLen = currLen; - } - - currStart = null; - currLen = 0; - } else { - if (currStart === null) { - currStart = i; - } - ++currLen; - } - } - - // if trailing zeros - if (currLen > maxLen) { - maxIdx = currStart; - maxLen = currLen; - } - - return { - idx: maxIdx, - len: maxLen - }; -} - -function serializeHost(host) { - if (typeof host === "number") { - return serializeIPv4(host); - } - - // IPv6 serializer - if (host instanceof Array) { - return "[" + serializeIPv6(host) + "]"; - } - - return host; -} - -function trimControlChars(url) { - return url.replace(/^[\u0000-\u001F\u0020]+|[\u0000-\u001F\u0020]+$/g, ""); -} - -function trimTabAndNewline(url) { - return url.replace(/\u0009|\u000A|\u000D/g, ""); -} - -function shortenPath(url) { - const path = url.path; - if (path.length === 0) { - return; - } - if (url.scheme === "file" && path.length === 1 && isNormalizedWindowsDriveLetter(path[0])) { - return; - } - - path.pop(); -} - -function includesCredentials(url) { - return url.username !== "" || url.password !== ""; -} - -function cannotHaveAUsernamePasswordPort(url) { - return url.host === null || url.host === "" || url.cannotBeABaseURL || url.scheme === "file"; -} - -function isNormalizedWindowsDriveLetter(string) { - return /^[A-Za-z]:$/.test(string); -} - -function URLStateMachine(input, base, encodingOverride, url, stateOverride) { - this.pointer = 0; - this.input = input; - this.base = base || null; - this.encodingOverride = encodingOverride || "utf-8"; - this.stateOverride = stateOverride; - this.url = url; - this.failure = false; - this.parseError = false; - - if (!this.url) { - this.url = { - scheme: "", - username: "", - password: "", - host: null, - port: null, - path: [], - query: null, - fragment: null, - - cannotBeABaseURL: false - }; - - const res = trimControlChars(this.input); - if (res !== this.input) { - this.parseError = true; - } - this.input = res; - } - - const res = trimTabAndNewline(this.input); - if (res !== this.input) { - this.parseError = true; - } - this.input = res; - - this.state = stateOverride || "scheme start"; - - this.buffer = ""; - this.atFlag = false; - this.arrFlag = false; - this.passwordTokenSeenFlag = false; - - this.input = punycode.ucs2.decode(this.input); - - for (; this.pointer <= this.input.length; ++this.pointer) { - const c = this.input[this.pointer]; - const cStr = isNaN(c) ? undefined : String.fromCodePoint(c); - - // exec state machine - const ret = this["parse " + this.state](c, cStr); - if (!ret) { - break; // terminate algorithm - } else if (ret === failure) { - this.failure = true; - break; - } - } -} - -URLStateMachine.prototype["parse scheme start"] = function parseSchemeStart(c, cStr) { - if (isASCIIAlpha(c)) { - this.buffer += cStr.toLowerCase(); - this.state = "scheme"; - } else if (!this.stateOverride) { - this.state = "no scheme"; - --this.pointer; - } else { - this.parseError = true; - return failure; - } - - return true; -}; - -URLStateMachine.prototype["parse scheme"] = function parseScheme(c, cStr) { - if (isASCIIAlphanumeric(c) || c === 43 || c === 45 || c === 46) { - this.buffer += cStr.toLowerCase(); - } else if (c === 58) { - if (this.stateOverride) { - if (isSpecial(this.url) && !isSpecialScheme(this.buffer)) { - return false; - } - - if (!isSpecial(this.url) && isSpecialScheme(this.buffer)) { - return false; - } - - if ((includesCredentials(this.url) || this.url.port !== null) && this.buffer === "file") { - return false; - } - - if (this.url.scheme === "file" && (this.url.host === "" || this.url.host === null)) { - return false; - } - } - this.url.scheme = this.buffer; - this.buffer = ""; - if (this.stateOverride) { - return false; - } - if (this.url.scheme === "file") { - if (this.input[this.pointer + 1] !== 47 || this.input[this.pointer + 2] !== 47) { - this.parseError = true; - } - this.state = "file"; - } else if (isSpecial(this.url) && this.base !== null && this.base.scheme === this.url.scheme) { - this.state = "special relative or authority"; - } else if (isSpecial(this.url)) { - this.state = "special authority slashes"; - } else if (this.input[this.pointer + 1] === 47) { - this.state = "path or authority"; - ++this.pointer; - } else { - this.url.cannotBeABaseURL = true; - this.url.path.push(""); - this.state = "cannot-be-a-base-URL path"; - } - } else if (!this.stateOverride) { - this.buffer = ""; - this.state = "no scheme"; - this.pointer = -1; - } else { - this.parseError = true; - return failure; - } - - return true; -}; - -URLStateMachine.prototype["parse no scheme"] = function parseNoScheme(c) { - if (this.base === null || (this.base.cannotBeABaseURL && c !== 35)) { - return failure; - } else if (this.base.cannotBeABaseURL && c === 35) { - this.url.scheme = this.base.scheme; - this.url.path = this.base.path.slice(); - this.url.query = this.base.query; - this.url.fragment = ""; - this.url.cannotBeABaseURL = true; - this.state = "fragment"; - } else if (this.base.scheme === "file") { - this.state = "file"; - --this.pointer; - } else { - this.state = "relative"; - --this.pointer; - } - - return true; -}; - -URLStateMachine.prototype["parse special relative or authority"] = function parseSpecialRelativeOrAuthority(c) { - if (c === 47 && this.input[this.pointer + 1] === 47) { - this.state = "special authority ignore slashes"; - ++this.pointer; - } else { - this.parseError = true; - this.state = "relative"; - --this.pointer; - } - - return true; -}; - -URLStateMachine.prototype["parse path or authority"] = function parsePathOrAuthority(c) { - if (c === 47) { - this.state = "authority"; - } else { - this.state = "path"; - --this.pointer; - } - - return true; -}; - -URLStateMachine.prototype["parse relative"] = function parseRelative(c) { - this.url.scheme = this.base.scheme; - if (isNaN(c)) { - this.url.username = this.base.username; - this.url.password = this.base.password; - this.url.host = this.base.host; - this.url.port = this.base.port; - this.url.path = this.base.path.slice(); - this.url.query = this.base.query; - } else if (c === 47) { - this.state = "relative slash"; - } else if (c === 63) { - this.url.username = this.base.username; - this.url.password = this.base.password; - this.url.host = this.base.host; - this.url.port = this.base.port; - this.url.path = this.base.path.slice(); - this.url.query = ""; - this.state = "query"; - } else if (c === 35) { - this.url.username = this.base.username; - this.url.password = this.base.password; - this.url.host = this.base.host; - this.url.port = this.base.port; - this.url.path = this.base.path.slice(); - this.url.query = this.base.query; - this.url.fragment = ""; - this.state = "fragment"; - } else if (isSpecial(this.url) && c === 92) { - this.parseError = true; - this.state = "relative slash"; - } else { - this.url.username = this.base.username; - this.url.password = this.base.password; - this.url.host = this.base.host; - this.url.port = this.base.port; - this.url.path = this.base.path.slice(0, this.base.path.length - 1); - - this.state = "path"; - --this.pointer; - } - - return true; -}; - -URLStateMachine.prototype["parse relative slash"] = function parseRelativeSlash(c) { - if (isSpecial(this.url) && (c === 47 || c === 92)) { - if (c === 92) { - this.parseError = true; - } - this.state = "special authority ignore slashes"; - } else if (c === 47) { - this.state = "authority"; - } else { - this.url.username = this.base.username; - this.url.password = this.base.password; - this.url.host = this.base.host; - this.url.port = this.base.port; - this.state = "path"; - --this.pointer; - } - - return true; -}; - -URLStateMachine.prototype["parse special authority slashes"] = function parseSpecialAuthoritySlashes(c) { - if (c === 47 && this.input[this.pointer + 1] === 47) { - this.state = "special authority ignore slashes"; - ++this.pointer; - } else { - this.parseError = true; - this.state = "special authority ignore slashes"; - --this.pointer; - } - - return true; -}; - -URLStateMachine.prototype["parse special authority ignore slashes"] = function parseSpecialAuthorityIgnoreSlashes(c) { - if (c !== 47 && c !== 92) { - this.state = "authority"; - --this.pointer; - } else { - this.parseError = true; - } - - return true; -}; - -URLStateMachine.prototype["parse authority"] = function parseAuthority(c, cStr) { - if (c === 64) { - this.parseError = true; - if (this.atFlag) { - this.buffer = "%40" + this.buffer; - } - this.atFlag = true; - - // careful, this is based on buffer and has its own pointer (this.pointer != pointer) and inner chars - const len = countSymbols(this.buffer); - for (let pointer = 0; pointer < len; ++pointer) { - const codePoint = this.buffer.codePointAt(pointer); - - if (codePoint === 58 && !this.passwordTokenSeenFlag) { - this.passwordTokenSeenFlag = true; - continue; - } - const encodedCodePoints = percentEncodeChar(codePoint, isUserinfoPercentEncode); - if (this.passwordTokenSeenFlag) { - this.url.password += encodedCodePoints; - } else { - this.url.username += encodedCodePoints; - } - } - this.buffer = ""; - } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || - (isSpecial(this.url) && c === 92)) { - if (this.atFlag && this.buffer === "") { - this.parseError = true; - return failure; - } - this.pointer -= countSymbols(this.buffer) + 1; - this.buffer = ""; - this.state = "host"; - } else { - this.buffer += cStr; - } - - return true; -}; - -URLStateMachine.prototype["parse hostname"] = -URLStateMachine.prototype["parse host"] = function parseHostName(c, cStr) { - if (this.stateOverride && this.url.scheme === "file") { - --this.pointer; - this.state = "file host"; - } else if (c === 58 && !this.arrFlag) { - if (this.buffer === "") { - this.parseError = true; - return failure; - } - - const host = parseHost(this.buffer, isSpecial(this.url)); - if (host === failure) { - return failure; - } - - this.url.host = host; - this.buffer = ""; - this.state = "port"; - if (this.stateOverride === "hostname") { - return false; - } - } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || - (isSpecial(this.url) && c === 92)) { - --this.pointer; - if (isSpecial(this.url) && this.buffer === "") { - this.parseError = true; - return failure; - } else if (this.stateOverride && this.buffer === "" && - (includesCredentials(this.url) || this.url.port !== null)) { - this.parseError = true; - return false; - } - - const host = parseHost(this.buffer, isSpecial(this.url)); - if (host === failure) { - return failure; - } - - this.url.host = host; - this.buffer = ""; - this.state = "path start"; - if (this.stateOverride) { - return false; - } - } else { - if (c === 91) { - this.arrFlag = true; - } else if (c === 93) { - this.arrFlag = false; - } - this.buffer += cStr; - } - - return true; -}; - -URLStateMachine.prototype["parse port"] = function parsePort(c, cStr) { - if (isASCIIDigit(c)) { - this.buffer += cStr; - } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || - (isSpecial(this.url) && c === 92) || - this.stateOverride) { - if (this.buffer !== "") { - const port = parseInt(this.buffer); - if (port > Math.pow(2, 16) - 1) { - this.parseError = true; - return failure; - } - this.url.port = port === defaultPort(this.url.scheme) ? null : port; - this.buffer = ""; - } - if (this.stateOverride) { - return false; - } - this.state = "path start"; - --this.pointer; - } else { - this.parseError = true; - return failure; - } - - return true; -}; - -const fileOtherwiseCodePoints = new Set([47, 92, 63, 35]); - -URLStateMachine.prototype["parse file"] = function parseFile(c) { - this.url.scheme = "file"; - - if (c === 47 || c === 92) { - if (c === 92) { - this.parseError = true; - } - this.state = "file slash"; - } else if (this.base !== null && this.base.scheme === "file") { - if (isNaN(c)) { - this.url.host = this.base.host; - this.url.path = this.base.path.slice(); - this.url.query = this.base.query; - } else if (c === 63) { - this.url.host = this.base.host; - this.url.path = this.base.path.slice(); - this.url.query = ""; - this.state = "query"; - } else if (c === 35) { - this.url.host = this.base.host; - this.url.path = this.base.path.slice(); - this.url.query = this.base.query; - this.url.fragment = ""; - this.state = "fragment"; - } else { - if (this.input.length - this.pointer - 1 === 0 || // remaining consists of 0 code points - !isWindowsDriveLetterCodePoints(c, this.input[this.pointer + 1]) || - (this.input.length - this.pointer - 1 >= 2 && // remaining has at least 2 code points - !fileOtherwiseCodePoints.has(this.input[this.pointer + 2]))) { - this.url.host = this.base.host; - this.url.path = this.base.path.slice(); - shortenPath(this.url); - } else { - this.parseError = true; - } - - this.state = "path"; - --this.pointer; - } - } else { - this.state = "path"; - --this.pointer; - } - - return true; -}; - -URLStateMachine.prototype["parse file slash"] = function parseFileSlash(c) { - if (c === 47 || c === 92) { - if (c === 92) { - this.parseError = true; - } - this.state = "file host"; - } else { - if (this.base !== null && this.base.scheme === "file") { - if (isNormalizedWindowsDriveLetterString(this.base.path[0])) { - this.url.path.push(this.base.path[0]); - } else { - this.url.host = this.base.host; - } - } - this.state = "path"; - --this.pointer; - } - - return true; -}; - -URLStateMachine.prototype["parse file host"] = function parseFileHost(c, cStr) { - if (isNaN(c) || c === 47 || c === 92 || c === 63 || c === 35) { - --this.pointer; - if (!this.stateOverride && isWindowsDriveLetterString(this.buffer)) { - this.parseError = true; - this.state = "path"; - } else if (this.buffer === "") { - this.url.host = ""; - if (this.stateOverride) { - return false; - } - this.state = "path start"; - } else { - let host = parseHost(this.buffer, isSpecial(this.url)); - if (host === failure) { - return failure; - } - if (host === "localhost") { - host = ""; - } - this.url.host = host; - - if (this.stateOverride) { - return false; - } - - this.buffer = ""; - this.state = "path start"; - } - } else { - this.buffer += cStr; - } - - return true; -}; - -URLStateMachine.prototype["parse path start"] = function parsePathStart(c) { - if (isSpecial(this.url)) { - if (c === 92) { - this.parseError = true; - } - this.state = "path"; - - if (c !== 47 && c !== 92) { - --this.pointer; - } - } else if (!this.stateOverride && c === 63) { - this.url.query = ""; - this.state = "query"; - } else if (!this.stateOverride && c === 35) { - this.url.fragment = ""; - this.state = "fragment"; - } else if (c !== undefined) { - this.state = "path"; - if (c !== 47) { - --this.pointer; - } - } - - return true; -}; - -URLStateMachine.prototype["parse path"] = function parsePath(c) { - if (isNaN(c) || c === 47 || (isSpecial(this.url) && c === 92) || - (!this.stateOverride && (c === 63 || c === 35))) { - if (isSpecial(this.url) && c === 92) { - this.parseError = true; - } - - if (isDoubleDot(this.buffer)) { - shortenPath(this.url); - if (c !== 47 && !(isSpecial(this.url) && c === 92)) { - this.url.path.push(""); - } - } else if (isSingleDot(this.buffer) && c !== 47 && - !(isSpecial(this.url) && c === 92)) { - this.url.path.push(""); - } else if (!isSingleDot(this.buffer)) { - if (this.url.scheme === "file" && this.url.path.length === 0 && isWindowsDriveLetterString(this.buffer)) { - if (this.url.host !== "" && this.url.host !== null) { - this.parseError = true; - this.url.host = ""; - } - this.buffer = this.buffer[0] + ":"; - } - this.url.path.push(this.buffer); - } - this.buffer = ""; - if (this.url.scheme === "file" && (c === undefined || c === 63 || c === 35)) { - while (this.url.path.length > 1 && this.url.path[0] === "") { - this.parseError = true; - this.url.path.shift(); - } - } - if (c === 63) { - this.url.query = ""; - this.state = "query"; - } - if (c === 35) { - this.url.fragment = ""; - this.state = "fragment"; - } - } else { - // TODO: If c is not a URL code point and not "%", parse error. - - if (c === 37 && - (!isASCIIHex(this.input[this.pointer + 1]) || - !isASCIIHex(this.input[this.pointer + 2]))) { - this.parseError = true; - } - - this.buffer += percentEncodeChar(c, isPathPercentEncode); - } - - return true; -}; - -URLStateMachine.prototype["parse cannot-be-a-base-URL path"] = function parseCannotBeABaseURLPath(c) { - if (c === 63) { - this.url.query = ""; - this.state = "query"; - } else if (c === 35) { - this.url.fragment = ""; - this.state = "fragment"; - } else { - // TODO: Add: not a URL code point - if (!isNaN(c) && c !== 37) { - this.parseError = true; - } - - if (c === 37 && - (!isASCIIHex(this.input[this.pointer + 1]) || - !isASCIIHex(this.input[this.pointer + 2]))) { - this.parseError = true; - } - - if (!isNaN(c)) { - this.url.path[0] = this.url.path[0] + percentEncodeChar(c, isC0ControlPercentEncode); - } - } - - return true; -}; - -URLStateMachine.prototype["parse query"] = function parseQuery(c, cStr) { - if (isNaN(c) || (!this.stateOverride && c === 35)) { - if (!isSpecial(this.url) || this.url.scheme === "ws" || this.url.scheme === "wss") { - this.encodingOverride = "utf-8"; - } - - const buffer = new Buffer(this.buffer); // TODO: Use encoding override instead - for (let i = 0; i < buffer.length; ++i) { - if (buffer[i] < 0x21 || buffer[i] > 0x7E || buffer[i] === 0x22 || buffer[i] === 0x23 || - buffer[i] === 0x3C || buffer[i] === 0x3E) { - this.url.query += percentEncode(buffer[i]); - } else { - this.url.query += String.fromCodePoint(buffer[i]); - } - } - - this.buffer = ""; - if (c === 35) { - this.url.fragment = ""; - this.state = "fragment"; - } - } else { - // TODO: If c is not a URL code point and not "%", parse error. - if (c === 37 && - (!isASCIIHex(this.input[this.pointer + 1]) || - !isASCIIHex(this.input[this.pointer + 2]))) { - this.parseError = true; - } - - this.buffer += cStr; - } - - return true; -}; - -URLStateMachine.prototype["parse fragment"] = function parseFragment(c) { - if (isNaN(c)) { // do nothing - } else if (c === 0x0) { - this.parseError = true; - } else { - // TODO: If c is not a URL code point and not "%", parse error. - if (c === 37 && - (!isASCIIHex(this.input[this.pointer + 1]) || - !isASCIIHex(this.input[this.pointer + 2]))) { - this.parseError = true; - } - - this.url.fragment += percentEncodeChar(c, isC0ControlPercentEncode); - } - - return true; -}; - -function serializeURL(url, excludeFragment) { - let output = url.scheme + ":"; - if (url.host !== null) { - output += "//"; - - if (url.username !== "" || url.password !== "") { - output += url.username; - if (url.password !== "") { - output += ":" + url.password; - } - output += "@"; - } - - output += serializeHost(url.host); - - if (url.port !== null) { - output += ":" + url.port; - } - } else if (url.host === null && url.scheme === "file") { - output += "//"; - } - - if (url.cannotBeABaseURL) { - output += url.path[0]; - } else { - for (const string of url.path) { - output += "/" + string; - } - } - - if (url.query !== null) { - output += "?" + url.query; - } - - if (!excludeFragment && url.fragment !== null) { - output += "#" + url.fragment; - } - - return output; -} - -function serializeOrigin(tuple) { - let result = tuple.scheme + "://"; - result += serializeHost(tuple.host); - - if (tuple.port !== null) { - result += ":" + tuple.port; - } - - return result; -} - -module.exports.serializeURL = serializeURL; - -module.exports.serializeURLOrigin = function (url) { - // https://url.spec.whatwg.org/#concept-url-origin - switch (url.scheme) { - case "blob": - try { - return module.exports.serializeURLOrigin(module.exports.parseURL(url.path[0])); - } catch (e) { - // serializing an opaque origin returns "null" - return "null"; - } - case "ftp": - case "gopher": - case "http": - case "https": - case "ws": - case "wss": - return serializeOrigin({ - scheme: url.scheme, - host: url.host, - port: url.port - }); - case "file": - // spec says "exercise to the reader", chrome says "file://" - return "file://"; - default: - // serializing an opaque origin returns "null" - return "null"; - } -}; - -module.exports.basicURLParse = function (input, options) { - if (options === undefined) { - options = {}; - } - - const usm = new URLStateMachine(input, options.baseURL, options.encodingOverride, options.url, options.stateOverride); - if (usm.failure) { - return "failure"; - } - - return usm.url; -}; - -module.exports.setTheUsername = function (url, username) { - url.username = ""; - const decoded = punycode.ucs2.decode(username); - for (let i = 0; i < decoded.length; ++i) { - url.username += percentEncodeChar(decoded[i], isUserinfoPercentEncode); - } -}; - -module.exports.setThePassword = function (url, password) { - url.password = ""; - const decoded = punycode.ucs2.decode(password); - for (let i = 0; i < decoded.length; ++i) { - url.password += percentEncodeChar(decoded[i], isUserinfoPercentEncode); - } -}; - -module.exports.serializeHost = serializeHost; - -module.exports.cannotHaveAUsernamePasswordPort = cannotHaveAUsernamePasswordPort; - -module.exports.serializeInteger = function (integer) { - return String(integer); -}; - -module.exports.parseURL = function (input, options) { - if (options === undefined) { - options = {}; - } - - // We don't handle blobs, so this just delegates: - return module.exports.basicURLParse(input, { baseURL: options.baseURL, encodingOverride: options.encodingOverride }); -}; + +const punycode = __nccwpck_require__(5477); +const tr46 = __nccwpck_require__(2299); + +const specialSchemes = { + ftp: 21, + file: null, + gopher: 70, + http: 80, + https: 443, + ws: 80, + wss: 443 +}; + +const failure = Symbol("failure"); + +function countSymbols(str) { + return punycode.ucs2.decode(str).length; +} + +function at(input, idx) { + const c = input[idx]; + return isNaN(c) ? undefined : String.fromCodePoint(c); +} + +function isASCIIDigit(c) { + return c >= 0x30 && c <= 0x39; +} + +function isASCIIAlpha(c) { + return (c >= 0x41 && c <= 0x5A) || (c >= 0x61 && c <= 0x7A); +} + +function isASCIIAlphanumeric(c) { + return isASCIIAlpha(c) || isASCIIDigit(c); +} + +function isASCIIHex(c) { + return isASCIIDigit(c) || (c >= 0x41 && c <= 0x46) || (c >= 0x61 && c <= 0x66); +} + +function isSingleDot(buffer) { + return buffer === "." || buffer.toLowerCase() === "%2e"; +} + +function isDoubleDot(buffer) { + buffer = buffer.toLowerCase(); + return buffer === ".." || buffer === "%2e." || buffer === ".%2e" || buffer === "%2e%2e"; +} + +function isWindowsDriveLetterCodePoints(cp1, cp2) { + return isASCIIAlpha(cp1) && (cp2 === 58 || cp2 === 124); +} + +function isWindowsDriveLetterString(string) { + return string.length === 2 && isASCIIAlpha(string.codePointAt(0)) && (string[1] === ":" || string[1] === "|"); +} + +function isNormalizedWindowsDriveLetterString(string) { + return string.length === 2 && isASCIIAlpha(string.codePointAt(0)) && string[1] === ":"; +} + +function containsForbiddenHostCodePoint(string) { + return string.search(/\u0000|\u0009|\u000A|\u000D|\u0020|#|%|\/|:|\?|@|\[|\\|\]/) !== -1; +} + +function containsForbiddenHostCodePointExcludingPercent(string) { + return string.search(/\u0000|\u0009|\u000A|\u000D|\u0020|#|\/|:|\?|@|\[|\\|\]/) !== -1; +} + +function isSpecialScheme(scheme) { + return specialSchemes[scheme] !== undefined; +} + +function isSpecial(url) { + return isSpecialScheme(url.scheme); +} + +function defaultPort(scheme) { + return specialSchemes[scheme]; +} + +function percentEncode(c) { + let hex = c.toString(16).toUpperCase(); + if (hex.length === 1) { + hex = "0" + hex; + } + + return "%" + hex; +} + +function utf8PercentEncode(c) { + const buf = new Buffer(c); + + let str = ""; + + for (let i = 0; i < buf.length; ++i) { + str += percentEncode(buf[i]); + } + + return str; +} + +function utf8PercentDecode(str) { + const input = new Buffer(str); + const output = []; + for (let i = 0; i < input.length; ++i) { + if (input[i] !== 37) { + output.push(input[i]); + } else if (input[i] === 37 && isASCIIHex(input[i + 1]) && isASCIIHex(input[i + 2])) { + output.push(parseInt(input.slice(i + 1, i + 3).toString(), 16)); + i += 2; + } else { + output.push(input[i]); + } + } + return new Buffer(output).toString(); +} + +function isC0ControlPercentEncode(c) { + return c <= 0x1F || c > 0x7E; +} + +const extraPathPercentEncodeSet = new Set([32, 34, 35, 60, 62, 63, 96, 123, 125]); +function isPathPercentEncode(c) { + return isC0ControlPercentEncode(c) || extraPathPercentEncodeSet.has(c); +} + +const extraUserinfoPercentEncodeSet = + new Set([47, 58, 59, 61, 64, 91, 92, 93, 94, 124]); +function isUserinfoPercentEncode(c) { + return isPathPercentEncode(c) || extraUserinfoPercentEncodeSet.has(c); +} + +function percentEncodeChar(c, encodeSetPredicate) { + const cStr = String.fromCodePoint(c); + + if (encodeSetPredicate(c)) { + return utf8PercentEncode(cStr); + } + + return cStr; +} + +function parseIPv4Number(input) { + let R = 10; + + if (input.length >= 2 && input.charAt(0) === "0" && input.charAt(1).toLowerCase() === "x") { + input = input.substring(2); + R = 16; + } else if (input.length >= 2 && input.charAt(0) === "0") { + input = input.substring(1); + R = 8; + } + + if (input === "") { + return 0; + } + + const regex = R === 10 ? /[^0-9]/ : (R === 16 ? /[^0-9A-Fa-f]/ : /[^0-7]/); + if (regex.test(input)) { + return failure; + } + + return parseInt(input, R); +} + +function parseIPv4(input) { + const parts = input.split("."); + if (parts[parts.length - 1] === "") { + if (parts.length > 1) { + parts.pop(); + } + } + + if (parts.length > 4) { + return input; + } + + const numbers = []; + for (const part of parts) { + if (part === "") { + return input; + } + const n = parseIPv4Number(part); + if (n === failure) { + return input; + } + + numbers.push(n); + } + + for (let i = 0; i < numbers.length - 1; ++i) { + if (numbers[i] > 255) { + return failure; + } + } + if (numbers[numbers.length - 1] >= Math.pow(256, 5 - numbers.length)) { + return failure; + } + + let ipv4 = numbers.pop(); + let counter = 0; + + for (const n of numbers) { + ipv4 += n * Math.pow(256, 3 - counter); + ++counter; + } + + return ipv4; +} + +function serializeIPv4(address) { + let output = ""; + let n = address; + + for (let i = 1; i <= 4; ++i) { + output = String(n % 256) + output; + if (i !== 4) { + output = "." + output; + } + n = Math.floor(n / 256); + } + + return output; +} + +function parseIPv6(input) { + const address = [0, 0, 0, 0, 0, 0, 0, 0]; + let pieceIndex = 0; + let compress = null; + let pointer = 0; + + input = punycode.ucs2.decode(input); + + if (input[pointer] === 58) { + if (input[pointer + 1] !== 58) { + return failure; + } + + pointer += 2; + ++pieceIndex; + compress = pieceIndex; + } + + while (pointer < input.length) { + if (pieceIndex === 8) { + return failure; + } + + if (input[pointer] === 58) { + if (compress !== null) { + return failure; + } + ++pointer; + ++pieceIndex; + compress = pieceIndex; + continue; + } + + let value = 0; + let length = 0; + + while (length < 4 && isASCIIHex(input[pointer])) { + value = value * 0x10 + parseInt(at(input, pointer), 16); + ++pointer; + ++length; + } + + if (input[pointer] === 46) { + if (length === 0) { + return failure; + } + + pointer -= length; + + if (pieceIndex > 6) { + return failure; + } + + let numbersSeen = 0; + + while (input[pointer] !== undefined) { + let ipv4Piece = null; + + if (numbersSeen > 0) { + if (input[pointer] === 46 && numbersSeen < 4) { + ++pointer; + } else { + return failure; + } + } + + if (!isASCIIDigit(input[pointer])) { + return failure; + } + + while (isASCIIDigit(input[pointer])) { + const number = parseInt(at(input, pointer)); + if (ipv4Piece === null) { + ipv4Piece = number; + } else if (ipv4Piece === 0) { + return failure; + } else { + ipv4Piece = ipv4Piece * 10 + number; + } + if (ipv4Piece > 255) { + return failure; + } + ++pointer; + } + + address[pieceIndex] = address[pieceIndex] * 0x100 + ipv4Piece; + + ++numbersSeen; + + if (numbersSeen === 2 || numbersSeen === 4) { + ++pieceIndex; + } + } + + if (numbersSeen !== 4) { + return failure; + } + + break; + } else if (input[pointer] === 58) { + ++pointer; + if (input[pointer] === undefined) { + return failure; + } + } else if (input[pointer] !== undefined) { + return failure; + } + + address[pieceIndex] = value; + ++pieceIndex; + } + + if (compress !== null) { + let swaps = pieceIndex - compress; + pieceIndex = 7; + while (pieceIndex !== 0 && swaps > 0) { + const temp = address[compress + swaps - 1]; + address[compress + swaps - 1] = address[pieceIndex]; + address[pieceIndex] = temp; + --pieceIndex; + --swaps; + } + } else if (compress === null && pieceIndex !== 8) { + return failure; + } + + return address; +} + +function serializeIPv6(address) { + let output = ""; + const seqResult = findLongestZeroSequence(address); + const compress = seqResult.idx; + let ignore0 = false; + + for (let pieceIndex = 0; pieceIndex <= 7; ++pieceIndex) { + if (ignore0 && address[pieceIndex] === 0) { + continue; + } else if (ignore0) { + ignore0 = false; + } + + if (compress === pieceIndex) { + const separator = pieceIndex === 0 ? "::" : ":"; + output += separator; + ignore0 = true; + continue; + } + + output += address[pieceIndex].toString(16); + + if (pieceIndex !== 7) { + output += ":"; + } + } + + return output; +} + +function parseHost(input, isSpecialArg) { + if (input[0] === "[") { + if (input[input.length - 1] !== "]") { + return failure; + } + + return parseIPv6(input.substring(1, input.length - 1)); + } + + if (!isSpecialArg) { + return parseOpaqueHost(input); + } + + const domain = utf8PercentDecode(input); + const asciiDomain = tr46.toASCII(domain, false, tr46.PROCESSING_OPTIONS.NONTRANSITIONAL, false); + if (asciiDomain === null) { + return failure; + } + + if (containsForbiddenHostCodePoint(asciiDomain)) { + return failure; + } + + const ipv4Host = parseIPv4(asciiDomain); + if (typeof ipv4Host === "number" || ipv4Host === failure) { + return ipv4Host; + } + + return asciiDomain; +} + +function parseOpaqueHost(input) { + if (containsForbiddenHostCodePointExcludingPercent(input)) { + return failure; + } + + let output = ""; + const decoded = punycode.ucs2.decode(input); + for (let i = 0; i < decoded.length; ++i) { + output += percentEncodeChar(decoded[i], isC0ControlPercentEncode); + } + return output; +} + +function findLongestZeroSequence(arr) { + let maxIdx = null; + let maxLen = 1; // only find elements > 1 + let currStart = null; + let currLen = 0; + + for (let i = 0; i < arr.length; ++i) { + if (arr[i] !== 0) { + if (currLen > maxLen) { + maxIdx = currStart; + maxLen = currLen; + } + + currStart = null; + currLen = 0; + } else { + if (currStart === null) { + currStart = i; + } + ++currLen; + } + } + + // if trailing zeros + if (currLen > maxLen) { + maxIdx = currStart; + maxLen = currLen; + } + + return { + idx: maxIdx, + len: maxLen + }; +} + +function serializeHost(host) { + if (typeof host === "number") { + return serializeIPv4(host); + } + + // IPv6 serializer + if (host instanceof Array) { + return "[" + serializeIPv6(host) + "]"; + } + + return host; +} + +function trimControlChars(url) { + return url.replace(/^[\u0000-\u001F\u0020]+|[\u0000-\u001F\u0020]+$/g, ""); +} + +function trimTabAndNewline(url) { + return url.replace(/\u0009|\u000A|\u000D/g, ""); +} + +function shortenPath(url) { + const path = url.path; + if (path.length === 0) { + return; + } + if (url.scheme === "file" && path.length === 1 && isNormalizedWindowsDriveLetter(path[0])) { + return; + } + + path.pop(); +} + +function includesCredentials(url) { + return url.username !== "" || url.password !== ""; +} + +function cannotHaveAUsernamePasswordPort(url) { + return url.host === null || url.host === "" || url.cannotBeABaseURL || url.scheme === "file"; +} + +function isNormalizedWindowsDriveLetter(string) { + return /^[A-Za-z]:$/.test(string); +} + +function URLStateMachine(input, base, encodingOverride, url, stateOverride) { + this.pointer = 0; + this.input = input; + this.base = base || null; + this.encodingOverride = encodingOverride || "utf-8"; + this.stateOverride = stateOverride; + this.url = url; + this.failure = false; + this.parseError = false; + + if (!this.url) { + this.url = { + scheme: "", + username: "", + password: "", + host: null, + port: null, + path: [], + query: null, + fragment: null, + + cannotBeABaseURL: false + }; + + const res = trimControlChars(this.input); + if (res !== this.input) { + this.parseError = true; + } + this.input = res; + } + + const res = trimTabAndNewline(this.input); + if (res !== this.input) { + this.parseError = true; + } + this.input = res; + + this.state = stateOverride || "scheme start"; + + this.buffer = ""; + this.atFlag = false; + this.arrFlag = false; + this.passwordTokenSeenFlag = false; + + this.input = punycode.ucs2.decode(this.input); + + for (; this.pointer <= this.input.length; ++this.pointer) { + const c = this.input[this.pointer]; + const cStr = isNaN(c) ? undefined : String.fromCodePoint(c); + + // exec state machine + const ret = this["parse " + this.state](c, cStr); + if (!ret) { + break; // terminate algorithm + } else if (ret === failure) { + this.failure = true; + break; + } + } +} + +URLStateMachine.prototype["parse scheme start"] = function parseSchemeStart(c, cStr) { + if (isASCIIAlpha(c)) { + this.buffer += cStr.toLowerCase(); + this.state = "scheme"; + } else if (!this.stateOverride) { + this.state = "no scheme"; + --this.pointer; + } else { + this.parseError = true; + return failure; + } + + return true; +}; + +URLStateMachine.prototype["parse scheme"] = function parseScheme(c, cStr) { + if (isASCIIAlphanumeric(c) || c === 43 || c === 45 || c === 46) { + this.buffer += cStr.toLowerCase(); + } else if (c === 58) { + if (this.stateOverride) { + if (isSpecial(this.url) && !isSpecialScheme(this.buffer)) { + return false; + } + + if (!isSpecial(this.url) && isSpecialScheme(this.buffer)) { + return false; + } + + if ((includesCredentials(this.url) || this.url.port !== null) && this.buffer === "file") { + return false; + } + + if (this.url.scheme === "file" && (this.url.host === "" || this.url.host === null)) { + return false; + } + } + this.url.scheme = this.buffer; + this.buffer = ""; + if (this.stateOverride) { + return false; + } + if (this.url.scheme === "file") { + if (this.input[this.pointer + 1] !== 47 || this.input[this.pointer + 2] !== 47) { + this.parseError = true; + } + this.state = "file"; + } else if (isSpecial(this.url) && this.base !== null && this.base.scheme === this.url.scheme) { + this.state = "special relative or authority"; + } else if (isSpecial(this.url)) { + this.state = "special authority slashes"; + } else if (this.input[this.pointer + 1] === 47) { + this.state = "path or authority"; + ++this.pointer; + } else { + this.url.cannotBeABaseURL = true; + this.url.path.push(""); + this.state = "cannot-be-a-base-URL path"; + } + } else if (!this.stateOverride) { + this.buffer = ""; + this.state = "no scheme"; + this.pointer = -1; + } else { + this.parseError = true; + return failure; + } + + return true; +}; + +URLStateMachine.prototype["parse no scheme"] = function parseNoScheme(c) { + if (this.base === null || (this.base.cannotBeABaseURL && c !== 35)) { + return failure; + } else if (this.base.cannotBeABaseURL && c === 35) { + this.url.scheme = this.base.scheme; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + this.url.fragment = ""; + this.url.cannotBeABaseURL = true; + this.state = "fragment"; + } else if (this.base.scheme === "file") { + this.state = "file"; + --this.pointer; + } else { + this.state = "relative"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse special relative or authority"] = function parseSpecialRelativeOrAuthority(c) { + if (c === 47 && this.input[this.pointer + 1] === 47) { + this.state = "special authority ignore slashes"; + ++this.pointer; + } else { + this.parseError = true; + this.state = "relative"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse path or authority"] = function parsePathOrAuthority(c) { + if (c === 47) { + this.state = "authority"; + } else { + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse relative"] = function parseRelative(c) { + this.url.scheme = this.base.scheme; + if (isNaN(c)) { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + } else if (c === 47) { + this.state = "relative slash"; + } else if (c === 63) { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.url.path = this.base.path.slice(); + this.url.query = ""; + this.state = "query"; + } else if (c === 35) { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + this.url.fragment = ""; + this.state = "fragment"; + } else if (isSpecial(this.url) && c === 92) { + this.parseError = true; + this.state = "relative slash"; + } else { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.url.path = this.base.path.slice(0, this.base.path.length - 1); + + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse relative slash"] = function parseRelativeSlash(c) { + if (isSpecial(this.url) && (c === 47 || c === 92)) { + if (c === 92) { + this.parseError = true; + } + this.state = "special authority ignore slashes"; + } else if (c === 47) { + this.state = "authority"; + } else { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse special authority slashes"] = function parseSpecialAuthoritySlashes(c) { + if (c === 47 && this.input[this.pointer + 1] === 47) { + this.state = "special authority ignore slashes"; + ++this.pointer; + } else { + this.parseError = true; + this.state = "special authority ignore slashes"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse special authority ignore slashes"] = function parseSpecialAuthorityIgnoreSlashes(c) { + if (c !== 47 && c !== 92) { + this.state = "authority"; + --this.pointer; + } else { + this.parseError = true; + } + + return true; +}; + +URLStateMachine.prototype["parse authority"] = function parseAuthority(c, cStr) { + if (c === 64) { + this.parseError = true; + if (this.atFlag) { + this.buffer = "%40" + this.buffer; + } + this.atFlag = true; + + // careful, this is based on buffer and has its own pointer (this.pointer != pointer) and inner chars + const len = countSymbols(this.buffer); + for (let pointer = 0; pointer < len; ++pointer) { + const codePoint = this.buffer.codePointAt(pointer); + + if (codePoint === 58 && !this.passwordTokenSeenFlag) { + this.passwordTokenSeenFlag = true; + continue; + } + const encodedCodePoints = percentEncodeChar(codePoint, isUserinfoPercentEncode); + if (this.passwordTokenSeenFlag) { + this.url.password += encodedCodePoints; + } else { + this.url.username += encodedCodePoints; + } + } + this.buffer = ""; + } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || + (isSpecial(this.url) && c === 92)) { + if (this.atFlag && this.buffer === "") { + this.parseError = true; + return failure; + } + this.pointer -= countSymbols(this.buffer) + 1; + this.buffer = ""; + this.state = "host"; + } else { + this.buffer += cStr; + } + + return true; +}; + +URLStateMachine.prototype["parse hostname"] = +URLStateMachine.prototype["parse host"] = function parseHostName(c, cStr) { + if (this.stateOverride && this.url.scheme === "file") { + --this.pointer; + this.state = "file host"; + } else if (c === 58 && !this.arrFlag) { + if (this.buffer === "") { + this.parseError = true; + return failure; + } + + const host = parseHost(this.buffer, isSpecial(this.url)); + if (host === failure) { + return failure; + } + + this.url.host = host; + this.buffer = ""; + this.state = "port"; + if (this.stateOverride === "hostname") { + return false; + } + } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || + (isSpecial(this.url) && c === 92)) { + --this.pointer; + if (isSpecial(this.url) && this.buffer === "") { + this.parseError = true; + return failure; + } else if (this.stateOverride && this.buffer === "" && + (includesCredentials(this.url) || this.url.port !== null)) { + this.parseError = true; + return false; + } + + const host = parseHost(this.buffer, isSpecial(this.url)); + if (host === failure) { + return failure; + } + + this.url.host = host; + this.buffer = ""; + this.state = "path start"; + if (this.stateOverride) { + return false; + } + } else { + if (c === 91) { + this.arrFlag = true; + } else if (c === 93) { + this.arrFlag = false; + } + this.buffer += cStr; + } + + return true; +}; + +URLStateMachine.prototype["parse port"] = function parsePort(c, cStr) { + if (isASCIIDigit(c)) { + this.buffer += cStr; + } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || + (isSpecial(this.url) && c === 92) || + this.stateOverride) { + if (this.buffer !== "") { + const port = parseInt(this.buffer); + if (port > Math.pow(2, 16) - 1) { + this.parseError = true; + return failure; + } + this.url.port = port === defaultPort(this.url.scheme) ? null : port; + this.buffer = ""; + } + if (this.stateOverride) { + return false; + } + this.state = "path start"; + --this.pointer; + } else { + this.parseError = true; + return failure; + } + + return true; +}; + +const fileOtherwiseCodePoints = new Set([47, 92, 63, 35]); + +URLStateMachine.prototype["parse file"] = function parseFile(c) { + this.url.scheme = "file"; + + if (c === 47 || c === 92) { + if (c === 92) { + this.parseError = true; + } + this.state = "file slash"; + } else if (this.base !== null && this.base.scheme === "file") { + if (isNaN(c)) { + this.url.host = this.base.host; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + } else if (c === 63) { + this.url.host = this.base.host; + this.url.path = this.base.path.slice(); + this.url.query = ""; + this.state = "query"; + } else if (c === 35) { + this.url.host = this.base.host; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + this.url.fragment = ""; + this.state = "fragment"; + } else { + if (this.input.length - this.pointer - 1 === 0 || // remaining consists of 0 code points + !isWindowsDriveLetterCodePoints(c, this.input[this.pointer + 1]) || + (this.input.length - this.pointer - 1 >= 2 && // remaining has at least 2 code points + !fileOtherwiseCodePoints.has(this.input[this.pointer + 2]))) { + this.url.host = this.base.host; + this.url.path = this.base.path.slice(); + shortenPath(this.url); + } else { + this.parseError = true; + } + + this.state = "path"; + --this.pointer; + } + } else { + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse file slash"] = function parseFileSlash(c) { + if (c === 47 || c === 92) { + if (c === 92) { + this.parseError = true; + } + this.state = "file host"; + } else { + if (this.base !== null && this.base.scheme === "file") { + if (isNormalizedWindowsDriveLetterString(this.base.path[0])) { + this.url.path.push(this.base.path[0]); + } else { + this.url.host = this.base.host; + } + } + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse file host"] = function parseFileHost(c, cStr) { + if (isNaN(c) || c === 47 || c === 92 || c === 63 || c === 35) { + --this.pointer; + if (!this.stateOverride && isWindowsDriveLetterString(this.buffer)) { + this.parseError = true; + this.state = "path"; + } else if (this.buffer === "") { + this.url.host = ""; + if (this.stateOverride) { + return false; + } + this.state = "path start"; + } else { + let host = parseHost(this.buffer, isSpecial(this.url)); + if (host === failure) { + return failure; + } + if (host === "localhost") { + host = ""; + } + this.url.host = host; + + if (this.stateOverride) { + return false; + } + + this.buffer = ""; + this.state = "path start"; + } + } else { + this.buffer += cStr; + } + + return true; +}; + +URLStateMachine.prototype["parse path start"] = function parsePathStart(c) { + if (isSpecial(this.url)) { + if (c === 92) { + this.parseError = true; + } + this.state = "path"; + + if (c !== 47 && c !== 92) { + --this.pointer; + } + } else if (!this.stateOverride && c === 63) { + this.url.query = ""; + this.state = "query"; + } else if (!this.stateOverride && c === 35) { + this.url.fragment = ""; + this.state = "fragment"; + } else if (c !== undefined) { + this.state = "path"; + if (c !== 47) { + --this.pointer; + } + } + + return true; +}; + +URLStateMachine.prototype["parse path"] = function parsePath(c) { + if (isNaN(c) || c === 47 || (isSpecial(this.url) && c === 92) || + (!this.stateOverride && (c === 63 || c === 35))) { + if (isSpecial(this.url) && c === 92) { + this.parseError = true; + } + + if (isDoubleDot(this.buffer)) { + shortenPath(this.url); + if (c !== 47 && !(isSpecial(this.url) && c === 92)) { + this.url.path.push(""); + } + } else if (isSingleDot(this.buffer) && c !== 47 && + !(isSpecial(this.url) && c === 92)) { + this.url.path.push(""); + } else if (!isSingleDot(this.buffer)) { + if (this.url.scheme === "file" && this.url.path.length === 0 && isWindowsDriveLetterString(this.buffer)) { + if (this.url.host !== "" && this.url.host !== null) { + this.parseError = true; + this.url.host = ""; + } + this.buffer = this.buffer[0] + ":"; + } + this.url.path.push(this.buffer); + } + this.buffer = ""; + if (this.url.scheme === "file" && (c === undefined || c === 63 || c === 35)) { + while (this.url.path.length > 1 && this.url.path[0] === "") { + this.parseError = true; + this.url.path.shift(); + } + } + if (c === 63) { + this.url.query = ""; + this.state = "query"; + } + if (c === 35) { + this.url.fragment = ""; + this.state = "fragment"; + } + } else { + // TODO: If c is not a URL code point and not "%", parse error. + + if (c === 37 && + (!isASCIIHex(this.input[this.pointer + 1]) || + !isASCIIHex(this.input[this.pointer + 2]))) { + this.parseError = true; + } + + this.buffer += percentEncodeChar(c, isPathPercentEncode); + } + + return true; +}; + +URLStateMachine.prototype["parse cannot-be-a-base-URL path"] = function parseCannotBeABaseURLPath(c) { + if (c === 63) { + this.url.query = ""; + this.state = "query"; + } else if (c === 35) { + this.url.fragment = ""; + this.state = "fragment"; + } else { + // TODO: Add: not a URL code point + if (!isNaN(c) && c !== 37) { + this.parseError = true; + } + + if (c === 37 && + (!isASCIIHex(this.input[this.pointer + 1]) || + !isASCIIHex(this.input[this.pointer + 2]))) { + this.parseError = true; + } + + if (!isNaN(c)) { + this.url.path[0] = this.url.path[0] + percentEncodeChar(c, isC0ControlPercentEncode); + } + } + + return true; +}; + +URLStateMachine.prototype["parse query"] = function parseQuery(c, cStr) { + if (isNaN(c) || (!this.stateOverride && c === 35)) { + if (!isSpecial(this.url) || this.url.scheme === "ws" || this.url.scheme === "wss") { + this.encodingOverride = "utf-8"; + } + + const buffer = new Buffer(this.buffer); // TODO: Use encoding override instead + for (let i = 0; i < buffer.length; ++i) { + if (buffer[i] < 0x21 || buffer[i] > 0x7E || buffer[i] === 0x22 || buffer[i] === 0x23 || + buffer[i] === 0x3C || buffer[i] === 0x3E) { + this.url.query += percentEncode(buffer[i]); + } else { + this.url.query += String.fromCodePoint(buffer[i]); + } + } + + this.buffer = ""; + if (c === 35) { + this.url.fragment = ""; + this.state = "fragment"; + } + } else { + // TODO: If c is not a URL code point and not "%", parse error. + if (c === 37 && + (!isASCIIHex(this.input[this.pointer + 1]) || + !isASCIIHex(this.input[this.pointer + 2]))) { + this.parseError = true; + } + + this.buffer += cStr; + } + + return true; +}; + +URLStateMachine.prototype["parse fragment"] = function parseFragment(c) { + if (isNaN(c)) { // do nothing + } else if (c === 0x0) { + this.parseError = true; + } else { + // TODO: If c is not a URL code point and not "%", parse error. + if (c === 37 && + (!isASCIIHex(this.input[this.pointer + 1]) || + !isASCIIHex(this.input[this.pointer + 2]))) { + this.parseError = true; + } + + this.url.fragment += percentEncodeChar(c, isC0ControlPercentEncode); + } + + return true; +}; + +function serializeURL(url, excludeFragment) { + let output = url.scheme + ":"; + if (url.host !== null) { + output += "//"; + + if (url.username !== "" || url.password !== "") { + output += url.username; + if (url.password !== "") { + output += ":" + url.password; + } + output += "@"; + } + + output += serializeHost(url.host); + + if (url.port !== null) { + output += ":" + url.port; + } + } else if (url.host === null && url.scheme === "file") { + output += "//"; + } + + if (url.cannotBeABaseURL) { + output += url.path[0]; + } else { + for (const string of url.path) { + output += "/" + string; + } + } + + if (url.query !== null) { + output += "?" + url.query; + } + + if (!excludeFragment && url.fragment !== null) { + output += "#" + url.fragment; + } + + return output; +} + +function serializeOrigin(tuple) { + let result = tuple.scheme + "://"; + result += serializeHost(tuple.host); + + if (tuple.port !== null) { + result += ":" + tuple.port; + } + + return result; +} + +module.exports.serializeURL = serializeURL; + +module.exports.serializeURLOrigin = function (url) { + // https://url.spec.whatwg.org/#concept-url-origin + switch (url.scheme) { + case "blob": + try { + return module.exports.serializeURLOrigin(module.exports.parseURL(url.path[0])); + } catch (e) { + // serializing an opaque origin returns "null" + return "null"; + } + case "ftp": + case "gopher": + case "http": + case "https": + case "ws": + case "wss": + return serializeOrigin({ + scheme: url.scheme, + host: url.host, + port: url.port + }); + case "file": + // spec says "exercise to the reader", chrome says "file://" + return "file://"; + default: + // serializing an opaque origin returns "null" + return "null"; + } +}; + +module.exports.basicURLParse = function (input, options) { + if (options === undefined) { + options = {}; + } + + const usm = new URLStateMachine(input, options.baseURL, options.encodingOverride, options.url, options.stateOverride); + if (usm.failure) { + return "failure"; + } + + return usm.url; +}; + +module.exports.setTheUsername = function (url, username) { + url.username = ""; + const decoded = punycode.ucs2.decode(username); + for (let i = 0; i < decoded.length; ++i) { + url.username += percentEncodeChar(decoded[i], isUserinfoPercentEncode); + } +}; + +module.exports.setThePassword = function (url, password) { + url.password = ""; + const decoded = punycode.ucs2.decode(password); + for (let i = 0; i < decoded.length; ++i) { + url.password += percentEncodeChar(decoded[i], isUserinfoPercentEncode); + } +}; + +module.exports.serializeHost = serializeHost; + +module.exports.cannotHaveAUsernamePasswordPort = cannotHaveAUsernamePasswordPort; + +module.exports.serializeInteger = function (integer) { + return String(integer); +}; + +module.exports.parseURL = function (input, options) { + if (options === undefined) { + options = {}; + } + + // We don't handle blobs, so this just delegates: + return module.exports.basicURLParse(input, { baseURL: options.baseURL, encodingOverride: options.encodingOverride }); +}; /***/ }), diff --git a/.github/actions/javascript/getDeployPullRequestList/index.js b/.github/actions/javascript/getDeployPullRequestList/index.js index 07e5d0c93a63..b966561ec755 100644 --- a/.github/actions/javascript/getDeployPullRequestList/index.js +++ b/.github/actions/javascript/getDeployPullRequestList/index.js @@ -11700,1303 +11700,1303 @@ exports.parseURL = __nccwpck_require__(33).parseURL; /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; - -const punycode = __nccwpck_require__(5477); -const tr46 = __nccwpck_require__(2299); - -const specialSchemes = { - ftp: 21, - file: null, - gopher: 70, - http: 80, - https: 443, - ws: 80, - wss: 443 -}; - -const failure = Symbol("failure"); - -function countSymbols(str) { - return punycode.ucs2.decode(str).length; -} - -function at(input, idx) { - const c = input[idx]; - return isNaN(c) ? undefined : String.fromCodePoint(c); -} - -function isASCIIDigit(c) { - return c >= 0x30 && c <= 0x39; -} - -function isASCIIAlpha(c) { - return (c >= 0x41 && c <= 0x5A) || (c >= 0x61 && c <= 0x7A); -} - -function isASCIIAlphanumeric(c) { - return isASCIIAlpha(c) || isASCIIDigit(c); -} - -function isASCIIHex(c) { - return isASCIIDigit(c) || (c >= 0x41 && c <= 0x46) || (c >= 0x61 && c <= 0x66); -} - -function isSingleDot(buffer) { - return buffer === "." || buffer.toLowerCase() === "%2e"; -} - -function isDoubleDot(buffer) { - buffer = buffer.toLowerCase(); - return buffer === ".." || buffer === "%2e." || buffer === ".%2e" || buffer === "%2e%2e"; -} - -function isWindowsDriveLetterCodePoints(cp1, cp2) { - return isASCIIAlpha(cp1) && (cp2 === 58 || cp2 === 124); -} - -function isWindowsDriveLetterString(string) { - return string.length === 2 && isASCIIAlpha(string.codePointAt(0)) && (string[1] === ":" || string[1] === "|"); -} - -function isNormalizedWindowsDriveLetterString(string) { - return string.length === 2 && isASCIIAlpha(string.codePointAt(0)) && string[1] === ":"; -} - -function containsForbiddenHostCodePoint(string) { - return string.search(/\u0000|\u0009|\u000A|\u000D|\u0020|#|%|\/|:|\?|@|\[|\\|\]/) !== -1; -} - -function containsForbiddenHostCodePointExcludingPercent(string) { - return string.search(/\u0000|\u0009|\u000A|\u000D|\u0020|#|\/|:|\?|@|\[|\\|\]/) !== -1; -} - -function isSpecialScheme(scheme) { - return specialSchemes[scheme] !== undefined; -} - -function isSpecial(url) { - return isSpecialScheme(url.scheme); -} - -function defaultPort(scheme) { - return specialSchemes[scheme]; -} - -function percentEncode(c) { - let hex = c.toString(16).toUpperCase(); - if (hex.length === 1) { - hex = "0" + hex; - } - - return "%" + hex; -} - -function utf8PercentEncode(c) { - const buf = new Buffer(c); - - let str = ""; - - for (let i = 0; i < buf.length; ++i) { - str += percentEncode(buf[i]); - } - - return str; -} - -function utf8PercentDecode(str) { - const input = new Buffer(str); - const output = []; - for (let i = 0; i < input.length; ++i) { - if (input[i] !== 37) { - output.push(input[i]); - } else if (input[i] === 37 && isASCIIHex(input[i + 1]) && isASCIIHex(input[i + 2])) { - output.push(parseInt(input.slice(i + 1, i + 3).toString(), 16)); - i += 2; - } else { - output.push(input[i]); - } - } - return new Buffer(output).toString(); -} - -function isC0ControlPercentEncode(c) { - return c <= 0x1F || c > 0x7E; -} - -const extraPathPercentEncodeSet = new Set([32, 34, 35, 60, 62, 63, 96, 123, 125]); -function isPathPercentEncode(c) { - return isC0ControlPercentEncode(c) || extraPathPercentEncodeSet.has(c); -} - -const extraUserinfoPercentEncodeSet = - new Set([47, 58, 59, 61, 64, 91, 92, 93, 94, 124]); -function isUserinfoPercentEncode(c) { - return isPathPercentEncode(c) || extraUserinfoPercentEncodeSet.has(c); -} - -function percentEncodeChar(c, encodeSetPredicate) { - const cStr = String.fromCodePoint(c); - - if (encodeSetPredicate(c)) { - return utf8PercentEncode(cStr); - } - - return cStr; -} - -function parseIPv4Number(input) { - let R = 10; - - if (input.length >= 2 && input.charAt(0) === "0" && input.charAt(1).toLowerCase() === "x") { - input = input.substring(2); - R = 16; - } else if (input.length >= 2 && input.charAt(0) === "0") { - input = input.substring(1); - R = 8; - } - - if (input === "") { - return 0; - } - - const regex = R === 10 ? /[^0-9]/ : (R === 16 ? /[^0-9A-Fa-f]/ : /[^0-7]/); - if (regex.test(input)) { - return failure; - } - - return parseInt(input, R); -} - -function parseIPv4(input) { - const parts = input.split("."); - if (parts[parts.length - 1] === "") { - if (parts.length > 1) { - parts.pop(); - } - } - - if (parts.length > 4) { - return input; - } - - const numbers = []; - for (const part of parts) { - if (part === "") { - return input; - } - const n = parseIPv4Number(part); - if (n === failure) { - return input; - } - - numbers.push(n); - } - - for (let i = 0; i < numbers.length - 1; ++i) { - if (numbers[i] > 255) { - return failure; - } - } - if (numbers[numbers.length - 1] >= Math.pow(256, 5 - numbers.length)) { - return failure; - } - - let ipv4 = numbers.pop(); - let counter = 0; - - for (const n of numbers) { - ipv4 += n * Math.pow(256, 3 - counter); - ++counter; - } - - return ipv4; -} - -function serializeIPv4(address) { - let output = ""; - let n = address; - - for (let i = 1; i <= 4; ++i) { - output = String(n % 256) + output; - if (i !== 4) { - output = "." + output; - } - n = Math.floor(n / 256); - } - - return output; -} - -function parseIPv6(input) { - const address = [0, 0, 0, 0, 0, 0, 0, 0]; - let pieceIndex = 0; - let compress = null; - let pointer = 0; - - input = punycode.ucs2.decode(input); - - if (input[pointer] === 58) { - if (input[pointer + 1] !== 58) { - return failure; - } - - pointer += 2; - ++pieceIndex; - compress = pieceIndex; - } - - while (pointer < input.length) { - if (pieceIndex === 8) { - return failure; - } - - if (input[pointer] === 58) { - if (compress !== null) { - return failure; - } - ++pointer; - ++pieceIndex; - compress = pieceIndex; - continue; - } - - let value = 0; - let length = 0; - - while (length < 4 && isASCIIHex(input[pointer])) { - value = value * 0x10 + parseInt(at(input, pointer), 16); - ++pointer; - ++length; - } - - if (input[pointer] === 46) { - if (length === 0) { - return failure; - } - - pointer -= length; - - if (pieceIndex > 6) { - return failure; - } - - let numbersSeen = 0; - - while (input[pointer] !== undefined) { - let ipv4Piece = null; - - if (numbersSeen > 0) { - if (input[pointer] === 46 && numbersSeen < 4) { - ++pointer; - } else { - return failure; - } - } - - if (!isASCIIDigit(input[pointer])) { - return failure; - } - - while (isASCIIDigit(input[pointer])) { - const number = parseInt(at(input, pointer)); - if (ipv4Piece === null) { - ipv4Piece = number; - } else if (ipv4Piece === 0) { - return failure; - } else { - ipv4Piece = ipv4Piece * 10 + number; - } - if (ipv4Piece > 255) { - return failure; - } - ++pointer; - } - - address[pieceIndex] = address[pieceIndex] * 0x100 + ipv4Piece; - - ++numbersSeen; - - if (numbersSeen === 2 || numbersSeen === 4) { - ++pieceIndex; - } - } - - if (numbersSeen !== 4) { - return failure; - } - - break; - } else if (input[pointer] === 58) { - ++pointer; - if (input[pointer] === undefined) { - return failure; - } - } else if (input[pointer] !== undefined) { - return failure; - } - - address[pieceIndex] = value; - ++pieceIndex; - } - - if (compress !== null) { - let swaps = pieceIndex - compress; - pieceIndex = 7; - while (pieceIndex !== 0 && swaps > 0) { - const temp = address[compress + swaps - 1]; - address[compress + swaps - 1] = address[pieceIndex]; - address[pieceIndex] = temp; - --pieceIndex; - --swaps; - } - } else if (compress === null && pieceIndex !== 8) { - return failure; - } - - return address; -} - -function serializeIPv6(address) { - let output = ""; - const seqResult = findLongestZeroSequence(address); - const compress = seqResult.idx; - let ignore0 = false; - - for (let pieceIndex = 0; pieceIndex <= 7; ++pieceIndex) { - if (ignore0 && address[pieceIndex] === 0) { - continue; - } else if (ignore0) { - ignore0 = false; - } - - if (compress === pieceIndex) { - const separator = pieceIndex === 0 ? "::" : ":"; - output += separator; - ignore0 = true; - continue; - } - - output += address[pieceIndex].toString(16); - - if (pieceIndex !== 7) { - output += ":"; - } - } - - return output; -} - -function parseHost(input, isSpecialArg) { - if (input[0] === "[") { - if (input[input.length - 1] !== "]") { - return failure; - } - - return parseIPv6(input.substring(1, input.length - 1)); - } - - if (!isSpecialArg) { - return parseOpaqueHost(input); - } - - const domain = utf8PercentDecode(input); - const asciiDomain = tr46.toASCII(domain, false, tr46.PROCESSING_OPTIONS.NONTRANSITIONAL, false); - if (asciiDomain === null) { - return failure; - } - - if (containsForbiddenHostCodePoint(asciiDomain)) { - return failure; - } - - const ipv4Host = parseIPv4(asciiDomain); - if (typeof ipv4Host === "number" || ipv4Host === failure) { - return ipv4Host; - } - - return asciiDomain; -} - -function parseOpaqueHost(input) { - if (containsForbiddenHostCodePointExcludingPercent(input)) { - return failure; - } - - let output = ""; - const decoded = punycode.ucs2.decode(input); - for (let i = 0; i < decoded.length; ++i) { - output += percentEncodeChar(decoded[i], isC0ControlPercentEncode); - } - return output; -} - -function findLongestZeroSequence(arr) { - let maxIdx = null; - let maxLen = 1; // only find elements > 1 - let currStart = null; - let currLen = 0; - - for (let i = 0; i < arr.length; ++i) { - if (arr[i] !== 0) { - if (currLen > maxLen) { - maxIdx = currStart; - maxLen = currLen; - } - - currStart = null; - currLen = 0; - } else { - if (currStart === null) { - currStart = i; - } - ++currLen; - } - } - - // if trailing zeros - if (currLen > maxLen) { - maxIdx = currStart; - maxLen = currLen; - } - - return { - idx: maxIdx, - len: maxLen - }; -} - -function serializeHost(host) { - if (typeof host === "number") { - return serializeIPv4(host); - } - - // IPv6 serializer - if (host instanceof Array) { - return "[" + serializeIPv6(host) + "]"; - } - - return host; -} - -function trimControlChars(url) { - return url.replace(/^[\u0000-\u001F\u0020]+|[\u0000-\u001F\u0020]+$/g, ""); -} - -function trimTabAndNewline(url) { - return url.replace(/\u0009|\u000A|\u000D/g, ""); -} - -function shortenPath(url) { - const path = url.path; - if (path.length === 0) { - return; - } - if (url.scheme === "file" && path.length === 1 && isNormalizedWindowsDriveLetter(path[0])) { - return; - } - - path.pop(); -} - -function includesCredentials(url) { - return url.username !== "" || url.password !== ""; -} - -function cannotHaveAUsernamePasswordPort(url) { - return url.host === null || url.host === "" || url.cannotBeABaseURL || url.scheme === "file"; -} - -function isNormalizedWindowsDriveLetter(string) { - return /^[A-Za-z]:$/.test(string); -} - -function URLStateMachine(input, base, encodingOverride, url, stateOverride) { - this.pointer = 0; - this.input = input; - this.base = base || null; - this.encodingOverride = encodingOverride || "utf-8"; - this.stateOverride = stateOverride; - this.url = url; - this.failure = false; - this.parseError = false; - - if (!this.url) { - this.url = { - scheme: "", - username: "", - password: "", - host: null, - port: null, - path: [], - query: null, - fragment: null, - - cannotBeABaseURL: false - }; - - const res = trimControlChars(this.input); - if (res !== this.input) { - this.parseError = true; - } - this.input = res; - } - - const res = trimTabAndNewline(this.input); - if (res !== this.input) { - this.parseError = true; - } - this.input = res; - - this.state = stateOverride || "scheme start"; - - this.buffer = ""; - this.atFlag = false; - this.arrFlag = false; - this.passwordTokenSeenFlag = false; - - this.input = punycode.ucs2.decode(this.input); - - for (; this.pointer <= this.input.length; ++this.pointer) { - const c = this.input[this.pointer]; - const cStr = isNaN(c) ? undefined : String.fromCodePoint(c); - - // exec state machine - const ret = this["parse " + this.state](c, cStr); - if (!ret) { - break; // terminate algorithm - } else if (ret === failure) { - this.failure = true; - break; - } - } -} - -URLStateMachine.prototype["parse scheme start"] = function parseSchemeStart(c, cStr) { - if (isASCIIAlpha(c)) { - this.buffer += cStr.toLowerCase(); - this.state = "scheme"; - } else if (!this.stateOverride) { - this.state = "no scheme"; - --this.pointer; - } else { - this.parseError = true; - return failure; - } - - return true; -}; - -URLStateMachine.prototype["parse scheme"] = function parseScheme(c, cStr) { - if (isASCIIAlphanumeric(c) || c === 43 || c === 45 || c === 46) { - this.buffer += cStr.toLowerCase(); - } else if (c === 58) { - if (this.stateOverride) { - if (isSpecial(this.url) && !isSpecialScheme(this.buffer)) { - return false; - } - - if (!isSpecial(this.url) && isSpecialScheme(this.buffer)) { - return false; - } - - if ((includesCredentials(this.url) || this.url.port !== null) && this.buffer === "file") { - return false; - } - - if (this.url.scheme === "file" && (this.url.host === "" || this.url.host === null)) { - return false; - } - } - this.url.scheme = this.buffer; - this.buffer = ""; - if (this.stateOverride) { - return false; - } - if (this.url.scheme === "file") { - if (this.input[this.pointer + 1] !== 47 || this.input[this.pointer + 2] !== 47) { - this.parseError = true; - } - this.state = "file"; - } else if (isSpecial(this.url) && this.base !== null && this.base.scheme === this.url.scheme) { - this.state = "special relative or authority"; - } else if (isSpecial(this.url)) { - this.state = "special authority slashes"; - } else if (this.input[this.pointer + 1] === 47) { - this.state = "path or authority"; - ++this.pointer; - } else { - this.url.cannotBeABaseURL = true; - this.url.path.push(""); - this.state = "cannot-be-a-base-URL path"; - } - } else if (!this.stateOverride) { - this.buffer = ""; - this.state = "no scheme"; - this.pointer = -1; - } else { - this.parseError = true; - return failure; - } - - return true; -}; - -URLStateMachine.prototype["parse no scheme"] = function parseNoScheme(c) { - if (this.base === null || (this.base.cannotBeABaseURL && c !== 35)) { - return failure; - } else if (this.base.cannotBeABaseURL && c === 35) { - this.url.scheme = this.base.scheme; - this.url.path = this.base.path.slice(); - this.url.query = this.base.query; - this.url.fragment = ""; - this.url.cannotBeABaseURL = true; - this.state = "fragment"; - } else if (this.base.scheme === "file") { - this.state = "file"; - --this.pointer; - } else { - this.state = "relative"; - --this.pointer; - } - - return true; -}; - -URLStateMachine.prototype["parse special relative or authority"] = function parseSpecialRelativeOrAuthority(c) { - if (c === 47 && this.input[this.pointer + 1] === 47) { - this.state = "special authority ignore slashes"; - ++this.pointer; - } else { - this.parseError = true; - this.state = "relative"; - --this.pointer; - } - - return true; -}; - -URLStateMachine.prototype["parse path or authority"] = function parsePathOrAuthority(c) { - if (c === 47) { - this.state = "authority"; - } else { - this.state = "path"; - --this.pointer; - } - - return true; -}; - -URLStateMachine.prototype["parse relative"] = function parseRelative(c) { - this.url.scheme = this.base.scheme; - if (isNaN(c)) { - this.url.username = this.base.username; - this.url.password = this.base.password; - this.url.host = this.base.host; - this.url.port = this.base.port; - this.url.path = this.base.path.slice(); - this.url.query = this.base.query; - } else if (c === 47) { - this.state = "relative slash"; - } else if (c === 63) { - this.url.username = this.base.username; - this.url.password = this.base.password; - this.url.host = this.base.host; - this.url.port = this.base.port; - this.url.path = this.base.path.slice(); - this.url.query = ""; - this.state = "query"; - } else if (c === 35) { - this.url.username = this.base.username; - this.url.password = this.base.password; - this.url.host = this.base.host; - this.url.port = this.base.port; - this.url.path = this.base.path.slice(); - this.url.query = this.base.query; - this.url.fragment = ""; - this.state = "fragment"; - } else if (isSpecial(this.url) && c === 92) { - this.parseError = true; - this.state = "relative slash"; - } else { - this.url.username = this.base.username; - this.url.password = this.base.password; - this.url.host = this.base.host; - this.url.port = this.base.port; - this.url.path = this.base.path.slice(0, this.base.path.length - 1); - - this.state = "path"; - --this.pointer; - } - - return true; -}; - -URLStateMachine.prototype["parse relative slash"] = function parseRelativeSlash(c) { - if (isSpecial(this.url) && (c === 47 || c === 92)) { - if (c === 92) { - this.parseError = true; - } - this.state = "special authority ignore slashes"; - } else if (c === 47) { - this.state = "authority"; - } else { - this.url.username = this.base.username; - this.url.password = this.base.password; - this.url.host = this.base.host; - this.url.port = this.base.port; - this.state = "path"; - --this.pointer; - } - - return true; -}; - -URLStateMachine.prototype["parse special authority slashes"] = function parseSpecialAuthoritySlashes(c) { - if (c === 47 && this.input[this.pointer + 1] === 47) { - this.state = "special authority ignore slashes"; - ++this.pointer; - } else { - this.parseError = true; - this.state = "special authority ignore slashes"; - --this.pointer; - } - - return true; -}; - -URLStateMachine.prototype["parse special authority ignore slashes"] = function parseSpecialAuthorityIgnoreSlashes(c) { - if (c !== 47 && c !== 92) { - this.state = "authority"; - --this.pointer; - } else { - this.parseError = true; - } - - return true; -}; - -URLStateMachine.prototype["parse authority"] = function parseAuthority(c, cStr) { - if (c === 64) { - this.parseError = true; - if (this.atFlag) { - this.buffer = "%40" + this.buffer; - } - this.atFlag = true; - - // careful, this is based on buffer and has its own pointer (this.pointer != pointer) and inner chars - const len = countSymbols(this.buffer); - for (let pointer = 0; pointer < len; ++pointer) { - const codePoint = this.buffer.codePointAt(pointer); - - if (codePoint === 58 && !this.passwordTokenSeenFlag) { - this.passwordTokenSeenFlag = true; - continue; - } - const encodedCodePoints = percentEncodeChar(codePoint, isUserinfoPercentEncode); - if (this.passwordTokenSeenFlag) { - this.url.password += encodedCodePoints; - } else { - this.url.username += encodedCodePoints; - } - } - this.buffer = ""; - } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || - (isSpecial(this.url) && c === 92)) { - if (this.atFlag && this.buffer === "") { - this.parseError = true; - return failure; - } - this.pointer -= countSymbols(this.buffer) + 1; - this.buffer = ""; - this.state = "host"; - } else { - this.buffer += cStr; - } - - return true; -}; - -URLStateMachine.prototype["parse hostname"] = -URLStateMachine.prototype["parse host"] = function parseHostName(c, cStr) { - if (this.stateOverride && this.url.scheme === "file") { - --this.pointer; - this.state = "file host"; - } else if (c === 58 && !this.arrFlag) { - if (this.buffer === "") { - this.parseError = true; - return failure; - } - - const host = parseHost(this.buffer, isSpecial(this.url)); - if (host === failure) { - return failure; - } - - this.url.host = host; - this.buffer = ""; - this.state = "port"; - if (this.stateOverride === "hostname") { - return false; - } - } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || - (isSpecial(this.url) && c === 92)) { - --this.pointer; - if (isSpecial(this.url) && this.buffer === "") { - this.parseError = true; - return failure; - } else if (this.stateOverride && this.buffer === "" && - (includesCredentials(this.url) || this.url.port !== null)) { - this.parseError = true; - return false; - } - - const host = parseHost(this.buffer, isSpecial(this.url)); - if (host === failure) { - return failure; - } - - this.url.host = host; - this.buffer = ""; - this.state = "path start"; - if (this.stateOverride) { - return false; - } - } else { - if (c === 91) { - this.arrFlag = true; - } else if (c === 93) { - this.arrFlag = false; - } - this.buffer += cStr; - } - - return true; -}; - -URLStateMachine.prototype["parse port"] = function parsePort(c, cStr) { - if (isASCIIDigit(c)) { - this.buffer += cStr; - } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || - (isSpecial(this.url) && c === 92) || - this.stateOverride) { - if (this.buffer !== "") { - const port = parseInt(this.buffer); - if (port > Math.pow(2, 16) - 1) { - this.parseError = true; - return failure; - } - this.url.port = port === defaultPort(this.url.scheme) ? null : port; - this.buffer = ""; - } - if (this.stateOverride) { - return false; - } - this.state = "path start"; - --this.pointer; - } else { - this.parseError = true; - return failure; - } - - return true; -}; - -const fileOtherwiseCodePoints = new Set([47, 92, 63, 35]); - -URLStateMachine.prototype["parse file"] = function parseFile(c) { - this.url.scheme = "file"; - - if (c === 47 || c === 92) { - if (c === 92) { - this.parseError = true; - } - this.state = "file slash"; - } else if (this.base !== null && this.base.scheme === "file") { - if (isNaN(c)) { - this.url.host = this.base.host; - this.url.path = this.base.path.slice(); - this.url.query = this.base.query; - } else if (c === 63) { - this.url.host = this.base.host; - this.url.path = this.base.path.slice(); - this.url.query = ""; - this.state = "query"; - } else if (c === 35) { - this.url.host = this.base.host; - this.url.path = this.base.path.slice(); - this.url.query = this.base.query; - this.url.fragment = ""; - this.state = "fragment"; - } else { - if (this.input.length - this.pointer - 1 === 0 || // remaining consists of 0 code points - !isWindowsDriveLetterCodePoints(c, this.input[this.pointer + 1]) || - (this.input.length - this.pointer - 1 >= 2 && // remaining has at least 2 code points - !fileOtherwiseCodePoints.has(this.input[this.pointer + 2]))) { - this.url.host = this.base.host; - this.url.path = this.base.path.slice(); - shortenPath(this.url); - } else { - this.parseError = true; - } - - this.state = "path"; - --this.pointer; - } - } else { - this.state = "path"; - --this.pointer; - } - - return true; -}; - -URLStateMachine.prototype["parse file slash"] = function parseFileSlash(c) { - if (c === 47 || c === 92) { - if (c === 92) { - this.parseError = true; - } - this.state = "file host"; - } else { - if (this.base !== null && this.base.scheme === "file") { - if (isNormalizedWindowsDriveLetterString(this.base.path[0])) { - this.url.path.push(this.base.path[0]); - } else { - this.url.host = this.base.host; - } - } - this.state = "path"; - --this.pointer; - } - - return true; -}; - -URLStateMachine.prototype["parse file host"] = function parseFileHost(c, cStr) { - if (isNaN(c) || c === 47 || c === 92 || c === 63 || c === 35) { - --this.pointer; - if (!this.stateOverride && isWindowsDriveLetterString(this.buffer)) { - this.parseError = true; - this.state = "path"; - } else if (this.buffer === "") { - this.url.host = ""; - if (this.stateOverride) { - return false; - } - this.state = "path start"; - } else { - let host = parseHost(this.buffer, isSpecial(this.url)); - if (host === failure) { - return failure; - } - if (host === "localhost") { - host = ""; - } - this.url.host = host; - - if (this.stateOverride) { - return false; - } - - this.buffer = ""; - this.state = "path start"; - } - } else { - this.buffer += cStr; - } - - return true; -}; - -URLStateMachine.prototype["parse path start"] = function parsePathStart(c) { - if (isSpecial(this.url)) { - if (c === 92) { - this.parseError = true; - } - this.state = "path"; - - if (c !== 47 && c !== 92) { - --this.pointer; - } - } else if (!this.stateOverride && c === 63) { - this.url.query = ""; - this.state = "query"; - } else if (!this.stateOverride && c === 35) { - this.url.fragment = ""; - this.state = "fragment"; - } else if (c !== undefined) { - this.state = "path"; - if (c !== 47) { - --this.pointer; - } - } - - return true; -}; - -URLStateMachine.prototype["parse path"] = function parsePath(c) { - if (isNaN(c) || c === 47 || (isSpecial(this.url) && c === 92) || - (!this.stateOverride && (c === 63 || c === 35))) { - if (isSpecial(this.url) && c === 92) { - this.parseError = true; - } - - if (isDoubleDot(this.buffer)) { - shortenPath(this.url); - if (c !== 47 && !(isSpecial(this.url) && c === 92)) { - this.url.path.push(""); - } - } else if (isSingleDot(this.buffer) && c !== 47 && - !(isSpecial(this.url) && c === 92)) { - this.url.path.push(""); - } else if (!isSingleDot(this.buffer)) { - if (this.url.scheme === "file" && this.url.path.length === 0 && isWindowsDriveLetterString(this.buffer)) { - if (this.url.host !== "" && this.url.host !== null) { - this.parseError = true; - this.url.host = ""; - } - this.buffer = this.buffer[0] + ":"; - } - this.url.path.push(this.buffer); - } - this.buffer = ""; - if (this.url.scheme === "file" && (c === undefined || c === 63 || c === 35)) { - while (this.url.path.length > 1 && this.url.path[0] === "") { - this.parseError = true; - this.url.path.shift(); - } - } - if (c === 63) { - this.url.query = ""; - this.state = "query"; - } - if (c === 35) { - this.url.fragment = ""; - this.state = "fragment"; - } - } else { - // TODO: If c is not a URL code point and not "%", parse error. - - if (c === 37 && - (!isASCIIHex(this.input[this.pointer + 1]) || - !isASCIIHex(this.input[this.pointer + 2]))) { - this.parseError = true; - } - - this.buffer += percentEncodeChar(c, isPathPercentEncode); - } - - return true; -}; - -URLStateMachine.prototype["parse cannot-be-a-base-URL path"] = function parseCannotBeABaseURLPath(c) { - if (c === 63) { - this.url.query = ""; - this.state = "query"; - } else if (c === 35) { - this.url.fragment = ""; - this.state = "fragment"; - } else { - // TODO: Add: not a URL code point - if (!isNaN(c) && c !== 37) { - this.parseError = true; - } - - if (c === 37 && - (!isASCIIHex(this.input[this.pointer + 1]) || - !isASCIIHex(this.input[this.pointer + 2]))) { - this.parseError = true; - } - - if (!isNaN(c)) { - this.url.path[0] = this.url.path[0] + percentEncodeChar(c, isC0ControlPercentEncode); - } - } - - return true; -}; - -URLStateMachine.prototype["parse query"] = function parseQuery(c, cStr) { - if (isNaN(c) || (!this.stateOverride && c === 35)) { - if (!isSpecial(this.url) || this.url.scheme === "ws" || this.url.scheme === "wss") { - this.encodingOverride = "utf-8"; - } - - const buffer = new Buffer(this.buffer); // TODO: Use encoding override instead - for (let i = 0; i < buffer.length; ++i) { - if (buffer[i] < 0x21 || buffer[i] > 0x7E || buffer[i] === 0x22 || buffer[i] === 0x23 || - buffer[i] === 0x3C || buffer[i] === 0x3E) { - this.url.query += percentEncode(buffer[i]); - } else { - this.url.query += String.fromCodePoint(buffer[i]); - } - } - - this.buffer = ""; - if (c === 35) { - this.url.fragment = ""; - this.state = "fragment"; - } - } else { - // TODO: If c is not a URL code point and not "%", parse error. - if (c === 37 && - (!isASCIIHex(this.input[this.pointer + 1]) || - !isASCIIHex(this.input[this.pointer + 2]))) { - this.parseError = true; - } - - this.buffer += cStr; - } - - return true; -}; - -URLStateMachine.prototype["parse fragment"] = function parseFragment(c) { - if (isNaN(c)) { // do nothing - } else if (c === 0x0) { - this.parseError = true; - } else { - // TODO: If c is not a URL code point and not "%", parse error. - if (c === 37 && - (!isASCIIHex(this.input[this.pointer + 1]) || - !isASCIIHex(this.input[this.pointer + 2]))) { - this.parseError = true; - } - - this.url.fragment += percentEncodeChar(c, isC0ControlPercentEncode); - } - - return true; -}; - -function serializeURL(url, excludeFragment) { - let output = url.scheme + ":"; - if (url.host !== null) { - output += "//"; - - if (url.username !== "" || url.password !== "") { - output += url.username; - if (url.password !== "") { - output += ":" + url.password; - } - output += "@"; - } - - output += serializeHost(url.host); - - if (url.port !== null) { - output += ":" + url.port; - } - } else if (url.host === null && url.scheme === "file") { - output += "//"; - } - - if (url.cannotBeABaseURL) { - output += url.path[0]; - } else { - for (const string of url.path) { - output += "/" + string; - } - } - - if (url.query !== null) { - output += "?" + url.query; - } - - if (!excludeFragment && url.fragment !== null) { - output += "#" + url.fragment; - } - - return output; -} - -function serializeOrigin(tuple) { - let result = tuple.scheme + "://"; - result += serializeHost(tuple.host); - - if (tuple.port !== null) { - result += ":" + tuple.port; - } - - return result; -} - -module.exports.serializeURL = serializeURL; - -module.exports.serializeURLOrigin = function (url) { - // https://url.spec.whatwg.org/#concept-url-origin - switch (url.scheme) { - case "blob": - try { - return module.exports.serializeURLOrigin(module.exports.parseURL(url.path[0])); - } catch (e) { - // serializing an opaque origin returns "null" - return "null"; - } - case "ftp": - case "gopher": - case "http": - case "https": - case "ws": - case "wss": - return serializeOrigin({ - scheme: url.scheme, - host: url.host, - port: url.port - }); - case "file": - // spec says "exercise to the reader", chrome says "file://" - return "file://"; - default: - // serializing an opaque origin returns "null" - return "null"; - } -}; - -module.exports.basicURLParse = function (input, options) { - if (options === undefined) { - options = {}; - } - - const usm = new URLStateMachine(input, options.baseURL, options.encodingOverride, options.url, options.stateOverride); - if (usm.failure) { - return "failure"; - } - - return usm.url; -}; - -module.exports.setTheUsername = function (url, username) { - url.username = ""; - const decoded = punycode.ucs2.decode(username); - for (let i = 0; i < decoded.length; ++i) { - url.username += percentEncodeChar(decoded[i], isUserinfoPercentEncode); - } -}; - -module.exports.setThePassword = function (url, password) { - url.password = ""; - const decoded = punycode.ucs2.decode(password); - for (let i = 0; i < decoded.length; ++i) { - url.password += percentEncodeChar(decoded[i], isUserinfoPercentEncode); - } -}; - -module.exports.serializeHost = serializeHost; - -module.exports.cannotHaveAUsernamePasswordPort = cannotHaveAUsernamePasswordPort; - -module.exports.serializeInteger = function (integer) { - return String(integer); -}; - -module.exports.parseURL = function (input, options) { - if (options === undefined) { - options = {}; - } - - // We don't handle blobs, so this just delegates: - return module.exports.basicURLParse(input, { baseURL: options.baseURL, encodingOverride: options.encodingOverride }); -}; + +const punycode = __nccwpck_require__(5477); +const tr46 = __nccwpck_require__(2299); + +const specialSchemes = { + ftp: 21, + file: null, + gopher: 70, + http: 80, + https: 443, + ws: 80, + wss: 443 +}; + +const failure = Symbol("failure"); + +function countSymbols(str) { + return punycode.ucs2.decode(str).length; +} + +function at(input, idx) { + const c = input[idx]; + return isNaN(c) ? undefined : String.fromCodePoint(c); +} + +function isASCIIDigit(c) { + return c >= 0x30 && c <= 0x39; +} + +function isASCIIAlpha(c) { + return (c >= 0x41 && c <= 0x5A) || (c >= 0x61 && c <= 0x7A); +} + +function isASCIIAlphanumeric(c) { + return isASCIIAlpha(c) || isASCIIDigit(c); +} + +function isASCIIHex(c) { + return isASCIIDigit(c) || (c >= 0x41 && c <= 0x46) || (c >= 0x61 && c <= 0x66); +} + +function isSingleDot(buffer) { + return buffer === "." || buffer.toLowerCase() === "%2e"; +} + +function isDoubleDot(buffer) { + buffer = buffer.toLowerCase(); + return buffer === ".." || buffer === "%2e." || buffer === ".%2e" || buffer === "%2e%2e"; +} + +function isWindowsDriveLetterCodePoints(cp1, cp2) { + return isASCIIAlpha(cp1) && (cp2 === 58 || cp2 === 124); +} + +function isWindowsDriveLetterString(string) { + return string.length === 2 && isASCIIAlpha(string.codePointAt(0)) && (string[1] === ":" || string[1] === "|"); +} + +function isNormalizedWindowsDriveLetterString(string) { + return string.length === 2 && isASCIIAlpha(string.codePointAt(0)) && string[1] === ":"; +} + +function containsForbiddenHostCodePoint(string) { + return string.search(/\u0000|\u0009|\u000A|\u000D|\u0020|#|%|\/|:|\?|@|\[|\\|\]/) !== -1; +} + +function containsForbiddenHostCodePointExcludingPercent(string) { + return string.search(/\u0000|\u0009|\u000A|\u000D|\u0020|#|\/|:|\?|@|\[|\\|\]/) !== -1; +} + +function isSpecialScheme(scheme) { + return specialSchemes[scheme] !== undefined; +} + +function isSpecial(url) { + return isSpecialScheme(url.scheme); +} + +function defaultPort(scheme) { + return specialSchemes[scheme]; +} + +function percentEncode(c) { + let hex = c.toString(16).toUpperCase(); + if (hex.length === 1) { + hex = "0" + hex; + } + + return "%" + hex; +} + +function utf8PercentEncode(c) { + const buf = new Buffer(c); + + let str = ""; + + for (let i = 0; i < buf.length; ++i) { + str += percentEncode(buf[i]); + } + + return str; +} + +function utf8PercentDecode(str) { + const input = new Buffer(str); + const output = []; + for (let i = 0; i < input.length; ++i) { + if (input[i] !== 37) { + output.push(input[i]); + } else if (input[i] === 37 && isASCIIHex(input[i + 1]) && isASCIIHex(input[i + 2])) { + output.push(parseInt(input.slice(i + 1, i + 3).toString(), 16)); + i += 2; + } else { + output.push(input[i]); + } + } + return new Buffer(output).toString(); +} + +function isC0ControlPercentEncode(c) { + return c <= 0x1F || c > 0x7E; +} + +const extraPathPercentEncodeSet = new Set([32, 34, 35, 60, 62, 63, 96, 123, 125]); +function isPathPercentEncode(c) { + return isC0ControlPercentEncode(c) || extraPathPercentEncodeSet.has(c); +} + +const extraUserinfoPercentEncodeSet = + new Set([47, 58, 59, 61, 64, 91, 92, 93, 94, 124]); +function isUserinfoPercentEncode(c) { + return isPathPercentEncode(c) || extraUserinfoPercentEncodeSet.has(c); +} + +function percentEncodeChar(c, encodeSetPredicate) { + const cStr = String.fromCodePoint(c); + + if (encodeSetPredicate(c)) { + return utf8PercentEncode(cStr); + } + + return cStr; +} + +function parseIPv4Number(input) { + let R = 10; + + if (input.length >= 2 && input.charAt(0) === "0" && input.charAt(1).toLowerCase() === "x") { + input = input.substring(2); + R = 16; + } else if (input.length >= 2 && input.charAt(0) === "0") { + input = input.substring(1); + R = 8; + } + + if (input === "") { + return 0; + } + + const regex = R === 10 ? /[^0-9]/ : (R === 16 ? /[^0-9A-Fa-f]/ : /[^0-7]/); + if (regex.test(input)) { + return failure; + } + + return parseInt(input, R); +} + +function parseIPv4(input) { + const parts = input.split("."); + if (parts[parts.length - 1] === "") { + if (parts.length > 1) { + parts.pop(); + } + } + + if (parts.length > 4) { + return input; + } + + const numbers = []; + for (const part of parts) { + if (part === "") { + return input; + } + const n = parseIPv4Number(part); + if (n === failure) { + return input; + } + + numbers.push(n); + } + + for (let i = 0; i < numbers.length - 1; ++i) { + if (numbers[i] > 255) { + return failure; + } + } + if (numbers[numbers.length - 1] >= Math.pow(256, 5 - numbers.length)) { + return failure; + } + + let ipv4 = numbers.pop(); + let counter = 0; + + for (const n of numbers) { + ipv4 += n * Math.pow(256, 3 - counter); + ++counter; + } + + return ipv4; +} + +function serializeIPv4(address) { + let output = ""; + let n = address; + + for (let i = 1; i <= 4; ++i) { + output = String(n % 256) + output; + if (i !== 4) { + output = "." + output; + } + n = Math.floor(n / 256); + } + + return output; +} + +function parseIPv6(input) { + const address = [0, 0, 0, 0, 0, 0, 0, 0]; + let pieceIndex = 0; + let compress = null; + let pointer = 0; + + input = punycode.ucs2.decode(input); + + if (input[pointer] === 58) { + if (input[pointer + 1] !== 58) { + return failure; + } + + pointer += 2; + ++pieceIndex; + compress = pieceIndex; + } + + while (pointer < input.length) { + if (pieceIndex === 8) { + return failure; + } + + if (input[pointer] === 58) { + if (compress !== null) { + return failure; + } + ++pointer; + ++pieceIndex; + compress = pieceIndex; + continue; + } + + let value = 0; + let length = 0; + + while (length < 4 && isASCIIHex(input[pointer])) { + value = value * 0x10 + parseInt(at(input, pointer), 16); + ++pointer; + ++length; + } + + if (input[pointer] === 46) { + if (length === 0) { + return failure; + } + + pointer -= length; + + if (pieceIndex > 6) { + return failure; + } + + let numbersSeen = 0; + + while (input[pointer] !== undefined) { + let ipv4Piece = null; + + if (numbersSeen > 0) { + if (input[pointer] === 46 && numbersSeen < 4) { + ++pointer; + } else { + return failure; + } + } + + if (!isASCIIDigit(input[pointer])) { + return failure; + } + + while (isASCIIDigit(input[pointer])) { + const number = parseInt(at(input, pointer)); + if (ipv4Piece === null) { + ipv4Piece = number; + } else if (ipv4Piece === 0) { + return failure; + } else { + ipv4Piece = ipv4Piece * 10 + number; + } + if (ipv4Piece > 255) { + return failure; + } + ++pointer; + } + + address[pieceIndex] = address[pieceIndex] * 0x100 + ipv4Piece; + + ++numbersSeen; + + if (numbersSeen === 2 || numbersSeen === 4) { + ++pieceIndex; + } + } + + if (numbersSeen !== 4) { + return failure; + } + + break; + } else if (input[pointer] === 58) { + ++pointer; + if (input[pointer] === undefined) { + return failure; + } + } else if (input[pointer] !== undefined) { + return failure; + } + + address[pieceIndex] = value; + ++pieceIndex; + } + + if (compress !== null) { + let swaps = pieceIndex - compress; + pieceIndex = 7; + while (pieceIndex !== 0 && swaps > 0) { + const temp = address[compress + swaps - 1]; + address[compress + swaps - 1] = address[pieceIndex]; + address[pieceIndex] = temp; + --pieceIndex; + --swaps; + } + } else if (compress === null && pieceIndex !== 8) { + return failure; + } + + return address; +} + +function serializeIPv6(address) { + let output = ""; + const seqResult = findLongestZeroSequence(address); + const compress = seqResult.idx; + let ignore0 = false; + + for (let pieceIndex = 0; pieceIndex <= 7; ++pieceIndex) { + if (ignore0 && address[pieceIndex] === 0) { + continue; + } else if (ignore0) { + ignore0 = false; + } + + if (compress === pieceIndex) { + const separator = pieceIndex === 0 ? "::" : ":"; + output += separator; + ignore0 = true; + continue; + } + + output += address[pieceIndex].toString(16); + + if (pieceIndex !== 7) { + output += ":"; + } + } + + return output; +} + +function parseHost(input, isSpecialArg) { + if (input[0] === "[") { + if (input[input.length - 1] !== "]") { + return failure; + } + + return parseIPv6(input.substring(1, input.length - 1)); + } + + if (!isSpecialArg) { + return parseOpaqueHost(input); + } + + const domain = utf8PercentDecode(input); + const asciiDomain = tr46.toASCII(domain, false, tr46.PROCESSING_OPTIONS.NONTRANSITIONAL, false); + if (asciiDomain === null) { + return failure; + } + + if (containsForbiddenHostCodePoint(asciiDomain)) { + return failure; + } + + const ipv4Host = parseIPv4(asciiDomain); + if (typeof ipv4Host === "number" || ipv4Host === failure) { + return ipv4Host; + } + + return asciiDomain; +} + +function parseOpaqueHost(input) { + if (containsForbiddenHostCodePointExcludingPercent(input)) { + return failure; + } + + let output = ""; + const decoded = punycode.ucs2.decode(input); + for (let i = 0; i < decoded.length; ++i) { + output += percentEncodeChar(decoded[i], isC0ControlPercentEncode); + } + return output; +} + +function findLongestZeroSequence(arr) { + let maxIdx = null; + let maxLen = 1; // only find elements > 1 + let currStart = null; + let currLen = 0; + + for (let i = 0; i < arr.length; ++i) { + if (arr[i] !== 0) { + if (currLen > maxLen) { + maxIdx = currStart; + maxLen = currLen; + } + + currStart = null; + currLen = 0; + } else { + if (currStart === null) { + currStart = i; + } + ++currLen; + } + } + + // if trailing zeros + if (currLen > maxLen) { + maxIdx = currStart; + maxLen = currLen; + } + + return { + idx: maxIdx, + len: maxLen + }; +} + +function serializeHost(host) { + if (typeof host === "number") { + return serializeIPv4(host); + } + + // IPv6 serializer + if (host instanceof Array) { + return "[" + serializeIPv6(host) + "]"; + } + + return host; +} + +function trimControlChars(url) { + return url.replace(/^[\u0000-\u001F\u0020]+|[\u0000-\u001F\u0020]+$/g, ""); +} + +function trimTabAndNewline(url) { + return url.replace(/\u0009|\u000A|\u000D/g, ""); +} + +function shortenPath(url) { + const path = url.path; + if (path.length === 0) { + return; + } + if (url.scheme === "file" && path.length === 1 && isNormalizedWindowsDriveLetter(path[0])) { + return; + } + + path.pop(); +} + +function includesCredentials(url) { + return url.username !== "" || url.password !== ""; +} + +function cannotHaveAUsernamePasswordPort(url) { + return url.host === null || url.host === "" || url.cannotBeABaseURL || url.scheme === "file"; +} + +function isNormalizedWindowsDriveLetter(string) { + return /^[A-Za-z]:$/.test(string); +} + +function URLStateMachine(input, base, encodingOverride, url, stateOverride) { + this.pointer = 0; + this.input = input; + this.base = base || null; + this.encodingOverride = encodingOverride || "utf-8"; + this.stateOverride = stateOverride; + this.url = url; + this.failure = false; + this.parseError = false; + + if (!this.url) { + this.url = { + scheme: "", + username: "", + password: "", + host: null, + port: null, + path: [], + query: null, + fragment: null, + + cannotBeABaseURL: false + }; + + const res = trimControlChars(this.input); + if (res !== this.input) { + this.parseError = true; + } + this.input = res; + } + + const res = trimTabAndNewline(this.input); + if (res !== this.input) { + this.parseError = true; + } + this.input = res; + + this.state = stateOverride || "scheme start"; + + this.buffer = ""; + this.atFlag = false; + this.arrFlag = false; + this.passwordTokenSeenFlag = false; + + this.input = punycode.ucs2.decode(this.input); + + for (; this.pointer <= this.input.length; ++this.pointer) { + const c = this.input[this.pointer]; + const cStr = isNaN(c) ? undefined : String.fromCodePoint(c); + + // exec state machine + const ret = this["parse " + this.state](c, cStr); + if (!ret) { + break; // terminate algorithm + } else if (ret === failure) { + this.failure = true; + break; + } + } +} + +URLStateMachine.prototype["parse scheme start"] = function parseSchemeStart(c, cStr) { + if (isASCIIAlpha(c)) { + this.buffer += cStr.toLowerCase(); + this.state = "scheme"; + } else if (!this.stateOverride) { + this.state = "no scheme"; + --this.pointer; + } else { + this.parseError = true; + return failure; + } + + return true; +}; + +URLStateMachine.prototype["parse scheme"] = function parseScheme(c, cStr) { + if (isASCIIAlphanumeric(c) || c === 43 || c === 45 || c === 46) { + this.buffer += cStr.toLowerCase(); + } else if (c === 58) { + if (this.stateOverride) { + if (isSpecial(this.url) && !isSpecialScheme(this.buffer)) { + return false; + } + + if (!isSpecial(this.url) && isSpecialScheme(this.buffer)) { + return false; + } + + if ((includesCredentials(this.url) || this.url.port !== null) && this.buffer === "file") { + return false; + } + + if (this.url.scheme === "file" && (this.url.host === "" || this.url.host === null)) { + return false; + } + } + this.url.scheme = this.buffer; + this.buffer = ""; + if (this.stateOverride) { + return false; + } + if (this.url.scheme === "file") { + if (this.input[this.pointer + 1] !== 47 || this.input[this.pointer + 2] !== 47) { + this.parseError = true; + } + this.state = "file"; + } else if (isSpecial(this.url) && this.base !== null && this.base.scheme === this.url.scheme) { + this.state = "special relative or authority"; + } else if (isSpecial(this.url)) { + this.state = "special authority slashes"; + } else if (this.input[this.pointer + 1] === 47) { + this.state = "path or authority"; + ++this.pointer; + } else { + this.url.cannotBeABaseURL = true; + this.url.path.push(""); + this.state = "cannot-be-a-base-URL path"; + } + } else if (!this.stateOverride) { + this.buffer = ""; + this.state = "no scheme"; + this.pointer = -1; + } else { + this.parseError = true; + return failure; + } + + return true; +}; + +URLStateMachine.prototype["parse no scheme"] = function parseNoScheme(c) { + if (this.base === null || (this.base.cannotBeABaseURL && c !== 35)) { + return failure; + } else if (this.base.cannotBeABaseURL && c === 35) { + this.url.scheme = this.base.scheme; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + this.url.fragment = ""; + this.url.cannotBeABaseURL = true; + this.state = "fragment"; + } else if (this.base.scheme === "file") { + this.state = "file"; + --this.pointer; + } else { + this.state = "relative"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse special relative or authority"] = function parseSpecialRelativeOrAuthority(c) { + if (c === 47 && this.input[this.pointer + 1] === 47) { + this.state = "special authority ignore slashes"; + ++this.pointer; + } else { + this.parseError = true; + this.state = "relative"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse path or authority"] = function parsePathOrAuthority(c) { + if (c === 47) { + this.state = "authority"; + } else { + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse relative"] = function parseRelative(c) { + this.url.scheme = this.base.scheme; + if (isNaN(c)) { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + } else if (c === 47) { + this.state = "relative slash"; + } else if (c === 63) { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.url.path = this.base.path.slice(); + this.url.query = ""; + this.state = "query"; + } else if (c === 35) { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + this.url.fragment = ""; + this.state = "fragment"; + } else if (isSpecial(this.url) && c === 92) { + this.parseError = true; + this.state = "relative slash"; + } else { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.url.path = this.base.path.slice(0, this.base.path.length - 1); + + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse relative slash"] = function parseRelativeSlash(c) { + if (isSpecial(this.url) && (c === 47 || c === 92)) { + if (c === 92) { + this.parseError = true; + } + this.state = "special authority ignore slashes"; + } else if (c === 47) { + this.state = "authority"; + } else { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse special authority slashes"] = function parseSpecialAuthoritySlashes(c) { + if (c === 47 && this.input[this.pointer + 1] === 47) { + this.state = "special authority ignore slashes"; + ++this.pointer; + } else { + this.parseError = true; + this.state = "special authority ignore slashes"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse special authority ignore slashes"] = function parseSpecialAuthorityIgnoreSlashes(c) { + if (c !== 47 && c !== 92) { + this.state = "authority"; + --this.pointer; + } else { + this.parseError = true; + } + + return true; +}; + +URLStateMachine.prototype["parse authority"] = function parseAuthority(c, cStr) { + if (c === 64) { + this.parseError = true; + if (this.atFlag) { + this.buffer = "%40" + this.buffer; + } + this.atFlag = true; + + // careful, this is based on buffer and has its own pointer (this.pointer != pointer) and inner chars + const len = countSymbols(this.buffer); + for (let pointer = 0; pointer < len; ++pointer) { + const codePoint = this.buffer.codePointAt(pointer); + + if (codePoint === 58 && !this.passwordTokenSeenFlag) { + this.passwordTokenSeenFlag = true; + continue; + } + const encodedCodePoints = percentEncodeChar(codePoint, isUserinfoPercentEncode); + if (this.passwordTokenSeenFlag) { + this.url.password += encodedCodePoints; + } else { + this.url.username += encodedCodePoints; + } + } + this.buffer = ""; + } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || + (isSpecial(this.url) && c === 92)) { + if (this.atFlag && this.buffer === "") { + this.parseError = true; + return failure; + } + this.pointer -= countSymbols(this.buffer) + 1; + this.buffer = ""; + this.state = "host"; + } else { + this.buffer += cStr; + } + + return true; +}; + +URLStateMachine.prototype["parse hostname"] = +URLStateMachine.prototype["parse host"] = function parseHostName(c, cStr) { + if (this.stateOverride && this.url.scheme === "file") { + --this.pointer; + this.state = "file host"; + } else if (c === 58 && !this.arrFlag) { + if (this.buffer === "") { + this.parseError = true; + return failure; + } + + const host = parseHost(this.buffer, isSpecial(this.url)); + if (host === failure) { + return failure; + } + + this.url.host = host; + this.buffer = ""; + this.state = "port"; + if (this.stateOverride === "hostname") { + return false; + } + } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || + (isSpecial(this.url) && c === 92)) { + --this.pointer; + if (isSpecial(this.url) && this.buffer === "") { + this.parseError = true; + return failure; + } else if (this.stateOverride && this.buffer === "" && + (includesCredentials(this.url) || this.url.port !== null)) { + this.parseError = true; + return false; + } + + const host = parseHost(this.buffer, isSpecial(this.url)); + if (host === failure) { + return failure; + } + + this.url.host = host; + this.buffer = ""; + this.state = "path start"; + if (this.stateOverride) { + return false; + } + } else { + if (c === 91) { + this.arrFlag = true; + } else if (c === 93) { + this.arrFlag = false; + } + this.buffer += cStr; + } + + return true; +}; + +URLStateMachine.prototype["parse port"] = function parsePort(c, cStr) { + if (isASCIIDigit(c)) { + this.buffer += cStr; + } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || + (isSpecial(this.url) && c === 92) || + this.stateOverride) { + if (this.buffer !== "") { + const port = parseInt(this.buffer); + if (port > Math.pow(2, 16) - 1) { + this.parseError = true; + return failure; + } + this.url.port = port === defaultPort(this.url.scheme) ? null : port; + this.buffer = ""; + } + if (this.stateOverride) { + return false; + } + this.state = "path start"; + --this.pointer; + } else { + this.parseError = true; + return failure; + } + + return true; +}; + +const fileOtherwiseCodePoints = new Set([47, 92, 63, 35]); + +URLStateMachine.prototype["parse file"] = function parseFile(c) { + this.url.scheme = "file"; + + if (c === 47 || c === 92) { + if (c === 92) { + this.parseError = true; + } + this.state = "file slash"; + } else if (this.base !== null && this.base.scheme === "file") { + if (isNaN(c)) { + this.url.host = this.base.host; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + } else if (c === 63) { + this.url.host = this.base.host; + this.url.path = this.base.path.slice(); + this.url.query = ""; + this.state = "query"; + } else if (c === 35) { + this.url.host = this.base.host; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + this.url.fragment = ""; + this.state = "fragment"; + } else { + if (this.input.length - this.pointer - 1 === 0 || // remaining consists of 0 code points + !isWindowsDriveLetterCodePoints(c, this.input[this.pointer + 1]) || + (this.input.length - this.pointer - 1 >= 2 && // remaining has at least 2 code points + !fileOtherwiseCodePoints.has(this.input[this.pointer + 2]))) { + this.url.host = this.base.host; + this.url.path = this.base.path.slice(); + shortenPath(this.url); + } else { + this.parseError = true; + } + + this.state = "path"; + --this.pointer; + } + } else { + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse file slash"] = function parseFileSlash(c) { + if (c === 47 || c === 92) { + if (c === 92) { + this.parseError = true; + } + this.state = "file host"; + } else { + if (this.base !== null && this.base.scheme === "file") { + if (isNormalizedWindowsDriveLetterString(this.base.path[0])) { + this.url.path.push(this.base.path[0]); + } else { + this.url.host = this.base.host; + } + } + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse file host"] = function parseFileHost(c, cStr) { + if (isNaN(c) || c === 47 || c === 92 || c === 63 || c === 35) { + --this.pointer; + if (!this.stateOverride && isWindowsDriveLetterString(this.buffer)) { + this.parseError = true; + this.state = "path"; + } else if (this.buffer === "") { + this.url.host = ""; + if (this.stateOverride) { + return false; + } + this.state = "path start"; + } else { + let host = parseHost(this.buffer, isSpecial(this.url)); + if (host === failure) { + return failure; + } + if (host === "localhost") { + host = ""; + } + this.url.host = host; + + if (this.stateOverride) { + return false; + } + + this.buffer = ""; + this.state = "path start"; + } + } else { + this.buffer += cStr; + } + + return true; +}; + +URLStateMachine.prototype["parse path start"] = function parsePathStart(c) { + if (isSpecial(this.url)) { + if (c === 92) { + this.parseError = true; + } + this.state = "path"; + + if (c !== 47 && c !== 92) { + --this.pointer; + } + } else if (!this.stateOverride && c === 63) { + this.url.query = ""; + this.state = "query"; + } else if (!this.stateOverride && c === 35) { + this.url.fragment = ""; + this.state = "fragment"; + } else if (c !== undefined) { + this.state = "path"; + if (c !== 47) { + --this.pointer; + } + } + + return true; +}; + +URLStateMachine.prototype["parse path"] = function parsePath(c) { + if (isNaN(c) || c === 47 || (isSpecial(this.url) && c === 92) || + (!this.stateOverride && (c === 63 || c === 35))) { + if (isSpecial(this.url) && c === 92) { + this.parseError = true; + } + + if (isDoubleDot(this.buffer)) { + shortenPath(this.url); + if (c !== 47 && !(isSpecial(this.url) && c === 92)) { + this.url.path.push(""); + } + } else if (isSingleDot(this.buffer) && c !== 47 && + !(isSpecial(this.url) && c === 92)) { + this.url.path.push(""); + } else if (!isSingleDot(this.buffer)) { + if (this.url.scheme === "file" && this.url.path.length === 0 && isWindowsDriveLetterString(this.buffer)) { + if (this.url.host !== "" && this.url.host !== null) { + this.parseError = true; + this.url.host = ""; + } + this.buffer = this.buffer[0] + ":"; + } + this.url.path.push(this.buffer); + } + this.buffer = ""; + if (this.url.scheme === "file" && (c === undefined || c === 63 || c === 35)) { + while (this.url.path.length > 1 && this.url.path[0] === "") { + this.parseError = true; + this.url.path.shift(); + } + } + if (c === 63) { + this.url.query = ""; + this.state = "query"; + } + if (c === 35) { + this.url.fragment = ""; + this.state = "fragment"; + } + } else { + // TODO: If c is not a URL code point and not "%", parse error. + + if (c === 37 && + (!isASCIIHex(this.input[this.pointer + 1]) || + !isASCIIHex(this.input[this.pointer + 2]))) { + this.parseError = true; + } + + this.buffer += percentEncodeChar(c, isPathPercentEncode); + } + + return true; +}; + +URLStateMachine.prototype["parse cannot-be-a-base-URL path"] = function parseCannotBeABaseURLPath(c) { + if (c === 63) { + this.url.query = ""; + this.state = "query"; + } else if (c === 35) { + this.url.fragment = ""; + this.state = "fragment"; + } else { + // TODO: Add: not a URL code point + if (!isNaN(c) && c !== 37) { + this.parseError = true; + } + + if (c === 37 && + (!isASCIIHex(this.input[this.pointer + 1]) || + !isASCIIHex(this.input[this.pointer + 2]))) { + this.parseError = true; + } + + if (!isNaN(c)) { + this.url.path[0] = this.url.path[0] + percentEncodeChar(c, isC0ControlPercentEncode); + } + } + + return true; +}; + +URLStateMachine.prototype["parse query"] = function parseQuery(c, cStr) { + if (isNaN(c) || (!this.stateOverride && c === 35)) { + if (!isSpecial(this.url) || this.url.scheme === "ws" || this.url.scheme === "wss") { + this.encodingOverride = "utf-8"; + } + + const buffer = new Buffer(this.buffer); // TODO: Use encoding override instead + for (let i = 0; i < buffer.length; ++i) { + if (buffer[i] < 0x21 || buffer[i] > 0x7E || buffer[i] === 0x22 || buffer[i] === 0x23 || + buffer[i] === 0x3C || buffer[i] === 0x3E) { + this.url.query += percentEncode(buffer[i]); + } else { + this.url.query += String.fromCodePoint(buffer[i]); + } + } + + this.buffer = ""; + if (c === 35) { + this.url.fragment = ""; + this.state = "fragment"; + } + } else { + // TODO: If c is not a URL code point and not "%", parse error. + if (c === 37 && + (!isASCIIHex(this.input[this.pointer + 1]) || + !isASCIIHex(this.input[this.pointer + 2]))) { + this.parseError = true; + } + + this.buffer += cStr; + } + + return true; +}; + +URLStateMachine.prototype["parse fragment"] = function parseFragment(c) { + if (isNaN(c)) { // do nothing + } else if (c === 0x0) { + this.parseError = true; + } else { + // TODO: If c is not a URL code point and not "%", parse error. + if (c === 37 && + (!isASCIIHex(this.input[this.pointer + 1]) || + !isASCIIHex(this.input[this.pointer + 2]))) { + this.parseError = true; + } + + this.url.fragment += percentEncodeChar(c, isC0ControlPercentEncode); + } + + return true; +}; + +function serializeURL(url, excludeFragment) { + let output = url.scheme + ":"; + if (url.host !== null) { + output += "//"; + + if (url.username !== "" || url.password !== "") { + output += url.username; + if (url.password !== "") { + output += ":" + url.password; + } + output += "@"; + } + + output += serializeHost(url.host); + + if (url.port !== null) { + output += ":" + url.port; + } + } else if (url.host === null && url.scheme === "file") { + output += "//"; + } + + if (url.cannotBeABaseURL) { + output += url.path[0]; + } else { + for (const string of url.path) { + output += "/" + string; + } + } + + if (url.query !== null) { + output += "?" + url.query; + } + + if (!excludeFragment && url.fragment !== null) { + output += "#" + url.fragment; + } + + return output; +} + +function serializeOrigin(tuple) { + let result = tuple.scheme + "://"; + result += serializeHost(tuple.host); + + if (tuple.port !== null) { + result += ":" + tuple.port; + } + + return result; +} + +module.exports.serializeURL = serializeURL; + +module.exports.serializeURLOrigin = function (url) { + // https://url.spec.whatwg.org/#concept-url-origin + switch (url.scheme) { + case "blob": + try { + return module.exports.serializeURLOrigin(module.exports.parseURL(url.path[0])); + } catch (e) { + // serializing an opaque origin returns "null" + return "null"; + } + case "ftp": + case "gopher": + case "http": + case "https": + case "ws": + case "wss": + return serializeOrigin({ + scheme: url.scheme, + host: url.host, + port: url.port + }); + case "file": + // spec says "exercise to the reader", chrome says "file://" + return "file://"; + default: + // serializing an opaque origin returns "null" + return "null"; + } +}; + +module.exports.basicURLParse = function (input, options) { + if (options === undefined) { + options = {}; + } + + const usm = new URLStateMachine(input, options.baseURL, options.encodingOverride, options.url, options.stateOverride); + if (usm.failure) { + return "failure"; + } + + return usm.url; +}; + +module.exports.setTheUsername = function (url, username) { + url.username = ""; + const decoded = punycode.ucs2.decode(username); + for (let i = 0; i < decoded.length; ++i) { + url.username += percentEncodeChar(decoded[i], isUserinfoPercentEncode); + } +}; + +module.exports.setThePassword = function (url, password) { + url.password = ""; + const decoded = punycode.ucs2.decode(password); + for (let i = 0; i < decoded.length; ++i) { + url.password += percentEncodeChar(decoded[i], isUserinfoPercentEncode); + } +}; + +module.exports.serializeHost = serializeHost; + +module.exports.cannotHaveAUsernamePasswordPort = cannotHaveAUsernamePasswordPort; + +module.exports.serializeInteger = function (integer) { + return String(integer); +}; + +module.exports.parseURL = function (input, options) { + if (options === undefined) { + options = {}; + } + + // We don't handle blobs, so this just delegates: + return module.exports.basicURLParse(input, { baseURL: options.baseURL, encodingOverride: options.encodingOverride }); +}; /***/ }), From 133149a92ee6a0add5ddaf90fde001378626eed3 Mon Sep 17 00:00:00 2001 From: Nikhil Dewoolkar Date: Mon, 12 Feb 2024 22:03:47 +0530 Subject: [PATCH 146/288] Update MentionUserRenderer.tsx --- .../HTMLEngineProvider/HTMLRenderers/MentionUserRenderer.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/HTMLEngineProvider/HTMLRenderers/MentionUserRenderer.tsx b/src/components/HTMLEngineProvider/HTMLRenderers/MentionUserRenderer.tsx index ad9cfb4e6384..890835072852 100644 --- a/src/components/HTMLEngineProvider/HTMLRenderers/MentionUserRenderer.tsx +++ b/src/components/HTMLEngineProvider/HTMLRenderers/MentionUserRenderer.tsx @@ -43,7 +43,7 @@ function MentionUserRenderer({style, tnode, TDefaultRenderer, currentUserPersona navigationRoute = ROUTES.PROFILE.getRoute(htmlAttribAccountID); } else if ('data' in tnode && !isEmptyObject(tnode.data)) { // We need to remove the LTR unicode and leading @ from data as it is not part of the login - displayNameOrLogin = tnode.data.replace(CONST.UNICODE.LTR, '').slice(1); + displayNameOrLogin = tnode.data.replace(CONST.UNICODE.LTR, '').slice(1).toLowerCase(); accountID = PersonalDetailsUtils.getAccountIDsByLogins([displayNameOrLogin])?.[0]; navigationRoute = ROUTES.DETAILS.getRoute(displayNameOrLogin); From a55034ef121a337b3cbc9908304b4e159e86d139 Mon Sep 17 00:00:00 2001 From: Jakub Butkiewicz Date: Mon, 12 Feb 2024 17:35:12 +0100 Subject: [PATCH 147/288] ref: move launchApp test to TS --- tests/e2e/testRunner.js | 5 ++++- tests/e2e/utils/{launchApp.js => launchApp.ts} | 9 ++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) rename tests/e2e/utils/{launchApp.js => launchApp.ts} (63%) diff --git a/tests/e2e/testRunner.js b/tests/e2e/testRunner.js index 63c88d207581..fbd2261d6bbd 100644 --- a/tests/e2e/testRunner.js +++ b/tests/e2e/testRunner.js @@ -1,3 +1,6 @@ +// const launchApp = require('./utils/launchApp'); +import launchApp from './utils/launchApp'; + /** * Multifaceted script, its main function is running the e2e tests. * @@ -20,7 +23,7 @@ const defaultConfig = require('./config'); const Logger = require('./utils/logger'); const execAsync = require('./utils/execAsync'); const killApp = require('./utils/killApp'); -const launchApp = require('./utils/launchApp'); + const createServerInstance = require('./server'); const installApp = require('./utils/installApp'); const withFailTimeout = require('./utils/withFailTimeout'); diff --git a/tests/e2e/utils/launchApp.js b/tests/e2e/utils/launchApp.ts similarity index 63% rename from tests/e2e/utils/launchApp.js rename to tests/e2e/utils/launchApp.ts index f63e2e71cd8b..863462e13eaf 100644 --- a/tests/e2e/utils/launchApp.js +++ b/tests/e2e/utils/launchApp.ts @@ -1,15 +1,18 @@ /* eslint-disable rulesdir/prefer-underscore-method */ -const {APP_PACKAGE, ACTIVITY_PATH} = require('../config'); -const execAsync = require('./execAsync'); +import {ACTIVITY_PATH, MAIN_APP_PACKAGE} from '../config'; +import execAsync from './execAsync'; -module.exports = function (platform = 'android', packageName = APP_PACKAGE, activityPath = ACTIVITY_PATH, launchArgs = {}) { +const launchApp = (platform = 'android', packageName = MAIN_APP_PACKAGE, activityPath = ACTIVITY_PATH, launchArgs = {}) => { if (platform !== 'android') { throw new Error(`launchApp() missing implementation for platform: ${platform}`); } // Use adb to start the app const launchArgsString = Object.keys(launchArgs) + // @ts-expect-error - yes .map((key) => `${typeof launchArgs[key] === 'boolean' ? '--ez' : '--es'} ${key} ${launchArgs[key]}`) .join(' '); return execAsync(`adb shell am start -n ${packageName}/${activityPath} ${launchArgsString}`); }; + +export default launchApp; From fbfc712198929c6872641108845f98d274facbf9 Mon Sep 17 00:00:00 2001 From: Sheena Trepanier Date: Mon, 12 Feb 2024 14:18:42 -0800 Subject: [PATCH 148/288] Update Troubleshooting.md Per https://github.com/Expensify/Expensify/issues/357408 We need to make some minor copy updates to satisfy Bancorp requirements for the new card program. --- .../company-cards/Troubleshooting.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/articles/expensify-classic/bank-accounts-and-credit-cards/company-cards/Troubleshooting.md b/docs/articles/expensify-classic/bank-accounts-and-credit-cards/company-cards/Troubleshooting.md index 01d94b219801..15e27a202b2f 100644 --- a/docs/articles/expensify-classic/bank-accounts-and-credit-cards/company-cards/Troubleshooting.md +++ b/docs/articles/expensify-classic/bank-accounts-and-credit-cards/company-cards/Troubleshooting.md @@ -49,16 +49,16 @@ The card will only appear in the drop-down list for assignment once it’s activ # Troubleshooting issues assigning company cards ## Why do bank connections break? -Banks often make changes to safeguard your confidential information, and when they do, we need to update the connection between Expensify and the bank. We have a team of engineers that works closely with banks to monitor this and update our software accordingly when this happens. +Banks often make changes to safeguard your confidential information, and when they do, we need to update the connection between Expensify and the bank. We have a team of engineers who work closely with banks to monitor this and update our software accordingly when this happens. The first step is to check if there have been any changes to your bank information. Have you recently changed your banking password without updating it in Expensify? Has your banking username or card number been updated? Did you update your security questions for your bank? -If you've answered "yes" to any of these questions, a Domain Admins need to update this information in Expensify and manually reestablish the connection by heading to *Settings* > *Domains* > _Domain Name_ > *Company Cards* > *Fix*. The Domain Admin will be prompted to enter the new credentials/updated information and this should reestablish the connection. +If you've answered "yes" to any of these questions, a Domain Admins need to update this information in Expensify and manually re-establish the connection by heading to *Settings* > *Domains* > _Domain Name_ > *Company Cards* > *Fix*. The Domain Admin will be prompted to enter the new credentials/updated information and this should reestablish the connection. ## How do I resolve errors while I’m trying to import my card?* Make sure you're importing your card in the correct spot in Expensify and selecting the right bank connection. For company cards, use the master administrative credentials to import your set of cards at *Settings* > *Domains* > _Domain Name_ > *Company Cards* > *Import Card*. Please note there are some things that cannot be bypassed within Expensify, including two-factor authentication being enabled within your bank account. This will prevent the connection from remaining stable and will need to be turned off on the bank side. ## What are the most reliable bank connections in Expensify?* -The most reliable corporate card to use with Expensify is the Expensify Card. We offer daily settlement, unapproved expense limits, and real-time compliance for secure and efficient spending, as well as 2% cash back. Click here to learn more or apply. +The most reliable corporate card to use with Expensify is the Expensify Visa® Commercial Card. We offer daily settlement, unapproved expense limits, and real-time compliance for secure and efficient spending, as well as 2% cash back. Click here to learn more or apply. Additionally, we've teamed up with major banks worldwide to ensure a smooth import of credit card transactions into your accounts. Corporate cards from the following banks also offer the most dependable connections in Expensify: - American Express - Bank of America From c049078806871a81b04d925b479246e2ee097ca1 Mon Sep 17 00:00:00 2001 From: Sheena Trepanier Date: Mon, 12 Feb 2024 15:27:41 -0800 Subject: [PATCH 149/288] Update Troubleshooting.md Missed an update to cash back, just added it. --- .../company-cards/Troubleshooting.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/articles/expensify-classic/bank-accounts-and-credit-cards/company-cards/Troubleshooting.md b/docs/articles/expensify-classic/bank-accounts-and-credit-cards/company-cards/Troubleshooting.md index 15e27a202b2f..bf4b21440b3c 100644 --- a/docs/articles/expensify-classic/bank-accounts-and-credit-cards/company-cards/Troubleshooting.md +++ b/docs/articles/expensify-classic/bank-accounts-and-credit-cards/company-cards/Troubleshooting.md @@ -58,7 +58,7 @@ Make sure you're importing your card in the correct spot in Expensify and select Please note there are some things that cannot be bypassed within Expensify, including two-factor authentication being enabled within your bank account. This will prevent the connection from remaining stable and will need to be turned off on the bank side. ## What are the most reliable bank connections in Expensify?* -The most reliable corporate card to use with Expensify is the Expensify Visa® Commercial Card. We offer daily settlement, unapproved expense limits, and real-time compliance for secure and efficient spending, as well as 2% cash back. Click here to learn more or apply. +The most reliable corporate card to use with Expensify is the Expensify Visa® Commercial Card. We offer daily settlement, unapproved expense limits, and real-time compliance for secure and efficient spending, as well as 2% cash back (_Applies to USD purchases only._) Click here to learn more or apply. Additionally, we've teamed up with major banks worldwide to ensure a smooth import of credit card transactions into your accounts. Corporate cards from the following banks also offer the most dependable connections in Expensify: - American Express - Bank of America From 1925a110d042671a84ba4613ee1e345894f36711 Mon Sep 17 00:00:00 2001 From: Vadym Date: Tue, 13 Feb 2024 10:24:31 +0100 Subject: [PATCH 150/288] fix: popover position --- .../PopoverReactionList/BasePopoverReactionList.tsx | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/pages/home/report/ReactionList/PopoverReactionList/BasePopoverReactionList.tsx b/src/pages/home/report/ReactionList/PopoverReactionList/BasePopoverReactionList.tsx index 6a464c46cce8..9f024ac92846 100644 --- a/src/pages/home/report/ReactionList/PopoverReactionList/BasePopoverReactionList.tsx +++ b/src/pages/home/report/ReactionList/PopoverReactionList/BasePopoverReactionList.tsx @@ -37,10 +37,6 @@ function BasePopoverReactionList(props: BasePopoverReactionListPropsWithLocalWit fullscreen withoutOverlay anchorRef={reactionListRef} - anchorAlignment={{ - horizontal: 'left', - vertical: 'top', - }} > Date: Tue, 13 Feb 2024 12:16:10 +0100 Subject: [PATCH 151/288] Fix bug with Group chat stacked avatars are different in Search list and LHN --- src/components/SelectionList/BaseListItem.tsx | 140 +++++++++--------- .../SelectionList/BaseSelectionList.tsx | 2 + src/components/SelectionList/UserListItem.tsx | 37 ++++- src/components/SelectionList/types.ts | 13 ++ src/pages/SearchPage/index.js | 1 + 5 files changed, 121 insertions(+), 72 deletions(-) diff --git a/src/components/SelectionList/BaseListItem.tsx b/src/components/SelectionList/BaseListItem.tsx index 71845931ba52..553fee4887db 100644 --- a/src/components/SelectionList/BaseListItem.tsx +++ b/src/components/SelectionList/BaseListItem.tsx @@ -25,6 +25,7 @@ function BaseListItem({ onDismissError = () => {}, rightHandSideComponent, keyForList, + shouldUseOnySubscriptAvatar = true, }: BaseListItemProps) { const theme = useTheme(); const styles = useThemeStyles(); @@ -63,77 +64,84 @@ function BaseListItem({ onMouseDown={shouldPreventDefaultFocusOnSelectRow ? (e) => e.preventDefault() : undefined} nativeID={keyForList} > - - {canSelectMultiple && ( + {({hovered}) => ( + <> - - {item.isSelected && ( - - )} - - - )} + {canSelectMultiple && ( + + + {item.isSelected && ( + + )} + + + )} - onSelectRow(item)} - showTooltip={showTooltip} - /> + onSelectRow(item)} + showTooltip={showTooltip} + isFocused={isFocused} + isHovered={hovered} + shouldUseOnySubscriptAvatar={shouldUseOnySubscriptAvatar} + /> - {!canSelectMultiple && item.isSelected && !rightHandSideComponent && ( - - - - + {!canSelectMultiple && item.isSelected && !rightHandSideComponent && ( + + + + + + )} + {rightHandSideComponentRender()} - )} - {rightHandSideComponentRender()} - - {isUserItem && item.invitedSecondaryLogin && ( - - {translate('workspace.people.invitedBySecondaryLogin', {secondaryLogin: item.invitedSecondaryLogin})} - + {isUserItem && item.invitedSecondaryLogin && ( + + {translate('workspace.people.invitedBySecondaryLogin', {secondaryLogin: item.invitedSecondaryLogin})} + + )} + )} diff --git a/src/components/SelectionList/BaseSelectionList.tsx b/src/components/SelectionList/BaseSelectionList.tsx index c77e244b4c92..ca9213a0fcaa 100644 --- a/src/components/SelectionList/BaseSelectionList.tsx +++ b/src/components/SelectionList/BaseSelectionList.tsx @@ -60,6 +60,7 @@ function BaseSelectionList( rightHandSideComponent, isLoadingNewOptions = false, onLayout, + shouldUseOnySubscriptAvatar = true, }: BaseSelectionListProps, inputRef: ForwardedRef, ) { @@ -300,6 +301,7 @@ function BaseSelectionList( shouldPreventDefaultFocusOnSelectRow={shouldPreventDefaultFocusOnSelectRow} rightHandSideComponent={rightHandSideComponent} keyForList={item.keyForList} + shouldUseOnySubscriptAvatar={shouldUseOnySubscriptAvatar} /> ); }; diff --git a/src/components/SelectionList/UserListItem.tsx b/src/components/SelectionList/UserListItem.tsx index fede09c1b435..c9fb9a92f9fb 100644 --- a/src/components/SelectionList/UserListItem.tsx +++ b/src/components/SelectionList/UserListItem.tsx @@ -1,20 +1,45 @@ import React from 'react'; import {View} from 'react-native'; +import MultipleAvatars from '@components/MultipleAvatars'; import SubscriptAvatar from '@components/SubscriptAvatar'; import TextWithTooltip from '@components/TextWithTooltip'; +import useStyleUtils from '@hooks/useStyleUtils'; +import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; import type {UserListItemProps} from './types'; -function UserListItem({item, textStyles, alternateTextStyles, showTooltip, style}: UserListItemProps) { +function UserListItem({item, textStyles, alternateTextStyles, showTooltip, style, isFocused, isHovered, shouldUseOnySubscriptAvatar = true}: UserListItemProps) { const styles = useThemeStyles(); + const theme = useTheme(); + const StyleUtils = useStyleUtils(); + + const focusedBackgroundColor = styles.sidebarLinkActive.backgroundColor; + const subscriptAvatarBorderColor = isFocused ? focusedBackgroundColor : theme.sidebar; + const hoveredBackgroundColor = !!styles.sidebarLinkHover && 'backgroundColor' in styles.sidebarLinkHover ? styles.sidebarLinkHover.backgroundColor : theme.sidebar; + return ( <> {!!item.icons && ( - + <> + {item.shouldShowSubscript ?? shouldUseOnySubscriptAvatar ? ( + + ) : ( + + )} + )} & { @@ -81,6 +84,12 @@ type UserListItemProps = CommonListItemProps & { /** Additional styles to apply to text */ style?: StyleProp; + + /** Is item hovered */ + isHovered?: boolean; + + /** Whether this item should use only the subscript avatar */ + shouldUseOnySubscriptAvatar?: boolean; }; type RadioItem = { @@ -115,6 +124,7 @@ type BaseListItemProps = CommonListItemProps = { @@ -239,6 +249,9 @@ type BaseSelectionListProps = Partial void; + + /** Whether this item should use only the subscript avatar */ + shouldUseOnySubscriptAvatar?: boolean; }; type ItemLayout = { diff --git a/src/pages/SearchPage/index.js b/src/pages/SearchPage/index.js index 7c472296dfe1..d9cae3ff8496 100644 --- a/src/pages/SearchPage/index.js +++ b/src/pages/SearchPage/index.js @@ -164,6 +164,7 @@ function SearchPage({betas, reports, isSearchingForReports}) { showLoadingPlaceholder={!didScreenTransitionEnd || !isOptionsDataReady} footerContent={SearchPageFooterInstance} isLoadingNewOptions={isSearchingForReports} + shouldUseOnySubscriptAvatar={false} /> From 4fd550f589ad731b34e6ff7b62f75090dd646b69 Mon Sep 17 00:00:00 2001 From: Yauheni Date: Tue, 13 Feb 2024 12:25:28 +0100 Subject: [PATCH 152/288] Fix prettier issues --- src/components/SelectionList/BaseSelectionList.tsx | 2 +- src/components/SelectionList/types.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/SelectionList/BaseSelectionList.tsx b/src/components/SelectionList/BaseSelectionList.tsx index ca9213a0fcaa..3a052bc2be1e 100644 --- a/src/components/SelectionList/BaseSelectionList.tsx +++ b/src/components/SelectionList/BaseSelectionList.tsx @@ -301,7 +301,7 @@ function BaseSelectionList( shouldPreventDefaultFocusOnSelectRow={shouldPreventDefaultFocusOnSelectRow} rightHandSideComponent={rightHandSideComponent} keyForList={item.keyForList} - shouldUseOnySubscriptAvatar={shouldUseOnySubscriptAvatar} + shouldUseOnySubscriptAvatar={shouldUseOnySubscriptAvatar} /> ); }; diff --git a/src/components/SelectionList/types.ts b/src/components/SelectionList/types.ts index 0b9e561e8db2..cbba278292b8 100644 --- a/src/components/SelectionList/types.ts +++ b/src/components/SelectionList/types.ts @@ -249,7 +249,7 @@ type BaseSelectionListProps = Partial void; - + /** Whether this item should use only the subscript avatar */ shouldUseOnySubscriptAvatar?: boolean; }; From c99ce964bada195c2d866e628de95cb8319a5075 Mon Sep 17 00:00:00 2001 From: Filip Solecki Date: Tue, 13 Feb 2024 12:48:14 +0100 Subject: [PATCH 153/288] Migrate GitUtils and GitUtilsTests --- .../createOrUpdateStagingDeploy.js | 2 +- .../getDeployPullRequestList.js | 2 +- .github/libs/{GitUtils.js => GitUtils.ts} | 52 ++++++++----------- .github/libs/versionUpdater.js | 6 +-- tests/unit/CIGitLogicTest.sh | 12 ++--- .../unit/{GitUtilsTest.js => GitUtilsTest.ts} | 46 +++++++++------- tests/unit/createOrUpdateStagingDeployTest.js | 2 +- tests/unit/markPullRequestsAsDeployedTest.js | 2 +- .../utils/{bumpVersion.mjs => bumpVersion.ts} | 2 +- ...viousVersion.mjs => getPreviousVersion.ts} | 2 +- tests/utils/getPullRequestsMergedBetween.mjs | 14 ----- tests/utils/getPullRequestsMergedBetween.ts | 17 ++++++ 12 files changed, 81 insertions(+), 78 deletions(-) rename .github/libs/{GitUtils.js => GitUtils.ts} (76%) rename tests/unit/{GitUtilsTest.js => GitUtilsTest.ts} (57%) rename tests/utils/{bumpVersion.mjs => bumpVersion.ts} (98%) rename tests/utils/{getPreviousVersion.mjs => getPreviousVersion.ts} (97%) delete mode 100755 tests/utils/getPullRequestsMergedBetween.mjs create mode 100755 tests/utils/getPullRequestsMergedBetween.ts diff --git a/.github/actions/javascript/createOrUpdateStagingDeploy/createOrUpdateStagingDeploy.js b/.github/actions/javascript/createOrUpdateStagingDeploy/createOrUpdateStagingDeploy.js index f0e45257bbef..4441348a3c36 100644 --- a/.github/actions/javascript/createOrUpdateStagingDeploy/createOrUpdateStagingDeploy.js +++ b/.github/actions/javascript/createOrUpdateStagingDeploy/createOrUpdateStagingDeploy.js @@ -4,7 +4,7 @@ const _ = require('underscore'); const core = require('@actions/core'); const CONST = require('../../../libs/CONST'); const GithubUtils = require('../../../libs/GithubUtils'); -const GitUtils = require('../../../libs/GitUtils'); +const GitUtils = require('../../../libs/GitUtils').default; async function run() { // Note: require('package.json').version does not work because ncc will resolve that to a plain string at compile time diff --git a/.github/actions/javascript/getDeployPullRequestList/getDeployPullRequestList.js b/.github/actions/javascript/getDeployPullRequestList/getDeployPullRequestList.js index a64ebfc240ba..da0dde4ff1ca 100644 --- a/.github/actions/javascript/getDeployPullRequestList/getDeployPullRequestList.js +++ b/.github/actions/javascript/getDeployPullRequestList/getDeployPullRequestList.js @@ -2,7 +2,7 @@ const _ = require('underscore'); const core = require('@actions/core'); const github = require('@actions/github'); const ActionUtils = require('../../../libs/ActionUtils'); -const GitUtils = require('../../../libs/GitUtils'); +const GitUtils = require('../../../libs/GitUtils').default; const GithubUtils = require('../../../libs/GithubUtils'); async function run() { diff --git a/.github/libs/GitUtils.js b/.github/libs/GitUtils.ts similarity index 76% rename from .github/libs/GitUtils.js rename to .github/libs/GitUtils.ts index 2076763fbb55..051a3f3dc40b 100644 --- a/.github/libs/GitUtils.js +++ b/.github/libs/GitUtils.ts @@ -1,14 +1,18 @@ -const _ = require('underscore'); -const {spawn, execSync} = require('child_process'); -const CONST = require('./CONST'); -const sanitizeStringForJSONParse = require('./sanitizeStringForJSONParse'); -const {getPreviousVersion, SEMANTIC_VERSION_LEVELS} = require('../libs/versionUpdater'); +import {execSync, spawn} from 'child_process'; +import * as CONST from './CONST'; +import sanitizeStringForJSONParse from './sanitizeStringForJSONParse'; +import * as VERSION_UPDATER from './versionUpdater'; + +type CommitType = { + commit: string; + subject: string; + authorName: string; +}; /** - * @param {String} tag - * @param {String} [shallowExcludeTag] when fetching the given tag, exclude all history reachable by the shallowExcludeTag (used to make fetch much faster) + * When fetching the given tag, exclude all history reachable by the shallowExcludeTag (used to make fetch much faster) */ -function fetchTag(tag, shallowExcludeTag = '') { +function fetchTag(tag: string, shallowExcludeTag = '') { let shouldRetry = true; let needsRepack = false; while (shouldRetry) { @@ -47,19 +51,15 @@ function fetchTag(tag, shallowExcludeTag = '') { /** * Get merge logs between two tags (inclusive) as a JavaScript object. - * - * @param {String} fromTag - * @param {String} toTag - * @returns {Promise>>} */ -function getCommitHistoryAsJSON(fromTag, toTag) { +function getCommitHistoryAsJSON(fromTag: string, toTag: string): Promise { // Fetch tags, exclude commits reachable from the previous patch version (i.e: previous checklist), so that we don't have to fetch the full history - const previousPatchVersion = getPreviousVersion(fromTag, SEMANTIC_VERSION_LEVELS.PATCH); + const previousPatchVersion = VERSION_UPDATER.getPreviousVersion(fromTag, VERSION_UPDATER.SEMANTIC_VERSION_LEVELS.PATCH); fetchTag(fromTag, previousPatchVersion); fetchTag(toTag, previousPatchVersion); console.log('Getting pull requests merged between the following tags:', fromTag, toTag); - return new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { let stdout = ''; let stderr = ''; const args = ['log', '--format={"commit": "%H", "authorName": "%an", "subject": "%s"},', `${fromTag}...${toTag}`]; @@ -89,26 +89,23 @@ function getCommitHistoryAsJSON(fromTag, toTag) { // Then remove newlines, format as JSON and convert to a proper JS object const json = `[${sanitizedOutput}]`.replace(/(\r\n|\n|\r)/gm, '').replace('},]', '}]'); - return JSON.parse(json); + return JSON.parse(json) as CommitType[]; }); } /** * Parse merged PRs, excluding those from irrelevant branches. - * - * @param {Array>} commits - * @returns {Array} */ -function getValidMergedPRs(commits) { - const mergedPRs = new Set(); - _.each(commits, (commit) => { +function getValidMergedPRs(commits: CommitType[]): number[] { + const mergedPRs = new Set(); + commits.forEach((commit) => { const author = commit.authorName; if (author === CONST.OS_BOTIFY) { return; } const match = commit.subject.match(/Merge pull request #(\d+) from (?!Expensify\/.*-cherry-pick-staging)/); - if (!_.isArray(match) || match.length < 2) { + if (!Array.isArray(match) || match.length < 2) { return; } @@ -128,12 +125,8 @@ function getValidMergedPRs(commits) { /** * Takes in two git tags and returns a list of PR numbers of all PRs merged between those two tags - * - * @param {String} fromTag - * @param {String} toTag - * @returns {Promise>} – Pull request numbers */ -async function getPullRequestsMergedBetween(fromTag, toTag) { +async function getPullRequestsMergedBetween(fromTag: string, toTag: string) { console.log(`Looking for commits made between ${fromTag} and ${toTag}...`); const commitList = await getCommitHistoryAsJSON(fromTag, toTag); console.log(`Commits made between ${fromTag} and ${toTag}:`, commitList); @@ -144,7 +137,8 @@ async function getPullRequestsMergedBetween(fromTag, toTag) { return pullRequestNumbers; } -module.exports = { +export default { getValidMergedPRs, getPullRequestsMergedBetween, }; +export type {CommitType}; diff --git a/.github/libs/versionUpdater.js b/.github/libs/versionUpdater.js index 78e8085621bd..5526ee38d2ea 100644 --- a/.github/libs/versionUpdater.js +++ b/.github/libs/versionUpdater.js @@ -65,8 +65,8 @@ const incrementPatch = (major, minor, patch) => { /** * Increments a build version * - * @param {Number} version - * @param {Number} level + * @param {String} version + * @param {String} level * @returns {String} */ const incrementVersion = (version, level) => { @@ -127,7 +127,7 @@ function getPreviousVersion(currentVersion, level) { return getVersionStringFromNumber(major, minor, patch, build - 1); } -module.exports = { +export { getVersionNumberFromString, getVersionStringFromNumber, incrementVersion, diff --git a/tests/unit/CIGitLogicTest.sh b/tests/unit/CIGitLogicTest.sh index f35ead3542d3..73fd01f5c0a0 100755 --- a/tests/unit/CIGitLogicTest.sh +++ b/tests/unit/CIGitLogicTest.sh @@ -10,9 +10,9 @@ declare -r GIT_REMOTE="$HOME/dummyGitRemotes/DumDumRepo" declare -r SEMVER_LEVEL_BUILD='BUILD' declare -r SEMVER_LEVEL_PATCH='PATCH' -declare -r bumpVersion="$TEST_DIR/utils/bumpVersion.mjs" -declare -r getPreviousVersion="$TEST_DIR/utils/getPreviousVersion.mjs" -declare -r getPullRequestsMergedBetween="$TEST_DIR/utils/getPullRequestsMergedBetween.mjs" +declare -r bumpVersion="$TEST_DIR/utils/bumpVersion.ts" +declare -r getPreviousVersion="$TEST_DIR/utils/getPreviousVersion.ts" +declare -r getPullRequestsMergedBetween="$TEST_DIR/utils/getPullRequestsMergedBetween.ts" source "$SCRIPTS_DIR/shellUtils.sh" @@ -76,7 +76,7 @@ function bump_version { info "Bumping version..." setup_git_as_osbotify git switch main - npm --no-git-tag-version version "$(node "$bumpVersion" "$(print_version)" "$1")" + npm --no-git-tag-version version "$(ts-node "$bumpVersion" "$(print_version)" "$1")" git add package.json package-lock.json git commit -m "Update version to $(print_version)" git push origin main @@ -142,7 +142,7 @@ function cherry_pick_pr { checkout_repo setup_git_as_osbotify - PREVIOUS_PATCH_VERSION="$(node "$getPreviousVersion" "$(print_version)" "$SEMVER_LEVEL_PATCH")" + PREVIOUS_PATCH_VERSION="$(ts-node "$getPreviousVersion" "$(print_version)" "$SEMVER_LEVEL_PATCH")" git fetch origin main staging --no-tags --shallow-exclude="$PREVIOUS_PATCH_VERSION" git switch staging @@ -201,7 +201,7 @@ function deploy_production { function assert_prs_merged_between { checkout_repo - output=$(node "$getPullRequestsMergedBetween" "$1" "$2") + output=$(ts-node "$getPullRequestsMergedBetween" "$1" "$2") info "Checking output of getPullRequestsMergedBetween $1 $2" assert_equal "$output" "$3" } diff --git a/tests/unit/GitUtilsTest.js b/tests/unit/GitUtilsTest.ts similarity index 57% rename from tests/unit/GitUtilsTest.js rename to tests/unit/GitUtilsTest.ts index 945a97a8ddd7..f82fa0e28ada 100644 --- a/tests/unit/GitUtilsTest.js +++ b/tests/unit/GitUtilsTest.ts @@ -1,38 +1,44 @@ -const GitUtils = require('../../.github/libs/GitUtils'); +import type {CommitType} from '../../.github/libs/GitUtils'; +import GitUtils from '../../.github/libs/GitUtils'; -const data = [ +type ExampleDataType = { + input: CommitType[]; + expectedOutput: number[]; +}; + +const data: ExampleDataType[] = [ { input: [], expectedOutput: [], }, { - input: [{commit: '1', subject: 'Some random commit message', author: 'test@gmail.com'}], + input: [{commit: '1', subject: 'Some random commit message', authorName: 'test@gmail.com'}], expectedOutput: [], }, { input: [ - {commit: '1', subject: 'Start adding StagingDeployCash logic', author: 'test@gmail.com'}, - {commit: '2', subject: 'Setting up bones', author: 'test@gmail.com'}, - {commit: '3', subject: 'Merge pull request #337 from Expensify/francoisUpdateQbdSyncManager', author: 'test@gmail.com'}, - {commit: '4', subject: 'Merge pull request #336 from Expensify/andrew-pr-cla', author: 'test@gmail.com'}, - {commit: '5', subject: 'Update QBD Sync Manager version', author: 'test@gmail.com'}, - {commit: '6', subject: 'Only run CLA on PR comments or events', author: 'test@gmail.com'}, - {commit: '7', subject: 'Merge pull request #331 from Expensify/marcaaron-killMoment', author: 'test@gmail.com'}, - {commit: '8', subject: 'Merge pull request #330 from Expensify/andrew-cla-update', author: 'test@gmail.com'}, - {commit: '9', subject: 'Merge pull request #333 from Expensify/Rory-AddOnOffSwitchTooltip', author: 'test@gmail.com'}, - {commit: '10', subject: 'Setup OnOffSwitch component with tooltips', author: 'test@gmail.com'}, - {commit: '11', subject: 'Merge pull request #332 from Expensify/alex-mechler-patch-1', author: 'test@gmail.com'}, - {commit: '12', subject: 'Return to old hash-based deploy instrcutions', author: 'test@gmail.com'}, - {commit: '12', subject: 'Remove DEFAULT_START_DATE & DEFAULT_END_DATE altogether', author: 'test@gmail.com'}, + {commit: '1', subject: 'Start adding StagingDeployCash logic', authorName: 'test@gmail.com'}, + {commit: '2', subject: 'Setting up bones', authorName: 'test@gmail.com'}, + {commit: '3', subject: 'Merge pull request #337 from Expensify/francoisUpdateQbdSyncManager', authorName: 'test@gmail.com'}, + {commit: '4', subject: 'Merge pull request #336 from Expensify/andrew-pr-cla', authorName: 'test@gmail.com'}, + {commit: '5', subject: 'Update QBD Sync Manager version', authorName: 'test@gmail.com'}, + {commit: '6', subject: 'Only run CLA on PR comments or events', authorName: 'test@gmail.com'}, + {commit: '7', subject: 'Merge pull request #331 from Expensify/marcaaron-killMoment', authorName: 'test@gmail.com'}, + {commit: '8', subject: 'Merge pull request #330 from Expensify/andrew-cla-update', authorName: 'test@gmail.com'}, + {commit: '9', subject: 'Merge pull request #333 from Expensify/Rory-AddOnOffSwitchTooltip', authorName: 'test@gmail.com'}, + {commit: '10', subject: 'Setup OnOffSwitch component with tooltips', authorName: 'test@gmail.com'}, + {commit: '11', subject: 'Merge pull request #332 from Expensify/alex-mechler-patch-1', authorName: 'test@gmail.com'}, + {commit: '12', subject: 'Return to old hash-based deploy instrcutions', authorName: 'test@gmail.com'}, + {commit: '12', subject: 'Remove DEFAULT_START_DATE & DEFAULT_END_DATE altogether', authorName: 'test@gmail.com'}, ], expectedOutput: [337, 336, 331, 330, 333, 332], }, { input: [ - {commit: '1', subject: 'Merge pull request #1521 from parasharrajat/parasharrajat/pdf-render', author: 'test@gmail.com'}, - {commit: '3', subject: 'Update version to 1.0.1-470', author: 'test@gmail.com'}, - {commit: '4', subject: '[IS-1500] Updated textalignInput utility', author: 'test@gmail.com'}, - {commit: '5', subject: 'fix: set pdf width on large screens', author: 'test@gmail.com'}, + {commit: '1', subject: 'Merge pull request #1521 from parasharrajat/parasharrajat/pdf-render', authorName: 'test@gmail.com'}, + {commit: '3', subject: 'Update version to 1.0.1-470', authorName: 'test@gmail.com'}, + {commit: '4', subject: '[IS-1500] Updated textalignInput utility', authorName: 'test@gmail.com'}, + {commit: '5', subject: 'fix: set pdf width on large screens', authorName: 'test@gmail.com'}, ], expectedOutput: [1521], }, diff --git a/tests/unit/createOrUpdateStagingDeployTest.js b/tests/unit/createOrUpdateStagingDeployTest.js index 31b1a9346169..15a795842667 100644 --- a/tests/unit/createOrUpdateStagingDeployTest.js +++ b/tests/unit/createOrUpdateStagingDeployTest.js @@ -6,7 +6,7 @@ const fns = require('date-fns'); const {vol} = require('memfs'); const path = require('path'); const CONST = require('../../.github/libs/CONST'); -const GitUtils = require('../../.github/libs/GitUtils'); +const GitUtils = require('../../.github/libs/GitUtils').default; const GithubUtils = require('../../.github/libs/GithubUtils'); const run = require('../../.github/actions/javascript/createOrUpdateStagingDeploy/createOrUpdateStagingDeploy'); diff --git a/tests/unit/markPullRequestsAsDeployedTest.js b/tests/unit/markPullRequestsAsDeployedTest.js index e9e68236ef99..81da0a5c9371 100644 --- a/tests/unit/markPullRequestsAsDeployedTest.js +++ b/tests/unit/markPullRequestsAsDeployedTest.js @@ -2,7 +2,7 @@ * @jest-environment node */ const _ = require('underscore'); -const GitUtils = require('../../.github/libs/GitUtils'); +const GitUtils = require('../../.github/libs/GitUtils').default; const GithubUtils = require('../../.github/libs/GithubUtils'); let run; diff --git a/tests/utils/bumpVersion.mjs b/tests/utils/bumpVersion.ts similarity index 98% rename from tests/utils/bumpVersion.mjs rename to tests/utils/bumpVersion.ts index 19471ee7f905..e187de508dab 100644 --- a/tests/utils/bumpVersion.mjs +++ b/tests/utils/bumpVersion.ts @@ -1,5 +1,5 @@ #!/usr/bin/env node -import {incrementVersion} from '../../.github/libs/versionUpdater.js'; +import {incrementVersion} from '../../.github/libs/versionUpdater'; const version = process.argv[2]; const level = process.argv[3]; diff --git a/tests/utils/getPreviousVersion.mjs b/tests/utils/getPreviousVersion.ts similarity index 97% rename from tests/utils/getPreviousVersion.mjs rename to tests/utils/getPreviousVersion.ts index 31ca672776fa..1eecf2fe5180 100644 --- a/tests/utils/getPreviousVersion.mjs +++ b/tests/utils/getPreviousVersion.ts @@ -1,5 +1,5 @@ #!/usr/bin/env node -import {getPreviousVersion} from '../../.github/libs/versionUpdater.js'; +import {getPreviousVersion} from '../../.github/libs/versionUpdater'; const currentVersion = process.argv[2]; const level = process.argv[3]; diff --git a/tests/utils/getPullRequestsMergedBetween.mjs b/tests/utils/getPullRequestsMergedBetween.mjs deleted file mode 100755 index 0afb1499e67f..000000000000 --- a/tests/utils/getPullRequestsMergedBetween.mjs +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env node -import GitUtils from '../../.github/libs/GitUtils.js'; - -const fromRef = process.argv[2]; -const toRef = process.argv[3]; - -/* eslint-disable no-console */ -const realConsoleLog = console.log; -console.log = () => {}; - -const output = await GitUtils.getPullRequestsMergedBetween(fromRef, toRef); - -console.log = realConsoleLog; -console.log(output); diff --git a/tests/utils/getPullRequestsMergedBetween.ts b/tests/utils/getPullRequestsMergedBetween.ts new file mode 100755 index 000000000000..2bf5a0835710 --- /dev/null +++ b/tests/utils/getPullRequestsMergedBetween.ts @@ -0,0 +1,17 @@ +#!/usr/bin/env node +import GitUtils from '../../.github/libs/GitUtils'; + +const fromRef = process.argv[2]; +const toRef = process.argv[3]; + +/* eslint-disable no-console */ +const realConsoleLog = console.log; +console.log = () => {}; + +async function main() { + const output = await GitUtils.getPullRequestsMergedBetween(fromRef, toRef); + + console.log = realConsoleLog; + console.log(output); +} +main(); From 63ce097ea2d01054d32a8197a58a550460c94b14 Mon Sep 17 00:00:00 2001 From: Filip Solecki Date: Tue, 13 Feb 2024 12:53:38 +0100 Subject: [PATCH 154/288] Install ts-node --- tests/unit/CIGitLogicTest.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/unit/CIGitLogicTest.sh b/tests/unit/CIGitLogicTest.sh index 73fd01f5c0a0..49a916d7b9dc 100755 --- a/tests/unit/CIGitLogicTest.sh +++ b/tests/unit/CIGitLogicTest.sh @@ -76,6 +76,7 @@ function bump_version { info "Bumping version..." setup_git_as_osbotify git switch main + npm i ts-node npm --no-git-tag-version version "$(ts-node "$bumpVersion" "$(print_version)" "$1")" git add package.json package-lock.json git commit -m "Update version to $(print_version)" @@ -142,6 +143,7 @@ function cherry_pick_pr { checkout_repo setup_git_as_osbotify + npm i ts-node PREVIOUS_PATCH_VERSION="$(ts-node "$getPreviousVersion" "$(print_version)" "$SEMVER_LEVEL_PATCH")" git fetch origin main staging --no-tags --shallow-exclude="$PREVIOUS_PATCH_VERSION" @@ -201,6 +203,7 @@ function deploy_production { function assert_prs_merged_between { checkout_repo + npm i ts-node output=$(ts-node "$getPullRequestsMergedBetween" "$1" "$2") info "Checking output of getPullRequestsMergedBetween $1 $2" assert_equal "$output" "$3" From a3e8a8d550800171414bb598cc3f4e3cbaf6583a Mon Sep 17 00:00:00 2001 From: Filip Solecki Date: Tue, 13 Feb 2024 12:57:55 +0100 Subject: [PATCH 155/288] rebuild gh actions --- .../javascript/authorChecklist/index.js | 33 +- .../actions/javascript/bumpVersion/index.js | 59 ++- .../createOrUpdateStagingDeploy/index.js | 376 ++++++++++-------- .../getDeployPullRequestList/index.js | 376 ++++++++++-------- .../javascript/getPreviousVersion/index.js | 57 ++- .../javascript/verifySignedCommits/index.js | 31 +- 6 files changed, 526 insertions(+), 406 deletions(-) diff --git a/.github/actions/javascript/authorChecklist/index.js b/.github/actions/javascript/authorChecklist/index.js index 137020670c10..26277693e888 100644 --- a/.github/actions/javascript/authorChecklist/index.js +++ b/.github/actions/javascript/authorChecklist/index.js @@ -1,6 +1,7 @@ /** * NOTE: This is a compiled file. DO NOT directly edit this file. */ +import { createRequire as __WEBPACK_EXTERNAL_createRequire } from "module"; /******/ (() => { // webpackBootstrap /******/ var __webpack_modules__ = ({ @@ -18686,7 +18687,7 @@ module.exports = eval("require")("encoding"); /***/ ((module) => { "use strict"; -module.exports = require("assert"); +module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("assert"); /***/ }), @@ -18694,7 +18695,7 @@ module.exports = require("assert"); /***/ ((module) => { "use strict"; -module.exports = require("crypto"); +module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("crypto"); /***/ }), @@ -18702,7 +18703,7 @@ module.exports = require("crypto"); /***/ ((module) => { "use strict"; -module.exports = require("events"); +module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("events"); /***/ }), @@ -18710,7 +18711,7 @@ module.exports = require("events"); /***/ ((module) => { "use strict"; -module.exports = require("fs"); +module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("fs"); /***/ }), @@ -18718,7 +18719,7 @@ module.exports = require("fs"); /***/ ((module) => { "use strict"; -module.exports = require("http"); +module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("http"); /***/ }), @@ -18726,7 +18727,7 @@ module.exports = require("http"); /***/ ((module) => { "use strict"; -module.exports = require("https"); +module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("https"); /***/ }), @@ -18734,7 +18735,7 @@ module.exports = require("https"); /***/ ((module) => { "use strict"; -module.exports = require("net"); +module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("net"); /***/ }), @@ -18742,7 +18743,7 @@ module.exports = require("net"); /***/ ((module) => { "use strict"; -module.exports = require("os"); +module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("os"); /***/ }), @@ -18750,7 +18751,7 @@ module.exports = require("os"); /***/ ((module) => { "use strict"; -module.exports = require("path"); +module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("path"); /***/ }), @@ -18758,7 +18759,7 @@ module.exports = require("path"); /***/ ((module) => { "use strict"; -module.exports = require("punycode"); +module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("punycode"); /***/ }), @@ -18766,7 +18767,7 @@ module.exports = require("punycode"); /***/ ((module) => { "use strict"; -module.exports = require("stream"); +module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("stream"); /***/ }), @@ -18774,7 +18775,7 @@ module.exports = require("stream"); /***/ ((module) => { "use strict"; -module.exports = require("tls"); +module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("tls"); /***/ }), @@ -18782,7 +18783,7 @@ module.exports = require("tls"); /***/ ((module) => { "use strict"; -module.exports = require("tty"); +module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("tty"); /***/ }), @@ -18790,7 +18791,7 @@ module.exports = require("tty"); /***/ ((module) => { "use strict"; -module.exports = require("url"); +module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("url"); /***/ }), @@ -18798,7 +18799,7 @@ module.exports = require("url"); /***/ ((module) => { "use strict"; -module.exports = require("util"); +module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("util"); /***/ }), @@ -18806,7 +18807,7 @@ module.exports = require("util"); /***/ ((module) => { "use strict"; -module.exports = require("zlib"); +module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("zlib"); /***/ }), diff --git a/.github/actions/javascript/bumpVersion/index.js b/.github/actions/javascript/bumpVersion/index.js index 1132c137061e..d17760baa91f 100644 --- a/.github/actions/javascript/bumpVersion/index.js +++ b/.github/actions/javascript/bumpVersion/index.js @@ -104,8 +104,20 @@ exports.updateiOSVersion = function updateiOSVersion(version) { /***/ }), /***/ 8007: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +/***/ ((__unused_webpack_module, __webpack_exports__, __nccwpck_require__) => { +"use strict"; +__nccwpck_require__.r(__webpack_exports__); +/* harmony export */ __nccwpck_require__.d(__webpack_exports__, { +/* harmony export */ "MAX_INCREMENTS": () => (/* binding */ MAX_INCREMENTS), +/* harmony export */ "SEMANTIC_VERSION_LEVELS": () => (/* binding */ SEMANTIC_VERSION_LEVELS), +/* harmony export */ "getPreviousVersion": () => (/* binding */ getPreviousVersion), +/* harmony export */ "getVersionNumberFromString": () => (/* binding */ getVersionNumberFromString), +/* harmony export */ "getVersionStringFromNumber": () => (/* binding */ getVersionStringFromNumber), +/* harmony export */ "incrementMinor": () => (/* binding */ incrementMinor), +/* harmony export */ "incrementPatch": () => (/* binding */ incrementPatch), +/* harmony export */ "incrementVersion": () => (/* binding */ incrementVersion) +/* harmony export */ }); const _ = __nccwpck_require__(5067); const SEMANTIC_VERSION_LEVELS = { @@ -173,8 +185,8 @@ const incrementPatch = (major, minor, patch) => { /** * Increments a build version * - * @param {Number} version - * @param {Number} level + * @param {String} version + * @param {String} level * @returns {String} */ const incrementVersion = (version, level) => { @@ -235,18 +247,7 @@ function getPreviousVersion(currentVersion, level) { return getVersionStringFromNumber(major, minor, patch, build - 1); } -module.exports = { - getVersionNumberFromString, - getVersionStringFromNumber, - incrementVersion, - - // For tests - MAX_INCREMENTS, - SEMANTIC_VERSION_LEVELS, - incrementMinor, - incrementPatch, - getPreviousVersion, -}; + /***/ }), @@ -5954,6 +5955,34 @@ module.exports = underscoreNodeF._; /******/ } /******/ /************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __nccwpck_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__nccwpck_require__.o(definition, key) && !__nccwpck_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __nccwpck_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __nccwpck_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ /******/ /* webpack/runtime/compat */ /******/ /******/ if (typeof __nccwpck_require__ !== 'undefined') __nccwpck_require__.ab = __dirname + "/"; diff --git a/.github/actions/javascript/createOrUpdateStagingDeploy/index.js b/.github/actions/javascript/createOrUpdateStagingDeploy/index.js index 4116862da777..c09c1b8621f3 100644 --- a/.github/actions/javascript/createOrUpdateStagingDeploy/index.js +++ b/.github/actions/javascript/createOrUpdateStagingDeploy/index.js @@ -13,7 +13,7 @@ const _ = __nccwpck_require__(5067); const core = __nccwpck_require__(2186); const CONST = __nccwpck_require__(4097); const GithubUtils = __nccwpck_require__(7999); -const GitUtils = __nccwpck_require__(669); +const GitUtils = (__nccwpck_require__(1547)["default"]); async function run() { // Note: require('package.json').version does not work because ncc will resolve that to a plain string at compile time @@ -177,163 +177,6 @@ CONST.APP_REPO_GIT_URL = `git@github.com:${CONST.GITHUB_OWNER}/${CONST.APP_REPO} module.exports = CONST; -/***/ }), - -/***/ 669: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const _ = __nccwpck_require__(5067); -const {spawn, execSync} = __nccwpck_require__(2081); -const CONST = __nccwpck_require__(4097); -const sanitizeStringForJSONParse = __nccwpck_require__(9338); -const {getPreviousVersion, SEMANTIC_VERSION_LEVELS} = __nccwpck_require__(8007); - -/** - * @param {String} tag - * @param {String} [shallowExcludeTag] when fetching the given tag, exclude all history reachable by the shallowExcludeTag (used to make fetch much faster) - */ -function fetchTag(tag, shallowExcludeTag = '') { - let shouldRetry = true; - let needsRepack = false; - while (shouldRetry) { - try { - let command = ''; - if (needsRepack) { - // We have seen some scenarios where this fixes the git fetch. - // Why? Who knows... https://github.com/Expensify/App/pull/31459 - command = 'git repack -d'; - console.log(`Running command: ${command}`); - execSync(command); - } - - command = `git fetch origin tag ${tag} --no-tags`; - - // Note that this condition is only ever NOT true in the 1.0.0-0 edge case - if (shallowExcludeTag && shallowExcludeTag !== tag) { - command += ` --shallow-exclude=${shallowExcludeTag}`; - } - - console.log(`Running command: ${command}`); - execSync(command); - shouldRetry = false; - } catch (e) { - console.error(e); - if (!needsRepack) { - console.log('Attempting to repack and retry...'); - needsRepack = true; - } else { - console.error("Repack didn't help, giving up..."); - shouldRetry = false; - } - } - } -} - -/** - * Get merge logs between two tags (inclusive) as a JavaScript object. - * - * @param {String} fromTag - * @param {String} toTag - * @returns {Promise>>} - */ -function getCommitHistoryAsJSON(fromTag, toTag) { - // Fetch tags, exclude commits reachable from the previous patch version (i.e: previous checklist), so that we don't have to fetch the full history - const previousPatchVersion = getPreviousVersion(fromTag, SEMANTIC_VERSION_LEVELS.PATCH); - fetchTag(fromTag, previousPatchVersion); - fetchTag(toTag, previousPatchVersion); - - console.log('Getting pull requests merged between the following tags:', fromTag, toTag); - return new Promise((resolve, reject) => { - let stdout = ''; - let stderr = ''; - const args = ['log', '--format={"commit": "%H", "authorName": "%an", "subject": "%s"},', `${fromTag}...${toTag}`]; - console.log(`Running command: git ${args.join(' ')}`); - const spawnedProcess = spawn('git', args); - spawnedProcess.on('message', console.log); - spawnedProcess.stdout.on('data', (chunk) => { - console.log(chunk.toString()); - stdout += chunk.toString(); - }); - spawnedProcess.stderr.on('data', (chunk) => { - console.error(chunk.toString()); - stderr += chunk.toString(); - }); - spawnedProcess.on('close', (code) => { - if (code !== 0) { - return reject(new Error(`${stderr}`)); - } - - resolve(stdout); - }); - spawnedProcess.on('error', (err) => reject(err)); - }).then((stdout) => { - // Sanitize just the text within commit subjects as that's the only potentially un-parseable text. - const sanitizedOutput = stdout.replace(/(?<="subject": ").*?(?="})/g, (subject) => sanitizeStringForJSONParse(subject)); - - // Then remove newlines, format as JSON and convert to a proper JS object - const json = `[${sanitizedOutput}]`.replace(/(\r\n|\n|\r)/gm, '').replace('},]', '}]'); - - return JSON.parse(json); - }); -} - -/** - * Parse merged PRs, excluding those from irrelevant branches. - * - * @param {Array>} commits - * @returns {Array} - */ -function getValidMergedPRs(commits) { - const mergedPRs = new Set(); - _.each(commits, (commit) => { - const author = commit.authorName; - if (author === CONST.OS_BOTIFY) { - return; - } - - const match = commit.subject.match(/Merge pull request #(\d+) from (?!Expensify\/.*-cherry-pick-staging)/); - if (!_.isArray(match) || match.length < 2) { - return; - } - - const pr = Number.parseInt(match[1], 10); - if (mergedPRs.has(pr)) { - // If a PR shows up in the log twice, that means that the PR was deployed in the previous checklist. - // That also means that we don't want to include it in the current checklist, so we remove it now. - mergedPRs.delete(pr); - return; - } - - mergedPRs.add(pr); - }); - - return Array.from(mergedPRs); -} - -/** - * Takes in two git tags and returns a list of PR numbers of all PRs merged between those two tags - * - * @param {String} fromTag - * @param {String} toTag - * @returns {Promise>} – Pull request numbers - */ -async function getPullRequestsMergedBetween(fromTag, toTag) { - console.log(`Looking for commits made between ${fromTag} and ${toTag}...`); - const commitList = await getCommitHistoryAsJSON(fromTag, toTag); - console.log(`Commits made between ${fromTag} and ${toTag}:`, commitList); - - // Find which commit messages correspond to merged PR's - const pullRequestNumbers = getValidMergedPRs(commitList).sort((a, b) => a - b); - console.log(`List of pull requests merged between ${fromTag} and ${toTag}`, pullRequestNumbers); - return pullRequestNumbers; -} - -module.exports = { - getValidMergedPRs, - getPullRequestsMergedBetween, -}; - - /***/ }), /***/ 7999: @@ -909,8 +752,20 @@ module.exports = function (inputString) { /***/ }), /***/ 8007: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +/***/ ((__unused_webpack_module, __webpack_exports__, __nccwpck_require__) => { +"use strict"; +__nccwpck_require__.r(__webpack_exports__); +/* harmony export */ __nccwpck_require__.d(__webpack_exports__, { +/* harmony export */ "MAX_INCREMENTS": () => (/* binding */ MAX_INCREMENTS), +/* harmony export */ "SEMANTIC_VERSION_LEVELS": () => (/* binding */ SEMANTIC_VERSION_LEVELS), +/* harmony export */ "getPreviousVersion": () => (/* binding */ getPreviousVersion), +/* harmony export */ "getVersionNumberFromString": () => (/* binding */ getVersionNumberFromString), +/* harmony export */ "getVersionStringFromNumber": () => (/* binding */ getVersionStringFromNumber), +/* harmony export */ "incrementMinor": () => (/* binding */ incrementMinor), +/* harmony export */ "incrementPatch": () => (/* binding */ incrementPatch), +/* harmony export */ "incrementVersion": () => (/* binding */ incrementVersion) +/* harmony export */ }); const _ = __nccwpck_require__(5067); const SEMANTIC_VERSION_LEVELS = { @@ -978,8 +833,8 @@ const incrementPatch = (major, minor, patch) => { /** * Increments a build version * - * @param {Number} version - * @param {Number} level + * @param {String} version + * @param {String} level * @returns {String} */ const incrementVersion = (version, level) => { @@ -1040,18 +895,7 @@ function getPreviousVersion(currentVersion, level) { return getVersionStringFromNumber(major, minor, patch, build - 1); } -module.exports = { - getVersionNumberFromString, - getVersionStringFromNumber, - incrementVersion, - - // For tests - MAX_INCREMENTS, - SEMANTIC_VERSION_LEVELS, - incrementMinor, - incrementPatch, - getPreviousVersion, -}; + /***/ }), @@ -16836,6 +16680,164 @@ function wrappy (fn, cb) { } +/***/ }), + +/***/ 1547: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +const child_process_1 = __nccwpck_require__(2081); +const CONST = __importStar(__nccwpck_require__(4097)); +const sanitizeStringForJSONParse_1 = __importDefault(__nccwpck_require__(9338)); +const VERSION_UPDATER = __importStar(__nccwpck_require__(8007)); +/** + * When fetching the given tag, exclude all history reachable by the shallowExcludeTag (used to make fetch much faster) + */ +function fetchTag(tag, shallowExcludeTag = '') { + let shouldRetry = true; + let needsRepack = false; + while (shouldRetry) { + try { + let command = ''; + if (needsRepack) { + // We have seen some scenarios where this fixes the git fetch. + // Why? Who knows... https://github.com/Expensify/App/pull/31459 + command = 'git repack -d'; + console.log(`Running command: ${command}`); + (0, child_process_1.execSync)(command); + } + command = `git fetch origin tag ${tag} --no-tags`; + // Note that this condition is only ever NOT true in the 1.0.0-0 edge case + if (shallowExcludeTag && shallowExcludeTag !== tag) { + command += ` --shallow-exclude=${shallowExcludeTag}`; + } + console.log(`Running command: ${command}`); + (0, child_process_1.execSync)(command); + shouldRetry = false; + } + catch (e) { + console.error(e); + if (!needsRepack) { + console.log('Attempting to repack and retry...'); + needsRepack = true; + } + else { + console.error("Repack didn't help, giving up..."); + shouldRetry = false; + } + } + } +} +/** + * Get merge logs between two tags (inclusive) as a JavaScript object. + */ +function getCommitHistoryAsJSON(fromTag, toTag) { + // Fetch tags, exclude commits reachable from the previous patch version (i.e: previous checklist), so that we don't have to fetch the full history + const previousPatchVersion = VERSION_UPDATER.getPreviousVersion(fromTag, VERSION_UPDATER.SEMANTIC_VERSION_LEVELS.PATCH); + fetchTag(fromTag, previousPatchVersion); + fetchTag(toTag, previousPatchVersion); + console.log('Getting pull requests merged between the following tags:', fromTag, toTag); + return new Promise((resolve, reject) => { + let stdout = ''; + let stderr = ''; + const args = ['log', '--format={"commit": "%H", "authorName": "%an", "subject": "%s"},', `${fromTag}...${toTag}`]; + console.log(`Running command: git ${args.join(' ')}`); + const spawnedProcess = (0, child_process_1.spawn)('git', args); + spawnedProcess.on('message', console.log); + spawnedProcess.stdout.on('data', (chunk) => { + console.log(chunk.toString()); + stdout += chunk.toString(); + }); + spawnedProcess.stderr.on('data', (chunk) => { + console.error(chunk.toString()); + stderr += chunk.toString(); + }); + spawnedProcess.on('close', (code) => { + if (code !== 0) { + return reject(new Error(`${stderr}`)); + } + resolve(stdout); + }); + spawnedProcess.on('error', (err) => reject(err)); + }).then((stdout) => { + // Sanitize just the text within commit subjects as that's the only potentially un-parseable text. + const sanitizedOutput = stdout.replace(/(?<="subject": ").*?(?="})/g, (subject) => (0, sanitizeStringForJSONParse_1.default)(subject)); + // Then remove newlines, format as JSON and convert to a proper JS object + const json = `[${sanitizedOutput}]`.replace(/(\r\n|\n|\r)/gm, '').replace('},]', '}]'); + return JSON.parse(json); + }); +} +/** + * Parse merged PRs, excluding those from irrelevant branches. + */ +function getValidMergedPRs(commits) { + const mergedPRs = new Set(); + commits.forEach((commit) => { + const author = commit.authorName; + if (author === CONST.OS_BOTIFY) { + return; + } + const match = commit.subject.match(/Merge pull request #(\d+) from (?!Expensify\/.*-cherry-pick-staging)/); + if (!Array.isArray(match) || match.length < 2) { + return; + } + const pr = Number.parseInt(match[1], 10); + if (mergedPRs.has(pr)) { + // If a PR shows up in the log twice, that means that the PR was deployed in the previous checklist. + // That also means that we don't want to include it in the current checklist, so we remove it now. + mergedPRs.delete(pr); + return; + } + mergedPRs.add(pr); + }); + return Array.from(mergedPRs); +} +/** + * Takes in two git tags and returns a list of PR numbers of all PRs merged between those two tags + */ +async function getPullRequestsMergedBetween(fromTag, toTag) { + console.log(`Looking for commits made between ${fromTag} and ${toTag}...`); + const commitList = await getCommitHistoryAsJSON(fromTag, toTag); + console.log(`Commits made between ${fromTag} and ${toTag}:`, commitList); + // Find which commit messages correspond to merged PR's + const pullRequestNumbers = getValidMergedPRs(commitList).sort((a, b) => a - b); + console.log(`List of pull requests merged between ${fromTag} and ${toTag}`, pullRequestNumbers); + return pullRequestNumbers; +} +exports["default"] = { + getValidMergedPRs, + getPullRequestsMergedBetween, +}; + + /***/ }), /***/ 2877: @@ -19226,6 +19228,34 @@ module.exports = JSON.parse('[[[0,44],"disallowed_STD3_valid"],[[45,46],"valid"] /******/ } /******/ /************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __nccwpck_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__nccwpck_require__.o(definition, key) && !__nccwpck_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __nccwpck_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __nccwpck_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ /******/ /* webpack/runtime/compat */ /******/ /******/ if (typeof __nccwpck_require__ !== 'undefined') __nccwpck_require__.ab = __dirname + "/"; diff --git a/.github/actions/javascript/getDeployPullRequestList/index.js b/.github/actions/javascript/getDeployPullRequestList/index.js index ac5d0e26998a..837dfd82adf1 100644 --- a/.github/actions/javascript/getDeployPullRequestList/index.js +++ b/.github/actions/javascript/getDeployPullRequestList/index.js @@ -11,7 +11,7 @@ const _ = __nccwpck_require__(5067); const core = __nccwpck_require__(2186); const github = __nccwpck_require__(5438); const ActionUtils = __nccwpck_require__(970); -const GitUtils = __nccwpck_require__(669); +const GitUtils = (__nccwpck_require__(1547)["default"]); const GithubUtils = __nccwpck_require__(7999); async function run() { @@ -120,163 +120,6 @@ CONST.APP_REPO_GIT_URL = `git@github.com:${CONST.GITHUB_OWNER}/${CONST.APP_REPO} module.exports = CONST; -/***/ }), - -/***/ 669: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const _ = __nccwpck_require__(5067); -const {spawn, execSync} = __nccwpck_require__(2081); -const CONST = __nccwpck_require__(4097); -const sanitizeStringForJSONParse = __nccwpck_require__(9338); -const {getPreviousVersion, SEMANTIC_VERSION_LEVELS} = __nccwpck_require__(8007); - -/** - * @param {String} tag - * @param {String} [shallowExcludeTag] when fetching the given tag, exclude all history reachable by the shallowExcludeTag (used to make fetch much faster) - */ -function fetchTag(tag, shallowExcludeTag = '') { - let shouldRetry = true; - let needsRepack = false; - while (shouldRetry) { - try { - let command = ''; - if (needsRepack) { - // We have seen some scenarios where this fixes the git fetch. - // Why? Who knows... https://github.com/Expensify/App/pull/31459 - command = 'git repack -d'; - console.log(`Running command: ${command}`); - execSync(command); - } - - command = `git fetch origin tag ${tag} --no-tags`; - - // Note that this condition is only ever NOT true in the 1.0.0-0 edge case - if (shallowExcludeTag && shallowExcludeTag !== tag) { - command += ` --shallow-exclude=${shallowExcludeTag}`; - } - - console.log(`Running command: ${command}`); - execSync(command); - shouldRetry = false; - } catch (e) { - console.error(e); - if (!needsRepack) { - console.log('Attempting to repack and retry...'); - needsRepack = true; - } else { - console.error("Repack didn't help, giving up..."); - shouldRetry = false; - } - } - } -} - -/** - * Get merge logs between two tags (inclusive) as a JavaScript object. - * - * @param {String} fromTag - * @param {String} toTag - * @returns {Promise>>} - */ -function getCommitHistoryAsJSON(fromTag, toTag) { - // Fetch tags, exclude commits reachable from the previous patch version (i.e: previous checklist), so that we don't have to fetch the full history - const previousPatchVersion = getPreviousVersion(fromTag, SEMANTIC_VERSION_LEVELS.PATCH); - fetchTag(fromTag, previousPatchVersion); - fetchTag(toTag, previousPatchVersion); - - console.log('Getting pull requests merged between the following tags:', fromTag, toTag); - return new Promise((resolve, reject) => { - let stdout = ''; - let stderr = ''; - const args = ['log', '--format={"commit": "%H", "authorName": "%an", "subject": "%s"},', `${fromTag}...${toTag}`]; - console.log(`Running command: git ${args.join(' ')}`); - const spawnedProcess = spawn('git', args); - spawnedProcess.on('message', console.log); - spawnedProcess.stdout.on('data', (chunk) => { - console.log(chunk.toString()); - stdout += chunk.toString(); - }); - spawnedProcess.stderr.on('data', (chunk) => { - console.error(chunk.toString()); - stderr += chunk.toString(); - }); - spawnedProcess.on('close', (code) => { - if (code !== 0) { - return reject(new Error(`${stderr}`)); - } - - resolve(stdout); - }); - spawnedProcess.on('error', (err) => reject(err)); - }).then((stdout) => { - // Sanitize just the text within commit subjects as that's the only potentially un-parseable text. - const sanitizedOutput = stdout.replace(/(?<="subject": ").*?(?="})/g, (subject) => sanitizeStringForJSONParse(subject)); - - // Then remove newlines, format as JSON and convert to a proper JS object - const json = `[${sanitizedOutput}]`.replace(/(\r\n|\n|\r)/gm, '').replace('},]', '}]'); - - return JSON.parse(json); - }); -} - -/** - * Parse merged PRs, excluding those from irrelevant branches. - * - * @param {Array>} commits - * @returns {Array} - */ -function getValidMergedPRs(commits) { - const mergedPRs = new Set(); - _.each(commits, (commit) => { - const author = commit.authorName; - if (author === CONST.OS_BOTIFY) { - return; - } - - const match = commit.subject.match(/Merge pull request #(\d+) from (?!Expensify\/.*-cherry-pick-staging)/); - if (!_.isArray(match) || match.length < 2) { - return; - } - - const pr = Number.parseInt(match[1], 10); - if (mergedPRs.has(pr)) { - // If a PR shows up in the log twice, that means that the PR was deployed in the previous checklist. - // That also means that we don't want to include it in the current checklist, so we remove it now. - mergedPRs.delete(pr); - return; - } - - mergedPRs.add(pr); - }); - - return Array.from(mergedPRs); -} - -/** - * Takes in two git tags and returns a list of PR numbers of all PRs merged between those two tags - * - * @param {String} fromTag - * @param {String} toTag - * @returns {Promise>} – Pull request numbers - */ -async function getPullRequestsMergedBetween(fromTag, toTag) { - console.log(`Looking for commits made between ${fromTag} and ${toTag}...`); - const commitList = await getCommitHistoryAsJSON(fromTag, toTag); - console.log(`Commits made between ${fromTag} and ${toTag}:`, commitList); - - // Find which commit messages correspond to merged PR's - const pullRequestNumbers = getValidMergedPRs(commitList).sort((a, b) => a - b); - console.log(`List of pull requests merged between ${fromTag} and ${toTag}`, pullRequestNumbers); - return pullRequestNumbers; -} - -module.exports = { - getValidMergedPRs, - getPullRequestsMergedBetween, -}; - - /***/ }), /***/ 7999: @@ -852,8 +695,20 @@ module.exports = function (inputString) { /***/ }), /***/ 8007: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +/***/ ((__unused_webpack_module, __webpack_exports__, __nccwpck_require__) => { +"use strict"; +__nccwpck_require__.r(__webpack_exports__); +/* harmony export */ __nccwpck_require__.d(__webpack_exports__, { +/* harmony export */ "MAX_INCREMENTS": () => (/* binding */ MAX_INCREMENTS), +/* harmony export */ "SEMANTIC_VERSION_LEVELS": () => (/* binding */ SEMANTIC_VERSION_LEVELS), +/* harmony export */ "getPreviousVersion": () => (/* binding */ getPreviousVersion), +/* harmony export */ "getVersionNumberFromString": () => (/* binding */ getVersionNumberFromString), +/* harmony export */ "getVersionStringFromNumber": () => (/* binding */ getVersionStringFromNumber), +/* harmony export */ "incrementMinor": () => (/* binding */ incrementMinor), +/* harmony export */ "incrementPatch": () => (/* binding */ incrementPatch), +/* harmony export */ "incrementVersion": () => (/* binding */ incrementVersion) +/* harmony export */ }); const _ = __nccwpck_require__(5067); const SEMANTIC_VERSION_LEVELS = { @@ -921,8 +776,8 @@ const incrementPatch = (major, minor, patch) => { /** * Increments a build version * - * @param {Number} version - * @param {Number} level + * @param {String} version + * @param {String} level * @returns {String} */ const incrementVersion = (version, level) => { @@ -983,18 +838,7 @@ function getPreviousVersion(currentVersion, level) { return getVersionStringFromNumber(major, minor, patch, build - 1); } -module.exports = { - getVersionNumberFromString, - getVersionStringFromNumber, - incrementVersion, - - // For tests - MAX_INCREMENTS, - SEMANTIC_VERSION_LEVELS, - incrementMinor, - incrementPatch, - getPreviousVersion, -}; + /***/ }), @@ -14068,6 +13912,164 @@ function wrappy (fn, cb) { } +/***/ }), + +/***/ 1547: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +const child_process_1 = __nccwpck_require__(2081); +const CONST = __importStar(__nccwpck_require__(4097)); +const sanitizeStringForJSONParse_1 = __importDefault(__nccwpck_require__(9338)); +const VERSION_UPDATER = __importStar(__nccwpck_require__(8007)); +/** + * When fetching the given tag, exclude all history reachable by the shallowExcludeTag (used to make fetch much faster) + */ +function fetchTag(tag, shallowExcludeTag = '') { + let shouldRetry = true; + let needsRepack = false; + while (shouldRetry) { + try { + let command = ''; + if (needsRepack) { + // We have seen some scenarios where this fixes the git fetch. + // Why? Who knows... https://github.com/Expensify/App/pull/31459 + command = 'git repack -d'; + console.log(`Running command: ${command}`); + (0, child_process_1.execSync)(command); + } + command = `git fetch origin tag ${tag} --no-tags`; + // Note that this condition is only ever NOT true in the 1.0.0-0 edge case + if (shallowExcludeTag && shallowExcludeTag !== tag) { + command += ` --shallow-exclude=${shallowExcludeTag}`; + } + console.log(`Running command: ${command}`); + (0, child_process_1.execSync)(command); + shouldRetry = false; + } + catch (e) { + console.error(e); + if (!needsRepack) { + console.log('Attempting to repack and retry...'); + needsRepack = true; + } + else { + console.error("Repack didn't help, giving up..."); + shouldRetry = false; + } + } + } +} +/** + * Get merge logs between two tags (inclusive) as a JavaScript object. + */ +function getCommitHistoryAsJSON(fromTag, toTag) { + // Fetch tags, exclude commits reachable from the previous patch version (i.e: previous checklist), so that we don't have to fetch the full history + const previousPatchVersion = VERSION_UPDATER.getPreviousVersion(fromTag, VERSION_UPDATER.SEMANTIC_VERSION_LEVELS.PATCH); + fetchTag(fromTag, previousPatchVersion); + fetchTag(toTag, previousPatchVersion); + console.log('Getting pull requests merged between the following tags:', fromTag, toTag); + return new Promise((resolve, reject) => { + let stdout = ''; + let stderr = ''; + const args = ['log', '--format={"commit": "%H", "authorName": "%an", "subject": "%s"},', `${fromTag}...${toTag}`]; + console.log(`Running command: git ${args.join(' ')}`); + const spawnedProcess = (0, child_process_1.spawn)('git', args); + spawnedProcess.on('message', console.log); + spawnedProcess.stdout.on('data', (chunk) => { + console.log(chunk.toString()); + stdout += chunk.toString(); + }); + spawnedProcess.stderr.on('data', (chunk) => { + console.error(chunk.toString()); + stderr += chunk.toString(); + }); + spawnedProcess.on('close', (code) => { + if (code !== 0) { + return reject(new Error(`${stderr}`)); + } + resolve(stdout); + }); + spawnedProcess.on('error', (err) => reject(err)); + }).then((stdout) => { + // Sanitize just the text within commit subjects as that's the only potentially un-parseable text. + const sanitizedOutput = stdout.replace(/(?<="subject": ").*?(?="})/g, (subject) => (0, sanitizeStringForJSONParse_1.default)(subject)); + // Then remove newlines, format as JSON and convert to a proper JS object + const json = `[${sanitizedOutput}]`.replace(/(\r\n|\n|\r)/gm, '').replace('},]', '}]'); + return JSON.parse(json); + }); +} +/** + * Parse merged PRs, excluding those from irrelevant branches. + */ +function getValidMergedPRs(commits) { + const mergedPRs = new Set(); + commits.forEach((commit) => { + const author = commit.authorName; + if (author === CONST.OS_BOTIFY) { + return; + } + const match = commit.subject.match(/Merge pull request #(\d+) from (?!Expensify\/.*-cherry-pick-staging)/); + if (!Array.isArray(match) || match.length < 2) { + return; + } + const pr = Number.parseInt(match[1], 10); + if (mergedPRs.has(pr)) { + // If a PR shows up in the log twice, that means that the PR was deployed in the previous checklist. + // That also means that we don't want to include it in the current checklist, so we remove it now. + mergedPRs.delete(pr); + return; + } + mergedPRs.add(pr); + }); + return Array.from(mergedPRs); +} +/** + * Takes in two git tags and returns a list of PR numbers of all PRs merged between those two tags + */ +async function getPullRequestsMergedBetween(fromTag, toTag) { + console.log(`Looking for commits made between ${fromTag} and ${toTag}...`); + const commitList = await getCommitHistoryAsJSON(fromTag, toTag); + console.log(`Commits made between ${fromTag} and ${toTag}:`, commitList); + // Find which commit messages correspond to merged PR's + const pullRequestNumbers = getValidMergedPRs(commitList).sort((a, b) => a - b); + console.log(`List of pull requests merged between ${fromTag} and ${toTag}`, pullRequestNumbers); + return pullRequestNumbers; +} +exports["default"] = { + getValidMergedPRs, + getPullRequestsMergedBetween, +}; + + /***/ }), /***/ 2877: @@ -16430,6 +16432,34 @@ module.exports = JSON.parse('[[[0,44],"disallowed_STD3_valid"],[[45,46],"valid"] /******/ } /******/ /************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __nccwpck_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__nccwpck_require__.o(definition, key) && !__nccwpck_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __nccwpck_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __nccwpck_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ /******/ /* webpack/runtime/compat */ /******/ /******/ if (typeof __nccwpck_require__ !== 'undefined') __nccwpck_require__.ab = __dirname + "/"; diff --git a/.github/actions/javascript/getPreviousVersion/index.js b/.github/actions/javascript/getPreviousVersion/index.js index 63498e68fcdf..545f4472ec72 100644 --- a/.github/actions/javascript/getPreviousVersion/index.js +++ b/.github/actions/javascript/getPreviousVersion/index.js @@ -5,8 +5,20 @@ /******/ var __webpack_modules__ = ({ /***/ 7: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +/***/ ((__unused_webpack_module, __webpack_exports__, __nccwpck_require__) => { +"use strict"; +__nccwpck_require__.r(__webpack_exports__); +/* harmony export */ __nccwpck_require__.d(__webpack_exports__, { +/* harmony export */ "MAX_INCREMENTS": () => (/* binding */ MAX_INCREMENTS), +/* harmony export */ "SEMANTIC_VERSION_LEVELS": () => (/* binding */ SEMANTIC_VERSION_LEVELS), +/* harmony export */ "getPreviousVersion": () => (/* binding */ getPreviousVersion), +/* harmony export */ "getVersionNumberFromString": () => (/* binding */ getVersionNumberFromString), +/* harmony export */ "getVersionStringFromNumber": () => (/* binding */ getVersionStringFromNumber), +/* harmony export */ "incrementMinor": () => (/* binding */ incrementMinor), +/* harmony export */ "incrementPatch": () => (/* binding */ incrementPatch), +/* harmony export */ "incrementVersion": () => (/* binding */ incrementVersion) +/* harmony export */ }); const _ = __nccwpck_require__(67); const SEMANTIC_VERSION_LEVELS = { @@ -74,8 +86,8 @@ const incrementPatch = (major, minor, patch) => { /** * Increments a build version * - * @param {Number} version - * @param {Number} level + * @param {String} version + * @param {String} level * @returns {String} */ const incrementVersion = (version, level) => { @@ -136,18 +148,7 @@ function getPreviousVersion(currentVersion, level) { return getVersionStringFromNumber(major, minor, patch, build - 1); } -module.exports = { - getVersionNumberFromString, - getVersionStringFromNumber, - incrementVersion, - // For tests - MAX_INCREMENTS, - SEMANTIC_VERSION_LEVELS, - incrementMinor, - incrementPatch, - getPreviousVersion, -}; /***/ }), @@ -5143,6 +5144,34 @@ module.exports = underscoreNodeF._; /******/ } /******/ /************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __nccwpck_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__nccwpck_require__.o(definition, key) && !__nccwpck_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __nccwpck_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __nccwpck_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ /******/ /* webpack/runtime/compat */ /******/ /******/ if (typeof __nccwpck_require__ !== 'undefined') __nccwpck_require__.ab = __dirname + "/"; diff --git a/.github/actions/javascript/verifySignedCommits/index.js b/.github/actions/javascript/verifySignedCommits/index.js index 61b0e2063d30..f32bda6bae1e 100644 --- a/.github/actions/javascript/verifySignedCommits/index.js +++ b/.github/actions/javascript/verifySignedCommits/index.js @@ -1,6 +1,7 @@ /** * NOTE: This is a compiled file. DO NOT directly edit this file. */ +import { createRequire as __WEBPACK_EXTERNAL_createRequire } from "module"; /******/ (() => { // webpackBootstrap /******/ var __webpack_modules__ = ({ @@ -13649,7 +13650,7 @@ module.exports = eval("require")("encoding"); /***/ ((module) => { "use strict"; -module.exports = require("assert"); +module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("assert"); /***/ }), @@ -13657,7 +13658,7 @@ module.exports = require("assert"); /***/ ((module) => { "use strict"; -module.exports = require("crypto"); +module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("crypto"); /***/ }), @@ -13665,7 +13666,7 @@ module.exports = require("crypto"); /***/ ((module) => { "use strict"; -module.exports = require("events"); +module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("events"); /***/ }), @@ -13673,7 +13674,7 @@ module.exports = require("events"); /***/ ((module) => { "use strict"; -module.exports = require("fs"); +module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("fs"); /***/ }), @@ -13681,7 +13682,7 @@ module.exports = require("fs"); /***/ ((module) => { "use strict"; -module.exports = require("http"); +module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("http"); /***/ }), @@ -13689,7 +13690,7 @@ module.exports = require("http"); /***/ ((module) => { "use strict"; -module.exports = require("https"); +module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("https"); /***/ }), @@ -13697,7 +13698,7 @@ module.exports = require("https"); /***/ ((module) => { "use strict"; -module.exports = require("net"); +module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("net"); /***/ }), @@ -13705,7 +13706,7 @@ module.exports = require("net"); /***/ ((module) => { "use strict"; -module.exports = require("os"); +module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("os"); /***/ }), @@ -13713,7 +13714,7 @@ module.exports = require("os"); /***/ ((module) => { "use strict"; -module.exports = require("path"); +module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("path"); /***/ }), @@ -13721,7 +13722,7 @@ module.exports = require("path"); /***/ ((module) => { "use strict"; -module.exports = require("punycode"); +module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("punycode"); /***/ }), @@ -13729,7 +13730,7 @@ module.exports = require("punycode"); /***/ ((module) => { "use strict"; -module.exports = require("stream"); +module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("stream"); /***/ }), @@ -13737,7 +13738,7 @@ module.exports = require("stream"); /***/ ((module) => { "use strict"; -module.exports = require("tls"); +module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("tls"); /***/ }), @@ -13745,7 +13746,7 @@ module.exports = require("tls"); /***/ ((module) => { "use strict"; -module.exports = require("url"); +module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("url"); /***/ }), @@ -13753,7 +13754,7 @@ module.exports = require("url"); /***/ ((module) => { "use strict"; -module.exports = require("util"); +module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("util"); /***/ }), @@ -13761,7 +13762,7 @@ module.exports = require("util"); /***/ ((module) => { "use strict"; -module.exports = require("zlib"); +module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("zlib"); /***/ }), From a2663b81cc872df4c5d4eb684d1525e737dd062b Mon Sep 17 00:00:00 2001 From: Yauheni Date: Tue, 13 Feb 2024 13:39:05 +0100 Subject: [PATCH 156/288] Update condition for UserListItem icons --- src/components/SelectionList/UserListItem.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/SelectionList/UserListItem.tsx b/src/components/SelectionList/UserListItem.tsx index c9fb9a92f9fb..3fd61177aa6a 100644 --- a/src/components/SelectionList/UserListItem.tsx +++ b/src/components/SelectionList/UserListItem.tsx @@ -21,7 +21,7 @@ function UserListItem({item, textStyles, alternateTextStyles, showTooltip, style <> {!!item.icons && ( <> - {item.shouldShowSubscript ?? shouldUseOnySubscriptAvatar ? ( + {shouldUseOnySubscriptAvatar || item.shouldShowSubscript ? ( Date: Tue, 13 Feb 2024 14:20:48 +0100 Subject: [PATCH 157/288] GH actions fix --- .../javascript/authorChecklist/index.js | 33 +++++++++---------- .../javascript/verifySignedCommits/index.js | 31 +++++++++-------- 2 files changed, 31 insertions(+), 33 deletions(-) diff --git a/.github/actions/javascript/authorChecklist/index.js b/.github/actions/javascript/authorChecklist/index.js index 26277693e888..137020670c10 100644 --- a/.github/actions/javascript/authorChecklist/index.js +++ b/.github/actions/javascript/authorChecklist/index.js @@ -1,7 +1,6 @@ /** * NOTE: This is a compiled file. DO NOT directly edit this file. */ -import { createRequire as __WEBPACK_EXTERNAL_createRequire } from "module"; /******/ (() => { // webpackBootstrap /******/ var __webpack_modules__ = ({ @@ -18687,7 +18686,7 @@ module.exports = eval("require")("encoding"); /***/ ((module) => { "use strict"; -module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("assert"); +module.exports = require("assert"); /***/ }), @@ -18695,7 +18694,7 @@ module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("assert"); /***/ ((module) => { "use strict"; -module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("crypto"); +module.exports = require("crypto"); /***/ }), @@ -18703,7 +18702,7 @@ module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("crypto"); /***/ ((module) => { "use strict"; -module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("events"); +module.exports = require("events"); /***/ }), @@ -18711,7 +18710,7 @@ module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("events"); /***/ ((module) => { "use strict"; -module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("fs"); +module.exports = require("fs"); /***/ }), @@ -18719,7 +18718,7 @@ module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("fs"); /***/ ((module) => { "use strict"; -module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("http"); +module.exports = require("http"); /***/ }), @@ -18727,7 +18726,7 @@ module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("http"); /***/ ((module) => { "use strict"; -module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("https"); +module.exports = require("https"); /***/ }), @@ -18735,7 +18734,7 @@ module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("https"); /***/ ((module) => { "use strict"; -module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("net"); +module.exports = require("net"); /***/ }), @@ -18743,7 +18742,7 @@ module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("net"); /***/ ((module) => { "use strict"; -module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("os"); +module.exports = require("os"); /***/ }), @@ -18751,7 +18750,7 @@ module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("os"); /***/ ((module) => { "use strict"; -module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("path"); +module.exports = require("path"); /***/ }), @@ -18759,7 +18758,7 @@ module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("path"); /***/ ((module) => { "use strict"; -module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("punycode"); +module.exports = require("punycode"); /***/ }), @@ -18767,7 +18766,7 @@ module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("punycode"); /***/ ((module) => { "use strict"; -module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("stream"); +module.exports = require("stream"); /***/ }), @@ -18775,7 +18774,7 @@ module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("stream"); /***/ ((module) => { "use strict"; -module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("tls"); +module.exports = require("tls"); /***/ }), @@ -18783,7 +18782,7 @@ module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("tls"); /***/ ((module) => { "use strict"; -module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("tty"); +module.exports = require("tty"); /***/ }), @@ -18791,7 +18790,7 @@ module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("tty"); /***/ ((module) => { "use strict"; -module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("url"); +module.exports = require("url"); /***/ }), @@ -18799,7 +18798,7 @@ module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("url"); /***/ ((module) => { "use strict"; -module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("util"); +module.exports = require("util"); /***/ }), @@ -18807,7 +18806,7 @@ module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("util"); /***/ ((module) => { "use strict"; -module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("zlib"); +module.exports = require("zlib"); /***/ }), diff --git a/.github/actions/javascript/verifySignedCommits/index.js b/.github/actions/javascript/verifySignedCommits/index.js index f32bda6bae1e..61b0e2063d30 100644 --- a/.github/actions/javascript/verifySignedCommits/index.js +++ b/.github/actions/javascript/verifySignedCommits/index.js @@ -1,7 +1,6 @@ /** * NOTE: This is a compiled file. DO NOT directly edit this file. */ -import { createRequire as __WEBPACK_EXTERNAL_createRequire } from "module"; /******/ (() => { // webpackBootstrap /******/ var __webpack_modules__ = ({ @@ -13650,7 +13649,7 @@ module.exports = eval("require")("encoding"); /***/ ((module) => { "use strict"; -module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("assert"); +module.exports = require("assert"); /***/ }), @@ -13658,7 +13657,7 @@ module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("assert"); /***/ ((module) => { "use strict"; -module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("crypto"); +module.exports = require("crypto"); /***/ }), @@ -13666,7 +13665,7 @@ module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("crypto"); /***/ ((module) => { "use strict"; -module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("events"); +module.exports = require("events"); /***/ }), @@ -13674,7 +13673,7 @@ module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("events"); /***/ ((module) => { "use strict"; -module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("fs"); +module.exports = require("fs"); /***/ }), @@ -13682,7 +13681,7 @@ module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("fs"); /***/ ((module) => { "use strict"; -module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("http"); +module.exports = require("http"); /***/ }), @@ -13690,7 +13689,7 @@ module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("http"); /***/ ((module) => { "use strict"; -module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("https"); +module.exports = require("https"); /***/ }), @@ -13698,7 +13697,7 @@ module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("https"); /***/ ((module) => { "use strict"; -module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("net"); +module.exports = require("net"); /***/ }), @@ -13706,7 +13705,7 @@ module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("net"); /***/ ((module) => { "use strict"; -module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("os"); +module.exports = require("os"); /***/ }), @@ -13714,7 +13713,7 @@ module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("os"); /***/ ((module) => { "use strict"; -module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("path"); +module.exports = require("path"); /***/ }), @@ -13722,7 +13721,7 @@ module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("path"); /***/ ((module) => { "use strict"; -module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("punycode"); +module.exports = require("punycode"); /***/ }), @@ -13730,7 +13729,7 @@ module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("punycode"); /***/ ((module) => { "use strict"; -module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("stream"); +module.exports = require("stream"); /***/ }), @@ -13738,7 +13737,7 @@ module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("stream"); /***/ ((module) => { "use strict"; -module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("tls"); +module.exports = require("tls"); /***/ }), @@ -13746,7 +13745,7 @@ module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("tls"); /***/ ((module) => { "use strict"; -module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("url"); +module.exports = require("url"); /***/ }), @@ -13754,7 +13753,7 @@ module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("url"); /***/ ((module) => { "use strict"; -module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("util"); +module.exports = require("util"); /***/ }), @@ -13762,7 +13761,7 @@ module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("util"); /***/ ((module) => { "use strict"; -module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("zlib"); +module.exports = require("zlib"); /***/ }), From 43e97c2bf8fc52ce90292f88447bf2f15b0d6b58 Mon Sep 17 00:00:00 2001 From: Filip Solecki Date: Tue, 13 Feb 2024 14:30:17 +0100 Subject: [PATCH 158/288] Change method of ts-node install --- .github/workflows/test.yml | 3 +++ tests/unit/CIGitLogicTest.sh | 3 --- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 6540a0fdd583..9e4891b4662e 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -62,5 +62,8 @@ jobs: - name: Setup Node uses: ./.github/actions/composite/setupNode + - name: Install ts-node + uses: npm i ts-node + - name: Test CI git logic run: tests/unit/CIGitLogicTest.sh diff --git a/tests/unit/CIGitLogicTest.sh b/tests/unit/CIGitLogicTest.sh index 49a916d7b9dc..73fd01f5c0a0 100755 --- a/tests/unit/CIGitLogicTest.sh +++ b/tests/unit/CIGitLogicTest.sh @@ -76,7 +76,6 @@ function bump_version { info "Bumping version..." setup_git_as_osbotify git switch main - npm i ts-node npm --no-git-tag-version version "$(ts-node "$bumpVersion" "$(print_version)" "$1")" git add package.json package-lock.json git commit -m "Update version to $(print_version)" @@ -143,7 +142,6 @@ function cherry_pick_pr { checkout_repo setup_git_as_osbotify - npm i ts-node PREVIOUS_PATCH_VERSION="$(ts-node "$getPreviousVersion" "$(print_version)" "$SEMVER_LEVEL_PATCH")" git fetch origin main staging --no-tags --shallow-exclude="$PREVIOUS_PATCH_VERSION" @@ -203,7 +201,6 @@ function deploy_production { function assert_prs_merged_between { checkout_repo - npm i ts-node output=$(ts-node "$getPullRequestsMergedBetween" "$1" "$2") info "Checking output of getPullRequestsMergedBetween $1 $2" assert_equal "$output" "$3" From 7fd32965c786992a7e87651eee8455f9f04da9e6 Mon Sep 17 00:00:00 2001 From: Filip Solecki Date: Tue, 13 Feb 2024 14:50:33 +0100 Subject: [PATCH 159/288] Fix test.yml --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9e4891b4662e..4f0203ec5e09 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -63,7 +63,7 @@ jobs: uses: ./.github/actions/composite/setupNode - name: Install ts-node - uses: npm i ts-node + run: npm i ts-node - name: Test CI git logic run: tests/unit/CIGitLogicTest.sh From 381320cee46c0054b8450a4a5e2a7e1d41473b56 Mon Sep 17 00:00:00 2001 From: Filip Solecki Date: Tue, 13 Feb 2024 14:59:54 +0100 Subject: [PATCH 160/288] install ts-node globally --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 4f0203ec5e09..bdc14950a337 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -63,7 +63,7 @@ jobs: uses: ./.github/actions/composite/setupNode - name: Install ts-node - run: npm i ts-node + run: npm i -g ts-node - name: Test CI git logic run: tests/unit/CIGitLogicTest.sh From 34309fea6afc2973cc92ef6481d9531cc21ac3a7 Mon Sep 17 00:00:00 2001 From: Yauheni Date: Tue, 13 Feb 2024 17:08:03 +0100 Subject: [PATCH 161/288] Remove shouldUseOnySubscriptAvatar --- src/components/SelectionList/BaseListItem.tsx | 2 -- src/components/SelectionList/BaseSelectionList.tsx | 2 -- src/components/SelectionList/UserListItem.tsx | 4 ++-- src/components/SelectionList/types.ts | 7 ------- src/pages/SearchPage/index.js | 1 - 5 files changed, 2 insertions(+), 14 deletions(-) diff --git a/src/components/SelectionList/BaseListItem.tsx b/src/components/SelectionList/BaseListItem.tsx index 553fee4887db..0290d7bfda98 100644 --- a/src/components/SelectionList/BaseListItem.tsx +++ b/src/components/SelectionList/BaseListItem.tsx @@ -25,7 +25,6 @@ function BaseListItem({ onDismissError = () => {}, rightHandSideComponent, keyForList, - shouldUseOnySubscriptAvatar = true, }: BaseListItemProps) { const theme = useTheme(); const styles = useThemeStyles(); @@ -118,7 +117,6 @@ function BaseListItem({ showTooltip={showTooltip} isFocused={isFocused} isHovered={hovered} - shouldUseOnySubscriptAvatar={shouldUseOnySubscriptAvatar} /> {!canSelectMultiple && item.isSelected && !rightHandSideComponent && ( diff --git a/src/components/SelectionList/BaseSelectionList.tsx b/src/components/SelectionList/BaseSelectionList.tsx index 3a052bc2be1e..c77e244b4c92 100644 --- a/src/components/SelectionList/BaseSelectionList.tsx +++ b/src/components/SelectionList/BaseSelectionList.tsx @@ -60,7 +60,6 @@ function BaseSelectionList( rightHandSideComponent, isLoadingNewOptions = false, onLayout, - shouldUseOnySubscriptAvatar = true, }: BaseSelectionListProps, inputRef: ForwardedRef, ) { @@ -301,7 +300,6 @@ function BaseSelectionList( shouldPreventDefaultFocusOnSelectRow={shouldPreventDefaultFocusOnSelectRow} rightHandSideComponent={rightHandSideComponent} keyForList={item.keyForList} - shouldUseOnySubscriptAvatar={shouldUseOnySubscriptAvatar} /> ); }; diff --git a/src/components/SelectionList/UserListItem.tsx b/src/components/SelectionList/UserListItem.tsx index 3fd61177aa6a..f48f9e04077a 100644 --- a/src/components/SelectionList/UserListItem.tsx +++ b/src/components/SelectionList/UserListItem.tsx @@ -8,7 +8,7 @@ import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; import type {UserListItemProps} from './types'; -function UserListItem({item, textStyles, alternateTextStyles, showTooltip, style, isFocused, isHovered, shouldUseOnySubscriptAvatar = true}: UserListItemProps) { +function UserListItem({item, textStyles, alternateTextStyles, showTooltip, style, isFocused, isHovered}: UserListItemProps) { const styles = useThemeStyles(); const theme = useTheme(); const StyleUtils = useStyleUtils(); @@ -21,7 +21,7 @@ function UserListItem({item, textStyles, alternateTextStyles, showTooltip, style <> {!!item.icons && ( <> - {shouldUseOnySubscriptAvatar || item.shouldShowSubscript ? ( + {item.shouldShowSubscript ? ( & { /** Is item hovered */ isHovered?: boolean; - - /** Whether this item should use only the subscript avatar */ - shouldUseOnySubscriptAvatar?: boolean; }; type RadioItem = { @@ -124,7 +121,6 @@ type BaseListItemProps = CommonListItemProps = { @@ -249,9 +245,6 @@ type BaseSelectionListProps = Partial void; - - /** Whether this item should use only the subscript avatar */ - shouldUseOnySubscriptAvatar?: boolean; }; type ItemLayout = { diff --git a/src/pages/SearchPage/index.js b/src/pages/SearchPage/index.js index d9cae3ff8496..7c472296dfe1 100644 --- a/src/pages/SearchPage/index.js +++ b/src/pages/SearchPage/index.js @@ -164,7 +164,6 @@ function SearchPage({betas, reports, isSearchingForReports}) { showLoadingPlaceholder={!didScreenTransitionEnd || !isOptionsDataReady} footerContent={SearchPageFooterInstance} isLoadingNewOptions={isSearchingForReports} - shouldUseOnySubscriptAvatar={false} /> From 7e0f064d5f962823577aab20dac9bfba303ff000 Mon Sep 17 00:00:00 2001 From: dukenv0307 Date: Tue, 13 Feb 2024 23:45:54 +0700 Subject: [PATCH 162/288] fix lint --- src/pages/ShareCodePage.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/pages/ShareCodePage.tsx b/src/pages/ShareCodePage.tsx index fa56338939a4..36bdb2d1e2b6 100644 --- a/src/pages/ShareCodePage.tsx +++ b/src/pages/ShareCodePage.tsx @@ -131,7 +131,9 @@ function ShareCodePage({report, session, currentUserPersonalDetails}: ShareCodeP Navigation.navigate(ROUTES.REFERRAL_DETAILS_MODAL.getRoute(CONST.REFERRAL_PROGRAM.CONTENT_TYPES.SHARE_CODE, Navigation.getActiveRouteWithoutParams()))} + onPress={() => + Navigation.navigate(ROUTES.REFERRAL_DETAILS_MODAL.getRoute(CONST.REFERRAL_PROGRAM.CONTENT_TYPES.SHARE_CODE, Navigation.getActiveRouteWithoutParams())) + } wrapperStyle={themeStyles.sectionMenuItemTopDescription} shouldShowRightIcon /> From 78aa67e4b0b741eede868a756d2f9a8d8a7f1fe7 Mon Sep 17 00:00:00 2001 From: Jakub Butkiewicz Date: Tue, 13 Feb 2024 17:47:17 +0100 Subject: [PATCH 163/288] fix: comments --- tests/e2e/testRunner.js | 1 - tests/e2e/utils/launchApp.ts | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/e2e/testRunner.js b/tests/e2e/testRunner.js index fbd2261d6bbd..332fe0a3f164 100644 --- a/tests/e2e/testRunner.js +++ b/tests/e2e/testRunner.js @@ -1,4 +1,3 @@ -// const launchApp = require('./utils/launchApp'); import launchApp from './utils/launchApp'; /** diff --git a/tests/e2e/utils/launchApp.ts b/tests/e2e/utils/launchApp.ts index 863462e13eaf..d139698185af 100644 --- a/tests/e2e/utils/launchApp.ts +++ b/tests/e2e/utils/launchApp.ts @@ -2,14 +2,13 @@ import {ACTIVITY_PATH, MAIN_APP_PACKAGE} from '../config'; import execAsync from './execAsync'; -const launchApp = (platform = 'android', packageName = MAIN_APP_PACKAGE, activityPath = ACTIVITY_PATH, launchArgs = {}) => { +const launchApp = (platform = 'android', packageName = MAIN_APP_PACKAGE, activityPath = ACTIVITY_PATH, launchArgs: Record = {}) => { if (platform !== 'android') { throw new Error(`launchApp() missing implementation for platform: ${platform}`); } // Use adb to start the app const launchArgsString = Object.keys(launchArgs) - // @ts-expect-error - yes .map((key) => `${typeof launchArgs[key] === 'boolean' ? '--ez' : '--es'} ${key} ${launchArgs[key]}`) .join(' '); return execAsync(`adb shell am start -n ${packageName}/${activityPath} ${launchArgsString}`); From e9058ade37a3d88f6abe196ae1fec546e559d19a Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Tue, 13 Feb 2024 16:31:08 -0500 Subject: [PATCH 164/288] fix imports --- src/components/ReportActionItem/MoneyRequestView.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/ReportActionItem/MoneyRequestView.tsx b/src/components/ReportActionItem/MoneyRequestView.tsx index 23ba0a1c084d..bf32f8344240 100644 --- a/src/components/ReportActionItem/MoneyRequestView.tsx +++ b/src/components/ReportActionItem/MoneyRequestView.tsx @@ -36,8 +36,7 @@ import type {TranslationPaths} from '@src/languages/types'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; import type * as OnyxTypes from '@src/types/onyx'; -import type {Errors} from '@src/types/onyx/OnyxCommon'; -import type {ReceiptErrors, TransactionPendingFieldsKey} from '@src/types/onyx/Transaction'; +import type {TransactionPendingFieldsKey} from '@src/types/onyx/Transaction'; import ReportActionItemImage from './ReportActionItemImage'; type MoneyRequestViewTransactionOnyxProps = { From 512e599bc0808d83e1dce82f24ec49c08a319e7b Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Tue, 13 Feb 2024 16:35:53 -0500 Subject: [PATCH 165/288] fix(Violations): remove unneeded default value --- src/languages/en.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/languages/en.ts b/src/languages/en.ts index 9deae59dbc3a..2e631aad839a 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -2268,7 +2268,7 @@ export default { maxAge: ({maxAge}: ViolationsMaxAgeParams) => `Date older than ${maxAge} days`, missingCategory: 'Missing category', missingComment: 'Description required for selected category', - missingTag: ({tagName}: ViolationsMissingTagParams = {}) => `Missing ${tagName ?? 'tag'}`, + missingTag: ({tagName}: ViolationsMissingTagParams) => `Missing ${tagName ?? 'tag'}`, modifiedAmount: 'Amount greater than scanned receipt', modifiedDate: 'Date differs from scanned receipt', nonExpensiworksExpense: 'Non-Expensiworks expense', From b4ee4f23f9f9b713bd3651f5e2ee735e4dce647b Mon Sep 17 00:00:00 2001 From: Bernhard Owen Josephus Date: Wed, 14 Feb 2024 11:59:22 +0800 Subject: [PATCH 166/288] fix skeleton vertical position --- src/components/ReportHeaderSkeletonView.tsx | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/components/ReportHeaderSkeletonView.tsx b/src/components/ReportHeaderSkeletonView.tsx index 5332e0c5032c..109904e5b589 100644 --- a/src/components/ReportHeaderSkeletonView.tsx +++ b/src/components/ReportHeaderSkeletonView.tsx @@ -5,7 +5,6 @@ import useLocalize from '@hooks/useLocalize'; import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; import useWindowDimensions from '@hooks/useWindowDimensions'; -import variables from '@styles/variables'; import CONST from '@src/CONST'; import Icon from './Icon'; import * as Expensicons from './Icon/Expensicons'; @@ -22,9 +21,12 @@ function ReportHeaderSkeletonView({shouldAnimate = true, onBackButtonPress = () const styles = useThemeStyles(); const {translate} = useLocalize(); const {isSmallScreenWidth} = useWindowDimensions(); + const smallScreenHeight = styles.appContentHeader.height; + const height = !isSmallScreenWidth ? styles.headerBarDesktopHeight.height : smallScreenHeight; + const heightDiff = height - smallScreenHeight; return ( - + {isSmallScreenWidth && ( From ebca48acf1636bad7f64bd01f419636497307fc6 Mon Sep 17 00:00:00 2001 From: Bernhard Owen Josephus Date: Wed, 14 Feb 2024 12:21:20 +0800 Subject: [PATCH 167/288] fix skeleton vertical position --- src/components/ReportHeaderSkeletonView.tsx | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/components/ReportHeaderSkeletonView.tsx b/src/components/ReportHeaderSkeletonView.tsx index 109904e5b589..bc4eef675170 100644 --- a/src/components/ReportHeaderSkeletonView.tsx +++ b/src/components/ReportHeaderSkeletonView.tsx @@ -23,7 +23,10 @@ function ReportHeaderSkeletonView({shouldAnimate = true, onBackButtonPress = () const {isSmallScreenWidth} = useWindowDimensions(); const smallScreenHeight = styles.appContentHeader.height; const height = !isSmallScreenWidth ? styles.headerBarDesktopHeight.height : smallScreenHeight; - const heightDiff = height - smallScreenHeight; + const radius = 20; + const circleY = height / 2; + const circleTopY = circleY - radius; + const circleBottomY = circleY + radius; return ( @@ -51,17 +54,17 @@ function ReportHeaderSkeletonView({shouldAnimate = true, onBackButtonPress = () From 02d31b1faac69c8044b4d23440382c80de27f4aa Mon Sep 17 00:00:00 2001 From: Bernhard Owen Josephus Date: Wed, 14 Feb 2024 12:30:46 +0800 Subject: [PATCH 168/288] prevent swipe when selecting text --- src/components/AmountTextInput.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/AmountTextInput.tsx b/src/components/AmountTextInput.tsx index 05080fcdd21c..245aa2126d08 100644 --- a/src/components/AmountTextInput.tsx +++ b/src/components/AmountTextInput.tsx @@ -43,6 +43,7 @@ function AmountTextInput( disableKeyboard autoGrow hideFocusedState + shouldInterceptSwipe inputStyle={[styles.iouAmountTextInput, styles.p0, styles.noLeftBorderRadius, styles.noRightBorderRadius, style]} textInputContainerStyles={[styles.borderNone, styles.noLeftBorderRadius, styles.noRightBorderRadius]} onChangeText={onChangeAmount} From 44106acf99b3dbbf6716130601e5aef815ee31f1 Mon Sep 17 00:00:00 2001 From: Bernhard Owen Josephus Date: Wed, 14 Feb 2024 12:30:57 +0800 Subject: [PATCH 169/288] remove intercept swipe from native input --- src/components/TextInput/BaseTextInput/index.native.tsx | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/components/TextInput/BaseTextInput/index.native.tsx b/src/components/TextInput/BaseTextInput/index.native.tsx index 9e169ab2464a..7b46019600bc 100644 --- a/src/components/TextInput/BaseTextInput/index.native.tsx +++ b/src/components/TextInput/BaseTextInput/index.native.tsx @@ -264,11 +264,7 @@ function BaseTextInput( return ( <> - + Date: Wed, 14 Feb 2024 13:38:47 +0800 Subject: [PATCH 170/288] lint --- src/components/TextInput/BaseTextInput/index.native.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/components/TextInput/BaseTextInput/index.native.tsx b/src/components/TextInput/BaseTextInput/index.native.tsx index 7b46019600bc..e7f4507df7c6 100644 --- a/src/components/TextInput/BaseTextInput/index.native.tsx +++ b/src/components/TextInput/BaseTextInput/index.native.tsx @@ -9,7 +9,6 @@ import Icon from '@components/Icon'; import * as Expensicons from '@components/Icon/Expensicons'; import PressableWithoutFeedback from '@components/Pressable/PressableWithoutFeedback'; import RNTextInput from '@components/RNTextInput'; -import SwipeInterceptPanResponder from '@components/SwipeInterceptPanResponder'; import Text from '@components/Text'; import * as styleConst from '@components/TextInput/styleConst'; import TextInputLabel from '@components/TextInput/TextInputLabel'; @@ -52,7 +51,6 @@ function BaseTextInput( onInputChange = () => {}, shouldDelayFocus = false, multiline = false, - shouldInterceptSwipe = false, autoCorrect = true, prefixCharacter = '', inputID, From a3fbb23762043510669941c10b1e67fbe0797602 Mon Sep 17 00:00:00 2001 From: hkopser99 <144170694+hkopser99@users.noreply.github.com> Date: Wed, 14 Feb 2024 09:40:24 +0100 Subject: [PATCH 171/288] Update AppDownloadLinks.tsx Amended openAppDownloadLink and downloadLink in DownloadMenuItem back to action and link. Returned to original, simplified logic for Navigation.goBack() --- src/pages/settings/AppDownloadLinks.tsx | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/pages/settings/AppDownloadLinks.tsx b/src/pages/settings/AppDownloadLinks.tsx index 5ded324e5b45..352b3772923a 100644 --- a/src/pages/settings/AppDownloadLinks.tsx +++ b/src/pages/settings/AppDownloadLinks.tsx @@ -13,12 +13,11 @@ import * as ReportActionContextMenu from '@pages/home/report/ContextMenu/ReportA import * as Link from '@userActions/Link'; import CONST from '@src/CONST'; import type {TranslationPaths} from '@src/languages/types'; -import ROUTES from '@src/ROUTES'; type DownloadMenuItem = MenuItemProps & { translationKey: TranslationPaths; - openAppDownloadLink: () => void; - downloadLink: string; + action: () => void; + link: string; }; function AppDownloadLinksPage() { @@ -29,28 +28,28 @@ function AppDownloadLinksPage() { const menuItems: DownloadMenuItem[] = [ { translationKey: 'initialSettingsPage.appDownloadLinks.android.label', - openAppDownloadLink: () => { + action: () => { Link.openExternalLink(CONST.APP_DOWNLOAD_LINKS.ANDROID); }, - downloadLink: CONST.APP_DOWNLOAD_LINKS.ANDROID, + link: CONST.APP_DOWNLOAD_LINKS.ANDROID, icon: Expensicons.Android, iconRight: Expensicons.NewWindow, }, { translationKey: 'initialSettingsPage.appDownloadLinks.ios.label', - openAppDownloadLink: () => { + action: () => { Link.openExternalLink(CONST.APP_DOWNLOAD_LINKS.IOS, true); }, - downloadLink: CONST.APP_DOWNLOAD_LINKS.IOS, + link: CONST.APP_DOWNLOAD_LINKS.IOS, icon: Expensicons.Apple, iconRight: Expensicons.NewWindow, }, { translationKey: 'initialSettingsPage.appDownloadLinks.desktop.label', - openAppDownloadLink: () => { + action: () => { Link.openExternalLink(CONST.APP_DOWNLOAD_LINKS.DESKTOP); }, - downloadLink: CONST.APP_DOWNLOAD_LINKS.DESKTOP, + link: CONST.APP_DOWNLOAD_LINKS.DESKTOP, icon: Expensicons.Monitor, iconRight: Expensicons.NewWindow, }, @@ -60,14 +59,14 @@ function AppDownloadLinksPage() { Navigation.goBack(ROUTES.SETTINGS_ABOUT)} + onBackButtonPress={() => Navigation.goBack()} /> {menuItems.map((item: DownloadMenuItem) => ( ReportActionContextMenu.showContextMenu(CONST.CONTEXT_MENU_TYPES.LINK, e, item.downloadLink, popoverAnchor.current)} + onPress={item.action} + onSecondaryInteraction={(e) => ReportActionContextMenu.showContextMenu(CONST.CONTEXT_MENU_TYPES.LINK, e, item.link, popoverAnchor.current)} ref={popoverAnchor} title={translate(item.translationKey)} icon={item.icon} From 1fdb8fdffafbd3be495c43ecdd4b83a486be9d99 Mon Sep 17 00:00:00 2001 From: ruben-rebelo Date: Wed, 14 Feb 2024 12:32:01 +0000 Subject: [PATCH 172/288] [TS migration][react-native-permissions] Remove the declare module --- __mocks__/react-native-permissions.ts | 6 +++--- src/types/modules/react-native-permissions.d.ts | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) delete mode 100644 src/types/modules/react-native-permissions.d.ts diff --git a/__mocks__/react-native-permissions.ts b/__mocks__/react-native-permissions.ts index a1497c7cc2ac..b30931e6b85c 100644 --- a/__mocks__/react-native-permissions.ts +++ b/__mocks__/react-native-permissions.ts @@ -1,4 +1,4 @@ -import {PERMISSIONS, RESULTS} from 'react-native-permissions/dist/commonjs/permissions'; +import {PERMISSIONS, RESULTS} from 'react-native-permissions'; import type {ValueOf} from 'type-fest'; type Results = ValueOf; @@ -8,8 +8,8 @@ type Notification = {status: Results; settings: NotificationSettings}; const openLimitedPhotoLibraryPicker: jest.Mock = jest.fn(() => {}); const openSettings: jest.Mock = jest.fn(() => {}); -const check: jest.Mock = jest.fn(() => RESULTS.GRANTED as string); -const request: jest.Mock = jest.fn(() => RESULTS.GRANTED as string); +const check = jest.fn(() => RESULTS.GRANTED as string); +const request = jest.fn(() => RESULTS.GRANTED as string); const checkLocationAccuracy: jest.Mock = jest.fn(() => 'full'); const requestLocationAccuracy: jest.Mock = jest.fn(() => 'full'); diff --git a/src/types/modules/react-native-permissions.d.ts b/src/types/modules/react-native-permissions.d.ts deleted file mode 100644 index fa9a73cc8f25..000000000000 --- a/src/types/modules/react-native-permissions.d.ts +++ /dev/null @@ -1 +0,0 @@ -declare module 'react-native-permissions/dist/commonjs/permissions'; From 81214959a52b318fda4e76b923de862389971efe Mon Sep 17 00:00:00 2001 From: ruben-rebelo Date: Wed, 14 Feb 2024 12:43:50 +0000 Subject: [PATCH 173/288] Revert "[TS migration][react-native-permissions] Remove the declare module" This reverts commit 1fdb8fdffafbd3be495c43ecdd4b83a486be9d99. --- __mocks__/react-native-permissions.ts | 6 +++--- src/types/modules/react-native-permissions.d.ts | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 src/types/modules/react-native-permissions.d.ts diff --git a/__mocks__/react-native-permissions.ts b/__mocks__/react-native-permissions.ts index b30931e6b85c..a1497c7cc2ac 100644 --- a/__mocks__/react-native-permissions.ts +++ b/__mocks__/react-native-permissions.ts @@ -1,4 +1,4 @@ -import {PERMISSIONS, RESULTS} from 'react-native-permissions'; +import {PERMISSIONS, RESULTS} from 'react-native-permissions/dist/commonjs/permissions'; import type {ValueOf} from 'type-fest'; type Results = ValueOf; @@ -8,8 +8,8 @@ type Notification = {status: Results; settings: NotificationSettings}; const openLimitedPhotoLibraryPicker: jest.Mock = jest.fn(() => {}); const openSettings: jest.Mock = jest.fn(() => {}); -const check = jest.fn(() => RESULTS.GRANTED as string); -const request = jest.fn(() => RESULTS.GRANTED as string); +const check: jest.Mock = jest.fn(() => RESULTS.GRANTED as string); +const request: jest.Mock = jest.fn(() => RESULTS.GRANTED as string); const checkLocationAccuracy: jest.Mock = jest.fn(() => 'full'); const requestLocationAccuracy: jest.Mock = jest.fn(() => 'full'); diff --git a/src/types/modules/react-native-permissions.d.ts b/src/types/modules/react-native-permissions.d.ts new file mode 100644 index 000000000000..fa9a73cc8f25 --- /dev/null +++ b/src/types/modules/react-native-permissions.d.ts @@ -0,0 +1 @@ +declare module 'react-native-permissions/dist/commonjs/permissions'; From 296bd533813fa978e941b0ac0bf0b9d486c221ef Mon Sep 17 00:00:00 2001 From: ruben-rebelo Date: Wed, 14 Feb 2024 12:46:43 +0000 Subject: [PATCH 174/288] [TS migration][react-native-permissions] Updated module declaration --- __mocks__/react-native-permissions.ts | 4 ++-- src/types/modules/react-native-permissions.d.ts | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/__mocks__/react-native-permissions.ts b/__mocks__/react-native-permissions.ts index a1497c7cc2ac..67b7db830d94 100644 --- a/__mocks__/react-native-permissions.ts +++ b/__mocks__/react-native-permissions.ts @@ -8,8 +8,8 @@ type Notification = {status: Results; settings: NotificationSettings}; const openLimitedPhotoLibraryPicker: jest.Mock = jest.fn(() => {}); const openSettings: jest.Mock = jest.fn(() => {}); -const check: jest.Mock = jest.fn(() => RESULTS.GRANTED as string); -const request: jest.Mock = jest.fn(() => RESULTS.GRANTED as string); +const check = jest.fn(() => RESULTS.GRANTED as string); +const request = jest.fn(() => RESULTS.GRANTED as string); const checkLocationAccuracy: jest.Mock = jest.fn(() => 'full'); const requestLocationAccuracy: jest.Mock = jest.fn(() => 'full'); diff --git a/src/types/modules/react-native-permissions.d.ts b/src/types/modules/react-native-permissions.d.ts index fa9a73cc8f25..82a008b95b66 100644 --- a/src/types/modules/react-native-permissions.d.ts +++ b/src/types/modules/react-native-permissions.d.ts @@ -1 +1,5 @@ -declare module 'react-native-permissions/dist/commonjs/permissions'; +declare module 'react-native-permissions/dist/commonjs/permissions' { + import {PERMISSIONS, RESULTS} from 'react-native-permissions'; + + export {PERMISSIONS, RESULTS}; +} From b1f989f58bb84fdb27d1845fffbfa975e25cee8e Mon Sep 17 00:00:00 2001 From: Wojciech Boman Date: Wed, 14 Feb 2024 15:45:43 +0100 Subject: [PATCH 175/288] Prevent calling welcome.show on the settings tab --- .../createCustomBottomTabNavigator/BottomTabBar.tsx | 9 +++++++-- src/libs/actions/Welcome.ts | 4 +--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/libs/Navigation/AppNavigator/createCustomBottomTabNavigator/BottomTabBar.tsx b/src/libs/Navigation/AppNavigator/createCustomBottomTabNavigator/BottomTabBar.tsx index a953175fdcb7..8f646f7a748c 100644 --- a/src/libs/Navigation/AppNavigator/createCustomBottomTabNavigator/BottomTabBar.tsx +++ b/src/libs/Navigation/AppNavigator/createCustomBottomTabNavigator/BottomTabBar.tsx @@ -42,8 +42,13 @@ function BottomTabBar({isLoadingApp = false}: PurposeForUsingExpensifyModalProps const navigationState = navigation.getState(); const routes = navigationState.routes; const currentRoute = routes[navigationState.index]; - - if (currentRoute && currentRoute.name !== NAVIGATORS.BOTTOM_TAB_NAVIGATOR && currentRoute.name !== NAVIGATORS.CENTRAL_PANE_NAVIGATOR) { + const bottomTabRoute = getTopmostBottomTabRoute(navigationState); + if ( + // When we are redirected to the Settings tab from the OldDot, we don't want to call the Welcome.show() method. + // To prevent this, the value of the bottomTabRoute?.name is checked here + bottomTabRoute?.name === SCREENS.WORKSPACE.INITIAL || + (currentRoute && currentRoute.name !== NAVIGATORS.BOTTOM_TAB_NAVIGATOR && currentRoute.name !== NAVIGATORS.CENTRAL_PANE_NAVIGATOR) + ) { return; } diff --git a/src/libs/actions/Welcome.ts b/src/libs/actions/Welcome.ts index 952d19117679..3f6b2dc99a8f 100644 --- a/src/libs/actions/Welcome.ts +++ b/src/libs/actions/Welcome.ts @@ -136,13 +136,11 @@ function show(routes: NavigationState['routes'], showEngagem const transitionRoute = routes.find( (route): route is NavigationState>['routes'][number] => route.name === SCREENS.TRANSITION_BETWEEN_APPS, ); - const activeRoute = Navigation.getActiveRouteWithoutParams(); - const isOnWorkspaceOverviewPage = activeRoute?.startsWith('/workspace') && activeRoute?.endsWith('/overview'); const isExitingToWorkspaceRoute = transitionRoute?.params?.exitTo === 'workspace/new'; // If we already opened the workspace settings or want the admin room to stay open, do not // navigate away to the workspace chat report - const shouldNavigateToWorkspaceChat = !isExitingToWorkspaceRoute && !isOnWorkspaceOverviewPage; + const shouldNavigateToWorkspaceChat = !isExitingToWorkspaceRoute; const workspaceChatReport = Object.values(allReports ?? {}).find((report) => { if (report) { From 0ea67f499eff3ac16ecc2ff16cd78de6a61b9d2c Mon Sep 17 00:00:00 2001 From: Filip Solecki Date: Wed, 14 Feb 2024 15:55:33 +0100 Subject: [PATCH 176/288] Use es6 imports and exports --- tests/e2e/compare/compare.js | 16 ++++++------ tests/e2e/compare/math.js | 5 +--- tests/e2e/compare/output/console.js | 6 ++--- tests/e2e/compare/output/format.js | 10 +------ tests/e2e/compare/output/markdown.js | 25 +++++++++--------- tests/e2e/compare/output/markdownTable.js | 2 +- tests/e2e/config.dev.js | 2 +- tests/e2e/config.js | 2 +- tests/e2e/config.local.js | 2 +- tests/e2e/measure/math.js | 7 +++-- tests/e2e/measure/writeTestStats.js | 7 +++-- tests/e2e/merge.js | 10 +++---- .../nativeCommands/NativeCommandsAction.js | 6 +---- tests/e2e/nativeCommands/adbBackspace.js | 6 ++--- tests/e2e/nativeCommands/adbTypeText.js | 6 ++--- tests/e2e/nativeCommands/index.js | 13 ++++------ tests/e2e/server/index.js | 16 ++++++------ tests/e2e/server/routes.js | 2 +- tests/e2e/testRunner.js | 26 +++++++++---------- tests/e2e/utils/androidReversePort.js | 10 +++---- tests/e2e/utils/execAsync.js | 6 ++--- tests/e2e/utils/getCurrentBranchName.js | 4 +-- tests/e2e/utils/installApp.js | 8 +++--- tests/e2e/utils/killApp.js | 8 +++--- tests/e2e/utils/launchApp.js | 8 +++--- tests/e2e/utils/logger.js | 26 ++++++------------- tests/e2e/utils/sleep.js | 4 +-- tests/e2e/utils/withFailTimeout.js | 6 ++--- tests/unit/GithubUtilsTest.js | 4 +-- tests/unit/PaymentUtilsTest.js | 3 +-- tests/unit/TranslateTest.js | 18 ++++++------- tests/unit/UrlTest.js | 2 +- tests/unit/ValidationUtilsTest.js | 3 +-- tests/unit/awaitStagingDeploysTest.js | 8 +++--- tests/unit/checkDeployBlockersTest.js | 8 +++--- tests/unit/createOrUpdateStagingDeployTest.js | 16 ++++++------ tests/unit/isStagingDeployLockedTest.js | 6 ++--- tests/unit/markPullRequestsAsDeployedTest.js | 6 ++--- tests/unit/nativeVersionUpdaterTest.js | 9 ++++--- tests/unit/postTestBuildComment.js | 10 +++---- tests/unit/versionUpdaterTest.js | 2 +- 41 files changed, 155 insertions(+), 189 deletions(-) diff --git a/tests/e2e/compare/compare.js b/tests/e2e/compare/compare.js index 3be7abc91188..b7d5c15c5f82 100644 --- a/tests/e2e/compare/compare.js +++ b/tests/e2e/compare/compare.js @@ -1,8 +1,8 @@ -const _ = require('underscore'); -const {computeProbability, computeZ} = require('./math'); -const {getStats} = require('../measure/math'); -const printToConsole = require('./output/console'); -const writeToMarkdown = require('./output/markdown'); +import _ from 'underscore'; +import getStats from '../measure/math'; +import math from './math'; +import printToConsole from './output/console'; +import writeToMarkdown from './output/markdown'; /* * base implementation from: https://github.com/callstack/reassure/blob/main/packages/reassure-compare/src/compare.ts @@ -36,8 +36,8 @@ function buildCompareEntry(name, compare, baseline) { const diff = compare.mean - baseline.mean; const relativeDurationDiff = diff / baseline.mean; - const z = computeZ(baseline.mean, baseline.stdev, compare.mean, compare.runs); - const prob = computeProbability(z); + const z = math.computeZ(baseline.mean, baseline.stdev, compare.mean, compare.runs); + const prob = math.computeProbability(z); const isDurationDiffOfSignificance = prob < PROBABILITY_CONSIDERED_SIGNIFICANCE && Math.abs(diff) >= DURATION_DIFF_THRESHOLD_SIGNIFICANCE; @@ -106,7 +106,7 @@ function compareResults(compareEntries, baselineEntries) { }; } -module.exports = (main, delta, outputFile, outputFormat = 'all') => { +export default (main, delta, outputFile, outputFormat = 'all') => { const outputData = compareResults(main, delta); if (outputFormat === 'console' || outputFormat === 'all') { diff --git a/tests/e2e/compare/math.js b/tests/e2e/compare/math.js index a7dbe1c95a86..a87c58c4dff3 100644 --- a/tests/e2e/compare/math.js +++ b/tests/e2e/compare/math.js @@ -89,7 +89,4 @@ const computeProbability = (z) => { return 0.2; }; -module.exports = { - computeZ, - computeProbability, -}; +export {computeZ, computeProbability}; diff --git a/tests/e2e/compare/output/console.js b/tests/e2e/compare/output/console.js index cfcd7019bbdd..61645baf38b8 100644 --- a/tests/e2e/compare/output/console.js +++ b/tests/e2e/compare/output/console.js @@ -1,14 +1,14 @@ -const {formatDurationDiffChange} = require('./format'); +import format from './format'; const printRegularLine = (entry) => { - console.debug(` - ${entry.name}: ${formatDurationDiffChange(entry)}`); + console.debug(` - ${entry.name}: ${format.formatDurationDiffChange(entry)}`); }; /** * Prints the result simply to console. * @param {Object} data */ -module.exports = (data) => { +export default (data) => { // No need to log errors or warnings as these were be logged on the fly console.debug(''); console.debug('❇️ Performance comparison results:'); diff --git a/tests/e2e/compare/output/format.js b/tests/e2e/compare/output/format.js index c31ac547b41d..18b49cf03028 100644 --- a/tests/e2e/compare/output/format.js +++ b/tests/e2e/compare/output/format.js @@ -82,12 +82,4 @@ const formatDurationDiffChange = (entry) => { return output; }; -module.exports = { - formatPercent, - formatPercentChange, - formatDuration, - formatDurationChange, - formatChange, - getDurationSymbols, - formatDurationDiffChange, -}; +export {formatPercent, formatPercentChange, formatDuration, formatDurationChange, formatChange, getDurationSymbols, formatDurationDiffChange}; diff --git a/tests/e2e/compare/output/markdown.js b/tests/e2e/compare/output/markdown.js index 2015d8de6cc3..1f9626678498 100644 --- a/tests/e2e/compare/output/markdown.js +++ b/tests/e2e/compare/output/markdown.js @@ -1,11 +1,10 @@ // From: https://raw.githubusercontent.com/callstack/reassure/main/packages/reassure-compare/src/output/markdown.ts - -const fs = require('node:fs/promises'); -const path = require('path'); -const _ = require('underscore'); -const markdownTable = require('./markdownTable'); -const {formatDuration, formatPercent, formatDurationDiffChange} = require('./format'); -const Logger = require('../../utils/logger'); +import fs from 'node:fs/promises'; +import path from 'path'; +import _ from 'underscore'; +import Logger from '../../utils/logger'; +import format from './format'; +import markdownTable from './markdownTable'; const tableHeader = ['Name', 'Duration']; @@ -17,8 +16,8 @@ const buildDurationDetails = (title, entry) => { return _.filter( [ `**${title}**`, - `Mean: ${formatDuration(entry.mean)}`, - `Stdev: ${formatDuration(entry.stdev)} (${formatPercent(relativeStdev)})`, + `Mean: ${format.formatDuration(entry.mean)}`, + `Stdev: ${format.formatDuration(entry.stdev)} (${format.formatPercent(relativeStdev)})`, entry.entries ? `Runs: ${entry.entries.join(' ')}` : '', ], Boolean, @@ -32,13 +31,13 @@ const buildDurationDetailsEntry = (entry) => const formatEntryDuration = (entry) => { if ('baseline' in entry && 'current' in entry) { - return formatDurationDiffChange(entry); + return format.formatDurationDiffChange(entry); } if ('baseline' in entry) { - return formatDuration(entry.baseline.mean); + return format.formatDuration(entry.baseline.mean); } if ('current' in entry) { - return formatDuration(entry.current.mean); + return format.formatDuration(entry.current.mean); } return ''; }; @@ -115,4 +114,4 @@ const writeToMarkdown = (filePath, data) => { }); }; -module.exports = writeToMarkdown; +export default writeToMarkdown; diff --git a/tests/e2e/compare/output/markdownTable.js b/tests/e2e/compare/output/markdownTable.js index 3b580bcfc116..198ae17daba5 100644 --- a/tests/e2e/compare/output/markdownTable.js +++ b/tests/e2e/compare/output/markdownTable.js @@ -365,4 +365,4 @@ function toAlignment(value) { : 0; } -module.exports = markdownTable; +export default markdownTable; diff --git a/tests/e2e/config.dev.js b/tests/e2e/config.dev.js index 894b4737c36f..8d12fb5ce007 100644 --- a/tests/e2e/config.dev.js +++ b/tests/e2e/config.dev.js @@ -1,7 +1,7 @@ const packageName = 'com.expensify.chat.dev'; const appPath = './android/app/build/outputs/apk/development/debug/app-development-debug.apk'; -module.exports = { +export default { MAIN_APP_PACKAGE: packageName, DELTA_APP_PACKAGE: packageName, MAIN_APP_PATH: appPath, diff --git a/tests/e2e/config.js b/tests/e2e/config.js index a7447a29c954..d51119e77430 100644 --- a/tests/e2e/config.js +++ b/tests/e2e/config.js @@ -17,7 +17,7 @@ const TEST_NAMES = { * npm run test:e2e -- --config ./path/to/your/config.js * ``` */ -module.exports = { +export default { MAIN_APP_PACKAGE: 'com.expensify.chat.e2e', DELTA_APP_PACKAGE: 'com.expensify.chat.e2edelta', diff --git a/tests/e2e/config.local.js b/tests/e2e/config.local.js index 45b946b91aeb..605b1ddd57d7 100644 --- a/tests/e2e/config.local.js +++ b/tests/e2e/config.local.js @@ -1,4 +1,4 @@ -module.exports = { +export default { MAIN_APP_PACKAGE: 'com.expensify.chat.e2e', DELTA_APP_PACKAGE: 'com.expensify.chat.e2edelta', MAIN_APP_PATH: './android/app/build/outputs/apk/e2e/release/app-e2e-release.apk', diff --git a/tests/e2e/measure/math.js b/tests/e2e/measure/math.js index 712e197d367b..14f75a7f980e 100644 --- a/tests/e2e/measure/math.js +++ b/tests/e2e/measure/math.js @@ -1,4 +1,4 @@ -const _ = require('underscore'); +import _ from 'underscore'; const filterOutliersViaIQR = (data) => { let q1; @@ -46,6 +46,5 @@ const getStats = (entries) => { }; }; -module.exports = { - getStats, -}; +// eslint-disable-next-line import/prefer-default-export +export default getStats; diff --git a/tests/e2e/measure/writeTestStats.js b/tests/e2e/measure/writeTestStats.js index c4074dbdd08f..6de9dcc79db4 100644 --- a/tests/e2e/measure/writeTestStats.js +++ b/tests/e2e/measure/writeTestStats.js @@ -1,6 +1,5 @@ -const fs = require('fs'); - -const {OUTPUT_FILE_CURRENT} = require('../config'); +import fs from 'fs'; +import config from '../config'; /** * Writes the results of `getStats` to the {@link OUTPUT_FILE_CURRENT} file. @@ -13,7 +12,7 @@ const {OUTPUT_FILE_CURRENT} = require('../config'); * @param {number} stats.runs - The number of times the test was run. * @param {string} [path] - The path to write to. Defaults to {@link OUTPUT_FILE_CURRENT}. */ -module.exports = (stats, path = OUTPUT_FILE_CURRENT) => { +export default (stats, path = config.OUTPUT_FILE_CURRENT) => { if (!stats.name || stats.mean == null || stats.stdev == null || !stats.entries || !stats.runs) { throw new Error(`Invalid stats object:\n${JSON.stringify(stats, null, 2)}\n\n`); } diff --git a/tests/e2e/merge.js b/tests/e2e/merge.js index 0ee476137315..d7c1b8699c7d 100644 --- a/tests/e2e/merge.js +++ b/tests/e2e/merge.js @@ -1,19 +1,19 @@ -const compare = require('./compare/compare'); -const {OUTPUT_DIR} = require('./config'); +import compare from './compare/compare'; +import CONFIG from './config'; const args = process.argv.slice(2); -let mainPath = `${OUTPUT_DIR}/main.json`; +let mainPath = `${CONFIG.OUTPUT_DIR}/main.json`; if (args.includes('--mainPath')) { mainPath = args[args.indexOf('--mainPath') + 1]; } -let deltaPath = `${OUTPUT_DIR}/delta.json`; +let deltaPath = `${CONFIG.OUTPUT_DIR}/delta.json`; if (args.includes('--deltaPath')) { deltaPath = args[args.indexOf('--deltaPath') + 1]; } -let outputPath = `${OUTPUT_DIR}/output.md`; +let outputPath = `${CONFIG.OUTPUT_DIR}/output.md`; if (args.includes('--outputPath')) { outputPath = args[args.indexOf('--outputPath') + 1]; } diff --git a/tests/e2e/nativeCommands/NativeCommandsAction.js b/tests/e2e/nativeCommands/NativeCommandsAction.js index f2aa4644f7ff..24ceefb5acb7 100644 --- a/tests/e2e/nativeCommands/NativeCommandsAction.js +++ b/tests/e2e/nativeCommands/NativeCommandsAction.js @@ -15,8 +15,4 @@ const makeBackspaceCommand = () => ({ actionName: NativeCommandsAction.backspace, }); -module.exports = { - NativeCommandsAction, - makeTypeTextCommand, - makeBackspaceCommand, -}; +export {NativeCommandsAction, makeTypeTextCommand, makeBackspaceCommand}; diff --git a/tests/e2e/nativeCommands/adbBackspace.js b/tests/e2e/nativeCommands/adbBackspace.js index 8f41364daed3..c0dcf65c240c 100644 --- a/tests/e2e/nativeCommands/adbBackspace.js +++ b/tests/e2e/nativeCommands/adbBackspace.js @@ -1,5 +1,5 @@ -const execAsync = require('../utils/execAsync'); -const Logger = require('../utils/logger'); +import execAsync from '../utils/execAsync'; +import Logger from '../utils/logger'; const adbBackspace = async () => { Logger.log(`🔙 Pressing backspace`); @@ -7,4 +7,4 @@ const adbBackspace = async () => { return true; }; -module.exports = adbBackspace; +export default adbBackspace; diff --git a/tests/e2e/nativeCommands/adbTypeText.js b/tests/e2e/nativeCommands/adbTypeText.js index cbaa9f4434a2..7a4c3b31b7fd 100644 --- a/tests/e2e/nativeCommands/adbTypeText.js +++ b/tests/e2e/nativeCommands/adbTypeText.js @@ -1,5 +1,5 @@ -const execAsync = require('../utils/execAsync'); -const Logger = require('../utils/logger'); +import execAsync from '../utils/execAsync'; +import Logger from '../utils/logger'; const adbTypeText = async (text) => { Logger.log(`📝 Typing text: ${text}`); @@ -7,4 +7,4 @@ const adbTypeText = async (text) => { return true; }; -module.exports = adbTypeText; +export default adbTypeText; diff --git a/tests/e2e/nativeCommands/index.js b/tests/e2e/nativeCommands/index.js index bb87c16a6f42..90dcb00bbcae 100644 --- a/tests/e2e/nativeCommands/index.js +++ b/tests/e2e/nativeCommands/index.js @@ -1,6 +1,7 @@ -const adbBackspace = require('./adbBackspace'); -const adbTypeText = require('./adbTypeText'); -const {NativeCommandsAction} = require('./NativeCommandsAction'); +import adbBackspace from './adbBackspace'; +import adbTypeText from './adbTypeText'; +// eslint-disable-next-line rulesdir/prefer-import-module-contents +import {NativeCommandsAction} from './NativeCommandsAction'; const executeFromPayload = (actionName, payload) => { switch (actionName) { @@ -15,8 +16,4 @@ const executeFromPayload = (actionName, payload) => { } }; -module.exports = { - NativeCommandsAction, - executeFromPayload, - adbTypeText, -}; +export {NativeCommandsAction, executeFromPayload, adbTypeText}; diff --git a/tests/e2e/server/index.js b/tests/e2e/server/index.js index c2365f259bb7..b90e96696525 100644 --- a/tests/e2e/server/index.js +++ b/tests/e2e/server/index.js @@ -1,10 +1,10 @@ -const {createServer} = require('http'); -const Routes = require('./routes'); -const Logger = require('../utils/logger'); -const {SERVER_PORT} = require('../config'); -const {executeFromPayload} = require('../nativeCommands'); +import {createServer} from 'http'; +import config from '../config'; +import * as nativeCommands from '../nativeCommands'; +import Logger from '../utils/logger'; +import Routes from './routes'; -const PORT = process.env.PORT || SERVER_PORT; +const PORT = process.env.PORT || config.SERVER_PORT; // Gets the request data as a string const getReqData = (req) => { @@ -130,7 +130,7 @@ const createServerInstance = () => { case Routes.testNativeCommand: { getPostJSONRequestData(req, res) .then((data) => - executeFromPayload(data.actionName, data.payload).then((status) => { + nativeCommands.executeFromPayload(data.actionName, data.payload).then((status) => { if (status) { res.end('ok'); return; @@ -196,4 +196,4 @@ const createServerInstance = () => { }; }; -module.exports = createServerInstance; +export default createServerInstance; diff --git a/tests/e2e/server/routes.js b/tests/e2e/server/routes.js index 0d23866ec808..ffab3b01d297 100644 --- a/tests/e2e/server/routes.js +++ b/tests/e2e/server/routes.js @@ -1,4 +1,4 @@ -module.exports = { +export default { // The app calls this endpoint to know which test to run testConfig: '/test_config', diff --git a/tests/e2e/testRunner.js b/tests/e2e/testRunner.js index 63c88d207581..f6e874c4f421 100644 --- a/tests/e2e/testRunner.js +++ b/tests/e2e/testRunner.js @@ -14,19 +14,19 @@ */ /* eslint-disable @lwc/lwc/no-async-await,no-restricted-syntax,no-await-in-loop */ -const fs = require('fs'); -const _ = require('underscore'); -const defaultConfig = require('./config'); -const Logger = require('./utils/logger'); -const execAsync = require('./utils/execAsync'); -const killApp = require('./utils/killApp'); -const launchApp = require('./utils/launchApp'); -const createServerInstance = require('./server'); -const installApp = require('./utils/installApp'); -const withFailTimeout = require('./utils/withFailTimeout'); -const reversePort = require('./utils/androidReversePort'); -const sleep = require('./utils/sleep'); -const compare = require('./compare/compare'); +import fs from 'fs'; +import _ from 'underscore'; +import compare from './compare/compare'; +import defaultConfig from './config'; +import createServerInstance from './server'; +import reversePort from './utils/androidReversePort'; +import execAsync from './utils/execAsync'; +import installApp from './utils/installApp'; +import killApp from './utils/killApp'; +import launchApp from './utils/launchApp'; +import Logger from './utils/logger'; +import sleep from './utils/sleep'; +import withFailTimeout from './utils/withFailTimeout'; // VARIABLE CONFIGURATION const args = process.argv.slice(2); diff --git a/tests/e2e/utils/androidReversePort.js b/tests/e2e/utils/androidReversePort.js index b644ca1538dd..55851daf59bf 100644 --- a/tests/e2e/utils/androidReversePort.js +++ b/tests/e2e/utils/androidReversePort.js @@ -1,6 +1,6 @@ -const {SERVER_PORT} = require('../config'); -const execAsync = require('./execAsync'); +import config from '../config'; +import execAsync from './execAsync'; -module.exports = function () { - return execAsync(`adb reverse tcp:${SERVER_PORT} tcp:${SERVER_PORT}`); -}; +export default function () { + return execAsync(`adb reverse tcp:${config.SERVER_PORT} tcp:${config.SERVER_PORT}`); +} diff --git a/tests/e2e/utils/execAsync.js b/tests/e2e/utils/execAsync.js index be80452c8acb..fad44082e40c 100644 --- a/tests/e2e/utils/execAsync.js +++ b/tests/e2e/utils/execAsync.js @@ -1,5 +1,5 @@ -const {exec} = require('child_process'); -const Logger = require('./logger'); +import {exec} from 'child_process'; +import Logger from './logger'; /** * Executes a command none-blocking by wrapping it in a promise. @@ -8,7 +8,7 @@ const Logger = require('./logger'); * @param {object} env environment variables * @returns {Promise} */ -module.exports = (command, env = {}) => { +export default (command, env = {}) => { let childProcess; const promise = new Promise((resolve, reject) => { const finalEnv = { diff --git a/tests/e2e/utils/getCurrentBranchName.js b/tests/e2e/utils/getCurrentBranchName.js index ca2f0cba97b0..55df11010214 100644 --- a/tests/e2e/utils/getCurrentBranchName.js +++ b/tests/e2e/utils/getCurrentBranchName.js @@ -1,4 +1,4 @@ -const {execSync} = require('child_process'); +import {execSync} from 'child_process'; const getCurrentBranchName = () => { const stdout = execSync('git rev-parse --abbrev-ref HEAD', { @@ -7,4 +7,4 @@ const getCurrentBranchName = () => { return stdout.trim(); }; -module.exports = getCurrentBranchName; +export default getCurrentBranchName; diff --git a/tests/e2e/utils/installApp.js b/tests/e2e/utils/installApp.js index 3741e459ea83..331ae5e99dee 100644 --- a/tests/e2e/utils/installApp.js +++ b/tests/e2e/utils/installApp.js @@ -1,5 +1,5 @@ -const execAsync = require('./execAsync'); -const Logger = require('./logger'); +import execAsync from './execAsync'; +import Logger from './logger'; /** * Installs the app on the currently connected device for the given platform. @@ -10,7 +10,7 @@ const Logger = require('./logger'); * @param {String} path * @returns {Promise} */ -module.exports = function (platform = 'android', packageName, path) { +export default function (platform = 'android', packageName, path) { if (platform !== 'android') { throw new Error(`installApp() missing implementation for platform: ${platform}`); } @@ -22,4 +22,4 @@ module.exports = function (platform = 'android', packageName, path) { Logger.warn('Failed to uninstall app:', e); }) .finally(() => execAsync(`adb install ${path}`)); -}; +} diff --git a/tests/e2e/utils/killApp.js b/tests/e2e/utils/killApp.js index bdef215bf752..32cc75d3ef8a 100644 --- a/tests/e2e/utils/killApp.js +++ b/tests/e2e/utils/killApp.js @@ -1,11 +1,11 @@ -const {APP_PACKAGE} = require('../config'); -const execAsync = require('./execAsync'); +import config from '../config'; +import execAsync from './execAsync'; -module.exports = function (platform = 'android', packageName = APP_PACKAGE) { +export default function (platform = 'android', packageName = config.APP_PACKAGE) { if (platform !== 'android') { throw new Error(`killApp() missing implementation for platform: ${platform}`); } // Use adb to kill the app return execAsync(`adb shell am force-stop ${packageName}`); -}; +} diff --git a/tests/e2e/utils/launchApp.js b/tests/e2e/utils/launchApp.js index f63e2e71cd8b..d5177794bbda 100644 --- a/tests/e2e/utils/launchApp.js +++ b/tests/e2e/utils/launchApp.js @@ -1,8 +1,8 @@ /* eslint-disable rulesdir/prefer-underscore-method */ -const {APP_PACKAGE, ACTIVITY_PATH} = require('../config'); -const execAsync = require('./execAsync'); +import config from '../config'; +import execAsync from './execAsync'; -module.exports = function (platform = 'android', packageName = APP_PACKAGE, activityPath = ACTIVITY_PATH, launchArgs = {}) { +export default function (platform = 'android', packageName = config.APP_PACKAGE, activityPath = config.ACTIVITY_PATH, launchArgs = {}) { if (platform !== 'android') { throw new Error(`launchApp() missing implementation for platform: ${platform}`); } @@ -12,4 +12,4 @@ module.exports = function (platform = 'android', packageName = APP_PACKAGE, acti .map((key) => `${typeof launchArgs[key] === 'boolean' ? '--ez' : '--es'} ${key} ${launchArgs[key]}`) .join(' '); return execAsync(`adb shell am start -n ${packageName}/${activityPath} ${launchArgsString}`); -}; +} diff --git a/tests/e2e/utils/logger.js b/tests/e2e/utils/logger.js index 7da1e8330bfc..aa8be5b84b26 100644 --- a/tests/e2e/utils/logger.js +++ b/tests/e2e/utils/logger.js @@ -1,6 +1,6 @@ -const fs = require('fs'); -const path = require('path'); -const {LOG_FILE} = require('../config'); +import fs from 'fs'; +import path from 'path'; +import CONST from '../config'; let isVerbose = true; const setLogLevelVerbose = (value) => { @@ -23,18 +23,18 @@ const log = (...args) => { } // Write to log file - if (!fs.existsSync(LOG_FILE)) { + if (!fs.existsSync(CONST.LOG_FILE)) { // Check that the directory exists - const logDir = path.dirname(LOG_FILE); + const logDir = path.dirname(CONST.LOG_FILE); if (!fs.existsSync(logDir)) { fs.mkdirSync(logDir); } - fs.writeFileSync(LOG_FILE, ''); + fs.writeFileSync(CONST.LOG_FILE, ''); } const time = new Date(); const timeStr = `${time.getHours()}:${time.getMinutes()}:${time.getSeconds()} ${time.getMilliseconds()}`; - fs.appendFileSync(LOG_FILE, `[${timeStr}] ${args.join(' ')}\n`); + fs.appendFileSync(CONST.LOG_FILE, `[${timeStr}] ${args.join(' ')}\n`); }; const info = (...args) => { @@ -99,14 +99,4 @@ const progressInfo = (textParam) => { }; }; -module.exports = { - log, - info, - warn, - note, - error, - success, - important, - progressInfo, - setLogLevelVerbose, -}; +export {log, info, warn, note, error, success, important, progressInfo, setLogLevelVerbose}; diff --git a/tests/e2e/utils/sleep.js b/tests/e2e/utils/sleep.js index 6cc4f3bb89d1..6d37ca3cd510 100644 --- a/tests/e2e/utils/sleep.js +++ b/tests/e2e/utils/sleep.js @@ -1,5 +1,5 @@ -module.exports = function sleep(ms) { +export default function sleep(ms) { return new Promise((resolve) => { setTimeout(resolve, ms); }); -}; +} diff --git a/tests/e2e/utils/withFailTimeout.js b/tests/e2e/utils/withFailTimeout.js index 64c92966cdbc..3a314cd23562 100644 --- a/tests/e2e/utils/withFailTimeout.js +++ b/tests/e2e/utils/withFailTimeout.js @@ -1,6 +1,6 @@ -const {INTERACTION_TIMEOUT} = require('../config'); +import CONFIG from '../config'; -const TIMEOUT = process.env.INTERACTION_TIMEOUT || INTERACTION_TIMEOUT; +const TIMEOUT = process.env.INTERACTION_TIMEOUT || CONFIG.INTERACTION_TIMEOUT; const withFailTimeout = (promise, name) => new Promise((resolve, reject) => { @@ -20,4 +20,4 @@ const withFailTimeout = (promise, name) => }); }); -module.exports = withFailTimeout; +export default withFailTimeout; diff --git a/tests/unit/GithubUtilsTest.js b/tests/unit/GithubUtilsTest.js index b2b84dfd9d9f..ba4510794686 100644 --- a/tests/unit/GithubUtilsTest.js +++ b/tests/unit/GithubUtilsTest.js @@ -1,8 +1,8 @@ /** * @jest-environment node */ -const core = require('@actions/core'); -const GithubUtils = require('../../.github/libs/GithubUtils'); +import * as core from '@actions/core'; +import GithubUtils from '../../.github/libs/GithubUtils'; const mockGetInput = jest.fn(); const mockListIssues = jest.fn(); diff --git a/tests/unit/PaymentUtilsTest.js b/tests/unit/PaymentUtilsTest.js index d4524027353a..209e062b764e 100644 --- a/tests/unit/PaymentUtilsTest.js +++ b/tests/unit/PaymentUtilsTest.js @@ -1,6 +1,5 @@ import CONST from '../../src/CONST'; - -const paymentUtils = require('../../src/libs/PaymentUtils'); +import * as paymentUtils from '../../src/libs/PaymentUtils'; describe('PaymentUtils', () => { it('Test rounding wallet transfer instant fee', () => { diff --git a/tests/unit/TranslateTest.js b/tests/unit/TranslateTest.js index 45d4a12b61f5..d23fa52fc798 100644 --- a/tests/unit/TranslateTest.js +++ b/tests/unit/TranslateTest.js @@ -1,9 +1,9 @@ -const _ = require('underscore'); -const {error: AnnotationError} = require('@actions/core'); -const Localize = require('../../src/libs/Localize'); -const CONFIG = require('../../src/CONFIG'); -const translations = require('../../src/languages/translations'); -const CONST = require('../../src/CONST').default; +import {AnnotationError} from '@actions/core'; +import _ from 'underscore'; +import CONFIG from '../../src/CONFIG'; +import CONST from '../../src/CONST'; +import * as translations from '../../src/languages/translations'; +import * as Localize from '../../src/libs/Localize'; const originalTranslations = _.clone(translations); translations.default = { @@ -41,10 +41,10 @@ describe('translate', () => { }); test('Test when key is not found in default (Production Mode)', () => { - const ORIGINAL_IS_IN_PRODUCTION = CONFIG.default.IS_IN_PRODUCTION; - CONFIG.default.IS_IN_PRODUCTION = true; + const ORIGINAL_IS_IN_PRODUCTION = CONFIG.IS_IN_PRODUCTION; + CONFIG.IS_IN_PRODUCTION = true; expect(Localize.translate(CONST.LOCALES.ES_ES, 'testKey4')).toBe('testKey4'); - CONFIG.default.IS_IN_PRODUCTION = ORIGINAL_IS_IN_PRODUCTION; + CONFIG.IS_IN_PRODUCTION = ORIGINAL_IS_IN_PRODUCTION; }); it('Test when translation value is a function', () => { diff --git a/tests/unit/UrlTest.js b/tests/unit/UrlTest.js index 90ffb9b12d5b..74776ecf791d 100644 --- a/tests/unit/UrlTest.js +++ b/tests/unit/UrlTest.js @@ -1,4 +1,4 @@ -const Url = require('../../src/libs/Url'); +import * as Url from '../../src/libs/Url'; describe('Url', () => { describe('getPathFromURL()', () => { diff --git a/tests/unit/ValidationUtilsTest.js b/tests/unit/ValidationUtilsTest.js index 45de052f714d..43e389600d62 100644 --- a/tests/unit/ValidationUtilsTest.js +++ b/tests/unit/ValidationUtilsTest.js @@ -1,7 +1,6 @@ import {addDays, format, startOfDay, subYears} from 'date-fns'; import CONST from '../../src/CONST'; - -const ValidationUtils = require('../../src/libs/ValidationUtils'); +import * as ValidationUtils from '../../src/libs/ValidationUtils'; describe('ValidationUtils', () => { describe('isValidDate', () => { diff --git a/tests/unit/awaitStagingDeploysTest.js b/tests/unit/awaitStagingDeploysTest.js index 88a78d9260a7..8b8327e99047 100644 --- a/tests/unit/awaitStagingDeploysTest.js +++ b/tests/unit/awaitStagingDeploysTest.js @@ -1,10 +1,10 @@ /** * @jest-environment node */ -const core = require('@actions/core'); -const _ = require('underscore'); -const run = require('../../.github/actions/javascript/awaitStagingDeploys/awaitStagingDeploys'); -const GithubUtils = require('../../.github/libs/GithubUtils'); +import * as core from '@actions/core'; +import _ from 'underscore'; +import run from '../../.github/actions/javascript/awaitStagingDeploys/awaitStagingDeploys'; +import GithubUtils from '../../.github/libs/GithubUtils'; // Lower poll rate to speed up tests const TEST_POLL_RATE = 1; diff --git a/tests/unit/checkDeployBlockersTest.js b/tests/unit/checkDeployBlockersTest.js index dca8d5752767..354ab132f601 100644 --- a/tests/unit/checkDeployBlockersTest.js +++ b/tests/unit/checkDeployBlockersTest.js @@ -1,10 +1,10 @@ /** * @jest-environment node */ -const _ = require('underscore'); -const core = require('@actions/core'); -const GithubUtils = require('../../.github/libs/GithubUtils'); -const run = require('../../.github/actions/javascript/checkDeployBlockers/checkDeployBlockers'); +import * as core from '@actions/core'; +import _ from 'underscore'; +import run from '../../.github/actions/javascript/checkDeployBlockers/checkDeployBlockers'; +import GithubUtils from '../../.github/libs/GithubUtils'; // Static mock function for core.getInput const mockGetInput = jest.fn().mockImplementation((arg) => { diff --git a/tests/unit/createOrUpdateStagingDeployTest.js b/tests/unit/createOrUpdateStagingDeployTest.js index 15a795842667..75600f0d4fc8 100644 --- a/tests/unit/createOrUpdateStagingDeployTest.js +++ b/tests/unit/createOrUpdateStagingDeployTest.js @@ -1,14 +1,14 @@ /** * @jest-environment node */ -const core = require('@actions/core'); -const fns = require('date-fns'); -const {vol} = require('memfs'); -const path = require('path'); -const CONST = require('../../.github/libs/CONST'); -const GitUtils = require('../../.github/libs/GitUtils').default; -const GithubUtils = require('../../.github/libs/GithubUtils'); -const run = require('../../.github/actions/javascript/createOrUpdateStagingDeploy/createOrUpdateStagingDeploy'); +import * as core from '@actions/core'; +import * as fns from 'date-fns'; +import {vol} from 'memfs'; +import path from 'path'; +import run from '../../.github/actions/javascript/createOrUpdateStagingDeploy/createOrUpdateStagingDeploy'; +import CONST from '../../.github/libs/CONST'; +import GithubUtils from '../../.github/libs/GithubUtils'; +import GitUtils from '../../.github/libs/GitUtils'; const PATH_TO_PACKAGE_JSON = path.resolve(__dirname, '../../package.json'); diff --git a/tests/unit/isStagingDeployLockedTest.js b/tests/unit/isStagingDeployLockedTest.js index 5a4e81414393..bddd3d851c00 100644 --- a/tests/unit/isStagingDeployLockedTest.js +++ b/tests/unit/isStagingDeployLockedTest.js @@ -1,6 +1,6 @@ -const core = require('@actions/core'); -const run = require('../../.github/actions/javascript/isStagingDeployLocked/isStagingDeployLocked'); -const GithubUtils = require('../../.github/libs/GithubUtils'); +import * as core from '@actions/core'; +import run from '../../.github/actions/javascript/isStagingDeployLocked/isStagingDeployLocked'; +import GithubUtils from '../../.github/libs/GithubUtils'; // Mock the entire GithubUtils module jest.mock('../../.github/libs/GithubUtils'); diff --git a/tests/unit/markPullRequestsAsDeployedTest.js b/tests/unit/markPullRequestsAsDeployedTest.js index 81da0a5c9371..a401a9f96a67 100644 --- a/tests/unit/markPullRequestsAsDeployedTest.js +++ b/tests/unit/markPullRequestsAsDeployedTest.js @@ -1,9 +1,9 @@ /** * @jest-environment node */ -const _ = require('underscore'); -const GitUtils = require('../../.github/libs/GitUtils').default; -const GithubUtils = require('../../.github/libs/GithubUtils'); +import _ from 'underscore'; +import GithubUtils from '../../.github/libs/GithubUtils'; +import GitUtils from '../../.github/libs/GitUtils'; let run; diff --git a/tests/unit/nativeVersionUpdaterTest.js b/tests/unit/nativeVersionUpdaterTest.js index 6e30073fbbdc..198583a3f4e1 100644 --- a/tests/unit/nativeVersionUpdaterTest.js +++ b/tests/unit/nativeVersionUpdaterTest.js @@ -1,7 +1,8 @@ -const fs = require('fs'); -const path = require('path'); -const {vol} = require('memfs'); -const {updateAndroidVersion, generateAndroidVersionCode} = require('../../.github/libs/nativeVersionUpdater'); +import fs from 'fs'; +import {vol} from 'memfs'; +import path from 'path'; +// eslint-disable-next-line rulesdir/prefer-import-module-contents +import {generateAndroidVersionCode, updateAndroidVersion} from '../../.github/libs/nativeVersionUpdater'; const BUILD_GRADLE_PATH = path.resolve(__dirname, '../../android/app/build.gradle'); diff --git a/tests/unit/postTestBuildComment.js b/tests/unit/postTestBuildComment.js index 50389808b77d..ff77ca190c08 100644 --- a/tests/unit/postTestBuildComment.js +++ b/tests/unit/postTestBuildComment.js @@ -1,7 +1,7 @@ -const {when} = require('jest-when'); - -const core = require('@actions/core'); -const GithubUtils = require('../../.github/libs/GithubUtils'); +import * as core from '@actions/core'; +import {when} from 'jest-when'; +import ghAction from '../../.github/actions/javascript/postTestBuildComment/postTestBuildComment'; +import GithubUtils from '../../.github/libs/GithubUtils'; const mockGetInput = jest.fn(); const mockCreateComment = jest.fn(); @@ -25,8 +25,6 @@ jest.mock('@actions/github', () => ({ }, })); -const ghAction = require('../../.github/actions/javascript/postTestBuildComment/postTestBuildComment'); - const androidLink = 'https://expensify.app/ANDROID_LINK'; const iOSLink = 'https://expensify.app/IOS_LINK'; const webLink = 'https://expensify.app/WEB_LINK'; diff --git a/tests/unit/versionUpdaterTest.js b/tests/unit/versionUpdaterTest.js index 2e88f8dde3f7..cb0b0754f930 100644 --- a/tests/unit/versionUpdaterTest.js +++ b/tests/unit/versionUpdaterTest.js @@ -1,4 +1,4 @@ -const versionUpdater = require('../../.github/libs/versionUpdater'); +import * as versionUpdater from '../../.github/libs/versionUpdater'; const VERSION = '2.3.9-80'; const VERSION_NUMBER = [2, 3, 9, 80]; From cbb3f5ed4a4a64b3832d0ba25e7f553475ba6278 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kacper=20Miko=C5=82ajczak?= Date: Mon, 12 Feb 2024 13:54:27 +0100 Subject: [PATCH 177/288] remove iouReportAmount computation --- src/libs/SidebarUtils.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/libs/SidebarUtils.ts b/src/libs/SidebarUtils.ts index 6e46ec320066..94b07b9546b9 100644 --- a/src/libs/SidebarUtils.ts +++ b/src/libs/SidebarUtils.ts @@ -183,9 +183,6 @@ function getOrderedReportIDs( // eslint-disable-next-line no-param-reassign report.displayName = ReportUtils.getReportName(report); - // eslint-disable-next-line no-param-reassign - report.iouReportAmount = ReportUtils.getMoneyRequestReimbursableTotal(report, allReports); - const isPinned = report.isPinned ?? false; const reportAction = ReportActionsUtils.getReportAction(report.parentReportID ?? '', report.parentReportActionID ?? ''); if (isPinned || ReportUtils.requiresAttentionFromCurrentUser(report, reportAction)) { @@ -267,7 +264,6 @@ function getOptionData( isPinned: false, hasOutstandingChildRequest: false, isIOUReportOwner: null, - iouReportAmount: 0, isChatRoom: false, isArchivedRoom: false, shouldShowSubscript: false, @@ -432,7 +428,6 @@ function getOptionData( } result.isIOUReportOwner = ReportUtils.isIOUOwnedByCurrentUser(result as Report); - result.iouReportAmount = ReportUtils.getMoneyRequestReimbursableTotal(result as Report); if (!hasMultipleParticipants) { result.accountID = personalDetail.accountID; From 2c5e59762f8caabd31415e3f3a39d059a755143e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20=C5=BBelawski?= Date: Wed, 14 Feb 2024 17:49:58 +0100 Subject: [PATCH 178/288] properly use Reanimated jest setup --- jest/setup.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jest/setup.ts b/jest/setup.ts index 55774ff136f1..158e030c0422 100644 --- a/jest/setup.ts +++ b/jest/setup.ts @@ -2,12 +2,12 @@ import mockClipboard from '@react-native-clipboard/clipboard/jest/clipboard-mock import '@shopify/flash-list/jestSetup'; import 'react-native-gesture-handler/jestSetup'; import mockStorage from 'react-native-onyx/dist/storage/__mocks__'; -import * as reanimatedJestUtils from 'react-native-reanimated/src/reanimated2/jestUtils'; +import {setUpTests} from 'react-native-reanimated'; import 'setimmediate'; import setupMockImages from './setupMockImages'; setupMockImages(); -reanimatedJestUtils.setUpTests(); +setUpTests(); // This mock is required as per setup instructions for react-navigation testing // https://reactnavigation.org/docs/testing/#mocking-native-modules From 8bc9ea9b66afc514176fdef950dfb3d09dc9705c Mon Sep 17 00:00:00 2001 From: Mykhailo Kravchenko Date: Wed, 14 Feb 2024 18:24:41 +0100 Subject: [PATCH 179/288] fix a predicted report status --- src/libs/actions/IOU.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index 7fca6614f1a1..e5cf350c70b3 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -873,7 +873,7 @@ function getMoneyRequestInformation( } : {}; - const optimisticNextStep = NextStepUtils.buildNextStep(iouReport, needsToBeManuallySubmitted ? CONST.REPORT.STATUS_NUM.OPEN : CONST.REPORT.STATUS_NUM.SUBMITTED); + const optimisticNextStep = NextStepUtils.buildNextStep(iouReport, CONST.REPORT.STATUS_NUM.OPEN); // STEP 5: Build Onyx Data const [optimisticData, successData, failureData] = buildOnyxDataForMoneyRequest( From c37aedae7439c9f5c9f419cda43bad760fb35f4a Mon Sep 17 00:00:00 2001 From: tienifr Date: Thu, 15 Feb 2024 00:32:54 +0700 Subject: [PATCH 180/288] fix: delay when change default skin color --- src/components/EmojiPicker/EmojiSkinToneList.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/components/EmojiPicker/EmojiSkinToneList.js b/src/components/EmojiPicker/EmojiSkinToneList.js index da2559535895..d1cb541b7fb9 100644 --- a/src/components/EmojiPicker/EmojiSkinToneList.js +++ b/src/components/EmojiPicker/EmojiSkinToneList.js @@ -1,4 +1,4 @@ -import React, {useCallback, useState} from 'react'; +import React, {useCallback, useEffect, useState} from 'react'; import {View} from 'react-native'; import _ from 'underscore'; import * as Emojis from '@assets/emojis'; @@ -27,11 +27,17 @@ function EmojiSkinToneList() { * @param {object} skinToneEmoji */ function updateSelectedSkinTone(skinToneEmoji) { - toggleIsSkinToneListVisible(); setHighlightedIndex(skinToneEmoji.skinTone); setPreferredSkinTone(skinToneEmoji.skinTone); } + useEffect(() => { + if (!isSkinToneListVisible) { + return; + } + toggleIsSkinToneListVisible(); + }, [preferredSkinTone]); + const currentSkinTone = getSkinToneEmojiFromIndex(preferredSkinTone); return ( From 28931163ed3690070bf3ebadf8da7ac0dea04ace Mon Sep 17 00:00:00 2001 From: tienifr Date: Thu, 15 Feb 2024 00:47:17 +0700 Subject: [PATCH 181/288] fix lint --- 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 d1cb541b7fb9..62731928db23 100644 --- a/src/components/EmojiPicker/EmojiSkinToneList.js +++ b/src/components/EmojiPicker/EmojiSkinToneList.js @@ -36,6 +36,7 @@ function EmojiSkinToneList() { return; } toggleIsSkinToneListVisible(); + // eslint-disable-next-line react-hooks/exhaustive-deps -- only run when preferredSkinTone updates }, [preferredSkinTone]); const currentSkinTone = getSkinToneEmojiFromIndex(preferredSkinTone); From f0b80e7aabfbe1056fe653f3c99e587b2d13b7fc Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Wed, 14 Feb 2024 12:49:15 -0500 Subject: [PATCH 182/288] fix(Violations): remove unused import --- src/components/ReportActionItem/MoneyRequestView.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/ReportActionItem/MoneyRequestView.tsx b/src/components/ReportActionItem/MoneyRequestView.tsx index bf32f8344240..5c17eb6f44cf 100644 --- a/src/components/ReportActionItem/MoneyRequestView.tsx +++ b/src/components/ReportActionItem/MoneyRequestView.tsx @@ -1,4 +1,4 @@ -import React, {useCallback, useMemo} from 'react'; +import React, {useCallback} from 'react'; import {View} from 'react-native'; import {withOnyx} from 'react-native-onyx'; import type {OnyxEntry} from 'react-native-onyx'; From 98648cad03ce3bd86211f38c2723a9f9dc04da57 Mon Sep 17 00:00:00 2001 From: Filip Solecki Date: Wed, 14 Feb 2024 20:03:45 +0100 Subject: [PATCH 183/288] Fix imports --- tests/e2e/compare/compare.js | 2 +- tests/e2e/compare/output/console.js | 2 +- tests/e2e/compare/output/markdown.js | 4 ++-- tests/e2e/nativeCommands/adbBackspace.js | 2 +- tests/e2e/nativeCommands/adbTypeText.js | 2 +- tests/e2e/server/index.js | 2 +- tests/e2e/testRunner.js | 13 +++++++------ tests/e2e/utils/execAsync.js | 2 +- tests/e2e/utils/installApp.js | 2 +- 9 files changed, 16 insertions(+), 15 deletions(-) diff --git a/tests/e2e/compare/compare.js b/tests/e2e/compare/compare.js index b7d5c15c5f82..5ae8c8b74578 100644 --- a/tests/e2e/compare/compare.js +++ b/tests/e2e/compare/compare.js @@ -1,6 +1,6 @@ import _ from 'underscore'; import getStats from '../measure/math'; -import math from './math'; +import * as math from './math'; import printToConsole from './output/console'; import writeToMarkdown from './output/markdown'; diff --git a/tests/e2e/compare/output/console.js b/tests/e2e/compare/output/console.js index 61645baf38b8..45d665bf8404 100644 --- a/tests/e2e/compare/output/console.js +++ b/tests/e2e/compare/output/console.js @@ -1,4 +1,4 @@ -import format from './format'; +import * as format from './format'; const printRegularLine = (entry) => { console.debug(` - ${entry.name}: ${format.formatDurationDiffChange(entry)}`); diff --git a/tests/e2e/compare/output/markdown.js b/tests/e2e/compare/output/markdown.js index 1f9626678498..119830a5bb2c 100644 --- a/tests/e2e/compare/output/markdown.js +++ b/tests/e2e/compare/output/markdown.js @@ -2,8 +2,8 @@ import fs from 'node:fs/promises'; import path from 'path'; import _ from 'underscore'; -import Logger from '../../utils/logger'; -import format from './format'; +import * as Logger from '../../utils/logger'; +import * as format from './format'; import markdownTable from './markdownTable'; const tableHeader = ['Name', 'Duration']; diff --git a/tests/e2e/nativeCommands/adbBackspace.js b/tests/e2e/nativeCommands/adbBackspace.js index c0dcf65c240c..7b01ed58080d 100644 --- a/tests/e2e/nativeCommands/adbBackspace.js +++ b/tests/e2e/nativeCommands/adbBackspace.js @@ -1,5 +1,5 @@ import execAsync from '../utils/execAsync'; -import Logger from '../utils/logger'; +import * as Logger from '../utils/logger'; const adbBackspace = async () => { Logger.log(`🔙 Pressing backspace`); diff --git a/tests/e2e/nativeCommands/adbTypeText.js b/tests/e2e/nativeCommands/adbTypeText.js index 7a4c3b31b7fd..b8c6cfd09c29 100644 --- a/tests/e2e/nativeCommands/adbTypeText.js +++ b/tests/e2e/nativeCommands/adbTypeText.js @@ -1,5 +1,5 @@ import execAsync from '../utils/execAsync'; -import Logger from '../utils/logger'; +import * as Logger from '../utils/logger'; const adbTypeText = async (text) => { Logger.log(`📝 Typing text: ${text}`); diff --git a/tests/e2e/server/index.js b/tests/e2e/server/index.js index b90e96696525..82152245d8e2 100644 --- a/tests/e2e/server/index.js +++ b/tests/e2e/server/index.js @@ -1,7 +1,7 @@ import {createServer} from 'http'; import config from '../config'; import * as nativeCommands from '../nativeCommands'; -import Logger from '../utils/logger'; +import * as Logger from '../utils/logger'; import Routes from './routes'; const PORT = process.env.PORT || config.SERVER_PORT; diff --git a/tests/e2e/testRunner.js b/tests/e2e/testRunner.js index f6e874c4f421..2b928ce3dc73 100644 --- a/tests/e2e/testRunner.js +++ b/tests/e2e/testRunner.js @@ -14,6 +14,7 @@ */ /* eslint-disable @lwc/lwc/no-async-await,no-restricted-syntax,no-await-in-loop */ +import {execSync} from 'child_process'; import fs from 'fs'; import _ from 'underscore'; import compare from './compare/compare'; @@ -24,7 +25,7 @@ import execAsync from './utils/execAsync'; import installApp from './utils/installApp'; import killApp from './utils/killApp'; import launchApp from './utils/launchApp'; -import Logger from './utils/logger'; +import * as Logger from './utils/logger'; import sleep from './utils/sleep'; import withFailTimeout from './utils/withFailTimeout'; @@ -413,13 +414,13 @@ const run = async () => { Logger.info('\n\nE2E test suite failed due to error:', e, '\nPrinting full logs:\n\n'); // Write logcat, meminfo, emulator info to file as well: - require('child_process').execSync(`adb logcat -d > ${config.OUTPUT_DIR}/logcat.txt`); - require('child_process').execSync(`adb shell "cat /proc/meminfo" > ${config.OUTPUT_DIR}/meminfo.txt`); - require('child_process').execSync(`adb shell "getprop" > ${config.OUTPUT_DIR}/emulator-properties.txt`); + execSync(`adb logcat -d > ${config.OUTPUT_DIR}/logcat.txt`); + execSync(`adb shell "cat /proc/meminfo" > ${config.OUTPUT_DIR}/meminfo.txt`); + execSync(`adb shell "getprop" > ${config.OUTPUT_DIR}/emulator-properties.txt`); - require('child_process').execSync(`cat ${config.LOG_FILE}`); + execSync(`cat ${config.LOG_FILE}`); try { - require('child_process').execSync(`cat ~/.android/avd/${process.env.AVD_NAME || 'test'}.avd/config.ini > ${config.OUTPUT_DIR}/emulator-config.ini`); + execSync(`cat ~/.android/avd/${process.env.AVD_NAME || 'test'}.avd/config.ini > ${config.OUTPUT_DIR}/emulator-config.ini`); } catch (ignoredError) { // the error is ignored, as the file might not exist if the test // run wasn't started with an emulator diff --git a/tests/e2e/utils/execAsync.js b/tests/e2e/utils/execAsync.js index fad44082e40c..9abc41105f7e 100644 --- a/tests/e2e/utils/execAsync.js +++ b/tests/e2e/utils/execAsync.js @@ -1,5 +1,5 @@ import {exec} from 'child_process'; -import Logger from './logger'; +import * as Logger from './logger'; /** * Executes a command none-blocking by wrapping it in a promise. diff --git a/tests/e2e/utils/installApp.js b/tests/e2e/utils/installApp.js index 331ae5e99dee..50fc8602762e 100644 --- a/tests/e2e/utils/installApp.js +++ b/tests/e2e/utils/installApp.js @@ -1,5 +1,5 @@ import execAsync from './execAsync'; -import Logger from './logger'; +import * as Logger from './logger'; /** * Installs the app on the currently connected device for the given platform. From f035ea08b399375e762160f45ee0aa947316b012 Mon Sep 17 00:00:00 2001 From: Robert Kozik Date: Thu, 15 Feb 2024 01:56:48 +0100 Subject: [PATCH 184/288] Update naming of animated component Co-authored-by: Tomek Zawadzki --- src/components/Composer/index.native.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/Composer/index.native.tsx b/src/components/Composer/index.native.tsx index 166be722c794..6691c068eb3a 100644 --- a/src/components/Composer/index.native.tsx +++ b/src/components/Composer/index.native.tsx @@ -3,7 +3,7 @@ import React, {useCallback, useEffect, useMemo, useRef} from 'react'; import type {TextInput} from 'react-native'; import {StyleSheet} from 'react-native'; import type {AnimatedMarkdownTextInputRef} from '@components/RNMarkdownTextInput'; -import MarkdownTextInput from '@components/RNMarkdownTextInput'; +import RNMarkdownTextInput from '@components/RNMarkdownTextInput'; import useMarkdownStyle from '@hooks/useMarkdownStyle'; import useResetComposerFocus from '@hooks/useResetComposerFocus'; import useStyleUtils from '@hooks/useStyleUtils'; @@ -68,7 +68,7 @@ function Composer( const composerStyle = useMemo(() => StyleSheet.flatten(style), [style]); return ( - Date: Thu, 15 Feb 2024 11:19:56 +0700 Subject: [PATCH 185/288] fix lint --- 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 62731928db23..7f36d929025f 100644 --- a/src/components/EmojiPicker/EmojiSkinToneList.js +++ b/src/components/EmojiPicker/EmojiSkinToneList.js @@ -36,7 +36,7 @@ function EmojiSkinToneList() { return; } toggleIsSkinToneListVisible(); - // eslint-disable-next-line react-hooks/exhaustive-deps -- only run when preferredSkinTone updates + // eslint-disable-next-line react-hooks/exhaustive-deps -- only run when preferredSkinTone updates }, [preferredSkinTone]); const currentSkinTone = getSkinToneEmojiFromIndex(preferredSkinTone); From cfb47f6b9501f91b963a693f03648362462d3bf2 Mon Sep 17 00:00:00 2001 From: Filip Solecki Date: Thu, 15 Feb 2024 09:11:26 +0100 Subject: [PATCH 186/288] C+ review fixes --- src/components/ValuePicker/ValueSelectorModal.tsx | 7 +++++-- src/components/ValuePicker/index.tsx | 3 ++- src/components/ValuePicker/types.ts | 12 +++++++++--- src/pages/workspace/WorkspaceNewRoomPage.js | 8 ++++---- 4 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/components/ValuePicker/ValueSelectorModal.tsx b/src/components/ValuePicker/ValueSelectorModal.tsx index 539fa3c5d2ae..1e7c6088241d 100644 --- a/src/components/ValuePicker/ValueSelectorModal.tsx +++ b/src/components/ValuePicker/ValueSelectorModal.tsx @@ -10,7 +10,10 @@ import type {ValueSelectorModalProps} from './types'; function ValueSelectorModal({items = [], selectedItem, label = '', isVisible, onClose, onItemSelected, shouldShowTooltips = true}: ValueSelectorModalProps) { const styles = useThemeStyles(); - const sectionsData = useMemo(() => [{data: items.map((item) => ({...item, isSelected: item === selectedItem, keyForList: item.value ?? ''}))}], [items, selectedItem]); + const sections = useMemo( + () => [{data: items.map((item) => ({value: item.value, alternateText: item.description, text: item.label ?? '', isSelected: item === selectedItem, keyForList: item.value ?? ''}))}], + [items, selectedItem], + ); return ( onItemSelected?.(item)} initiallyFocusedOptionKey={selectedItem?.value} shouldStopPropagation diff --git a/src/components/ValuePicker/index.tsx b/src/components/ValuePicker/index.tsx index 4521fed332f5..cc8a0edf0b97 100644 --- a/src/components/ValuePicker/index.tsx +++ b/src/components/ValuePicker/index.tsx @@ -37,7 +37,8 @@ function ValuePicker({value, label, items, placeholder = '', errorText = '', onI void; + onItemSelected?: (item: ValuePickerListItem) => void; /** Function to call when the user closes the modal */ onClose?: () => void; @@ -54,4 +60,4 @@ type ValuePickerProps = { shouldShowTooltips?: boolean; }; -export type {ValuePickerItem, ValueSelectorModalProps, ValuePickerProps}; +export type {ValuePickerItem, ValueSelectorModalProps, ValuePickerProps, ValuePickerListItem}; diff --git a/src/pages/workspace/WorkspaceNewRoomPage.js b/src/pages/workspace/WorkspaceNewRoomPage.js index f6654966f77d..36f874e8919d 100644 --- a/src/pages/workspace/WorkspaceNewRoomPage.js +++ b/src/pages/workspace/WorkspaceNewRoomPage.js @@ -111,7 +111,7 @@ function WorkspaceNewRoomPage(props) { _.map( _.filter(PolicyUtils.getActivePolicies(props.policies), (policy) => policy.type !== CONST.POLICY.TYPE.PERSONAL), (policy) => ({ - text: policy.name, + label: policy.name, value: policy.id, }), ).sort((a, b) => a.label.toLowerCase().localeCompare(b.label.toLowerCase())), @@ -228,7 +228,7 @@ function WorkspaceNewRoomPage(props) { () => _.map(CONST.REPORT.WRITE_CAPABILITIES, (value) => ({ value, - text: translate(`writeCapabilityPage.writeCapability.${value}`), + label: translate(`writeCapabilityPage.writeCapability.${value}`), })), [translate], ); @@ -238,9 +238,9 @@ function WorkspaceNewRoomPage(props) { _.map( _.filter(_.values(CONST.REPORT.VISIBILITY), (visibilityOption) => visibilityOption !== CONST.REPORT.VISIBILITY.PUBLIC_ANNOUNCE), (visibilityOption) => ({ - text: translate(`newRoomPage.visibilityOptions.${visibilityOption}`), + label: translate(`newRoomPage.visibilityOptions.${visibilityOption}`), value: visibilityOption, - alternateText: translate(`newRoomPage.${visibilityOption}Description`), + description: translate(`newRoomPage.${visibilityOption}Description`), }), ), [translate], From 19c5c0d02397c404d168918dd502ae570343c428 Mon Sep 17 00:00:00 2001 From: Filip Solecki Date: Thu, 15 Feb 2024 09:26:28 +0100 Subject: [PATCH 187/288] Fix failing typescript --- .../DatePicker/CalendarPicker/YearPickerModal.tsx | 6 +++--- src/components/DatePicker/CalendarPicker/index.tsx | 4 ++-- src/components/DatePicker/CalendarPicker/types.ts | 6 +++--- src/components/SelectionList/types.ts | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/components/DatePicker/CalendarPicker/YearPickerModal.tsx b/src/components/DatePicker/CalendarPicker/YearPickerModal.tsx index 21c57f79f39c..8f2acc6fbd3c 100644 --- a/src/components/DatePicker/CalendarPicker/YearPickerModal.tsx +++ b/src/components/DatePicker/CalendarPicker/YearPickerModal.tsx @@ -6,14 +6,14 @@ import SelectionList from '@components/SelectionList'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; import CONST from '@src/CONST'; -import type CalendarPickerRadioItem from './types'; +import type CalendarPickerListItem from './types'; type YearPickerModalProps = { /** Whether the modal is visible */ isVisible: boolean; /** The list of years to render */ - years: CalendarPickerRadioItem[]; + years: CalendarPickerListItem[]; /** Currently selected year */ currentYear?: number; @@ -72,7 +72,7 @@ function YearPickerModal({isVisible, years, currentYear = new Date().getFullYear inputMode={CONST.INPUT_MODE.NUMERIC} headerMessage={headerMessage} sections={sections} - onSelectRow={(option: CalendarPickerRadioItem) => { + onSelectRow={(option) => { onYearChange?.(option.value); }} initiallyFocusedOptionKey={currentYear.toString()} diff --git a/src/components/DatePicker/CalendarPicker/index.tsx b/src/components/DatePicker/CalendarPicker/index.tsx index 60673f9a28d2..1b290aacd30d 100644 --- a/src/components/DatePicker/CalendarPicker/index.tsx +++ b/src/components/DatePicker/CalendarPicker/index.tsx @@ -13,7 +13,7 @@ import getButtonState from '@libs/getButtonState'; import CONST from '@src/CONST'; import ArrowIcon from './ArrowIcon'; import generateMonthMatrix from './generateMonthMatrix'; -import type CalendarPickerRadioItem from './types'; +import type CalendarPickerListItem from './types'; import YearPickerModal from './YearPickerModal'; type CalendarPickerProps = { @@ -59,7 +59,7 @@ function CalendarPicker({ const minYear = getYear(new Date(minDate)); const maxYear = getYear(new Date(maxDate)); - const [years, setYears] = useState( + const [years, setYears] = useState( Array.from({length: maxYear - minYear + 1}, (v, i) => i + minYear).map((year) => ({ text: year.toString(), value: year, diff --git a/src/components/DatePicker/CalendarPicker/types.ts b/src/components/DatePicker/CalendarPicker/types.ts index ce5e16d50535..3183b3a82b6f 100644 --- a/src/components/DatePicker/CalendarPicker/types.ts +++ b/src/components/DatePicker/CalendarPicker/types.ts @@ -1,8 +1,8 @@ -import type {RadioItem} from '@components/SelectionList/types'; +import type {ListItem} from '@components/SelectionList/types'; -type CalendarPickerRadioItem = RadioItem & { +type CalendarPickerListItem = ListItem & { /** The value representing a year in the CalendarPicker */ value: number; }; -export default CalendarPickerRadioItem; +export default CalendarPickerListItem; diff --git a/src/components/SelectionList/types.ts b/src/components/SelectionList/types.ts index 75818746a22c..d5ad637dfc8d 100644 --- a/src/components/SelectionList/types.ts +++ b/src/components/SelectionList/types.ts @@ -49,7 +49,7 @@ type ListItem = { isDisabled?: boolean; /** User accountID */ - accountID?: number; + accountID?: number | null; /** User login */ login?: string; From 8ce65936483ccee0061f500083b924b5b1cf5733 Mon Sep 17 00:00:00 2001 From: Github Date: Thu, 15 Feb 2024 09:34:02 +0100 Subject: [PATCH 188/288] Fix workflow merging issue for performance tests --- .github/workflows/reassurePerformanceTests.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/.github/workflows/reassurePerformanceTests.yml b/.github/workflows/reassurePerformanceTests.yml index ebe31f41f3d8..7a293561de18 100644 --- a/.github/workflows/reassurePerformanceTests.yml +++ b/.github/workflows/reassurePerformanceTests.yml @@ -13,6 +13,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 + with: + fetch-depth: 0 - name: Setup NodeJS uses: ./.github/actions/composite/setupNode @@ -22,6 +24,22 @@ jobs: git config --global user.email "test@test.com" git config --global user.name "Test" + - name: Get common ancestor commit + run: | + git fetch origin main + common_ancestor=$(git merge-base "${{ github.sha }}" origin/main) + echo "COMMIT_HASH=$common_ancestor" >> "$GITHUB_ENV" + + - name: Clean up deleted files + run: | + DELETED_FILES=$(git diff --name-only --diff-filter=D "$COMMIT_HASH" "${{ github.sha }}") + for file in $DELETED_FILES; do + if [ -n "$file" ]; then + rm -f "$file" + echo "Deleted file: $file" + fi + done + - name: Run performance testing script shell: bash run: | From 8796fae65044142f2fcee296ca2b55df278a8ab7 Mon Sep 17 00:00:00 2001 From: dukenv0307 Date: Thu, 15 Feb 2024 15:51:54 +0700 Subject: [PATCH 189/288] edit comment and refactor new function --- src/libs/actions/IOU.ts | 49 +++++++++-------------------------------- 1 file changed, 11 insertions(+), 38 deletions(-) diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index 89b010efdafd..6be6d347e223 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -985,7 +985,7 @@ function createDistanceRequest( /** * Compute the diff amount when we update the transaction */ -function computeDiffAmount(iouReport: OnyxEntry, updatedTransaction: OnyxEntry, transaction: OnyxEntry): number { +function calculateDiffAmount(iouReport: OnyxEntry, updatedTransaction: OnyxEntry, transaction: OnyxEntry): number { if (!iouReport) { return 0; } @@ -993,17 +993,20 @@ function computeDiffAmount(iouReport: OnyxEntry, updatedTransa const updatedCurrency = TransactionUtils.getCurrency(updatedTransaction); const currentCurrency = TransactionUtils.getCurrency(transaction); + const currentAmount = TransactionUtils.getAmount(transaction, isExpenseReport); + const updatedAmount = TransactionUtils.getAmount(updatedTransaction, isExpenseReport); + if (updatedCurrency === iouReport?.currency && currentCurrency !== iouReport?.currency) { - // add the diff with the total if we change the currency from different currency to the currency of the iou report - return TransactionUtils.getAmount(updatedTransaction, isExpenseReport); + // Add the diff to the total if we change the currency from a different currency to the currency of the IOU report + return updatedAmount; } if (updatedCurrency !== iouReport?.currency && currentCurrency === iouReport?.currency) { - // subtract the diff with the total if we change the currency from the currency of iou report to different currency - return -TransactionUtils.getAmount(updatedTransaction, isExpenseReport); + // Subtract the diff from the total if we change the currency from the currency of IOU report to a different currency + return -updatedAmount; } if (updatedCurrency === iouReport?.currency && updatedTransaction?.modifiedAmount) { - // get the diff between the updated amount and the current amount if we change the amount and the currency of the transaction is the currency of the report - return TransactionUtils.getAmount(updatedTransaction, isExpenseReport) - TransactionUtils.getAmount(transaction, isExpenseReport); + // Calculate the diff between the updated amount and the current amount if we change the amount and the currency of the transaction is the currency of the report + return updatedAmount - currentAmount; } return 0; @@ -1125,11 +1128,10 @@ function getUpdateMoneyRequestParams( }, }, }); -<<<<<<< HEAD // Step 4: Compute the IOU total and update the report preview message (and report header) so LHN amount owed is correct. let updatedMoneyRequestReport = {...iouReport}; - const diff = computeDiffAmount(iouReport, updatedTransaction, transaction); + const diff = calculateDiffAmount(iouReport, updatedTransaction, transaction); if (ReportUtils.isExpenseReport(iouReport) && typeof updatedMoneyRequestReport.total === 'number') { // For expense report, the amount is negative so we should subtract total from diff @@ -1141,35 +1143,6 @@ function getUpdateMoneyRequestParams( } updatedMoneyRequestReport.cachedTotal = CurrencyUtils.convertToDisplayString(updatedMoneyRequestReport.total, updatedTransaction?.modifiedCurrency); - optimisticData.push({ - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT}${iouReport?.reportID}`, - value: updatedMoneyRequestReport, - }); - successData.push({ - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT}${iouReport?.reportID}`, - value: {pendingAction: null}, - }); -======= ->>>>>>> main - } - - // Step 4: Compute the IOU total and update the report preview message (and report header) so LHN amount owed is correct. - // Should only update if the transaction matches the currency of the report, else we wait for the update - // from the server with the currency conversion - let updatedMoneyRequestReport = {...iouReport}; - if ((hasPendingWaypoints || updatedTransaction?.modifiedAmount) && updatedTransaction?.currency === iouReport?.currency) { - const diff = TransactionUtils.getAmount(transaction, true) - TransactionUtils.getAmount(updatedTransaction, true); - if (ReportUtils.isExpenseReport(iouReport) && typeof updatedMoneyRequestReport.total === 'number') { - updatedMoneyRequestReport.total += diff; - } else { - updatedMoneyRequestReport = iouReport - ? IOUUtils.updateIOUOwnerAndTotal(iouReport, updatedReportAction.actorAccountID ?? -1, diff, TransactionUtils.getCurrency(transaction), false) - : {}; - } - - updatedMoneyRequestReport.cachedTotal = CurrencyUtils.convertToDisplayString(updatedMoneyRequestReport.total, updatedTransaction?.currency); optimisticData.push({ onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT}${iouReport?.reportID}`, From 4122e5330ed58b73ada05c731b72148d19f8f9cb Mon Sep 17 00:00:00 2001 From: someone-here Date: Thu, 15 Feb 2024 17:09:18 +0530 Subject: [PATCH 190/288] Fix tests --- tests/perf-test/ReportActionCompose.perf-test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/perf-test/ReportActionCompose.perf-test.js b/tests/perf-test/ReportActionCompose.perf-test.js index 0628fd753e0d..5b70666632f9 100644 --- a/tests/perf-test/ReportActionCompose.perf-test.js +++ b/tests/perf-test/ReportActionCompose.perf-test.js @@ -115,7 +115,7 @@ test('[ReportActionCompose] should render Composer with text input interactions' test('[ReportActionCompose] should press add attachemnt button', async () => { const scenario = async () => { // Query for the attachment button - const hintAttachmentButtonText = Localize.translateLocal('common.new'); + const hintAttachmentButtonText = Localize.translateLocal('common.create'); const attachmentButton = await screen.findByLabelText(hintAttachmentButtonText); fireEvent.press(attachmentButton, mockEvent); From 2a481433f859f2a7e280967593fc4b5c66ca8313 Mon Sep 17 00:00:00 2001 From: dukenv0307 Date: Thu, 15 Feb 2024 20:17:09 +0700 Subject: [PATCH 191/288] fix incorrect amount for the case create or delete a request with foreign currency --- src/libs/IOUUtils.ts | 13 +++++++++++-- src/libs/actions/IOU.ts | 17 ++++++----------- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/libs/IOUUtils.ts b/src/libs/IOUUtils.ts index 55317c9c050c..1aafe09c53fe 100644 --- a/src/libs/IOUUtils.ts +++ b/src/libs/IOUUtils.ts @@ -53,9 +53,18 @@ function calculateAmount(numberOfParticipants: number, total: number, currency: * If user1 requests $17 from user2, then we have: {ownerAccountID: user1, managerID: user2, total: $7 (still a positive amount, but now owed to user1)} * * @param isDeleting - whether the user is deleting the request + * @param isUpdating - whether the user is updating the request */ -function updateIOUOwnerAndTotal>(iouReport: TReport, actorAccountID: number, amount: number, currency: string, isDeleting = false): TReport { - if (!iouReport?.currency) { +function updateIOUOwnerAndTotal>( + iouReport: TReport, + actorAccountID: number, + amount: number, + currency: string, + isDeleting = false, + isUpdating = false, +): TReport { + // For the update case, we have calculated the diff amount in the calculateDiffAmount function so there is no need to compare currencies here + if ((currency !== iouReport?.currency && !isUpdating) || !iouReport) { return iouReport; } diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index 6be6d347e223..fb61bf3565ab 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -1138,7 +1138,7 @@ function getUpdateMoneyRequestParams( updatedMoneyRequestReport.total -= diff; } else { updatedMoneyRequestReport = iouReport - ? IOUUtils.updateIOUOwnerAndTotal(iouReport, updatedReportAction.actorAccountID ?? -1, diff, TransactionUtils.getCurrency(transaction), false) + ? IOUUtils.updateIOUOwnerAndTotal(iouReport, updatedReportAction.actorAccountID ?? -1, diff, TransactionUtils.getCurrency(transaction), false, true) : {}; } updatedMoneyRequestReport.cachedTotal = CurrencyUtils.convertToDisplayString(updatedMoneyRequestReport.total, updatedTransaction?.modifiedCurrency); @@ -1739,7 +1739,7 @@ function createSplitsAndOnyxData( oneOnOneIOUReport.total -= splitAmount; } } else { - oneOnOneIOUReport = IOUUtils.updateIOUOwnerAndTotal(oneOnOneIOUReport, currentUserAccountID, splitAmount, currency); + oneOnOneIOUReport = IOUUtils.updateIOUOwnerAndTotal(oneOnOneIOUReport, currentUserAccountID, splitAmount, currency, false); } // STEP 3: Build optimistic transaction @@ -2363,7 +2363,7 @@ function completeSplitBill(chatReportID: string, reportAction: OnyxTypes.ReportA oneOnOneIOUReport.total -= splitAmount; } } else { - oneOnOneIOUReport = IOUUtils.updateIOUOwnerAndTotal(oneOnOneIOUReport, sessionAccountID, splitAmount, currency ?? ''); + oneOnOneIOUReport = IOUUtils.updateIOUOwnerAndTotal(oneOnOneIOUReport, sessionAccountID, splitAmount, currency ?? '', false); } const oneOnOneTransaction = TransactionUtils.buildOptimisticTransaction( @@ -2810,23 +2810,18 @@ function deleteMoneyRequest(transactionID: string, reportAction: OnyxTypes.Repor // STEP 4: Update the iouReport and reportPreview with new totals and messages if it wasn't deleted let updatedIOUReport: OnyxTypes.Report | null; + const currency = TransactionUtils.getCurrency(transaction); const updatedReportPreviewAction: OnyxTypes.ReportAction | EmptyObject = {...reportPreviewAction}; updatedReportPreviewAction.pendingAction = shouldDeleteIOUReport ? CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE : CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE; if (iouReport && ReportUtils.isExpenseReport(iouReport)) { updatedIOUReport = {...iouReport}; - if (typeof updatedIOUReport.total === 'number') { + if (typeof updatedIOUReport.total === 'number' && currency === iouReport?.currency) { // Because of the Expense reports are stored as negative values, we add the total from the amount updatedIOUReport.total += TransactionUtils.getAmount(transaction, true); } } else { - updatedIOUReport = IOUUtils.updateIOUOwnerAndTotal( - iouReport, - reportAction.actorAccountID ?? -1, - TransactionUtils.getAmount(transaction, false), - TransactionUtils.getCurrency(transaction), - true, - ); + updatedIOUReport = IOUUtils.updateIOUOwnerAndTotal(iouReport, reportAction.actorAccountID ?? -1, TransactionUtils.getAmount(transaction, false), currency, true); } if (updatedIOUReport) { From 9f075c489096d4e0556d2916d09245c7956e8865 Mon Sep 17 00:00:00 2001 From: dukenv0307 Date: Thu, 15 Feb 2024 20:21:41 +0700 Subject: [PATCH 192/288] revert hard code --- src/libs/actions/IOU.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index fb61bf3565ab..c3f7c44c86b0 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -1739,7 +1739,7 @@ function createSplitsAndOnyxData( oneOnOneIOUReport.total -= splitAmount; } } else { - oneOnOneIOUReport = IOUUtils.updateIOUOwnerAndTotal(oneOnOneIOUReport, currentUserAccountID, splitAmount, currency, false); + oneOnOneIOUReport = IOUUtils.updateIOUOwnerAndTotal(oneOnOneIOUReport, currentUserAccountID, splitAmount, currency); } // STEP 3: Build optimistic transaction @@ -2363,7 +2363,7 @@ function completeSplitBill(chatReportID: string, reportAction: OnyxTypes.ReportA oneOnOneIOUReport.total -= splitAmount; } } else { - oneOnOneIOUReport = IOUUtils.updateIOUOwnerAndTotal(oneOnOneIOUReport, sessionAccountID, splitAmount, currency ?? '', false); + oneOnOneIOUReport = IOUUtils.updateIOUOwnerAndTotal(oneOnOneIOUReport, sessionAccountID, splitAmount, currency ?? ''); } const oneOnOneTransaction = TransactionUtils.buildOptimisticTransaction( From e021a04426b5043ceb1c5079b0f1a41e33dc734a Mon Sep 17 00:00:00 2001 From: Bartosz Grajdek Date: Thu, 15 Feb 2024 14:37:54 +0100 Subject: [PATCH 193/288] fix: add Podfile.lock --- ios/Podfile.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 19a579b846e8..9b6c84c97058 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1443,7 +1443,7 @@ PODS: - RNSound/Core (= 0.11.2) - RNSound/Core (0.11.2): - React-Core - - RNSVG (14.0.0): + - RNSVG (14.1.0): - React-Core - SDWebImage (5.17.0): - SDWebImage/Core (= 5.17.0) @@ -1458,7 +1458,7 @@ PODS: - SDWebImage/Core (~> 5.17) - SocketRocket (0.6.1) - Turf (2.7.0) - - VisionCamera (2.16.5): + - VisionCamera (2.16.8): - React - React-callinvoker - React-Core @@ -1982,15 +1982,15 @@ SPEC CHECKSUMS: RNReanimated: 57f436e7aa3d277fbfed05e003230b43428157c0 RNScreens: b582cb834dc4133307562e930e8fa914b8c04ef2 RNSound: 6c156f925295bdc83e8e422e7d8b38d33bc71852 - RNSVG: 255767813dac22db1ec2062c8b7e7b856d4e5ae6 + RNSVG: ba3e7232f45e34b7b47e74472386cf4e1a676d0a SDWebImage: 750adf017a315a280c60fde706ab1e552a3ae4e9 SDWebImageAVIFCoder: 8348fef6d0ec69e129c66c9fe4d74fbfbf366112 SDWebImageSVGCoder: 15a300a97ec1c8ac958f009c02220ac0402e936c SDWebImageWebPCoder: af09429398d99d524cae2fe00f6f0f6e491ed102 SocketRocket: f32cd54efbe0f095c4d7594881e52619cfe80b17 Turf: 13d1a92d969ca0311bbc26e8356cca178ce95da2 - VisionCamera: fda554d8751e395effcc87749f8b7c198c1031be - Yoga: 13c8ef87792450193e117976337b8527b49e8c03 + VisionCamera: 0a6794d1974aed5d653d0d0cb900493e2583e35a + Yoga: e64aa65de36c0832d04e8c7bd614396c77a80047 PODFILE CHECKSUM: 0ccbb4f2406893c6e9f266dc1e7470dcd72885d2 From 5d46e5c67d2015e8d333d7e9d45bd968e6c881c5 Mon Sep 17 00:00:00 2001 From: Bartosz Grajdek Date: Thu, 15 Feb 2024 14:55:53 +0100 Subject: [PATCH 194/288] fix: update podfile after main merge --- ios/Podfile.lock | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 53bfdc978252..c8daf25f78b3 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1160,7 +1160,9 @@ PODS: - React-Core - react-native-blob-util (0.19.4): - React-Core - - react-native-cameraroll (5.4.0): + - react-native-cameraroll (7.4.0): + - glog + - RCT-Folly (= 2022.05.16.00) - React-Core - react-native-config (1.4.6): - react-native-config/App (= 1.4.6) @@ -1922,7 +1924,7 @@ SPEC CHECKSUMS: React-Mapbuffer: 9ee041e1d7be96da6d76a251f92e72b711c651d6 react-native-airship: 6ded22e4ca54f2f80db80b7b911c2b9b696d9335 react-native-blob-util: 30a6c9fd067aadf9177e61a998f2c7efb670598d - react-native-cameraroll: 8ffb0af7a5e5de225fd667610e2979fc1f0c2151 + react-native-cameraroll: 3301d62d45616ee9da55ceed04be8d788c3de3ef react-native-config: 7cd105e71d903104e8919261480858940a6b9c0e react-native-document-picker: 3599b238843369026201d2ef466df53f77ae0452 react-native-geolocation: 0f7fe8a4c2de477e278b0365cce27d089a8c5903 From c1a1b2fd2bca64affd94e4b936d45dbcb20798e5 Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Thu, 15 Feb 2024 09:07:05 -0500 Subject: [PATCH 195/288] prettier --- src/libs/ReportActionsUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/ReportActionsUtils.ts b/src/libs/ReportActionsUtils.ts index 8e7fb084010c..eeebbdf7dbdb 100644 --- a/src/libs/ReportActionsUtils.ts +++ b/src/libs/ReportActionsUtils.ts @@ -6,7 +6,7 @@ import Onyx from 'react-native-onyx'; import type {ValueOf} from 'type-fest'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; -import type {ActionName, ChangeLog, OriginalMessageIOU, OriginalMessageActionableMentionWhisper, OriginalMessageReimbursementDequeued} from '@src/types/onyx/OriginalMessage'; +import type {ActionName, ChangeLog, OriginalMessageActionableMentionWhisper, OriginalMessageIOU, OriginalMessageReimbursementDequeued} from '@src/types/onyx/OriginalMessage'; import type Report from '@src/types/onyx/Report'; import type {Message, ReportActionBase, ReportActions} from '@src/types/onyx/ReportAction'; import type ReportAction from '@src/types/onyx/ReportAction'; From f32c3a7dacca9a148d217a500ed849276235af01 Mon Sep 17 00:00:00 2001 From: filip-solecki <153545991+filip-solecki@users.noreply.github.com> Date: Thu, 15 Feb 2024 15:08:43 +0100 Subject: [PATCH 196/288] Update .github/libs/GitUtils.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Błażej Kustra <46095609+blazejkustra@users.noreply.github.com> --- .github/libs/GitUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/libs/GitUtils.ts b/.github/libs/GitUtils.ts index 051a3f3dc40b..e7423f97a934 100644 --- a/.github/libs/GitUtils.ts +++ b/.github/libs/GitUtils.ts @@ -10,7 +10,7 @@ type CommitType = { }; /** - * When fetching the given tag, exclude all history reachable by the shallowExcludeTag (used to make fetch much faster) + * @param [shallowExcludeTag] When fetching the given tag, exclude all history reachable by the shallowExcludeTag (used to make fetch much faster) */ function fetchTag(tag: string, shallowExcludeTag = '') { let shouldRetry = true; From 51d248fbb7e525a9881797b685cd3d4358e61873 Mon Sep 17 00:00:00 2001 From: Filip Solecki Date: Thu, 15 Feb 2024 15:22:59 +0100 Subject: [PATCH 197/288] Fix gh-actions --- .github/actions/javascript/createOrUpdateStagingDeploy/index.js | 2 +- .github/actions/javascript/getDeployPullRequestList/index.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/actions/javascript/createOrUpdateStagingDeploy/index.js b/.github/actions/javascript/createOrUpdateStagingDeploy/index.js index c09c1b8621f3..541a0b9683d0 100644 --- a/.github/actions/javascript/createOrUpdateStagingDeploy/index.js +++ b/.github/actions/javascript/createOrUpdateStagingDeploy/index.js @@ -16719,7 +16719,7 @@ const CONST = __importStar(__nccwpck_require__(4097)); const sanitizeStringForJSONParse_1 = __importDefault(__nccwpck_require__(9338)); const VERSION_UPDATER = __importStar(__nccwpck_require__(8007)); /** - * When fetching the given tag, exclude all history reachable by the shallowExcludeTag (used to make fetch much faster) + * @param [shallowExcludeTag] When fetching the given tag, exclude all history reachable by the shallowExcludeTag (used to make fetch much faster) */ function fetchTag(tag, shallowExcludeTag = '') { let shouldRetry = true; diff --git a/.github/actions/javascript/getDeployPullRequestList/index.js b/.github/actions/javascript/getDeployPullRequestList/index.js index 837dfd82adf1..e1d50f61da1f 100644 --- a/.github/actions/javascript/getDeployPullRequestList/index.js +++ b/.github/actions/javascript/getDeployPullRequestList/index.js @@ -13951,7 +13951,7 @@ const CONST = __importStar(__nccwpck_require__(4097)); const sanitizeStringForJSONParse_1 = __importDefault(__nccwpck_require__(9338)); const VERSION_UPDATER = __importStar(__nccwpck_require__(8007)); /** - * When fetching the given tag, exclude all history reachable by the shallowExcludeTag (used to make fetch much faster) + * @param [shallowExcludeTag] When fetching the given tag, exclude all history reachable by the shallowExcludeTag (used to make fetch much faster) */ function fetchTag(tag, shallowExcludeTag = '') { let shouldRetry = true; From 9a9e7c0e917527c42be75415af6cfd82986728c2 Mon Sep 17 00:00:00 2001 From: Shubham Agrawal Date: Thu, 15 Feb 2024 20:03:01 +0530 Subject: [PATCH 198/288] Fixed state reset on going back from amount step --- src/pages/iou/request/step/IOURequestStepConfirmation.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/pages/iou/request/step/IOURequestStepConfirmation.js b/src/pages/iou/request/step/IOURequestStepConfirmation.js index 8c94bb32ffa9..caf8a1c4fe95 100644 --- a/src/pages/iou/request/step/IOURequestStepConfirmation.js +++ b/src/pages/iou/request/step/IOURequestStepConfirmation.js @@ -417,9 +417,8 @@ function IOURequestStepConfirmation({ }, ]} /> - {isLoading ? ( - - ) : ( + {isLoading && } + - )} + )} From 547d4eb6b250100b48a9f62b8599e4d37d99c2d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kacper=20Miko=C5=82ajczak?= Date: Thu, 15 Feb 2024 16:22:28 +0100 Subject: [PATCH 199/288] setup collator --- src/libs/LocaleCompare.ts | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 src/libs/LocaleCompare.ts diff --git a/src/libs/LocaleCompare.ts b/src/libs/LocaleCompare.ts new file mode 100644 index 000000000000..5142c5b43d9a --- /dev/null +++ b/src/libs/LocaleCompare.ts @@ -0,0 +1,21 @@ +import Onyx from 'react-native-onyx'; +import ONYXKEYS from '@src/ONYXKEYS'; + +const DEFAULT_LOCALE = 'en'; + +const COLLATOR_OPTIONS: Intl.CollatorOptions = {usage: 'sort', sensitivity: 'base'}; + +let collator = new Intl.Collator(DEFAULT_LOCALE, COLLATOR_OPTIONS); + +Onyx.connect({ + key: ONYXKEYS.NVP_PREFERRED_LOCALE, + callback: (locale) => { + collator = new Intl.Collator(locale ?? DEFAULT_LOCALE, COLLATOR_OPTIONS); + }, +}); + +function localeCompare(a: string, b: string) { + return collator.compare(a, b); +} + +export default localeCompare; From 2c430dd4d97afcbf36a7981d146ab2fa18ffe65b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kacper=20Miko=C5=82ajczak?= Date: Thu, 15 Feb 2024 16:26:18 +0100 Subject: [PATCH 200/288] replace localeCompare with collator in getOrderedReportIDs --- src/libs/SidebarUtils.ts | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/libs/SidebarUtils.ts b/src/libs/SidebarUtils.ts index 2347f5b9f5c5..695ca8a570a2 100644 --- a/src/libs/SidebarUtils.ts +++ b/src/libs/SidebarUtils.ts @@ -13,6 +13,7 @@ import type {ReportActions} from '@src/types/onyx/ReportAction'; import type ReportAction from '@src/types/onyx/ReportAction'; import type DeepValueOf from '@src/types/utils/DeepValueOf'; import * as CollectionUtils from './CollectionUtils'; +import localeCompare from './localeCompare'; import * as LocalePhoneNumber from './LocalePhoneNumber'; import * as Localize from './Localize'; import * as OptionsListUtils from './OptionsListUtils'; @@ -200,20 +201,20 @@ function getOrderedReportIDs( }); // Sort each group of reports accordingly - pinnedAndGBRReports.sort((a, b) => (a?.displayName && b?.displayName ? a.displayName.toLowerCase().localeCompare(b.displayName.toLowerCase()) : 0)); - draftReports.sort((a, b) => (a?.displayName && b?.displayName ? a.displayName.toLowerCase().localeCompare(b.displayName.toLowerCase()) : 0)); + pinnedAndGBRReports.sort((a, b) => (a?.displayName && b?.displayName ? localeCompare(a.displayName, b.displayName) : 0)); + draftReports.sort((a, b) => (a?.displayName && b?.displayName ? localeCompare(a.displayName, b.displayName) : 0)); if (isInDefaultMode) { nonArchivedReports.sort((a, b) => { const compareDates = a?.lastVisibleActionCreated && b?.lastVisibleActionCreated ? compareStringDates(b.lastVisibleActionCreated, a.lastVisibleActionCreated) : 0; - const compareDisplayNames = a?.displayName && b?.displayName ? a.displayName.toLowerCase().localeCompare(b.displayName.toLowerCase()) : 0; + const compareDisplayNames = a?.displayName && b?.displayName ? localeCompare(a.displayName, b.displayName) : 0; return compareDates || compareDisplayNames; }); // For archived reports ensure that most recent reports are at the top by reversing the order archivedReports.sort((a, b) => (a?.lastVisibleActionCreated && b?.lastVisibleActionCreated ? compareStringDates(b.lastVisibleActionCreated, a.lastVisibleActionCreated) : 0)); } else { - nonArchivedReports.sort((a, b) => (a?.displayName && b?.displayName ? a.displayName.toLowerCase().localeCompare(b.displayName.toLowerCase()) : 0)); - archivedReports.sort((a, b) => (a?.displayName && b?.displayName ? a.displayName.toLowerCase().localeCompare(b.displayName.toLowerCase()) : 0)); + nonArchivedReports.sort((a, b) => (a?.displayName && b?.displayName ? localeCompare(a.displayName, b.displayName) : 0)); + archivedReports.sort((a, b) => (a?.displayName && b?.displayName ? localeCompare(a.displayName, b.displayName) : 0)); } // Now that we have all the reports grouped and sorted, they must be flattened into an array and only return the reportID. From b0831796244d18e39a77978ecca6d9e64d4ffeea Mon Sep 17 00:00:00 2001 From: Vadym Date: Thu, 15 Feb 2024 16:32:18 +0100 Subject: [PATCH 201/288] chore: adds white space for better readability --- src/pages/home/report/ReactionList/BaseReactionList.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/home/report/ReactionList/BaseReactionList.tsx b/src/pages/home/report/ReactionList/BaseReactionList.tsx index 09471faf0b42..d1b0d8c4ca84 100755 --- a/src/pages/home/report/ReactionList/BaseReactionList.tsx +++ b/src/pages/home/report/ReactionList/BaseReactionList.tsx @@ -43,6 +43,7 @@ const getItemLayout = (data: ArrayLike | null | undefined, inde function BaseReactionList({hasUserReacted = false, users, isVisible = false, emojiCodes, emojiCount, emojiName, onClose}: BaseReactionListProps) { const {isSmallScreenWidth} = useWindowDimensions(); const {hoveredComponentBG, reactionListContainer, reactionListContainerFixedWidth, pv2} = useThemeStyles(); + if (!isVisible) { return null; } From f2655d1c2787a050607ef44fc04f76034689c14e Mon Sep 17 00:00:00 2001 From: maddylewis <38016013+maddylewis@users.noreply.github.com> Date: Thu, 15 Feb 2024 10:40:08 -0500 Subject: [PATCH 202/288] Update redirects.csv redirect helpdot support article to usedot --- docs/redirects.csv | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/redirects.csv b/docs/redirects.csv index 674e5c32ab04..7bd591c1413c 100644 --- a/docs/redirects.csv +++ b/docs/redirects.csv @@ -52,3 +52,4 @@ https://help.expensify.com/articles/expensify-classic/getting-started/approved-a https://help.expensify.com/expensify-classic/hubs/getting-started/plan-types,https://use.expensify.com/ https://help.expensify.com/articles/expensify-classic/getting-started/Employees,https://help.expensify.com/articles/expensify-classic/getting-started/Join-your-company's-workspace https://help.expensify.com/articles/expensify-classic/getting-started/Using-The-App,https://help.expensify.com/articles/expensify-classic/getting-started/Join-your-company's-workspace +https://help.expensify.com/articles/expensify-classic/getting-started/support/Expensify-Support,https://use.expensify.com/support From 5a6f96984a05074e11cd7b3f6674c50e504e3215 Mon Sep 17 00:00:00 2001 From: Hezekiel Tamire Date: Thu, 15 Feb 2024 20:58:42 +0300 Subject: [PATCH 203/288] restart from home route for native platforms --- src/setup/index.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/setup/index.ts b/src/setup/index.ts index aac6f1e4e732..1869e9c8ef93 100644 --- a/src/setup/index.ts +++ b/src/setup/index.ts @@ -6,8 +6,16 @@ import * as Device from '@userActions/Device'; import exposeGlobalMemoryOnlyKeysMethods from '@userActions/MemoryOnlyKeys/exposeGlobalMemoryOnlyKeysMethods'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; +import getPlatform from '@libs/getPlatform'; import platformSetup from './platformSetup'; +function initializeLastVisitedPath(): string | undefined { + if(!(getPlatform() === CONST.PLATFORM.ANDROID || getPlatform() === CONST.PLATFORM.IOS)){ + return; + } + return ''; +} + export default function () { /* * Initialize the Onyx store when the app loads for the first time. @@ -40,6 +48,8 @@ export default function () { isVisible: false, willAlertModalBecomeVisible: false, }, + // Always open the home route on app startup for native platforms by clearing the lastVisitedPath + [ONYXKEYS.LAST_VISITED_PATH]: initializeLastVisitedPath() }, }); From 781e5badf632f27115d775c2cab2c123197c5975 Mon Sep 17 00:00:00 2001 From: Pujan Date: Thu, 15 Feb 2024 23:41:00 +0530 Subject: [PATCH 204/288] hide submit button for plaid loading --- src/pages/ReimbursementAccount/BankInfo/substeps/Plaid.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/ReimbursementAccount/BankInfo/substeps/Plaid.tsx b/src/pages/ReimbursementAccount/BankInfo/substeps/Plaid.tsx index 7728ef836d64..a1a609f13734 100644 --- a/src/pages/ReimbursementAccount/BankInfo/substeps/Plaid.tsx +++ b/src/pages/ReimbursementAccount/BankInfo/substeps/Plaid.tsx @@ -85,6 +85,7 @@ function Plaid({reimbursementAccount, reimbursementAccountDraft, onNext, plaidDa scrollContextEnabled submitButtonText={translate('common.next')} style={[styles.mh5, styles.flexGrow1]} + isSubmitButtonVisible={(plaidData?.bankAccounts ?? []).length > 0} > Date: Thu, 15 Feb 2024 20:40:13 +0100 Subject: [PATCH 205/288] Set the error correctly --- src/libs/actions/IOU.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index 41f7e4101d2a..0c26d7b5fc21 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -3679,7 +3679,7 @@ function cancelPayment(expenseReport: OnyxTypes.Report, chatReport: OnyxTypes.Re onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseReport.reportID}`, value: { - [expenseReport.reportActionID ?? '']: { + [optimisticReportAction.reportActionID ?? '']: { errors: ErrorUtils.getMicroSecondOnyxError('iou.error.other'), }, }, From 76401c1183c9e45db7a7d9ec3032fb407cfff154 Mon Sep 17 00:00:00 2001 From: Filip Solecki Date: Thu, 15 Feb 2024 22:18:49 +0100 Subject: [PATCH 206/288] rename import --- tests/e2e/utils/logger.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/e2e/utils/logger.js b/tests/e2e/utils/logger.js index aa8be5b84b26..5a7046d8c8b0 100644 --- a/tests/e2e/utils/logger.js +++ b/tests/e2e/utils/logger.js @@ -1,6 +1,6 @@ import fs from 'fs'; import path from 'path'; -import CONST from '../config'; +import CONFIG from '../config'; let isVerbose = true; const setLogLevelVerbose = (value) => { @@ -23,18 +23,18 @@ const log = (...args) => { } // Write to log file - if (!fs.existsSync(CONST.LOG_FILE)) { + if (!fs.existsSync(CONFIG.LOG_FILE)) { // Check that the directory exists - const logDir = path.dirname(CONST.LOG_FILE); + const logDir = path.dirname(CONFIG.LOG_FILE); if (!fs.existsSync(logDir)) { fs.mkdirSync(logDir); } - fs.writeFileSync(CONST.LOG_FILE, ''); + fs.writeFileSync(CONFIG.LOG_FILE, ''); } const time = new Date(); const timeStr = `${time.getHours()}:${time.getMinutes()}:${time.getSeconds()} ${time.getMilliseconds()}`; - fs.appendFileSync(CONST.LOG_FILE, `[${timeStr}] ${args.join(' ')}\n`); + fs.appendFileSync(CONFIG.LOG_FILE, `[${timeStr}] ${args.join(' ')}\n`); }; const info = (...args) => { From a12533eb7e2fab158fd1e697fe92f181bba1546a Mon Sep 17 00:00:00 2001 From: Hezekiel Tamire Date: Fri, 16 Feb 2024 00:46:58 +0300 Subject: [PATCH 207/288] run prettier --- src/setup/index.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/setup/index.ts b/src/setup/index.ts index 1869e9c8ef93..afe5027e37b1 100644 --- a/src/setup/index.ts +++ b/src/setup/index.ts @@ -1,16 +1,16 @@ import {I18nManager} from 'react-native'; import Onyx from 'react-native-onyx'; +import getPlatform from '@libs/getPlatform'; import intlPolyfill from '@libs/IntlPolyfill'; import * as Metrics from '@libs/Metrics'; import * as Device from '@userActions/Device'; import exposeGlobalMemoryOnlyKeysMethods from '@userActions/MemoryOnlyKeys/exposeGlobalMemoryOnlyKeysMethods'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; -import getPlatform from '@libs/getPlatform'; import platformSetup from './platformSetup'; function initializeLastVisitedPath(): string | undefined { - if(!(getPlatform() === CONST.PLATFORM.ANDROID || getPlatform() === CONST.PLATFORM.IOS)){ + if (!(getPlatform() === CONST.PLATFORM.ANDROID || getPlatform() === CONST.PLATFORM.IOS)) { return; } return ''; @@ -49,7 +49,7 @@ export default function () { willAlertModalBecomeVisible: false, }, // Always open the home route on app startup for native platforms by clearing the lastVisitedPath - [ONYXKEYS.LAST_VISITED_PATH]: initializeLastVisitedPath() + [ONYXKEYS.LAST_VISITED_PATH]: initializeLastVisitedPath(), }, }); From 108a9b3714ecd1d233031619d5f0a5255a76d334 Mon Sep 17 00:00:00 2001 From: Hezekiel Tamire Date: Fri, 16 Feb 2024 09:16:25 +0300 Subject: [PATCH 208/288] use platform specific files instead of codes --- src/setup/index.ts | 9 +-------- src/setup/initializeLastVisitedPath/index.native.ts | 3 +++ src/setup/initializeLastVisitedPath/index.ts | 1 + 3 files changed, 5 insertions(+), 8 deletions(-) create mode 100644 src/setup/initializeLastVisitedPath/index.native.ts create mode 100644 src/setup/initializeLastVisitedPath/index.ts diff --git a/src/setup/index.ts b/src/setup/index.ts index afe5027e37b1..2cb28aba66fc 100644 --- a/src/setup/index.ts +++ b/src/setup/index.ts @@ -1,6 +1,5 @@ import {I18nManager} from 'react-native'; import Onyx from 'react-native-onyx'; -import getPlatform from '@libs/getPlatform'; import intlPolyfill from '@libs/IntlPolyfill'; import * as Metrics from '@libs/Metrics'; import * as Device from '@userActions/Device'; @@ -8,13 +7,7 @@ import exposeGlobalMemoryOnlyKeysMethods from '@userActions/MemoryOnlyKeys/expos import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import platformSetup from './platformSetup'; - -function initializeLastVisitedPath(): string | undefined { - if (!(getPlatform() === CONST.PLATFORM.ANDROID || getPlatform() === CONST.PLATFORM.IOS)) { - return; - } - return ''; -} +import initializeLastVisitedPath from './initializeLastVisitedPath'; export default function () { /* diff --git a/src/setup/initializeLastVisitedPath/index.native.ts b/src/setup/initializeLastVisitedPath/index.native.ts new file mode 100644 index 000000000000..9a72d16c928d --- /dev/null +++ b/src/setup/initializeLastVisitedPath/index.native.ts @@ -0,0 +1,3 @@ +export default function (): string { + return ''; +} \ No newline at end of file diff --git a/src/setup/initializeLastVisitedPath/index.ts b/src/setup/initializeLastVisitedPath/index.ts new file mode 100644 index 000000000000..2c85361c6c75 --- /dev/null +++ b/src/setup/initializeLastVisitedPath/index.ts @@ -0,0 +1 @@ +export default function (): undefined {}; From 0b778c034e87fce9ce83b6ce88ff8e0c39e47fcf Mon Sep 17 00:00:00 2001 From: Hezekiel Tamire Date: Fri, 16 Feb 2024 09:19:24 +0300 Subject: [PATCH 209/288] run prettier --- src/setup/index.ts | 2 +- src/setup/initializeLastVisitedPath/index.native.ts | 2 +- src/setup/initializeLastVisitedPath/index.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/setup/index.ts b/src/setup/index.ts index 2cb28aba66fc..fe9d80ec5fb1 100644 --- a/src/setup/index.ts +++ b/src/setup/index.ts @@ -6,8 +6,8 @@ import * as Device from '@userActions/Device'; import exposeGlobalMemoryOnlyKeysMethods from '@userActions/MemoryOnlyKeys/exposeGlobalMemoryOnlyKeysMethods'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; -import platformSetup from './platformSetup'; import initializeLastVisitedPath from './initializeLastVisitedPath'; +import platformSetup from './platformSetup'; export default function () { /* diff --git a/src/setup/initializeLastVisitedPath/index.native.ts b/src/setup/initializeLastVisitedPath/index.native.ts index 9a72d16c928d..8106ed06c19e 100644 --- a/src/setup/initializeLastVisitedPath/index.native.ts +++ b/src/setup/initializeLastVisitedPath/index.native.ts @@ -1,3 +1,3 @@ export default function (): string { return ''; -} \ No newline at end of file +} diff --git a/src/setup/initializeLastVisitedPath/index.ts b/src/setup/initializeLastVisitedPath/index.ts index 2c85361c6c75..22f5b2c5c74e 100644 --- a/src/setup/initializeLastVisitedPath/index.ts +++ b/src/setup/initializeLastVisitedPath/index.ts @@ -1 +1 @@ -export default function (): undefined {}; +export default function (): undefined {} From b9bbf24c278c4d89b0a4ce96836bb00fc150d896 Mon Sep 17 00:00:00 2001 From: dukenv0307 Date: Fri, 16 Feb 2024 14:52:16 +0700 Subject: [PATCH 210/288] resolve conflict --- src/pages/home/report/ReportActionItemMessage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/home/report/ReportActionItemMessage.tsx b/src/pages/home/report/ReportActionItemMessage.tsx index ac3238002906..ad571eb66f10 100644 --- a/src/pages/home/report/ReportActionItemMessage.tsx +++ b/src/pages/home/report/ReportActionItemMessage.tsx @@ -58,7 +58,7 @@ function ReportActionItemMessage({action, displayAsGroup, reportID, style, isHid const originalMessage = action.actionName === CONST.REPORT.ACTIONS.TYPE.IOU ? action.originalMessage : null; const iouReportID = originalMessage?.IOUReportID; if (iouReportID) { - iouMessage = ReportUtils.getIOUReportActionDisplayMessage(action); + iouMessage = ReportUtils.getReportPreviewMessage(ReportUtils.getReport(iouReportID), action, false, false, null, false, true); } } From e145012dc17a52f7924c0b4e578cdb88bc60390a Mon Sep 17 00:00:00 2001 From: dukenv0307 Date: Fri, 16 Feb 2024 16:15:58 +0700 Subject: [PATCH 211/288] remove getIOUReportActionDisplayMessage function --- src/libs/ReportUtils.ts | 57 ------------------------ tests/perf-test/ReportUtils.perf-test.ts | 19 -------- 2 files changed, 76 deletions(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 4594cae3ec06..38ddfe379d9e 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -4603,62 +4603,6 @@ function getVisibleMemberIDs(report: OnyxEntry): number[] { return visibleChatMemberAccountIDs; } -/** - * Return iou report action display message - */ -function getIOUReportActionDisplayMessage(reportAction: OnyxEntry): string { - if (reportAction?.actionName !== CONST.REPORT.ACTIONS.TYPE.IOU) { - return ''; - } - const originalMessage = reportAction.originalMessage; - const {IOUReportID} = originalMessage; - const iouReport = getReport(IOUReportID); - let translationKey: TranslationPaths; - if (originalMessage.type === CONST.IOU.REPORT_ACTION_TYPE.PAY) { - // The `REPORT_ACTION_TYPE.PAY` action type is used for both fulfilling existing requests and sending money. To - // differentiate between these two scenarios, we check if the `originalMessage` contains the `IOUDetails` - // property. If it does, it indicates that this is a 'Send money' action. - const {amount, currency} = originalMessage.IOUDetails ?? originalMessage; - const formattedAmount = CurrencyUtils.convertToDisplayString(Math.abs(amount), currency) ?? ''; - const payerName = isExpenseReport(iouReport) ? getPolicyName(iouReport) : getDisplayNameForParticipant(iouReport?.managerID, true); - - switch (originalMessage.paymentType) { - case CONST.IOU.PAYMENT_TYPE.ELSEWHERE: - translationKey = 'iou.paidElsewhereWithAmount'; - break; - case CONST.IOU.PAYMENT_TYPE.EXPENSIFY: - case CONST.IOU.PAYMENT_TYPE.VBBA: - translationKey = 'iou.paidWithExpensifyWithAmount'; - break; - default: - translationKey = 'iou.payerPaidAmount'; - break; - } - return Localize.translateLocal(translationKey, {amount: formattedAmount, payer: payerName ?? ''}); - } - - const transaction = TransactionUtils.getTransaction(originalMessage.IOUTransactionID ?? ''); - const transactionDetails = getTransactionDetails(!isEmptyObject(transaction) ? transaction : null); - const formattedAmount = CurrencyUtils.convertToDisplayString(transactionDetails?.amount ?? 0, transactionDetails?.currency); - const isRequestSettled = isSettled(originalMessage.IOUReportID); - const isApproved = isReportApproved(iouReport); - if (isRequestSettled) { - return Localize.translateLocal('iou.payerSettled', { - amount: formattedAmount, - }); - } - if (isApproved) { - return Localize.translateLocal('iou.approvedAmount', { - amount: formattedAmount, - }); - } - translationKey = ReportActionsUtils.isSplitBillAction(reportAction) ? 'iou.didSplitAmount' : 'iou.requestedAmount'; - return Localize.translateLocal(translationKey, { - formattedAmount, - comment: transactionDetails?.comment ?? '', - }); -} - /** * Checks if a report is a group chat. * @@ -5088,7 +5032,6 @@ export { hasOnlyTransactionsWithPendingRoutes, hasNonReimbursableTransactions, hasMissingSmartscanFields, - getIOUReportActionDisplayMessage, isWaitingForAssigneeToCompleteTask, isGroupChat, isDraftExpenseReport, diff --git a/tests/perf-test/ReportUtils.perf-test.ts b/tests/perf-test/ReportUtils.perf-test.ts index ae3429bb9c01..ee3c54608436 100644 --- a/tests/perf-test/ReportUtils.perf-test.ts +++ b/tests/perf-test/ReportUtils.perf-test.ts @@ -184,23 +184,4 @@ describe('ReportUtils', () => { await waitForBatchedUpdates(); await measureFunction(() => ReportUtils.getTransactionDetails(transaction, 'yyyy-MM-dd')); }); - - test('[ReportUtils] getIOUReportActionDisplayMessage on 1k policies', async () => { - const reportAction = { - ...createRandomReportAction(1), - actionName: CONST.REPORT.ACTIONS.TYPE.IOU, - originalMessage: { - IOUReportID: '1', - IOUTransactionID: '1', - amount: 100, - participantAccountID: 1, - currency: CONST.CURRENCY.USD, - type: CONST.IOU.REPORT_ACTION_TYPE.PAY, - paymentType: CONST.IOU.PAYMENT_TYPE.EXPENSIFY, - }, - }; - - await waitForBatchedUpdates(); - await measureFunction(() => ReportUtils.getIOUReportActionDisplayMessage(reportAction)); - }); }); From 3318c2da23cc1060c5faa2b5eba40709cc7acdd6 Mon Sep 17 00:00:00 2001 From: Tomasz Misiukiewicz Date: Fri, 16 Feb 2024 10:36:21 +0100 Subject: [PATCH 212/288] fix collecting logs on dev --- src/libs/Console/index.ts | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/libs/Console/index.ts b/src/libs/Console/index.ts index 0dc9e1208888..07e68a5c4d90 100644 --- a/src/libs/Console/index.ts +++ b/src/libs/Console/index.ts @@ -1,9 +1,22 @@ /* eslint-disable @typescript-eslint/naming-convention */ +import Onyx from 'react-native-onyx'; import {addLog} from '@libs/actions/Console'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import type {Log} from '@src/types/onyx'; +let shouldStoreLogs = false; + +Onyx.connect({ + key: ONYXKEYS.SHOULD_STORE_LOGS, + callback: (val) => { + if (!val) { + return; + } + shouldStoreLogs = val; + }, +}); + /* store the original console.log function so we can call it */ // eslint-disable-next-line no-console const originalConsoleLog = console.log; @@ -48,7 +61,10 @@ function logMessage(args: unknown[]) { */ // eslint-disable-next-line no-console console.log = (...args) => { - logMessage(args); + if (shouldStoreLogs) { + logMessage(args); + } + originalConsoleLog.apply(console, args); }; From 7359135e3451b8d3a218e4da4f4831c663994517 Mon Sep 17 00:00:00 2001 From: dragnoir Date: Fri, 16 Feb 2024 11:03:39 +0100 Subject: [PATCH 213/288] fix: emoji picker misaligned --- .../EmojiPicker/EmojiPickerMenu/BaseEmojiPickerMenu.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/components/EmojiPicker/EmojiPickerMenu/BaseEmojiPickerMenu.js b/src/components/EmojiPicker/EmojiPickerMenu/BaseEmojiPickerMenu.js index 059f3fc5f848..123c952da79a 100644 --- a/src/components/EmojiPicker/EmojiPickerMenu/BaseEmojiPickerMenu.js +++ b/src/components/EmojiPicker/EmojiPickerMenu/BaseEmojiPickerMenu.js @@ -112,6 +112,10 @@ function BaseEmojiPickerMenu({headerEmojis, scrollToHeader, isFiltered, listWrap const styles = useThemeStyles(); const {windowWidth, isSmallScreenWidth} = useWindowDimensions(); + // related to https://github.com/Expensify/App/issues/34522 + const roundedWindowWidth = Math.floor(windowWidth); + const containerWidth = isSmallScreenWidth ? roundedWindowWidth : CONST.EMOJI_PICKER_SIZE.WIDTH; + const flattenListWrapperStyle = useMemo(() => StyleSheet.flatten(listWrapperStyle), [listWrapperStyle]); return ( @@ -122,7 +126,7 @@ function BaseEmojiPickerMenu({headerEmojis, scrollToHeader, isFiltered, listWrap onPress={scrollToHeader} /> )} - + Date: Fri, 16 Feb 2024 11:04:43 +0100 Subject: [PATCH 214/288] fix: prettier --- .../EmojiPicker/EmojiPickerMenu/BaseEmojiPickerMenu.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/EmojiPicker/EmojiPickerMenu/BaseEmojiPickerMenu.js b/src/components/EmojiPicker/EmojiPickerMenu/BaseEmojiPickerMenu.js index 123c952da79a..3c3804a42a24 100644 --- a/src/components/EmojiPicker/EmojiPickerMenu/BaseEmojiPickerMenu.js +++ b/src/components/EmojiPicker/EmojiPickerMenu/BaseEmojiPickerMenu.js @@ -113,8 +113,8 @@ function BaseEmojiPickerMenu({headerEmojis, scrollToHeader, isFiltered, listWrap const {windowWidth, isSmallScreenWidth} = useWindowDimensions(); // related to https://github.com/Expensify/App/issues/34522 - const roundedWindowWidth = Math.floor(windowWidth); - const containerWidth = isSmallScreenWidth ? roundedWindowWidth : CONST.EMOJI_PICKER_SIZE.WIDTH; + const roundedWindowWidth = Math.floor(windowWidth); + const containerWidth = isSmallScreenWidth ? roundedWindowWidth : CONST.EMOJI_PICKER_SIZE.WIDTH; const flattenListWrapperStyle = useMemo(() => StyleSheet.flatten(listWrapperStyle), [listWrapperStyle]); @@ -126,7 +126,7 @@ function BaseEmojiPickerMenu({headerEmojis, scrollToHeader, isFiltered, listWrap onPress={scrollToHeader} /> )} - + Date: Fri, 16 Feb 2024 18:10:04 +0800 Subject: [PATCH 215/288] use popover anchor tooltip --- src/components/Reactions/ReportActionItemEmojiReactions.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Reactions/ReportActionItemEmojiReactions.tsx b/src/components/Reactions/ReportActionItemEmojiReactions.tsx index 69779dc316e1..ac05432a0555 100644 --- a/src/components/Reactions/ReportActionItemEmojiReactions.tsx +++ b/src/components/Reactions/ReportActionItemEmojiReactions.tsx @@ -4,7 +4,7 @@ import {View} from 'react-native'; import type {OnyxEntry} from 'react-native-onyx'; import type {Emoji} from '@assets/emojis/types'; import OfflineWithFeedback from '@components/OfflineWithFeedback'; -import Tooltip from '@components/Tooltip'; +import Tooltip from '@components/Tooltip/PopoverAnchorTooltip'; import withCurrentUserPersonalDetails from '@components/withCurrentUserPersonalDetails'; import type {WithCurrentUserPersonalDetailsProps} from '@components/withCurrentUserPersonalDetails'; import useThemeStyles from '@hooks/useThemeStyles'; From da99663647a05e669133f218f099c566ce98f9e9 Mon Sep 17 00:00:00 2001 From: Bartosz Grajdek Date: Fri, 16 Feb 2024 11:52:39 +0100 Subject: [PATCH 216/288] refactor: change onyx updates --- src/libs/actions/IOU.ts | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index 05b8ca5806b0..47bbca9d75d3 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -3844,15 +3844,7 @@ function putOnHold(transactionID: string, comment: string, reportID: string) { }, ]; - const successData: OnyxUpdate[] = [ - { - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`, - value: { - [createdReportAction.reportActionID]: null, - }, - }, - ]; + const successData: OnyxUpdate[] = []; const failureData: OnyxUpdate[] = [ { @@ -3903,13 +3895,6 @@ function unholdRequest(transactionID: string, reportID: string) { ]; const successData: OnyxUpdate[] = [ - { - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`, - value: { - [createdReportAction.reportActionID]: null, - }, - }, { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, From bd1881aebcb17e40f723a5886a97817b2826a1c9 Mon Sep 17 00:00:00 2001 From: Bartosz Grajdek Date: Fri, 16 Feb 2024 12:00:01 +0100 Subject: [PATCH 217/288] fix: lint --- src/components/MoneyRequestHeader.tsx | 11 ++--------- src/libs/ReportUtils.ts | 1 - src/pages/iou/HoldReasonPage.tsx | 4 ++-- src/types/form/MoneyRequestHoldReasonForm.ts | 4 ++-- 4 files changed, 6 insertions(+), 14 deletions(-) diff --git a/src/components/MoneyRequestHeader.tsx b/src/components/MoneyRequestHeader.tsx index c3855efc8444..1a5a2621e43e 100644 --- a/src/components/MoneyRequestHeader.tsx +++ b/src/components/MoneyRequestHeader.tsx @@ -40,7 +40,7 @@ type MoneyRequestHeaderOnyxProps = { parentReportActions: OnyxEntry; /** Whether we should show the Hold Interstitial explaining the feature */ - shownHoldUseExplanation: OnyxEntry, + shownHoldUseExplanation: OnyxEntry; }; type MoneyRequestHeaderProps = MoneyRequestHeaderOnyxProps & { @@ -93,14 +93,7 @@ function MoneyRequestHeader({session, parentReport, report, parentReportAction, IOU.unholdRequest(parentReportAction?.originalMessage?.IOUTransactionID ?? '', report?.reportID); } else { const activeRoute = encodeURIComponent(Navigation.getActiveRouteWithoutParams()); - Navigation.navigate( - ROUTES.MONEY_REQUEST_HOLD_REASON.getRoute( - policy?.type, - parentReportAction?.originalMessage?.IOUTransactionID ?? '', - report?.reportID, - activeRoute, - ), - ); + Navigation.navigate(ROUTES.MONEY_REQUEST_HOLD_REASON.getRoute(policy?.type, parentReportAction?.originalMessage?.IOUTransactionID ?? '', report?.reportID, activeRoute)); } }; diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 14663c02296b..76af7c22793b 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -3496,7 +3496,6 @@ function buildOptimisticRenamedRoomReportAction(newName: string, oldName: string }; } - /** * Returns the necessary reportAction onyx data to indicate that the transaction has been put on hold optimistically * @param [created] - Action created time diff --git a/src/pages/iou/HoldReasonPage.tsx b/src/pages/iou/HoldReasonPage.tsx index 4acf70764f67..da3b98583630 100644 --- a/src/pages/iou/HoldReasonPage.tsx +++ b/src/pages/iou/HoldReasonPage.tsx @@ -3,6 +3,7 @@ import React, {useCallback} from 'react'; import {View} from 'react-native'; import FormProvider from '@components/Form/FormProvider'; import InputWrapper from '@components/Form/InputWrapper'; +import type {FormInputErrors, FormOnyxValues} from '@components/Form/types'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; import ScreenWrapper from '@components/ScreenWrapper'; import Text from '@components/Text'; @@ -14,8 +15,7 @@ import * as ValidationUtils from '@libs/ValidationUtils'; import * as IOU from '@userActions/IOU'; import type ONYXKEYS from '@src/ONYXKEYS'; import type {Route} from '@src/ROUTES'; -import INPUT_IDS from "@src/types/form/MoneyRequestHoldReasonForm"; -import type {FormInputErrors, FormOnyxValues} from "@components/Form/types"; +import INPUT_IDS from '@src/types/form/MoneyRequestHoldReasonForm'; type HoldReasonPageRouteParams = { /** ID of the transaction the page was opened for */ diff --git a/src/types/form/MoneyRequestHoldReasonForm.ts b/src/types/form/MoneyRequestHoldReasonForm.ts index 7e9047bbc20b..0d80810eaf69 100644 --- a/src/types/form/MoneyRequestHoldReasonForm.ts +++ b/src/types/form/MoneyRequestHoldReasonForm.ts @@ -1,4 +1,4 @@ -import type Form from "./Form"; +import type Form from './Form'; const INPUT_IDS = { COMMENT: 'comment', @@ -9,4 +9,4 @@ type MoneyRequestHoldReasonForm = Form<{ }>; export type {MoneyRequestHoldReasonForm}; -export default INPUT_IDS; \ No newline at end of file +export default INPUT_IDS; From d73a8143ec20c080ef0a00416d19b0b293ddcb77 Mon Sep 17 00:00:00 2001 From: Tomasz Misiukiewicz Date: Fri, 16 Feb 2024 12:01:55 +0100 Subject: [PATCH 218/288] add environment check --- src/libs/Console/index.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/libs/Console/index.ts b/src/libs/Console/index.ts index 07e68a5c4d90..bf7aa246aaf4 100644 --- a/src/libs/Console/index.ts +++ b/src/libs/Console/index.ts @@ -1,6 +1,7 @@ /* eslint-disable @typescript-eslint/naming-convention */ import Onyx from 'react-native-onyx'; import {addLog} from '@libs/actions/Console'; +import CONFIG from '@src/CONFIG'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import type {Log} from '@src/types/onyx'; @@ -57,11 +58,12 @@ function logMessage(args: unknown[]) { /** * Override the console.log function to add logs to the store + * Log only in production environment to avoid storing large logs in development * @param args arguments passed to the console.log function */ // eslint-disable-next-line no-console console.log = (...args) => { - if (shouldStoreLogs) { + if (shouldStoreLogs && CONFIG.ENVIRONMENT !== CONST.ENVIRONMENT.DEV) { logMessage(args); } From dec747be80b882dd3e5c858719395adc20115021 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hanno=20J=2E=20G=C3=B6decke?= Date: Fri, 16 Feb 2024 13:26:15 +0100 Subject: [PATCH 219/288] only upload the artefact if specified --- .github/actions/composite/buildAndroidE2EAPK/action.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/actions/composite/buildAndroidE2EAPK/action.yml b/.github/actions/composite/buildAndroidE2EAPK/action.yml index 146ddb3a1a66..3a99ab585d92 100644 --- a/.github/actions/composite/buildAndroidE2EAPK/action.yml +++ b/.github/actions/composite/buildAndroidE2EAPK/action.yml @@ -5,6 +5,10 @@ inputs: ARTIFACT_NAME: description: The name of the workflow artifact where the APK should be uploaded required: true + UPLOAD_ARTEFACT: + description: Whether to upload the APK as an artifact + required: false + default: "true" PACKAGE_SCRIPT_NAME: description: The name of the npm script to run to build the APK required: true @@ -70,6 +74,7 @@ runs: - name: Upload APK uses: actions/upload-artifact@65d862660abb392b8c4a3d1195a2108db131dd05 + if: ${{ inputs.UPLOAD_ARTEFACT == 'true' }} with: name: ${{ inputs.ARTIFACT_NAME }} path: ${{ inputs.APP_OUTPUT_PATH }} From f4b9bdb5ca5775f882bf30bc05638e033c8e8d2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hanno=20J=2E=20G=C3=B6decke?= Date: Fri, 16 Feb 2024 13:26:30 +0100 Subject: [PATCH 220/288] action to find out artefact info --- .../javascript/getArtefactInfo/action.yml | 19 ++++++++++++ .../getArtefactInfo/getArtefactInfo.js | 31 +++++++++++++++++++ .github/libs/GithubUtils.js | 8 +++++ 3 files changed, 58 insertions(+) create mode 100644 .github/actions/javascript/getArtefactInfo/action.yml create mode 100644 .github/actions/javascript/getArtefactInfo/getArtefactInfo.js diff --git a/.github/actions/javascript/getArtefactInfo/action.yml b/.github/actions/javascript/getArtefactInfo/action.yml new file mode 100644 index 000000000000..a955a602ac19 --- /dev/null +++ b/.github/actions/javascript/getArtefactInfo/action.yml @@ -0,0 +1,19 @@ +name: "Get artefact info" +description: "Gets the ID and workflow ID about a specific artefact. By default artifacts are only available in the same workflow. This action can be used to get the info to download an artefact from a different workflow." +inputs: + GITHUB_TOKEN: + description: Auth token for New Expensify Github; necessary for accessing Octokit. + required: true + ARTEFACT_NAME: + description: Name of the artefact to get infos about (e.g. to use for downloading that artefact) + required: true +outputs: + ARTEFACT_FOUND: + description: Whether the artefact was found + ARTEFACT_ID: + description: The ID of the artefact + ARTEFACT_WORKFLOW_ID: + description: The ID of the workflow that produced the artefact +runs: + using: "node20" + main: "index.js" diff --git a/.github/actions/javascript/getArtefactInfo/getArtefactInfo.js b/.github/actions/javascript/getArtefactInfo/getArtefactInfo.js new file mode 100644 index 000000000000..7e05fcee9241 --- /dev/null +++ b/.github/actions/javascript/getArtefactInfo/getArtefactInfo.js @@ -0,0 +1,31 @@ +const _ = require('underscore'); +const core = require('@actions/core'); +const GithubUtils = require('../../../libs/GithubUtils'); + +const run = function () { + const artefactName = core.getInput('ARTEFACT_NAME', {required: true}); + + return GithubUtils.getArtefactByName(artefactName) + .then((artefact) => { + if (_.isUndefined(artefact)) { + console.log(`No artefact found with the name ${artefactName}`); + core.setOutput('ARTEFACT_FOUND', false); + return; + } + + console.log('Artefact info', artefact); + core.setOutput('ARTEFACT_FOUND', true); + core.setOutput('ARTEFACT_ID', artefact.id); + core.setOutput('ARTEFACT_WORKFLOW_ID', artefact.workflow_run.id); + }) + .catch((error) => { + console.error('A problem occurred while trying to communicate with the GitHub API', error); + core.setFailed(error); + }); +}; + +if (require.main === module) { + run(); +} + +module.exports = run; diff --git a/.github/libs/GithubUtils.js b/.github/libs/GithubUtils.js index 787fc604c3cc..35217c43518b 100644 --- a/.github/libs/GithubUtils.js +++ b/.github/libs/GithubUtils.js @@ -524,6 +524,14 @@ class GithubUtils { .then((events) => _.filter(events, (event) => event.event === 'closed')) .then((closedEvents) => lodashGet(_.last(closedEvents), 'actor.login', '')); } + + static getArtefactByName(artefactName) { + return this.paginate(this.octokit.actions.listArtifactsForRepo, { + owner: CONST.GITHUB_OWNER, + repo: CONST.APP_REPO, + per_page: 100, + }).then((data) => _.findWhere(data.artifacts, {name: artefactName})); + } } module.exports = GithubUtils; From d6c64d38a60a269fbdc50ca56b125cf26b25e3d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hanno=20J=2E=20G=C3=B6decke?= Date: Fri, 16 Feb 2024 13:26:59 +0100 Subject: [PATCH 221/288] get baseline artefact correctly --- .github/workflows/e2ePerformanceTests.yml | 24 ++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/.github/workflows/e2ePerformanceTests.yml b/.github/workflows/e2ePerformanceTests.yml index cc107614593d..241ea4cebeca 100644 --- a/.github/workflows/e2ePerformanceTests.yml +++ b/.github/workflows/e2ePerformanceTests.yml @@ -21,8 +21,13 @@ jobs: name: Build apk from latest release as a baseline outputs: VERSION: ${{ steps.getMostRecentRelease.outputs.VERSION }} + ARTEFACT_FOUND: ${{ steps.checkForExistingArtifact.outputs.ARTEFACT_FOUND }} + ARTEFACT_WORKFLOW_ID: ${{ steps.checkForExistingArtifact.outputs.ARTEFACT_WORKFLOW_ID }} steps: - uses: actions/checkout@v4 + with: + # The OS_BOTIFY_COMMIT_TOKEN is a personal access token tied to osbotify (we need a PAT to access the artefact API) + token: ${{ secrets.OS_BOTIFY_COMMIT_TOKEN }} - name: Get most recent release version id: getMostRecentRelease @@ -32,21 +37,23 @@ jobs: - name: Check if there's an existing artifact for this baseline id: checkForExistingArtifact - uses: xSAVIKx/artifact-exists-action@3c5206b1411c0d2fc0840f56b7140646933d9d6a + uses: ./.github/actions/javascript/getArtefactInfo with: - name: baseline-apk-${{ steps.getMostRecentRelease.outputs.VERSION }} + GITHUB_TOKEN: ${{ secrets.OS_BOTIFY_COMMIT_TOKEN }} + ARTEFACT_NAME: baseline-apk-${{ steps.getMostRecentRelease.outputs.VERSION }} - name: Skip build if there's already an existing artifact for the baseline - if: ${{ fromJSON(steps.checkForExistingArtifact.outputs.exists) }} + if: ${{ fromJSON(steps.checkForExistingArtifact.outputs.ARTEFACT_FOUND) }} run: echo 'APK for baseline ${{ steps.getMostRecentRelease.outputs.VERSION }} already exists, reusing existing build' - name: Checkout "Baseline" commit (last release) - if: ${{ !fromJSON(steps.checkForExistingArtifact.outputs.exists) }} + if: ${{ !fromJSON(steps.checkForExistingArtifact.outputs.ARTEFACT_FOUND) }} run: | git fetch origin tag ${{ steps.getMostRecentRelease.outputs.VERSION }} --no-tags --depth=1 git switch --detach ${{ steps.getMostRecentRelease.outputs.VERSION }} - uses: Expensify/App/.github/actions/composite/buildAndroidE2EAPK@main + if: ${{ !fromJSON(steps.checkForExistingArtifact.outputs.ARTEFACT_FOUND) }} with: ARTIFACT_NAME: baseline-apk-${{ steps.getMostRecentRelease.outputs.VERSION }} PACKAGE_SCRIPT_NAME: android-build-e2e @@ -117,6 +124,7 @@ jobs: - uses: Expensify/App/.github/actions/composite/buildAndroidE2EAPK@main with: ARTIFACT_NAME: delta-apk-${{ steps.getDeltaRef.outputs.DELTA_REF }} + UPLOAD_ARTEFACT: false PACKAGE_SCRIPT_NAME: android-build-e2edelta APP_OUTPUT_PATH: android/app/build/outputs/apk/e2edelta/release/app-e2edelta-release.apk MAPBOX_SDK_DOWNLOAD_TOKEN: ${{ secrets.MAPBOX_SDK_DOWNLOAD_TOKEN }} @@ -133,6 +141,9 @@ jobs: name: Run E2E tests in AWS device farm steps: - uses: actions/checkout@v4 + with: + # The OS_BOTIFY_COMMIT_TOKEN is a personal access token tied to osbotify (we need a PAT to access the artefact API) + token: ${{ secrets.OS_BOTIFY_COMMIT_TOKEN }} - name: Setup Node uses: ./.github/actions/composite/setupNode @@ -141,11 +152,14 @@ jobs: run: mkdir zip - name: Download baseline APK - uses: actions/download-artifact@e9ef242655d12993efdcda9058dee2db83a2cb9b + uses: actions/download-artifact@348754975ef0295bfa2c111cba996120cfdf8a5d id: downloadBaselineAPK with: name: baseline-apk-${{ needs.buildBaseline.outputs.VERSION }} path: zip + # Set github-token only if the baseline was built in this workflow run: + github-token: ${{ needs.buildBaseline.outputs.ARTEFACT_WORKFLOW_ID && github.token }} + run-id: ${{ needs.buildBaseline.outputs.ARTEFACT_WORKFLOW_ID }} # The downloaded artifact will be a file named "app-e2e-release.apk" so we have to rename it - name: Rename baseline APK From 726153b1d75fe9833ad37b88e877df178a09fb54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20=C5=BBelawski?= Date: Fri, 16 Feb 2024 13:36:56 +0100 Subject: [PATCH 222/288] remove setUpTests --- jest/setup.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/jest/setup.ts b/jest/setup.ts index 158e030c0422..15e99006fc4f 100644 --- a/jest/setup.ts +++ b/jest/setup.ts @@ -2,12 +2,10 @@ import mockClipboard from '@react-native-clipboard/clipboard/jest/clipboard-mock import '@shopify/flash-list/jestSetup'; import 'react-native-gesture-handler/jestSetup'; import mockStorage from 'react-native-onyx/dist/storage/__mocks__'; -import {setUpTests} from 'react-native-reanimated'; import 'setimmediate'; import setupMockImages from './setupMockImages'; setupMockImages(); -setUpTests(); // This mock is required as per setup instructions for react-navigation testing // https://reactnavigation.org/docs/testing/#mocking-native-modules From a1f904d7232e95a98fc3afd8a848d1c29cddbf77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hanno=20J=2E=20G=C3=B6decke?= Date: Fri, 16 Feb 2024 13:42:47 +0100 Subject: [PATCH 223/288] fix spelling --- .../composite/buildAndroidE2EAPK/action.yml | 4 +-- .../javascript/getArtefactInfo/action.yml | 19 ------------ .../getArtefactInfo/getArtefactInfo.js | 31 ------------------- .../javascript/getArtifactInfo/action.yml | 19 ++++++++++++ .../getArtifactInfo/getArtifactInfo.js | 31 +++++++++++++++++++ .github/libs/GithubUtils.js | 2 +- .github/workflows/e2ePerformanceTests.yml | 22 ++++++------- 7 files changed, 64 insertions(+), 64 deletions(-) delete mode 100644 .github/actions/javascript/getArtefactInfo/action.yml delete mode 100644 .github/actions/javascript/getArtefactInfo/getArtefactInfo.js create mode 100644 .github/actions/javascript/getArtifactInfo/action.yml create mode 100644 .github/actions/javascript/getArtifactInfo/getArtifactInfo.js diff --git a/.github/actions/composite/buildAndroidE2EAPK/action.yml b/.github/actions/composite/buildAndroidE2EAPK/action.yml index 3a99ab585d92..74a1f789d2bf 100644 --- a/.github/actions/composite/buildAndroidE2EAPK/action.yml +++ b/.github/actions/composite/buildAndroidE2EAPK/action.yml @@ -5,7 +5,7 @@ inputs: ARTIFACT_NAME: description: The name of the workflow artifact where the APK should be uploaded required: true - UPLOAD_ARTEFACT: + UPLOAD_ARTIFACT: description: Whether to upload the APK as an artifact required: false default: "true" @@ -74,7 +74,7 @@ runs: - name: Upload APK uses: actions/upload-artifact@65d862660abb392b8c4a3d1195a2108db131dd05 - if: ${{ inputs.UPLOAD_ARTEFACT == 'true' }} + if: ${{ inputs.UPLOAD_ARTIFACT == 'true' }} with: name: ${{ inputs.ARTIFACT_NAME }} path: ${{ inputs.APP_OUTPUT_PATH }} diff --git a/.github/actions/javascript/getArtefactInfo/action.yml b/.github/actions/javascript/getArtefactInfo/action.yml deleted file mode 100644 index a955a602ac19..000000000000 --- a/.github/actions/javascript/getArtefactInfo/action.yml +++ /dev/null @@ -1,19 +0,0 @@ -name: "Get artefact info" -description: "Gets the ID and workflow ID about a specific artefact. By default artifacts are only available in the same workflow. This action can be used to get the info to download an artefact from a different workflow." -inputs: - GITHUB_TOKEN: - description: Auth token for New Expensify Github; necessary for accessing Octokit. - required: true - ARTEFACT_NAME: - description: Name of the artefact to get infos about (e.g. to use for downloading that artefact) - required: true -outputs: - ARTEFACT_FOUND: - description: Whether the artefact was found - ARTEFACT_ID: - description: The ID of the artefact - ARTEFACT_WORKFLOW_ID: - description: The ID of the workflow that produced the artefact -runs: - using: "node20" - main: "index.js" diff --git a/.github/actions/javascript/getArtefactInfo/getArtefactInfo.js b/.github/actions/javascript/getArtefactInfo/getArtefactInfo.js deleted file mode 100644 index 7e05fcee9241..000000000000 --- a/.github/actions/javascript/getArtefactInfo/getArtefactInfo.js +++ /dev/null @@ -1,31 +0,0 @@ -const _ = require('underscore'); -const core = require('@actions/core'); -const GithubUtils = require('../../../libs/GithubUtils'); - -const run = function () { - const artefactName = core.getInput('ARTEFACT_NAME', {required: true}); - - return GithubUtils.getArtefactByName(artefactName) - .then((artefact) => { - if (_.isUndefined(artefact)) { - console.log(`No artefact found with the name ${artefactName}`); - core.setOutput('ARTEFACT_FOUND', false); - return; - } - - console.log('Artefact info', artefact); - core.setOutput('ARTEFACT_FOUND', true); - core.setOutput('ARTEFACT_ID', artefact.id); - core.setOutput('ARTEFACT_WORKFLOW_ID', artefact.workflow_run.id); - }) - .catch((error) => { - console.error('A problem occurred while trying to communicate with the GitHub API', error); - core.setFailed(error); - }); -}; - -if (require.main === module) { - run(); -} - -module.exports = run; diff --git a/.github/actions/javascript/getArtifactInfo/action.yml b/.github/actions/javascript/getArtifactInfo/action.yml new file mode 100644 index 000000000000..f5011303be4f --- /dev/null +++ b/.github/actions/javascript/getArtifactInfo/action.yml @@ -0,0 +1,19 @@ +name: "Get artifact info" +description: "Gets the ID and workflow ID about a specific artifact. By default artifacts are only available in the same workflow. This action can be used to get the info to download an artifact from a different workflow." +inputs: + GITHUB_TOKEN: + description: Auth token for New Expensify Github; necessary for accessing Octokit. + required: true + ARTIFACT_NAME: + description: Name of the artifact to get infos about (e.g. to use for downloading that artifact) + required: true +outputs: + ARTIFACT_FOUND: + description: Whether the artifact was found + ARTIFACT_ID: + description: The ID of the artifact + ARTIFACT_WORKFLOW_ID: + description: The ID of the workflow that produced the artifact +runs: + using: "node20" + main: "index.js" diff --git a/.github/actions/javascript/getArtifactInfo/getArtifactInfo.js b/.github/actions/javascript/getArtifactInfo/getArtifactInfo.js new file mode 100644 index 000000000000..c2398a34db4b --- /dev/null +++ b/.github/actions/javascript/getArtifactInfo/getArtifactInfo.js @@ -0,0 +1,31 @@ +const _ = require('underscore'); +const core = require('@actions/core'); +const GithubUtils = require('../../../libs/GithubUtils'); + +const run = function () { + const artifactName = core.getInput('ARTIFACT_NAME', {required: true}); + + return GithubUtils.getArtifactByName(artifactName) + .then((artifact) => { + if (_.isUndefined(artifact)) { + console.log(`No artifact found with the name ${artifactName}`); + core.setOutput('ARTIFACT_FOUND', false); + return; + } + + console.log('Artifact info', artifact); + core.setOutput('ARTIFACT_FOUND', true); + core.setOutput('ARTIFACT_ID', artifact.id); + core.setOutput('ARTIFACT_WORKFLOW_ID', artifact.workflow_run.id); + }) + .catch((error) => { + console.error('A problem occurred while trying to communicate with the GitHub API', error); + core.setFailed(error); + }); +}; + +if (require.main === module) { + run(); +} + +module.exports = run; diff --git a/.github/libs/GithubUtils.js b/.github/libs/GithubUtils.js index 35217c43518b..5a8110d96de2 100644 --- a/.github/libs/GithubUtils.js +++ b/.github/libs/GithubUtils.js @@ -525,7 +525,7 @@ class GithubUtils { .then((closedEvents) => lodashGet(_.last(closedEvents), 'actor.login', '')); } - static getArtefactByName(artefactName) { + static getArtifactByName(artefactName) { return this.paginate(this.octokit.actions.listArtifactsForRepo, { owner: CONST.GITHUB_OWNER, repo: CONST.APP_REPO, diff --git a/.github/workflows/e2ePerformanceTests.yml b/.github/workflows/e2ePerformanceTests.yml index 241ea4cebeca..8c36a1e40dea 100644 --- a/.github/workflows/e2ePerformanceTests.yml +++ b/.github/workflows/e2ePerformanceTests.yml @@ -21,12 +21,12 @@ jobs: name: Build apk from latest release as a baseline outputs: VERSION: ${{ steps.getMostRecentRelease.outputs.VERSION }} - ARTEFACT_FOUND: ${{ steps.checkForExistingArtifact.outputs.ARTEFACT_FOUND }} - ARTEFACT_WORKFLOW_ID: ${{ steps.checkForExistingArtifact.outputs.ARTEFACT_WORKFLOW_ID }} + ARTIFACT_FOUND: ${{ steps.checkForExistingArtifact.outputs.ARTIFACT_FOUND }} + ARTIFACT_WORKFLOW_ID: ${{ steps.checkForExistingArtifact.outputs.ARTIFACT_WORKFLOW_ID }} steps: - uses: actions/checkout@v4 with: - # The OS_BOTIFY_COMMIT_TOKEN is a personal access token tied to osbotify (we need a PAT to access the artefact API) + # The OS_BOTIFY_COMMIT_TOKEN is a personal access token tied to osbotify (we need a PAT to access the artifact API) token: ${{ secrets.OS_BOTIFY_COMMIT_TOKEN }} - name: Get most recent release version @@ -40,20 +40,20 @@ jobs: uses: ./.github/actions/javascript/getArtefactInfo with: GITHUB_TOKEN: ${{ secrets.OS_BOTIFY_COMMIT_TOKEN }} - ARTEFACT_NAME: baseline-apk-${{ steps.getMostRecentRelease.outputs.VERSION }} + ARTIFACT_NAME: baseline-apk-${{ steps.getMostRecentRelease.outputs.VERSION }} - name: Skip build if there's already an existing artifact for the baseline - if: ${{ fromJSON(steps.checkForExistingArtifact.outputs.ARTEFACT_FOUND) }} + if: ${{ fromJSON(steps.checkForExistingArtifact.outputs.ARTIFACT_FOUND) }} run: echo 'APK for baseline ${{ steps.getMostRecentRelease.outputs.VERSION }} already exists, reusing existing build' - name: Checkout "Baseline" commit (last release) - if: ${{ !fromJSON(steps.checkForExistingArtifact.outputs.ARTEFACT_FOUND) }} + if: ${{ !fromJSON(steps.checkForExistingArtifact.outputs.ARTIFACT_FOUND) }} run: | git fetch origin tag ${{ steps.getMostRecentRelease.outputs.VERSION }} --no-tags --depth=1 git switch --detach ${{ steps.getMostRecentRelease.outputs.VERSION }} - uses: Expensify/App/.github/actions/composite/buildAndroidE2EAPK@main - if: ${{ !fromJSON(steps.checkForExistingArtifact.outputs.ARTEFACT_FOUND) }} + if: ${{ !fromJSON(steps.checkForExistingArtifact.outputs.ARTIFACT_FOUND) }} with: ARTIFACT_NAME: baseline-apk-${{ steps.getMostRecentRelease.outputs.VERSION }} PACKAGE_SCRIPT_NAME: android-build-e2e @@ -124,7 +124,7 @@ jobs: - uses: Expensify/App/.github/actions/composite/buildAndroidE2EAPK@main with: ARTIFACT_NAME: delta-apk-${{ steps.getDeltaRef.outputs.DELTA_REF }} - UPLOAD_ARTEFACT: false + UPLOAD_ARTIFACT: false PACKAGE_SCRIPT_NAME: android-build-e2edelta APP_OUTPUT_PATH: android/app/build/outputs/apk/e2edelta/release/app-e2edelta-release.apk MAPBOX_SDK_DOWNLOAD_TOKEN: ${{ secrets.MAPBOX_SDK_DOWNLOAD_TOKEN }} @@ -142,7 +142,7 @@ jobs: steps: - uses: actions/checkout@v4 with: - # The OS_BOTIFY_COMMIT_TOKEN is a personal access token tied to osbotify (we need a PAT to access the artefact API) + # The OS_BOTIFY_COMMIT_TOKEN is a personal access token tied to osbotify (we need a PAT to access the artifact API) token: ${{ secrets.OS_BOTIFY_COMMIT_TOKEN }} - name: Setup Node @@ -158,8 +158,8 @@ jobs: name: baseline-apk-${{ needs.buildBaseline.outputs.VERSION }} path: zip # Set github-token only if the baseline was built in this workflow run: - github-token: ${{ needs.buildBaseline.outputs.ARTEFACT_WORKFLOW_ID && github.token }} - run-id: ${{ needs.buildBaseline.outputs.ARTEFACT_WORKFLOW_ID }} + github-token: ${{ needs.buildBaseline.outputs.ARTIFACT_WORKFLOW_ID && github.token }} + run-id: ${{ needs.buildBaseline.outputs.ARTIFACT_WORKFLOW_ID }} # The downloaded artifact will be a file named "app-e2e-release.apk" so we have to rename it - name: Rename baseline APK From e282d94531db14bc16c9bc33213db022f6d9cd5f Mon Sep 17 00:00:00 2001 From: Monil Bhavsar Date: Fri, 16 Feb 2024 18:19:53 +0530 Subject: [PATCH 224/288] Modify logic for deleted parent message --- src/libs/ReportUtils.ts | 6 +++++- src/types/onyx/ReportAction.ts | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index b5da21c0f67e..4990fc26746d 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -2503,6 +2503,10 @@ function getReportName(report: OnyxEntry, policy: OnyxEntry = nu return getTransactionReportName(parentReportAction); } + if (parentReportAction?.message?.[0]?.isDeletedParentAction) { + return Localize.translateLocal('parentReportAction.deletedMessage'); + } + const isAttachment = ReportActionsUtils.isReportActionAttachment(!isEmptyObject(parentReportAction) ? parentReportAction : null); const parentReportActionMessage = (parentReportAction?.message?.[0]?.text ?? '').replace(/(\r\n|\n|\r)/gm, ' '); if (isAttachment && parentReportActionMessage) { @@ -2518,7 +2522,7 @@ function getReportName(report: OnyxEntry, policy: OnyxEntry = nu if (isAdminRoom(report) || isUserCreatedPolicyRoom(report)) { return getAdminRoomInvitedParticipants(parentReportAction, parentReportActionMessage); } - return parentReportActionMessage || Localize.translateLocal('parentReportAction.deletedMessage'); + return parentReportActionMessage; } if (isTaskReport(report) && isCanceledTaskReport(report, parentReportAction)) { diff --git a/src/types/onyx/ReportAction.ts b/src/types/onyx/ReportAction.ts index 8f732a253cb5..ed3173381b32 100644 --- a/src/types/onyx/ReportAction.ts +++ b/src/types/onyx/ReportAction.ts @@ -41,6 +41,7 @@ type Message = { /** Fragment edited flag */ isEdited?: boolean; + /** Whether thread's parent message is deleted or not */ isDeletedParentAction?: boolean; /** Whether the pending transaction was reversed and didn't post to the card */ From 8859c35374afc544cdf8ba0ddab5c963fc0a8e6b Mon Sep 17 00:00:00 2001 From: ImgBotApp Date: Fri, 16 Feb 2024 13:04:33 +0000 Subject: [PATCH 225/288] [ImgBot] Optimize images *Total -- 1,001.44kb -> 624.22kb (37.67%) /assets/images/workspace-profile.png -- 997.75kb -> 620.55kb (37.8%) /assets/images/pause.svg -- 0.51kb -> 0.51kb (1.15%) /assets/images/volume-low.svg -- 0.93kb -> 0.93kb (0.52%) /assets/images/mute.svg -- 0.97kb -> 0.97kb (0.4%) /assets/images/cards-and-domains.svg -- 1.27kb -> 1.26kb (0.39%) Signed-off-by: ImgBotApp --- assets/images/cards-and-domains.svg | 6 +----- assets/images/mute.svg | 5 +---- assets/images/pause.svg | 5 +---- assets/images/volume-low.svg | 5 +---- assets/images/workspace-profile.png | Bin 1021695 -> 635446 bytes 5 files changed, 4 insertions(+), 17 deletions(-) diff --git a/assets/images/cards-and-domains.svg b/assets/images/cards-and-domains.svg index 4467ad4cf222..a6a3918f6423 100644 --- a/assets/images/cards-and-domains.svg +++ b/assets/images/cards-and-domains.svg @@ -1,5 +1 @@ - - - - - + \ No newline at end of file diff --git a/assets/images/mute.svg b/assets/images/mute.svg index afe5e802e640..a39c4388741c 100644 --- a/assets/images/mute.svg +++ b/assets/images/mute.svg @@ -1,4 +1 @@ - - - - + \ No newline at end of file diff --git a/assets/images/pause.svg b/assets/images/pause.svg index 8546a7e5a0ee..1687cdbffa4a 100644 --- a/assets/images/pause.svg +++ b/assets/images/pause.svg @@ -1,4 +1 @@ - - - - + \ No newline at end of file diff --git a/assets/images/volume-low.svg b/assets/images/volume-low.svg index d0d4224f0660..3256c6b32589 100644 --- a/assets/images/volume-low.svg +++ b/assets/images/volume-low.svg @@ -1,4 +1 @@ - - - - + \ No newline at end of file diff --git a/assets/images/workspace-profile.png b/assets/images/workspace-profile.png index 335568f3bd235041fb2834f847590091e83d57a0..72112566e35f14a0c7d3be0a379c62fd0d32b2cb 100644 GIT binary patch literal 635446 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®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 literal 1021695 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%0Da{VjoFjAn)1fF8V4J0h$%a(EvEkh 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

    |>~ZM_;FI&Bq|lp=AQ;^H!Mc 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

    +0?JPYBp+jq|UP%{sm!o2_1Y4Q=awq4=Y? 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

    doS9lg^2ufo#`Fl4rmC3| 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 Date: Fri, 16 Feb 2024 15:06:49 +0100 Subject: [PATCH 226/288] Update .github/actions/javascript/getArtifactInfo/action.yml Co-authored-by: Vit Horacek <36083550+mountiny@users.noreply.github.com> --- .github/actions/javascript/getArtifactInfo/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/javascript/getArtifactInfo/action.yml b/.github/actions/javascript/getArtifactInfo/action.yml index f5011303be4f..723ed0d01398 100644 --- a/.github/actions/javascript/getArtifactInfo/action.yml +++ b/.github/actions/javascript/getArtifactInfo/action.yml @@ -1,5 +1,5 @@ name: "Get artifact info" -description: "Gets the ID and workflow ID about a specific artifact. By default artifacts are only available in the same workflow. This action can be used to get the info to download an artifact from a different workflow." +description: Gets the ID and workflow ID about a specific artifact. By default artifacts are only available in the same workflow. This action can be used to get the information needed to download an artifact from a different workflow. inputs: GITHUB_TOKEN: description: Auth token for New Expensify Github; necessary for accessing Octokit. From 488744875d9cc000b69557bb1d216e5ea02fa0d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hanno=20J=2E=20G=C3=B6decke?= Date: Fri, 16 Feb 2024 15:06:56 +0100 Subject: [PATCH 227/288] Update .github/actions/javascript/getArtifactInfo/action.yml Co-authored-by: Vit Horacek <36083550+mountiny@users.noreply.github.com> --- .github/actions/javascript/getArtifactInfo/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/javascript/getArtifactInfo/action.yml b/.github/actions/javascript/getArtifactInfo/action.yml index 723ed0d01398..dd5d896cf654 100644 --- a/.github/actions/javascript/getArtifactInfo/action.yml +++ b/.github/actions/javascript/getArtifactInfo/action.yml @@ -1,4 +1,4 @@ -name: "Get artifact info" +name: Get artifact info description: Gets the ID and workflow ID about a specific artifact. By default artifacts are only available in the same workflow. This action can be used to get the information needed to download an artifact from a different workflow. inputs: GITHUB_TOKEN: From 10ef0d8b31c25d350a23fee09c94ecc2ab0c9687 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hanno=20J=2E=20G=C3=B6decke?= Date: Fri, 16 Feb 2024 15:07:06 +0100 Subject: [PATCH 228/288] Update .github/actions/javascript/getArtifactInfo/action.yml Co-authored-by: Vit Horacek <36083550+mountiny@users.noreply.github.com> --- .github/actions/javascript/getArtifactInfo/action.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/actions/javascript/getArtifactInfo/action.yml b/.github/actions/javascript/getArtifactInfo/action.yml index dd5d896cf654..7da45512d50d 100644 --- a/.github/actions/javascript/getArtifactInfo/action.yml +++ b/.github/actions/javascript/getArtifactInfo/action.yml @@ -1,5 +1,6 @@ name: Get artifact info description: Gets the ID and workflow ID about a specific artifact. By default artifacts are only available in the same workflow. This action can be used to get the information needed to download an artifact from a different workflow. + inputs: GITHUB_TOKEN: description: Auth token for New Expensify Github; necessary for accessing Octokit. From 0c994f1b6a9942f1876f5af6a02662df23ad5852 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hanno=20J=2E=20G=C3=B6decke?= Date: Fri, 16 Feb 2024 15:07:13 +0100 Subject: [PATCH 229/288] Update .github/actions/javascript/getArtifactInfo/action.yml Co-authored-by: Vit Horacek <36083550+mountiny@users.noreply.github.com> --- .github/actions/javascript/getArtifactInfo/action.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/actions/javascript/getArtifactInfo/action.yml b/.github/actions/javascript/getArtifactInfo/action.yml index 7da45512d50d..abd89287b2dd 100644 --- a/.github/actions/javascript/getArtifactInfo/action.yml +++ b/.github/actions/javascript/getArtifactInfo/action.yml @@ -8,6 +8,7 @@ inputs: ARTIFACT_NAME: description: Name of the artifact to get infos about (e.g. to use for downloading that artifact) required: true + outputs: ARTIFACT_FOUND: description: Whether the artifact was found From 9cd4a685a90a343a55c4379f032a2291a550b696 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hanno=20J=2E=20G=C3=B6decke?= Date: Fri, 16 Feb 2024 15:07:19 +0100 Subject: [PATCH 230/288] Update .github/actions/javascript/getArtifactInfo/action.yml Co-authored-by: Vit Horacek <36083550+mountiny@users.noreply.github.com> --- .github/actions/javascript/getArtifactInfo/action.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/actions/javascript/getArtifactInfo/action.yml b/.github/actions/javascript/getArtifactInfo/action.yml index abd89287b2dd..7ba30562d90f 100644 --- a/.github/actions/javascript/getArtifactInfo/action.yml +++ b/.github/actions/javascript/getArtifactInfo/action.yml @@ -16,6 +16,7 @@ outputs: description: The ID of the artifact ARTIFACT_WORKFLOW_ID: description: The ID of the workflow that produced the artifact + runs: using: "node20" main: "index.js" From 8cf13e8bd941489d839272d7a724511d865f726b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hanno=20J=2E=20G=C3=B6decke?= Date: Fri, 16 Feb 2024 15:11:39 +0100 Subject: [PATCH 231/288] include ncc build action --- .../javascript/awaitStagingDeploys/index.js | 8 + .../javascript/checkDeployBlockers/index.js | 8 + .../createOrUpdateStagingDeploy/index.js | 8 + .../javascript/getArtifactInfo/index.js | 16004 ++++++++++++++++ .../getDeployPullRequestList/index.js | 8 + .../javascript/getPullRequestDetails/index.js | 8 + .../javascript/getReleaseBody/index.js | 8 + .../javascript/isStagingDeployLocked/index.js | 8 + .../markPullRequestsAsDeployed/index.js | 8 + .../javascript/postTestBuildComment/index.js | 8 + .../reopenIssueWithComment/index.js | 8 + .../javascript/reviewerChecklist/index.js | 13 +- .../validateReassureOutput/index.js | 5 +- .../javascript/verifySignedCommits/index.js | 8 + .github/scripts/buildActions.sh | 1 + 15 files changed, 16103 insertions(+), 8 deletions(-) create mode 100644 .github/actions/javascript/getArtifactInfo/index.js diff --git a/.github/actions/javascript/awaitStagingDeploys/index.js b/.github/actions/javascript/awaitStagingDeploys/index.js index 317dc5f6932c..6383af818e30 100644 --- a/.github/actions/javascript/awaitStagingDeploys/index.js +++ b/.github/actions/javascript/awaitStagingDeploys/index.js @@ -669,6 +669,14 @@ class GithubUtils { .then((events) => _.filter(events, (event) => event.event === 'closed')) .then((closedEvents) => lodashGet(_.last(closedEvents), 'actor.login', '')); } + + static getArtifactByName(artefactName) { + return this.paginate(this.octokit.actions.listArtifactsForRepo, { + owner: CONST.GITHUB_OWNER, + repo: CONST.APP_REPO, + per_page: 100, + }).then((data) => _.findWhere(data.artifacts, {name: artefactName})); + } } module.exports = GithubUtils; diff --git a/.github/actions/javascript/checkDeployBlockers/index.js b/.github/actions/javascript/checkDeployBlockers/index.js index 6f266fef404b..081858ac9692 100644 --- a/.github/actions/javascript/checkDeployBlockers/index.js +++ b/.github/actions/javascript/checkDeployBlockers/index.js @@ -636,6 +636,14 @@ class GithubUtils { .then((events) => _.filter(events, (event) => event.event === 'closed')) .then((closedEvents) => lodashGet(_.last(closedEvents), 'actor.login', '')); } + + static getArtifactByName(artefactName) { + return this.paginate(this.octokit.actions.listArtifactsForRepo, { + owner: CONST.GITHUB_OWNER, + repo: CONST.APP_REPO, + per_page: 100, + }).then((data) => _.findWhere(data.artifacts, {name: artefactName})); + } } module.exports = GithubUtils; diff --git a/.github/actions/javascript/createOrUpdateStagingDeploy/index.js b/.github/actions/javascript/createOrUpdateStagingDeploy/index.js index 4116862da777..202bddf3119f 100644 --- a/.github/actions/javascript/createOrUpdateStagingDeploy/index.js +++ b/.github/actions/javascript/createOrUpdateStagingDeploy/index.js @@ -865,6 +865,14 @@ class GithubUtils { .then((events) => _.filter(events, (event) => event.event === 'closed')) .then((closedEvents) => lodashGet(_.last(closedEvents), 'actor.login', '')); } + + static getArtifactByName(artefactName) { + return this.paginate(this.octokit.actions.listArtifactsForRepo, { + owner: CONST.GITHUB_OWNER, + repo: CONST.APP_REPO, + per_page: 100, + }).then((data) => _.findWhere(data.artifacts, {name: artefactName})); + } } module.exports = GithubUtils; diff --git a/.github/actions/javascript/getArtifactInfo/index.js b/.github/actions/javascript/getArtifactInfo/index.js new file mode 100644 index 000000000000..f6cdfedb159d --- /dev/null +++ b/.github/actions/javascript/getArtifactInfo/index.js @@ -0,0 +1,16004 @@ +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ({ + +/***/ 1307: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +const _ = __nccwpck_require__(5067); +const core = __nccwpck_require__(2186); +const GithubUtils = __nccwpck_require__(7999); + +const run = function () { + const artifactName = core.getInput('ARTIFACT_NAME', {required: true}); + + return GithubUtils.getArtifactByName(artifactName) + .then((artifact) => { + if (_.isUndefined(artifact)) { + console.log(`No artifact found with the name ${artifactName}`); + core.setOutput('ARTIFACT_FOUND', false); + return; + } + + console.log('Artifact info', artifact); + core.setOutput('ARTIFACT_FOUND', true); + core.setOutput('ARTIFACT_ID', artifact.id); + core.setOutput('ARTIFACT_WORKFLOW_ID', artifact.workflow_run.id); + }) + .catch((error) => { + console.error('A problem occurred while trying to communicate with the GitHub API', error); + core.setFailed(error); + }); +}; + +if (require.main === require.cache[eval('__filename')]) { + run(); +} + +module.exports = run; + + +/***/ }), + +/***/ 4097: +/***/ ((module) => { + +const CONST = { + GITHUB_OWNER: 'Expensify', + APP_REPO: 'App', + APPLAUSE_BOT: 'applausebot', + OS_BOTIFY: 'OSBotify', + LABELS: { + STAGING_DEPLOY: 'StagingDeployCash', + DEPLOY_BLOCKER: 'DeployBlockerCash', + INTERNAL_QA: 'InternalQA', + }, + DATE_FORMAT_STRING: 'yyyy-MM-dd', +}; + +CONST.APP_REPO_URL = `https://github.com/${CONST.GITHUB_OWNER}/${CONST.APP_REPO}`; +CONST.APP_REPO_GIT_URL = `git@github.com:${CONST.GITHUB_OWNER}/${CONST.APP_REPO}.git`; + +module.exports = CONST; + + +/***/ }), + +/***/ 7999: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +const _ = __nccwpck_require__(5067); +const lodashGet = __nccwpck_require__(6908); +const core = __nccwpck_require__(2186); +const {GitHub, getOctokitOptions} = __nccwpck_require__(3030); +const {throttling} = __nccwpck_require__(9968); +const {paginateRest} = __nccwpck_require__(4193); +const CONST = __nccwpck_require__(4097); + +const GITHUB_BASE_URL_REGEX = new RegExp('https?://(?:github\\.com|api\\.github\\.com)'); +const PULL_REQUEST_REGEX = new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/pull/([0-9]+).*`); +const ISSUE_REGEX = new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/issues/([0-9]+).*`); +const ISSUE_OR_PULL_REQUEST_REGEX = new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/(?:pull|issues)/([0-9]+).*`); + +/** + * The standard rate in ms at which we'll poll the GitHub API to check for status changes. + * It's 10 seconds :) + * @type {number} + */ +const POLL_RATE = 10000; + +class GithubUtils { + /** + * Initialize internal octokit + * + * @private + */ + static initOctokit() { + const Octokit = GitHub.plugin(throttling, paginateRest); + const token = core.getInput('GITHUB_TOKEN', {required: true}); + + // Save a copy of octokit used in this class + this.internalOctokit = new Octokit( + getOctokitOptions(token, { + throttle: { + retryAfterBaseValue: 2000, + onRateLimit: (retryAfter, options) => { + console.warn(`Request quota exhausted for request ${options.method} ${options.url}`); + + // Retry five times when hitting a rate limit error, then give up + if (options.request.retryCount <= 5) { + console.log(`Retrying after ${retryAfter} seconds!`); + return true; + } + }, + onAbuseLimit: (retryAfter, options) => { + // does not retry, only logs a warning + console.warn(`Abuse detected for request ${options.method} ${options.url}`); + }, + }, + }), + ); + } + + /** + * Either give an existing instance of Octokit rest or create a new one + * + * @readonly + * @static + * @memberof GithubUtils + */ + static get octokit() { + if (this.internalOctokit) { + return this.internalOctokit.rest; + } + this.initOctokit(); + return this.internalOctokit.rest; + } + + /** + * Get the graphql instance from internal octokit. + * @readonly + * @static + * @memberof GithubUtils + */ + static get graphql() { + if (this.internalOctokit) { + return this.internalOctokit.graphql; + } + this.initOctokit(); + return this.internalOctokit.graphql; + } + + /** + * Either give an existing instance of Octokit paginate or create a new one + * + * @readonly + * @static + * @memberof GithubUtils + */ + static get paginate() { + if (this.internalOctokit) { + return this.internalOctokit.paginate; + } + this.initOctokit(); + return this.internalOctokit.paginate; + } + + /** + * Finds one open `StagingDeployCash` issue via GitHub octokit library. + * + * @returns {Promise} + */ + static getStagingDeployCash() { + return this.octokit.issues + .listForRepo({ + owner: CONST.GITHUB_OWNER, + repo: CONST.APP_REPO, + labels: CONST.LABELS.STAGING_DEPLOY, + state: 'open', + }) + .then(({data}) => { + if (!data.length) { + const error = new Error(`Unable to find ${CONST.LABELS.STAGING_DEPLOY} issue.`); + error.code = 404; + throw error; + } + + if (data.length > 1) { + const error = new Error(`Found more than one ${CONST.LABELS.STAGING_DEPLOY} issue.`); + error.code = 500; + throw error; + } + + return this.getStagingDeployCashData(data[0]); + }); + } + + /** + * Takes in a GitHub issue object and returns the data we want. + * + * @param {Object} issue + * @returns {Object} + */ + static getStagingDeployCashData(issue) { + try { + const versionRegex = new RegExp('([0-9]+)\\.([0-9]+)\\.([0-9]+)(?:-([0-9]+))?', 'g'); + const tag = issue.body.match(versionRegex)[0].replace(/`/g, ''); + return { + title: issue.title, + url: issue.url, + number: this.getIssueOrPullRequestNumberFromURL(issue.url), + labels: issue.labels, + PRList: this.getStagingDeployCashPRList(issue), + deployBlockers: this.getStagingDeployCashDeployBlockers(issue), + internalQAPRList: this.getStagingDeployCashInternalQA(issue), + isTimingDashboardChecked: /-\s\[x]\sI checked the \[App Timing Dashboard]/.test(issue.body), + isFirebaseChecked: /-\s\[x]\sI checked \[Firebase Crashlytics]/.test(issue.body), + isGHStatusChecked: /-\s\[x]\sI checked \[GitHub Status]/.test(issue.body), + tag, + }; + } catch (exception) { + throw new Error(`Unable to find ${CONST.LABELS.STAGING_DEPLOY} issue with correct data.`); + } + } + + /** + * Parse the PRList and Internal QA section of the StagingDeployCash issue body. + * + * @private + * + * @param {Object} issue + * @returns {Array} - [{url: String, number: Number, isVerified: Boolean}] + */ + static getStagingDeployCashPRList(issue) { + let PRListSection = issue.body.match(/pull requests:\*\*\r?\n((?:-.*\r?\n)+)\r?\n\r?\n?/) || []; + if (PRListSection.length !== 2) { + // No PRs, return an empty array + console.log('Hmmm...The open StagingDeployCash does not list any pull requests, continuing...'); + return []; + } + PRListSection = PRListSection[1]; + const PRList = _.map([...PRListSection.matchAll(new RegExp(`- \\[([ x])] (${PULL_REQUEST_REGEX.source})`, 'g'))], (match) => ({ + url: match[2], + number: Number.parseInt(match[3], 10), + isVerified: match[1] === 'x', + })); + return _.sortBy(PRList, 'number'); + } + + /** + * Parse DeployBlocker section of the StagingDeployCash issue body. + * + * @private + * + * @param {Object} issue + * @returns {Array} - [{URL: String, number: Number, isResolved: Boolean}] + */ + static getStagingDeployCashDeployBlockers(issue) { + let deployBlockerSection = issue.body.match(/Deploy Blockers:\*\*\r?\n((?:-.*\r?\n)+)/) || []; + if (deployBlockerSection.length !== 2) { + return []; + } + deployBlockerSection = deployBlockerSection[1]; + const deployBlockers = _.map([...deployBlockerSection.matchAll(new RegExp(`- \\[([ x])]\\s(${ISSUE_OR_PULL_REQUEST_REGEX.source})`, 'g'))], (match) => ({ + url: match[2], + number: Number.parseInt(match[3], 10), + isResolved: match[1] === 'x', + })); + return _.sortBy(deployBlockers, 'number'); + } + + /** + * Parse InternalQA section of the StagingDeployCash issue body. + * + * @private + * + * @param {Object} issue + * @returns {Array} - [{URL: String, number: Number, isResolved: Boolean}] + */ + static getStagingDeployCashInternalQA(issue) { + let internalQASection = issue.body.match(/Internal QA:\*\*\r?\n((?:- \[[ x]].*\r?\n)+)/) || []; + if (internalQASection.length !== 2) { + return []; + } + internalQASection = internalQASection[1]; + const internalQAPRs = _.map([...internalQASection.matchAll(new RegExp(`- \\[([ x])]\\s(${PULL_REQUEST_REGEX.source})`, 'g'))], (match) => ({ + url: match[2].split('-')[0].trim(), + number: Number.parseInt(match[3], 10), + isResolved: match[1] === 'x', + })); + return _.sortBy(internalQAPRs, 'number'); + } + + /** + * Generate the issue body for a StagingDeployCash. + * + * @param {String} tag + * @param {Array} PRList - The list of PR URLs which are included in this StagingDeployCash + * @param {Array} [verifiedPRList] - The list of PR URLs which have passed QA. + * @param {Array} [deployBlockers] - The list of DeployBlocker URLs. + * @param {Array} [resolvedDeployBlockers] - The list of DeployBlockers URLs which have been resolved. + * @param {Array} [resolvedInternalQAPRs] - The list of Internal QA PR URLs which have been resolved. + * @param {Boolean} [isTimingDashboardChecked] + * @param {Boolean} [isFirebaseChecked] + * @param {Boolean} [isGHStatusChecked] + * @returns {Promise} + */ + static generateStagingDeployCashBody( + tag, + PRList, + verifiedPRList = [], + deployBlockers = [], + resolvedDeployBlockers = [], + resolvedInternalQAPRs = [], + isTimingDashboardChecked = false, + isFirebaseChecked = false, + isGHStatusChecked = false, + ) { + return this.fetchAllPullRequests(_.map(PRList, this.getPullRequestNumberFromURL)) + .then((data) => { + // The format of this map is following: + // { + // 'https://github.com/Expensify/App/pull/9641': [ 'PauloGasparSv', 'kidroca' ], + // 'https://github.com/Expensify/App/pull/9642': [ 'mountiny', 'kidroca' ] + // } + const internalQAPRMap = _.reduce( + _.filter(data, (pr) => !_.isEmpty(_.findWhere(pr.labels, {name: CONST.LABELS.INTERNAL_QA}))), + (map, pr) => { + // eslint-disable-next-line no-param-reassign + map[pr.html_url] = _.compact(_.pluck(pr.assignees, 'login')); + return map; + }, + {}, + ); + console.log('Found the following Internal QA PRs:', internalQAPRMap); + + const noQAPRs = _.pluck( + _.filter(data, (PR) => /\[No\s?QA]/i.test(PR.title)), + 'html_url', + ); + console.log('Found the following NO QA PRs:', noQAPRs); + const verifiedOrNoQAPRs = _.union(verifiedPRList, noQAPRs); + + const sortedPRList = _.chain(PRList).difference(_.keys(internalQAPRMap)).unique().sortBy(GithubUtils.getPullRequestNumberFromURL).value(); + const sortedDeployBlockers = _.sortBy(_.unique(deployBlockers), GithubUtils.getIssueOrPullRequestNumberFromURL); + + // Tag version and comparison URL + // eslint-disable-next-line max-len + let issueBody = `**Release Version:** \`${tag}\`\r\n**Compare Changes:** https://github.com/Expensify/App/compare/production...staging\r\n`; + + // PR list + if (!_.isEmpty(sortedPRList)) { + issueBody += '\r\n**This release contains changes from the following pull requests:**\r\n'; + _.each(sortedPRList, (URL) => { + issueBody += _.contains(verifiedOrNoQAPRs, URL) ? '- [x]' : '- [ ]'; + issueBody += ` ${URL}\r\n`; + }); + issueBody += '\r\n\r\n'; + } + + // Internal QA PR list + if (!_.isEmpty(internalQAPRMap)) { + console.log('Found the following verified Internal QA PRs:', resolvedInternalQAPRs); + issueBody += '**Internal QA:**\r\n'; + _.each(internalQAPRMap, (assignees, URL) => { + const assigneeMentions = _.reduce(assignees, (memo, assignee) => `${memo} @${assignee}`, ''); + issueBody += `${_.contains(resolvedInternalQAPRs, URL) ? '- [x]' : '- [ ]'} `; + issueBody += `${URL}`; + issueBody += ` -${assigneeMentions}`; + issueBody += '\r\n'; + }); + issueBody += '\r\n\r\n'; + } + + // Deploy blockers + if (!_.isEmpty(deployBlockers)) { + issueBody += '**Deploy Blockers:**\r\n'; + _.each(sortedDeployBlockers, (URL) => { + issueBody += _.contains(resolvedDeployBlockers, URL) ? '- [x] ' : '- [ ] '; + issueBody += URL; + issueBody += '\r\n'; + }); + issueBody += '\r\n\r\n'; + } + + issueBody += '**Deployer verifications:**'; + // eslint-disable-next-line max-len + issueBody += `\r\n- [${ + isTimingDashboardChecked ? 'x' : ' ' + }] I checked the [App Timing Dashboard](https://graphs.expensify.com/grafana/d/yj2EobAGz/app-timing?orgId=1) and verified this release does not cause a noticeable performance regression.`; + // eslint-disable-next-line max-len + issueBody += `\r\n- [${ + isFirebaseChecked ? 'x' : ' ' + }] I checked [Firebase Crashlytics](https://console.firebase.google.com/u/0/project/expensify-chat/crashlytics/app/android:com.expensify.chat/issues?state=open&time=last-seven-days&tag=all) and verified that this release does not introduce any new crashes. More detailed instructions on this verification can be found [here](https://stackoverflowteams.com/c/expensify/questions/15095/15096).`; + // eslint-disable-next-line max-len + issueBody += `\r\n- [${isGHStatusChecked ? 'x' : ' '}] I checked [GitHub Status](https://www.githubstatus.com/) and verified there is no reported incident with Actions.`; + + issueBody += '\r\n\r\ncc @Expensify/applauseleads\r\n'; + return issueBody; + }) + .catch((err) => console.warn('Error generating StagingDeployCash issue body! Continuing...', err)); + } + + /** + * Fetch all pull requests given a list of PR numbers. + * + * @param {Array} pullRequestNumbers + * @returns {Promise} + */ + static fetchAllPullRequests(pullRequestNumbers) { + const oldestPR = _.first(_.sortBy(pullRequestNumbers)); + return this.paginate( + this.octokit.pulls.list, + { + owner: CONST.GITHUB_OWNER, + repo: CONST.APP_REPO, + state: 'all', + sort: 'created', + direction: 'desc', + per_page: 100, + }, + ({data}, done) => { + if (_.find(data, (pr) => pr.number === oldestPR)) { + done(); + } + return data; + }, + ) + .then((prList) => _.filter(prList, (pr) => _.contains(pullRequestNumbers, pr.number))) + .catch((err) => console.error('Failed to get PR list', err)); + } + + /** + * @param {Number} pullRequestNumber + * @returns {Promise} + */ + static getPullRequestBody(pullRequestNumber) { + return this.octokit.pulls + .get({ + owner: CONST.GITHUB_OWNER, + repo: CONST.APP_REPO, + pull_number: pullRequestNumber, + }) + .then(({data: pullRequestComment}) => pullRequestComment.body); + } + + /** + * @param {Number} pullRequestNumber + * @returns {Promise} + */ + static getAllReviewComments(pullRequestNumber) { + return this.paginate( + this.octokit.pulls.listReviews, + { + owner: CONST.GITHUB_OWNER, + repo: CONST.APP_REPO, + pull_number: pullRequestNumber, + per_page: 100, + }, + (response) => _.map(response.data, (review) => review.body), + ); + } + + /** + * @param {Number} issueNumber + * @returns {Promise} + */ + static getAllComments(issueNumber) { + return this.paginate( + this.octokit.issues.listComments, + { + owner: CONST.GITHUB_OWNER, + repo: CONST.APP_REPO, + issue_number: issueNumber, + per_page: 100, + }, + (response) => _.map(response.data, (comment) => comment.body), + ); + } + + /** + * Create comment on pull request + * + * @param {String} repo - The repo to search for a matching pull request or issue number + * @param {Number} number - The pull request or issue number + * @param {String} messageBody - The comment message + * @returns {Promise} + */ + static createComment(repo, number, messageBody) { + console.log(`Writing comment on #${number}`); + return this.octokit.issues.createComment({ + owner: CONST.GITHUB_OWNER, + repo, + issue_number: number, + body: messageBody, + }); + } + + /** + * Get the most recent workflow run for the given New Expensify workflow. + * + * @param {String} workflow + * @returns {Promise} + */ + static getLatestWorkflowRunID(workflow) { + console.log(`Fetching New Expensify workflow runs for ${workflow}...`); + return this.octokit.actions + .listWorkflowRuns({ + owner: CONST.GITHUB_OWNER, + repo: CONST.APP_REPO, + workflow_id: workflow, + }) + .then((response) => lodashGet(response, 'data.workflow_runs[0].id')); + } + + /** + * Generate the well-formatted body of a production release. + * + * @param {Array} pullRequests + * @returns {String} + */ + static getReleaseBody(pullRequests) { + return _.map(pullRequests, (number) => `- ${this.getPullRequestURLFromNumber(number)}`).join('\r\n'); + } + + /** + * Generate the URL of an New Expensify pull request given the PR number. + * + * @param {Number} number + * @returns {String} + */ + static getPullRequestURLFromNumber(number) { + return `${CONST.APP_REPO_URL}/pull/${number}`; + } + + /** + * Parse the pull request number from a URL. + * + * @param {String} URL + * @returns {Number} + * @throws {Error} If the URL is not a valid Github Pull Request. + */ + static getPullRequestNumberFromURL(URL) { + const matches = URL.match(PULL_REQUEST_REGEX); + if (!_.isArray(matches) || matches.length !== 2) { + throw new Error(`Provided URL ${URL} is not a Github Pull Request!`); + } + return Number.parseInt(matches[1], 10); + } + + /** + * Parse the issue number from a URL. + * + * @param {String} URL + * @returns {Number} + * @throws {Error} If the URL is not a valid Github Issue. + */ + static getIssueNumberFromURL(URL) { + const matches = URL.match(ISSUE_REGEX); + if (!_.isArray(matches) || matches.length !== 2) { + throw new Error(`Provided URL ${URL} is not a Github Issue!`); + } + return Number.parseInt(matches[1], 10); + } + + /** + * Parse the issue or pull request number from a URL. + * + * @param {String} URL + * @returns {Number} + * @throws {Error} If the URL is not a valid Github Issue or Pull Request. + */ + static getIssueOrPullRequestNumberFromURL(URL) { + const matches = URL.match(ISSUE_OR_PULL_REQUEST_REGEX); + if (!_.isArray(matches) || matches.length !== 2) { + throw new Error(`Provided URL ${URL} is not a valid Github Issue or Pull Request!`); + } + return Number.parseInt(matches[1], 10); + } + + /** + * Return the login of the actor who closed an issue or PR. If the issue is not closed, return an empty string. + * + * @param {Number} issueNumber + * @returns {Promise} + */ + static getActorWhoClosedIssue(issueNumber) { + return this.paginate(this.octokit.issues.listEvents, { + owner: CONST.GITHUB_OWNER, + repo: CONST.APP_REPO, + issue_number: issueNumber, + per_page: 100, + }) + .then((events) => _.filter(events, (event) => event.event === 'closed')) + .then((closedEvents) => lodashGet(_.last(closedEvents), 'actor.login', '')); + } + + static getArtifactByName(artefactName) { + return this.paginate(this.octokit.actions.listArtifactsForRepo, { + owner: CONST.GITHUB_OWNER, + repo: CONST.APP_REPO, + per_page: 100, + }).then((data) => _.findWhere(data.artifacts, {name: artefactName})); + } +} + +module.exports = GithubUtils; +module.exports.ISSUE_OR_PULL_REQUEST_REGEX = ISSUE_OR_PULL_REQUEST_REGEX; +module.exports.POLL_RATE = POLL_RATE; + + +/***/ }), + +/***/ 7351: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.issue = exports.issueCommand = void 0; +const os = __importStar(__nccwpck_require__(2037)); +const utils_1 = __nccwpck_require__(5278); +/** + * Commands + * + * Command Format: + * ::name key=value,key=value::message + * + * Examples: + * ::warning::This is the message + * ::set-env name=MY_VAR::some value + */ +function issueCommand(command, properties, message) { + const cmd = new Command(command, properties, message); + process.stdout.write(cmd.toString() + os.EOL); +} +exports.issueCommand = issueCommand; +function issue(name, message = '') { + issueCommand(name, {}, message); +} +exports.issue = issue; +const CMD_STRING = '::'; +class Command { + constructor(command, properties, message) { + if (!command) { + command = 'missing.command'; + } + this.command = command; + this.properties = properties; + this.message = message; + } + toString() { + let cmdStr = CMD_STRING + this.command; + if (this.properties && Object.keys(this.properties).length > 0) { + cmdStr += ' '; + let first = true; + for (const key in this.properties) { + if (this.properties.hasOwnProperty(key)) { + const val = this.properties[key]; + if (val) { + if (first) { + first = false; + } + else { + cmdStr += ','; + } + cmdStr += `${key}=${escapeProperty(val)}`; + } + } + } + } + cmdStr += `${CMD_STRING}${escapeData(this.message)}`; + return cmdStr; + } +} +function escapeData(s) { + return utils_1.toCommandValue(s) + .replace(/%/g, '%25') + .replace(/\r/g, '%0D') + .replace(/\n/g, '%0A'); +} +function escapeProperty(s) { + return utils_1.toCommandValue(s) + .replace(/%/g, '%25') + .replace(/\r/g, '%0D') + .replace(/\n/g, '%0A') + .replace(/:/g, '%3A') + .replace(/,/g, '%2C'); +} +//# sourceMappingURL=command.js.map + +/***/ }), + +/***/ 2186: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.getIDToken = exports.getState = exports.saveState = exports.group = exports.endGroup = exports.startGroup = exports.info = exports.notice = exports.warning = exports.error = exports.debug = exports.isDebug = exports.setFailed = exports.setCommandEcho = exports.setOutput = exports.getBooleanInput = exports.getMultilineInput = exports.getInput = exports.addPath = exports.setSecret = exports.exportVariable = exports.ExitCode = void 0; +const command_1 = __nccwpck_require__(7351); +const file_command_1 = __nccwpck_require__(717); +const utils_1 = __nccwpck_require__(5278); +const os = __importStar(__nccwpck_require__(2037)); +const path = __importStar(__nccwpck_require__(1017)); +const oidc_utils_1 = __nccwpck_require__(8041); +/** + * The code to exit an action + */ +var ExitCode; +(function (ExitCode) { + /** + * A code indicating that the action was successful + */ + ExitCode[ExitCode["Success"] = 0] = "Success"; + /** + * A code indicating that the action was a failure + */ + ExitCode[ExitCode["Failure"] = 1] = "Failure"; +})(ExitCode = exports.ExitCode || (exports.ExitCode = {})); +//----------------------------------------------------------------------- +// Variables +//----------------------------------------------------------------------- +/** + * Sets env variable for this action and future actions in the job + * @param name the name of the variable to set + * @param val the value of the variable. Non-string values will be converted to a string via JSON.stringify + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function exportVariable(name, val) { + const convertedVal = utils_1.toCommandValue(val); + process.env[name] = convertedVal; + const filePath = process.env['GITHUB_ENV'] || ''; + if (filePath) { + return file_command_1.issueFileCommand('ENV', file_command_1.prepareKeyValueMessage(name, val)); + } + command_1.issueCommand('set-env', { name }, convertedVal); +} +exports.exportVariable = exportVariable; +/** + * Registers a secret which will get masked from logs + * @param secret value of the secret + */ +function setSecret(secret) { + command_1.issueCommand('add-mask', {}, secret); +} +exports.setSecret = setSecret; +/** + * Prepends inputPath to the PATH (for this action and future actions) + * @param inputPath + */ +function addPath(inputPath) { + const filePath = process.env['GITHUB_PATH'] || ''; + if (filePath) { + file_command_1.issueFileCommand('PATH', inputPath); + } + else { + command_1.issueCommand('add-path', {}, inputPath); + } + process.env['PATH'] = `${inputPath}${path.delimiter}${process.env['PATH']}`; +} +exports.addPath = addPath; +/** + * Gets the value of an input. + * Unless trimWhitespace is set to false in InputOptions, the value is also trimmed. + * Returns an empty string if the value is not defined. + * + * @param name name of the input to get + * @param options optional. See InputOptions. + * @returns string + */ +function getInput(name, options) { + const val = process.env[`INPUT_${name.replace(/ /g, '_').toUpperCase()}`] || ''; + if (options && options.required && !val) { + throw new Error(`Input required and not supplied: ${name}`); + } + if (options && options.trimWhitespace === false) { + return val; + } + return val.trim(); +} +exports.getInput = getInput; +/** + * Gets the values of an multiline input. Each value is also trimmed. + * + * @param name name of the input to get + * @param options optional. See InputOptions. + * @returns string[] + * + */ +function getMultilineInput(name, options) { + const inputs = getInput(name, options) + .split('\n') + .filter(x => x !== ''); + if (options && options.trimWhitespace === false) { + return inputs; + } + return inputs.map(input => input.trim()); +} +exports.getMultilineInput = getMultilineInput; +/** + * Gets the input value of the boolean type in the YAML 1.2 "core schema" specification. + * Support boolean input list: `true | True | TRUE | false | False | FALSE` . + * The return value is also in boolean type. + * ref: https://yaml.org/spec/1.2/spec.html#id2804923 + * + * @param name name of the input to get + * @param options optional. See InputOptions. + * @returns boolean + */ +function getBooleanInput(name, options) { + const trueValue = ['true', 'True', 'TRUE']; + const falseValue = ['false', 'False', 'FALSE']; + const val = getInput(name, options); + if (trueValue.includes(val)) + return true; + if (falseValue.includes(val)) + return false; + throw new TypeError(`Input does not meet YAML 1.2 "Core Schema" specification: ${name}\n` + + `Support boolean input list: \`true | True | TRUE | false | False | FALSE\``); +} +exports.getBooleanInput = getBooleanInput; +/** + * Sets the value of an output. + * + * @param name name of the output to set + * @param value value to store. Non-string values will be converted to a string via JSON.stringify + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function setOutput(name, value) { + const filePath = process.env['GITHUB_OUTPUT'] || ''; + if (filePath) { + return file_command_1.issueFileCommand('OUTPUT', file_command_1.prepareKeyValueMessage(name, value)); + } + process.stdout.write(os.EOL); + command_1.issueCommand('set-output', { name }, utils_1.toCommandValue(value)); +} +exports.setOutput = setOutput; +/** + * Enables or disables the echoing of commands into stdout for the rest of the step. + * Echoing is disabled by default if ACTIONS_STEP_DEBUG is not set. + * + */ +function setCommandEcho(enabled) { + command_1.issue('echo', enabled ? 'on' : 'off'); +} +exports.setCommandEcho = setCommandEcho; +//----------------------------------------------------------------------- +// Results +//----------------------------------------------------------------------- +/** + * Sets the action status to failed. + * When the action exits it will be with an exit code of 1 + * @param message add error issue message + */ +function setFailed(message) { + process.exitCode = ExitCode.Failure; + error(message); +} +exports.setFailed = setFailed; +//----------------------------------------------------------------------- +// Logging Commands +//----------------------------------------------------------------------- +/** + * Gets whether Actions Step Debug is on or not + */ +function isDebug() { + return process.env['RUNNER_DEBUG'] === '1'; +} +exports.isDebug = isDebug; +/** + * Writes debug message to user log + * @param message debug message + */ +function debug(message) { + command_1.issueCommand('debug', {}, message); +} +exports.debug = debug; +/** + * Adds an error issue + * @param message error issue message. Errors will be converted to string via toString() + * @param properties optional properties to add to the annotation. + */ +function error(message, properties = {}) { + command_1.issueCommand('error', utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message); +} +exports.error = error; +/** + * Adds a warning issue + * @param message warning issue message. Errors will be converted to string via toString() + * @param properties optional properties to add to the annotation. + */ +function warning(message, properties = {}) { + command_1.issueCommand('warning', utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message); +} +exports.warning = warning; +/** + * Adds a notice issue + * @param message notice issue message. Errors will be converted to string via toString() + * @param properties optional properties to add to the annotation. + */ +function notice(message, properties = {}) { + command_1.issueCommand('notice', utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message); +} +exports.notice = notice; +/** + * Writes info to log with console.log. + * @param message info message + */ +function info(message) { + process.stdout.write(message + os.EOL); +} +exports.info = info; +/** + * Begin an output group. + * + * Output until the next `groupEnd` will be foldable in this group + * + * @param name The name of the output group + */ +function startGroup(name) { + command_1.issue('group', name); +} +exports.startGroup = startGroup; +/** + * End an output group. + */ +function endGroup() { + command_1.issue('endgroup'); +} +exports.endGroup = endGroup; +/** + * Wrap an asynchronous function call in a group. + * + * Returns the same type as the function itself. + * + * @param name The name of the group + * @param fn The function to wrap in the group + */ +function group(name, fn) { + return __awaiter(this, void 0, void 0, function* () { + startGroup(name); + let result; + try { + result = yield fn(); + } + finally { + endGroup(); + } + return result; + }); +} +exports.group = group; +//----------------------------------------------------------------------- +// Wrapper action state +//----------------------------------------------------------------------- +/** + * Saves state for current action, the state can only be retrieved by this action's post job execution. + * + * @param name name of the state to store + * @param value value to store. Non-string values will be converted to a string via JSON.stringify + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function saveState(name, value) { + const filePath = process.env['GITHUB_STATE'] || ''; + if (filePath) { + return file_command_1.issueFileCommand('STATE', file_command_1.prepareKeyValueMessage(name, value)); + } + command_1.issueCommand('save-state', { name }, utils_1.toCommandValue(value)); +} +exports.saveState = saveState; +/** + * Gets the value of an state set by this action's main execution. + * + * @param name name of the state to get + * @returns string + */ +function getState(name) { + return process.env[`STATE_${name}`] || ''; +} +exports.getState = getState; +function getIDToken(aud) { + return __awaiter(this, void 0, void 0, function* () { + return yield oidc_utils_1.OidcClient.getIDToken(aud); + }); +} +exports.getIDToken = getIDToken; +/** + * Summary exports + */ +var summary_1 = __nccwpck_require__(1327); +Object.defineProperty(exports, "summary", ({ enumerable: true, get: function () { return summary_1.summary; } })); +/** + * @deprecated use core.summary + */ +var summary_2 = __nccwpck_require__(1327); +Object.defineProperty(exports, "markdownSummary", ({ enumerable: true, get: function () { return summary_2.markdownSummary; } })); +/** + * Path exports + */ +var path_utils_1 = __nccwpck_require__(2981); +Object.defineProperty(exports, "toPosixPath", ({ enumerable: true, get: function () { return path_utils_1.toPosixPath; } })); +Object.defineProperty(exports, "toWin32Path", ({ enumerable: true, get: function () { return path_utils_1.toWin32Path; } })); +Object.defineProperty(exports, "toPlatformPath", ({ enumerable: true, get: function () { return path_utils_1.toPlatformPath; } })); +//# sourceMappingURL=core.js.map + +/***/ }), + +/***/ 717: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +// For internal use, subject to change. +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.prepareKeyValueMessage = exports.issueFileCommand = void 0; +// We use any as a valid input type +/* eslint-disable @typescript-eslint/no-explicit-any */ +const fs = __importStar(__nccwpck_require__(7147)); +const os = __importStar(__nccwpck_require__(2037)); +const uuid_1 = __nccwpck_require__(5840); +const utils_1 = __nccwpck_require__(5278); +function issueFileCommand(command, message) { + const filePath = process.env[`GITHUB_${command}`]; + if (!filePath) { + throw new Error(`Unable to find environment variable for file command ${command}`); + } + if (!fs.existsSync(filePath)) { + throw new Error(`Missing file at path: ${filePath}`); + } + fs.appendFileSync(filePath, `${utils_1.toCommandValue(message)}${os.EOL}`, { + encoding: 'utf8' + }); +} +exports.issueFileCommand = issueFileCommand; +function prepareKeyValueMessage(key, value) { + const delimiter = `ghadelimiter_${uuid_1.v4()}`; + const convertedValue = utils_1.toCommandValue(value); + // These should realistically never happen, but just in case someone finds a + // way to exploit uuid generation let's not allow keys or values that contain + // the delimiter. + if (key.includes(delimiter)) { + throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`); + } + if (convertedValue.includes(delimiter)) { + throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`); + } + return `${key}<<${delimiter}${os.EOL}${convertedValue}${os.EOL}${delimiter}`; +} +exports.prepareKeyValueMessage = prepareKeyValueMessage; +//# sourceMappingURL=file-command.js.map + +/***/ }), + +/***/ 8041: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.OidcClient = void 0; +const http_client_1 = __nccwpck_require__(6255); +const auth_1 = __nccwpck_require__(5526); +const core_1 = __nccwpck_require__(2186); +class OidcClient { + static createHttpClient(allowRetry = true, maxRetry = 10) { + const requestOptions = { + allowRetries: allowRetry, + maxRetries: maxRetry + }; + return new http_client_1.HttpClient('actions/oidc-client', [new auth_1.BearerCredentialHandler(OidcClient.getRequestToken())], requestOptions); + } + static getRequestToken() { + const token = process.env['ACTIONS_ID_TOKEN_REQUEST_TOKEN']; + if (!token) { + throw new Error('Unable to get ACTIONS_ID_TOKEN_REQUEST_TOKEN env variable'); + } + return token; + } + static getIDTokenUrl() { + const runtimeUrl = process.env['ACTIONS_ID_TOKEN_REQUEST_URL']; + if (!runtimeUrl) { + throw new Error('Unable to get ACTIONS_ID_TOKEN_REQUEST_URL env variable'); + } + return runtimeUrl; + } + static getCall(id_token_url) { + var _a; + return __awaiter(this, void 0, void 0, function* () { + const httpclient = OidcClient.createHttpClient(); + const res = yield httpclient + .getJson(id_token_url) + .catch(error => { + throw new Error(`Failed to get ID Token. \n + Error Code : ${error.statusCode}\n + Error Message: ${error.result.message}`); + }); + const id_token = (_a = res.result) === null || _a === void 0 ? void 0 : _a.value; + if (!id_token) { + throw new Error('Response json body do not have ID Token field'); + } + return id_token; + }); + } + static getIDToken(audience) { + return __awaiter(this, void 0, void 0, function* () { + try { + // New ID Token is requested from action service + let id_token_url = OidcClient.getIDTokenUrl(); + if (audience) { + const encodedAudience = encodeURIComponent(audience); + id_token_url = `${id_token_url}&audience=${encodedAudience}`; + } + core_1.debug(`ID token url is ${id_token_url}`); + const id_token = yield OidcClient.getCall(id_token_url); + core_1.setSecret(id_token); + return id_token; + } + catch (error) { + throw new Error(`Error message: ${error.message}`); + } + }); + } +} +exports.OidcClient = OidcClient; +//# sourceMappingURL=oidc-utils.js.map + +/***/ }), + +/***/ 2981: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.toPlatformPath = exports.toWin32Path = exports.toPosixPath = void 0; +const path = __importStar(__nccwpck_require__(1017)); +/** + * toPosixPath converts the given path to the posix form. On Windows, \\ will be + * replaced with /. + * + * @param pth. Path to transform. + * @return string Posix path. + */ +function toPosixPath(pth) { + return pth.replace(/[\\]/g, '/'); +} +exports.toPosixPath = toPosixPath; +/** + * toWin32Path converts the given path to the win32 form. On Linux, / will be + * replaced with \\. + * + * @param pth. Path to transform. + * @return string Win32 path. + */ +function toWin32Path(pth) { + return pth.replace(/[/]/g, '\\'); +} +exports.toWin32Path = toWin32Path; +/** + * toPlatformPath converts the given path to a platform-specific path. It does + * this by replacing instances of / and \ with the platform-specific path + * separator. + * + * @param pth The path to platformize. + * @return string The platform-specific path. + */ +function toPlatformPath(pth) { + return pth.replace(/[/\\]/g, path.sep); +} +exports.toPlatformPath = toPlatformPath; +//# sourceMappingURL=path-utils.js.map + +/***/ }), + +/***/ 1327: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.summary = exports.markdownSummary = exports.SUMMARY_DOCS_URL = exports.SUMMARY_ENV_VAR = void 0; +const os_1 = __nccwpck_require__(2037); +const fs_1 = __nccwpck_require__(7147); +const { access, appendFile, writeFile } = fs_1.promises; +exports.SUMMARY_ENV_VAR = 'GITHUB_STEP_SUMMARY'; +exports.SUMMARY_DOCS_URL = 'https://docs.github.com/actions/using-workflows/workflow-commands-for-github-actions#adding-a-job-summary'; +class Summary { + constructor() { + this._buffer = ''; + } + /** + * Finds the summary file path from the environment, rejects if env var is not found or file does not exist + * Also checks r/w permissions. + * + * @returns step summary file path + */ + filePath() { + return __awaiter(this, void 0, void 0, function* () { + if (this._filePath) { + return this._filePath; + } + const pathFromEnv = process.env[exports.SUMMARY_ENV_VAR]; + if (!pathFromEnv) { + throw new Error(`Unable to find environment variable for $${exports.SUMMARY_ENV_VAR}. Check if your runtime environment supports job summaries.`); + } + try { + yield access(pathFromEnv, fs_1.constants.R_OK | fs_1.constants.W_OK); + } + catch (_a) { + throw new Error(`Unable to access summary file: '${pathFromEnv}'. Check if the file has correct read/write permissions.`); + } + this._filePath = pathFromEnv; + return this._filePath; + }); + } + /** + * Wraps content in an HTML tag, adding any HTML attributes + * + * @param {string} tag HTML tag to wrap + * @param {string | null} content content within the tag + * @param {[attribute: string]: string} attrs key-value list of HTML attributes to add + * + * @returns {string} content wrapped in HTML element + */ + wrap(tag, content, attrs = {}) { + const htmlAttrs = Object.entries(attrs) + .map(([key, value]) => ` ${key}="${value}"`) + .join(''); + if (!content) { + return `<${tag}${htmlAttrs}>`; + } + return `<${tag}${htmlAttrs}>${content}`; + } + /** + * Writes text in the buffer to the summary buffer file and empties buffer. Will append by default. + * + * @param {SummaryWriteOptions} [options] (optional) options for write operation + * + * @returns {Promise} summary instance + */ + write(options) { + return __awaiter(this, void 0, void 0, function* () { + const overwrite = !!(options === null || options === void 0 ? void 0 : options.overwrite); + const filePath = yield this.filePath(); + const writeFunc = overwrite ? writeFile : appendFile; + yield writeFunc(filePath, this._buffer, { encoding: 'utf8' }); + return this.emptyBuffer(); + }); + } + /** + * Clears the summary buffer and wipes the summary file + * + * @returns {Summary} summary instance + */ + clear() { + return __awaiter(this, void 0, void 0, function* () { + return this.emptyBuffer().write({ overwrite: true }); + }); + } + /** + * Returns the current summary buffer as a string + * + * @returns {string} string of summary buffer + */ + stringify() { + return this._buffer; + } + /** + * If the summary buffer is empty + * + * @returns {boolen} true if the buffer is empty + */ + isEmptyBuffer() { + return this._buffer.length === 0; + } + /** + * Resets the summary buffer without writing to summary file + * + * @returns {Summary} summary instance + */ + emptyBuffer() { + this._buffer = ''; + return this; + } + /** + * Adds raw text to the summary buffer + * + * @param {string} text content to add + * @param {boolean} [addEOL=false] (optional) append an EOL to the raw text (default: false) + * + * @returns {Summary} summary instance + */ + addRaw(text, addEOL = false) { + this._buffer += text; + return addEOL ? this.addEOL() : this; + } + /** + * Adds the operating system-specific end-of-line marker to the buffer + * + * @returns {Summary} summary instance + */ + addEOL() { + return this.addRaw(os_1.EOL); + } + /** + * Adds an HTML codeblock to the summary buffer + * + * @param {string} code content to render within fenced code block + * @param {string} lang (optional) language to syntax highlight code + * + * @returns {Summary} summary instance + */ + addCodeBlock(code, lang) { + const attrs = Object.assign({}, (lang && { lang })); + const element = this.wrap('pre', this.wrap('code', code), attrs); + return this.addRaw(element).addEOL(); + } + /** + * Adds an HTML list to the summary buffer + * + * @param {string[]} items list of items to render + * @param {boolean} [ordered=false] (optional) if the rendered list should be ordered or not (default: false) + * + * @returns {Summary} summary instance + */ + addList(items, ordered = false) { + const tag = ordered ? 'ol' : 'ul'; + const listItems = items.map(item => this.wrap('li', item)).join(''); + const element = this.wrap(tag, listItems); + return this.addRaw(element).addEOL(); + } + /** + * Adds an HTML table to the summary buffer + * + * @param {SummaryTableCell[]} rows table rows + * + * @returns {Summary} summary instance + */ + addTable(rows) { + const tableBody = rows + .map(row => { + const cells = row + .map(cell => { + if (typeof cell === 'string') { + return this.wrap('td', cell); + } + const { header, data, colspan, rowspan } = cell; + const tag = header ? 'th' : 'td'; + const attrs = Object.assign(Object.assign({}, (colspan && { colspan })), (rowspan && { rowspan })); + return this.wrap(tag, data, attrs); + }) + .join(''); + return this.wrap('tr', cells); + }) + .join(''); + const element = this.wrap('table', tableBody); + return this.addRaw(element).addEOL(); + } + /** + * Adds a collapsable HTML details element to the summary buffer + * + * @param {string} label text for the closed state + * @param {string} content collapsable content + * + * @returns {Summary} summary instance + */ + addDetails(label, content) { + const element = this.wrap('details', this.wrap('summary', label) + content); + return this.addRaw(element).addEOL(); + } + /** + * Adds an HTML image tag to the summary buffer + * + * @param {string} src path to the image you to embed + * @param {string} alt text description of the image + * @param {SummaryImageOptions} options (optional) addition image attributes + * + * @returns {Summary} summary instance + */ + addImage(src, alt, options) { + const { width, height } = options || {}; + const attrs = Object.assign(Object.assign({}, (width && { width })), (height && { height })); + const element = this.wrap('img', null, Object.assign({ src, alt }, attrs)); + return this.addRaw(element).addEOL(); + } + /** + * Adds an HTML section heading element + * + * @param {string} text heading text + * @param {number | string} [level=1] (optional) the heading level, default: 1 + * + * @returns {Summary} summary instance + */ + addHeading(text, level) { + const tag = `h${level}`; + const allowedTag = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'].includes(tag) + ? tag + : 'h1'; + const element = this.wrap(allowedTag, text); + return this.addRaw(element).addEOL(); + } + /** + * Adds an HTML thematic break (
    ) to the summary buffer + * + * @returns {Summary} summary instance + */ + addSeparator() { + const element = this.wrap('hr', null); + return this.addRaw(element).addEOL(); + } + /** + * Adds an HTML line break (
    ) to the summary buffer + * + * @returns {Summary} summary instance + */ + addBreak() { + const element = this.wrap('br', null); + return this.addRaw(element).addEOL(); + } + /** + * Adds an HTML blockquote to the summary buffer + * + * @param {string} text quote text + * @param {string} cite (optional) citation url + * + * @returns {Summary} summary instance + */ + addQuote(text, cite) { + const attrs = Object.assign({}, (cite && { cite })); + const element = this.wrap('blockquote', text, attrs); + return this.addRaw(element).addEOL(); + } + /** + * Adds an HTML anchor tag to the summary buffer + * + * @param {string} text link text/content + * @param {string} href hyperlink + * + * @returns {Summary} summary instance + */ + addLink(text, href) { + const element = this.wrap('a', text, { href }); + return this.addRaw(element).addEOL(); + } +} +const _summary = new Summary(); +/** + * @deprecated use `core.summary` + */ +exports.markdownSummary = _summary; +exports.summary = _summary; +//# sourceMappingURL=summary.js.map + +/***/ }), + +/***/ 5278: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +// We use any as a valid input type +/* eslint-disable @typescript-eslint/no-explicit-any */ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.toCommandProperties = exports.toCommandValue = void 0; +/** + * Sanitizes an input into a string so it can be passed into issueCommand safely + * @param input input to sanitize into a string + */ +function toCommandValue(input) { + if (input === null || input === undefined) { + return ''; + } + else if (typeof input === 'string' || input instanceof String) { + return input; + } + return JSON.stringify(input); +} +exports.toCommandValue = toCommandValue; +/** + * + * @param annotationProperties + * @returns The command properties to send with the actual annotation command + * See IssueCommandProperties: https://github.com/actions/runner/blob/main/src/Runner.Worker/ActionCommandManager.cs#L646 + */ +function toCommandProperties(annotationProperties) { + if (!Object.keys(annotationProperties).length) { + return {}; + } + return { + title: annotationProperties.title, + file: annotationProperties.file, + line: annotationProperties.startLine, + endLine: annotationProperties.endLine, + col: annotationProperties.startColumn, + endColumn: annotationProperties.endColumn + }; +} +exports.toCommandProperties = toCommandProperties; +//# sourceMappingURL=utils.js.map + +/***/ }), + +/***/ 4087: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Context = void 0; +const fs_1 = __nccwpck_require__(7147); +const os_1 = __nccwpck_require__(2037); +class Context { + /** + * Hydrate the context from the environment + */ + constructor() { + var _a, _b, _c; + this.payload = {}; + if (process.env.GITHUB_EVENT_PATH) { + if (fs_1.existsSync(process.env.GITHUB_EVENT_PATH)) { + this.payload = JSON.parse(fs_1.readFileSync(process.env.GITHUB_EVENT_PATH, { encoding: 'utf8' })); + } + else { + const path = process.env.GITHUB_EVENT_PATH; + process.stdout.write(`GITHUB_EVENT_PATH ${path} does not exist${os_1.EOL}`); + } + } + this.eventName = process.env.GITHUB_EVENT_NAME; + this.sha = process.env.GITHUB_SHA; + this.ref = process.env.GITHUB_REF; + this.workflow = process.env.GITHUB_WORKFLOW; + this.action = process.env.GITHUB_ACTION; + this.actor = process.env.GITHUB_ACTOR; + this.job = process.env.GITHUB_JOB; + this.runNumber = parseInt(process.env.GITHUB_RUN_NUMBER, 10); + this.runId = parseInt(process.env.GITHUB_RUN_ID, 10); + this.apiUrl = (_a = process.env.GITHUB_API_URL) !== null && _a !== void 0 ? _a : `https://api.github.com`; + this.serverUrl = (_b = process.env.GITHUB_SERVER_URL) !== null && _b !== void 0 ? _b : `https://github.com`; + this.graphqlUrl = (_c = process.env.GITHUB_GRAPHQL_URL) !== null && _c !== void 0 ? _c : `https://api.github.com/graphql`; + } + get issue() { + const payload = this.payload; + return Object.assign(Object.assign({}, this.repo), { number: (payload.issue || payload.pull_request || payload).number }); + } + get repo() { + if (process.env.GITHUB_REPOSITORY) { + const [owner, repo] = process.env.GITHUB_REPOSITORY.split('/'); + return { owner, repo }; + } + if (this.payload.repository) { + return { + owner: this.payload.repository.owner.login, + repo: this.payload.repository.name + }; + } + throw new Error("context.repo requires a GITHUB_REPOSITORY environment variable like 'owner/repo'"); + } +} +exports.Context = Context; +//# sourceMappingURL=context.js.map + +/***/ }), + +/***/ 7914: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.getApiBaseUrl = exports.getProxyAgent = exports.getAuthString = void 0; +const httpClient = __importStar(__nccwpck_require__(6255)); +function getAuthString(token, options) { + if (!token && !options.auth) { + throw new Error('Parameter token or opts.auth is required'); + } + else if (token && options.auth) { + throw new Error('Parameters token and opts.auth may not both be specified'); + } + return typeof options.auth === 'string' ? options.auth : `token ${token}`; +} +exports.getAuthString = getAuthString; +function getProxyAgent(destinationUrl) { + const hc = new httpClient.HttpClient(); + return hc.getAgent(destinationUrl); +} +exports.getProxyAgent = getProxyAgent; +function getApiBaseUrl() { + return process.env['GITHUB_API_URL'] || 'https://api.github.com'; +} +exports.getApiBaseUrl = getApiBaseUrl; +//# sourceMappingURL=utils.js.map + +/***/ }), + +/***/ 3030: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.getOctokitOptions = exports.GitHub = exports.defaults = exports.context = void 0; +const Context = __importStar(__nccwpck_require__(4087)); +const Utils = __importStar(__nccwpck_require__(7914)); +// octokit + plugins +const core_1 = __nccwpck_require__(8525); +const plugin_rest_endpoint_methods_1 = __nccwpck_require__(3044); +const plugin_paginate_rest_1 = __nccwpck_require__(8945); +exports.context = new Context.Context(); +const baseUrl = Utils.getApiBaseUrl(); +exports.defaults = { + baseUrl, + request: { + agent: Utils.getProxyAgent(baseUrl) + } +}; +exports.GitHub = core_1.Octokit.plugin(plugin_rest_endpoint_methods_1.restEndpointMethods, plugin_paginate_rest_1.paginateRest).defaults(exports.defaults); +/** + * Convience function to correctly format Octokit Options to pass into the constructor. + * + * @param token the repo PAT or GITHUB_TOKEN + * @param options other options to set + */ +function getOctokitOptions(token, options) { + const opts = Object.assign({}, options || {}); // Shallow clone - don't mutate the object provided by the caller + // Auth + const auth = Utils.getAuthString(token, opts); + if (auth) { + opts.auth = auth; + } + return opts; +} +exports.getOctokitOptions = getOctokitOptions; +//# sourceMappingURL=utils.js.map + +/***/ }), + +/***/ 673: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ value: true })); + +const REGEX_IS_INSTALLATION_LEGACY = /^v1\./; +const REGEX_IS_INSTALLATION = /^ghs_/; +const REGEX_IS_USER_TO_SERVER = /^ghu_/; +async function auth(token) { + const isApp = token.split(/\./).length === 3; + const isInstallation = REGEX_IS_INSTALLATION_LEGACY.test(token) || REGEX_IS_INSTALLATION.test(token); + const isUserToServer = REGEX_IS_USER_TO_SERVER.test(token); + const tokenType = isApp ? "app" : isInstallation ? "installation" : isUserToServer ? "user-to-server" : "oauth"; + return { + type: "token", + token: token, + tokenType + }; +} + +/** + * Prefix token for usage in the Authorization header + * + * @param token OAuth token or JSON Web Token + */ +function withAuthorizationPrefix(token) { + if (token.split(/\./).length === 3) { + return `bearer ${token}`; + } + + return `token ${token}`; +} + +async function hook(token, request, route, parameters) { + const endpoint = request.endpoint.merge(route, parameters); + endpoint.headers.authorization = withAuthorizationPrefix(token); + return request(endpoint); +} + +const createTokenAuth = function createTokenAuth(token) { + if (!token) { + throw new Error("[@octokit/auth-token] No token passed to createTokenAuth"); + } + + if (typeof token !== "string") { + throw new Error("[@octokit/auth-token] Token passed to createTokenAuth is not a string"); + } + + token = token.replace(/^(token|bearer) +/i, ""); + return Object.assign(auth.bind(null, token), { + hook: hook.bind(null, token) + }); +}; + +exports.createTokenAuth = createTokenAuth; +//# sourceMappingURL=index.js.map + + +/***/ }), + +/***/ 8525: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ value: true })); + +var universalUserAgent = __nccwpck_require__(5030); +var beforeAfterHook = __nccwpck_require__(3682); +var request = __nccwpck_require__(9353); +var graphql = __nccwpck_require__(6422); +var authToken = __nccwpck_require__(673); + +function _objectWithoutPropertiesLoose(source, excluded) { + if (source == null) return {}; + var target = {}; + var sourceKeys = Object.keys(source); + var key, i; + + for (i = 0; i < sourceKeys.length; i++) { + key = sourceKeys[i]; + if (excluded.indexOf(key) >= 0) continue; + target[key] = source[key]; + } + + return target; +} + +function _objectWithoutProperties(source, excluded) { + if (source == null) return {}; + + var target = _objectWithoutPropertiesLoose(source, excluded); + + var key, i; + + if (Object.getOwnPropertySymbols) { + var sourceSymbolKeys = Object.getOwnPropertySymbols(source); + + for (i = 0; i < sourceSymbolKeys.length; i++) { + key = sourceSymbolKeys[i]; + if (excluded.indexOf(key) >= 0) continue; + if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; + target[key] = source[key]; + } + } + + return target; +} + +const VERSION = "3.6.0"; + +const _excluded = ["authStrategy"]; +class Octokit { + constructor(options = {}) { + const hook = new beforeAfterHook.Collection(); + const requestDefaults = { + baseUrl: request.request.endpoint.DEFAULTS.baseUrl, + headers: {}, + request: Object.assign({}, options.request, { + // @ts-ignore internal usage only, no need to type + hook: hook.bind(null, "request") + }), + mediaType: { + previews: [], + format: "" + } + }; // prepend default user agent with `options.userAgent` if set + + requestDefaults.headers["user-agent"] = [options.userAgent, `octokit-core.js/${VERSION} ${universalUserAgent.getUserAgent()}`].filter(Boolean).join(" "); + + if (options.baseUrl) { + requestDefaults.baseUrl = options.baseUrl; + } + + if (options.previews) { + requestDefaults.mediaType.previews = options.previews; + } + + if (options.timeZone) { + requestDefaults.headers["time-zone"] = options.timeZone; + } + + this.request = request.request.defaults(requestDefaults); + this.graphql = graphql.withCustomRequest(this.request).defaults(requestDefaults); + this.log = Object.assign({ + debug: () => {}, + info: () => {}, + warn: console.warn.bind(console), + error: console.error.bind(console) + }, options.log); + this.hook = hook; // (1) If neither `options.authStrategy` nor `options.auth` are set, the `octokit` instance + // is unauthenticated. The `this.auth()` method is a no-op and no request hook is registered. + // (2) If only `options.auth` is set, use the default token authentication strategy. + // (3) If `options.authStrategy` is set then use it and pass in `options.auth`. Always pass own request as many strategies accept a custom request instance. + // TODO: type `options.auth` based on `options.authStrategy`. + + if (!options.authStrategy) { + if (!options.auth) { + // (1) + this.auth = async () => ({ + type: "unauthenticated" + }); + } else { + // (2) + const auth = authToken.createTokenAuth(options.auth); // @ts-ignore ¯\_(ツ)_/¯ + + hook.wrap("request", auth.hook); + this.auth = auth; + } + } else { + const { + authStrategy + } = options, + otherOptions = _objectWithoutProperties(options, _excluded); + + const auth = authStrategy(Object.assign({ + request: this.request, + log: this.log, + // we pass the current octokit instance as well as its constructor options + // to allow for authentication strategies that return a new octokit instance + // that shares the same internal state as the current one. The original + // requirement for this was the "event-octokit" authentication strategy + // of https://github.com/probot/octokit-auth-probot. + octokit: this, + octokitOptions: otherOptions + }, options.auth)); // @ts-ignore ¯\_(ツ)_/¯ + + hook.wrap("request", auth.hook); + this.auth = auth; + } // apply plugins + // https://stackoverflow.com/a/16345172 + + + const classConstructor = this.constructor; + classConstructor.plugins.forEach(plugin => { + Object.assign(this, plugin(this, options)); + }); + } + + static defaults(defaults) { + const OctokitWithDefaults = class extends this { + constructor(...args) { + const options = args[0] || {}; + + if (typeof defaults === "function") { + super(defaults(options)); + return; + } + + super(Object.assign({}, defaults, options, options.userAgent && defaults.userAgent ? { + userAgent: `${options.userAgent} ${defaults.userAgent}` + } : null)); + } + + }; + return OctokitWithDefaults; + } + /** + * Attach a plugin (or many) to your Octokit instance. + * + * @example + * const API = Octokit.plugin(plugin1, plugin2, plugin3, ...) + */ + + + static plugin(...newPlugins) { + var _a; + + const currentPlugins = this.plugins; + const NewOctokit = (_a = class extends this {}, _a.plugins = currentPlugins.concat(newPlugins.filter(plugin => !currentPlugins.includes(plugin))), _a); + return NewOctokit; + } + +} +Octokit.VERSION = VERSION; +Octokit.plugins = []; + +exports.Octokit = Octokit; +//# sourceMappingURL=index.js.map + + +/***/ }), + +/***/ 8713: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ value: true })); + +var isPlainObject = __nccwpck_require__(3287); +var universalUserAgent = __nccwpck_require__(5030); + +function lowercaseKeys(object) { + if (!object) { + return {}; + } + + return Object.keys(object).reduce((newObj, key) => { + newObj[key.toLowerCase()] = object[key]; + return newObj; + }, {}); +} + +function mergeDeep(defaults, options) { + const result = Object.assign({}, defaults); + Object.keys(options).forEach(key => { + if (isPlainObject.isPlainObject(options[key])) { + if (!(key in defaults)) Object.assign(result, { + [key]: options[key] + });else result[key] = mergeDeep(defaults[key], options[key]); + } else { + Object.assign(result, { + [key]: options[key] + }); + } + }); + return result; +} + +function removeUndefinedProperties(obj) { + for (const key in obj) { + if (obj[key] === undefined) { + delete obj[key]; + } + } + + return obj; +} + +function merge(defaults, route, options) { + if (typeof route === "string") { + let [method, url] = route.split(" "); + options = Object.assign(url ? { + method, + url + } : { + url: method + }, options); + } else { + options = Object.assign({}, route); + } // lowercase header names before merging with defaults to avoid duplicates + + + options.headers = lowercaseKeys(options.headers); // remove properties with undefined values before merging + + removeUndefinedProperties(options); + removeUndefinedProperties(options.headers); + const mergedOptions = mergeDeep(defaults || {}, options); // mediaType.previews arrays are merged, instead of overwritten + + if (defaults && defaults.mediaType.previews.length) { + mergedOptions.mediaType.previews = defaults.mediaType.previews.filter(preview => !mergedOptions.mediaType.previews.includes(preview)).concat(mergedOptions.mediaType.previews); + } + + mergedOptions.mediaType.previews = mergedOptions.mediaType.previews.map(preview => preview.replace(/-preview/, "")); + return mergedOptions; +} + +function addQueryParameters(url, parameters) { + const separator = /\?/.test(url) ? "&" : "?"; + const names = Object.keys(parameters); + + if (names.length === 0) { + return url; + } + + return url + separator + names.map(name => { + if (name === "q") { + return "q=" + parameters.q.split("+").map(encodeURIComponent).join("+"); + } + + return `${name}=${encodeURIComponent(parameters[name])}`; + }).join("&"); +} + +const urlVariableRegex = /\{[^}]+\}/g; + +function removeNonChars(variableName) { + return variableName.replace(/^\W+|\W+$/g, "").split(/,/); +} + +function extractUrlVariableNames(url) { + const matches = url.match(urlVariableRegex); + + if (!matches) { + return []; + } + + return matches.map(removeNonChars).reduce((a, b) => a.concat(b), []); +} + +function omit(object, keysToOmit) { + return Object.keys(object).filter(option => !keysToOmit.includes(option)).reduce((obj, key) => { + obj[key] = object[key]; + return obj; + }, {}); +} + +// Based on https://github.com/bramstein/url-template, licensed under BSD +// TODO: create separate package. +// +// Copyright (c) 2012-2014, Bram Stein +// All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// 3. The name of the author may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED +// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +// EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +/* istanbul ignore file */ +function encodeReserved(str) { + return str.split(/(%[0-9A-Fa-f]{2})/g).map(function (part) { + if (!/%[0-9A-Fa-f]/.test(part)) { + part = encodeURI(part).replace(/%5B/g, "[").replace(/%5D/g, "]"); + } + + return part; + }).join(""); +} + +function encodeUnreserved(str) { + return encodeURIComponent(str).replace(/[!'()*]/g, function (c) { + return "%" + c.charCodeAt(0).toString(16).toUpperCase(); + }); +} + +function encodeValue(operator, value, key) { + value = operator === "+" || operator === "#" ? encodeReserved(value) : encodeUnreserved(value); + + if (key) { + return encodeUnreserved(key) + "=" + value; + } else { + return value; + } +} + +function isDefined(value) { + return value !== undefined && value !== null; +} + +function isKeyOperator(operator) { + return operator === ";" || operator === "&" || operator === "?"; +} + +function getValues(context, operator, key, modifier) { + var value = context[key], + result = []; + + if (isDefined(value) && value !== "") { + if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") { + value = value.toString(); + + if (modifier && modifier !== "*") { + value = value.substring(0, parseInt(modifier, 10)); + } + + result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : "")); + } else { + if (modifier === "*") { + if (Array.isArray(value)) { + value.filter(isDefined).forEach(function (value) { + result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : "")); + }); + } else { + Object.keys(value).forEach(function (k) { + if (isDefined(value[k])) { + result.push(encodeValue(operator, value[k], k)); + } + }); + } + } else { + const tmp = []; + + if (Array.isArray(value)) { + value.filter(isDefined).forEach(function (value) { + tmp.push(encodeValue(operator, value)); + }); + } else { + Object.keys(value).forEach(function (k) { + if (isDefined(value[k])) { + tmp.push(encodeUnreserved(k)); + tmp.push(encodeValue(operator, value[k].toString())); + } + }); + } + + if (isKeyOperator(operator)) { + result.push(encodeUnreserved(key) + "=" + tmp.join(",")); + } else if (tmp.length !== 0) { + result.push(tmp.join(",")); + } + } + } + } else { + if (operator === ";") { + if (isDefined(value)) { + result.push(encodeUnreserved(key)); + } + } else if (value === "" && (operator === "&" || operator === "?")) { + result.push(encodeUnreserved(key) + "="); + } else if (value === "") { + result.push(""); + } + } + + return result; +} + +function parseUrl(template) { + return { + expand: expand.bind(null, template) + }; +} + +function expand(template, context) { + var operators = ["+", "#", ".", "/", ";", "?", "&"]; + return template.replace(/\{([^\{\}]+)\}|([^\{\}]+)/g, function (_, expression, literal) { + if (expression) { + let operator = ""; + const values = []; + + if (operators.indexOf(expression.charAt(0)) !== -1) { + operator = expression.charAt(0); + expression = expression.substr(1); + } + + expression.split(/,/g).forEach(function (variable) { + var tmp = /([^:\*]*)(?::(\d+)|(\*))?/.exec(variable); + values.push(getValues(context, operator, tmp[1], tmp[2] || tmp[3])); + }); + + if (operator && operator !== "+") { + var separator = ","; + + if (operator === "?") { + separator = "&"; + } else if (operator !== "#") { + separator = operator; + } + + return (values.length !== 0 ? operator : "") + values.join(separator); + } else { + return values.join(","); + } + } else { + return encodeReserved(literal); + } + }); +} + +function parse(options) { + // https://fetch.spec.whatwg.org/#methods + let method = options.method.toUpperCase(); // replace :varname with {varname} to make it RFC 6570 compatible + + let url = (options.url || "/").replace(/:([a-z]\w+)/g, "{$1}"); + let headers = Object.assign({}, options.headers); + let body; + let parameters = omit(options, ["method", "baseUrl", "url", "headers", "request", "mediaType"]); // extract variable names from URL to calculate remaining variables later + + const urlVariableNames = extractUrlVariableNames(url); + url = parseUrl(url).expand(parameters); + + if (!/^http/.test(url)) { + url = options.baseUrl + url; + } + + const omittedParameters = Object.keys(options).filter(option => urlVariableNames.includes(option)).concat("baseUrl"); + const remainingParameters = omit(parameters, omittedParameters); + const isBinaryRequest = /application\/octet-stream/i.test(headers.accept); + + if (!isBinaryRequest) { + if (options.mediaType.format) { + // e.g. application/vnd.github.v3+json => application/vnd.github.v3.raw + headers.accept = headers.accept.split(/,/).map(preview => preview.replace(/application\/vnd(\.\w+)(\.v3)?(\.\w+)?(\+json)?$/, `application/vnd$1$2.${options.mediaType.format}`)).join(","); + } + + if (options.mediaType.previews.length) { + const previewsFromAcceptHeader = headers.accept.match(/[\w-]+(?=-preview)/g) || []; + headers.accept = previewsFromAcceptHeader.concat(options.mediaType.previews).map(preview => { + const format = options.mediaType.format ? `.${options.mediaType.format}` : "+json"; + return `application/vnd.github.${preview}-preview${format}`; + }).join(","); + } + } // for GET/HEAD requests, set URL query parameters from remaining parameters + // for PATCH/POST/PUT/DELETE requests, set request body from remaining parameters + + + if (["GET", "HEAD"].includes(method)) { + url = addQueryParameters(url, remainingParameters); + } else { + if ("data" in remainingParameters) { + body = remainingParameters.data; + } else { + if (Object.keys(remainingParameters).length) { + body = remainingParameters; + } else { + headers["content-length"] = 0; + } + } + } // default content-type for JSON if body is set + + + if (!headers["content-type"] && typeof body !== "undefined") { + headers["content-type"] = "application/json; charset=utf-8"; + } // GitHub expects 'content-length: 0' header for PUT/PATCH requests without body. + // fetch does not allow to set `content-length` header, but we can set body to an empty string + + + if (["PATCH", "PUT"].includes(method) && typeof body === "undefined") { + body = ""; + } // Only return body/request keys if present + + + return Object.assign({ + method, + url, + headers + }, typeof body !== "undefined" ? { + body + } : null, options.request ? { + request: options.request + } : null); +} + +function endpointWithDefaults(defaults, route, options) { + return parse(merge(defaults, route, options)); +} + +function withDefaults(oldDefaults, newDefaults) { + const DEFAULTS = merge(oldDefaults, newDefaults); + const endpoint = endpointWithDefaults.bind(null, DEFAULTS); + return Object.assign(endpoint, { + DEFAULTS, + defaults: withDefaults.bind(null, DEFAULTS), + merge: merge.bind(null, DEFAULTS), + parse + }); +} + +const VERSION = "6.0.12"; + +const userAgent = `octokit-endpoint.js/${VERSION} ${universalUserAgent.getUserAgent()}`; // DEFAULTS has all properties set that EndpointOptions has, except url. +// So we use RequestParameters and add method as additional required property. + +const DEFAULTS = { + method: "GET", + baseUrl: "https://api.github.com", + headers: { + accept: "application/vnd.github.v3+json", + "user-agent": userAgent + }, + mediaType: { + format: "", + previews: [] + } +}; + +const endpoint = withDefaults(null, DEFAULTS); + +exports.endpoint = endpoint; +//# sourceMappingURL=index.js.map + + +/***/ }), + +/***/ 6422: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ value: true })); + +var request = __nccwpck_require__(9353); +var universalUserAgent = __nccwpck_require__(5030); + +const VERSION = "4.8.0"; + +function _buildMessageForResponseErrors(data) { + return `Request failed due to following response errors:\n` + data.errors.map(e => ` - ${e.message}`).join("\n"); +} + +class GraphqlResponseError extends Error { + constructor(request, headers, response) { + super(_buildMessageForResponseErrors(response)); + this.request = request; + this.headers = headers; + this.response = response; + this.name = "GraphqlResponseError"; // Expose the errors and response data in their shorthand properties. + + this.errors = response.errors; + this.data = response.data; // Maintains proper stack trace (only available on V8) + + /* istanbul ignore next */ + + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + } + +} + +const NON_VARIABLE_OPTIONS = ["method", "baseUrl", "url", "headers", "request", "query", "mediaType"]; +const FORBIDDEN_VARIABLE_OPTIONS = ["query", "method", "url"]; +const GHES_V3_SUFFIX_REGEX = /\/api\/v3\/?$/; +function graphql(request, query, options) { + if (options) { + if (typeof query === "string" && "query" in options) { + return Promise.reject(new Error(`[@octokit/graphql] "query" cannot be used as variable name`)); + } + + for (const key in options) { + if (!FORBIDDEN_VARIABLE_OPTIONS.includes(key)) continue; + return Promise.reject(new Error(`[@octokit/graphql] "${key}" cannot be used as variable name`)); + } + } + + const parsedOptions = typeof query === "string" ? Object.assign({ + query + }, options) : query; + const requestOptions = Object.keys(parsedOptions).reduce((result, key) => { + if (NON_VARIABLE_OPTIONS.includes(key)) { + result[key] = parsedOptions[key]; + return result; + } + + if (!result.variables) { + result.variables = {}; + } + + result.variables[key] = parsedOptions[key]; + return result; + }, {}); // workaround for GitHub Enterprise baseUrl set with /api/v3 suffix + // https://github.com/octokit/auth-app.js/issues/111#issuecomment-657610451 + + const baseUrl = parsedOptions.baseUrl || request.endpoint.DEFAULTS.baseUrl; + + if (GHES_V3_SUFFIX_REGEX.test(baseUrl)) { + requestOptions.url = baseUrl.replace(GHES_V3_SUFFIX_REGEX, "/api/graphql"); + } + + return request(requestOptions).then(response => { + if (response.data.errors) { + const headers = {}; + + for (const key of Object.keys(response.headers)) { + headers[key] = response.headers[key]; + } + + throw new GraphqlResponseError(requestOptions, headers, response.data); + } + + return response.data.data; + }); +} + +function withDefaults(request$1, newDefaults) { + const newRequest = request$1.defaults(newDefaults); + + const newApi = (query, options) => { + return graphql(newRequest, query, options); + }; + + return Object.assign(newApi, { + defaults: withDefaults.bind(null, newRequest), + endpoint: request.request.endpoint + }); +} + +const graphql$1 = withDefaults(request.request, { + headers: { + "user-agent": `octokit-graphql.js/${VERSION} ${universalUserAgent.getUserAgent()}` + }, + method: "POST", + url: "/graphql" +}); +function withCustomRequest(customRequest) { + return withDefaults(customRequest, { + method: "POST", + url: "/graphql" + }); +} + +exports.GraphqlResponseError = GraphqlResponseError; +exports.graphql = graphql$1; +exports.withCustomRequest = withCustomRequest; +//# sourceMappingURL=index.js.map + + +/***/ }), + +/***/ 8945: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ value: true })); + +const VERSION = "2.21.3"; + +function ownKeys(object, enumerableOnly) { + var keys = Object.keys(object); + + if (Object.getOwnPropertySymbols) { + var symbols = Object.getOwnPropertySymbols(object); + enumerableOnly && (symbols = symbols.filter(function (sym) { + return Object.getOwnPropertyDescriptor(object, sym).enumerable; + })), keys.push.apply(keys, symbols); + } + + return keys; +} + +function _objectSpread2(target) { + for (var i = 1; i < arguments.length; i++) { + var source = null != arguments[i] ? arguments[i] : {}; + i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { + _defineProperty(target, key, source[key]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { + Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); + }); + } + + return target; +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +/** + * Some “list” response that can be paginated have a different response structure + * + * They have a `total_count` key in the response (search also has `incomplete_results`, + * /installation/repositories also has `repository_selection`), as well as a key with + * the list of the items which name varies from endpoint to endpoint. + * + * Octokit normalizes these responses so that paginated results are always returned following + * the same structure. One challenge is that if the list response has only one page, no Link + * header is provided, so this header alone is not sufficient to check wether a response is + * paginated or not. + * + * We check if a "total_count" key is present in the response data, but also make sure that + * a "url" property is not, as the "Get the combined status for a specific ref" endpoint would + * otherwise match: https://developer.github.com/v3/repos/statuses/#get-the-combined-status-for-a-specific-ref + */ +function normalizePaginatedListResponse(response) { + // endpoints can respond with 204 if repository is empty + if (!response.data) { + return _objectSpread2(_objectSpread2({}, response), {}, { + data: [] + }); + } + + const responseNeedsNormalization = "total_count" in response.data && !("url" in response.data); + if (!responseNeedsNormalization) return response; // keep the additional properties intact as there is currently no other way + // to retrieve the same information. + + const incompleteResults = response.data.incomplete_results; + const repositorySelection = response.data.repository_selection; + const totalCount = response.data.total_count; + delete response.data.incomplete_results; + delete response.data.repository_selection; + delete response.data.total_count; + const namespaceKey = Object.keys(response.data)[0]; + const data = response.data[namespaceKey]; + response.data = data; + + if (typeof incompleteResults !== "undefined") { + response.data.incomplete_results = incompleteResults; + } + + if (typeof repositorySelection !== "undefined") { + response.data.repository_selection = repositorySelection; + } + + response.data.total_count = totalCount; + return response; +} + +function iterator(octokit, route, parameters) { + const options = typeof route === "function" ? route.endpoint(parameters) : octokit.request.endpoint(route, parameters); + const requestMethod = typeof route === "function" ? route : octokit.request; + const method = options.method; + const headers = options.headers; + let url = options.url; + return { + [Symbol.asyncIterator]: () => ({ + async next() { + if (!url) return { + done: true + }; + + try { + const response = await requestMethod({ + method, + url, + headers + }); + const normalizedResponse = normalizePaginatedListResponse(response); // `response.headers.link` format: + // '; rel="next", ; rel="last"' + // sets `url` to undefined if "next" URL is not present or `link` header is not set + + url = ((normalizedResponse.headers.link || "").match(/<([^>]+)>;\s*rel="next"/) || [])[1]; + return { + value: normalizedResponse + }; + } catch (error) { + if (error.status !== 409) throw error; + url = ""; + return { + value: { + status: 200, + headers: {}, + data: [] + } + }; + } + } + + }) + }; +} + +function paginate(octokit, route, parameters, mapFn) { + if (typeof parameters === "function") { + mapFn = parameters; + parameters = undefined; + } + + return gather(octokit, [], iterator(octokit, route, parameters)[Symbol.asyncIterator](), mapFn); +} + +function gather(octokit, results, iterator, mapFn) { + return iterator.next().then(result => { + if (result.done) { + return results; + } + + let earlyExit = false; + + function done() { + earlyExit = true; + } + + results = results.concat(mapFn ? mapFn(result.value, done) : result.value.data); + + if (earlyExit) { + return results; + } + + return gather(octokit, results, iterator, mapFn); + }); +} + +const composePaginateRest = Object.assign(paginate, { + iterator +}); + +const paginatingEndpoints = ["GET /app/hook/deliveries", "GET /app/installations", "GET /applications/grants", "GET /authorizations", "GET /enterprises/{enterprise}/actions/permissions/organizations", "GET /enterprises/{enterprise}/actions/runner-groups", "GET /enterprises/{enterprise}/actions/runner-groups/{runner_group_id}/organizations", "GET /enterprises/{enterprise}/actions/runner-groups/{runner_group_id}/runners", "GET /enterprises/{enterprise}/actions/runners", "GET /enterprises/{enterprise}/audit-log", "GET /enterprises/{enterprise}/secret-scanning/alerts", "GET /enterprises/{enterprise}/settings/billing/advanced-security", "GET /events", "GET /gists", "GET /gists/public", "GET /gists/starred", "GET /gists/{gist_id}/comments", "GET /gists/{gist_id}/commits", "GET /gists/{gist_id}/forks", "GET /installation/repositories", "GET /issues", "GET /licenses", "GET /marketplace_listing/plans", "GET /marketplace_listing/plans/{plan_id}/accounts", "GET /marketplace_listing/stubbed/plans", "GET /marketplace_listing/stubbed/plans/{plan_id}/accounts", "GET /networks/{owner}/{repo}/events", "GET /notifications", "GET /organizations", "GET /orgs/{org}/actions/cache/usage-by-repository", "GET /orgs/{org}/actions/permissions/repositories", "GET /orgs/{org}/actions/runner-groups", "GET /orgs/{org}/actions/runner-groups/{runner_group_id}/repositories", "GET /orgs/{org}/actions/runner-groups/{runner_group_id}/runners", "GET /orgs/{org}/actions/runners", "GET /orgs/{org}/actions/secrets", "GET /orgs/{org}/actions/secrets/{secret_name}/repositories", "GET /orgs/{org}/audit-log", "GET /orgs/{org}/blocks", "GET /orgs/{org}/code-scanning/alerts", "GET /orgs/{org}/codespaces", "GET /orgs/{org}/credential-authorizations", "GET /orgs/{org}/dependabot/secrets", "GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories", "GET /orgs/{org}/events", "GET /orgs/{org}/external-groups", "GET /orgs/{org}/failed_invitations", "GET /orgs/{org}/hooks", "GET /orgs/{org}/hooks/{hook_id}/deliveries", "GET /orgs/{org}/installations", "GET /orgs/{org}/invitations", "GET /orgs/{org}/invitations/{invitation_id}/teams", "GET /orgs/{org}/issues", "GET /orgs/{org}/members", "GET /orgs/{org}/migrations", "GET /orgs/{org}/migrations/{migration_id}/repositories", "GET /orgs/{org}/outside_collaborators", "GET /orgs/{org}/packages", "GET /orgs/{org}/packages/{package_type}/{package_name}/versions", "GET /orgs/{org}/projects", "GET /orgs/{org}/public_members", "GET /orgs/{org}/repos", "GET /orgs/{org}/secret-scanning/alerts", "GET /orgs/{org}/settings/billing/advanced-security", "GET /orgs/{org}/team-sync/groups", "GET /orgs/{org}/teams", "GET /orgs/{org}/teams/{team_slug}/discussions", "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments", "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions", "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions", "GET /orgs/{org}/teams/{team_slug}/invitations", "GET /orgs/{org}/teams/{team_slug}/members", "GET /orgs/{org}/teams/{team_slug}/projects", "GET /orgs/{org}/teams/{team_slug}/repos", "GET /orgs/{org}/teams/{team_slug}/teams", "GET /projects/columns/{column_id}/cards", "GET /projects/{project_id}/collaborators", "GET /projects/{project_id}/columns", "GET /repos/{owner}/{repo}/actions/artifacts", "GET /repos/{owner}/{repo}/actions/caches", "GET /repos/{owner}/{repo}/actions/runners", "GET /repos/{owner}/{repo}/actions/runs", "GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts", "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs", "GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs", "GET /repos/{owner}/{repo}/actions/secrets", "GET /repos/{owner}/{repo}/actions/workflows", "GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs", "GET /repos/{owner}/{repo}/assignees", "GET /repos/{owner}/{repo}/branches", "GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations", "GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs", "GET /repos/{owner}/{repo}/code-scanning/alerts", "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances", "GET /repos/{owner}/{repo}/code-scanning/analyses", "GET /repos/{owner}/{repo}/codespaces", "GET /repos/{owner}/{repo}/codespaces/devcontainers", "GET /repos/{owner}/{repo}/codespaces/secrets", "GET /repos/{owner}/{repo}/collaborators", "GET /repos/{owner}/{repo}/comments", "GET /repos/{owner}/{repo}/comments/{comment_id}/reactions", "GET /repos/{owner}/{repo}/commits", "GET /repos/{owner}/{repo}/commits/{commit_sha}/comments", "GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls", "GET /repos/{owner}/{repo}/commits/{ref}/check-runs", "GET /repos/{owner}/{repo}/commits/{ref}/check-suites", "GET /repos/{owner}/{repo}/commits/{ref}/status", "GET /repos/{owner}/{repo}/commits/{ref}/statuses", "GET /repos/{owner}/{repo}/contributors", "GET /repos/{owner}/{repo}/dependabot/secrets", "GET /repos/{owner}/{repo}/deployments", "GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses", "GET /repos/{owner}/{repo}/environments", "GET /repos/{owner}/{repo}/events", "GET /repos/{owner}/{repo}/forks", "GET /repos/{owner}/{repo}/git/matching-refs/{ref}", "GET /repos/{owner}/{repo}/hooks", "GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries", "GET /repos/{owner}/{repo}/invitations", "GET /repos/{owner}/{repo}/issues", "GET /repos/{owner}/{repo}/issues/comments", "GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions", "GET /repos/{owner}/{repo}/issues/events", "GET /repos/{owner}/{repo}/issues/{issue_number}/comments", "GET /repos/{owner}/{repo}/issues/{issue_number}/events", "GET /repos/{owner}/{repo}/issues/{issue_number}/labels", "GET /repos/{owner}/{repo}/issues/{issue_number}/reactions", "GET /repos/{owner}/{repo}/issues/{issue_number}/timeline", "GET /repos/{owner}/{repo}/keys", "GET /repos/{owner}/{repo}/labels", "GET /repos/{owner}/{repo}/milestones", "GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels", "GET /repos/{owner}/{repo}/notifications", "GET /repos/{owner}/{repo}/pages/builds", "GET /repos/{owner}/{repo}/projects", "GET /repos/{owner}/{repo}/pulls", "GET /repos/{owner}/{repo}/pulls/comments", "GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions", "GET /repos/{owner}/{repo}/pulls/{pull_number}/comments", "GET /repos/{owner}/{repo}/pulls/{pull_number}/commits", "GET /repos/{owner}/{repo}/pulls/{pull_number}/files", "GET /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers", "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews", "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments", "GET /repos/{owner}/{repo}/releases", "GET /repos/{owner}/{repo}/releases/{release_id}/assets", "GET /repos/{owner}/{repo}/releases/{release_id}/reactions", "GET /repos/{owner}/{repo}/secret-scanning/alerts", "GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations", "GET /repos/{owner}/{repo}/stargazers", "GET /repos/{owner}/{repo}/subscribers", "GET /repos/{owner}/{repo}/tags", "GET /repos/{owner}/{repo}/teams", "GET /repos/{owner}/{repo}/topics", "GET /repositories", "GET /repositories/{repository_id}/environments/{environment_name}/secrets", "GET /search/code", "GET /search/commits", "GET /search/issues", "GET /search/labels", "GET /search/repositories", "GET /search/topics", "GET /search/users", "GET /teams/{team_id}/discussions", "GET /teams/{team_id}/discussions/{discussion_number}/comments", "GET /teams/{team_id}/discussions/{discussion_number}/comments/{comment_number}/reactions", "GET /teams/{team_id}/discussions/{discussion_number}/reactions", "GET /teams/{team_id}/invitations", "GET /teams/{team_id}/members", "GET /teams/{team_id}/projects", "GET /teams/{team_id}/repos", "GET /teams/{team_id}/teams", "GET /user/blocks", "GET /user/codespaces", "GET /user/codespaces/secrets", "GET /user/emails", "GET /user/followers", "GET /user/following", "GET /user/gpg_keys", "GET /user/installations", "GET /user/installations/{installation_id}/repositories", "GET /user/issues", "GET /user/keys", "GET /user/marketplace_purchases", "GET /user/marketplace_purchases/stubbed", "GET /user/memberships/orgs", "GET /user/migrations", "GET /user/migrations/{migration_id}/repositories", "GET /user/orgs", "GET /user/packages", "GET /user/packages/{package_type}/{package_name}/versions", "GET /user/public_emails", "GET /user/repos", "GET /user/repository_invitations", "GET /user/starred", "GET /user/subscriptions", "GET /user/teams", "GET /users", "GET /users/{username}/events", "GET /users/{username}/events/orgs/{org}", "GET /users/{username}/events/public", "GET /users/{username}/followers", "GET /users/{username}/following", "GET /users/{username}/gists", "GET /users/{username}/gpg_keys", "GET /users/{username}/keys", "GET /users/{username}/orgs", "GET /users/{username}/packages", "GET /users/{username}/projects", "GET /users/{username}/received_events", "GET /users/{username}/received_events/public", "GET /users/{username}/repos", "GET /users/{username}/starred", "GET /users/{username}/subscriptions"]; + +function isPaginatingEndpoint(arg) { + if (typeof arg === "string") { + return paginatingEndpoints.includes(arg); + } else { + return false; + } +} + +/** + * @param octokit Octokit instance + * @param options Options passed to Octokit constructor + */ + +function paginateRest(octokit) { + return { + paginate: Object.assign(paginate.bind(null, octokit), { + iterator: iterator.bind(null, octokit) + }) + }; +} +paginateRest.VERSION = VERSION; + +exports.composePaginateRest = composePaginateRest; +exports.isPaginatingEndpoint = isPaginatingEndpoint; +exports.paginateRest = paginateRest; +exports.paginatingEndpoints = paginatingEndpoints; +//# sourceMappingURL=index.js.map + + +/***/ }), + +/***/ 7471: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ value: true })); + +function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } + +var deprecation = __nccwpck_require__(8932); +var once = _interopDefault(__nccwpck_require__(1223)); + +const logOnceCode = once(deprecation => console.warn(deprecation)); +const logOnceHeaders = once(deprecation => console.warn(deprecation)); +/** + * Error with extra properties to help with debugging + */ + +class RequestError extends Error { + constructor(message, statusCode, options) { + super(message); // Maintains proper stack trace (only available on V8) + + /* istanbul ignore next */ + + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = "HttpError"; + this.status = statusCode; + let headers; + + if ("headers" in options && typeof options.headers !== "undefined") { + headers = options.headers; + } + + if ("response" in options) { + this.response = options.response; + headers = options.response.headers; + } // redact request credentials without mutating original request options + + + const requestCopy = Object.assign({}, options.request); + + if (options.request.headers.authorization) { + requestCopy.headers = Object.assign({}, options.request.headers, { + authorization: options.request.headers.authorization.replace(/ .*$/, " [REDACTED]") + }); + } + + requestCopy.url = requestCopy.url // client_id & client_secret can be passed as URL query parameters to increase rate limit + // see https://developer.github.com/v3/#increasing-the-unauthenticated-rate-limit-for-oauth-applications + .replace(/\bclient_secret=\w+/g, "client_secret=[REDACTED]") // OAuth tokens can be passed as URL query parameters, although it is not recommended + // see https://developer.github.com/v3/#oauth2-token-sent-in-a-header + .replace(/\baccess_token=\w+/g, "access_token=[REDACTED]"); + this.request = requestCopy; // deprecations + + Object.defineProperty(this, "code", { + get() { + logOnceCode(new deprecation.Deprecation("[@octokit/request-error] `error.code` is deprecated, use `error.status`.")); + return statusCode; + } + + }); + Object.defineProperty(this, "headers", { + get() { + logOnceHeaders(new deprecation.Deprecation("[@octokit/request-error] `error.headers` is deprecated, use `error.response.headers`.")); + return headers || {}; + } + + }); + } + +} + +exports.RequestError = RequestError; +//# sourceMappingURL=index.js.map + + +/***/ }), + +/***/ 9353: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ value: true })); + +function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } + +var endpoint = __nccwpck_require__(8713); +var universalUserAgent = __nccwpck_require__(5030); +var isPlainObject = __nccwpck_require__(3287); +var nodeFetch = _interopDefault(__nccwpck_require__(467)); +var requestError = __nccwpck_require__(7471); + +const VERSION = "5.6.3"; + +function getBufferResponse(response) { + return response.arrayBuffer(); +} + +function fetchWrapper(requestOptions) { + const log = requestOptions.request && requestOptions.request.log ? requestOptions.request.log : console; + + if (isPlainObject.isPlainObject(requestOptions.body) || Array.isArray(requestOptions.body)) { + requestOptions.body = JSON.stringify(requestOptions.body); + } + + let headers = {}; + let status; + let url; + const fetch = requestOptions.request && requestOptions.request.fetch || nodeFetch; + return fetch(requestOptions.url, Object.assign({ + method: requestOptions.method, + body: requestOptions.body, + headers: requestOptions.headers, + redirect: requestOptions.redirect + }, // `requestOptions.request.agent` type is incompatible + // see https://github.com/octokit/types.ts/pull/264 + requestOptions.request)).then(async response => { + url = response.url; + status = response.status; + + for (const keyAndValue of response.headers) { + headers[keyAndValue[0]] = keyAndValue[1]; + } + + if ("deprecation" in headers) { + const matches = headers.link && headers.link.match(/<([^>]+)>; rel="deprecation"/); + const deprecationLink = matches && matches.pop(); + log.warn(`[@octokit/request] "${requestOptions.method} ${requestOptions.url}" is deprecated. It is scheduled to be removed on ${headers.sunset}${deprecationLink ? `. See ${deprecationLink}` : ""}`); + } + + if (status === 204 || status === 205) { + return; + } // GitHub API returns 200 for HEAD requests + + + if (requestOptions.method === "HEAD") { + if (status < 400) { + return; + } + + throw new requestError.RequestError(response.statusText, status, { + response: { + url, + status, + headers, + data: undefined + }, + request: requestOptions + }); + } + + if (status === 304) { + throw new requestError.RequestError("Not modified", status, { + response: { + url, + status, + headers, + data: await getResponseData(response) + }, + request: requestOptions + }); + } + + if (status >= 400) { + const data = await getResponseData(response); + const error = new requestError.RequestError(toErrorMessage(data), status, { + response: { + url, + status, + headers, + data + }, + request: requestOptions + }); + throw error; + } + + return getResponseData(response); + }).then(data => { + return { + status, + url, + headers, + data + }; + }).catch(error => { + if (error instanceof requestError.RequestError) throw error; + throw new requestError.RequestError(error.message, 500, { + request: requestOptions + }); + }); +} + +async function getResponseData(response) { + const contentType = response.headers.get("content-type"); + + if (/application\/json/.test(contentType)) { + return response.json(); + } + + if (!contentType || /^text\/|charset=utf-8$/.test(contentType)) { + return response.text(); + } + + return getBufferResponse(response); +} + +function toErrorMessage(data) { + if (typeof data === "string") return data; // istanbul ignore else - just in case + + if ("message" in data) { + if (Array.isArray(data.errors)) { + return `${data.message}: ${data.errors.map(JSON.stringify).join(", ")}`; + } + + return data.message; + } // istanbul ignore next - just in case + + + return `Unknown error: ${JSON.stringify(data)}`; +} + +function withDefaults(oldEndpoint, newDefaults) { + const endpoint = oldEndpoint.defaults(newDefaults); + + const newApi = function (route, parameters) { + const endpointOptions = endpoint.merge(route, parameters); + + if (!endpointOptions.request || !endpointOptions.request.hook) { + return fetchWrapper(endpoint.parse(endpointOptions)); + } + + const request = (route, parameters) => { + return fetchWrapper(endpoint.parse(endpoint.merge(route, parameters))); + }; + + Object.assign(request, { + endpoint, + defaults: withDefaults.bind(null, endpoint) + }); + return endpointOptions.request.hook(request, endpointOptions); + }; + + return Object.assign(newApi, { + endpoint, + defaults: withDefaults.bind(null, endpoint) + }); +} + +const request = withDefaults(endpoint.endpoint, { + headers: { + "user-agent": `octokit-request.js/${VERSION} ${universalUserAgent.getUserAgent()}` + } +}); + +exports.request = request; +//# sourceMappingURL=index.js.map + + +/***/ }), + +/***/ 5526: +/***/ (function(__unused_webpack_module, exports) { + +"use strict"; + +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.PersonalAccessTokenCredentialHandler = exports.BearerCredentialHandler = exports.BasicCredentialHandler = void 0; +class BasicCredentialHandler { + constructor(username, password) { + this.username = username; + this.password = password; + } + prepareRequest(options) { + if (!options.headers) { + throw Error('The request has no headers'); + } + options.headers['Authorization'] = `Basic ${Buffer.from(`${this.username}:${this.password}`).toString('base64')}`; + } + // This handler cannot handle 401 + canHandleAuthentication() { + return false; + } + handleAuthentication() { + return __awaiter(this, void 0, void 0, function* () { + throw new Error('not implemented'); + }); + } +} +exports.BasicCredentialHandler = BasicCredentialHandler; +class BearerCredentialHandler { + constructor(token) { + this.token = token; + } + // currently implements pre-authorization + // TODO: support preAuth = false where it hooks on 401 + prepareRequest(options) { + if (!options.headers) { + throw Error('The request has no headers'); + } + options.headers['Authorization'] = `Bearer ${this.token}`; + } + // This handler cannot handle 401 + canHandleAuthentication() { + return false; + } + handleAuthentication() { + return __awaiter(this, void 0, void 0, function* () { + throw new Error('not implemented'); + }); + } +} +exports.BearerCredentialHandler = BearerCredentialHandler; +class PersonalAccessTokenCredentialHandler { + constructor(token) { + this.token = token; + } + // currently implements pre-authorization + // TODO: support preAuth = false where it hooks on 401 + prepareRequest(options) { + if (!options.headers) { + throw Error('The request has no headers'); + } + options.headers['Authorization'] = `Basic ${Buffer.from(`PAT:${this.token}`).toString('base64')}`; + } + // This handler cannot handle 401 + canHandleAuthentication() { + return false; + } + handleAuthentication() { + return __awaiter(this, void 0, void 0, function* () { + throw new Error('not implemented'); + }); + } +} +exports.PersonalAccessTokenCredentialHandler = PersonalAccessTokenCredentialHandler; +//# sourceMappingURL=auth.js.map + +/***/ }), + +/***/ 6255: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +/* eslint-disable @typescript-eslint/no-explicit-any */ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.HttpClient = exports.isHttps = exports.HttpClientResponse = exports.HttpClientError = exports.getProxyUrl = exports.MediaTypes = exports.Headers = exports.HttpCodes = void 0; +const http = __importStar(__nccwpck_require__(3685)); +const https = __importStar(__nccwpck_require__(5687)); +const pm = __importStar(__nccwpck_require__(9835)); +const tunnel = __importStar(__nccwpck_require__(4294)); +var HttpCodes; +(function (HttpCodes) { + HttpCodes[HttpCodes["OK"] = 200] = "OK"; + HttpCodes[HttpCodes["MultipleChoices"] = 300] = "MultipleChoices"; + HttpCodes[HttpCodes["MovedPermanently"] = 301] = "MovedPermanently"; + HttpCodes[HttpCodes["ResourceMoved"] = 302] = "ResourceMoved"; + HttpCodes[HttpCodes["SeeOther"] = 303] = "SeeOther"; + HttpCodes[HttpCodes["NotModified"] = 304] = "NotModified"; + HttpCodes[HttpCodes["UseProxy"] = 305] = "UseProxy"; + HttpCodes[HttpCodes["SwitchProxy"] = 306] = "SwitchProxy"; + HttpCodes[HttpCodes["TemporaryRedirect"] = 307] = "TemporaryRedirect"; + HttpCodes[HttpCodes["PermanentRedirect"] = 308] = "PermanentRedirect"; + HttpCodes[HttpCodes["BadRequest"] = 400] = "BadRequest"; + HttpCodes[HttpCodes["Unauthorized"] = 401] = "Unauthorized"; + HttpCodes[HttpCodes["PaymentRequired"] = 402] = "PaymentRequired"; + HttpCodes[HttpCodes["Forbidden"] = 403] = "Forbidden"; + HttpCodes[HttpCodes["NotFound"] = 404] = "NotFound"; + HttpCodes[HttpCodes["MethodNotAllowed"] = 405] = "MethodNotAllowed"; + HttpCodes[HttpCodes["NotAcceptable"] = 406] = "NotAcceptable"; + HttpCodes[HttpCodes["ProxyAuthenticationRequired"] = 407] = "ProxyAuthenticationRequired"; + HttpCodes[HttpCodes["RequestTimeout"] = 408] = "RequestTimeout"; + HttpCodes[HttpCodes["Conflict"] = 409] = "Conflict"; + HttpCodes[HttpCodes["Gone"] = 410] = "Gone"; + HttpCodes[HttpCodes["TooManyRequests"] = 429] = "TooManyRequests"; + HttpCodes[HttpCodes["InternalServerError"] = 500] = "InternalServerError"; + HttpCodes[HttpCodes["NotImplemented"] = 501] = "NotImplemented"; + HttpCodes[HttpCodes["BadGateway"] = 502] = "BadGateway"; + HttpCodes[HttpCodes["ServiceUnavailable"] = 503] = "ServiceUnavailable"; + HttpCodes[HttpCodes["GatewayTimeout"] = 504] = "GatewayTimeout"; +})(HttpCodes = exports.HttpCodes || (exports.HttpCodes = {})); +var Headers; +(function (Headers) { + Headers["Accept"] = "accept"; + Headers["ContentType"] = "content-type"; +})(Headers = exports.Headers || (exports.Headers = {})); +var MediaTypes; +(function (MediaTypes) { + MediaTypes["ApplicationJson"] = "application/json"; +})(MediaTypes = exports.MediaTypes || (exports.MediaTypes = {})); +/** + * Returns the proxy URL, depending upon the supplied url and proxy environment variables. + * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com + */ +function getProxyUrl(serverUrl) { + const proxyUrl = pm.getProxyUrl(new URL(serverUrl)); + return proxyUrl ? proxyUrl.href : ''; +} +exports.getProxyUrl = getProxyUrl; +const HttpRedirectCodes = [ + HttpCodes.MovedPermanently, + HttpCodes.ResourceMoved, + HttpCodes.SeeOther, + HttpCodes.TemporaryRedirect, + HttpCodes.PermanentRedirect +]; +const HttpResponseRetryCodes = [ + HttpCodes.BadGateway, + HttpCodes.ServiceUnavailable, + HttpCodes.GatewayTimeout +]; +const RetryableHttpVerbs = ['OPTIONS', 'GET', 'DELETE', 'HEAD']; +const ExponentialBackoffCeiling = 10; +const ExponentialBackoffTimeSlice = 5; +class HttpClientError extends Error { + constructor(message, statusCode) { + super(message); + this.name = 'HttpClientError'; + this.statusCode = statusCode; + Object.setPrototypeOf(this, HttpClientError.prototype); + } +} +exports.HttpClientError = HttpClientError; +class HttpClientResponse { + constructor(message) { + this.message = message; + } + readBody() { + return __awaiter(this, void 0, void 0, function* () { + return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () { + let output = Buffer.alloc(0); + this.message.on('data', (chunk) => { + output = Buffer.concat([output, chunk]); + }); + this.message.on('end', () => { + resolve(output.toString()); + }); + })); + }); + } +} +exports.HttpClientResponse = HttpClientResponse; +function isHttps(requestUrl) { + const parsedUrl = new URL(requestUrl); + return parsedUrl.protocol === 'https:'; +} +exports.isHttps = isHttps; +class HttpClient { + constructor(userAgent, handlers, requestOptions) { + this._ignoreSslError = false; + this._allowRedirects = true; + this._allowRedirectDowngrade = false; + this._maxRedirects = 50; + this._allowRetries = false; + this._maxRetries = 1; + this._keepAlive = false; + this._disposed = false; + this.userAgent = userAgent; + this.handlers = handlers || []; + this.requestOptions = requestOptions; + if (requestOptions) { + if (requestOptions.ignoreSslError != null) { + this._ignoreSslError = requestOptions.ignoreSslError; + } + this._socketTimeout = requestOptions.socketTimeout; + if (requestOptions.allowRedirects != null) { + this._allowRedirects = requestOptions.allowRedirects; + } + if (requestOptions.allowRedirectDowngrade != null) { + this._allowRedirectDowngrade = requestOptions.allowRedirectDowngrade; + } + if (requestOptions.maxRedirects != null) { + this._maxRedirects = Math.max(requestOptions.maxRedirects, 0); + } + if (requestOptions.keepAlive != null) { + this._keepAlive = requestOptions.keepAlive; + } + if (requestOptions.allowRetries != null) { + this._allowRetries = requestOptions.allowRetries; + } + if (requestOptions.maxRetries != null) { + this._maxRetries = requestOptions.maxRetries; + } + } + } + options(requestUrl, additionalHeaders) { + return __awaiter(this, void 0, void 0, function* () { + return this.request('OPTIONS', requestUrl, null, additionalHeaders || {}); + }); + } + get(requestUrl, additionalHeaders) { + return __awaiter(this, void 0, void 0, function* () { + return this.request('GET', requestUrl, null, additionalHeaders || {}); + }); + } + del(requestUrl, additionalHeaders) { + return __awaiter(this, void 0, void 0, function* () { + return this.request('DELETE', requestUrl, null, additionalHeaders || {}); + }); + } + post(requestUrl, data, additionalHeaders) { + return __awaiter(this, void 0, void 0, function* () { + return this.request('POST', requestUrl, data, additionalHeaders || {}); + }); + } + patch(requestUrl, data, additionalHeaders) { + return __awaiter(this, void 0, void 0, function* () { + return this.request('PATCH', requestUrl, data, additionalHeaders || {}); + }); + } + put(requestUrl, data, additionalHeaders) { + return __awaiter(this, void 0, void 0, function* () { + return this.request('PUT', requestUrl, data, additionalHeaders || {}); + }); + } + head(requestUrl, additionalHeaders) { + return __awaiter(this, void 0, void 0, function* () { + return this.request('HEAD', requestUrl, null, additionalHeaders || {}); + }); + } + sendStream(verb, requestUrl, stream, additionalHeaders) { + return __awaiter(this, void 0, void 0, function* () { + return this.request(verb, requestUrl, stream, additionalHeaders); + }); + } + /** + * Gets a typed object from an endpoint + * Be aware that not found returns a null. Other errors (4xx, 5xx) reject the promise + */ + getJson(requestUrl, additionalHeaders = {}) { + return __awaiter(this, void 0, void 0, function* () { + additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); + const res = yield this.get(requestUrl, additionalHeaders); + return this._processResponse(res, this.requestOptions); + }); + } + postJson(requestUrl, obj, additionalHeaders = {}) { + return __awaiter(this, void 0, void 0, function* () { + const data = JSON.stringify(obj, null, 2); + additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); + additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); + const res = yield this.post(requestUrl, data, additionalHeaders); + return this._processResponse(res, this.requestOptions); + }); + } + putJson(requestUrl, obj, additionalHeaders = {}) { + return __awaiter(this, void 0, void 0, function* () { + const data = JSON.stringify(obj, null, 2); + additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); + additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); + const res = yield this.put(requestUrl, data, additionalHeaders); + return this._processResponse(res, this.requestOptions); + }); + } + patchJson(requestUrl, obj, additionalHeaders = {}) { + return __awaiter(this, void 0, void 0, function* () { + const data = JSON.stringify(obj, null, 2); + additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); + additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); + const res = yield this.patch(requestUrl, data, additionalHeaders); + return this._processResponse(res, this.requestOptions); + }); + } + /** + * Makes a raw http request. + * All other methods such as get, post, patch, and request ultimately call this. + * Prefer get, del, post and patch + */ + request(verb, requestUrl, data, headers) { + return __awaiter(this, void 0, void 0, function* () { + if (this._disposed) { + throw new Error('Client has already been disposed.'); + } + const parsedUrl = new URL(requestUrl); + let info = this._prepareRequest(verb, parsedUrl, headers); + // Only perform retries on reads since writes may not be idempotent. + const maxTries = this._allowRetries && RetryableHttpVerbs.includes(verb) + ? this._maxRetries + 1 + : 1; + let numTries = 0; + let response; + do { + response = yield this.requestRaw(info, data); + // Check if it's an authentication challenge + if (response && + response.message && + response.message.statusCode === HttpCodes.Unauthorized) { + let authenticationHandler; + for (const handler of this.handlers) { + if (handler.canHandleAuthentication(response)) { + authenticationHandler = handler; + break; + } + } + if (authenticationHandler) { + return authenticationHandler.handleAuthentication(this, info, data); + } + else { + // We have received an unauthorized response but have no handlers to handle it. + // Let the response return to the caller. + return response; + } + } + let redirectsRemaining = this._maxRedirects; + while (response.message.statusCode && + HttpRedirectCodes.includes(response.message.statusCode) && + this._allowRedirects && + redirectsRemaining > 0) { + const redirectUrl = response.message.headers['location']; + if (!redirectUrl) { + // if there's no location to redirect to, we won't + break; + } + const parsedRedirectUrl = new URL(redirectUrl); + if (parsedUrl.protocol === 'https:' && + parsedUrl.protocol !== parsedRedirectUrl.protocol && + !this._allowRedirectDowngrade) { + throw new Error('Redirect from HTTPS to HTTP protocol. This downgrade is not allowed for security reasons. If you want to allow this behavior, set the allowRedirectDowngrade option to true.'); + } + // we need to finish reading the response before reassigning response + // which will leak the open socket. + yield response.readBody(); + // strip authorization header if redirected to a different hostname + if (parsedRedirectUrl.hostname !== parsedUrl.hostname) { + for (const header in headers) { + // header names are case insensitive + if (header.toLowerCase() === 'authorization') { + delete headers[header]; + } + } + } + // let's make the request with the new redirectUrl + info = this._prepareRequest(verb, parsedRedirectUrl, headers); + response = yield this.requestRaw(info, data); + redirectsRemaining--; + } + if (!response.message.statusCode || + !HttpResponseRetryCodes.includes(response.message.statusCode)) { + // If not a retry code, return immediately instead of retrying + return response; + } + numTries += 1; + if (numTries < maxTries) { + yield response.readBody(); + yield this._performExponentialBackoff(numTries); + } + } while (numTries < maxTries); + return response; + }); + } + /** + * Needs to be called if keepAlive is set to true in request options. + */ + dispose() { + if (this._agent) { + this._agent.destroy(); + } + this._disposed = true; + } + /** + * Raw request. + * @param info + * @param data + */ + requestRaw(info, data) { + return __awaiter(this, void 0, void 0, function* () { + return new Promise((resolve, reject) => { + function callbackForResult(err, res) { + if (err) { + reject(err); + } + else if (!res) { + // If `err` is not passed, then `res` must be passed. + reject(new Error('Unknown error')); + } + else { + resolve(res); + } + } + this.requestRawWithCallback(info, data, callbackForResult); + }); + }); + } + /** + * Raw request with callback. + * @param info + * @param data + * @param onResult + */ + requestRawWithCallback(info, data, onResult) { + if (typeof data === 'string') { + if (!info.options.headers) { + info.options.headers = {}; + } + info.options.headers['Content-Length'] = Buffer.byteLength(data, 'utf8'); + } + let callbackCalled = false; + function handleResult(err, res) { + if (!callbackCalled) { + callbackCalled = true; + onResult(err, res); + } + } + const req = info.httpModule.request(info.options, (msg) => { + const res = new HttpClientResponse(msg); + handleResult(undefined, res); + }); + let socket; + req.on('socket', sock => { + socket = sock; + }); + // If we ever get disconnected, we want the socket to timeout eventually + req.setTimeout(this._socketTimeout || 3 * 60000, () => { + if (socket) { + socket.end(); + } + handleResult(new Error(`Request timeout: ${info.options.path}`)); + }); + req.on('error', function (err) { + // err has statusCode property + // res should have headers + handleResult(err); + }); + if (data && typeof data === 'string') { + req.write(data, 'utf8'); + } + if (data && typeof data !== 'string') { + data.on('close', function () { + req.end(); + }); + data.pipe(req); + } + else { + req.end(); + } + } + /** + * Gets an http agent. This function is useful when you need an http agent that handles + * routing through a proxy server - depending upon the url and proxy environment variables. + * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com + */ + getAgent(serverUrl) { + const parsedUrl = new URL(serverUrl); + return this._getAgent(parsedUrl); + } + _prepareRequest(method, requestUrl, headers) { + const info = {}; + info.parsedUrl = requestUrl; + const usingSsl = info.parsedUrl.protocol === 'https:'; + info.httpModule = usingSsl ? https : http; + const defaultPort = usingSsl ? 443 : 80; + info.options = {}; + info.options.host = info.parsedUrl.hostname; + info.options.port = info.parsedUrl.port + ? parseInt(info.parsedUrl.port) + : defaultPort; + info.options.path = + (info.parsedUrl.pathname || '') + (info.parsedUrl.search || ''); + info.options.method = method; + info.options.headers = this._mergeHeaders(headers); + if (this.userAgent != null) { + info.options.headers['user-agent'] = this.userAgent; + } + info.options.agent = this._getAgent(info.parsedUrl); + // gives handlers an opportunity to participate + if (this.handlers) { + for (const handler of this.handlers) { + handler.prepareRequest(info.options); + } + } + return info; + } + _mergeHeaders(headers) { + if (this.requestOptions && this.requestOptions.headers) { + return Object.assign({}, lowercaseKeys(this.requestOptions.headers), lowercaseKeys(headers || {})); + } + return lowercaseKeys(headers || {}); + } + _getExistingOrDefaultHeader(additionalHeaders, header, _default) { + let clientHeader; + if (this.requestOptions && this.requestOptions.headers) { + clientHeader = lowercaseKeys(this.requestOptions.headers)[header]; + } + return additionalHeaders[header] || clientHeader || _default; + } + _getAgent(parsedUrl) { + let agent; + const proxyUrl = pm.getProxyUrl(parsedUrl); + const useProxy = proxyUrl && proxyUrl.hostname; + if (this._keepAlive && useProxy) { + agent = this._proxyAgent; + } + if (this._keepAlive && !useProxy) { + agent = this._agent; + } + // if agent is already assigned use that agent. + if (agent) { + return agent; + } + const usingSsl = parsedUrl.protocol === 'https:'; + let maxSockets = 100; + if (this.requestOptions) { + maxSockets = this.requestOptions.maxSockets || http.globalAgent.maxSockets; + } + // This is `useProxy` again, but we need to check `proxyURl` directly for TypeScripts's flow analysis. + if (proxyUrl && proxyUrl.hostname) { + const agentOptions = { + maxSockets, + keepAlive: this._keepAlive, + proxy: Object.assign(Object.assign({}, ((proxyUrl.username || proxyUrl.password) && { + proxyAuth: `${proxyUrl.username}:${proxyUrl.password}` + })), { host: proxyUrl.hostname, port: proxyUrl.port }) + }; + let tunnelAgent; + const overHttps = proxyUrl.protocol === 'https:'; + if (usingSsl) { + tunnelAgent = overHttps ? tunnel.httpsOverHttps : tunnel.httpsOverHttp; + } + else { + tunnelAgent = overHttps ? tunnel.httpOverHttps : tunnel.httpOverHttp; + } + agent = tunnelAgent(agentOptions); + this._proxyAgent = agent; + } + // if reusing agent across request and tunneling agent isn't assigned create a new agent + if (this._keepAlive && !agent) { + const options = { keepAlive: this._keepAlive, maxSockets }; + agent = usingSsl ? new https.Agent(options) : new http.Agent(options); + this._agent = agent; + } + // if not using private agent and tunnel agent isn't setup then use global agent + if (!agent) { + agent = usingSsl ? https.globalAgent : http.globalAgent; + } + if (usingSsl && this._ignoreSslError) { + // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process + // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options + // we have to cast it to any and change it directly + agent.options = Object.assign(agent.options || {}, { + rejectUnauthorized: false + }); + } + return agent; + } + _performExponentialBackoff(retryNumber) { + return __awaiter(this, void 0, void 0, function* () { + retryNumber = Math.min(ExponentialBackoffCeiling, retryNumber); + const ms = ExponentialBackoffTimeSlice * Math.pow(2, retryNumber); + return new Promise(resolve => setTimeout(() => resolve(), ms)); + }); + } + _processResponse(res, options) { + return __awaiter(this, void 0, void 0, function* () { + return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () { + const statusCode = res.message.statusCode || 0; + const response = { + statusCode, + result: null, + headers: {} + }; + // not found leads to null obj returned + if (statusCode === HttpCodes.NotFound) { + resolve(response); + } + // get the result from the body + function dateTimeDeserializer(key, value) { + if (typeof value === 'string') { + const a = new Date(value); + if (!isNaN(a.valueOf())) { + return a; + } + } + return value; + } + let obj; + let contents; + try { + contents = yield res.readBody(); + if (contents && contents.length > 0) { + if (options && options.deserializeDates) { + obj = JSON.parse(contents, dateTimeDeserializer); + } + else { + obj = JSON.parse(contents); + } + response.result = obj; + } + response.headers = res.message.headers; + } + catch (err) { + // Invalid resource (contents not json); leaving result obj null + } + // note that 3xx redirects are handled by the http layer. + if (statusCode > 299) { + let msg; + // if exception/error in body, attempt to get better error + if (obj && obj.message) { + msg = obj.message; + } + else if (contents && contents.length > 0) { + // it may be the case that the exception is in the body message as string + msg = contents; + } + else { + msg = `Failed request: (${statusCode})`; + } + const err = new HttpClientError(msg, statusCode); + err.result = response.result; + reject(err); + } + else { + resolve(response); + } + })); + }); + } +} +exports.HttpClient = HttpClient; +const lowercaseKeys = (obj) => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCase()] = obj[k]), c), {}); +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ 9835: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.checkBypass = exports.getProxyUrl = void 0; +function getProxyUrl(reqUrl) { + const usingSsl = reqUrl.protocol === 'https:'; + if (checkBypass(reqUrl)) { + return undefined; + } + const proxyVar = (() => { + if (usingSsl) { + return process.env['https_proxy'] || process.env['HTTPS_PROXY']; + } + else { + return process.env['http_proxy'] || process.env['HTTP_PROXY']; + } + })(); + if (proxyVar) { + return new URL(proxyVar); + } + else { + return undefined; + } +} +exports.getProxyUrl = getProxyUrl; +function checkBypass(reqUrl) { + if (!reqUrl.hostname) { + return false; + } + const noProxy = process.env['no_proxy'] || process.env['NO_PROXY'] || ''; + if (!noProxy) { + return false; + } + // Determine the request port + let reqPort; + if (reqUrl.port) { + reqPort = Number(reqUrl.port); + } + else if (reqUrl.protocol === 'http:') { + reqPort = 80; + } + else if (reqUrl.protocol === 'https:') { + reqPort = 443; + } + // Format the request hostname and hostname with port + const upperReqHosts = [reqUrl.hostname.toUpperCase()]; + if (typeof reqPort === 'number') { + upperReqHosts.push(`${upperReqHosts[0]}:${reqPort}`); + } + // Compare request host against noproxy + for (const upperNoProxyItem of noProxy + .split(',') + .map(x => x.trim().toUpperCase()) + .filter(x => x)) { + if (upperReqHosts.some(x => x === upperNoProxyItem)) { + return true; + } + } + return false; +} +exports.checkBypass = checkBypass; +//# sourceMappingURL=proxy.js.map + +/***/ }), + +/***/ 4193: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ value: true })); + +const VERSION = "3.1.0"; + +/** + * Some “list” response that can be paginated have a different response structure + * + * They have a `total_count` key in the response (search also has `incomplete_results`, + * /installation/repositories also has `repository_selection`), as well as a key with + * the list of the items which name varies from endpoint to endpoint. + * + * Octokit normalizes these responses so that paginated results are always returned following + * the same structure. One challenge is that if the list response has only one page, no Link + * header is provided, so this header alone is not sufficient to check wether a response is + * paginated or not. + * + * We check if a "total_count" key is present in the response data, but also make sure that + * a "url" property is not, as the "Get the combined status for a specific ref" endpoint would + * otherwise match: https://developer.github.com/v3/repos/statuses/#get-the-combined-status-for-a-specific-ref + */ +function normalizePaginatedListResponse(response) { + // endpoints can respond with 204 if repository is empty + if (!response.data) { + return { ...response, + data: [] + }; + } + + const responseNeedsNormalization = "total_count" in response.data && !("url" in response.data); + if (!responseNeedsNormalization) return response; // keep the additional properties intact as there is currently no other way + // to retrieve the same information. + + const incompleteResults = response.data.incomplete_results; + const repositorySelection = response.data.repository_selection; + const totalCount = response.data.total_count; + delete response.data.incomplete_results; + delete response.data.repository_selection; + delete response.data.total_count; + const namespaceKey = Object.keys(response.data)[0]; + const data = response.data[namespaceKey]; + response.data = data; + + if (typeof incompleteResults !== "undefined") { + response.data.incomplete_results = incompleteResults; + } + + if (typeof repositorySelection !== "undefined") { + response.data.repository_selection = repositorySelection; + } + + response.data.total_count = totalCount; + return response; +} + +function iterator(octokit, route, parameters) { + const options = typeof route === "function" ? route.endpoint(parameters) : octokit.request.endpoint(route, parameters); + const requestMethod = typeof route === "function" ? route : octokit.request; + const method = options.method; + const headers = options.headers; + let url = options.url; + return { + [Symbol.asyncIterator]: () => ({ + async next() { + if (!url) return { + done: true + }; + + try { + const response = await requestMethod({ + method, + url, + headers + }); + const normalizedResponse = normalizePaginatedListResponse(response); // `response.headers.link` format: + // '; rel="next", ; rel="last"' + // sets `url` to undefined if "next" URL is not present or `link` header is not set + + url = ((normalizedResponse.headers.link || "").match(/<([^>]+)>;\s*rel="next"/) || [])[1]; + return { + value: normalizedResponse + }; + } catch (error) { + if (error.status !== 409) throw error; + url = ""; + return { + value: { + status: 200, + headers: {}, + data: [] + } + }; + } + } + + }) + }; +} + +function paginate(octokit, route, parameters, mapFn) { + if (typeof parameters === "function") { + mapFn = parameters; + parameters = undefined; + } + + return gather(octokit, [], iterator(octokit, route, parameters)[Symbol.asyncIterator](), mapFn); +} + +function gather(octokit, results, iterator, mapFn) { + return iterator.next().then(result => { + if (result.done) { + return results; + } + + let earlyExit = false; + + function done() { + earlyExit = true; + } + + results = results.concat(mapFn ? mapFn(result.value, done) : result.value.data); + + if (earlyExit) { + return results; + } + + return gather(octokit, results, iterator, mapFn); + }); +} + +const composePaginateRest = Object.assign(paginate, { + iterator +}); + +const paginatingEndpoints = ["GET /app/hook/deliveries", "GET /app/installations", "GET /applications/grants", "GET /authorizations", "GET /enterprises/{enterprise}/actions/permissions/organizations", "GET /enterprises/{enterprise}/actions/runner-groups", "GET /enterprises/{enterprise}/actions/runner-groups/{runner_group_id}/organizations", "GET /enterprises/{enterprise}/actions/runner-groups/{runner_group_id}/runners", "GET /enterprises/{enterprise}/actions/runners", "GET /enterprises/{enterprise}/audit-log", "GET /enterprises/{enterprise}/code-scanning/alerts", "GET /enterprises/{enterprise}/secret-scanning/alerts", "GET /enterprises/{enterprise}/settings/billing/advanced-security", "GET /events", "GET /gists", "GET /gists/public", "GET /gists/starred", "GET /gists/{gist_id}/comments", "GET /gists/{gist_id}/commits", "GET /gists/{gist_id}/forks", "GET /installation/repositories", "GET /issues", "GET /licenses", "GET /marketplace_listing/plans", "GET /marketplace_listing/plans/{plan_id}/accounts", "GET /marketplace_listing/stubbed/plans", "GET /marketplace_listing/stubbed/plans/{plan_id}/accounts", "GET /networks/{owner}/{repo}/events", "GET /notifications", "GET /organizations", "GET /orgs/{org}/actions/cache/usage-by-repository", "GET /orgs/{org}/actions/permissions/repositories", "GET /orgs/{org}/actions/runner-groups", "GET /orgs/{org}/actions/runner-groups/{runner_group_id}/repositories", "GET /orgs/{org}/actions/runner-groups/{runner_group_id}/runners", "GET /orgs/{org}/actions/runners", "GET /orgs/{org}/actions/secrets", "GET /orgs/{org}/actions/secrets/{secret_name}/repositories", "GET /orgs/{org}/audit-log", "GET /orgs/{org}/blocks", "GET /orgs/{org}/code-scanning/alerts", "GET /orgs/{org}/codespaces", "GET /orgs/{org}/credential-authorizations", "GET /orgs/{org}/dependabot/secrets", "GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories", "GET /orgs/{org}/events", "GET /orgs/{org}/external-groups", "GET /orgs/{org}/failed_invitations", "GET /orgs/{org}/hooks", "GET /orgs/{org}/hooks/{hook_id}/deliveries", "GET /orgs/{org}/installations", "GET /orgs/{org}/invitations", "GET /orgs/{org}/invitations/{invitation_id}/teams", "GET /orgs/{org}/issues", "GET /orgs/{org}/members", "GET /orgs/{org}/migrations", "GET /orgs/{org}/migrations/{migration_id}/repositories", "GET /orgs/{org}/outside_collaborators", "GET /orgs/{org}/packages", "GET /orgs/{org}/packages/{package_type}/{package_name}/versions", "GET /orgs/{org}/projects", "GET /orgs/{org}/public_members", "GET /orgs/{org}/repos", "GET /orgs/{org}/secret-scanning/alerts", "GET /orgs/{org}/settings/billing/advanced-security", "GET /orgs/{org}/team-sync/groups", "GET /orgs/{org}/teams", "GET /orgs/{org}/teams/{team_slug}/discussions", "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments", "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions", "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions", "GET /orgs/{org}/teams/{team_slug}/invitations", "GET /orgs/{org}/teams/{team_slug}/members", "GET /orgs/{org}/teams/{team_slug}/projects", "GET /orgs/{org}/teams/{team_slug}/repos", "GET /orgs/{org}/teams/{team_slug}/teams", "GET /projects/columns/{column_id}/cards", "GET /projects/{project_id}/collaborators", "GET /projects/{project_id}/columns", "GET /repos/{owner}/{repo}/actions/artifacts", "GET /repos/{owner}/{repo}/actions/caches", "GET /repos/{owner}/{repo}/actions/runners", "GET /repos/{owner}/{repo}/actions/runs", "GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts", "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs", "GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs", "GET /repos/{owner}/{repo}/actions/secrets", "GET /repos/{owner}/{repo}/actions/workflows", "GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs", "GET /repos/{owner}/{repo}/assignees", "GET /repos/{owner}/{repo}/branches", "GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations", "GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs", "GET /repos/{owner}/{repo}/code-scanning/alerts", "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances", "GET /repos/{owner}/{repo}/code-scanning/analyses", "GET /repos/{owner}/{repo}/codespaces", "GET /repos/{owner}/{repo}/codespaces/devcontainers", "GET /repos/{owner}/{repo}/codespaces/secrets", "GET /repos/{owner}/{repo}/collaborators", "GET /repos/{owner}/{repo}/comments", "GET /repos/{owner}/{repo}/comments/{comment_id}/reactions", "GET /repos/{owner}/{repo}/commits", "GET /repos/{owner}/{repo}/commits/{commit_sha}/comments", "GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls", "GET /repos/{owner}/{repo}/commits/{ref}/check-runs", "GET /repos/{owner}/{repo}/commits/{ref}/check-suites", "GET /repos/{owner}/{repo}/commits/{ref}/status", "GET /repos/{owner}/{repo}/commits/{ref}/statuses", "GET /repos/{owner}/{repo}/contributors", "GET /repos/{owner}/{repo}/dependabot/secrets", "GET /repos/{owner}/{repo}/deployments", "GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses", "GET /repos/{owner}/{repo}/environments", "GET /repos/{owner}/{repo}/events", "GET /repos/{owner}/{repo}/forks", "GET /repos/{owner}/{repo}/git/matching-refs/{ref}", "GET /repos/{owner}/{repo}/hooks", "GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries", "GET /repos/{owner}/{repo}/invitations", "GET /repos/{owner}/{repo}/issues", "GET /repos/{owner}/{repo}/issues/comments", "GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions", "GET /repos/{owner}/{repo}/issues/events", "GET /repos/{owner}/{repo}/issues/{issue_number}/comments", "GET /repos/{owner}/{repo}/issues/{issue_number}/events", "GET /repos/{owner}/{repo}/issues/{issue_number}/labels", "GET /repos/{owner}/{repo}/issues/{issue_number}/reactions", "GET /repos/{owner}/{repo}/issues/{issue_number}/timeline", "GET /repos/{owner}/{repo}/keys", "GET /repos/{owner}/{repo}/labels", "GET /repos/{owner}/{repo}/milestones", "GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels", "GET /repos/{owner}/{repo}/notifications", "GET /repos/{owner}/{repo}/pages/builds", "GET /repos/{owner}/{repo}/projects", "GET /repos/{owner}/{repo}/pulls", "GET /repos/{owner}/{repo}/pulls/comments", "GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions", "GET /repos/{owner}/{repo}/pulls/{pull_number}/comments", "GET /repos/{owner}/{repo}/pulls/{pull_number}/commits", "GET /repos/{owner}/{repo}/pulls/{pull_number}/files", "GET /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers", "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews", "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments", "GET /repos/{owner}/{repo}/releases", "GET /repos/{owner}/{repo}/releases/{release_id}/assets", "GET /repos/{owner}/{repo}/releases/{release_id}/reactions", "GET /repos/{owner}/{repo}/secret-scanning/alerts", "GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations", "GET /repos/{owner}/{repo}/stargazers", "GET /repos/{owner}/{repo}/subscribers", "GET /repos/{owner}/{repo}/tags", "GET /repos/{owner}/{repo}/teams", "GET /repos/{owner}/{repo}/topics", "GET /repositories", "GET /repositories/{repository_id}/environments/{environment_name}/secrets", "GET /search/code", "GET /search/commits", "GET /search/issues", "GET /search/labels", "GET /search/repositories", "GET /search/topics", "GET /search/users", "GET /teams/{team_id}/discussions", "GET /teams/{team_id}/discussions/{discussion_number}/comments", "GET /teams/{team_id}/discussions/{discussion_number}/comments/{comment_number}/reactions", "GET /teams/{team_id}/discussions/{discussion_number}/reactions", "GET /teams/{team_id}/invitations", "GET /teams/{team_id}/members", "GET /teams/{team_id}/projects", "GET /teams/{team_id}/repos", "GET /teams/{team_id}/teams", "GET /user/blocks", "GET /user/codespaces", "GET /user/codespaces/secrets", "GET /user/emails", "GET /user/followers", "GET /user/following", "GET /user/gpg_keys", "GET /user/installations", "GET /user/installations/{installation_id}/repositories", "GET /user/issues", "GET /user/keys", "GET /user/marketplace_purchases", "GET /user/marketplace_purchases/stubbed", "GET /user/memberships/orgs", "GET /user/migrations", "GET /user/migrations/{migration_id}/repositories", "GET /user/orgs", "GET /user/packages", "GET /user/packages/{package_type}/{package_name}/versions", "GET /user/public_emails", "GET /user/repos", "GET /user/repository_invitations", "GET /user/starred", "GET /user/subscriptions", "GET /user/teams", "GET /users", "GET /users/{username}/events", "GET /users/{username}/events/orgs/{org}", "GET /users/{username}/events/public", "GET /users/{username}/followers", "GET /users/{username}/following", "GET /users/{username}/gists", "GET /users/{username}/gpg_keys", "GET /users/{username}/keys", "GET /users/{username}/orgs", "GET /users/{username}/packages", "GET /users/{username}/projects", "GET /users/{username}/received_events", "GET /users/{username}/received_events/public", "GET /users/{username}/repos", "GET /users/{username}/starred", "GET /users/{username}/subscriptions"]; + +function isPaginatingEndpoint(arg) { + if (typeof arg === "string") { + return paginatingEndpoints.includes(arg); + } else { + return false; + } +} + +/** + * @param octokit Octokit instance + * @param options Options passed to Octokit constructor + */ + +function paginateRest(octokit) { + return { + paginate: Object.assign(paginate.bind(null, octokit), { + iterator: iterator.bind(null, octokit) + }) + }; +} +paginateRest.VERSION = VERSION; + +exports.composePaginateRest = composePaginateRest; +exports.isPaginatingEndpoint = isPaginatingEndpoint; +exports.paginateRest = paginateRest; +exports.paginatingEndpoints = paginatingEndpoints; +//# sourceMappingURL=index.js.map + + +/***/ }), + +/***/ 3044: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ value: true })); + +function ownKeys(object, enumerableOnly) { + var keys = Object.keys(object); + + if (Object.getOwnPropertySymbols) { + var symbols = Object.getOwnPropertySymbols(object); + + if (enumerableOnly) { + symbols = symbols.filter(function (sym) { + return Object.getOwnPropertyDescriptor(object, sym).enumerable; + }); + } + + keys.push.apply(keys, symbols); + } + + return keys; +} + +function _objectSpread2(target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i] != null ? arguments[i] : {}; + + if (i % 2) { + ownKeys(Object(source), true).forEach(function (key) { + _defineProperty(target, key, source[key]); + }); + } else if (Object.getOwnPropertyDescriptors) { + Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); + } else { + ownKeys(Object(source)).forEach(function (key) { + Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); + }); + } + } + + return target; +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +const Endpoints = { + actions: { + addCustomLabelsToSelfHostedRunnerForOrg: ["POST /orgs/{org}/actions/runners/{runner_id}/labels"], + addCustomLabelsToSelfHostedRunnerForRepo: ["POST /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"], + addSelectedRepoToOrgSecret: ["PUT /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}"], + approveWorkflowRun: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/approve"], + cancelWorkflowRun: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/cancel"], + createOrUpdateEnvironmentSecret: ["PUT /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}"], + createOrUpdateOrgSecret: ["PUT /orgs/{org}/actions/secrets/{secret_name}"], + createOrUpdateRepoSecret: ["PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}"], + createRegistrationTokenForOrg: ["POST /orgs/{org}/actions/runners/registration-token"], + createRegistrationTokenForRepo: ["POST /repos/{owner}/{repo}/actions/runners/registration-token"], + createRemoveTokenForOrg: ["POST /orgs/{org}/actions/runners/remove-token"], + createRemoveTokenForRepo: ["POST /repos/{owner}/{repo}/actions/runners/remove-token"], + createWorkflowDispatch: ["POST /repos/{owner}/{repo}/actions/workflows/{workflow_id}/dispatches"], + deleteActionsCacheById: ["DELETE /repos/{owner}/{repo}/actions/caches/{cache_id}"], + deleteActionsCacheByKey: ["DELETE /repos/{owner}/{repo}/actions/caches{?key,ref}"], + deleteArtifact: ["DELETE /repos/{owner}/{repo}/actions/artifacts/{artifact_id}"], + deleteEnvironmentSecret: ["DELETE /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}"], + deleteOrgSecret: ["DELETE /orgs/{org}/actions/secrets/{secret_name}"], + deleteRepoSecret: ["DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}"], + deleteSelfHostedRunnerFromOrg: ["DELETE /orgs/{org}/actions/runners/{runner_id}"], + deleteSelfHostedRunnerFromRepo: ["DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}"], + deleteWorkflowRun: ["DELETE /repos/{owner}/{repo}/actions/runs/{run_id}"], + deleteWorkflowRunLogs: ["DELETE /repos/{owner}/{repo}/actions/runs/{run_id}/logs"], + disableSelectedRepositoryGithubActionsOrganization: ["DELETE /orgs/{org}/actions/permissions/repositories/{repository_id}"], + disableWorkflow: ["PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/disable"], + downloadArtifact: ["GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}/{archive_format}"], + downloadJobLogsForWorkflowRun: ["GET /repos/{owner}/{repo}/actions/jobs/{job_id}/logs"], + downloadWorkflowRunAttemptLogs: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/logs"], + downloadWorkflowRunLogs: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/logs"], + enableSelectedRepositoryGithubActionsOrganization: ["PUT /orgs/{org}/actions/permissions/repositories/{repository_id}"], + enableWorkflow: ["PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/enable"], + getActionsCacheList: ["GET /repos/{owner}/{repo}/actions/caches"], + getActionsCacheUsage: ["GET /repos/{owner}/{repo}/actions/cache/usage"], + getActionsCacheUsageByRepoForOrg: ["GET /orgs/{org}/actions/cache/usage-by-repository"], + getActionsCacheUsageForEnterprise: ["GET /enterprises/{enterprise}/actions/cache/usage"], + getActionsCacheUsageForOrg: ["GET /orgs/{org}/actions/cache/usage"], + getAllowedActionsOrganization: ["GET /orgs/{org}/actions/permissions/selected-actions"], + getAllowedActionsRepository: ["GET /repos/{owner}/{repo}/actions/permissions/selected-actions"], + getArtifact: ["GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}"], + getEnvironmentPublicKey: ["GET /repositories/{repository_id}/environments/{environment_name}/secrets/public-key"], + getEnvironmentSecret: ["GET /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}"], + getGithubActionsDefaultWorkflowPermissionsEnterprise: ["GET /enterprises/{enterprise}/actions/permissions/workflow"], + getGithubActionsDefaultWorkflowPermissionsOrganization: ["GET /orgs/{org}/actions/permissions/workflow"], + getGithubActionsDefaultWorkflowPermissionsRepository: ["GET /repos/{owner}/{repo}/actions/permissions/workflow"], + getGithubActionsPermissionsOrganization: ["GET /orgs/{org}/actions/permissions"], + getGithubActionsPermissionsRepository: ["GET /repos/{owner}/{repo}/actions/permissions"], + getJobForWorkflowRun: ["GET /repos/{owner}/{repo}/actions/jobs/{job_id}"], + getOrgPublicKey: ["GET /orgs/{org}/actions/secrets/public-key"], + getOrgSecret: ["GET /orgs/{org}/actions/secrets/{secret_name}"], + getPendingDeploymentsForRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments"], + getRepoPermissions: ["GET /repos/{owner}/{repo}/actions/permissions", {}, { + renamed: ["actions", "getGithubActionsPermissionsRepository"] + }], + getRepoPublicKey: ["GET /repos/{owner}/{repo}/actions/secrets/public-key"], + getRepoSecret: ["GET /repos/{owner}/{repo}/actions/secrets/{secret_name}"], + getReviewsForRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/approvals"], + getSelfHostedRunnerForOrg: ["GET /orgs/{org}/actions/runners/{runner_id}"], + getSelfHostedRunnerForRepo: ["GET /repos/{owner}/{repo}/actions/runners/{runner_id}"], + getWorkflow: ["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}"], + getWorkflowAccessToRepository: ["GET /repos/{owner}/{repo}/actions/permissions/access"], + getWorkflowRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}"], + getWorkflowRunAttempt: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}"], + getWorkflowRunUsage: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/timing"], + getWorkflowUsage: ["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/timing"], + listArtifactsForRepo: ["GET /repos/{owner}/{repo}/actions/artifacts"], + listEnvironmentSecrets: ["GET /repositories/{repository_id}/environments/{environment_name}/secrets"], + listJobsForWorkflowRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs"], + listJobsForWorkflowRunAttempt: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs"], + listLabelsForSelfHostedRunnerForOrg: ["GET /orgs/{org}/actions/runners/{runner_id}/labels"], + listLabelsForSelfHostedRunnerForRepo: ["GET /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"], + listOrgSecrets: ["GET /orgs/{org}/actions/secrets"], + listRepoSecrets: ["GET /repos/{owner}/{repo}/actions/secrets"], + listRepoWorkflows: ["GET /repos/{owner}/{repo}/actions/workflows"], + listRunnerApplicationsForOrg: ["GET /orgs/{org}/actions/runners/downloads"], + listRunnerApplicationsForRepo: ["GET /repos/{owner}/{repo}/actions/runners/downloads"], + listSelectedReposForOrgSecret: ["GET /orgs/{org}/actions/secrets/{secret_name}/repositories"], + listSelectedRepositoriesEnabledGithubActionsOrganization: ["GET /orgs/{org}/actions/permissions/repositories"], + listSelfHostedRunnersForOrg: ["GET /orgs/{org}/actions/runners"], + listSelfHostedRunnersForRepo: ["GET /repos/{owner}/{repo}/actions/runners"], + listWorkflowRunArtifacts: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts"], + listWorkflowRuns: ["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs"], + listWorkflowRunsForRepo: ["GET /repos/{owner}/{repo}/actions/runs"], + reRunJobForWorkflowRun: ["POST /repos/{owner}/{repo}/actions/jobs/{job_id}/rerun"], + reRunWorkflow: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun"], + reRunWorkflowFailedJobs: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun-failed-jobs"], + removeAllCustomLabelsFromSelfHostedRunnerForOrg: ["DELETE /orgs/{org}/actions/runners/{runner_id}/labels"], + removeAllCustomLabelsFromSelfHostedRunnerForRepo: ["DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"], + removeCustomLabelFromSelfHostedRunnerForOrg: ["DELETE /orgs/{org}/actions/runners/{runner_id}/labels/{name}"], + removeCustomLabelFromSelfHostedRunnerForRepo: ["DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels/{name}"], + removeSelectedRepoFromOrgSecret: ["DELETE /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}"], + reviewPendingDeploymentsForRun: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments"], + setAllowedActionsOrganization: ["PUT /orgs/{org}/actions/permissions/selected-actions"], + setAllowedActionsRepository: ["PUT /repos/{owner}/{repo}/actions/permissions/selected-actions"], + setCustomLabelsForSelfHostedRunnerForOrg: ["PUT /orgs/{org}/actions/runners/{runner_id}/labels"], + setCustomLabelsForSelfHostedRunnerForRepo: ["PUT /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"], + setGithubActionsDefaultWorkflowPermissionsEnterprise: ["PUT /enterprises/{enterprise}/actions/permissions/workflow"], + setGithubActionsDefaultWorkflowPermissionsOrganization: ["PUT /orgs/{org}/actions/permissions/workflow"], + setGithubActionsDefaultWorkflowPermissionsRepository: ["PUT /repos/{owner}/{repo}/actions/permissions/workflow"], + setGithubActionsPermissionsOrganization: ["PUT /orgs/{org}/actions/permissions"], + setGithubActionsPermissionsRepository: ["PUT /repos/{owner}/{repo}/actions/permissions"], + setSelectedReposForOrgSecret: ["PUT /orgs/{org}/actions/secrets/{secret_name}/repositories"], + setSelectedRepositoriesEnabledGithubActionsOrganization: ["PUT /orgs/{org}/actions/permissions/repositories"], + setWorkflowAccessToRepository: ["PUT /repos/{owner}/{repo}/actions/permissions/access"] + }, + activity: { + checkRepoIsStarredByAuthenticatedUser: ["GET /user/starred/{owner}/{repo}"], + deleteRepoSubscription: ["DELETE /repos/{owner}/{repo}/subscription"], + deleteThreadSubscription: ["DELETE /notifications/threads/{thread_id}/subscription"], + getFeeds: ["GET /feeds"], + getRepoSubscription: ["GET /repos/{owner}/{repo}/subscription"], + getThread: ["GET /notifications/threads/{thread_id}"], + getThreadSubscriptionForAuthenticatedUser: ["GET /notifications/threads/{thread_id}/subscription"], + listEventsForAuthenticatedUser: ["GET /users/{username}/events"], + listNotificationsForAuthenticatedUser: ["GET /notifications"], + listOrgEventsForAuthenticatedUser: ["GET /users/{username}/events/orgs/{org}"], + listPublicEvents: ["GET /events"], + listPublicEventsForRepoNetwork: ["GET /networks/{owner}/{repo}/events"], + listPublicEventsForUser: ["GET /users/{username}/events/public"], + listPublicOrgEvents: ["GET /orgs/{org}/events"], + listReceivedEventsForUser: ["GET /users/{username}/received_events"], + listReceivedPublicEventsForUser: ["GET /users/{username}/received_events/public"], + listRepoEvents: ["GET /repos/{owner}/{repo}/events"], + listRepoNotificationsForAuthenticatedUser: ["GET /repos/{owner}/{repo}/notifications"], + listReposStarredByAuthenticatedUser: ["GET /user/starred"], + listReposStarredByUser: ["GET /users/{username}/starred"], + listReposWatchedByUser: ["GET /users/{username}/subscriptions"], + listStargazersForRepo: ["GET /repos/{owner}/{repo}/stargazers"], + listWatchedReposForAuthenticatedUser: ["GET /user/subscriptions"], + listWatchersForRepo: ["GET /repos/{owner}/{repo}/subscribers"], + markNotificationsAsRead: ["PUT /notifications"], + markRepoNotificationsAsRead: ["PUT /repos/{owner}/{repo}/notifications"], + markThreadAsRead: ["PATCH /notifications/threads/{thread_id}"], + setRepoSubscription: ["PUT /repos/{owner}/{repo}/subscription"], + setThreadSubscription: ["PUT /notifications/threads/{thread_id}/subscription"], + starRepoForAuthenticatedUser: ["PUT /user/starred/{owner}/{repo}"], + unstarRepoForAuthenticatedUser: ["DELETE /user/starred/{owner}/{repo}"] + }, + apps: { + addRepoToInstallation: ["PUT /user/installations/{installation_id}/repositories/{repository_id}", {}, { + renamed: ["apps", "addRepoToInstallationForAuthenticatedUser"] + }], + addRepoToInstallationForAuthenticatedUser: ["PUT /user/installations/{installation_id}/repositories/{repository_id}"], + checkToken: ["POST /applications/{client_id}/token"], + createFromManifest: ["POST /app-manifests/{code}/conversions"], + createInstallationAccessToken: ["POST /app/installations/{installation_id}/access_tokens"], + deleteAuthorization: ["DELETE /applications/{client_id}/grant"], + deleteInstallation: ["DELETE /app/installations/{installation_id}"], + deleteToken: ["DELETE /applications/{client_id}/token"], + getAuthenticated: ["GET /app"], + getBySlug: ["GET /apps/{app_slug}"], + getInstallation: ["GET /app/installations/{installation_id}"], + getOrgInstallation: ["GET /orgs/{org}/installation"], + getRepoInstallation: ["GET /repos/{owner}/{repo}/installation"], + getSubscriptionPlanForAccount: ["GET /marketplace_listing/accounts/{account_id}"], + getSubscriptionPlanForAccountStubbed: ["GET /marketplace_listing/stubbed/accounts/{account_id}"], + getUserInstallation: ["GET /users/{username}/installation"], + getWebhookConfigForApp: ["GET /app/hook/config"], + getWebhookDelivery: ["GET /app/hook/deliveries/{delivery_id}"], + listAccountsForPlan: ["GET /marketplace_listing/plans/{plan_id}/accounts"], + listAccountsForPlanStubbed: ["GET /marketplace_listing/stubbed/plans/{plan_id}/accounts"], + listInstallationReposForAuthenticatedUser: ["GET /user/installations/{installation_id}/repositories"], + listInstallations: ["GET /app/installations"], + listInstallationsForAuthenticatedUser: ["GET /user/installations"], + listPlans: ["GET /marketplace_listing/plans"], + listPlansStubbed: ["GET /marketplace_listing/stubbed/plans"], + listReposAccessibleToInstallation: ["GET /installation/repositories"], + listSubscriptionsForAuthenticatedUser: ["GET /user/marketplace_purchases"], + listSubscriptionsForAuthenticatedUserStubbed: ["GET /user/marketplace_purchases/stubbed"], + listWebhookDeliveries: ["GET /app/hook/deliveries"], + redeliverWebhookDelivery: ["POST /app/hook/deliveries/{delivery_id}/attempts"], + removeRepoFromInstallation: ["DELETE /user/installations/{installation_id}/repositories/{repository_id}", {}, { + renamed: ["apps", "removeRepoFromInstallationForAuthenticatedUser"] + }], + removeRepoFromInstallationForAuthenticatedUser: ["DELETE /user/installations/{installation_id}/repositories/{repository_id}"], + resetToken: ["PATCH /applications/{client_id}/token"], + revokeInstallationAccessToken: ["DELETE /installation/token"], + scopeToken: ["POST /applications/{client_id}/token/scoped"], + suspendInstallation: ["PUT /app/installations/{installation_id}/suspended"], + unsuspendInstallation: ["DELETE /app/installations/{installation_id}/suspended"], + updateWebhookConfigForApp: ["PATCH /app/hook/config"] + }, + billing: { + getGithubActionsBillingOrg: ["GET /orgs/{org}/settings/billing/actions"], + getGithubActionsBillingUser: ["GET /users/{username}/settings/billing/actions"], + getGithubAdvancedSecurityBillingGhe: ["GET /enterprises/{enterprise}/settings/billing/advanced-security"], + getGithubAdvancedSecurityBillingOrg: ["GET /orgs/{org}/settings/billing/advanced-security"], + getGithubPackagesBillingOrg: ["GET /orgs/{org}/settings/billing/packages"], + getGithubPackagesBillingUser: ["GET /users/{username}/settings/billing/packages"], + getSharedStorageBillingOrg: ["GET /orgs/{org}/settings/billing/shared-storage"], + getSharedStorageBillingUser: ["GET /users/{username}/settings/billing/shared-storage"] + }, + checks: { + create: ["POST /repos/{owner}/{repo}/check-runs"], + createSuite: ["POST /repos/{owner}/{repo}/check-suites"], + get: ["GET /repos/{owner}/{repo}/check-runs/{check_run_id}"], + getSuite: ["GET /repos/{owner}/{repo}/check-suites/{check_suite_id}"], + listAnnotations: ["GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations"], + listForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/check-runs"], + listForSuite: ["GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs"], + listSuitesForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/check-suites"], + rerequestRun: ["POST /repos/{owner}/{repo}/check-runs/{check_run_id}/rerequest"], + rerequestSuite: ["POST /repos/{owner}/{repo}/check-suites/{check_suite_id}/rerequest"], + setSuitesPreferences: ["PATCH /repos/{owner}/{repo}/check-suites/preferences"], + update: ["PATCH /repos/{owner}/{repo}/check-runs/{check_run_id}"] + }, + codeScanning: { + deleteAnalysis: ["DELETE /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}{?confirm_delete}"], + getAlert: ["GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}", {}, { + renamedParameters: { + alert_id: "alert_number" + } + }], + getAnalysis: ["GET /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}"], + getSarif: ["GET /repos/{owner}/{repo}/code-scanning/sarifs/{sarif_id}"], + listAlertInstances: ["GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances"], + listAlertsForOrg: ["GET /orgs/{org}/code-scanning/alerts"], + listAlertsForRepo: ["GET /repos/{owner}/{repo}/code-scanning/alerts"], + listAlertsInstances: ["GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances", {}, { + renamed: ["codeScanning", "listAlertInstances"] + }], + listRecentAnalyses: ["GET /repos/{owner}/{repo}/code-scanning/analyses"], + updateAlert: ["PATCH /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}"], + uploadSarif: ["POST /repos/{owner}/{repo}/code-scanning/sarifs"] + }, + codesOfConduct: { + getAllCodesOfConduct: ["GET /codes_of_conduct"], + getConductCode: ["GET /codes_of_conduct/{key}"] + }, + codespaces: { + addRepositoryForSecretForAuthenticatedUser: ["PUT /user/codespaces/secrets/{secret_name}/repositories/{repository_id}"], + codespaceMachinesForAuthenticatedUser: ["GET /user/codespaces/{codespace_name}/machines"], + createForAuthenticatedUser: ["POST /user/codespaces"], + createOrUpdateRepoSecret: ["PUT /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"], + createOrUpdateSecretForAuthenticatedUser: ["PUT /user/codespaces/secrets/{secret_name}"], + createWithPrForAuthenticatedUser: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/codespaces"], + createWithRepoForAuthenticatedUser: ["POST /repos/{owner}/{repo}/codespaces"], + deleteForAuthenticatedUser: ["DELETE /user/codespaces/{codespace_name}"], + deleteFromOrganization: ["DELETE /orgs/{org}/members/{username}/codespaces/{codespace_name}"], + deleteRepoSecret: ["DELETE /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"], + deleteSecretForAuthenticatedUser: ["DELETE /user/codespaces/secrets/{secret_name}"], + exportForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/exports"], + getExportDetailsForAuthenticatedUser: ["GET /user/codespaces/{codespace_name}/exports/{export_id}"], + getForAuthenticatedUser: ["GET /user/codespaces/{codespace_name}"], + getPublicKeyForAuthenticatedUser: ["GET /user/codespaces/secrets/public-key"], + getRepoPublicKey: ["GET /repos/{owner}/{repo}/codespaces/secrets/public-key"], + getRepoSecret: ["GET /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"], + getSecretForAuthenticatedUser: ["GET /user/codespaces/secrets/{secret_name}"], + listDevcontainersInRepositoryForAuthenticatedUser: ["GET /repos/{owner}/{repo}/codespaces/devcontainers"], + listForAuthenticatedUser: ["GET /user/codespaces"], + listInOrganization: ["GET /orgs/{org}/codespaces", {}, { + renamedParameters: { + org_id: "org" + } + }], + listInRepositoryForAuthenticatedUser: ["GET /repos/{owner}/{repo}/codespaces"], + listRepoSecrets: ["GET /repos/{owner}/{repo}/codespaces/secrets"], + listRepositoriesForSecretForAuthenticatedUser: ["GET /user/codespaces/secrets/{secret_name}/repositories"], + listSecretsForAuthenticatedUser: ["GET /user/codespaces/secrets"], + removeRepositoryForSecretForAuthenticatedUser: ["DELETE /user/codespaces/secrets/{secret_name}/repositories/{repository_id}"], + repoMachinesForAuthenticatedUser: ["GET /repos/{owner}/{repo}/codespaces/machines"], + setRepositoriesForSecretForAuthenticatedUser: ["PUT /user/codespaces/secrets/{secret_name}/repositories"], + startForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/start"], + stopForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/stop"], + stopInOrganization: ["POST /orgs/{org}/members/{username}/codespaces/{codespace_name}/stop"], + updateForAuthenticatedUser: ["PATCH /user/codespaces/{codespace_name}"] + }, + dependabot: { + addSelectedRepoToOrgSecret: ["PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}"], + createOrUpdateOrgSecret: ["PUT /orgs/{org}/dependabot/secrets/{secret_name}"], + createOrUpdateRepoSecret: ["PUT /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"], + deleteOrgSecret: ["DELETE /orgs/{org}/dependabot/secrets/{secret_name}"], + deleteRepoSecret: ["DELETE /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"], + getOrgPublicKey: ["GET /orgs/{org}/dependabot/secrets/public-key"], + getOrgSecret: ["GET /orgs/{org}/dependabot/secrets/{secret_name}"], + getRepoPublicKey: ["GET /repos/{owner}/{repo}/dependabot/secrets/public-key"], + getRepoSecret: ["GET /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"], + listOrgSecrets: ["GET /orgs/{org}/dependabot/secrets"], + listRepoSecrets: ["GET /repos/{owner}/{repo}/dependabot/secrets"], + listSelectedReposForOrgSecret: ["GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories"], + removeSelectedRepoFromOrgSecret: ["DELETE /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}"], + setSelectedReposForOrgSecret: ["PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories"] + }, + dependencyGraph: { + createRepositorySnapshot: ["POST /repos/{owner}/{repo}/dependency-graph/snapshots"], + diffRange: ["GET /repos/{owner}/{repo}/dependency-graph/compare/{basehead}"] + }, + emojis: { + get: ["GET /emojis"] + }, + enterpriseAdmin: { + addCustomLabelsToSelfHostedRunnerForEnterprise: ["POST /enterprises/{enterprise}/actions/runners/{runner_id}/labels"], + disableSelectedOrganizationGithubActionsEnterprise: ["DELETE /enterprises/{enterprise}/actions/permissions/organizations/{org_id}"], + enableSelectedOrganizationGithubActionsEnterprise: ["PUT /enterprises/{enterprise}/actions/permissions/organizations/{org_id}"], + getAllowedActionsEnterprise: ["GET /enterprises/{enterprise}/actions/permissions/selected-actions"], + getGithubActionsPermissionsEnterprise: ["GET /enterprises/{enterprise}/actions/permissions"], + getServerStatistics: ["GET /enterprise-installation/{enterprise_or_org}/server-statistics"], + listLabelsForSelfHostedRunnerForEnterprise: ["GET /enterprises/{enterprise}/actions/runners/{runner_id}/labels"], + listSelectedOrganizationsEnabledGithubActionsEnterprise: ["GET /enterprises/{enterprise}/actions/permissions/organizations"], + removeAllCustomLabelsFromSelfHostedRunnerForEnterprise: ["DELETE /enterprises/{enterprise}/actions/runners/{runner_id}/labels"], + removeCustomLabelFromSelfHostedRunnerForEnterprise: ["DELETE /enterprises/{enterprise}/actions/runners/{runner_id}/labels/{name}"], + setAllowedActionsEnterprise: ["PUT /enterprises/{enterprise}/actions/permissions/selected-actions"], + setCustomLabelsForSelfHostedRunnerForEnterprise: ["PUT /enterprises/{enterprise}/actions/runners/{runner_id}/labels"], + setGithubActionsPermissionsEnterprise: ["PUT /enterprises/{enterprise}/actions/permissions"], + setSelectedOrganizationsEnabledGithubActionsEnterprise: ["PUT /enterprises/{enterprise}/actions/permissions/organizations"] + }, + gists: { + checkIsStarred: ["GET /gists/{gist_id}/star"], + create: ["POST /gists"], + createComment: ["POST /gists/{gist_id}/comments"], + delete: ["DELETE /gists/{gist_id}"], + deleteComment: ["DELETE /gists/{gist_id}/comments/{comment_id}"], + fork: ["POST /gists/{gist_id}/forks"], + get: ["GET /gists/{gist_id}"], + getComment: ["GET /gists/{gist_id}/comments/{comment_id}"], + getRevision: ["GET /gists/{gist_id}/{sha}"], + list: ["GET /gists"], + listComments: ["GET /gists/{gist_id}/comments"], + listCommits: ["GET /gists/{gist_id}/commits"], + listForUser: ["GET /users/{username}/gists"], + listForks: ["GET /gists/{gist_id}/forks"], + listPublic: ["GET /gists/public"], + listStarred: ["GET /gists/starred"], + star: ["PUT /gists/{gist_id}/star"], + unstar: ["DELETE /gists/{gist_id}/star"], + update: ["PATCH /gists/{gist_id}"], + updateComment: ["PATCH /gists/{gist_id}/comments/{comment_id}"] + }, + git: { + createBlob: ["POST /repos/{owner}/{repo}/git/blobs"], + createCommit: ["POST /repos/{owner}/{repo}/git/commits"], + createRef: ["POST /repos/{owner}/{repo}/git/refs"], + createTag: ["POST /repos/{owner}/{repo}/git/tags"], + createTree: ["POST /repos/{owner}/{repo}/git/trees"], + deleteRef: ["DELETE /repos/{owner}/{repo}/git/refs/{ref}"], + getBlob: ["GET /repos/{owner}/{repo}/git/blobs/{file_sha}"], + getCommit: ["GET /repos/{owner}/{repo}/git/commits/{commit_sha}"], + getRef: ["GET /repos/{owner}/{repo}/git/ref/{ref}"], + getTag: ["GET /repos/{owner}/{repo}/git/tags/{tag_sha}"], + getTree: ["GET /repos/{owner}/{repo}/git/trees/{tree_sha}"], + listMatchingRefs: ["GET /repos/{owner}/{repo}/git/matching-refs/{ref}"], + updateRef: ["PATCH /repos/{owner}/{repo}/git/refs/{ref}"] + }, + gitignore: { + getAllTemplates: ["GET /gitignore/templates"], + getTemplate: ["GET /gitignore/templates/{name}"] + }, + interactions: { + getRestrictionsForAuthenticatedUser: ["GET /user/interaction-limits"], + getRestrictionsForOrg: ["GET /orgs/{org}/interaction-limits"], + getRestrictionsForRepo: ["GET /repos/{owner}/{repo}/interaction-limits"], + getRestrictionsForYourPublicRepos: ["GET /user/interaction-limits", {}, { + renamed: ["interactions", "getRestrictionsForAuthenticatedUser"] + }], + removeRestrictionsForAuthenticatedUser: ["DELETE /user/interaction-limits"], + removeRestrictionsForOrg: ["DELETE /orgs/{org}/interaction-limits"], + removeRestrictionsForRepo: ["DELETE /repos/{owner}/{repo}/interaction-limits"], + removeRestrictionsForYourPublicRepos: ["DELETE /user/interaction-limits", {}, { + renamed: ["interactions", "removeRestrictionsForAuthenticatedUser"] + }], + setRestrictionsForAuthenticatedUser: ["PUT /user/interaction-limits"], + setRestrictionsForOrg: ["PUT /orgs/{org}/interaction-limits"], + setRestrictionsForRepo: ["PUT /repos/{owner}/{repo}/interaction-limits"], + setRestrictionsForYourPublicRepos: ["PUT /user/interaction-limits", {}, { + renamed: ["interactions", "setRestrictionsForAuthenticatedUser"] + }] + }, + issues: { + addAssignees: ["POST /repos/{owner}/{repo}/issues/{issue_number}/assignees"], + addLabels: ["POST /repos/{owner}/{repo}/issues/{issue_number}/labels"], + checkUserCanBeAssigned: ["GET /repos/{owner}/{repo}/assignees/{assignee}"], + create: ["POST /repos/{owner}/{repo}/issues"], + createComment: ["POST /repos/{owner}/{repo}/issues/{issue_number}/comments"], + createLabel: ["POST /repos/{owner}/{repo}/labels"], + createMilestone: ["POST /repos/{owner}/{repo}/milestones"], + deleteComment: ["DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}"], + deleteLabel: ["DELETE /repos/{owner}/{repo}/labels/{name}"], + deleteMilestone: ["DELETE /repos/{owner}/{repo}/milestones/{milestone_number}"], + get: ["GET /repos/{owner}/{repo}/issues/{issue_number}"], + getComment: ["GET /repos/{owner}/{repo}/issues/comments/{comment_id}"], + getEvent: ["GET /repos/{owner}/{repo}/issues/events/{event_id}"], + getLabel: ["GET /repos/{owner}/{repo}/labels/{name}"], + getMilestone: ["GET /repos/{owner}/{repo}/milestones/{milestone_number}"], + list: ["GET /issues"], + listAssignees: ["GET /repos/{owner}/{repo}/assignees"], + listComments: ["GET /repos/{owner}/{repo}/issues/{issue_number}/comments"], + listCommentsForRepo: ["GET /repos/{owner}/{repo}/issues/comments"], + listEvents: ["GET /repos/{owner}/{repo}/issues/{issue_number}/events"], + listEventsForRepo: ["GET /repos/{owner}/{repo}/issues/events"], + listEventsForTimeline: ["GET /repos/{owner}/{repo}/issues/{issue_number}/timeline"], + listForAuthenticatedUser: ["GET /user/issues"], + listForOrg: ["GET /orgs/{org}/issues"], + listForRepo: ["GET /repos/{owner}/{repo}/issues"], + listLabelsForMilestone: ["GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels"], + listLabelsForRepo: ["GET /repos/{owner}/{repo}/labels"], + listLabelsOnIssue: ["GET /repos/{owner}/{repo}/issues/{issue_number}/labels"], + listMilestones: ["GET /repos/{owner}/{repo}/milestones"], + lock: ["PUT /repos/{owner}/{repo}/issues/{issue_number}/lock"], + removeAllLabels: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels"], + removeAssignees: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/assignees"], + removeLabel: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels/{name}"], + setLabels: ["PUT /repos/{owner}/{repo}/issues/{issue_number}/labels"], + unlock: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/lock"], + update: ["PATCH /repos/{owner}/{repo}/issues/{issue_number}"], + updateComment: ["PATCH /repos/{owner}/{repo}/issues/comments/{comment_id}"], + updateLabel: ["PATCH /repos/{owner}/{repo}/labels/{name}"], + updateMilestone: ["PATCH /repos/{owner}/{repo}/milestones/{milestone_number}"] + }, + licenses: { + get: ["GET /licenses/{license}"], + getAllCommonlyUsed: ["GET /licenses"], + getForRepo: ["GET /repos/{owner}/{repo}/license"] + }, + markdown: { + render: ["POST /markdown"], + renderRaw: ["POST /markdown/raw", { + headers: { + "content-type": "text/plain; charset=utf-8" + } + }] + }, + meta: { + get: ["GET /meta"], + getOctocat: ["GET /octocat"], + getZen: ["GET /zen"], + root: ["GET /"] + }, + migrations: { + cancelImport: ["DELETE /repos/{owner}/{repo}/import"], + deleteArchiveForAuthenticatedUser: ["DELETE /user/migrations/{migration_id}/archive"], + deleteArchiveForOrg: ["DELETE /orgs/{org}/migrations/{migration_id}/archive"], + downloadArchiveForOrg: ["GET /orgs/{org}/migrations/{migration_id}/archive"], + getArchiveForAuthenticatedUser: ["GET /user/migrations/{migration_id}/archive"], + getCommitAuthors: ["GET /repos/{owner}/{repo}/import/authors"], + getImportStatus: ["GET /repos/{owner}/{repo}/import"], + getLargeFiles: ["GET /repos/{owner}/{repo}/import/large_files"], + getStatusForAuthenticatedUser: ["GET /user/migrations/{migration_id}"], + getStatusForOrg: ["GET /orgs/{org}/migrations/{migration_id}"], + listForAuthenticatedUser: ["GET /user/migrations"], + listForOrg: ["GET /orgs/{org}/migrations"], + listReposForAuthenticatedUser: ["GET /user/migrations/{migration_id}/repositories"], + listReposForOrg: ["GET /orgs/{org}/migrations/{migration_id}/repositories"], + listReposForUser: ["GET /user/migrations/{migration_id}/repositories", {}, { + renamed: ["migrations", "listReposForAuthenticatedUser"] + }], + mapCommitAuthor: ["PATCH /repos/{owner}/{repo}/import/authors/{author_id}"], + setLfsPreference: ["PATCH /repos/{owner}/{repo}/import/lfs"], + startForAuthenticatedUser: ["POST /user/migrations"], + startForOrg: ["POST /orgs/{org}/migrations"], + startImport: ["PUT /repos/{owner}/{repo}/import"], + unlockRepoForAuthenticatedUser: ["DELETE /user/migrations/{migration_id}/repos/{repo_name}/lock"], + unlockRepoForOrg: ["DELETE /orgs/{org}/migrations/{migration_id}/repos/{repo_name}/lock"], + updateImport: ["PATCH /repos/{owner}/{repo}/import"] + }, + orgs: { + blockUser: ["PUT /orgs/{org}/blocks/{username}"], + cancelInvitation: ["DELETE /orgs/{org}/invitations/{invitation_id}"], + checkBlockedUser: ["GET /orgs/{org}/blocks/{username}"], + checkMembershipForUser: ["GET /orgs/{org}/members/{username}"], + checkPublicMembershipForUser: ["GET /orgs/{org}/public_members/{username}"], + convertMemberToOutsideCollaborator: ["PUT /orgs/{org}/outside_collaborators/{username}"], + createInvitation: ["POST /orgs/{org}/invitations"], + createWebhook: ["POST /orgs/{org}/hooks"], + deleteWebhook: ["DELETE /orgs/{org}/hooks/{hook_id}"], + get: ["GET /orgs/{org}"], + getMembershipForAuthenticatedUser: ["GET /user/memberships/orgs/{org}"], + getMembershipForUser: ["GET /orgs/{org}/memberships/{username}"], + getWebhook: ["GET /orgs/{org}/hooks/{hook_id}"], + getWebhookConfigForOrg: ["GET /orgs/{org}/hooks/{hook_id}/config"], + getWebhookDelivery: ["GET /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}"], + list: ["GET /organizations"], + listAppInstallations: ["GET /orgs/{org}/installations"], + listBlockedUsers: ["GET /orgs/{org}/blocks"], + listCustomRoles: ["GET /organizations/{organization_id}/custom_roles"], + listFailedInvitations: ["GET /orgs/{org}/failed_invitations"], + listForAuthenticatedUser: ["GET /user/orgs"], + listForUser: ["GET /users/{username}/orgs"], + listInvitationTeams: ["GET /orgs/{org}/invitations/{invitation_id}/teams"], + listMembers: ["GET /orgs/{org}/members"], + listMembershipsForAuthenticatedUser: ["GET /user/memberships/orgs"], + listOutsideCollaborators: ["GET /orgs/{org}/outside_collaborators"], + listPendingInvitations: ["GET /orgs/{org}/invitations"], + listPublicMembers: ["GET /orgs/{org}/public_members"], + listWebhookDeliveries: ["GET /orgs/{org}/hooks/{hook_id}/deliveries"], + listWebhooks: ["GET /orgs/{org}/hooks"], + pingWebhook: ["POST /orgs/{org}/hooks/{hook_id}/pings"], + redeliverWebhookDelivery: ["POST /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}/attempts"], + removeMember: ["DELETE /orgs/{org}/members/{username}"], + removeMembershipForUser: ["DELETE /orgs/{org}/memberships/{username}"], + removeOutsideCollaborator: ["DELETE /orgs/{org}/outside_collaborators/{username}"], + removePublicMembershipForAuthenticatedUser: ["DELETE /orgs/{org}/public_members/{username}"], + setMembershipForUser: ["PUT /orgs/{org}/memberships/{username}"], + setPublicMembershipForAuthenticatedUser: ["PUT /orgs/{org}/public_members/{username}"], + unblockUser: ["DELETE /orgs/{org}/blocks/{username}"], + update: ["PATCH /orgs/{org}"], + updateMembershipForAuthenticatedUser: ["PATCH /user/memberships/orgs/{org}"], + updateWebhook: ["PATCH /orgs/{org}/hooks/{hook_id}"], + updateWebhookConfigForOrg: ["PATCH /orgs/{org}/hooks/{hook_id}/config"] + }, + packages: { + deletePackageForAuthenticatedUser: ["DELETE /user/packages/{package_type}/{package_name}"], + deletePackageForOrg: ["DELETE /orgs/{org}/packages/{package_type}/{package_name}"], + deletePackageForUser: ["DELETE /users/{username}/packages/{package_type}/{package_name}"], + deletePackageVersionForAuthenticatedUser: ["DELETE /user/packages/{package_type}/{package_name}/versions/{package_version_id}"], + deletePackageVersionForOrg: ["DELETE /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}"], + deletePackageVersionForUser: ["DELETE /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}"], + getAllPackageVersionsForAPackageOwnedByAnOrg: ["GET /orgs/{org}/packages/{package_type}/{package_name}/versions", {}, { + renamed: ["packages", "getAllPackageVersionsForPackageOwnedByOrg"] + }], + getAllPackageVersionsForAPackageOwnedByTheAuthenticatedUser: ["GET /user/packages/{package_type}/{package_name}/versions", {}, { + renamed: ["packages", "getAllPackageVersionsForPackageOwnedByAuthenticatedUser"] + }], + getAllPackageVersionsForPackageOwnedByAuthenticatedUser: ["GET /user/packages/{package_type}/{package_name}/versions"], + getAllPackageVersionsForPackageOwnedByOrg: ["GET /orgs/{org}/packages/{package_type}/{package_name}/versions"], + getAllPackageVersionsForPackageOwnedByUser: ["GET /users/{username}/packages/{package_type}/{package_name}/versions"], + getPackageForAuthenticatedUser: ["GET /user/packages/{package_type}/{package_name}"], + getPackageForOrganization: ["GET /orgs/{org}/packages/{package_type}/{package_name}"], + getPackageForUser: ["GET /users/{username}/packages/{package_type}/{package_name}"], + getPackageVersionForAuthenticatedUser: ["GET /user/packages/{package_type}/{package_name}/versions/{package_version_id}"], + getPackageVersionForOrganization: ["GET /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}"], + getPackageVersionForUser: ["GET /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}"], + listPackagesForAuthenticatedUser: ["GET /user/packages"], + listPackagesForOrganization: ["GET /orgs/{org}/packages"], + listPackagesForUser: ["GET /users/{username}/packages"], + restorePackageForAuthenticatedUser: ["POST /user/packages/{package_type}/{package_name}/restore{?token}"], + restorePackageForOrg: ["POST /orgs/{org}/packages/{package_type}/{package_name}/restore{?token}"], + restorePackageForUser: ["POST /users/{username}/packages/{package_type}/{package_name}/restore{?token}"], + restorePackageVersionForAuthenticatedUser: ["POST /user/packages/{package_type}/{package_name}/versions/{package_version_id}/restore"], + restorePackageVersionForOrg: ["POST /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore"], + restorePackageVersionForUser: ["POST /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore"] + }, + projects: { + addCollaborator: ["PUT /projects/{project_id}/collaborators/{username}"], + createCard: ["POST /projects/columns/{column_id}/cards"], + createColumn: ["POST /projects/{project_id}/columns"], + createForAuthenticatedUser: ["POST /user/projects"], + createForOrg: ["POST /orgs/{org}/projects"], + createForRepo: ["POST /repos/{owner}/{repo}/projects"], + delete: ["DELETE /projects/{project_id}"], + deleteCard: ["DELETE /projects/columns/cards/{card_id}"], + deleteColumn: ["DELETE /projects/columns/{column_id}"], + get: ["GET /projects/{project_id}"], + getCard: ["GET /projects/columns/cards/{card_id}"], + getColumn: ["GET /projects/columns/{column_id}"], + getPermissionForUser: ["GET /projects/{project_id}/collaborators/{username}/permission"], + listCards: ["GET /projects/columns/{column_id}/cards"], + listCollaborators: ["GET /projects/{project_id}/collaborators"], + listColumns: ["GET /projects/{project_id}/columns"], + listForOrg: ["GET /orgs/{org}/projects"], + listForRepo: ["GET /repos/{owner}/{repo}/projects"], + listForUser: ["GET /users/{username}/projects"], + moveCard: ["POST /projects/columns/cards/{card_id}/moves"], + moveColumn: ["POST /projects/columns/{column_id}/moves"], + removeCollaborator: ["DELETE /projects/{project_id}/collaborators/{username}"], + update: ["PATCH /projects/{project_id}"], + updateCard: ["PATCH /projects/columns/cards/{card_id}"], + updateColumn: ["PATCH /projects/columns/{column_id}"] + }, + pulls: { + checkIfMerged: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/merge"], + create: ["POST /repos/{owner}/{repo}/pulls"], + createReplyForReviewComment: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/comments/{comment_id}/replies"], + createReview: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews"], + createReviewComment: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/comments"], + deletePendingReview: ["DELETE /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"], + deleteReviewComment: ["DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}"], + dismissReview: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/dismissals"], + get: ["GET /repos/{owner}/{repo}/pulls/{pull_number}"], + getReview: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"], + getReviewComment: ["GET /repos/{owner}/{repo}/pulls/comments/{comment_id}"], + list: ["GET /repos/{owner}/{repo}/pulls"], + listCommentsForReview: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments"], + listCommits: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/commits"], + listFiles: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/files"], + listRequestedReviewers: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"], + listReviewComments: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/comments"], + listReviewCommentsForRepo: ["GET /repos/{owner}/{repo}/pulls/comments"], + listReviews: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews"], + merge: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/merge"], + removeRequestedReviewers: ["DELETE /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"], + requestReviewers: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"], + submitReview: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/events"], + update: ["PATCH /repos/{owner}/{repo}/pulls/{pull_number}"], + updateBranch: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/update-branch"], + updateReview: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"], + updateReviewComment: ["PATCH /repos/{owner}/{repo}/pulls/comments/{comment_id}"] + }, + rateLimit: { + get: ["GET /rate_limit"] + }, + reactions: { + createForCommitComment: ["POST /repos/{owner}/{repo}/comments/{comment_id}/reactions"], + createForIssue: ["POST /repos/{owner}/{repo}/issues/{issue_number}/reactions"], + createForIssueComment: ["POST /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions"], + createForPullRequestReviewComment: ["POST /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions"], + createForRelease: ["POST /repos/{owner}/{repo}/releases/{release_id}/reactions"], + createForTeamDiscussionCommentInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions"], + createForTeamDiscussionInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions"], + deleteForCommitComment: ["DELETE /repos/{owner}/{repo}/comments/{comment_id}/reactions/{reaction_id}"], + deleteForIssue: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/reactions/{reaction_id}"], + deleteForIssueComment: ["DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions/{reaction_id}"], + deleteForPullRequestComment: ["DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions/{reaction_id}"], + deleteForRelease: ["DELETE /repos/{owner}/{repo}/releases/{release_id}/reactions/{reaction_id}"], + deleteForTeamDiscussion: ["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions/{reaction_id}"], + deleteForTeamDiscussionComment: ["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions/{reaction_id}"], + listForCommitComment: ["GET /repos/{owner}/{repo}/comments/{comment_id}/reactions"], + listForIssue: ["GET /repos/{owner}/{repo}/issues/{issue_number}/reactions"], + listForIssueComment: ["GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions"], + listForPullRequestReviewComment: ["GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions"], + listForRelease: ["GET /repos/{owner}/{repo}/releases/{release_id}/reactions"], + listForTeamDiscussionCommentInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions"], + listForTeamDiscussionInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions"] + }, + repos: { + acceptInvitation: ["PATCH /user/repository_invitations/{invitation_id}", {}, { + renamed: ["repos", "acceptInvitationForAuthenticatedUser"] + }], + acceptInvitationForAuthenticatedUser: ["PATCH /user/repository_invitations/{invitation_id}"], + addAppAccessRestrictions: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps", {}, { + mapToData: "apps" + }], + addCollaborator: ["PUT /repos/{owner}/{repo}/collaborators/{username}"], + addStatusCheckContexts: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts", {}, { + mapToData: "contexts" + }], + addTeamAccessRestrictions: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams", {}, { + mapToData: "teams" + }], + addUserAccessRestrictions: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users", {}, { + mapToData: "users" + }], + checkCollaborator: ["GET /repos/{owner}/{repo}/collaborators/{username}"], + checkVulnerabilityAlerts: ["GET /repos/{owner}/{repo}/vulnerability-alerts"], + codeownersErrors: ["GET /repos/{owner}/{repo}/codeowners/errors"], + compareCommits: ["GET /repos/{owner}/{repo}/compare/{base}...{head}"], + compareCommitsWithBasehead: ["GET /repos/{owner}/{repo}/compare/{basehead}"], + createAutolink: ["POST /repos/{owner}/{repo}/autolinks"], + createCommitComment: ["POST /repos/{owner}/{repo}/commits/{commit_sha}/comments"], + createCommitSignatureProtection: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures"], + createCommitStatus: ["POST /repos/{owner}/{repo}/statuses/{sha}"], + createDeployKey: ["POST /repos/{owner}/{repo}/keys"], + createDeployment: ["POST /repos/{owner}/{repo}/deployments"], + createDeploymentStatus: ["POST /repos/{owner}/{repo}/deployments/{deployment_id}/statuses"], + createDispatchEvent: ["POST /repos/{owner}/{repo}/dispatches"], + createForAuthenticatedUser: ["POST /user/repos"], + createFork: ["POST /repos/{owner}/{repo}/forks"], + createInOrg: ["POST /orgs/{org}/repos"], + createOrUpdateEnvironment: ["PUT /repos/{owner}/{repo}/environments/{environment_name}"], + createOrUpdateFileContents: ["PUT /repos/{owner}/{repo}/contents/{path}"], + createPagesSite: ["POST /repos/{owner}/{repo}/pages"], + createRelease: ["POST /repos/{owner}/{repo}/releases"], + createTagProtection: ["POST /repos/{owner}/{repo}/tags/protection"], + createUsingTemplate: ["POST /repos/{template_owner}/{template_repo}/generate"], + createWebhook: ["POST /repos/{owner}/{repo}/hooks"], + declineInvitation: ["DELETE /user/repository_invitations/{invitation_id}", {}, { + renamed: ["repos", "declineInvitationForAuthenticatedUser"] + }], + declineInvitationForAuthenticatedUser: ["DELETE /user/repository_invitations/{invitation_id}"], + delete: ["DELETE /repos/{owner}/{repo}"], + deleteAccessRestrictions: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions"], + deleteAdminBranchProtection: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins"], + deleteAnEnvironment: ["DELETE /repos/{owner}/{repo}/environments/{environment_name}"], + deleteAutolink: ["DELETE /repos/{owner}/{repo}/autolinks/{autolink_id}"], + deleteBranchProtection: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection"], + deleteCommitComment: ["DELETE /repos/{owner}/{repo}/comments/{comment_id}"], + deleteCommitSignatureProtection: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures"], + deleteDeployKey: ["DELETE /repos/{owner}/{repo}/keys/{key_id}"], + deleteDeployment: ["DELETE /repos/{owner}/{repo}/deployments/{deployment_id}"], + deleteFile: ["DELETE /repos/{owner}/{repo}/contents/{path}"], + deleteInvitation: ["DELETE /repos/{owner}/{repo}/invitations/{invitation_id}"], + deletePagesSite: ["DELETE /repos/{owner}/{repo}/pages"], + deletePullRequestReviewProtection: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews"], + deleteRelease: ["DELETE /repos/{owner}/{repo}/releases/{release_id}"], + deleteReleaseAsset: ["DELETE /repos/{owner}/{repo}/releases/assets/{asset_id}"], + deleteTagProtection: ["DELETE /repos/{owner}/{repo}/tags/protection/{tag_protection_id}"], + deleteWebhook: ["DELETE /repos/{owner}/{repo}/hooks/{hook_id}"], + disableAutomatedSecurityFixes: ["DELETE /repos/{owner}/{repo}/automated-security-fixes"], + disableLfsForRepo: ["DELETE /repos/{owner}/{repo}/lfs"], + disableVulnerabilityAlerts: ["DELETE /repos/{owner}/{repo}/vulnerability-alerts"], + downloadArchive: ["GET /repos/{owner}/{repo}/zipball/{ref}", {}, { + renamed: ["repos", "downloadZipballArchive"] + }], + downloadTarballArchive: ["GET /repos/{owner}/{repo}/tarball/{ref}"], + downloadZipballArchive: ["GET /repos/{owner}/{repo}/zipball/{ref}"], + enableAutomatedSecurityFixes: ["PUT /repos/{owner}/{repo}/automated-security-fixes"], + enableLfsForRepo: ["PUT /repos/{owner}/{repo}/lfs"], + enableVulnerabilityAlerts: ["PUT /repos/{owner}/{repo}/vulnerability-alerts"], + generateReleaseNotes: ["POST /repos/{owner}/{repo}/releases/generate-notes"], + get: ["GET /repos/{owner}/{repo}"], + getAccessRestrictions: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions"], + getAdminBranchProtection: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins"], + getAllEnvironments: ["GET /repos/{owner}/{repo}/environments"], + getAllStatusCheckContexts: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts"], + getAllTopics: ["GET /repos/{owner}/{repo}/topics"], + getAppsWithAccessToProtectedBranch: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps"], + getAutolink: ["GET /repos/{owner}/{repo}/autolinks/{autolink_id}"], + getBranch: ["GET /repos/{owner}/{repo}/branches/{branch}"], + getBranchProtection: ["GET /repos/{owner}/{repo}/branches/{branch}/protection"], + getClones: ["GET /repos/{owner}/{repo}/traffic/clones"], + getCodeFrequencyStats: ["GET /repos/{owner}/{repo}/stats/code_frequency"], + getCollaboratorPermissionLevel: ["GET /repos/{owner}/{repo}/collaborators/{username}/permission"], + getCombinedStatusForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/status"], + getCommit: ["GET /repos/{owner}/{repo}/commits/{ref}"], + getCommitActivityStats: ["GET /repos/{owner}/{repo}/stats/commit_activity"], + getCommitComment: ["GET /repos/{owner}/{repo}/comments/{comment_id}"], + getCommitSignatureProtection: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures"], + getCommunityProfileMetrics: ["GET /repos/{owner}/{repo}/community/profile"], + getContent: ["GET /repos/{owner}/{repo}/contents/{path}"], + getContributorsStats: ["GET /repos/{owner}/{repo}/stats/contributors"], + getDeployKey: ["GET /repos/{owner}/{repo}/keys/{key_id}"], + getDeployment: ["GET /repos/{owner}/{repo}/deployments/{deployment_id}"], + getDeploymentStatus: ["GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses/{status_id}"], + getEnvironment: ["GET /repos/{owner}/{repo}/environments/{environment_name}"], + getLatestPagesBuild: ["GET /repos/{owner}/{repo}/pages/builds/latest"], + getLatestRelease: ["GET /repos/{owner}/{repo}/releases/latest"], + getPages: ["GET /repos/{owner}/{repo}/pages"], + getPagesBuild: ["GET /repos/{owner}/{repo}/pages/builds/{build_id}"], + getPagesHealthCheck: ["GET /repos/{owner}/{repo}/pages/health"], + getParticipationStats: ["GET /repos/{owner}/{repo}/stats/participation"], + getPullRequestReviewProtection: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews"], + getPunchCardStats: ["GET /repos/{owner}/{repo}/stats/punch_card"], + getReadme: ["GET /repos/{owner}/{repo}/readme"], + getReadmeInDirectory: ["GET /repos/{owner}/{repo}/readme/{dir}"], + getRelease: ["GET /repos/{owner}/{repo}/releases/{release_id}"], + getReleaseAsset: ["GET /repos/{owner}/{repo}/releases/assets/{asset_id}"], + getReleaseByTag: ["GET /repos/{owner}/{repo}/releases/tags/{tag}"], + getStatusChecksProtection: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"], + getTeamsWithAccessToProtectedBranch: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams"], + getTopPaths: ["GET /repos/{owner}/{repo}/traffic/popular/paths"], + getTopReferrers: ["GET /repos/{owner}/{repo}/traffic/popular/referrers"], + getUsersWithAccessToProtectedBranch: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users"], + getViews: ["GET /repos/{owner}/{repo}/traffic/views"], + getWebhook: ["GET /repos/{owner}/{repo}/hooks/{hook_id}"], + getWebhookConfigForRepo: ["GET /repos/{owner}/{repo}/hooks/{hook_id}/config"], + getWebhookDelivery: ["GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}"], + listAutolinks: ["GET /repos/{owner}/{repo}/autolinks"], + listBranches: ["GET /repos/{owner}/{repo}/branches"], + listBranchesForHeadCommit: ["GET /repos/{owner}/{repo}/commits/{commit_sha}/branches-where-head"], + listCollaborators: ["GET /repos/{owner}/{repo}/collaborators"], + listCommentsForCommit: ["GET /repos/{owner}/{repo}/commits/{commit_sha}/comments"], + listCommitCommentsForRepo: ["GET /repos/{owner}/{repo}/comments"], + listCommitStatusesForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/statuses"], + listCommits: ["GET /repos/{owner}/{repo}/commits"], + listContributors: ["GET /repos/{owner}/{repo}/contributors"], + listDeployKeys: ["GET /repos/{owner}/{repo}/keys"], + listDeploymentStatuses: ["GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses"], + listDeployments: ["GET /repos/{owner}/{repo}/deployments"], + listForAuthenticatedUser: ["GET /user/repos"], + listForOrg: ["GET /orgs/{org}/repos"], + listForUser: ["GET /users/{username}/repos"], + listForks: ["GET /repos/{owner}/{repo}/forks"], + listInvitations: ["GET /repos/{owner}/{repo}/invitations"], + listInvitationsForAuthenticatedUser: ["GET /user/repository_invitations"], + listLanguages: ["GET /repos/{owner}/{repo}/languages"], + listPagesBuilds: ["GET /repos/{owner}/{repo}/pages/builds"], + listPublic: ["GET /repositories"], + listPullRequestsAssociatedWithCommit: ["GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls"], + listReleaseAssets: ["GET /repos/{owner}/{repo}/releases/{release_id}/assets"], + listReleases: ["GET /repos/{owner}/{repo}/releases"], + listTagProtection: ["GET /repos/{owner}/{repo}/tags/protection"], + listTags: ["GET /repos/{owner}/{repo}/tags"], + listTeams: ["GET /repos/{owner}/{repo}/teams"], + listWebhookDeliveries: ["GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries"], + listWebhooks: ["GET /repos/{owner}/{repo}/hooks"], + merge: ["POST /repos/{owner}/{repo}/merges"], + mergeUpstream: ["POST /repos/{owner}/{repo}/merge-upstream"], + pingWebhook: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/pings"], + redeliverWebhookDelivery: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}/attempts"], + removeAppAccessRestrictions: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps", {}, { + mapToData: "apps" + }], + removeCollaborator: ["DELETE /repos/{owner}/{repo}/collaborators/{username}"], + removeStatusCheckContexts: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts", {}, { + mapToData: "contexts" + }], + removeStatusCheckProtection: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"], + removeTeamAccessRestrictions: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams", {}, { + mapToData: "teams" + }], + removeUserAccessRestrictions: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users", {}, { + mapToData: "users" + }], + renameBranch: ["POST /repos/{owner}/{repo}/branches/{branch}/rename"], + replaceAllTopics: ["PUT /repos/{owner}/{repo}/topics"], + requestPagesBuild: ["POST /repos/{owner}/{repo}/pages/builds"], + setAdminBranchProtection: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins"], + setAppAccessRestrictions: ["PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps", {}, { + mapToData: "apps" + }], + setStatusCheckContexts: ["PUT /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts", {}, { + mapToData: "contexts" + }], + setTeamAccessRestrictions: ["PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams", {}, { + mapToData: "teams" + }], + setUserAccessRestrictions: ["PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users", {}, { + mapToData: "users" + }], + testPushWebhook: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/tests"], + transfer: ["POST /repos/{owner}/{repo}/transfer"], + update: ["PATCH /repos/{owner}/{repo}"], + updateBranchProtection: ["PUT /repos/{owner}/{repo}/branches/{branch}/protection"], + updateCommitComment: ["PATCH /repos/{owner}/{repo}/comments/{comment_id}"], + updateInformationAboutPagesSite: ["PUT /repos/{owner}/{repo}/pages"], + updateInvitation: ["PATCH /repos/{owner}/{repo}/invitations/{invitation_id}"], + updatePullRequestReviewProtection: ["PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews"], + updateRelease: ["PATCH /repos/{owner}/{repo}/releases/{release_id}"], + updateReleaseAsset: ["PATCH /repos/{owner}/{repo}/releases/assets/{asset_id}"], + updateStatusCheckPotection: ["PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks", {}, { + renamed: ["repos", "updateStatusCheckProtection"] + }], + updateStatusCheckProtection: ["PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"], + updateWebhook: ["PATCH /repos/{owner}/{repo}/hooks/{hook_id}"], + updateWebhookConfigForRepo: ["PATCH /repos/{owner}/{repo}/hooks/{hook_id}/config"], + uploadReleaseAsset: ["POST /repos/{owner}/{repo}/releases/{release_id}/assets{?name,label}", { + baseUrl: "https://uploads.github.com" + }] + }, + search: { + code: ["GET /search/code"], + commits: ["GET /search/commits"], + issuesAndPullRequests: ["GET /search/issues"], + labels: ["GET /search/labels"], + repos: ["GET /search/repositories"], + topics: ["GET /search/topics"], + users: ["GET /search/users"] + }, + secretScanning: { + getAlert: ["GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}"], + listAlertsForEnterprise: ["GET /enterprises/{enterprise}/secret-scanning/alerts"], + listAlertsForOrg: ["GET /orgs/{org}/secret-scanning/alerts"], + listAlertsForRepo: ["GET /repos/{owner}/{repo}/secret-scanning/alerts"], + listLocationsForAlert: ["GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations"], + updateAlert: ["PATCH /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}"] + }, + teams: { + addOrUpdateMembershipForUserInOrg: ["PUT /orgs/{org}/teams/{team_slug}/memberships/{username}"], + addOrUpdateProjectPermissionsInOrg: ["PUT /orgs/{org}/teams/{team_slug}/projects/{project_id}"], + addOrUpdateRepoPermissionsInOrg: ["PUT /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"], + checkPermissionsForProjectInOrg: ["GET /orgs/{org}/teams/{team_slug}/projects/{project_id}"], + checkPermissionsForRepoInOrg: ["GET /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"], + create: ["POST /orgs/{org}/teams"], + createDiscussionCommentInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments"], + createDiscussionInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions"], + deleteDiscussionCommentInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}"], + deleteDiscussionInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"], + deleteInOrg: ["DELETE /orgs/{org}/teams/{team_slug}"], + getByName: ["GET /orgs/{org}/teams/{team_slug}"], + getDiscussionCommentInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}"], + getDiscussionInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"], + getMembershipForUserInOrg: ["GET /orgs/{org}/teams/{team_slug}/memberships/{username}"], + list: ["GET /orgs/{org}/teams"], + listChildInOrg: ["GET /orgs/{org}/teams/{team_slug}/teams"], + listDiscussionCommentsInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments"], + listDiscussionsInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions"], + listForAuthenticatedUser: ["GET /user/teams"], + listMembersInOrg: ["GET /orgs/{org}/teams/{team_slug}/members"], + listPendingInvitationsInOrg: ["GET /orgs/{org}/teams/{team_slug}/invitations"], + listProjectsInOrg: ["GET /orgs/{org}/teams/{team_slug}/projects"], + listReposInOrg: ["GET /orgs/{org}/teams/{team_slug}/repos"], + removeMembershipForUserInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/memberships/{username}"], + removeProjectInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/projects/{project_id}"], + removeRepoInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"], + updateDiscussionCommentInOrg: ["PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}"], + updateDiscussionInOrg: ["PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"], + updateInOrg: ["PATCH /orgs/{org}/teams/{team_slug}"] + }, + users: { + addEmailForAuthenticated: ["POST /user/emails", {}, { + renamed: ["users", "addEmailForAuthenticatedUser"] + }], + addEmailForAuthenticatedUser: ["POST /user/emails"], + block: ["PUT /user/blocks/{username}"], + checkBlocked: ["GET /user/blocks/{username}"], + checkFollowingForUser: ["GET /users/{username}/following/{target_user}"], + checkPersonIsFollowedByAuthenticated: ["GET /user/following/{username}"], + createGpgKeyForAuthenticated: ["POST /user/gpg_keys", {}, { + renamed: ["users", "createGpgKeyForAuthenticatedUser"] + }], + createGpgKeyForAuthenticatedUser: ["POST /user/gpg_keys"], + createPublicSshKeyForAuthenticated: ["POST /user/keys", {}, { + renamed: ["users", "createPublicSshKeyForAuthenticatedUser"] + }], + createPublicSshKeyForAuthenticatedUser: ["POST /user/keys"], + deleteEmailForAuthenticated: ["DELETE /user/emails", {}, { + renamed: ["users", "deleteEmailForAuthenticatedUser"] + }], + deleteEmailForAuthenticatedUser: ["DELETE /user/emails"], + deleteGpgKeyForAuthenticated: ["DELETE /user/gpg_keys/{gpg_key_id}", {}, { + renamed: ["users", "deleteGpgKeyForAuthenticatedUser"] + }], + deleteGpgKeyForAuthenticatedUser: ["DELETE /user/gpg_keys/{gpg_key_id}"], + deletePublicSshKeyForAuthenticated: ["DELETE /user/keys/{key_id}", {}, { + renamed: ["users", "deletePublicSshKeyForAuthenticatedUser"] + }], + deletePublicSshKeyForAuthenticatedUser: ["DELETE /user/keys/{key_id}"], + follow: ["PUT /user/following/{username}"], + getAuthenticated: ["GET /user"], + getByUsername: ["GET /users/{username}"], + getContextForUser: ["GET /users/{username}/hovercard"], + getGpgKeyForAuthenticated: ["GET /user/gpg_keys/{gpg_key_id}", {}, { + renamed: ["users", "getGpgKeyForAuthenticatedUser"] + }], + getGpgKeyForAuthenticatedUser: ["GET /user/gpg_keys/{gpg_key_id}"], + getPublicSshKeyForAuthenticated: ["GET /user/keys/{key_id}", {}, { + renamed: ["users", "getPublicSshKeyForAuthenticatedUser"] + }], + getPublicSshKeyForAuthenticatedUser: ["GET /user/keys/{key_id}"], + list: ["GET /users"], + listBlockedByAuthenticated: ["GET /user/blocks", {}, { + renamed: ["users", "listBlockedByAuthenticatedUser"] + }], + listBlockedByAuthenticatedUser: ["GET /user/blocks"], + listEmailsForAuthenticated: ["GET /user/emails", {}, { + renamed: ["users", "listEmailsForAuthenticatedUser"] + }], + listEmailsForAuthenticatedUser: ["GET /user/emails"], + listFollowedByAuthenticated: ["GET /user/following", {}, { + renamed: ["users", "listFollowedByAuthenticatedUser"] + }], + listFollowedByAuthenticatedUser: ["GET /user/following"], + listFollowersForAuthenticatedUser: ["GET /user/followers"], + listFollowersForUser: ["GET /users/{username}/followers"], + listFollowingForUser: ["GET /users/{username}/following"], + listGpgKeysForAuthenticated: ["GET /user/gpg_keys", {}, { + renamed: ["users", "listGpgKeysForAuthenticatedUser"] + }], + listGpgKeysForAuthenticatedUser: ["GET /user/gpg_keys"], + listGpgKeysForUser: ["GET /users/{username}/gpg_keys"], + listPublicEmailsForAuthenticated: ["GET /user/public_emails", {}, { + renamed: ["users", "listPublicEmailsForAuthenticatedUser"] + }], + listPublicEmailsForAuthenticatedUser: ["GET /user/public_emails"], + listPublicKeysForUser: ["GET /users/{username}/keys"], + listPublicSshKeysForAuthenticated: ["GET /user/keys", {}, { + renamed: ["users", "listPublicSshKeysForAuthenticatedUser"] + }], + listPublicSshKeysForAuthenticatedUser: ["GET /user/keys"], + setPrimaryEmailVisibilityForAuthenticated: ["PATCH /user/email/visibility", {}, { + renamed: ["users", "setPrimaryEmailVisibilityForAuthenticatedUser"] + }], + setPrimaryEmailVisibilityForAuthenticatedUser: ["PATCH /user/email/visibility"], + unblock: ["DELETE /user/blocks/{username}"], + unfollow: ["DELETE /user/following/{username}"], + updateAuthenticated: ["PATCH /user"] + } +}; + +const VERSION = "5.16.2"; + +function endpointsToMethods(octokit, endpointsMap) { + const newMethods = {}; + + for (const [scope, endpoints] of Object.entries(endpointsMap)) { + for (const [methodName, endpoint] of Object.entries(endpoints)) { + const [route, defaults, decorations] = endpoint; + const [method, url] = route.split(/ /); + const endpointDefaults = Object.assign({ + method, + url + }, defaults); + + if (!newMethods[scope]) { + newMethods[scope] = {}; + } + + const scopeMethods = newMethods[scope]; + + if (decorations) { + scopeMethods[methodName] = decorate(octokit, scope, methodName, endpointDefaults, decorations); + continue; + } + + scopeMethods[methodName] = octokit.request.defaults(endpointDefaults); + } + } + + return newMethods; +} + +function decorate(octokit, scope, methodName, defaults, decorations) { + const requestWithDefaults = octokit.request.defaults(defaults); + /* istanbul ignore next */ + + function withDecorations(...args) { + // @ts-ignore https://github.com/microsoft/TypeScript/issues/25488 + let options = requestWithDefaults.endpoint.merge(...args); // There are currently no other decorations than `.mapToData` + + if (decorations.mapToData) { + options = Object.assign({}, options, { + data: options[decorations.mapToData], + [decorations.mapToData]: undefined + }); + return requestWithDefaults(options); + } + + if (decorations.renamed) { + const [newScope, newMethodName] = decorations.renamed; + octokit.log.warn(`octokit.${scope}.${methodName}() has been renamed to octokit.${newScope}.${newMethodName}()`); + } + + if (decorations.deprecated) { + octokit.log.warn(decorations.deprecated); + } + + if (decorations.renamedParameters) { + // @ts-ignore https://github.com/microsoft/TypeScript/issues/25488 + const options = requestWithDefaults.endpoint.merge(...args); + + for (const [name, alias] of Object.entries(decorations.renamedParameters)) { + if (name in options) { + octokit.log.warn(`"${name}" parameter is deprecated for "octokit.${scope}.${methodName}()". Use "${alias}" instead`); + + if (!(alias in options)) { + options[alias] = options[name]; + } + + delete options[name]; + } + } + + return requestWithDefaults(options); + } // @ts-ignore https://github.com/microsoft/TypeScript/issues/25488 + + + return requestWithDefaults(...args); + } + + return Object.assign(withDecorations, requestWithDefaults); +} + +function restEndpointMethods(octokit) { + const api = endpointsToMethods(octokit, Endpoints); + return { + rest: api + }; +} +restEndpointMethods.VERSION = VERSION; +function legacyRestEndpointMethods(octokit) { + const api = endpointsToMethods(octokit, Endpoints); + return _objectSpread2(_objectSpread2({}, api), {}, { + rest: api + }); +} +legacyRestEndpointMethods.VERSION = VERSION; + +exports.legacyRestEndpointMethods = legacyRestEndpointMethods; +exports.restEndpointMethods = restEndpointMethods; +//# sourceMappingURL=index.js.map + + +/***/ }), + +/***/ 9968: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ value: true })); + +function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } + +var BottleneckLight = _interopDefault(__nccwpck_require__(1174)); + +const VERSION = "4.1.0"; + +const noop = () => Promise.resolve(); // @ts-expect-error + + +function wrapRequest(state, request, options) { + return state.retryLimiter.schedule(doRequest, state, request, options); +} // @ts-expect-error + +async function doRequest(state, request, options) { + const isWrite = options.method !== "GET" && options.method !== "HEAD"; + const { + pathname + } = new URL(options.url, "http://github.test"); + const isSearch = options.method === "GET" && pathname.startsWith("/search/"); + const isGraphQL = pathname.startsWith("/graphql"); + const retryCount = ~~options.request.retryCount; + const jobOptions = retryCount > 0 ? { + priority: 0, + weight: 0 + } : {}; + + if (state.clustering) { + // Remove a job from Redis if it has not completed or failed within 60s + // Examples: Node process terminated, client disconnected, etc. + // @ts-expect-error + jobOptions.expiration = 1000 * 60; + } // Guarantee at least 1000ms between writes + // GraphQL can also trigger writes + + + if (isWrite || isGraphQL) { + await state.write.key(state.id).schedule(jobOptions, noop); + } // Guarantee at least 3000ms between requests that trigger notifications + + + if (isWrite && state.triggersNotification(pathname)) { + await state.notifications.key(state.id).schedule(jobOptions, noop); + } // Guarantee at least 2000ms between search requests + + + if (isSearch) { + await state.search.key(state.id).schedule(jobOptions, noop); + } + + const req = state.global.key(state.id).schedule(jobOptions, request, options); + + if (isGraphQL) { + const res = await req; + + if (res.data.errors != null && // @ts-expect-error + res.data.errors.some(error => error.type === "RATE_LIMITED")) { + const error = Object.assign(new Error("GraphQL Rate Limit Exceeded"), { + response: res, + data: res.data + }); + throw error; + } + } + + return req; +} + +var triggersNotificationPaths = ["/orgs/{org}/invitations", "/orgs/{org}/invitations/{invitation_id}", "/orgs/{org}/teams/{team_slug}/discussions", "/orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments", "/repos/{owner}/{repo}/collaborators/{username}", "/repos/{owner}/{repo}/commits/{commit_sha}/comments", "/repos/{owner}/{repo}/issues", "/repos/{owner}/{repo}/issues/{issue_number}/comments", "/repos/{owner}/{repo}/pulls", "/repos/{owner}/{repo}/pulls/{pull_number}/comments", "/repos/{owner}/{repo}/pulls/{pull_number}/comments/{comment_id}/replies", "/repos/{owner}/{repo}/pulls/{pull_number}/merge", "/repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers", "/repos/{owner}/{repo}/pulls/{pull_number}/reviews", "/repos/{owner}/{repo}/releases", "/teams/{team_id}/discussions", "/teams/{team_id}/discussions/{discussion_number}/comments"]; + +function routeMatcher(paths) { + // EXAMPLE. For the following paths: + + /* [ + "/orgs/{org}/invitations", + "/repos/{owner}/{repo}/collaborators/{username}" + ] */ + const regexes = paths.map(path => path.split("/").map(c => c.startsWith("{") ? "(?:.+?)" : c).join("/")); // 'regexes' would contain: + + /* [ + '/orgs/(?:.+?)/invitations', + '/repos/(?:.+?)/(?:.+?)/collaborators/(?:.+?)' + ] */ + + const regex = `^(?:${regexes.map(r => `(?:${r})`).join("|")})[^/]*$`; // 'regex' would contain: + + /* + ^(?:(?:\/orgs\/(?:.+?)\/invitations)|(?:\/repos\/(?:.+?)\/(?:.+?)\/collaborators\/(?:.+?)))[^\/]*$ + It may look scary, but paste it into https://www.debuggex.com/ + and it will make a lot more sense! + */ + + return new RegExp(regex, "i"); +} + +// @ts-expect-error + +const regex = routeMatcher(triggersNotificationPaths); +const triggersNotification = regex.test.bind(regex); +const groups = {}; // @ts-expect-error + +const createGroups = function (Bottleneck, common) { + groups.global = new Bottleneck.Group({ + id: "octokit-global", + maxConcurrent: 10, + ...common + }); + groups.search = new Bottleneck.Group({ + id: "octokit-search", + maxConcurrent: 1, + minTime: 2000, + ...common + }); + groups.write = new Bottleneck.Group({ + id: "octokit-write", + maxConcurrent: 1, + minTime: 1000, + ...common + }); + groups.notifications = new Bottleneck.Group({ + id: "octokit-notifications", + maxConcurrent: 1, + minTime: 3000, + ...common + }); +}; + +function throttling(octokit, octokitOptions) { + const { + enabled = true, + Bottleneck = BottleneckLight, + id = "no-id", + timeout = 1000 * 60 * 2, + // Redis TTL: 2 minutes + connection + } = octokitOptions.throttle || {}; + + if (!enabled) { + return {}; + } + + const common = { + connection, + timeout + }; + + if (groups.global == null) { + createGroups(Bottleneck, common); + } + + const state = Object.assign({ + clustering: connection != null, + triggersNotification, + minimumSecondaryRateRetryAfter: 5, + retryAfterBaseValue: 1000, + retryLimiter: new Bottleneck(), + id, + ...groups + }, octokitOptions.throttle); + const isUsingDeprecatedOnAbuseLimitHandler = typeof state.onAbuseLimit === "function" && state.onAbuseLimit; + + if (typeof (isUsingDeprecatedOnAbuseLimitHandler ? state.onAbuseLimit : state.onSecondaryRateLimit) !== "function" || typeof state.onRateLimit !== "function") { + throw new Error(`octokit/plugin-throttling error: + You must pass the onSecondaryRateLimit and onRateLimit error handlers. + See https://github.com/octokit/rest.js#throttling + + const octokit = new Octokit({ + throttle: { + onSecondaryRateLimit: (retryAfter, options) => {/* ... */}, + onRateLimit: (retryAfter, options) => {/* ... */} + } + }) + `); + } + + const events = {}; + const emitter = new Bottleneck.Events(events); // @ts-expect-error + + events.on("secondary-limit", isUsingDeprecatedOnAbuseLimitHandler ? function (...args) { + octokit.log.warn("[@octokit/plugin-throttling] `onAbuseLimit()` is deprecated and will be removed in a future release of `@octokit/plugin-throttling`, please use the `onSecondaryRateLimit` handler instead"); + return state.onAbuseLimit(...args); + } : state.onSecondaryRateLimit); // @ts-expect-error + + events.on("rate-limit", state.onRateLimit); // @ts-expect-error + + events.on("error", e => octokit.log.warn("Error in throttling-plugin limit handler", e)); // @ts-expect-error + + state.retryLimiter.on("failed", async function (error, info) { + const options = info.args[info.args.length - 1]; + const { + pathname + } = new URL(options.url, "http://github.test"); + const shouldRetryGraphQL = pathname.startsWith("/graphql") && error.status !== 401; + + if (!(shouldRetryGraphQL || error.status === 403)) { + return; + } + + const retryCount = ~~options.request.retryCount; + options.request.retryCount = retryCount; + const { + wantRetry, + retryAfter = 0 + } = await async function () { + if (/\bsecondary rate\b/i.test(error.message)) { + // The user has hit the secondary rate limit. (REST and GraphQL) + // https://docs.github.com/en/rest/overview/resources-in-the-rest-api#secondary-rate-limits + // The Retry-After header can sometimes be blank when hitting a secondary rate limit, + // but is always present after 2-3s, so make sure to set `retryAfter` to at least 5s by default. + const retryAfter = Math.max(~~error.response.headers["retry-after"], state.minimumSecondaryRateRetryAfter); + const wantRetry = await emitter.trigger("secondary-limit", retryAfter, options, octokit); + return { + wantRetry, + retryAfter + }; + } + + if (error.response.headers != null && error.response.headers["x-ratelimit-remaining"] === "0") { + // The user has used all their allowed calls for the current time period (REST and GraphQL) + // https://docs.github.com/en/rest/reference/rate-limit (REST) + // https://docs.github.com/en/graphql/overview/resource-limitations#rate-limit (GraphQL) + const rateLimitReset = new Date(~~error.response.headers["x-ratelimit-reset"] * 1000).getTime(); + const retryAfter = Math.max(Math.ceil((rateLimitReset - Date.now()) / 1000), 0); + const wantRetry = await emitter.trigger("rate-limit", retryAfter, options, octokit); + return { + wantRetry, + retryAfter + }; + } + + return {}; + }(); + + if (wantRetry) { + options.request.retryCount++; + return retryAfter * state.retryAfterBaseValue; + } + }); + octokit.hook.wrap("request", wrapRequest.bind(null, state)); + return {}; +} +throttling.VERSION = VERSION; +throttling.triggersNotification = triggersNotification; + +exports.throttling = throttling; +//# sourceMappingURL=index.js.map + + +/***/ }), + +/***/ 3682: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +var register = __nccwpck_require__(4670) +var addHook = __nccwpck_require__(5549) +var removeHook = __nccwpck_require__(6819) + +// bind with array of arguments: https://stackoverflow.com/a/21792913 +var bind = Function.bind +var bindable = bind.bind(bind) + +function bindApi (hook, state, name) { + var removeHookRef = bindable(removeHook, null).apply(null, name ? [state, name] : [state]) + hook.api = { remove: removeHookRef } + hook.remove = removeHookRef + + ;['before', 'error', 'after', 'wrap'].forEach(function (kind) { + var args = name ? [state, kind, name] : [state, kind] + hook[kind] = hook.api[kind] = bindable(addHook, null).apply(null, args) + }) +} + +function HookSingular () { + var singularHookName = 'h' + var singularHookState = { + registry: {} + } + var singularHook = register.bind(null, singularHookState, singularHookName) + bindApi(singularHook, singularHookState, singularHookName) + return singularHook +} + +function HookCollection () { + var state = { + registry: {} + } + + var hook = register.bind(null, state) + bindApi(hook, state) + + return hook +} + +var collectionHookDeprecationMessageDisplayed = false +function Hook () { + if (!collectionHookDeprecationMessageDisplayed) { + console.warn('[before-after-hook]: "Hook()" repurposing warning, use "Hook.Collection()". Read more: https://git.io/upgrade-before-after-hook-to-1.4') + collectionHookDeprecationMessageDisplayed = true + } + return HookCollection() +} + +Hook.Singular = HookSingular.bind() +Hook.Collection = HookCollection.bind() + +module.exports = Hook +// expose constructors as a named property for TypeScript +module.exports.Hook = Hook +module.exports.Singular = Hook.Singular +module.exports.Collection = Hook.Collection + + +/***/ }), + +/***/ 5549: +/***/ ((module) => { + +module.exports = addHook; + +function addHook(state, kind, name, hook) { + var orig = hook; + if (!state.registry[name]) { + state.registry[name] = []; + } + + if (kind === "before") { + hook = function (method, options) { + return Promise.resolve() + .then(orig.bind(null, options)) + .then(method.bind(null, options)); + }; + } + + if (kind === "after") { + hook = function (method, options) { + var result; + return Promise.resolve() + .then(method.bind(null, options)) + .then(function (result_) { + result = result_; + return orig(result, options); + }) + .then(function () { + return result; + }); + }; + } + + if (kind === "error") { + hook = function (method, options) { + return Promise.resolve() + .then(method.bind(null, options)) + .catch(function (error) { + return orig(error, options); + }); + }; + } + + state.registry[name].push({ + hook: hook, + orig: orig, + }); +} + + +/***/ }), + +/***/ 4670: +/***/ ((module) => { + +module.exports = register; + +function register(state, name, method, options) { + if (typeof method !== "function") { + throw new Error("method for before hook must be a function"); + } + + if (!options) { + options = {}; + } + + if (Array.isArray(name)) { + return name.reverse().reduce(function (callback, name) { + return register.bind(null, state, name, callback, options); + }, method)(); + } + + return Promise.resolve().then(function () { + if (!state.registry[name]) { + return method(options); + } + + return state.registry[name].reduce(function (method, registered) { + return registered.hook.bind(null, method, options); + }, method)(); + }); +} + + +/***/ }), + +/***/ 6819: +/***/ ((module) => { + +module.exports = removeHook; + +function removeHook(state, name, method) { + if (!state.registry[name]) { + return; + } + + var index = state.registry[name] + .map(function (registered) { + return registered.orig; + }) + .indexOf(method); + + if (index === -1) { + return; + } + + state.registry[name].splice(index, 1); +} + + +/***/ }), + +/***/ 1174: +/***/ (function(module) { + +/** + * This file contains the Bottleneck library (MIT), compiled to ES2017, and without Clustering support. + * https://github.com/SGrondin/bottleneck + */ +(function (global, factory) { + true ? module.exports = factory() : + 0; +}(this, (function () { 'use strict'; + + var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; + + function getCjsExportFromNamespace (n) { + return n && n['default'] || n; + } + + var load = function(received, defaults, onto = {}) { + var k, ref, v; + for (k in defaults) { + v = defaults[k]; + onto[k] = (ref = received[k]) != null ? ref : v; + } + return onto; + }; + + var overwrite = function(received, defaults, onto = {}) { + var k, v; + for (k in received) { + v = received[k]; + if (defaults[k] !== void 0) { + onto[k] = v; + } + } + return onto; + }; + + var parser = { + load: load, + overwrite: overwrite + }; + + var DLList; + + DLList = class DLList { + constructor(incr, decr) { + this.incr = incr; + this.decr = decr; + this._first = null; + this._last = null; + this.length = 0; + } + + push(value) { + var node; + this.length++; + if (typeof this.incr === "function") { + this.incr(); + } + node = { + value, + prev: this._last, + next: null + }; + if (this._last != null) { + this._last.next = node; + this._last = node; + } else { + this._first = this._last = node; + } + return void 0; + } + + shift() { + var value; + if (this._first == null) { + return; + } else { + this.length--; + if (typeof this.decr === "function") { + this.decr(); + } + } + value = this._first.value; + if ((this._first = this._first.next) != null) { + this._first.prev = null; + } else { + this._last = null; + } + return value; + } + + first() { + if (this._first != null) { + return this._first.value; + } + } + + getArray() { + var node, ref, results; + node = this._first; + results = []; + while (node != null) { + results.push((ref = node, node = node.next, ref.value)); + } + return results; + } + + forEachShift(cb) { + var node; + node = this.shift(); + while (node != null) { + (cb(node), node = this.shift()); + } + return void 0; + } + + debug() { + var node, ref, ref1, ref2, results; + node = this._first; + results = []; + while (node != null) { + results.push((ref = node, node = node.next, { + value: ref.value, + prev: (ref1 = ref.prev) != null ? ref1.value : void 0, + next: (ref2 = ref.next) != null ? ref2.value : void 0 + })); + } + return results; + } + + }; + + var DLList_1 = DLList; + + var Events; + + Events = class Events { + constructor(instance) { + this.instance = instance; + this._events = {}; + if ((this.instance.on != null) || (this.instance.once != null) || (this.instance.removeAllListeners != null)) { + throw new Error("An Emitter already exists for this object"); + } + this.instance.on = (name, cb) => { + return this._addListener(name, "many", cb); + }; + this.instance.once = (name, cb) => { + return this._addListener(name, "once", cb); + }; + this.instance.removeAllListeners = (name = null) => { + if (name != null) { + return delete this._events[name]; + } else { + return this._events = {}; + } + }; + } + + _addListener(name, status, cb) { + var base; + if ((base = this._events)[name] == null) { + base[name] = []; + } + this._events[name].push({cb, status}); + return this.instance; + } + + listenerCount(name) { + if (this._events[name] != null) { + return this._events[name].length; + } else { + return 0; + } + } + + async trigger(name, ...args) { + var e, promises; + try { + if (name !== "debug") { + this.trigger("debug", `Event triggered: ${name}`, args); + } + if (this._events[name] == null) { + return; + } + this._events[name] = this._events[name].filter(function(listener) { + return listener.status !== "none"; + }); + promises = this._events[name].map(async(listener) => { + var e, returned; + if (listener.status === "none") { + return; + } + if (listener.status === "once") { + listener.status = "none"; + } + try { + returned = typeof listener.cb === "function" ? listener.cb(...args) : void 0; + if (typeof (returned != null ? returned.then : void 0) === "function") { + return (await returned); + } else { + return returned; + } + } catch (error) { + e = error; + { + this.trigger("error", e); + } + return null; + } + }); + return ((await Promise.all(promises))).find(function(x) { + return x != null; + }); + } catch (error) { + e = error; + { + this.trigger("error", e); + } + return null; + } + } + + }; + + var Events_1 = Events; + + var DLList$1, Events$1, Queues; + + DLList$1 = DLList_1; + + Events$1 = Events_1; + + Queues = class Queues { + constructor(num_priorities) { + var i; + this.Events = new Events$1(this); + this._length = 0; + this._lists = (function() { + var j, ref, results; + results = []; + for (i = j = 1, ref = num_priorities; (1 <= ref ? j <= ref : j >= ref); i = 1 <= ref ? ++j : --j) { + results.push(new DLList$1((() => { + return this.incr(); + }), (() => { + return this.decr(); + }))); + } + return results; + }).call(this); + } + + incr() { + if (this._length++ === 0) { + return this.Events.trigger("leftzero"); + } + } + + decr() { + if (--this._length === 0) { + return this.Events.trigger("zero"); + } + } + + push(job) { + return this._lists[job.options.priority].push(job); + } + + queued(priority) { + if (priority != null) { + return this._lists[priority].length; + } else { + return this._length; + } + } + + shiftAll(fn) { + return this._lists.forEach(function(list) { + return list.forEachShift(fn); + }); + } + + getFirst(arr = this._lists) { + var j, len, list; + for (j = 0, len = arr.length; j < len; j++) { + list = arr[j]; + if (list.length > 0) { + return list; + } + } + return []; + } + + shiftLastFrom(priority) { + return this.getFirst(this._lists.slice(priority).reverse()).shift(); + } + + }; + + var Queues_1 = Queues; + + var BottleneckError; + + BottleneckError = class BottleneckError extends Error {}; + + var BottleneckError_1 = BottleneckError; + + var BottleneckError$1, DEFAULT_PRIORITY, Job, NUM_PRIORITIES, parser$1; + + NUM_PRIORITIES = 10; + + DEFAULT_PRIORITY = 5; + + parser$1 = parser; + + BottleneckError$1 = BottleneckError_1; + + Job = class Job { + constructor(task, args, options, jobDefaults, rejectOnDrop, Events, _states, Promise) { + this.task = task; + this.args = args; + this.rejectOnDrop = rejectOnDrop; + this.Events = Events; + this._states = _states; + this.Promise = Promise; + this.options = parser$1.load(options, jobDefaults); + this.options.priority = this._sanitizePriority(this.options.priority); + if (this.options.id === jobDefaults.id) { + this.options.id = `${this.options.id}-${this._randomIndex()}`; + } + this.promise = new this.Promise((_resolve, _reject) => { + this._resolve = _resolve; + this._reject = _reject; + }); + this.retryCount = 0; + } + + _sanitizePriority(priority) { + var sProperty; + sProperty = ~~priority !== priority ? DEFAULT_PRIORITY : priority; + if (sProperty < 0) { + return 0; + } else if (sProperty > NUM_PRIORITIES - 1) { + return NUM_PRIORITIES - 1; + } else { + return sProperty; + } + } + + _randomIndex() { + return Math.random().toString(36).slice(2); + } + + doDrop({error, message = "This job has been dropped by Bottleneck"} = {}) { + if (this._states.remove(this.options.id)) { + if (this.rejectOnDrop) { + this._reject(error != null ? error : new BottleneckError$1(message)); + } + this.Events.trigger("dropped", {args: this.args, options: this.options, task: this.task, promise: this.promise}); + return true; + } else { + return false; + } + } + + _assertStatus(expected) { + var status; + status = this._states.jobStatus(this.options.id); + if (!(status === expected || (expected === "DONE" && status === null))) { + throw new BottleneckError$1(`Invalid job status ${status}, expected ${expected}. Please open an issue at https://github.com/SGrondin/bottleneck/issues`); + } + } + + doReceive() { + this._states.start(this.options.id); + return this.Events.trigger("received", {args: this.args, options: this.options}); + } + + doQueue(reachedHWM, blocked) { + this._assertStatus("RECEIVED"); + this._states.next(this.options.id); + return this.Events.trigger("queued", {args: this.args, options: this.options, reachedHWM, blocked}); + } + + doRun() { + if (this.retryCount === 0) { + this._assertStatus("QUEUED"); + this._states.next(this.options.id); + } else { + this._assertStatus("EXECUTING"); + } + return this.Events.trigger("scheduled", {args: this.args, options: this.options}); + } + + async doExecute(chained, clearGlobalState, run, free) { + var error, eventInfo, passed; + if (this.retryCount === 0) { + this._assertStatus("RUNNING"); + this._states.next(this.options.id); + } else { + this._assertStatus("EXECUTING"); + } + eventInfo = {args: this.args, options: this.options, retryCount: this.retryCount}; + this.Events.trigger("executing", eventInfo); + try { + passed = (await (chained != null ? chained.schedule(this.options, this.task, ...this.args) : this.task(...this.args))); + if (clearGlobalState()) { + this.doDone(eventInfo); + await free(this.options, eventInfo); + this._assertStatus("DONE"); + return this._resolve(passed); + } + } catch (error1) { + error = error1; + return this._onFailure(error, eventInfo, clearGlobalState, run, free); + } + } + + doExpire(clearGlobalState, run, free) { + var error, eventInfo; + if (this._states.jobStatus(this.options.id === "RUNNING")) { + this._states.next(this.options.id); + } + this._assertStatus("EXECUTING"); + eventInfo = {args: this.args, options: this.options, retryCount: this.retryCount}; + error = new BottleneckError$1(`This job timed out after ${this.options.expiration} ms.`); + return this._onFailure(error, eventInfo, clearGlobalState, run, free); + } + + async _onFailure(error, eventInfo, clearGlobalState, run, free) { + var retry, retryAfter; + if (clearGlobalState()) { + retry = (await this.Events.trigger("failed", error, eventInfo)); + if (retry != null) { + retryAfter = ~~retry; + this.Events.trigger("retry", `Retrying ${this.options.id} after ${retryAfter} ms`, eventInfo); + this.retryCount++; + return run(retryAfter); + } else { + this.doDone(eventInfo); + await free(this.options, eventInfo); + this._assertStatus("DONE"); + return this._reject(error); + } + } + } + + doDone(eventInfo) { + this._assertStatus("EXECUTING"); + this._states.next(this.options.id); + return this.Events.trigger("done", eventInfo); + } + + }; + + var Job_1 = Job; + + var BottleneckError$2, LocalDatastore, parser$2; + + parser$2 = parser; + + BottleneckError$2 = BottleneckError_1; + + LocalDatastore = class LocalDatastore { + constructor(instance, storeOptions, storeInstanceOptions) { + this.instance = instance; + this.storeOptions = storeOptions; + this.clientId = this.instance._randomIndex(); + parser$2.load(storeInstanceOptions, storeInstanceOptions, this); + this._nextRequest = this._lastReservoirRefresh = this._lastReservoirIncrease = Date.now(); + this._running = 0; + this._done = 0; + this._unblockTime = 0; + this.ready = this.Promise.resolve(); + this.clients = {}; + this._startHeartbeat(); + } + + _startHeartbeat() { + var base; + if ((this.heartbeat == null) && (((this.storeOptions.reservoirRefreshInterval != null) && (this.storeOptions.reservoirRefreshAmount != null)) || ((this.storeOptions.reservoirIncreaseInterval != null) && (this.storeOptions.reservoirIncreaseAmount != null)))) { + return typeof (base = (this.heartbeat = setInterval(() => { + var amount, incr, maximum, now, reservoir; + now = Date.now(); + if ((this.storeOptions.reservoirRefreshInterval != null) && now >= this._lastReservoirRefresh + this.storeOptions.reservoirRefreshInterval) { + this._lastReservoirRefresh = now; + this.storeOptions.reservoir = this.storeOptions.reservoirRefreshAmount; + this.instance._drainAll(this.computeCapacity()); + } + if ((this.storeOptions.reservoirIncreaseInterval != null) && now >= this._lastReservoirIncrease + this.storeOptions.reservoirIncreaseInterval) { + ({ + reservoirIncreaseAmount: amount, + reservoirIncreaseMaximum: maximum, + reservoir + } = this.storeOptions); + this._lastReservoirIncrease = now; + incr = maximum != null ? Math.min(amount, maximum - reservoir) : amount; + if (incr > 0) { + this.storeOptions.reservoir += incr; + return this.instance._drainAll(this.computeCapacity()); + } + } + }, this.heartbeatInterval))).unref === "function" ? base.unref() : void 0; + } else { + return clearInterval(this.heartbeat); + } + } + + async __publish__(message) { + await this.yieldLoop(); + return this.instance.Events.trigger("message", message.toString()); + } + + async __disconnect__(flush) { + await this.yieldLoop(); + clearInterval(this.heartbeat); + return this.Promise.resolve(); + } + + yieldLoop(t = 0) { + return new this.Promise(function(resolve, reject) { + return setTimeout(resolve, t); + }); + } + + computePenalty() { + var ref; + return (ref = this.storeOptions.penalty) != null ? ref : (15 * this.storeOptions.minTime) || 5000; + } + + async __updateSettings__(options) { + await this.yieldLoop(); + parser$2.overwrite(options, options, this.storeOptions); + this._startHeartbeat(); + this.instance._drainAll(this.computeCapacity()); + return true; + } + + async __running__() { + await this.yieldLoop(); + return this._running; + } + + async __queued__() { + await this.yieldLoop(); + return this.instance.queued(); + } + + async __done__() { + await this.yieldLoop(); + return this._done; + } + + async __groupCheck__(time) { + await this.yieldLoop(); + return (this._nextRequest + this.timeout) < time; + } + + computeCapacity() { + var maxConcurrent, reservoir; + ({maxConcurrent, reservoir} = this.storeOptions); + if ((maxConcurrent != null) && (reservoir != null)) { + return Math.min(maxConcurrent - this._running, reservoir); + } else if (maxConcurrent != null) { + return maxConcurrent - this._running; + } else if (reservoir != null) { + return reservoir; + } else { + return null; + } + } + + conditionsCheck(weight) { + var capacity; + capacity = this.computeCapacity(); + return (capacity == null) || weight <= capacity; + } + + async __incrementReservoir__(incr) { + var reservoir; + await this.yieldLoop(); + reservoir = this.storeOptions.reservoir += incr; + this.instance._drainAll(this.computeCapacity()); + return reservoir; + } + + async __currentReservoir__() { + await this.yieldLoop(); + return this.storeOptions.reservoir; + } + + isBlocked(now) { + return this._unblockTime >= now; + } + + check(weight, now) { + return this.conditionsCheck(weight) && (this._nextRequest - now) <= 0; + } + + async __check__(weight) { + var now; + await this.yieldLoop(); + now = Date.now(); + return this.check(weight, now); + } + + async __register__(index, weight, expiration) { + var now, wait; + await this.yieldLoop(); + now = Date.now(); + if (this.conditionsCheck(weight)) { + this._running += weight; + if (this.storeOptions.reservoir != null) { + this.storeOptions.reservoir -= weight; + } + wait = Math.max(this._nextRequest - now, 0); + this._nextRequest = now + wait + this.storeOptions.minTime; + return { + success: true, + wait, + reservoir: this.storeOptions.reservoir + }; + } else { + return { + success: false + }; + } + } + + strategyIsBlock() { + return this.storeOptions.strategy === 3; + } + + async __submit__(queueLength, weight) { + var blocked, now, reachedHWM; + await this.yieldLoop(); + if ((this.storeOptions.maxConcurrent != null) && weight > this.storeOptions.maxConcurrent) { + throw new BottleneckError$2(`Impossible to add a job having a weight of ${weight} to a limiter having a maxConcurrent setting of ${this.storeOptions.maxConcurrent}`); + } + now = Date.now(); + reachedHWM = (this.storeOptions.highWater != null) && queueLength === this.storeOptions.highWater && !this.check(weight, now); + blocked = this.strategyIsBlock() && (reachedHWM || this.isBlocked(now)); + if (blocked) { + this._unblockTime = now + this.computePenalty(); + this._nextRequest = this._unblockTime + this.storeOptions.minTime; + this.instance._dropAllQueued(); + } + return { + reachedHWM, + blocked, + strategy: this.storeOptions.strategy + }; + } + + async __free__(index, weight) { + await this.yieldLoop(); + this._running -= weight; + this._done += weight; + this.instance._drainAll(this.computeCapacity()); + return { + running: this._running + }; + } + + }; + + var LocalDatastore_1 = LocalDatastore; + + var BottleneckError$3, States; + + BottleneckError$3 = BottleneckError_1; + + States = class States { + constructor(status1) { + this.status = status1; + this._jobs = {}; + this.counts = this.status.map(function() { + return 0; + }); + } + + next(id) { + var current, next; + current = this._jobs[id]; + next = current + 1; + if ((current != null) && next < this.status.length) { + this.counts[current]--; + this.counts[next]++; + return this._jobs[id]++; + } else if (current != null) { + this.counts[current]--; + return delete this._jobs[id]; + } + } + + start(id) { + var initial; + initial = 0; + this._jobs[id] = initial; + return this.counts[initial]++; + } + + remove(id) { + var current; + current = this._jobs[id]; + if (current != null) { + this.counts[current]--; + delete this._jobs[id]; + } + return current != null; + } + + jobStatus(id) { + var ref; + return (ref = this.status[this._jobs[id]]) != null ? ref : null; + } + + statusJobs(status) { + var k, pos, ref, results, v; + if (status != null) { + pos = this.status.indexOf(status); + if (pos < 0) { + throw new BottleneckError$3(`status must be one of ${this.status.join(', ')}`); + } + ref = this._jobs; + results = []; + for (k in ref) { + v = ref[k]; + if (v === pos) { + results.push(k); + } + } + return results; + } else { + return Object.keys(this._jobs); + } + } + + statusCounts() { + return this.counts.reduce(((acc, v, i) => { + acc[this.status[i]] = v; + return acc; + }), {}); + } + + }; + + var States_1 = States; + + var DLList$2, Sync; + + DLList$2 = DLList_1; + + Sync = class Sync { + constructor(name, Promise) { + this.schedule = this.schedule.bind(this); + this.name = name; + this.Promise = Promise; + this._running = 0; + this._queue = new DLList$2(); + } + + isEmpty() { + return this._queue.length === 0; + } + + async _tryToRun() { + var args, cb, error, reject, resolve, returned, task; + if ((this._running < 1) && this._queue.length > 0) { + this._running++; + ({task, args, resolve, reject} = this._queue.shift()); + cb = (await (async function() { + try { + returned = (await task(...args)); + return function() { + return resolve(returned); + }; + } catch (error1) { + error = error1; + return function() { + return reject(error); + }; + } + })()); + this._running--; + this._tryToRun(); + return cb(); + } + } + + schedule(task, ...args) { + var promise, reject, resolve; + resolve = reject = null; + promise = new this.Promise(function(_resolve, _reject) { + resolve = _resolve; + return reject = _reject; + }); + this._queue.push({task, args, resolve, reject}); + this._tryToRun(); + return promise; + } + + }; + + var Sync_1 = Sync; + + var version = "2.19.5"; + var version$1 = { + version: version + }; + + var version$2 = /*#__PURE__*/Object.freeze({ + version: version, + default: version$1 + }); + + var require$$2 = () => console.log('You must import the full version of Bottleneck in order to use this feature.'); + + var require$$3 = () => console.log('You must import the full version of Bottleneck in order to use this feature.'); + + var require$$4 = () => console.log('You must import the full version of Bottleneck in order to use this feature.'); + + var Events$2, Group, IORedisConnection$1, RedisConnection$1, Scripts$1, parser$3; + + parser$3 = parser; + + Events$2 = Events_1; + + RedisConnection$1 = require$$2; + + IORedisConnection$1 = require$$3; + + Scripts$1 = require$$4; + + Group = (function() { + class Group { + constructor(limiterOptions = {}) { + this.deleteKey = this.deleteKey.bind(this); + this.limiterOptions = limiterOptions; + parser$3.load(this.limiterOptions, this.defaults, this); + this.Events = new Events$2(this); + this.instances = {}; + this.Bottleneck = Bottleneck_1; + this._startAutoCleanup(); + this.sharedConnection = this.connection != null; + if (this.connection == null) { + if (this.limiterOptions.datastore === "redis") { + this.connection = new RedisConnection$1(Object.assign({}, this.limiterOptions, {Events: this.Events})); + } else if (this.limiterOptions.datastore === "ioredis") { + this.connection = new IORedisConnection$1(Object.assign({}, this.limiterOptions, {Events: this.Events})); + } + } + } + + key(key = "") { + var ref; + return (ref = this.instances[key]) != null ? ref : (() => { + var limiter; + limiter = this.instances[key] = new this.Bottleneck(Object.assign(this.limiterOptions, { + id: `${this.id}-${key}`, + timeout: this.timeout, + connection: this.connection + })); + this.Events.trigger("created", limiter, key); + return limiter; + })(); + } + + async deleteKey(key = "") { + var deleted, instance; + instance = this.instances[key]; + if (this.connection) { + deleted = (await this.connection.__runCommand__(['del', ...Scripts$1.allKeys(`${this.id}-${key}`)])); + } + if (instance != null) { + delete this.instances[key]; + await instance.disconnect(); + } + return (instance != null) || deleted > 0; + } + + limiters() { + var k, ref, results, v; + ref = this.instances; + results = []; + for (k in ref) { + v = ref[k]; + results.push({ + key: k, + limiter: v + }); + } + return results; + } + + keys() { + return Object.keys(this.instances); + } + + async clusterKeys() { + var cursor, end, found, i, k, keys, len, next, start; + if (this.connection == null) { + return this.Promise.resolve(this.keys()); + } + keys = []; + cursor = null; + start = `b_${this.id}-`.length; + end = "_settings".length; + while (cursor !== 0) { + [next, found] = (await this.connection.__runCommand__(["scan", cursor != null ? cursor : 0, "match", `b_${this.id}-*_settings`, "count", 10000])); + cursor = ~~next; + for (i = 0, len = found.length; i < len; i++) { + k = found[i]; + keys.push(k.slice(start, -end)); + } + } + return keys; + } + + _startAutoCleanup() { + var base; + clearInterval(this.interval); + return typeof (base = (this.interval = setInterval(async() => { + var e, k, ref, results, time, v; + time = Date.now(); + ref = this.instances; + results = []; + for (k in ref) { + v = ref[k]; + try { + if ((await v._store.__groupCheck__(time))) { + results.push(this.deleteKey(k)); + } else { + results.push(void 0); + } + } catch (error) { + e = error; + results.push(v.Events.trigger("error", e)); + } + } + return results; + }, this.timeout / 2))).unref === "function" ? base.unref() : void 0; + } + + updateSettings(options = {}) { + parser$3.overwrite(options, this.defaults, this); + parser$3.overwrite(options, options, this.limiterOptions); + if (options.timeout != null) { + return this._startAutoCleanup(); + } + } + + disconnect(flush = true) { + var ref; + if (!this.sharedConnection) { + return (ref = this.connection) != null ? ref.disconnect(flush) : void 0; + } + } + + } + Group.prototype.defaults = { + timeout: 1000 * 60 * 5, + connection: null, + Promise: Promise, + id: "group-key" + }; + + return Group; + + }).call(commonjsGlobal); + + var Group_1 = Group; + + var Batcher, Events$3, parser$4; + + parser$4 = parser; + + Events$3 = Events_1; + + Batcher = (function() { + class Batcher { + constructor(options = {}) { + this.options = options; + parser$4.load(this.options, this.defaults, this); + this.Events = new Events$3(this); + this._arr = []; + this._resetPromise(); + this._lastFlush = Date.now(); + } + + _resetPromise() { + return this._promise = new this.Promise((res, rej) => { + return this._resolve = res; + }); + } + + _flush() { + clearTimeout(this._timeout); + this._lastFlush = Date.now(); + this._resolve(); + this.Events.trigger("batch", this._arr); + this._arr = []; + return this._resetPromise(); + } + + add(data) { + var ret; + this._arr.push(data); + ret = this._promise; + if (this._arr.length === this.maxSize) { + this._flush(); + } else if ((this.maxTime != null) && this._arr.length === 1) { + this._timeout = setTimeout(() => { + return this._flush(); + }, this.maxTime); + } + return ret; + } + + } + Batcher.prototype.defaults = { + maxTime: null, + maxSize: null, + Promise: Promise + }; + + return Batcher; + + }).call(commonjsGlobal); + + var Batcher_1 = Batcher; + + var require$$4$1 = () => console.log('You must import the full version of Bottleneck in order to use this feature.'); + + var require$$8 = getCjsExportFromNamespace(version$2); + + var Bottleneck, DEFAULT_PRIORITY$1, Events$4, Job$1, LocalDatastore$1, NUM_PRIORITIES$1, Queues$1, RedisDatastore$1, States$1, Sync$1, parser$5, + splice = [].splice; + + NUM_PRIORITIES$1 = 10; + + DEFAULT_PRIORITY$1 = 5; + + parser$5 = parser; + + Queues$1 = Queues_1; + + Job$1 = Job_1; + + LocalDatastore$1 = LocalDatastore_1; + + RedisDatastore$1 = require$$4$1; + + Events$4 = Events_1; + + States$1 = States_1; + + Sync$1 = Sync_1; + + Bottleneck = (function() { + class Bottleneck { + constructor(options = {}, ...invalid) { + var storeInstanceOptions, storeOptions; + this._addToQueue = this._addToQueue.bind(this); + this._validateOptions(options, invalid); + parser$5.load(options, this.instanceDefaults, this); + this._queues = new Queues$1(NUM_PRIORITIES$1); + this._scheduled = {}; + this._states = new States$1(["RECEIVED", "QUEUED", "RUNNING", "EXECUTING"].concat(this.trackDoneStatus ? ["DONE"] : [])); + this._limiter = null; + this.Events = new Events$4(this); + this._submitLock = new Sync$1("submit", this.Promise); + this._registerLock = new Sync$1("register", this.Promise); + storeOptions = parser$5.load(options, this.storeDefaults, {}); + this._store = (function() { + if (this.datastore === "redis" || this.datastore === "ioredis" || (this.connection != null)) { + storeInstanceOptions = parser$5.load(options, this.redisStoreDefaults, {}); + return new RedisDatastore$1(this, storeOptions, storeInstanceOptions); + } else if (this.datastore === "local") { + storeInstanceOptions = parser$5.load(options, this.localStoreDefaults, {}); + return new LocalDatastore$1(this, storeOptions, storeInstanceOptions); + } else { + throw new Bottleneck.prototype.BottleneckError(`Invalid datastore type: ${this.datastore}`); + } + }).call(this); + this._queues.on("leftzero", () => { + var ref; + return (ref = this._store.heartbeat) != null ? typeof ref.ref === "function" ? ref.ref() : void 0 : void 0; + }); + this._queues.on("zero", () => { + var ref; + return (ref = this._store.heartbeat) != null ? typeof ref.unref === "function" ? ref.unref() : void 0 : void 0; + }); + } + + _validateOptions(options, invalid) { + if (!((options != null) && typeof options === "object" && invalid.length === 0)) { + throw new Bottleneck.prototype.BottleneckError("Bottleneck v2 takes a single object argument. Refer to https://github.com/SGrondin/bottleneck#upgrading-to-v2 if you're upgrading from Bottleneck v1."); + } + } + + ready() { + return this._store.ready; + } + + clients() { + return this._store.clients; + } + + channel() { + return `b_${this.id}`; + } + + channel_client() { + return `b_${this.id}_${this._store.clientId}`; + } + + publish(message) { + return this._store.__publish__(message); + } + + disconnect(flush = true) { + return this._store.__disconnect__(flush); + } + + chain(_limiter) { + this._limiter = _limiter; + return this; + } + + queued(priority) { + return this._queues.queued(priority); + } + + clusterQueued() { + return this._store.__queued__(); + } + + empty() { + return this.queued() === 0 && this._submitLock.isEmpty(); + } + + running() { + return this._store.__running__(); + } + + done() { + return this._store.__done__(); + } + + jobStatus(id) { + return this._states.jobStatus(id); + } + + jobs(status) { + return this._states.statusJobs(status); + } + + counts() { + return this._states.statusCounts(); + } + + _randomIndex() { + return Math.random().toString(36).slice(2); + } + + check(weight = 1) { + return this._store.__check__(weight); + } + + _clearGlobalState(index) { + if (this._scheduled[index] != null) { + clearTimeout(this._scheduled[index].expiration); + delete this._scheduled[index]; + return true; + } else { + return false; + } + } + + async _free(index, job, options, eventInfo) { + var e, running; + try { + ({running} = (await this._store.__free__(index, options.weight))); + this.Events.trigger("debug", `Freed ${options.id}`, eventInfo); + if (running === 0 && this.empty()) { + return this.Events.trigger("idle"); + } + } catch (error1) { + e = error1; + return this.Events.trigger("error", e); + } + } + + _run(index, job, wait) { + var clearGlobalState, free, run; + job.doRun(); + clearGlobalState = this._clearGlobalState.bind(this, index); + run = this._run.bind(this, index, job); + free = this._free.bind(this, index, job); + return this._scheduled[index] = { + timeout: setTimeout(() => { + return job.doExecute(this._limiter, clearGlobalState, run, free); + }, wait), + expiration: job.options.expiration != null ? setTimeout(function() { + return job.doExpire(clearGlobalState, run, free); + }, wait + job.options.expiration) : void 0, + job: job + }; + } + + _drainOne(capacity) { + return this._registerLock.schedule(() => { + var args, index, next, options, queue; + if (this.queued() === 0) { + return this.Promise.resolve(null); + } + queue = this._queues.getFirst(); + ({options, args} = next = queue.first()); + if ((capacity != null) && options.weight > capacity) { + return this.Promise.resolve(null); + } + this.Events.trigger("debug", `Draining ${options.id}`, {args, options}); + index = this._randomIndex(); + return this._store.__register__(index, options.weight, options.expiration).then(({success, wait, reservoir}) => { + var empty; + this.Events.trigger("debug", `Drained ${options.id}`, {success, args, options}); + if (success) { + queue.shift(); + empty = this.empty(); + if (empty) { + this.Events.trigger("empty"); + } + if (reservoir === 0) { + this.Events.trigger("depleted", empty); + } + this._run(index, next, wait); + return this.Promise.resolve(options.weight); + } else { + return this.Promise.resolve(null); + } + }); + }); + } + + _drainAll(capacity, total = 0) { + return this._drainOne(capacity).then((drained) => { + var newCapacity; + if (drained != null) { + newCapacity = capacity != null ? capacity - drained : capacity; + return this._drainAll(newCapacity, total + drained); + } else { + return this.Promise.resolve(total); + } + }).catch((e) => { + return this.Events.trigger("error", e); + }); + } + + _dropAllQueued(message) { + return this._queues.shiftAll(function(job) { + return job.doDrop({message}); + }); + } + + stop(options = {}) { + var done, waitForExecuting; + options = parser$5.load(options, this.stopDefaults); + waitForExecuting = (at) => { + var finished; + finished = () => { + var counts; + counts = this._states.counts; + return (counts[0] + counts[1] + counts[2] + counts[3]) === at; + }; + return new this.Promise((resolve, reject) => { + if (finished()) { + return resolve(); + } else { + return this.on("done", () => { + if (finished()) { + this.removeAllListeners("done"); + return resolve(); + } + }); + } + }); + }; + done = options.dropWaitingJobs ? (this._run = function(index, next) { + return next.doDrop({ + message: options.dropErrorMessage + }); + }, this._drainOne = () => { + return this.Promise.resolve(null); + }, this._registerLock.schedule(() => { + return this._submitLock.schedule(() => { + var k, ref, v; + ref = this._scheduled; + for (k in ref) { + v = ref[k]; + if (this.jobStatus(v.job.options.id) === "RUNNING") { + clearTimeout(v.timeout); + clearTimeout(v.expiration); + v.job.doDrop({ + message: options.dropErrorMessage + }); + } + } + this._dropAllQueued(options.dropErrorMessage); + return waitForExecuting(0); + }); + })) : this.schedule({ + priority: NUM_PRIORITIES$1 - 1, + weight: 0 + }, () => { + return waitForExecuting(1); + }); + this._receive = function(job) { + return job._reject(new Bottleneck.prototype.BottleneckError(options.enqueueErrorMessage)); + }; + this.stop = () => { + return this.Promise.reject(new Bottleneck.prototype.BottleneckError("stop() has already been called")); + }; + return done; + } + + async _addToQueue(job) { + var args, blocked, error, options, reachedHWM, shifted, strategy; + ({args, options} = job); + try { + ({reachedHWM, blocked, strategy} = (await this._store.__submit__(this.queued(), options.weight))); + } catch (error1) { + error = error1; + this.Events.trigger("debug", `Could not queue ${options.id}`, {args, options, error}); + job.doDrop({error}); + return false; + } + if (blocked) { + job.doDrop(); + return true; + } else if (reachedHWM) { + shifted = strategy === Bottleneck.prototype.strategy.LEAK ? this._queues.shiftLastFrom(options.priority) : strategy === Bottleneck.prototype.strategy.OVERFLOW_PRIORITY ? this._queues.shiftLastFrom(options.priority + 1) : strategy === Bottleneck.prototype.strategy.OVERFLOW ? job : void 0; + if (shifted != null) { + shifted.doDrop(); + } + if ((shifted == null) || strategy === Bottleneck.prototype.strategy.OVERFLOW) { + if (shifted == null) { + job.doDrop(); + } + return reachedHWM; + } + } + job.doQueue(reachedHWM, blocked); + this._queues.push(job); + await this._drainAll(); + return reachedHWM; + } + + _receive(job) { + if (this._states.jobStatus(job.options.id) != null) { + job._reject(new Bottleneck.prototype.BottleneckError(`A job with the same id already exists (id=${job.options.id})`)); + return false; + } else { + job.doReceive(); + return this._submitLock.schedule(this._addToQueue, job); + } + } + + submit(...args) { + var cb, fn, job, options, ref, ref1, task; + if (typeof args[0] === "function") { + ref = args, [fn, ...args] = ref, [cb] = splice.call(args, -1); + options = parser$5.load({}, this.jobDefaults); + } else { + ref1 = args, [options, fn, ...args] = ref1, [cb] = splice.call(args, -1); + options = parser$5.load(options, this.jobDefaults); + } + task = (...args) => { + return new this.Promise(function(resolve, reject) { + return fn(...args, function(...args) { + return (args[0] != null ? reject : resolve)(args); + }); + }); + }; + job = new Job$1(task, args, options, this.jobDefaults, this.rejectOnDrop, this.Events, this._states, this.Promise); + job.promise.then(function(args) { + return typeof cb === "function" ? cb(...args) : void 0; + }).catch(function(args) { + if (Array.isArray(args)) { + return typeof cb === "function" ? cb(...args) : void 0; + } else { + return typeof cb === "function" ? cb(args) : void 0; + } + }); + return this._receive(job); + } + + schedule(...args) { + var job, options, task; + if (typeof args[0] === "function") { + [task, ...args] = args; + options = {}; + } else { + [options, task, ...args] = args; + } + job = new Job$1(task, args, options, this.jobDefaults, this.rejectOnDrop, this.Events, this._states, this.Promise); + this._receive(job); + return job.promise; + } + + wrap(fn) { + var schedule, wrapped; + schedule = this.schedule.bind(this); + wrapped = function(...args) { + return schedule(fn.bind(this), ...args); + }; + wrapped.withOptions = function(options, ...args) { + return schedule(options, fn, ...args); + }; + return wrapped; + } + + async updateSettings(options = {}) { + await this._store.__updateSettings__(parser$5.overwrite(options, this.storeDefaults)); + parser$5.overwrite(options, this.instanceDefaults, this); + return this; + } + + currentReservoir() { + return this._store.__currentReservoir__(); + } + + incrementReservoir(incr = 0) { + return this._store.__incrementReservoir__(incr); + } + + } + Bottleneck.default = Bottleneck; + + Bottleneck.Events = Events$4; + + Bottleneck.version = Bottleneck.prototype.version = require$$8.version; + + Bottleneck.strategy = Bottleneck.prototype.strategy = { + LEAK: 1, + OVERFLOW: 2, + OVERFLOW_PRIORITY: 4, + BLOCK: 3 + }; + + Bottleneck.BottleneckError = Bottleneck.prototype.BottleneckError = BottleneckError_1; + + Bottleneck.Group = Bottleneck.prototype.Group = Group_1; + + Bottleneck.RedisConnection = Bottleneck.prototype.RedisConnection = require$$2; + + Bottleneck.IORedisConnection = Bottleneck.prototype.IORedisConnection = require$$3; + + Bottleneck.Batcher = Bottleneck.prototype.Batcher = Batcher_1; + + Bottleneck.prototype.jobDefaults = { + priority: DEFAULT_PRIORITY$1, + weight: 1, + expiration: null, + id: "" + }; + + Bottleneck.prototype.storeDefaults = { + maxConcurrent: null, + minTime: 0, + highWater: null, + strategy: Bottleneck.prototype.strategy.LEAK, + penalty: null, + reservoir: null, + reservoirRefreshInterval: null, + reservoirRefreshAmount: null, + reservoirIncreaseInterval: null, + reservoirIncreaseAmount: null, + reservoirIncreaseMaximum: null + }; + + Bottleneck.prototype.localStoreDefaults = { + Promise: Promise, + timeout: null, + heartbeatInterval: 250 + }; + + Bottleneck.prototype.redisStoreDefaults = { + Promise: Promise, + timeout: null, + heartbeatInterval: 5000, + clientTimeout: 10000, + Redis: null, + clientOptions: {}, + clusterNodes: null, + clearDatastore: false, + connection: null + }; + + Bottleneck.prototype.instanceDefaults = { + datastore: "local", + connection: null, + id: "", + rejectOnDrop: true, + trackDoneStatus: false, + Promise: Promise + }; + + Bottleneck.prototype.stopDefaults = { + enqueueErrorMessage: "This limiter has been stopped and cannot accept new jobs.", + dropWaitingJobs: true, + dropErrorMessage: "This limiter has been stopped." + }; + + return Bottleneck; + + }).call(commonjsGlobal); + + var Bottleneck_1 = Bottleneck; + + var lib = Bottleneck_1; + + return lib; + +}))); + + +/***/ }), + +/***/ 8932: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ value: true })); + +class Deprecation extends Error { + constructor(message) { + super(message); // Maintains proper stack trace (only available on V8) + + /* istanbul ignore next */ + + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = 'Deprecation'; + } + +} + +exports.Deprecation = Deprecation; + + +/***/ }), + +/***/ 3287: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ value: true })); + +/*! + * is-plain-object + * + * Copyright (c) 2014-2017, Jon Schlinkert. + * Released under the MIT License. + */ + +function isObject(o) { + return Object.prototype.toString.call(o) === '[object Object]'; +} + +function isPlainObject(o) { + var ctor,prot; + + if (isObject(o) === false) return false; + + // If has modified constructor + ctor = o.constructor; + if (ctor === undefined) return true; + + // If has modified prototype + prot = ctor.prototype; + if (isObject(prot) === false) return false; + + // If constructor does not have an Object-specific method + if (prot.hasOwnProperty('isPrototypeOf') === false) { + return false; + } + + // Most likely a plain Object + return true; +} + +exports.isPlainObject = isPlainObject; + + +/***/ }), + +/***/ 5902: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +var hashClear = __nccwpck_require__(1789), + hashDelete = __nccwpck_require__(712), + hashGet = __nccwpck_require__(5395), + hashHas = __nccwpck_require__(5232), + hashSet = __nccwpck_require__(7320); + +/** + * Creates a hash object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ +function Hash(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } +} + +// Add methods to `Hash`. +Hash.prototype.clear = hashClear; +Hash.prototype['delete'] = hashDelete; +Hash.prototype.get = hashGet; +Hash.prototype.has = hashHas; +Hash.prototype.set = hashSet; + +module.exports = Hash; + + +/***/ }), + +/***/ 6608: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +var listCacheClear = __nccwpck_require__(9792), + listCacheDelete = __nccwpck_require__(7716), + listCacheGet = __nccwpck_require__(5789), + listCacheHas = __nccwpck_require__(9386), + listCacheSet = __nccwpck_require__(7399); + +/** + * Creates an list cache object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ +function ListCache(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } +} + +// Add methods to `ListCache`. +ListCache.prototype.clear = listCacheClear; +ListCache.prototype['delete'] = listCacheDelete; +ListCache.prototype.get = listCacheGet; +ListCache.prototype.has = listCacheHas; +ListCache.prototype.set = listCacheSet; + +module.exports = ListCache; + + +/***/ }), + +/***/ 881: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +var getNative = __nccwpck_require__(4479), + root = __nccwpck_require__(9882); + +/* Built-in method references that are verified to be native. */ +var Map = getNative(root, 'Map'); + +module.exports = Map; + + +/***/ }), + +/***/ 938: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +var mapCacheClear = __nccwpck_require__(1610), + mapCacheDelete = __nccwpck_require__(6657), + mapCacheGet = __nccwpck_require__(1372), + mapCacheHas = __nccwpck_require__(609), + mapCacheSet = __nccwpck_require__(5582); + +/** + * Creates a map cache object to store key-value pairs. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ +function MapCache(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } +} + +// Add methods to `MapCache`. +MapCache.prototype.clear = mapCacheClear; +MapCache.prototype['delete'] = mapCacheDelete; +MapCache.prototype.get = mapCacheGet; +MapCache.prototype.has = mapCacheHas; +MapCache.prototype.set = mapCacheSet; + +module.exports = MapCache; + + +/***/ }), + +/***/ 9213: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +var root = __nccwpck_require__(9882); + +/** Built-in value references. */ +var Symbol = root.Symbol; + +module.exports = Symbol; + + +/***/ }), + +/***/ 4356: +/***/ ((module) => { + +/** + * A specialized version of `_.map` for arrays without support for iteratee + * shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + */ +function arrayMap(array, iteratee) { + var index = -1, + length = array == null ? 0 : array.length, + result = Array(length); + + while (++index < length) { + result[index] = iteratee(array[index], index, array); + } + return result; +} + +module.exports = arrayMap; + + +/***/ }), + +/***/ 6752: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +var eq = __nccwpck_require__(1901); + +/** + * Gets the index at which the `key` is found in `array` of key-value pairs. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} key The key to search for. + * @returns {number} Returns the index of the matched value, else `-1`. + */ +function assocIndexOf(array, key) { + var length = array.length; + while (length--) { + if (eq(array[length][0], key)) { + return length; + } + } + return -1; +} + +module.exports = assocIndexOf; + + +/***/ }), + +/***/ 5758: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +var castPath = __nccwpck_require__(2688), + toKey = __nccwpck_require__(9071); + +/** + * The base implementation of `_.get` without support for default values. + * + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to get. + * @returns {*} Returns the resolved value. + */ +function baseGet(object, path) { + path = castPath(path, object); + + var index = 0, + length = path.length; + + while (object != null && index < length) { + object = object[toKey(path[index++])]; + } + return (index && index == length) ? object : undefined; +} + +module.exports = baseGet; + + +/***/ }), + +/***/ 7497: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +var Symbol = __nccwpck_require__(9213), + getRawTag = __nccwpck_require__(923), + objectToString = __nccwpck_require__(4200); + +/** `Object#toString` result references. */ +var nullTag = '[object Null]', + undefinedTag = '[object Undefined]'; + +/** Built-in value references. */ +var symToStringTag = Symbol ? Symbol.toStringTag : undefined; + +/** + * The base implementation of `getTag` without fallbacks for buggy environments. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the `toStringTag`. + */ +function baseGetTag(value) { + if (value == null) { + return value === undefined ? undefinedTag : nullTag; + } + return (symToStringTag && symToStringTag in Object(value)) + ? getRawTag(value) + : objectToString(value); +} + +module.exports = baseGetTag; + + +/***/ }), + +/***/ 411: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +var isFunction = __nccwpck_require__(7799), + isMasked = __nccwpck_require__(9058), + isObject = __nccwpck_require__(3334), + toSource = __nccwpck_require__(6928); + +/** + * Used to match `RegExp` + * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). + */ +var reRegExpChar = /[\\^$.*+?()[\]{}|]/g; + +/** Used to detect host constructors (Safari). */ +var reIsHostCtor = /^\[object .+?Constructor\]$/; + +/** Used for built-in method references. */ +var funcProto = Function.prototype, + objectProto = Object.prototype; + +/** Used to resolve the decompiled source of functions. */ +var funcToString = funcProto.toString; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** Used to detect if a method is native. */ +var reIsNative = RegExp('^' + + funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&') + .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' +); + +/** + * The base implementation of `_.isNative` without bad shim checks. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, + * else `false`. + */ +function baseIsNative(value) { + if (!isObject(value) || isMasked(value)) { + return false; + } + var pattern = isFunction(value) ? reIsNative : reIsHostCtor; + return pattern.test(toSource(value)); +} + +module.exports = baseIsNative; + + +/***/ }), + +/***/ 6792: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +var Symbol = __nccwpck_require__(9213), + arrayMap = __nccwpck_require__(4356), + isArray = __nccwpck_require__(4869), + isSymbol = __nccwpck_require__(6403); + +/** Used as references for various `Number` constants. */ +var INFINITY = 1 / 0; + +/** Used to convert symbols to primitives and strings. */ +var symbolProto = Symbol ? Symbol.prototype : undefined, + symbolToString = symbolProto ? symbolProto.toString : undefined; + +/** + * The base implementation of `_.toString` which doesn't convert nullish + * values to empty strings. + * + * @private + * @param {*} value The value to process. + * @returns {string} Returns the string. + */ +function baseToString(value) { + // Exit early for strings to avoid a performance hit in some environments. + if (typeof value == 'string') { + return value; + } + if (isArray(value)) { + // Recursively convert values (susceptible to call stack limits). + return arrayMap(value, baseToString) + ''; + } + if (isSymbol(value)) { + return symbolToString ? symbolToString.call(value) : ''; + } + var result = (value + ''); + return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; +} + +module.exports = baseToString; + + +/***/ }), + +/***/ 2688: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +var isArray = __nccwpck_require__(4869), + isKey = __nccwpck_require__(9084), + stringToPath = __nccwpck_require__(1853), + toString = __nccwpck_require__(2931); + +/** + * Casts `value` to a path array if it's not one. + * + * @private + * @param {*} value The value to inspect. + * @param {Object} [object] The object to query keys on. + * @returns {Array} Returns the cast property path array. + */ +function castPath(value, object) { + if (isArray(value)) { + return value; + } + return isKey(value, object) ? [value] : stringToPath(toString(value)); +} + +module.exports = castPath; + + +/***/ }), + +/***/ 8380: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +var root = __nccwpck_require__(9882); + +/** Used to detect overreaching core-js shims. */ +var coreJsData = root['__core-js_shared__']; + +module.exports = coreJsData; + + +/***/ }), + +/***/ 2085: +/***/ ((module) => { + +/** Detect free variable `global` from Node.js. */ +var freeGlobal = typeof global == 'object' && global && global.Object === Object && global; + +module.exports = freeGlobal; + + +/***/ }), + +/***/ 9980: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +var isKeyable = __nccwpck_require__(3308); + +/** + * Gets the data for `map`. + * + * @private + * @param {Object} map The map to query. + * @param {string} key The reference key. + * @returns {*} Returns the map data. + */ +function getMapData(map, key) { + var data = map.__data__; + return isKeyable(key) + ? data[typeof key == 'string' ? 'string' : 'hash'] + : data.map; +} + +module.exports = getMapData; + + +/***/ }), + +/***/ 4479: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +var baseIsNative = __nccwpck_require__(411), + getValue = __nccwpck_require__(3542); + +/** + * Gets the native function at `key` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the method to get. + * @returns {*} Returns the function if it's native, else `undefined`. + */ +function getNative(object, key) { + var value = getValue(object, key); + return baseIsNative(value) ? value : undefined; +} + +module.exports = getNative; + + +/***/ }), + +/***/ 923: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +var Symbol = __nccwpck_require__(9213); + +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ +var nativeObjectToString = objectProto.toString; + +/** Built-in value references. */ +var symToStringTag = Symbol ? Symbol.toStringTag : undefined; + +/** + * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the raw `toStringTag`. + */ +function getRawTag(value) { + var isOwn = hasOwnProperty.call(value, symToStringTag), + tag = value[symToStringTag]; + + try { + value[symToStringTag] = undefined; + var unmasked = true; + } catch (e) {} + + var result = nativeObjectToString.call(value); + if (unmasked) { + if (isOwn) { + value[symToStringTag] = tag; + } else { + delete value[symToStringTag]; + } + } + return result; +} + +module.exports = getRawTag; + + +/***/ }), + +/***/ 3542: +/***/ ((module) => { + +/** + * Gets the value at `key` of `object`. + * + * @private + * @param {Object} [object] The object to query. + * @param {string} key The key of the property to get. + * @returns {*} Returns the property value. + */ +function getValue(object, key) { + return object == null ? undefined : object[key]; +} + +module.exports = getValue; + + +/***/ }), + +/***/ 1789: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +var nativeCreate = __nccwpck_require__(3041); + +/** + * Removes all key-value entries from the hash. + * + * @private + * @name clear + * @memberOf Hash + */ +function hashClear() { + this.__data__ = nativeCreate ? nativeCreate(null) : {}; + this.size = 0; +} + +module.exports = hashClear; + + +/***/ }), + +/***/ 712: +/***/ ((module) => { + +/** + * Removes `key` and its value from the hash. + * + * @private + * @name delete + * @memberOf Hash + * @param {Object} hash The hash to modify. + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ +function hashDelete(key) { + var result = this.has(key) && delete this.__data__[key]; + this.size -= result ? 1 : 0; + return result; +} + +module.exports = hashDelete; + + +/***/ }), + +/***/ 5395: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +var nativeCreate = __nccwpck_require__(3041); + +/** Used to stand-in for `undefined` hash values. */ +var HASH_UNDEFINED = '__lodash_hash_undefined__'; + +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Gets the hash value for `key`. + * + * @private + * @name get + * @memberOf Hash + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ +function hashGet(key) { + var data = this.__data__; + if (nativeCreate) { + var result = data[key]; + return result === HASH_UNDEFINED ? undefined : result; + } + return hasOwnProperty.call(data, key) ? data[key] : undefined; +} + +module.exports = hashGet; + + +/***/ }), + +/***/ 5232: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +var nativeCreate = __nccwpck_require__(3041); + +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Checks if a hash value for `key` exists. + * + * @private + * @name has + * @memberOf Hash + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ +function hashHas(key) { + var data = this.__data__; + return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key); +} + +module.exports = hashHas; + + +/***/ }), + +/***/ 7320: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +var nativeCreate = __nccwpck_require__(3041); + +/** Used to stand-in for `undefined` hash values. */ +var HASH_UNDEFINED = '__lodash_hash_undefined__'; + +/** + * Sets the hash `key` to `value`. + * + * @private + * @name set + * @memberOf Hash + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the hash instance. + */ +function hashSet(key, value) { + var data = this.__data__; + this.size += this.has(key) ? 0 : 1; + data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value; + return this; +} + +module.exports = hashSet; + + +/***/ }), + +/***/ 9084: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +var isArray = __nccwpck_require__(4869), + isSymbol = __nccwpck_require__(6403); + +/** Used to match property names within property paths. */ +var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, + reIsPlainProp = /^\w*$/; + +/** + * Checks if `value` is a property name and not a property path. + * + * @private + * @param {*} value The value to check. + * @param {Object} [object] The object to query keys on. + * @returns {boolean} Returns `true` if `value` is a property name, else `false`. + */ +function isKey(value, object) { + if (isArray(value)) { + return false; + } + var type = typeof value; + if (type == 'number' || type == 'symbol' || type == 'boolean' || + value == null || isSymbol(value)) { + return true; + } + return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || + (object != null && value in Object(object)); +} + +module.exports = isKey; + + +/***/ }), + +/***/ 3308: +/***/ ((module) => { + +/** + * Checks if `value` is suitable for use as unique object key. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is suitable, else `false`. + */ +function isKeyable(value) { + var type = typeof value; + return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean') + ? (value !== '__proto__') + : (value === null); +} + +module.exports = isKeyable; + + +/***/ }), + +/***/ 9058: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +var coreJsData = __nccwpck_require__(8380); + +/** Used to detect methods masquerading as native. */ +var maskSrcKey = (function() { + var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ''); + return uid ? ('Symbol(src)_1.' + uid) : ''; +}()); + +/** + * Checks if `func` has its source masked. + * + * @private + * @param {Function} func The function to check. + * @returns {boolean} Returns `true` if `func` is masked, else `false`. + */ +function isMasked(func) { + return !!maskSrcKey && (maskSrcKey in func); +} + +module.exports = isMasked; + + +/***/ }), + +/***/ 9792: +/***/ ((module) => { + +/** + * Removes all key-value entries from the list cache. + * + * @private + * @name clear + * @memberOf ListCache + */ +function listCacheClear() { + this.__data__ = []; + this.size = 0; +} + +module.exports = listCacheClear; + + +/***/ }), + +/***/ 7716: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +var assocIndexOf = __nccwpck_require__(6752); + +/** Used for built-in method references. */ +var arrayProto = Array.prototype; + +/** Built-in value references. */ +var splice = arrayProto.splice; + +/** + * Removes `key` and its value from the list cache. + * + * @private + * @name delete + * @memberOf ListCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ +function listCacheDelete(key) { + var data = this.__data__, + index = assocIndexOf(data, key); + + if (index < 0) { + return false; + } + var lastIndex = data.length - 1; + if (index == lastIndex) { + data.pop(); + } else { + splice.call(data, index, 1); + } + --this.size; + return true; +} + +module.exports = listCacheDelete; + + +/***/ }), + +/***/ 5789: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +var assocIndexOf = __nccwpck_require__(6752); + +/** + * Gets the list cache value for `key`. + * + * @private + * @name get + * @memberOf ListCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ +function listCacheGet(key) { + var data = this.__data__, + index = assocIndexOf(data, key); + + return index < 0 ? undefined : data[index][1]; +} + +module.exports = listCacheGet; + + +/***/ }), + +/***/ 9386: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +var assocIndexOf = __nccwpck_require__(6752); + +/** + * Checks if a list cache value for `key` exists. + * + * @private + * @name has + * @memberOf ListCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ +function listCacheHas(key) { + return assocIndexOf(this.__data__, key) > -1; +} + +module.exports = listCacheHas; + + +/***/ }), + +/***/ 7399: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +var assocIndexOf = __nccwpck_require__(6752); + +/** + * Sets the list cache `key` to `value`. + * + * @private + * @name set + * @memberOf ListCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the list cache instance. + */ +function listCacheSet(key, value) { + var data = this.__data__, + index = assocIndexOf(data, key); + + if (index < 0) { + ++this.size; + data.push([key, value]); + } else { + data[index][1] = value; + } + return this; +} + +module.exports = listCacheSet; + + +/***/ }), + +/***/ 1610: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +var Hash = __nccwpck_require__(5902), + ListCache = __nccwpck_require__(6608), + Map = __nccwpck_require__(881); + +/** + * Removes all key-value entries from the map. + * + * @private + * @name clear + * @memberOf MapCache + */ +function mapCacheClear() { + this.size = 0; + this.__data__ = { + 'hash': new Hash, + 'map': new (Map || ListCache), + 'string': new Hash + }; +} + +module.exports = mapCacheClear; + + +/***/ }), + +/***/ 6657: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +var getMapData = __nccwpck_require__(9980); + +/** + * Removes `key` and its value from the map. + * + * @private + * @name delete + * @memberOf MapCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ +function mapCacheDelete(key) { + var result = getMapData(this, key)['delete'](key); + this.size -= result ? 1 : 0; + return result; +} + +module.exports = mapCacheDelete; + + +/***/ }), + +/***/ 1372: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +var getMapData = __nccwpck_require__(9980); + +/** + * Gets the map value for `key`. + * + * @private + * @name get + * @memberOf MapCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ +function mapCacheGet(key) { + return getMapData(this, key).get(key); +} + +module.exports = mapCacheGet; + + +/***/ }), + +/***/ 609: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +var getMapData = __nccwpck_require__(9980); + +/** + * Checks if a map value for `key` exists. + * + * @private + * @name has + * @memberOf MapCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ +function mapCacheHas(key) { + return getMapData(this, key).has(key); +} + +module.exports = mapCacheHas; + + +/***/ }), + +/***/ 5582: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +var getMapData = __nccwpck_require__(9980); + +/** + * Sets the map `key` to `value`. + * + * @private + * @name set + * @memberOf MapCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the map cache instance. + */ +function mapCacheSet(key, value) { + var data = getMapData(this, key), + size = data.size; + + data.set(key, value); + this.size += data.size == size ? 0 : 1; + return this; +} + +module.exports = mapCacheSet; + + +/***/ }), + +/***/ 9422: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +var memoize = __nccwpck_require__(9885); + +/** Used as the maximum memoize cache size. */ +var MAX_MEMOIZE_SIZE = 500; + +/** + * A specialized version of `_.memoize` which clears the memoized function's + * cache when it exceeds `MAX_MEMOIZE_SIZE`. + * + * @private + * @param {Function} func The function to have its output memoized. + * @returns {Function} Returns the new memoized function. + */ +function memoizeCapped(func) { + var result = memoize(func, function(key) { + if (cache.size === MAX_MEMOIZE_SIZE) { + cache.clear(); + } + return key; + }); + + var cache = result.cache; + return result; +} + +module.exports = memoizeCapped; + + +/***/ }), + +/***/ 3041: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +var getNative = __nccwpck_require__(4479); + +/* Built-in method references that are verified to be native. */ +var nativeCreate = getNative(Object, 'create'); + +module.exports = nativeCreate; + + +/***/ }), + +/***/ 4200: +/***/ ((module) => { + +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ +var nativeObjectToString = objectProto.toString; + +/** + * Converts `value` to a string using `Object.prototype.toString`. + * + * @private + * @param {*} value The value to convert. + * @returns {string} Returns the converted string. + */ +function objectToString(value) { + return nativeObjectToString.call(value); +} + +module.exports = objectToString; + + +/***/ }), + +/***/ 9882: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +var freeGlobal = __nccwpck_require__(2085); + +/** Detect free variable `self`. */ +var freeSelf = typeof self == 'object' && self && self.Object === Object && self; + +/** Used as a reference to the global object. */ +var root = freeGlobal || freeSelf || Function('return this')(); + +module.exports = root; + + +/***/ }), + +/***/ 1853: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +var memoizeCapped = __nccwpck_require__(9422); + +/** Used to match property names within property paths. */ +var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; + +/** Used to match backslashes in property paths. */ +var reEscapeChar = /\\(\\)?/g; + +/** + * Converts `string` to a property path array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the property path array. + */ +var stringToPath = memoizeCapped(function(string) { + var result = []; + if (string.charCodeAt(0) === 46 /* . */) { + result.push(''); + } + string.replace(rePropName, function(match, number, quote, subString) { + result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match)); + }); + return result; +}); + +module.exports = stringToPath; + + +/***/ }), + +/***/ 9071: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +var isSymbol = __nccwpck_require__(6403); + +/** Used as references for various `Number` constants. */ +var INFINITY = 1 / 0; + +/** + * Converts `value` to a string key if it's not a string or symbol. + * + * @private + * @param {*} value The value to inspect. + * @returns {string|symbol} Returns the key. + */ +function toKey(value) { + if (typeof value == 'string' || isSymbol(value)) { + return value; + } + var result = (value + ''); + return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; +} + +module.exports = toKey; + + +/***/ }), + +/***/ 6928: +/***/ ((module) => { + +/** Used for built-in method references. */ +var funcProto = Function.prototype; + +/** Used to resolve the decompiled source of functions. */ +var funcToString = funcProto.toString; + +/** + * Converts `func` to its source code. + * + * @private + * @param {Function} func The function to convert. + * @returns {string} Returns the source code. + */ +function toSource(func) { + if (func != null) { + try { + return funcToString.call(func); + } catch (e) {} + try { + return (func + ''); + } catch (e) {} + } + return ''; +} + +module.exports = toSource; + + +/***/ }), + +/***/ 1901: +/***/ ((module) => { + +/** + * Performs a + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * comparison between two values to determine if they are equivalent. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + * @example + * + * var object = { 'a': 1 }; + * var other = { 'a': 1 }; + * + * _.eq(object, object); + * // => true + * + * _.eq(object, other); + * // => false + * + * _.eq('a', 'a'); + * // => true + * + * _.eq('a', Object('a')); + * // => false + * + * _.eq(NaN, NaN); + * // => true + */ +function eq(value, other) { + return value === other || (value !== value && other !== other); +} + +module.exports = eq; + + +/***/ }), + +/***/ 6908: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +var baseGet = __nccwpck_require__(5758); + +/** + * Gets the value at `path` of `object`. If the resolved value is + * `undefined`, the `defaultValue` is returned in its place. + * + * @static + * @memberOf _ + * @since 3.7.0 + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to get. + * @param {*} [defaultValue] The value returned for `undefined` resolved values. + * @returns {*} Returns the resolved value. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }] }; + * + * _.get(object, 'a[0].b.c'); + * // => 3 + * + * _.get(object, ['a', '0', 'b', 'c']); + * // => 3 + * + * _.get(object, 'a.b.c', 'default'); + * // => 'default' + */ +function get(object, path, defaultValue) { + var result = object == null ? undefined : baseGet(object, path); + return result === undefined ? defaultValue : result; +} + +module.exports = get; + + +/***/ }), + +/***/ 4869: +/***/ ((module) => { + +/** + * Checks if `value` is classified as an `Array` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array, else `false`. + * @example + * + * _.isArray([1, 2, 3]); + * // => true + * + * _.isArray(document.body.children); + * // => false + * + * _.isArray('abc'); + * // => false + * + * _.isArray(_.noop); + * // => false + */ +var isArray = Array.isArray; + +module.exports = isArray; + + +/***/ }), + +/***/ 7799: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +var baseGetTag = __nccwpck_require__(7497), + isObject = __nccwpck_require__(3334); + +/** `Object#toString` result references. */ +var asyncTag = '[object AsyncFunction]', + funcTag = '[object Function]', + genTag = '[object GeneratorFunction]', + proxyTag = '[object Proxy]'; + +/** + * Checks if `value` is classified as a `Function` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a function, else `false`. + * @example + * + * _.isFunction(_); + * // => true + * + * _.isFunction(/abc/); + * // => false + */ +function isFunction(value) { + if (!isObject(value)) { + return false; + } + // The use of `Object#toString` avoids issues with the `typeof` operator + // in Safari 9 which returns 'object' for typed arrays and other constructors. + var tag = baseGetTag(value); + return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag; +} + +module.exports = isFunction; + + +/***/ }), + +/***/ 3334: +/***/ ((module) => { + +/** + * Checks if `value` is the + * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) + * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(_.noop); + * // => true + * + * _.isObject(null); + * // => false + */ +function isObject(value) { + var type = typeof value; + return value != null && (type == 'object' || type == 'function'); +} + +module.exports = isObject; + + +/***/ }), + +/***/ 5926: +/***/ ((module) => { + +/** + * Checks if `value` is object-like. A value is object-like if it's not `null` + * and has a `typeof` result of "object". + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + * @example + * + * _.isObjectLike({}); + * // => true + * + * _.isObjectLike([1, 2, 3]); + * // => true + * + * _.isObjectLike(_.noop); + * // => false + * + * _.isObjectLike(null); + * // => false + */ +function isObjectLike(value) { + return value != null && typeof value == 'object'; +} + +module.exports = isObjectLike; + + +/***/ }), + +/***/ 6403: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +var baseGetTag = __nccwpck_require__(7497), + isObjectLike = __nccwpck_require__(5926); + +/** `Object#toString` result references. */ +var symbolTag = '[object Symbol]'; + +/** + * Checks if `value` is classified as a `Symbol` primitive or object. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. + * @example + * + * _.isSymbol(Symbol.iterator); + * // => true + * + * _.isSymbol('abc'); + * // => false + */ +function isSymbol(value) { + return typeof value == 'symbol' || + (isObjectLike(value) && baseGetTag(value) == symbolTag); +} + +module.exports = isSymbol; + + +/***/ }), + +/***/ 9885: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +var MapCache = __nccwpck_require__(938); + +/** Error message constants. */ +var FUNC_ERROR_TEXT = 'Expected a function'; + +/** + * Creates a function that memoizes the result of `func`. If `resolver` is + * provided, it determines the cache key for storing the result based on the + * arguments provided to the memoized function. By default, the first argument + * provided to the memoized function is used as the map cache key. The `func` + * is invoked with the `this` binding of the memoized function. + * + * **Note:** The cache is exposed as the `cache` property on the memoized + * function. Its creation may be customized by replacing the `_.memoize.Cache` + * constructor with one whose instances implement the + * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object) + * method interface of `clear`, `delete`, `get`, `has`, and `set`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to have its output memoized. + * @param {Function} [resolver] The function to resolve the cache key. + * @returns {Function} Returns the new memoized function. + * @example + * + * var object = { 'a': 1, 'b': 2 }; + * var other = { 'c': 3, 'd': 4 }; + * + * var values = _.memoize(_.values); + * values(object); + * // => [1, 2] + * + * values(other); + * // => [3, 4] + * + * object.a = 2; + * values(object); + * // => [1, 2] + * + * // Modify the result cache. + * values.cache.set(object, ['a', 'b']); + * values(object); + * // => ['a', 'b'] + * + * // Replace `_.memoize.Cache`. + * _.memoize.Cache = WeakMap; + */ +function memoize(func, resolver) { + if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) { + throw new TypeError(FUNC_ERROR_TEXT); + } + var memoized = function() { + var args = arguments, + key = resolver ? resolver.apply(this, args) : args[0], + cache = memoized.cache; + + if (cache.has(key)) { + return cache.get(key); + } + var result = func.apply(this, args); + memoized.cache = cache.set(key, result) || cache; + return result; + }; + memoized.cache = new (memoize.Cache || MapCache); + return memoized; +} + +// Expose `MapCache`. +memoize.Cache = MapCache; + +module.exports = memoize; + + +/***/ }), + +/***/ 2931: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +var baseToString = __nccwpck_require__(6792); + +/** + * Converts `value` to a string. An empty string is returned for `null` + * and `undefined` values. The sign of `-0` is preserved. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {string} Returns the converted string. + * @example + * + * _.toString(null); + * // => '' + * + * _.toString(-0); + * // => '-0' + * + * _.toString([1, 2, 3]); + * // => '1,2,3' + */ +function toString(value) { + return value == null ? '' : baseToString(value); +} + +module.exports = toString; + + +/***/ }), + +/***/ 467: +/***/ ((module, exports, __nccwpck_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ value: true })); + +function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } + +var Stream = _interopDefault(__nccwpck_require__(2781)); +var http = _interopDefault(__nccwpck_require__(3685)); +var Url = _interopDefault(__nccwpck_require__(7310)); +var whatwgUrl = _interopDefault(__nccwpck_require__(3323)); +var https = _interopDefault(__nccwpck_require__(5687)); +var zlib = _interopDefault(__nccwpck_require__(9796)); + +// Based on https://github.com/tmpvar/jsdom/blob/aa85b2abf07766ff7bf5c1f6daafb3726f2f2db5/lib/jsdom/living/blob.js + +// fix for "Readable" isn't a named export issue +const Readable = Stream.Readable; + +const BUFFER = Symbol('buffer'); +const TYPE = Symbol('type'); + +class Blob { + constructor() { + this[TYPE] = ''; + + const blobParts = arguments[0]; + const options = arguments[1]; + + const buffers = []; + let size = 0; + + if (blobParts) { + const a = blobParts; + const length = Number(a.length); + for (let i = 0; i < length; i++) { + const element = a[i]; + let buffer; + if (element instanceof Buffer) { + buffer = element; + } else if (ArrayBuffer.isView(element)) { + buffer = Buffer.from(element.buffer, element.byteOffset, element.byteLength); + } else if (element instanceof ArrayBuffer) { + buffer = Buffer.from(element); + } else if (element instanceof Blob) { + buffer = element[BUFFER]; + } else { + buffer = Buffer.from(typeof element === 'string' ? element : String(element)); + } + size += buffer.length; + buffers.push(buffer); + } + } + + this[BUFFER] = Buffer.concat(buffers); + + let type = options && options.type !== undefined && String(options.type).toLowerCase(); + if (type && !/[^\u0020-\u007E]/.test(type)) { + this[TYPE] = type; + } + } + get size() { + return this[BUFFER].length; + } + get type() { + return this[TYPE]; + } + text() { + return Promise.resolve(this[BUFFER].toString()); + } + arrayBuffer() { + const buf = this[BUFFER]; + const ab = buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength); + return Promise.resolve(ab); + } + stream() { + const readable = new Readable(); + readable._read = function () {}; + readable.push(this[BUFFER]); + readable.push(null); + return readable; + } + toString() { + return '[object Blob]'; + } + slice() { + const size = this.size; + + const start = arguments[0]; + const end = arguments[1]; + let relativeStart, relativeEnd; + if (start === undefined) { + relativeStart = 0; + } else if (start < 0) { + relativeStart = Math.max(size + start, 0); + } else { + relativeStart = Math.min(start, size); + } + if (end === undefined) { + relativeEnd = size; + } else if (end < 0) { + relativeEnd = Math.max(size + end, 0); + } else { + relativeEnd = Math.min(end, size); + } + const span = Math.max(relativeEnd - relativeStart, 0); + + const buffer = this[BUFFER]; + const slicedBuffer = buffer.slice(relativeStart, relativeStart + span); + const blob = new Blob([], { type: arguments[2] }); + blob[BUFFER] = slicedBuffer; + return blob; + } +} + +Object.defineProperties(Blob.prototype, { + size: { enumerable: true }, + type: { enumerable: true }, + slice: { enumerable: true } +}); + +Object.defineProperty(Blob.prototype, Symbol.toStringTag, { + value: 'Blob', + writable: false, + enumerable: false, + configurable: true +}); + +/** + * fetch-error.js + * + * FetchError interface for operational errors + */ + +/** + * Create FetchError instance + * + * @param String message Error message for human + * @param String type Error type for machine + * @param String systemError For Node.js system error + * @return FetchError + */ +function FetchError(message, type, systemError) { + Error.call(this, message); + + this.message = message; + this.type = type; + + // when err.type is `system`, err.code contains system error code + if (systemError) { + this.code = this.errno = systemError.code; + } + + // hide custom error implementation details from end-users + Error.captureStackTrace(this, this.constructor); +} + +FetchError.prototype = Object.create(Error.prototype); +FetchError.prototype.constructor = FetchError; +FetchError.prototype.name = 'FetchError'; + +let convert; +try { + convert = (__nccwpck_require__(2877).convert); +} catch (e) {} + +const INTERNALS = Symbol('Body internals'); + +// fix an issue where "PassThrough" isn't a named export for node <10 +const PassThrough = Stream.PassThrough; + +/** + * Body mixin + * + * Ref: https://fetch.spec.whatwg.org/#body + * + * @param Stream body Readable stream + * @param Object opts Response options + * @return Void + */ +function Body(body) { + var _this = this; + + var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, + _ref$size = _ref.size; + + let size = _ref$size === undefined ? 0 : _ref$size; + var _ref$timeout = _ref.timeout; + let timeout = _ref$timeout === undefined ? 0 : _ref$timeout; + + if (body == null) { + // body is undefined or null + body = null; + } else if (isURLSearchParams(body)) { + // body is a URLSearchParams + body = Buffer.from(body.toString()); + } else if (isBlob(body)) ; else if (Buffer.isBuffer(body)) ; else if (Object.prototype.toString.call(body) === '[object ArrayBuffer]') { + // body is ArrayBuffer + body = Buffer.from(body); + } else if (ArrayBuffer.isView(body)) { + // body is ArrayBufferView + body = Buffer.from(body.buffer, body.byteOffset, body.byteLength); + } else if (body instanceof Stream) ; else { + // none of the above + // coerce to string then buffer + body = Buffer.from(String(body)); + } + this[INTERNALS] = { + body, + disturbed: false, + error: null + }; + this.size = size; + this.timeout = timeout; + + if (body instanceof Stream) { + body.on('error', function (err) { + const error = err.name === 'AbortError' ? err : new FetchError(`Invalid response body while trying to fetch ${_this.url}: ${err.message}`, 'system', err); + _this[INTERNALS].error = error; + }); + } +} + +Body.prototype = { + get body() { + return this[INTERNALS].body; + }, + + get bodyUsed() { + return this[INTERNALS].disturbed; + }, + + /** + * Decode response as ArrayBuffer + * + * @return Promise + */ + arrayBuffer() { + return consumeBody.call(this).then(function (buf) { + return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength); + }); + }, + + /** + * Return raw response as Blob + * + * @return Promise + */ + blob() { + let ct = this.headers && this.headers.get('content-type') || ''; + return consumeBody.call(this).then(function (buf) { + return Object.assign( + // Prevent copying + new Blob([], { + type: ct.toLowerCase() + }), { + [BUFFER]: buf + }); + }); + }, + + /** + * Decode response as json + * + * @return Promise + */ + json() { + var _this2 = this; + + return consumeBody.call(this).then(function (buffer) { + try { + return JSON.parse(buffer.toString()); + } catch (err) { + return Body.Promise.reject(new FetchError(`invalid json response body at ${_this2.url} reason: ${err.message}`, 'invalid-json')); + } + }); + }, + + /** + * Decode response as text + * + * @return Promise + */ + text() { + return consumeBody.call(this).then(function (buffer) { + return buffer.toString(); + }); + }, + + /** + * Decode response as buffer (non-spec api) + * + * @return Promise + */ + buffer() { + return consumeBody.call(this); + }, + + /** + * Decode response as text, while automatically detecting the encoding and + * trying to decode to UTF-8 (non-spec api) + * + * @return Promise + */ + textConverted() { + var _this3 = this; + + return consumeBody.call(this).then(function (buffer) { + return convertBody(buffer, _this3.headers); + }); + } +}; + +// In browsers, all properties are enumerable. +Object.defineProperties(Body.prototype, { + body: { enumerable: true }, + bodyUsed: { enumerable: true }, + arrayBuffer: { enumerable: true }, + blob: { enumerable: true }, + json: { enumerable: true }, + text: { enumerable: true } +}); + +Body.mixIn = function (proto) { + for (const name of Object.getOwnPropertyNames(Body.prototype)) { + // istanbul ignore else: future proof + if (!(name in proto)) { + const desc = Object.getOwnPropertyDescriptor(Body.prototype, name); + Object.defineProperty(proto, name, desc); + } + } +}; + +/** + * Consume and convert an entire Body to a Buffer. + * + * Ref: https://fetch.spec.whatwg.org/#concept-body-consume-body + * + * @return Promise + */ +function consumeBody() { + var _this4 = this; + + if (this[INTERNALS].disturbed) { + return Body.Promise.reject(new TypeError(`body used already for: ${this.url}`)); + } + + this[INTERNALS].disturbed = true; + + if (this[INTERNALS].error) { + return Body.Promise.reject(this[INTERNALS].error); + } + + let body = this.body; + + // body is null + if (body === null) { + return Body.Promise.resolve(Buffer.alloc(0)); + } + + // body is blob + if (isBlob(body)) { + body = body.stream(); + } + + // body is buffer + if (Buffer.isBuffer(body)) { + return Body.Promise.resolve(body); + } + + // istanbul ignore if: should never happen + if (!(body instanceof Stream)) { + return Body.Promise.resolve(Buffer.alloc(0)); + } + + // body is stream + // get ready to actually consume the body + let accum = []; + let accumBytes = 0; + let abort = false; + + return new Body.Promise(function (resolve, reject) { + let resTimeout; + + // allow timeout on slow response body + if (_this4.timeout) { + resTimeout = setTimeout(function () { + abort = true; + reject(new FetchError(`Response timeout while trying to fetch ${_this4.url} (over ${_this4.timeout}ms)`, 'body-timeout')); + }, _this4.timeout); + } + + // handle stream errors + body.on('error', function (err) { + if (err.name === 'AbortError') { + // if the request was aborted, reject with this Error + abort = true; + reject(err); + } else { + // other errors, such as incorrect content-encoding + reject(new FetchError(`Invalid response body while trying to fetch ${_this4.url}: ${err.message}`, 'system', err)); + } + }); + + body.on('data', function (chunk) { + if (abort || chunk === null) { + return; + } + + if (_this4.size && accumBytes + chunk.length > _this4.size) { + abort = true; + reject(new FetchError(`content size at ${_this4.url} over limit: ${_this4.size}`, 'max-size')); + return; + } + + accumBytes += chunk.length; + accum.push(chunk); + }); + + body.on('end', function () { + if (abort) { + return; + } + + clearTimeout(resTimeout); + + try { + resolve(Buffer.concat(accum, accumBytes)); + } catch (err) { + // handle streams that have accumulated too much data (issue #414) + reject(new FetchError(`Could not create Buffer from response body for ${_this4.url}: ${err.message}`, 'system', err)); + } + }); + }); +} + +/** + * Detect buffer encoding and convert to target encoding + * ref: http://www.w3.org/TR/2011/WD-html5-20110113/parsing.html#determining-the-character-encoding + * + * @param Buffer buffer Incoming buffer + * @param String encoding Target encoding + * @return String + */ +function convertBody(buffer, headers) { + if (typeof convert !== 'function') { + throw new Error('The package `encoding` must be installed to use the textConverted() function'); + } + + const ct = headers.get('content-type'); + let charset = 'utf-8'; + let res, str; + + // header + if (ct) { + res = /charset=([^;]*)/i.exec(ct); + } + + // no charset in content type, peek at response body for at most 1024 bytes + str = buffer.slice(0, 1024).toString(); + + // html5 + if (!res && str) { + res = / 0 && arguments[0] !== undefined ? arguments[0] : undefined; + + this[MAP] = Object.create(null); + + if (init instanceof Headers) { + const rawHeaders = init.raw(); + const headerNames = Object.keys(rawHeaders); + + for (const headerName of headerNames) { + for (const value of rawHeaders[headerName]) { + this.append(headerName, value); + } + } + + return; + } + + // We don't worry about converting prop to ByteString here as append() + // will handle it. + if (init == null) ; else if (typeof init === 'object') { + const method = init[Symbol.iterator]; + if (method != null) { + if (typeof method !== 'function') { + throw new TypeError('Header pairs must be iterable'); + } + + // sequence> + // Note: per spec we have to first exhaust the lists then process them + const pairs = []; + for (const pair of init) { + if (typeof pair !== 'object' || typeof pair[Symbol.iterator] !== 'function') { + throw new TypeError('Each header pair must be iterable'); + } + pairs.push(Array.from(pair)); + } + + for (const pair of pairs) { + if (pair.length !== 2) { + throw new TypeError('Each header pair must be a name/value tuple'); + } + this.append(pair[0], pair[1]); + } + } else { + // record + for (const key of Object.keys(init)) { + const value = init[key]; + this.append(key, value); + } + } + } else { + throw new TypeError('Provided initializer must be an object'); + } + } + + /** + * Return combined header value given name + * + * @param String name Header name + * @return Mixed + */ + get(name) { + name = `${name}`; + validateName(name); + const key = find(this[MAP], name); + if (key === undefined) { + return null; + } + + return this[MAP][key].join(', '); + } + + /** + * Iterate over all headers + * + * @param Function callback Executed for each item with parameters (value, name, thisArg) + * @param Boolean thisArg `this` context for callback function + * @return Void + */ + forEach(callback) { + let thisArg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined; + + let pairs = getHeaders(this); + let i = 0; + while (i < pairs.length) { + var _pairs$i = pairs[i]; + const name = _pairs$i[0], + value = _pairs$i[1]; + + callback.call(thisArg, value, name, this); + pairs = getHeaders(this); + i++; + } + } + + /** + * Overwrite header values given name + * + * @param String name Header name + * @param String value Header value + * @return Void + */ + set(name, value) { + name = `${name}`; + value = `${value}`; + validateName(name); + validateValue(value); + const key = find(this[MAP], name); + this[MAP][key !== undefined ? key : name] = [value]; + } + + /** + * Append a value onto existing header + * + * @param String name Header name + * @param String value Header value + * @return Void + */ + append(name, value) { + name = `${name}`; + value = `${value}`; + validateName(name); + validateValue(value); + const key = find(this[MAP], name); + if (key !== undefined) { + this[MAP][key].push(value); + } else { + this[MAP][name] = [value]; + } + } + + /** + * Check for header name existence + * + * @param String name Header name + * @return Boolean + */ + has(name) { + name = `${name}`; + validateName(name); + return find(this[MAP], name) !== undefined; + } + + /** + * Delete all header values given name + * + * @param String name Header name + * @return Void + */ + delete(name) { + name = `${name}`; + validateName(name); + const key = find(this[MAP], name); + if (key !== undefined) { + delete this[MAP][key]; + } + } + + /** + * Return raw headers (non-spec api) + * + * @return Object + */ + raw() { + return this[MAP]; + } + + /** + * Get an iterator on keys. + * + * @return Iterator + */ + keys() { + return createHeadersIterator(this, 'key'); + } + + /** + * Get an iterator on values. + * + * @return Iterator + */ + values() { + return createHeadersIterator(this, 'value'); + } + + /** + * Get an iterator on entries. + * + * This is the default iterator of the Headers object. + * + * @return Iterator + */ + [Symbol.iterator]() { + return createHeadersIterator(this, 'key+value'); + } +} +Headers.prototype.entries = Headers.prototype[Symbol.iterator]; + +Object.defineProperty(Headers.prototype, Symbol.toStringTag, { + value: 'Headers', + writable: false, + enumerable: false, + configurable: true +}); + +Object.defineProperties(Headers.prototype, { + get: { enumerable: true }, + forEach: { enumerable: true }, + set: { enumerable: true }, + append: { enumerable: true }, + has: { enumerable: true }, + delete: { enumerable: true }, + keys: { enumerable: true }, + values: { enumerable: true }, + entries: { enumerable: true } +}); + +function getHeaders(headers) { + let kind = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'key+value'; + + const keys = Object.keys(headers[MAP]).sort(); + return keys.map(kind === 'key' ? function (k) { + return k.toLowerCase(); + } : kind === 'value' ? function (k) { + return headers[MAP][k].join(', '); + } : function (k) { + return [k.toLowerCase(), headers[MAP][k].join(', ')]; + }); +} + +const INTERNAL = Symbol('internal'); + +function createHeadersIterator(target, kind) { + const iterator = Object.create(HeadersIteratorPrototype); + iterator[INTERNAL] = { + target, + kind, + index: 0 + }; + return iterator; +} + +const HeadersIteratorPrototype = Object.setPrototypeOf({ + next() { + // istanbul ignore if + if (!this || Object.getPrototypeOf(this) !== HeadersIteratorPrototype) { + throw new TypeError('Value of `this` is not a HeadersIterator'); + } + + var _INTERNAL = this[INTERNAL]; + const target = _INTERNAL.target, + kind = _INTERNAL.kind, + index = _INTERNAL.index; + + const values = getHeaders(target, kind); + const len = values.length; + if (index >= len) { + return { + value: undefined, + done: true + }; + } + + this[INTERNAL].index = index + 1; + + return { + value: values[index], + done: false + }; + } +}, Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]()))); + +Object.defineProperty(HeadersIteratorPrototype, Symbol.toStringTag, { + value: 'HeadersIterator', + writable: false, + enumerable: false, + configurable: true +}); + +/** + * Export the Headers object in a form that Node.js can consume. + * + * @param Headers headers + * @return Object + */ +function exportNodeCompatibleHeaders(headers) { + const obj = Object.assign({ __proto__: null }, headers[MAP]); + + // http.request() only supports string as Host header. This hack makes + // specifying custom Host header possible. + const hostHeaderKey = find(headers[MAP], 'Host'); + if (hostHeaderKey !== undefined) { + obj[hostHeaderKey] = obj[hostHeaderKey][0]; + } + + return obj; +} + +/** + * Create a Headers object from an object of headers, ignoring those that do + * not conform to HTTP grammar productions. + * + * @param Object obj Object of headers + * @return Headers + */ +function createHeadersLenient(obj) { + const headers = new Headers(); + for (const name of Object.keys(obj)) { + if (invalidTokenRegex.test(name)) { + continue; + } + if (Array.isArray(obj[name])) { + for (const val of obj[name]) { + if (invalidHeaderCharRegex.test(val)) { + continue; + } + if (headers[MAP][name] === undefined) { + headers[MAP][name] = [val]; + } else { + headers[MAP][name].push(val); + } + } + } else if (!invalidHeaderCharRegex.test(obj[name])) { + headers[MAP][name] = [obj[name]]; + } + } + return headers; +} + +const INTERNALS$1 = Symbol('Response internals'); + +// fix an issue where "STATUS_CODES" aren't a named export for node <10 +const STATUS_CODES = http.STATUS_CODES; + +/** + * Response class + * + * @param Stream body Readable stream + * @param Object opts Response options + * @return Void + */ +class Response { + constructor() { + let body = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + let opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + Body.call(this, body, opts); + + const status = opts.status || 200; + const headers = new Headers(opts.headers); + + if (body != null && !headers.has('Content-Type')) { + const contentType = extractContentType(body); + if (contentType) { + headers.append('Content-Type', contentType); + } + } + + this[INTERNALS$1] = { + url: opts.url, + status, + statusText: opts.statusText || STATUS_CODES[status], + headers, + counter: opts.counter + }; + } + + get url() { + return this[INTERNALS$1].url || ''; + } + + get status() { + return this[INTERNALS$1].status; + } + + /** + * Convenience property representing if the request ended normally + */ + get ok() { + return this[INTERNALS$1].status >= 200 && this[INTERNALS$1].status < 300; + } + + get redirected() { + return this[INTERNALS$1].counter > 0; + } + + get statusText() { + return this[INTERNALS$1].statusText; + } + + get headers() { + return this[INTERNALS$1].headers; + } + + /** + * Clone this response + * + * @return Response + */ + clone() { + return new Response(clone(this), { + url: this.url, + status: this.status, + statusText: this.statusText, + headers: this.headers, + ok: this.ok, + redirected: this.redirected + }); + } +} + +Body.mixIn(Response.prototype); + +Object.defineProperties(Response.prototype, { + url: { enumerable: true }, + status: { enumerable: true }, + ok: { enumerable: true }, + redirected: { enumerable: true }, + statusText: { enumerable: true }, + headers: { enumerable: true }, + clone: { enumerable: true } +}); + +Object.defineProperty(Response.prototype, Symbol.toStringTag, { + value: 'Response', + writable: false, + enumerable: false, + configurable: true +}); + +const INTERNALS$2 = Symbol('Request internals'); +const URL = Url.URL || whatwgUrl.URL; + +// fix an issue where "format", "parse" aren't a named export for node <10 +const parse_url = Url.parse; +const format_url = Url.format; + +/** + * Wrapper around `new URL` to handle arbitrary URLs + * + * @param {string} urlStr + * @return {void} + */ +function parseURL(urlStr) { + /* + Check whether the URL is absolute or not + Scheme: https://tools.ietf.org/html/rfc3986#section-3.1 + Absolute URL: https://tools.ietf.org/html/rfc3986#section-4.3 + */ + if (/^[a-zA-Z][a-zA-Z\d+\-.]*:/.exec(urlStr)) { + urlStr = new URL(urlStr).toString(); + } + + // Fallback to old implementation for arbitrary URLs + return parse_url(urlStr); +} + +const streamDestructionSupported = 'destroy' in Stream.Readable.prototype; + +/** + * Check if a value is an instance of Request. + * + * @param Mixed input + * @return Boolean + */ +function isRequest(input) { + return typeof input === 'object' && typeof input[INTERNALS$2] === 'object'; +} + +function isAbortSignal(signal) { + const proto = signal && typeof signal === 'object' && Object.getPrototypeOf(signal); + return !!(proto && proto.constructor.name === 'AbortSignal'); +} + +/** + * Request class + * + * @param Mixed input Url or Request instance + * @param Object init Custom options + * @return Void + */ +class Request { + constructor(input) { + let init = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + let parsedURL; + + // normalize input + if (!isRequest(input)) { + if (input && input.href) { + // in order to support Node.js' Url objects; though WHATWG's URL objects + // will fall into this branch also (since their `toString()` will return + // `href` property anyway) + parsedURL = parseURL(input.href); + } else { + // coerce input to a string before attempting to parse + parsedURL = parseURL(`${input}`); + } + input = {}; + } else { + parsedURL = parseURL(input.url); + } + + let method = init.method || input.method || 'GET'; + method = method.toUpperCase(); + + if ((init.body != null || isRequest(input) && input.body !== null) && (method === 'GET' || method === 'HEAD')) { + throw new TypeError('Request with GET/HEAD method cannot have body'); + } + + let inputBody = init.body != null ? init.body : isRequest(input) && input.body !== null ? clone(input) : null; + + Body.call(this, inputBody, { + timeout: init.timeout || input.timeout || 0, + size: init.size || input.size || 0 + }); + + const headers = new Headers(init.headers || input.headers || {}); + + if (inputBody != null && !headers.has('Content-Type')) { + const contentType = extractContentType(inputBody); + if (contentType) { + headers.append('Content-Type', contentType); + } + } + + let signal = isRequest(input) ? input.signal : null; + if ('signal' in init) signal = init.signal; + + if (signal != null && !isAbortSignal(signal)) { + throw new TypeError('Expected signal to be an instanceof AbortSignal'); + } + + this[INTERNALS$2] = { + method, + redirect: init.redirect || input.redirect || 'follow', + headers, + parsedURL, + signal + }; + + // node-fetch-only options + this.follow = init.follow !== undefined ? init.follow : input.follow !== undefined ? input.follow : 20; + this.compress = init.compress !== undefined ? init.compress : input.compress !== undefined ? input.compress : true; + this.counter = init.counter || input.counter || 0; + this.agent = init.agent || input.agent; + } + + get method() { + return this[INTERNALS$2].method; + } + + get url() { + return format_url(this[INTERNALS$2].parsedURL); + } + + get headers() { + return this[INTERNALS$2].headers; + } + + get redirect() { + return this[INTERNALS$2].redirect; + } + + get signal() { + return this[INTERNALS$2].signal; + } + + /** + * Clone this request + * + * @return Request + */ + clone() { + return new Request(this); + } +} + +Body.mixIn(Request.prototype); + +Object.defineProperty(Request.prototype, Symbol.toStringTag, { + value: 'Request', + writable: false, + enumerable: false, + configurable: true +}); + +Object.defineProperties(Request.prototype, { + method: { enumerable: true }, + url: { enumerable: true }, + headers: { enumerable: true }, + redirect: { enumerable: true }, + clone: { enumerable: true }, + signal: { enumerable: true } +}); + +/** + * Convert a Request to Node.js http request options. + * + * @param Request A Request instance + * @return Object The options object to be passed to http.request + */ +function getNodeRequestOptions(request) { + const parsedURL = request[INTERNALS$2].parsedURL; + const headers = new Headers(request[INTERNALS$2].headers); + + // fetch step 1.3 + if (!headers.has('Accept')) { + headers.set('Accept', '*/*'); + } + + // Basic fetch + if (!parsedURL.protocol || !parsedURL.hostname) { + throw new TypeError('Only absolute URLs are supported'); + } + + if (!/^https?:$/.test(parsedURL.protocol)) { + throw new TypeError('Only HTTP(S) protocols are supported'); + } + + if (request.signal && request.body instanceof Stream.Readable && !streamDestructionSupported) { + throw new Error('Cancellation of streamed requests with AbortSignal is not supported in node < 8'); + } + + // HTTP-network-or-cache fetch steps 2.4-2.7 + let contentLengthValue = null; + if (request.body == null && /^(POST|PUT)$/i.test(request.method)) { + contentLengthValue = '0'; + } + if (request.body != null) { + const totalBytes = getTotalBytes(request); + if (typeof totalBytes === 'number') { + contentLengthValue = String(totalBytes); + } + } + if (contentLengthValue) { + headers.set('Content-Length', contentLengthValue); + } + + // HTTP-network-or-cache fetch step 2.11 + if (!headers.has('User-Agent')) { + headers.set('User-Agent', 'node-fetch/1.0 (+https://github.com/bitinn/node-fetch)'); + } + + // HTTP-network-or-cache fetch step 2.15 + if (request.compress && !headers.has('Accept-Encoding')) { + headers.set('Accept-Encoding', 'gzip,deflate'); + } + + let agent = request.agent; + if (typeof agent === 'function') { + agent = agent(parsedURL); + } + + if (!headers.has('Connection') && !agent) { + headers.set('Connection', 'close'); + } + + // HTTP-network fetch step 4.2 + // chunked encoding is handled by Node.js + + return Object.assign({}, parsedURL, { + method: request.method, + headers: exportNodeCompatibleHeaders(headers), + agent + }); +} + +/** + * abort-error.js + * + * AbortError interface for cancelled requests + */ + +/** + * Create AbortError instance + * + * @param String message Error message for human + * @return AbortError + */ +function AbortError(message) { + Error.call(this, message); + + this.type = 'aborted'; + this.message = message; + + // hide custom error implementation details from end-users + Error.captureStackTrace(this, this.constructor); +} + +AbortError.prototype = Object.create(Error.prototype); +AbortError.prototype.constructor = AbortError; +AbortError.prototype.name = 'AbortError'; + +const URL$1 = Url.URL || whatwgUrl.URL; + +// fix an issue where "PassThrough", "resolve" aren't a named export for node <10 +const PassThrough$1 = Stream.PassThrough; + +const isDomainOrSubdomain = function isDomainOrSubdomain(destination, original) { + const orig = new URL$1(original).hostname; + const dest = new URL$1(destination).hostname; + + return orig === dest || orig[orig.length - dest.length - 1] === '.' && orig.endsWith(dest); +}; + +/** + * Fetch function + * + * @param Mixed url Absolute url or Request instance + * @param Object opts Fetch options + * @return Promise + */ +function fetch(url, opts) { + + // allow custom promise + if (!fetch.Promise) { + throw new Error('native promise missing, set fetch.Promise to your favorite alternative'); + } + + Body.Promise = fetch.Promise; + + // wrap http.request into fetch + return new fetch.Promise(function (resolve, reject) { + // build request object + const request = new Request(url, opts); + const options = getNodeRequestOptions(request); + + const send = (options.protocol === 'https:' ? https : http).request; + const signal = request.signal; + + let response = null; + + const abort = function abort() { + let error = new AbortError('The user aborted a request.'); + reject(error); + if (request.body && request.body instanceof Stream.Readable) { + request.body.destroy(error); + } + if (!response || !response.body) return; + response.body.emit('error', error); + }; + + if (signal && signal.aborted) { + abort(); + return; + } + + const abortAndFinalize = function abortAndFinalize() { + abort(); + finalize(); + }; + + // send request + const req = send(options); + let reqTimeout; + + if (signal) { + signal.addEventListener('abort', abortAndFinalize); + } + + function finalize() { + req.abort(); + if (signal) signal.removeEventListener('abort', abortAndFinalize); + clearTimeout(reqTimeout); + } + + if (request.timeout) { + req.once('socket', function (socket) { + reqTimeout = setTimeout(function () { + reject(new FetchError(`network timeout at: ${request.url}`, 'request-timeout')); + finalize(); + }, request.timeout); + }); + } + + req.on('error', function (err) { + reject(new FetchError(`request to ${request.url} failed, reason: ${err.message}`, 'system', err)); + finalize(); + }); + + req.on('response', function (res) { + clearTimeout(reqTimeout); + + const headers = createHeadersLenient(res.headers); + + // HTTP fetch step 5 + if (fetch.isRedirect(res.statusCode)) { + // HTTP fetch step 5.2 + const location = headers.get('Location'); + + // HTTP fetch step 5.3 + let locationURL = null; + try { + locationURL = location === null ? null : new URL$1(location, request.url).toString(); + } catch (err) { + // error here can only be invalid URL in Location: header + // do not throw when options.redirect == manual + // let the user extract the errorneous redirect URL + if (request.redirect !== 'manual') { + reject(new FetchError(`uri requested responds with an invalid redirect URL: ${location}`, 'invalid-redirect')); + finalize(); + return; + } + } + + // HTTP fetch step 5.5 + switch (request.redirect) { + case 'error': + reject(new FetchError(`uri requested responds with a redirect, redirect mode is set to error: ${request.url}`, 'no-redirect')); + finalize(); + return; + case 'manual': + // node-fetch-specific step: make manual redirect a bit easier to use by setting the Location header value to the resolved URL. + if (locationURL !== null) { + // handle corrupted header + try { + headers.set('Location', locationURL); + } catch (err) { + // istanbul ignore next: nodejs server prevent invalid response headers, we can't test this through normal request + reject(err); + } + } + break; + case 'follow': + // HTTP-redirect fetch step 2 + if (locationURL === null) { + break; + } + + // HTTP-redirect fetch step 5 + if (request.counter >= request.follow) { + reject(new FetchError(`maximum redirect reached at: ${request.url}`, 'max-redirect')); + finalize(); + return; + } + + // HTTP-redirect fetch step 6 (counter increment) + // Create a new Request object. + const requestOpts = { + headers: new Headers(request.headers), + follow: request.follow, + counter: request.counter + 1, + agent: request.agent, + compress: request.compress, + method: request.method, + body: request.body, + signal: request.signal, + timeout: request.timeout, + size: request.size + }; + + if (!isDomainOrSubdomain(request.url, locationURL)) { + for (const name of ['authorization', 'www-authenticate', 'cookie', 'cookie2']) { + requestOpts.headers.delete(name); + } + } + + // HTTP-redirect fetch step 9 + if (res.statusCode !== 303 && request.body && getTotalBytes(request) === null) { + reject(new FetchError('Cannot follow redirect with body being a readable stream', 'unsupported-redirect')); + finalize(); + return; + } + + // HTTP-redirect fetch step 11 + if (res.statusCode === 303 || (res.statusCode === 301 || res.statusCode === 302) && request.method === 'POST') { + requestOpts.method = 'GET'; + requestOpts.body = undefined; + requestOpts.headers.delete('content-length'); + } + + // HTTP-redirect fetch step 15 + resolve(fetch(new Request(locationURL, requestOpts))); + finalize(); + return; + } + } + + // prepare response + res.once('end', function () { + if (signal) signal.removeEventListener('abort', abortAndFinalize); + }); + let body = res.pipe(new PassThrough$1()); + + const response_options = { + url: request.url, + status: res.statusCode, + statusText: res.statusMessage, + headers: headers, + size: request.size, + timeout: request.timeout, + counter: request.counter + }; + + // HTTP-network fetch step 12.1.1.3 + const codings = headers.get('Content-Encoding'); + + // HTTP-network fetch step 12.1.1.4: handle content codings + + // in following scenarios we ignore compression support + // 1. compression support is disabled + // 2. HEAD request + // 3. no Content-Encoding header + // 4. no content response (204) + // 5. content not modified response (304) + if (!request.compress || request.method === 'HEAD' || codings === null || res.statusCode === 204 || res.statusCode === 304) { + response = new Response(body, response_options); + resolve(response); + return; + } + + // For Node v6+ + // Be less strict when decoding compressed responses, since sometimes + // servers send slightly invalid responses that are still accepted + // by common browsers. + // Always using Z_SYNC_FLUSH is what cURL does. + const zlibOptions = { + flush: zlib.Z_SYNC_FLUSH, + finishFlush: zlib.Z_SYNC_FLUSH + }; + + // for gzip + if (codings == 'gzip' || codings == 'x-gzip') { + body = body.pipe(zlib.createGunzip(zlibOptions)); + response = new Response(body, response_options); + resolve(response); + return; + } + + // for deflate + if (codings == 'deflate' || codings == 'x-deflate') { + // handle the infamous raw deflate response from old servers + // a hack for old IIS and Apache servers + const raw = res.pipe(new PassThrough$1()); + raw.once('data', function (chunk) { + // see http://stackoverflow.com/questions/37519828 + if ((chunk[0] & 0x0F) === 0x08) { + body = body.pipe(zlib.createInflate()); + } else { + body = body.pipe(zlib.createInflateRaw()); + } + response = new Response(body, response_options); + resolve(response); + }); + return; + } + + // for br + if (codings == 'br' && typeof zlib.createBrotliDecompress === 'function') { + body = body.pipe(zlib.createBrotliDecompress()); + response = new Response(body, response_options); + resolve(response); + return; + } + + // otherwise, use response as-is + response = new Response(body, response_options); + resolve(response); + }); + + writeToStream(req, request); + }); +} +/** + * Redirect code matching + * + * @param Number code Status code + * @return Boolean + */ +fetch.isRedirect = function (code) { + return code === 301 || code === 302 || code === 303 || code === 307 || code === 308; +}; + +// expose Promise +fetch.Promise = global.Promise; + +module.exports = exports = fetch; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports["default"] = exports; +exports.Headers = Headers; +exports.Request = Request; +exports.Response = Response; +exports.FetchError = FetchError; + + +/***/ }), + +/***/ 2299: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +var punycode = __nccwpck_require__(5477); +var mappingTable = __nccwpck_require__(1907); + +var PROCESSING_OPTIONS = { + TRANSITIONAL: 0, + NONTRANSITIONAL: 1 +}; + +function normalize(str) { // fix bug in v8 + return str.split('\u0000').map(function (s) { return s.normalize('NFC'); }).join('\u0000'); +} + +function findStatus(val) { + var start = 0; + var end = mappingTable.length - 1; + + while (start <= end) { + var mid = Math.floor((start + end) / 2); + + var target = mappingTable[mid]; + if (target[0][0] <= val && target[0][1] >= val) { + return target; + } else if (target[0][0] > val) { + end = mid - 1; + } else { + start = mid + 1; + } + } + + return null; +} + +var regexAstralSymbols = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g; + +function countSymbols(string) { + return string + // replace every surrogate pair with a BMP symbol + .replace(regexAstralSymbols, '_') + // then get the length + .length; +} + +function mapChars(domain_name, useSTD3, processing_option) { + var hasError = false; + var processed = ""; + + var len = countSymbols(domain_name); + for (var i = 0; i < len; ++i) { + var codePoint = domain_name.codePointAt(i); + var status = findStatus(codePoint); + + switch (status[1]) { + case "disallowed": + hasError = true; + processed += String.fromCodePoint(codePoint); + break; + case "ignored": + break; + case "mapped": + processed += String.fromCodePoint.apply(String, status[2]); + break; + case "deviation": + if (processing_option === PROCESSING_OPTIONS.TRANSITIONAL) { + processed += String.fromCodePoint.apply(String, status[2]); + } else { + processed += String.fromCodePoint(codePoint); + } + break; + case "valid": + processed += String.fromCodePoint(codePoint); + break; + case "disallowed_STD3_mapped": + if (useSTD3) { + hasError = true; + processed += String.fromCodePoint(codePoint); + } else { + processed += String.fromCodePoint.apply(String, status[2]); + } + break; + case "disallowed_STD3_valid": + if (useSTD3) { + hasError = true; + } + + processed += String.fromCodePoint(codePoint); + break; + } + } + + return { + string: processed, + error: hasError + }; +} + +var combiningMarksRegex = /[\u0300-\u036F\u0483-\u0489\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08E4-\u0903\u093A-\u093C\u093E-\u094F\u0951-\u0957\u0962\u0963\u0981-\u0983\u09BC\u09BE-\u09C4\u09C7\u09C8\u09CB-\u09CD\u09D7\u09E2\u09E3\u0A01-\u0A03\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81-\u0A83\u0ABC\u0ABE-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AE2\u0AE3\u0B01-\u0B03\u0B3C\u0B3E-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B62\u0B63\u0B82\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0C00-\u0C03\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81-\u0C83\u0CBC\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CE2\u0CE3\u0D01-\u0D03\u0D3E-\u0D44\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D62\u0D63\u0D82\u0D83\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F3E\u0F3F\u0F71-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102B-\u103E\u1056-\u1059\u105E-\u1060\u1062-\u1064\u1067-\u106D\u1071-\u1074\u1082-\u108D\u108F\u109A-\u109D\u135D-\u135F\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17B4-\u17D3\u17DD\u180B-\u180D\u18A9\u1920-\u192B\u1930-\u193B\u19B0-\u19C0\u19C8\u19C9\u1A17-\u1A1B\u1A55-\u1A5E\u1A60-\u1A7C\u1A7F\u1AB0-\u1ABE\u1B00-\u1B04\u1B34-\u1B44\u1B6B-\u1B73\u1B80-\u1B82\u1BA1-\u1BAD\u1BE6-\u1BF3\u1C24-\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE8\u1CED\u1CF2-\u1CF4\u1CF8\u1CF9\u1DC0-\u1DF5\u1DFC-\u1DFF\u20D0-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302F\u3099\u309A\uA66F-\uA672\uA674-\uA67D\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA823-\uA827\uA880\uA881\uA8B4-\uA8C4\uA8E0-\uA8F1\uA926-\uA92D\uA947-\uA953\uA980-\uA983\uA9B3-\uA9C0\uA9E5\uAA29-\uAA36\uAA43\uAA4C\uAA4D\uAA7B-\uAA7D\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEB-\uAAEF\uAAF5\uAAF6\uABE3-\uABEA\uABEC\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2D]|\uD800[\uDDFD\uDEE0\uDF76-\uDF7A]|\uD802[\uDE01-\uDE03\uDE05\uDE06\uDE0C-\uDE0F\uDE38-\uDE3A\uDE3F\uDEE5\uDEE6]|\uD804[\uDC00-\uDC02\uDC38-\uDC46\uDC7F-\uDC82\uDCB0-\uDCBA\uDD00-\uDD02\uDD27-\uDD34\uDD73\uDD80-\uDD82\uDDB3-\uDDC0\uDE2C-\uDE37\uDEDF-\uDEEA\uDF01-\uDF03\uDF3C\uDF3E-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF57\uDF62\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDCB0-\uDCC3\uDDAF-\uDDB5\uDDB8-\uDDC0\uDE30-\uDE40\uDEAB-\uDEB7]|\uD81A[\uDEF0-\uDEF4\uDF30-\uDF36]|\uD81B[\uDF51-\uDF7E\uDF8F-\uDF92]|\uD82F[\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD83A[\uDCD0-\uDCD6]|\uDB40[\uDD00-\uDDEF]/; + +function validateLabel(label, processing_option) { + if (label.substr(0, 4) === "xn--") { + label = punycode.toUnicode(label); + processing_option = PROCESSING_OPTIONS.NONTRANSITIONAL; + } + + var error = false; + + if (normalize(label) !== label || + (label[3] === "-" && label[4] === "-") || + label[0] === "-" || label[label.length - 1] === "-" || + label.indexOf(".") !== -1 || + label.search(combiningMarksRegex) === 0) { + error = true; + } + + var len = countSymbols(label); + for (var i = 0; i < len; ++i) { + var status = findStatus(label.codePointAt(i)); + if ((processing === PROCESSING_OPTIONS.TRANSITIONAL && status[1] !== "valid") || + (processing === PROCESSING_OPTIONS.NONTRANSITIONAL && + status[1] !== "valid" && status[1] !== "deviation")) { + error = true; + break; + } + } + + return { + label: label, + error: error + }; +} + +function processing(domain_name, useSTD3, processing_option) { + var result = mapChars(domain_name, useSTD3, processing_option); + result.string = normalize(result.string); + + var labels = result.string.split("."); + for (var i = 0; i < labels.length; ++i) { + try { + var validation = validateLabel(labels[i]); + labels[i] = validation.label; + result.error = result.error || validation.error; + } catch(e) { + result.error = true; + } + } + + return { + string: labels.join("."), + error: result.error + }; +} + +module.exports.toASCII = function(domain_name, useSTD3, processing_option, verifyDnsLength) { + var result = processing(domain_name, useSTD3, processing_option); + var labels = result.string.split("."); + labels = labels.map(function(l) { + try { + return punycode.toASCII(l); + } catch(e) { + result.error = true; + return l; + } + }); + + if (verifyDnsLength) { + var total = labels.slice(0, labels.length - 1).join(".").length; + if (total.length > 253 || total.length === 0) { + result.error = true; + } + + for (var i=0; i < labels.length; ++i) { + if (labels.length > 63 || labels.length === 0) { + result.error = true; + break; + } + } + } + + if (result.error) return null; + return labels.join("."); +}; + +module.exports.toUnicode = function(domain_name, useSTD3) { + var result = processing(domain_name, useSTD3, PROCESSING_OPTIONS.NONTRANSITIONAL); + + return { + domain: result.string, + error: result.error + }; +}; + +module.exports.PROCESSING_OPTIONS = PROCESSING_OPTIONS; + + +/***/ }), + +/***/ 5871: +/***/ ((module) => { + +"use strict"; + + +var conversions = {}; +module.exports = conversions; + +function sign(x) { + return x < 0 ? -1 : 1; +} + +function evenRound(x) { + // Round x to the nearest integer, choosing the even integer if it lies halfway between two. + if ((x % 1) === 0.5 && (x & 1) === 0) { // [even number].5; round down (i.e. floor) + return Math.floor(x); + } else { + return Math.round(x); + } +} + +function createNumberConversion(bitLength, typeOpts) { + if (!typeOpts.unsigned) { + --bitLength; + } + const lowerBound = typeOpts.unsigned ? 0 : -Math.pow(2, bitLength); + const upperBound = Math.pow(2, bitLength) - 1; + + const moduloVal = typeOpts.moduloBitLength ? Math.pow(2, typeOpts.moduloBitLength) : Math.pow(2, bitLength); + const moduloBound = typeOpts.moduloBitLength ? Math.pow(2, typeOpts.moduloBitLength - 1) : Math.pow(2, bitLength - 1); + + return function(V, opts) { + if (!opts) opts = {}; + + let x = +V; + + if (opts.enforceRange) { + if (!Number.isFinite(x)) { + throw new TypeError("Argument is not a finite number"); + } + + x = sign(x) * Math.floor(Math.abs(x)); + if (x < lowerBound || x > upperBound) { + throw new TypeError("Argument is not in byte range"); + } + + return x; + } + + if (!isNaN(x) && opts.clamp) { + x = evenRound(x); + + if (x < lowerBound) x = lowerBound; + if (x > upperBound) x = upperBound; + return x; + } + + if (!Number.isFinite(x) || x === 0) { + return 0; + } + + x = sign(x) * Math.floor(Math.abs(x)); + x = x % moduloVal; + + if (!typeOpts.unsigned && x >= moduloBound) { + return x - moduloVal; + } else if (typeOpts.unsigned) { + if (x < 0) { + x += moduloVal; + } else if (x === -0) { // don't return negative zero + return 0; + } + } + + return x; + } +} + +conversions["void"] = function () { + return undefined; +}; + +conversions["boolean"] = function (val) { + return !!val; +}; + +conversions["byte"] = createNumberConversion(8, { unsigned: false }); +conversions["octet"] = createNumberConversion(8, { unsigned: true }); + +conversions["short"] = createNumberConversion(16, { unsigned: false }); +conversions["unsigned short"] = createNumberConversion(16, { unsigned: true }); + +conversions["long"] = createNumberConversion(32, { unsigned: false }); +conversions["unsigned long"] = createNumberConversion(32, { unsigned: true }); + +conversions["long long"] = createNumberConversion(32, { unsigned: false, moduloBitLength: 64 }); +conversions["unsigned long long"] = createNumberConversion(32, { unsigned: true, moduloBitLength: 64 }); + +conversions["double"] = function (V) { + const x = +V; + + if (!Number.isFinite(x)) { + throw new TypeError("Argument is not a finite floating-point value"); + } + + return x; +}; + +conversions["unrestricted double"] = function (V) { + const x = +V; + + if (isNaN(x)) { + throw new TypeError("Argument is NaN"); + } + + return x; +}; + +// not quite valid, but good enough for JS +conversions["float"] = conversions["double"]; +conversions["unrestricted float"] = conversions["unrestricted double"]; + +conversions["DOMString"] = function (V, opts) { + if (!opts) opts = {}; + + if (opts.treatNullAsEmptyString && V === null) { + return ""; + } + + return String(V); +}; + +conversions["ByteString"] = function (V, opts) { + const x = String(V); + let c = undefined; + for (let i = 0; (c = x.codePointAt(i)) !== undefined; ++i) { + if (c > 255) { + throw new TypeError("Argument is not a valid bytestring"); + } + } + + return x; +}; + +conversions["USVString"] = function (V) { + const S = String(V); + const n = S.length; + const U = []; + for (let i = 0; i < n; ++i) { + const c = S.charCodeAt(i); + if (c < 0xD800 || c > 0xDFFF) { + U.push(String.fromCodePoint(c)); + } else if (0xDC00 <= c && c <= 0xDFFF) { + U.push(String.fromCodePoint(0xFFFD)); + } else { + if (i === n - 1) { + U.push(String.fromCodePoint(0xFFFD)); + } else { + const d = S.charCodeAt(i + 1); + if (0xDC00 <= d && d <= 0xDFFF) { + const a = c & 0x3FF; + const b = d & 0x3FF; + U.push(String.fromCodePoint((2 << 15) + (2 << 9) * a + b)); + ++i; + } else { + U.push(String.fromCodePoint(0xFFFD)); + } + } + } + } + + return U.join(''); +}; + +conversions["Date"] = function (V, opts) { + if (!(V instanceof Date)) { + throw new TypeError("Argument is not a Date object"); + } + if (isNaN(V)) { + return undefined; + } + + return V; +}; + +conversions["RegExp"] = function (V, opts) { + if (!(V instanceof RegExp)) { + V = new RegExp(V); + } + + return V; +}; + + +/***/ }), + +/***/ 8262: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +const usm = __nccwpck_require__(33); + +exports.implementation = class URLImpl { + constructor(constructorArgs) { + const url = constructorArgs[0]; + const base = constructorArgs[1]; + + let parsedBase = null; + if (base !== undefined) { + parsedBase = usm.basicURLParse(base); + if (parsedBase === "failure") { + throw new TypeError("Invalid base URL"); + } + } + + const parsedURL = usm.basicURLParse(url, { baseURL: parsedBase }); + if (parsedURL === "failure") { + throw new TypeError("Invalid URL"); + } + + this._url = parsedURL; + + // TODO: query stuff + } + + get href() { + return usm.serializeURL(this._url); + } + + set href(v) { + const parsedURL = usm.basicURLParse(v); + if (parsedURL === "failure") { + throw new TypeError("Invalid URL"); + } + + this._url = parsedURL; + } + + get origin() { + return usm.serializeURLOrigin(this._url); + } + + get protocol() { + return this._url.scheme + ":"; + } + + set protocol(v) { + usm.basicURLParse(v + ":", { url: this._url, stateOverride: "scheme start" }); + } + + get username() { + return this._url.username; + } + + set username(v) { + if (usm.cannotHaveAUsernamePasswordPort(this._url)) { + return; + } + + usm.setTheUsername(this._url, v); + } + + get password() { + return this._url.password; + } + + set password(v) { + if (usm.cannotHaveAUsernamePasswordPort(this._url)) { + return; + } + + usm.setThePassword(this._url, v); + } + + get host() { + const url = this._url; + + if (url.host === null) { + return ""; + } + + if (url.port === null) { + return usm.serializeHost(url.host); + } + + return usm.serializeHost(url.host) + ":" + usm.serializeInteger(url.port); + } + + set host(v) { + if (this._url.cannotBeABaseURL) { + return; + } + + usm.basicURLParse(v, { url: this._url, stateOverride: "host" }); + } + + get hostname() { + if (this._url.host === null) { + return ""; + } + + return usm.serializeHost(this._url.host); + } + + set hostname(v) { + if (this._url.cannotBeABaseURL) { + return; + } + + usm.basicURLParse(v, { url: this._url, stateOverride: "hostname" }); + } + + get port() { + if (this._url.port === null) { + return ""; + } + + return usm.serializeInteger(this._url.port); + } + + set port(v) { + if (usm.cannotHaveAUsernamePasswordPort(this._url)) { + return; + } + + if (v === "") { + this._url.port = null; + } else { + usm.basicURLParse(v, { url: this._url, stateOverride: "port" }); + } + } + + get pathname() { + if (this._url.cannotBeABaseURL) { + return this._url.path[0]; + } + + if (this._url.path.length === 0) { + return ""; + } + + return "/" + this._url.path.join("/"); + } + + set pathname(v) { + if (this._url.cannotBeABaseURL) { + return; + } + + this._url.path = []; + usm.basicURLParse(v, { url: this._url, stateOverride: "path start" }); + } + + get search() { + if (this._url.query === null || this._url.query === "") { + return ""; + } + + return "?" + this._url.query; + } + + set search(v) { + // TODO: query stuff + + const url = this._url; + + if (v === "") { + url.query = null; + return; + } + + const input = v[0] === "?" ? v.substring(1) : v; + url.query = ""; + usm.basicURLParse(input, { url, stateOverride: "query" }); + } + + get hash() { + if (this._url.fragment === null || this._url.fragment === "") { + return ""; + } + + return "#" + this._url.fragment; + } + + set hash(v) { + if (v === "") { + this._url.fragment = null; + return; + } + + const input = v[0] === "#" ? v.substring(1) : v; + this._url.fragment = ""; + usm.basicURLParse(input, { url: this._url, stateOverride: "fragment" }); + } + + toJSON() { + return this.href; + } +}; + + +/***/ }), + +/***/ 653: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +const conversions = __nccwpck_require__(5871); +const utils = __nccwpck_require__(276); +const Impl = __nccwpck_require__(8262); + +const impl = utils.implSymbol; + +function URL(url) { + if (!this || this[impl] || !(this instanceof URL)) { + throw new TypeError("Failed to construct 'URL': Please use the 'new' operator, this DOM object constructor cannot be called as a function."); + } + if (arguments.length < 1) { + throw new TypeError("Failed to construct 'URL': 1 argument required, but only " + arguments.length + " present."); + } + const args = []; + for (let i = 0; i < arguments.length && i < 2; ++i) { + args[i] = arguments[i]; + } + args[0] = conversions["USVString"](args[0]); + if (args[1] !== undefined) { + args[1] = conversions["USVString"](args[1]); + } + + module.exports.setup(this, args); +} + +URL.prototype.toJSON = function toJSON() { + if (!this || !module.exports.is(this)) { + throw new TypeError("Illegal invocation"); + } + const args = []; + for (let i = 0; i < arguments.length && i < 0; ++i) { + args[i] = arguments[i]; + } + return this[impl].toJSON.apply(this[impl], args); +}; +Object.defineProperty(URL.prototype, "href", { + get() { + return this[impl].href; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].href = V; + }, + enumerable: true, + configurable: true +}); + +URL.prototype.toString = function () { + if (!this || !module.exports.is(this)) { + throw new TypeError("Illegal invocation"); + } + return this.href; +}; + +Object.defineProperty(URL.prototype, "origin", { + get() { + return this[impl].origin; + }, + enumerable: true, + configurable: true +}); + +Object.defineProperty(URL.prototype, "protocol", { + get() { + return this[impl].protocol; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].protocol = V; + }, + enumerable: true, + configurable: true +}); + +Object.defineProperty(URL.prototype, "username", { + get() { + return this[impl].username; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].username = V; + }, + enumerable: true, + configurable: true +}); + +Object.defineProperty(URL.prototype, "password", { + get() { + return this[impl].password; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].password = V; + }, + enumerable: true, + configurable: true +}); + +Object.defineProperty(URL.prototype, "host", { + get() { + return this[impl].host; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].host = V; + }, + enumerable: true, + configurable: true +}); + +Object.defineProperty(URL.prototype, "hostname", { + get() { + return this[impl].hostname; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].hostname = V; + }, + enumerable: true, + configurable: true +}); + +Object.defineProperty(URL.prototype, "port", { + get() { + return this[impl].port; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].port = V; + }, + enumerable: true, + configurable: true +}); + +Object.defineProperty(URL.prototype, "pathname", { + get() { + return this[impl].pathname; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].pathname = V; + }, + enumerable: true, + configurable: true +}); + +Object.defineProperty(URL.prototype, "search", { + get() { + return this[impl].search; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].search = V; + }, + enumerable: true, + configurable: true +}); + +Object.defineProperty(URL.prototype, "hash", { + get() { + return this[impl].hash; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].hash = V; + }, + enumerable: true, + configurable: true +}); + + +module.exports = { + is(obj) { + return !!obj && obj[impl] instanceof Impl.implementation; + }, + create(constructorArgs, privateData) { + let obj = Object.create(URL.prototype); + this.setup(obj, constructorArgs, privateData); + return obj; + }, + setup(obj, constructorArgs, privateData) { + if (!privateData) privateData = {}; + privateData.wrapper = obj; + + obj[impl] = new Impl.implementation(constructorArgs, privateData); + obj[impl][utils.wrapperSymbol] = obj; + }, + interface: URL, + expose: { + Window: { URL: URL }, + Worker: { URL: URL } + } +}; + + + +/***/ }), + +/***/ 3323: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +exports.URL = __nccwpck_require__(653)["interface"]; +exports.serializeURL = __nccwpck_require__(33).serializeURL; +exports.serializeURLOrigin = __nccwpck_require__(33).serializeURLOrigin; +exports.basicURLParse = __nccwpck_require__(33).basicURLParse; +exports.setTheUsername = __nccwpck_require__(33).setTheUsername; +exports.setThePassword = __nccwpck_require__(33).setThePassword; +exports.serializeHost = __nccwpck_require__(33).serializeHost; +exports.serializeInteger = __nccwpck_require__(33).serializeInteger; +exports.parseURL = __nccwpck_require__(33).parseURL; + + +/***/ }), + +/***/ 33: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + +const punycode = __nccwpck_require__(5477); +const tr46 = __nccwpck_require__(2299); + +const specialSchemes = { + ftp: 21, + file: null, + gopher: 70, + http: 80, + https: 443, + ws: 80, + wss: 443 +}; + +const failure = Symbol("failure"); + +function countSymbols(str) { + return punycode.ucs2.decode(str).length; +} + +function at(input, idx) { + const c = input[idx]; + return isNaN(c) ? undefined : String.fromCodePoint(c); +} + +function isASCIIDigit(c) { + return c >= 0x30 && c <= 0x39; +} + +function isASCIIAlpha(c) { + return (c >= 0x41 && c <= 0x5A) || (c >= 0x61 && c <= 0x7A); +} + +function isASCIIAlphanumeric(c) { + return isASCIIAlpha(c) || isASCIIDigit(c); +} + +function isASCIIHex(c) { + return isASCIIDigit(c) || (c >= 0x41 && c <= 0x46) || (c >= 0x61 && c <= 0x66); +} + +function isSingleDot(buffer) { + return buffer === "." || buffer.toLowerCase() === "%2e"; +} + +function isDoubleDot(buffer) { + buffer = buffer.toLowerCase(); + return buffer === ".." || buffer === "%2e." || buffer === ".%2e" || buffer === "%2e%2e"; +} + +function isWindowsDriveLetterCodePoints(cp1, cp2) { + return isASCIIAlpha(cp1) && (cp2 === 58 || cp2 === 124); +} + +function isWindowsDriveLetterString(string) { + return string.length === 2 && isASCIIAlpha(string.codePointAt(0)) && (string[1] === ":" || string[1] === "|"); +} + +function isNormalizedWindowsDriveLetterString(string) { + return string.length === 2 && isASCIIAlpha(string.codePointAt(0)) && string[1] === ":"; +} + +function containsForbiddenHostCodePoint(string) { + return string.search(/\u0000|\u0009|\u000A|\u000D|\u0020|#|%|\/|:|\?|@|\[|\\|\]/) !== -1; +} + +function containsForbiddenHostCodePointExcludingPercent(string) { + return string.search(/\u0000|\u0009|\u000A|\u000D|\u0020|#|\/|:|\?|@|\[|\\|\]/) !== -1; +} + +function isSpecialScheme(scheme) { + return specialSchemes[scheme] !== undefined; +} + +function isSpecial(url) { + return isSpecialScheme(url.scheme); +} + +function defaultPort(scheme) { + return specialSchemes[scheme]; +} + +function percentEncode(c) { + let hex = c.toString(16).toUpperCase(); + if (hex.length === 1) { + hex = "0" + hex; + } + + return "%" + hex; +} + +function utf8PercentEncode(c) { + const buf = new Buffer(c); + + let str = ""; + + for (let i = 0; i < buf.length; ++i) { + str += percentEncode(buf[i]); + } + + return str; +} + +function utf8PercentDecode(str) { + const input = new Buffer(str); + const output = []; + for (let i = 0; i < input.length; ++i) { + if (input[i] !== 37) { + output.push(input[i]); + } else if (input[i] === 37 && isASCIIHex(input[i + 1]) && isASCIIHex(input[i + 2])) { + output.push(parseInt(input.slice(i + 1, i + 3).toString(), 16)); + i += 2; + } else { + output.push(input[i]); + } + } + return new Buffer(output).toString(); +} + +function isC0ControlPercentEncode(c) { + return c <= 0x1F || c > 0x7E; +} + +const extraPathPercentEncodeSet = new Set([32, 34, 35, 60, 62, 63, 96, 123, 125]); +function isPathPercentEncode(c) { + return isC0ControlPercentEncode(c) || extraPathPercentEncodeSet.has(c); +} + +const extraUserinfoPercentEncodeSet = + new Set([47, 58, 59, 61, 64, 91, 92, 93, 94, 124]); +function isUserinfoPercentEncode(c) { + return isPathPercentEncode(c) || extraUserinfoPercentEncodeSet.has(c); +} + +function percentEncodeChar(c, encodeSetPredicate) { + const cStr = String.fromCodePoint(c); + + if (encodeSetPredicate(c)) { + return utf8PercentEncode(cStr); + } + + return cStr; +} + +function parseIPv4Number(input) { + let R = 10; + + if (input.length >= 2 && input.charAt(0) === "0" && input.charAt(1).toLowerCase() === "x") { + input = input.substring(2); + R = 16; + } else if (input.length >= 2 && input.charAt(0) === "0") { + input = input.substring(1); + R = 8; + } + + if (input === "") { + return 0; + } + + const regex = R === 10 ? /[^0-9]/ : (R === 16 ? /[^0-9A-Fa-f]/ : /[^0-7]/); + if (regex.test(input)) { + return failure; + } + + return parseInt(input, R); +} + +function parseIPv4(input) { + const parts = input.split("."); + if (parts[parts.length - 1] === "") { + if (parts.length > 1) { + parts.pop(); + } + } + + if (parts.length > 4) { + return input; + } + + const numbers = []; + for (const part of parts) { + if (part === "") { + return input; + } + const n = parseIPv4Number(part); + if (n === failure) { + return input; + } + + numbers.push(n); + } + + for (let i = 0; i < numbers.length - 1; ++i) { + if (numbers[i] > 255) { + return failure; + } + } + if (numbers[numbers.length - 1] >= Math.pow(256, 5 - numbers.length)) { + return failure; + } + + let ipv4 = numbers.pop(); + let counter = 0; + + for (const n of numbers) { + ipv4 += n * Math.pow(256, 3 - counter); + ++counter; + } + + return ipv4; +} + +function serializeIPv4(address) { + let output = ""; + let n = address; + + for (let i = 1; i <= 4; ++i) { + output = String(n % 256) + output; + if (i !== 4) { + output = "." + output; + } + n = Math.floor(n / 256); + } + + return output; +} + +function parseIPv6(input) { + const address = [0, 0, 0, 0, 0, 0, 0, 0]; + let pieceIndex = 0; + let compress = null; + let pointer = 0; + + input = punycode.ucs2.decode(input); + + if (input[pointer] === 58) { + if (input[pointer + 1] !== 58) { + return failure; + } + + pointer += 2; + ++pieceIndex; + compress = pieceIndex; + } + + while (pointer < input.length) { + if (pieceIndex === 8) { + return failure; + } + + if (input[pointer] === 58) { + if (compress !== null) { + return failure; + } + ++pointer; + ++pieceIndex; + compress = pieceIndex; + continue; + } + + let value = 0; + let length = 0; + + while (length < 4 && isASCIIHex(input[pointer])) { + value = value * 0x10 + parseInt(at(input, pointer), 16); + ++pointer; + ++length; + } + + if (input[pointer] === 46) { + if (length === 0) { + return failure; + } + + pointer -= length; + + if (pieceIndex > 6) { + return failure; + } + + let numbersSeen = 0; + + while (input[pointer] !== undefined) { + let ipv4Piece = null; + + if (numbersSeen > 0) { + if (input[pointer] === 46 && numbersSeen < 4) { + ++pointer; + } else { + return failure; + } + } + + if (!isASCIIDigit(input[pointer])) { + return failure; + } + + while (isASCIIDigit(input[pointer])) { + const number = parseInt(at(input, pointer)); + if (ipv4Piece === null) { + ipv4Piece = number; + } else if (ipv4Piece === 0) { + return failure; + } else { + ipv4Piece = ipv4Piece * 10 + number; + } + if (ipv4Piece > 255) { + return failure; + } + ++pointer; + } + + address[pieceIndex] = address[pieceIndex] * 0x100 + ipv4Piece; + + ++numbersSeen; + + if (numbersSeen === 2 || numbersSeen === 4) { + ++pieceIndex; + } + } + + if (numbersSeen !== 4) { + return failure; + } + + break; + } else if (input[pointer] === 58) { + ++pointer; + if (input[pointer] === undefined) { + return failure; + } + } else if (input[pointer] !== undefined) { + return failure; + } + + address[pieceIndex] = value; + ++pieceIndex; + } + + if (compress !== null) { + let swaps = pieceIndex - compress; + pieceIndex = 7; + while (pieceIndex !== 0 && swaps > 0) { + const temp = address[compress + swaps - 1]; + address[compress + swaps - 1] = address[pieceIndex]; + address[pieceIndex] = temp; + --pieceIndex; + --swaps; + } + } else if (compress === null && pieceIndex !== 8) { + return failure; + } + + return address; +} + +function serializeIPv6(address) { + let output = ""; + const seqResult = findLongestZeroSequence(address); + const compress = seqResult.idx; + let ignore0 = false; + + for (let pieceIndex = 0; pieceIndex <= 7; ++pieceIndex) { + if (ignore0 && address[pieceIndex] === 0) { + continue; + } else if (ignore0) { + ignore0 = false; + } + + if (compress === pieceIndex) { + const separator = pieceIndex === 0 ? "::" : ":"; + output += separator; + ignore0 = true; + continue; + } + + output += address[pieceIndex].toString(16); + + if (pieceIndex !== 7) { + output += ":"; + } + } + + return output; +} + +function parseHost(input, isSpecialArg) { + if (input[0] === "[") { + if (input[input.length - 1] !== "]") { + return failure; + } + + return parseIPv6(input.substring(1, input.length - 1)); + } + + if (!isSpecialArg) { + return parseOpaqueHost(input); + } + + const domain = utf8PercentDecode(input); + const asciiDomain = tr46.toASCII(domain, false, tr46.PROCESSING_OPTIONS.NONTRANSITIONAL, false); + if (asciiDomain === null) { + return failure; + } + + if (containsForbiddenHostCodePoint(asciiDomain)) { + return failure; + } + + const ipv4Host = parseIPv4(asciiDomain); + if (typeof ipv4Host === "number" || ipv4Host === failure) { + return ipv4Host; + } + + return asciiDomain; +} + +function parseOpaqueHost(input) { + if (containsForbiddenHostCodePointExcludingPercent(input)) { + return failure; + } + + let output = ""; + const decoded = punycode.ucs2.decode(input); + for (let i = 0; i < decoded.length; ++i) { + output += percentEncodeChar(decoded[i], isC0ControlPercentEncode); + } + return output; +} + +function findLongestZeroSequence(arr) { + let maxIdx = null; + let maxLen = 1; // only find elements > 1 + let currStart = null; + let currLen = 0; + + for (let i = 0; i < arr.length; ++i) { + if (arr[i] !== 0) { + if (currLen > maxLen) { + maxIdx = currStart; + maxLen = currLen; + } + + currStart = null; + currLen = 0; + } else { + if (currStart === null) { + currStart = i; + } + ++currLen; + } + } + + // if trailing zeros + if (currLen > maxLen) { + maxIdx = currStart; + maxLen = currLen; + } + + return { + idx: maxIdx, + len: maxLen + }; +} + +function serializeHost(host) { + if (typeof host === "number") { + return serializeIPv4(host); + } + + // IPv6 serializer + if (host instanceof Array) { + return "[" + serializeIPv6(host) + "]"; + } + + return host; +} + +function trimControlChars(url) { + return url.replace(/^[\u0000-\u001F\u0020]+|[\u0000-\u001F\u0020]+$/g, ""); +} + +function trimTabAndNewline(url) { + return url.replace(/\u0009|\u000A|\u000D/g, ""); +} + +function shortenPath(url) { + const path = url.path; + if (path.length === 0) { + return; + } + if (url.scheme === "file" && path.length === 1 && isNormalizedWindowsDriveLetter(path[0])) { + return; + } + + path.pop(); +} + +function includesCredentials(url) { + return url.username !== "" || url.password !== ""; +} + +function cannotHaveAUsernamePasswordPort(url) { + return url.host === null || url.host === "" || url.cannotBeABaseURL || url.scheme === "file"; +} + +function isNormalizedWindowsDriveLetter(string) { + return /^[A-Za-z]:$/.test(string); +} + +function URLStateMachine(input, base, encodingOverride, url, stateOverride) { + this.pointer = 0; + this.input = input; + this.base = base || null; + this.encodingOverride = encodingOverride || "utf-8"; + this.stateOverride = stateOverride; + this.url = url; + this.failure = false; + this.parseError = false; + + if (!this.url) { + this.url = { + scheme: "", + username: "", + password: "", + host: null, + port: null, + path: [], + query: null, + fragment: null, + + cannotBeABaseURL: false + }; + + const res = trimControlChars(this.input); + if (res !== this.input) { + this.parseError = true; + } + this.input = res; + } + + const res = trimTabAndNewline(this.input); + if (res !== this.input) { + this.parseError = true; + } + this.input = res; + + this.state = stateOverride || "scheme start"; + + this.buffer = ""; + this.atFlag = false; + this.arrFlag = false; + this.passwordTokenSeenFlag = false; + + this.input = punycode.ucs2.decode(this.input); + + for (; this.pointer <= this.input.length; ++this.pointer) { + const c = this.input[this.pointer]; + const cStr = isNaN(c) ? undefined : String.fromCodePoint(c); + + // exec state machine + const ret = this["parse " + this.state](c, cStr); + if (!ret) { + break; // terminate algorithm + } else if (ret === failure) { + this.failure = true; + break; + } + } +} + +URLStateMachine.prototype["parse scheme start"] = function parseSchemeStart(c, cStr) { + if (isASCIIAlpha(c)) { + this.buffer += cStr.toLowerCase(); + this.state = "scheme"; + } else if (!this.stateOverride) { + this.state = "no scheme"; + --this.pointer; + } else { + this.parseError = true; + return failure; + } + + return true; +}; + +URLStateMachine.prototype["parse scheme"] = function parseScheme(c, cStr) { + if (isASCIIAlphanumeric(c) || c === 43 || c === 45 || c === 46) { + this.buffer += cStr.toLowerCase(); + } else if (c === 58) { + if (this.stateOverride) { + if (isSpecial(this.url) && !isSpecialScheme(this.buffer)) { + return false; + } + + if (!isSpecial(this.url) && isSpecialScheme(this.buffer)) { + return false; + } + + if ((includesCredentials(this.url) || this.url.port !== null) && this.buffer === "file") { + return false; + } + + if (this.url.scheme === "file" && (this.url.host === "" || this.url.host === null)) { + return false; + } + } + this.url.scheme = this.buffer; + this.buffer = ""; + if (this.stateOverride) { + return false; + } + if (this.url.scheme === "file") { + if (this.input[this.pointer + 1] !== 47 || this.input[this.pointer + 2] !== 47) { + this.parseError = true; + } + this.state = "file"; + } else if (isSpecial(this.url) && this.base !== null && this.base.scheme === this.url.scheme) { + this.state = "special relative or authority"; + } else if (isSpecial(this.url)) { + this.state = "special authority slashes"; + } else if (this.input[this.pointer + 1] === 47) { + this.state = "path or authority"; + ++this.pointer; + } else { + this.url.cannotBeABaseURL = true; + this.url.path.push(""); + this.state = "cannot-be-a-base-URL path"; + } + } else if (!this.stateOverride) { + this.buffer = ""; + this.state = "no scheme"; + this.pointer = -1; + } else { + this.parseError = true; + return failure; + } + + return true; +}; + +URLStateMachine.prototype["parse no scheme"] = function parseNoScheme(c) { + if (this.base === null || (this.base.cannotBeABaseURL && c !== 35)) { + return failure; + } else if (this.base.cannotBeABaseURL && c === 35) { + this.url.scheme = this.base.scheme; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + this.url.fragment = ""; + this.url.cannotBeABaseURL = true; + this.state = "fragment"; + } else if (this.base.scheme === "file") { + this.state = "file"; + --this.pointer; + } else { + this.state = "relative"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse special relative or authority"] = function parseSpecialRelativeOrAuthority(c) { + if (c === 47 && this.input[this.pointer + 1] === 47) { + this.state = "special authority ignore slashes"; + ++this.pointer; + } else { + this.parseError = true; + this.state = "relative"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse path or authority"] = function parsePathOrAuthority(c) { + if (c === 47) { + this.state = "authority"; + } else { + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse relative"] = function parseRelative(c) { + this.url.scheme = this.base.scheme; + if (isNaN(c)) { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + } else if (c === 47) { + this.state = "relative slash"; + } else if (c === 63) { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.url.path = this.base.path.slice(); + this.url.query = ""; + this.state = "query"; + } else if (c === 35) { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + this.url.fragment = ""; + this.state = "fragment"; + } else if (isSpecial(this.url) && c === 92) { + this.parseError = true; + this.state = "relative slash"; + } else { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.url.path = this.base.path.slice(0, this.base.path.length - 1); + + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse relative slash"] = function parseRelativeSlash(c) { + if (isSpecial(this.url) && (c === 47 || c === 92)) { + if (c === 92) { + this.parseError = true; + } + this.state = "special authority ignore slashes"; + } else if (c === 47) { + this.state = "authority"; + } else { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse special authority slashes"] = function parseSpecialAuthoritySlashes(c) { + if (c === 47 && this.input[this.pointer + 1] === 47) { + this.state = "special authority ignore slashes"; + ++this.pointer; + } else { + this.parseError = true; + this.state = "special authority ignore slashes"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse special authority ignore slashes"] = function parseSpecialAuthorityIgnoreSlashes(c) { + if (c !== 47 && c !== 92) { + this.state = "authority"; + --this.pointer; + } else { + this.parseError = true; + } + + return true; +}; + +URLStateMachine.prototype["parse authority"] = function parseAuthority(c, cStr) { + if (c === 64) { + this.parseError = true; + if (this.atFlag) { + this.buffer = "%40" + this.buffer; + } + this.atFlag = true; + + // careful, this is based on buffer and has its own pointer (this.pointer != pointer) and inner chars + const len = countSymbols(this.buffer); + for (let pointer = 0; pointer < len; ++pointer) { + const codePoint = this.buffer.codePointAt(pointer); + + if (codePoint === 58 && !this.passwordTokenSeenFlag) { + this.passwordTokenSeenFlag = true; + continue; + } + const encodedCodePoints = percentEncodeChar(codePoint, isUserinfoPercentEncode); + if (this.passwordTokenSeenFlag) { + this.url.password += encodedCodePoints; + } else { + this.url.username += encodedCodePoints; + } + } + this.buffer = ""; + } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || + (isSpecial(this.url) && c === 92)) { + if (this.atFlag && this.buffer === "") { + this.parseError = true; + return failure; + } + this.pointer -= countSymbols(this.buffer) + 1; + this.buffer = ""; + this.state = "host"; + } else { + this.buffer += cStr; + } + + return true; +}; + +URLStateMachine.prototype["parse hostname"] = +URLStateMachine.prototype["parse host"] = function parseHostName(c, cStr) { + if (this.stateOverride && this.url.scheme === "file") { + --this.pointer; + this.state = "file host"; + } else if (c === 58 && !this.arrFlag) { + if (this.buffer === "") { + this.parseError = true; + return failure; + } + + const host = parseHost(this.buffer, isSpecial(this.url)); + if (host === failure) { + return failure; + } + + this.url.host = host; + this.buffer = ""; + this.state = "port"; + if (this.stateOverride === "hostname") { + return false; + } + } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || + (isSpecial(this.url) && c === 92)) { + --this.pointer; + if (isSpecial(this.url) && this.buffer === "") { + this.parseError = true; + return failure; + } else if (this.stateOverride && this.buffer === "" && + (includesCredentials(this.url) || this.url.port !== null)) { + this.parseError = true; + return false; + } + + const host = parseHost(this.buffer, isSpecial(this.url)); + if (host === failure) { + return failure; + } + + this.url.host = host; + this.buffer = ""; + this.state = "path start"; + if (this.stateOverride) { + return false; + } + } else { + if (c === 91) { + this.arrFlag = true; + } else if (c === 93) { + this.arrFlag = false; + } + this.buffer += cStr; + } + + return true; +}; + +URLStateMachine.prototype["parse port"] = function parsePort(c, cStr) { + if (isASCIIDigit(c)) { + this.buffer += cStr; + } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || + (isSpecial(this.url) && c === 92) || + this.stateOverride) { + if (this.buffer !== "") { + const port = parseInt(this.buffer); + if (port > Math.pow(2, 16) - 1) { + this.parseError = true; + return failure; + } + this.url.port = port === defaultPort(this.url.scheme) ? null : port; + this.buffer = ""; + } + if (this.stateOverride) { + return false; + } + this.state = "path start"; + --this.pointer; + } else { + this.parseError = true; + return failure; + } + + return true; +}; + +const fileOtherwiseCodePoints = new Set([47, 92, 63, 35]); + +URLStateMachine.prototype["parse file"] = function parseFile(c) { + this.url.scheme = "file"; + + if (c === 47 || c === 92) { + if (c === 92) { + this.parseError = true; + } + this.state = "file slash"; + } else if (this.base !== null && this.base.scheme === "file") { + if (isNaN(c)) { + this.url.host = this.base.host; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + } else if (c === 63) { + this.url.host = this.base.host; + this.url.path = this.base.path.slice(); + this.url.query = ""; + this.state = "query"; + } else if (c === 35) { + this.url.host = this.base.host; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + this.url.fragment = ""; + this.state = "fragment"; + } else { + if (this.input.length - this.pointer - 1 === 0 || // remaining consists of 0 code points + !isWindowsDriveLetterCodePoints(c, this.input[this.pointer + 1]) || + (this.input.length - this.pointer - 1 >= 2 && // remaining has at least 2 code points + !fileOtherwiseCodePoints.has(this.input[this.pointer + 2]))) { + this.url.host = this.base.host; + this.url.path = this.base.path.slice(); + shortenPath(this.url); + } else { + this.parseError = true; + } + + this.state = "path"; + --this.pointer; + } + } else { + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse file slash"] = function parseFileSlash(c) { + if (c === 47 || c === 92) { + if (c === 92) { + this.parseError = true; + } + this.state = "file host"; + } else { + if (this.base !== null && this.base.scheme === "file") { + if (isNormalizedWindowsDriveLetterString(this.base.path[0])) { + this.url.path.push(this.base.path[0]); + } else { + this.url.host = this.base.host; + } + } + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse file host"] = function parseFileHost(c, cStr) { + if (isNaN(c) || c === 47 || c === 92 || c === 63 || c === 35) { + --this.pointer; + if (!this.stateOverride && isWindowsDriveLetterString(this.buffer)) { + this.parseError = true; + this.state = "path"; + } else if (this.buffer === "") { + this.url.host = ""; + if (this.stateOverride) { + return false; + } + this.state = "path start"; + } else { + let host = parseHost(this.buffer, isSpecial(this.url)); + if (host === failure) { + return failure; + } + if (host === "localhost") { + host = ""; + } + this.url.host = host; + + if (this.stateOverride) { + return false; + } + + this.buffer = ""; + this.state = "path start"; + } + } else { + this.buffer += cStr; + } + + return true; +}; + +URLStateMachine.prototype["parse path start"] = function parsePathStart(c) { + if (isSpecial(this.url)) { + if (c === 92) { + this.parseError = true; + } + this.state = "path"; + + if (c !== 47 && c !== 92) { + --this.pointer; + } + } else if (!this.stateOverride && c === 63) { + this.url.query = ""; + this.state = "query"; + } else if (!this.stateOverride && c === 35) { + this.url.fragment = ""; + this.state = "fragment"; + } else if (c !== undefined) { + this.state = "path"; + if (c !== 47) { + --this.pointer; + } + } + + return true; +}; + +URLStateMachine.prototype["parse path"] = function parsePath(c) { + if (isNaN(c) || c === 47 || (isSpecial(this.url) && c === 92) || + (!this.stateOverride && (c === 63 || c === 35))) { + if (isSpecial(this.url) && c === 92) { + this.parseError = true; + } + + if (isDoubleDot(this.buffer)) { + shortenPath(this.url); + if (c !== 47 && !(isSpecial(this.url) && c === 92)) { + this.url.path.push(""); + } + } else if (isSingleDot(this.buffer) && c !== 47 && + !(isSpecial(this.url) && c === 92)) { + this.url.path.push(""); + } else if (!isSingleDot(this.buffer)) { + if (this.url.scheme === "file" && this.url.path.length === 0 && isWindowsDriveLetterString(this.buffer)) { + if (this.url.host !== "" && this.url.host !== null) { + this.parseError = true; + this.url.host = ""; + } + this.buffer = this.buffer[0] + ":"; + } + this.url.path.push(this.buffer); + } + this.buffer = ""; + if (this.url.scheme === "file" && (c === undefined || c === 63 || c === 35)) { + while (this.url.path.length > 1 && this.url.path[0] === "") { + this.parseError = true; + this.url.path.shift(); + } + } + if (c === 63) { + this.url.query = ""; + this.state = "query"; + } + if (c === 35) { + this.url.fragment = ""; + this.state = "fragment"; + } + } else { + // TODO: If c is not a URL code point and not "%", parse error. + + if (c === 37 && + (!isASCIIHex(this.input[this.pointer + 1]) || + !isASCIIHex(this.input[this.pointer + 2]))) { + this.parseError = true; + } + + this.buffer += percentEncodeChar(c, isPathPercentEncode); + } + + return true; +}; + +URLStateMachine.prototype["parse cannot-be-a-base-URL path"] = function parseCannotBeABaseURLPath(c) { + if (c === 63) { + this.url.query = ""; + this.state = "query"; + } else if (c === 35) { + this.url.fragment = ""; + this.state = "fragment"; + } else { + // TODO: Add: not a URL code point + if (!isNaN(c) && c !== 37) { + this.parseError = true; + } + + if (c === 37 && + (!isASCIIHex(this.input[this.pointer + 1]) || + !isASCIIHex(this.input[this.pointer + 2]))) { + this.parseError = true; + } + + if (!isNaN(c)) { + this.url.path[0] = this.url.path[0] + percentEncodeChar(c, isC0ControlPercentEncode); + } + } + + return true; +}; + +URLStateMachine.prototype["parse query"] = function parseQuery(c, cStr) { + if (isNaN(c) || (!this.stateOverride && c === 35)) { + if (!isSpecial(this.url) || this.url.scheme === "ws" || this.url.scheme === "wss") { + this.encodingOverride = "utf-8"; + } + + const buffer = new Buffer(this.buffer); // TODO: Use encoding override instead + for (let i = 0; i < buffer.length; ++i) { + if (buffer[i] < 0x21 || buffer[i] > 0x7E || buffer[i] === 0x22 || buffer[i] === 0x23 || + buffer[i] === 0x3C || buffer[i] === 0x3E) { + this.url.query += percentEncode(buffer[i]); + } else { + this.url.query += String.fromCodePoint(buffer[i]); + } + } + + this.buffer = ""; + if (c === 35) { + this.url.fragment = ""; + this.state = "fragment"; + } + } else { + // TODO: If c is not a URL code point and not "%", parse error. + if (c === 37 && + (!isASCIIHex(this.input[this.pointer + 1]) || + !isASCIIHex(this.input[this.pointer + 2]))) { + this.parseError = true; + } + + this.buffer += cStr; + } + + return true; +}; + +URLStateMachine.prototype["parse fragment"] = function parseFragment(c) { + if (isNaN(c)) { // do nothing + } else if (c === 0x0) { + this.parseError = true; + } else { + // TODO: If c is not a URL code point and not "%", parse error. + if (c === 37 && + (!isASCIIHex(this.input[this.pointer + 1]) || + !isASCIIHex(this.input[this.pointer + 2]))) { + this.parseError = true; + } + + this.url.fragment += percentEncodeChar(c, isC0ControlPercentEncode); + } + + return true; +}; + +function serializeURL(url, excludeFragment) { + let output = url.scheme + ":"; + if (url.host !== null) { + output += "//"; + + if (url.username !== "" || url.password !== "") { + output += url.username; + if (url.password !== "") { + output += ":" + url.password; + } + output += "@"; + } + + output += serializeHost(url.host); + + if (url.port !== null) { + output += ":" + url.port; + } + } else if (url.host === null && url.scheme === "file") { + output += "//"; + } + + if (url.cannotBeABaseURL) { + output += url.path[0]; + } else { + for (const string of url.path) { + output += "/" + string; + } + } + + if (url.query !== null) { + output += "?" + url.query; + } + + if (!excludeFragment && url.fragment !== null) { + output += "#" + url.fragment; + } + + return output; +} + +function serializeOrigin(tuple) { + let result = tuple.scheme + "://"; + result += serializeHost(tuple.host); + + if (tuple.port !== null) { + result += ":" + tuple.port; + } + + return result; +} + +module.exports.serializeURL = serializeURL; + +module.exports.serializeURLOrigin = function (url) { + // https://url.spec.whatwg.org/#concept-url-origin + switch (url.scheme) { + case "blob": + try { + return module.exports.serializeURLOrigin(module.exports.parseURL(url.path[0])); + } catch (e) { + // serializing an opaque origin returns "null" + return "null"; + } + case "ftp": + case "gopher": + case "http": + case "https": + case "ws": + case "wss": + return serializeOrigin({ + scheme: url.scheme, + host: url.host, + port: url.port + }); + case "file": + // spec says "exercise to the reader", chrome says "file://" + return "file://"; + default: + // serializing an opaque origin returns "null" + return "null"; + } +}; + +module.exports.basicURLParse = function (input, options) { + if (options === undefined) { + options = {}; + } + + const usm = new URLStateMachine(input, options.baseURL, options.encodingOverride, options.url, options.stateOverride); + if (usm.failure) { + return "failure"; + } + + return usm.url; +}; + +module.exports.setTheUsername = function (url, username) { + url.username = ""; + const decoded = punycode.ucs2.decode(username); + for (let i = 0; i < decoded.length; ++i) { + url.username += percentEncodeChar(decoded[i], isUserinfoPercentEncode); + } +}; + +module.exports.setThePassword = function (url, password) { + url.password = ""; + const decoded = punycode.ucs2.decode(password); + for (let i = 0; i < decoded.length; ++i) { + url.password += percentEncodeChar(decoded[i], isUserinfoPercentEncode); + } +}; + +module.exports.serializeHost = serializeHost; + +module.exports.cannotHaveAUsernamePasswordPort = cannotHaveAUsernamePasswordPort; + +module.exports.serializeInteger = function (integer) { + return String(integer); +}; + +module.exports.parseURL = function (input, options) { + if (options === undefined) { + options = {}; + } + + // We don't handle blobs, so this just delegates: + return module.exports.basicURLParse(input, { baseURL: options.baseURL, encodingOverride: options.encodingOverride }); +}; + + +/***/ }), + +/***/ 276: +/***/ ((module) => { + +"use strict"; + + +module.exports.mixin = function mixin(target, source) { + const keys = Object.getOwnPropertyNames(source); + for (let i = 0; i < keys.length; ++i) { + Object.defineProperty(target, keys[i], Object.getOwnPropertyDescriptor(source, keys[i])); + } +}; + +module.exports.wrapperSymbol = Symbol("wrapper"); +module.exports.implSymbol = Symbol("impl"); + +module.exports.wrapperForImpl = function (impl) { + return impl[module.exports.wrapperSymbol]; +}; + +module.exports.implForWrapper = function (wrapper) { + return wrapper[module.exports.implSymbol]; +}; + + + +/***/ }), + +/***/ 1223: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +var wrappy = __nccwpck_require__(2940) +module.exports = wrappy(once) +module.exports.strict = wrappy(onceStrict) + +once.proto = once(function () { + Object.defineProperty(Function.prototype, 'once', { + value: function () { + return once(this) + }, + configurable: true + }) + + Object.defineProperty(Function.prototype, 'onceStrict', { + value: function () { + return onceStrict(this) + }, + configurable: true + }) +}) + +function once (fn) { + var f = function () { + if (f.called) return f.value + f.called = true + return f.value = fn.apply(this, arguments) + } + f.called = false + return f +} + +function onceStrict (fn) { + var f = function () { + if (f.called) + throw new Error(f.onceError) + f.called = true + return f.value = fn.apply(this, arguments) + } + var name = fn.name || 'Function wrapped with `once`' + f.onceError = name + " shouldn't be called more than once" + f.called = false + return f +} + + +/***/ }), + +/***/ 4294: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +module.exports = __nccwpck_require__(4219); + + +/***/ }), + +/***/ 4219: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +var net = __nccwpck_require__(1808); +var tls = __nccwpck_require__(4404); +var http = __nccwpck_require__(3685); +var https = __nccwpck_require__(5687); +var events = __nccwpck_require__(2361); +var assert = __nccwpck_require__(9491); +var util = __nccwpck_require__(3837); + + +exports.httpOverHttp = httpOverHttp; +exports.httpsOverHttp = httpsOverHttp; +exports.httpOverHttps = httpOverHttps; +exports.httpsOverHttps = httpsOverHttps; + + +function httpOverHttp(options) { + var agent = new TunnelingAgent(options); + agent.request = http.request; + return agent; +} + +function httpsOverHttp(options) { + var agent = new TunnelingAgent(options); + agent.request = http.request; + agent.createSocket = createSecureSocket; + agent.defaultPort = 443; + return agent; +} + +function httpOverHttps(options) { + var agent = new TunnelingAgent(options); + agent.request = https.request; + return agent; +} + +function httpsOverHttps(options) { + var agent = new TunnelingAgent(options); + agent.request = https.request; + agent.createSocket = createSecureSocket; + agent.defaultPort = 443; + return agent; +} + + +function TunnelingAgent(options) { + var self = this; + self.options = options || {}; + self.proxyOptions = self.options.proxy || {}; + self.maxSockets = self.options.maxSockets || http.Agent.defaultMaxSockets; + self.requests = []; + self.sockets = []; + + self.on('free', function onFree(socket, host, port, localAddress) { + var options = toOptions(host, port, localAddress); + for (var i = 0, len = self.requests.length; i < len; ++i) { + var pending = self.requests[i]; + if (pending.host === options.host && pending.port === options.port) { + // Detect the request to connect same origin server, + // reuse the connection. + self.requests.splice(i, 1); + pending.request.onSocket(socket); + return; + } + } + socket.destroy(); + self.removeSocket(socket); + }); +} +util.inherits(TunnelingAgent, events.EventEmitter); + +TunnelingAgent.prototype.addRequest = function addRequest(req, host, port, localAddress) { + var self = this; + var options = mergeOptions({request: req}, self.options, toOptions(host, port, localAddress)); + + if (self.sockets.length >= this.maxSockets) { + // We are over limit so we'll add it to the queue. + self.requests.push(options); + return; + } + + // If we are under maxSockets create a new one. + self.createSocket(options, function(socket) { + socket.on('free', onFree); + socket.on('close', onCloseOrRemove); + socket.on('agentRemove', onCloseOrRemove); + req.onSocket(socket); + + function onFree() { + self.emit('free', socket, options); + } + + function onCloseOrRemove(err) { + self.removeSocket(socket); + socket.removeListener('free', onFree); + socket.removeListener('close', onCloseOrRemove); + socket.removeListener('agentRemove', onCloseOrRemove); + } + }); +}; + +TunnelingAgent.prototype.createSocket = function createSocket(options, cb) { + var self = this; + var placeholder = {}; + self.sockets.push(placeholder); + + var connectOptions = mergeOptions({}, self.proxyOptions, { + method: 'CONNECT', + path: options.host + ':' + options.port, + agent: false, + headers: { + host: options.host + ':' + options.port + } + }); + if (options.localAddress) { + connectOptions.localAddress = options.localAddress; + } + if (connectOptions.proxyAuth) { + connectOptions.headers = connectOptions.headers || {}; + connectOptions.headers['Proxy-Authorization'] = 'Basic ' + + new Buffer(connectOptions.proxyAuth).toString('base64'); + } + + debug('making CONNECT request'); + var connectReq = self.request(connectOptions); + connectReq.useChunkedEncodingByDefault = false; // for v0.6 + connectReq.once('response', onResponse); // for v0.6 + connectReq.once('upgrade', onUpgrade); // for v0.6 + connectReq.once('connect', onConnect); // for v0.7 or later + connectReq.once('error', onError); + connectReq.end(); + + function onResponse(res) { + // Very hacky. This is necessary to avoid http-parser leaks. + res.upgrade = true; + } + + function onUpgrade(res, socket, head) { + // Hacky. + process.nextTick(function() { + onConnect(res, socket, head); + }); + } + + function onConnect(res, socket, head) { + connectReq.removeAllListeners(); + socket.removeAllListeners(); + + if (res.statusCode !== 200) { + debug('tunneling socket could not be established, statusCode=%d', + res.statusCode); + socket.destroy(); + var error = new Error('tunneling socket could not be established, ' + + 'statusCode=' + res.statusCode); + error.code = 'ECONNRESET'; + options.request.emit('error', error); + self.removeSocket(placeholder); + return; + } + if (head.length > 0) { + debug('got illegal response body from proxy'); + socket.destroy(); + var error = new Error('got illegal response body from proxy'); + error.code = 'ECONNRESET'; + options.request.emit('error', error); + self.removeSocket(placeholder); + return; + } + debug('tunneling connection has established'); + self.sockets[self.sockets.indexOf(placeholder)] = socket; + return cb(socket); + } + + function onError(cause) { + connectReq.removeAllListeners(); + + debug('tunneling socket could not be established, cause=%s\n', + cause.message, cause.stack); + var error = new Error('tunneling socket could not be established, ' + + 'cause=' + cause.message); + error.code = 'ECONNRESET'; + options.request.emit('error', error); + self.removeSocket(placeholder); + } +}; + +TunnelingAgent.prototype.removeSocket = function removeSocket(socket) { + var pos = this.sockets.indexOf(socket) + if (pos === -1) { + return; + } + this.sockets.splice(pos, 1); + + var pending = this.requests.shift(); + if (pending) { + // If we have pending requests and a socket gets closed a new one + // needs to be created to take over in the pool for the one that closed. + this.createSocket(pending, function(socket) { + pending.request.onSocket(socket); + }); + } +}; + +function createSecureSocket(options, cb) { + var self = this; + TunnelingAgent.prototype.createSocket.call(self, options, function(socket) { + var hostHeader = options.request.getHeader('host'); + var tlsOptions = mergeOptions({}, self.options, { + socket: socket, + servername: hostHeader ? hostHeader.replace(/:.*$/, '') : options.host + }); + + // 0 is dummy port for v0.6 + var secureSocket = tls.connect(0, tlsOptions); + self.sockets[self.sockets.indexOf(socket)] = secureSocket; + cb(secureSocket); + }); +} + + +function toOptions(host, port, localAddress) { + if (typeof host === 'string') { // since v0.10 + return { + host: host, + port: port, + localAddress: localAddress + }; + } + return host; // for v0.11 or later +} + +function mergeOptions(target) { + for (var i = 1, len = arguments.length; i < len; ++i) { + var overrides = arguments[i]; + if (typeof overrides === 'object') { + var keys = Object.keys(overrides); + for (var j = 0, keyLen = keys.length; j < keyLen; ++j) { + var k = keys[j]; + if (overrides[k] !== undefined) { + target[k] = overrides[k]; + } + } + } + } + return target; +} + + +var debug; +if (process.env.NODE_DEBUG && /\btunnel\b/.test(process.env.NODE_DEBUG)) { + debug = function() { + var args = Array.prototype.slice.call(arguments); + if (typeof args[0] === 'string') { + args[0] = 'TUNNEL: ' + args[0]; + } else { + args.unshift('TUNNEL:'); + } + console.error.apply(console, args); + } +} else { + debug = function() {}; +} +exports.debug = debug; // for test + + +/***/ }), + +/***/ 5030: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ value: true })); + +function getUserAgent() { + if (typeof navigator === "object" && "userAgent" in navigator) { + return navigator.userAgent; + } + + if (typeof process === "object" && "version" in process) { + return `Node.js/${process.version.substr(1)} (${process.platform}; ${process.arch})`; + } + + return ""; +} + +exports.getUserAgent = getUserAgent; +//# sourceMappingURL=index.js.map + + +/***/ }), + +/***/ 5840: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +Object.defineProperty(exports, "v1", ({ + enumerable: true, + get: function () { + return _v.default; + } +})); +Object.defineProperty(exports, "v3", ({ + enumerable: true, + get: function () { + return _v2.default; + } +})); +Object.defineProperty(exports, "v4", ({ + enumerable: true, + get: function () { + return _v3.default; + } +})); +Object.defineProperty(exports, "v5", ({ + enumerable: true, + get: function () { + return _v4.default; + } +})); +Object.defineProperty(exports, "NIL", ({ + enumerable: true, + get: function () { + return _nil.default; + } +})); +Object.defineProperty(exports, "version", ({ + enumerable: true, + get: function () { + return _version.default; + } +})); +Object.defineProperty(exports, "validate", ({ + enumerable: true, + get: function () { + return _validate.default; + } +})); +Object.defineProperty(exports, "stringify", ({ + enumerable: true, + get: function () { + return _stringify.default; + } +})); +Object.defineProperty(exports, "parse", ({ + enumerable: true, + get: function () { + return _parse.default; + } +})); + +var _v = _interopRequireDefault(__nccwpck_require__(8628)); + +var _v2 = _interopRequireDefault(__nccwpck_require__(6409)); + +var _v3 = _interopRequireDefault(__nccwpck_require__(5122)); + +var _v4 = _interopRequireDefault(__nccwpck_require__(9120)); + +var _nil = _interopRequireDefault(__nccwpck_require__(5332)); + +var _version = _interopRequireDefault(__nccwpck_require__(1595)); + +var _validate = _interopRequireDefault(__nccwpck_require__(6900)); + +var _stringify = _interopRequireDefault(__nccwpck_require__(8950)); + +var _parse = _interopRequireDefault(__nccwpck_require__(2746)); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/***/ }), + +/***/ 4569: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; + +var _crypto = _interopRequireDefault(__nccwpck_require__(6113)); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function md5(bytes) { + if (Array.isArray(bytes)) { + bytes = Buffer.from(bytes); + } else if (typeof bytes === 'string') { + bytes = Buffer.from(bytes, 'utf8'); + } + + return _crypto.default.createHash('md5').update(bytes).digest(); +} + +var _default = md5; +exports["default"] = _default; + +/***/ }), + +/***/ 5332: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; +var _default = '00000000-0000-0000-0000-000000000000'; +exports["default"] = _default; + +/***/ }), + +/***/ 2746: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; + +var _validate = _interopRequireDefault(__nccwpck_require__(6900)); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function parse(uuid) { + if (!(0, _validate.default)(uuid)) { + throw TypeError('Invalid UUID'); + } + + let v; + const arr = new Uint8Array(16); // Parse ########-....-....-....-............ + + arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24; + arr[1] = v >>> 16 & 0xff; + arr[2] = v >>> 8 & 0xff; + arr[3] = v & 0xff; // Parse ........-####-....-....-............ + + arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8; + arr[5] = v & 0xff; // Parse ........-....-####-....-............ + + arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8; + arr[7] = v & 0xff; // Parse ........-....-....-####-............ + + arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8; + arr[9] = v & 0xff; // Parse ........-....-....-....-############ + // (Use "/" to avoid 32-bit truncation when bit-shifting high-order bytes) + + arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff; + arr[11] = v / 0x100000000 & 0xff; + arr[12] = v >>> 24 & 0xff; + arr[13] = v >>> 16 & 0xff; + arr[14] = v >>> 8 & 0xff; + arr[15] = v & 0xff; + return arr; +} + +var _default = parse; +exports["default"] = _default; + +/***/ }), + +/***/ 814: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; +var _default = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i; +exports["default"] = _default; + +/***/ }), + +/***/ 807: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = rng; + +var _crypto = _interopRequireDefault(__nccwpck_require__(6113)); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const rnds8Pool = new Uint8Array(256); // # of random values to pre-allocate + +let poolPtr = rnds8Pool.length; + +function rng() { + if (poolPtr > rnds8Pool.length - 16) { + _crypto.default.randomFillSync(rnds8Pool); + + poolPtr = 0; + } + + return rnds8Pool.slice(poolPtr, poolPtr += 16); +} + +/***/ }), + +/***/ 5274: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; + +var _crypto = _interopRequireDefault(__nccwpck_require__(6113)); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function sha1(bytes) { + if (Array.isArray(bytes)) { + bytes = Buffer.from(bytes); + } else if (typeof bytes === 'string') { + bytes = Buffer.from(bytes, 'utf8'); + } + + return _crypto.default.createHash('sha1').update(bytes).digest(); +} + +var _default = sha1; +exports["default"] = _default; + +/***/ }), + +/***/ 8950: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; + +var _validate = _interopRequireDefault(__nccwpck_require__(6900)); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Convert array of 16 byte values to UUID string format of the form: + * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX + */ +const byteToHex = []; + +for (let i = 0; i < 256; ++i) { + byteToHex.push((i + 0x100).toString(16).substr(1)); +} + +function stringify(arr, offset = 0) { + // Note: Be careful editing this code! It's been tuned for performance + // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434 + const uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one + // of the following: + // - One or more input array values don't map to a hex octet (leading to + // "undefined" in the uuid) + // - Invalid input values for the RFC `version` or `variant` fields + + if (!(0, _validate.default)(uuid)) { + throw TypeError('Stringified UUID is invalid'); + } + + return uuid; +} + +var _default = stringify; +exports["default"] = _default; + +/***/ }), + +/***/ 8628: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; + +var _rng = _interopRequireDefault(__nccwpck_require__(807)); + +var _stringify = _interopRequireDefault(__nccwpck_require__(8950)); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +// **`v1()` - Generate time-based UUID** +// +// Inspired by https://github.com/LiosK/UUID.js +// and http://docs.python.org/library/uuid.html +let _nodeId; + +let _clockseq; // Previous uuid creation time + + +let _lastMSecs = 0; +let _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details + +function v1(options, buf, offset) { + let i = buf && offset || 0; + const b = buf || new Array(16); + options = options || {}; + let node = options.node || _nodeId; + let clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not + // specified. We do this lazily to minimize issues related to insufficient + // system entropy. See #189 + + if (node == null || clockseq == null) { + const seedBytes = options.random || (options.rng || _rng.default)(); + + if (node == null) { + // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1) + node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]]; + } + + if (clockseq == null) { + // Per 4.2.2, randomize (14 bit) clockseq + clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff; + } + } // UUID timestamps are 100 nano-second units since the Gregorian epoch, + // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so + // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs' + // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00. + + + let msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock + // cycle to simulate higher resolution clock + + let nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs) + + const dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression + + if (dt < 0 && options.clockseq === undefined) { + clockseq = clockseq + 1 & 0x3fff; + } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new + // time interval + + + if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) { + nsecs = 0; + } // Per 4.2.1.2 Throw error if too many uuids are requested + + + if (nsecs >= 10000) { + throw new Error("uuid.v1(): Can't create more than 10M uuids/sec"); + } + + _lastMSecs = msecs; + _lastNSecs = nsecs; + _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch + + msecs += 12219292800000; // `time_low` + + const tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000; + b[i++] = tl >>> 24 & 0xff; + b[i++] = tl >>> 16 & 0xff; + b[i++] = tl >>> 8 & 0xff; + b[i++] = tl & 0xff; // `time_mid` + + const tmh = msecs / 0x100000000 * 10000 & 0xfffffff; + b[i++] = tmh >>> 8 & 0xff; + b[i++] = tmh & 0xff; // `time_high_and_version` + + b[i++] = tmh >>> 24 & 0xf | 0x10; // include version + + b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant) + + b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low` + + b[i++] = clockseq & 0xff; // `node` + + for (let n = 0; n < 6; ++n) { + b[i + n] = node[n]; + } + + return buf || (0, _stringify.default)(b); +} + +var _default = v1; +exports["default"] = _default; + +/***/ }), + +/***/ 6409: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; + +var _v = _interopRequireDefault(__nccwpck_require__(5998)); + +var _md = _interopRequireDefault(__nccwpck_require__(4569)); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const v3 = (0, _v.default)('v3', 0x30, _md.default); +var _default = v3; +exports["default"] = _default; + +/***/ }), + +/***/ 5998: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = _default; +exports.URL = exports.DNS = void 0; + +var _stringify = _interopRequireDefault(__nccwpck_require__(8950)); + +var _parse = _interopRequireDefault(__nccwpck_require__(2746)); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function stringToBytes(str) { + str = unescape(encodeURIComponent(str)); // UTF8 escape + + const bytes = []; + + for (let i = 0; i < str.length; ++i) { + bytes.push(str.charCodeAt(i)); + } + + return bytes; +} + +const DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8'; +exports.DNS = DNS; +const URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8'; +exports.URL = URL; + +function _default(name, version, hashfunc) { + function generateUUID(value, namespace, buf, offset) { + if (typeof value === 'string') { + value = stringToBytes(value); + } + + if (typeof namespace === 'string') { + namespace = (0, _parse.default)(namespace); + } + + if (namespace.length !== 16) { + throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)'); + } // Compute hash of namespace and value, Per 4.3 + // Future: Use spread syntax when supported on all platforms, e.g. `bytes = + // hashfunc([...namespace, ... value])` + + + let bytes = new Uint8Array(16 + value.length); + bytes.set(namespace); + bytes.set(value, namespace.length); + bytes = hashfunc(bytes); + bytes[6] = bytes[6] & 0x0f | version; + bytes[8] = bytes[8] & 0x3f | 0x80; + + if (buf) { + offset = offset || 0; + + for (let i = 0; i < 16; ++i) { + buf[offset + i] = bytes[i]; + } + + return buf; + } + + return (0, _stringify.default)(bytes); + } // Function#name is not settable on some platforms (#270) + + + try { + generateUUID.name = name; // eslint-disable-next-line no-empty + } catch (err) {} // For CommonJS default export support + + + generateUUID.DNS = DNS; + generateUUID.URL = URL; + return generateUUID; +} + +/***/ }), + +/***/ 5122: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; + +var _rng = _interopRequireDefault(__nccwpck_require__(807)); + +var _stringify = _interopRequireDefault(__nccwpck_require__(8950)); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function v4(options, buf, offset) { + options = options || {}; + + const rnds = options.random || (options.rng || _rng.default)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved` + + + rnds[6] = rnds[6] & 0x0f | 0x40; + rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided + + if (buf) { + offset = offset || 0; + + for (let i = 0; i < 16; ++i) { + buf[offset + i] = rnds[i]; + } + + return buf; + } + + return (0, _stringify.default)(rnds); +} + +var _default = v4; +exports["default"] = _default; + +/***/ }), + +/***/ 9120: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; + +var _v = _interopRequireDefault(__nccwpck_require__(5998)); + +var _sha = _interopRequireDefault(__nccwpck_require__(5274)); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const v5 = (0, _v.default)('v5', 0x50, _sha.default); +var _default = v5; +exports["default"] = _default; + +/***/ }), + +/***/ 6900: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; + +var _regex = _interopRequireDefault(__nccwpck_require__(814)); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function validate(uuid) { + return typeof uuid === 'string' && _regex.default.test(uuid); +} + +var _default = validate; +exports["default"] = _default; + +/***/ }), + +/***/ 1595: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; + +var _validate = _interopRequireDefault(__nccwpck_require__(6900)); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function version(uuid) { + if (!(0, _validate.default)(uuid)) { + throw TypeError('Invalid UUID'); + } + + return parseInt(uuid.substr(14, 1), 16); +} + +var _default = version; +exports["default"] = _default; + +/***/ }), + +/***/ 2940: +/***/ ((module) => { + +// Returns a wrapper function that returns a wrapped callback +// The wrapper function should do some stuff, and return a +// presumably different callback function. +// This makes sure that own properties are retained, so that +// decorations and such are not lost along the way. +module.exports = wrappy +function wrappy (fn, cb) { + if (fn && cb) return wrappy(fn)(cb) + + if (typeof fn !== 'function') + throw new TypeError('need wrapper function') + + Object.keys(fn).forEach(function (k) { + wrapper[k] = fn[k] + }) + + return wrapper + + function wrapper() { + var args = new Array(arguments.length) + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i] + } + var ret = fn.apply(this, args) + var cb = args[args.length-1] + if (typeof ret === 'function' && ret !== cb) { + Object.keys(cb).forEach(function (k) { + ret[k] = cb[k] + }) + } + return ret + } +} + + +/***/ }), + +/***/ 2877: +/***/ ((module) => { + +module.exports = eval("require")("encoding"); + + +/***/ }), + +/***/ 9491: +/***/ ((module) => { + +"use strict"; +module.exports = require("assert"); + +/***/ }), + +/***/ 6113: +/***/ ((module) => { + +"use strict"; +module.exports = require("crypto"); + +/***/ }), + +/***/ 2361: +/***/ ((module) => { + +"use strict"; +module.exports = require("events"); + +/***/ }), + +/***/ 7147: +/***/ ((module) => { + +"use strict"; +module.exports = require("fs"); + +/***/ }), + +/***/ 3685: +/***/ ((module) => { + +"use strict"; +module.exports = require("http"); + +/***/ }), + +/***/ 5687: +/***/ ((module) => { + +"use strict"; +module.exports = require("https"); + +/***/ }), + +/***/ 1808: +/***/ ((module) => { + +"use strict"; +module.exports = require("net"); + +/***/ }), + +/***/ 2037: +/***/ ((module) => { + +"use strict"; +module.exports = require("os"); + +/***/ }), + +/***/ 1017: +/***/ ((module) => { + +"use strict"; +module.exports = require("path"); + +/***/ }), + +/***/ 5477: +/***/ ((module) => { + +"use strict"; +module.exports = require("punycode"); + +/***/ }), + +/***/ 2781: +/***/ ((module) => { + +"use strict"; +module.exports = require("stream"); + +/***/ }), + +/***/ 4404: +/***/ ((module) => { + +"use strict"; +module.exports = require("tls"); + +/***/ }), + +/***/ 7310: +/***/ ((module) => { + +"use strict"; +module.exports = require("url"); + +/***/ }), + +/***/ 3837: +/***/ ((module) => { + +"use strict"; +module.exports = require("util"); + +/***/ }), + +/***/ 9796: +/***/ ((module) => { + +"use strict"; +module.exports = require("zlib"); + +/***/ }), + +/***/ 6717: +/***/ ((__unused_webpack_module, exports) => { + +// Underscore.js 1.13.6 +// https://underscorejs.org +// (c) 2009-2022 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors +// Underscore may be freely distributed under the MIT license. + +Object.defineProperty(exports, "__esModule", ({ value: true })); + +// Current version. +var VERSION = '1.13.6'; + +// Establish the root object, `window` (`self`) in the browser, `global` +// on the server, or `this` in some virtual machines. We use `self` +// instead of `window` for `WebWorker` support. +var root = (typeof self == 'object' && self.self === self && self) || + (typeof global == 'object' && global.global === global && global) || + Function('return this')() || + {}; + +// Save bytes in the minified (but not gzipped) version: +var ArrayProto = Array.prototype, ObjProto = Object.prototype; +var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null; + +// Create quick reference variables for speed access to core prototypes. +var push = ArrayProto.push, + slice = ArrayProto.slice, + toString = ObjProto.toString, + hasOwnProperty = ObjProto.hasOwnProperty; + +// Modern feature detection. +var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined', + supportsDataView = typeof DataView !== 'undefined'; + +// All **ECMAScript 5+** native function implementations that we hope to use +// are declared here. +var nativeIsArray = Array.isArray, + nativeKeys = Object.keys, + nativeCreate = Object.create, + nativeIsView = supportsArrayBuffer && ArrayBuffer.isView; + +// Create references to these builtin functions because we override them. +var _isNaN = isNaN, + _isFinite = isFinite; + +// Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed. +var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString'); +var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString', + 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString']; + +// The largest integer that can be represented exactly. +var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1; + +// Some functions take a variable number of arguments, or a few expected +// arguments at the beginning and then a variable number of values to operate +// on. This helper accumulates all remaining arguments past the function’s +// argument length (or an explicit `startIndex`), into an array that becomes +// the last argument. Similar to ES6’s "rest parameter". +function restArguments(func, startIndex) { + startIndex = startIndex == null ? func.length - 1 : +startIndex; + return function() { + var length = Math.max(arguments.length - startIndex, 0), + rest = Array(length), + index = 0; + for (; index < length; index++) { + rest[index] = arguments[index + startIndex]; + } + switch (startIndex) { + case 0: return func.call(this, rest); + case 1: return func.call(this, arguments[0], rest); + case 2: return func.call(this, arguments[0], arguments[1], rest); + } + var args = Array(startIndex + 1); + for (index = 0; index < startIndex; index++) { + args[index] = arguments[index]; + } + args[startIndex] = rest; + return func.apply(this, args); + }; +} + +// Is a given variable an object? +function isObject(obj) { + var type = typeof obj; + return type === 'function' || (type === 'object' && !!obj); +} + +// Is a given value equal to null? +function isNull(obj) { + return obj === null; +} + +// Is a given variable undefined? +function isUndefined(obj) { + return obj === void 0; +} + +// Is a given value a boolean? +function isBoolean(obj) { + return obj === true || obj === false || toString.call(obj) === '[object Boolean]'; +} + +// Is a given value a DOM element? +function isElement(obj) { + return !!(obj && obj.nodeType === 1); +} + +// Internal function for creating a `toString`-based type tester. +function tagTester(name) { + var tag = '[object ' + name + ']'; + return function(obj) { + return toString.call(obj) === tag; + }; +} + +var isString = tagTester('String'); + +var isNumber = tagTester('Number'); + +var isDate = tagTester('Date'); + +var isRegExp = tagTester('RegExp'); + +var isError = tagTester('Error'); + +var isSymbol = tagTester('Symbol'); + +var isArrayBuffer = tagTester('ArrayBuffer'); + +var isFunction = tagTester('Function'); + +// Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old +// v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236). +var nodelist = root.document && root.document.childNodes; +if ( true && typeof Int8Array != 'object' && typeof nodelist != 'function') { + isFunction = function(obj) { + return typeof obj == 'function' || false; + }; +} + +var isFunction$1 = isFunction; + +var hasObjectTag = tagTester('Object'); + +// In IE 10 - Edge 13, `DataView` has string tag `'[object Object]'`. +// In IE 11, the most common among them, this problem also applies to +// `Map`, `WeakMap` and `Set`. +var hasStringTagBug = ( + supportsDataView && hasObjectTag(new DataView(new ArrayBuffer(8))) + ), + isIE11 = (typeof Map !== 'undefined' && hasObjectTag(new Map)); + +var isDataView = tagTester('DataView'); + +// In IE 10 - Edge 13, we need a different heuristic +// to determine whether an object is a `DataView`. +function ie10IsDataView(obj) { + return obj != null && isFunction$1(obj.getInt8) && isArrayBuffer(obj.buffer); +} + +var isDataView$1 = (hasStringTagBug ? ie10IsDataView : isDataView); + +// Is a given value an array? +// Delegates to ECMA5's native `Array.isArray`. +var isArray = nativeIsArray || tagTester('Array'); + +// Internal function to check whether `key` is an own property name of `obj`. +function has$1(obj, key) { + return obj != null && hasOwnProperty.call(obj, key); +} + +var isArguments = tagTester('Arguments'); + +// Define a fallback version of the method in browsers (ahem, IE < 9), where +// there isn't any inspectable "Arguments" type. +(function() { + if (!isArguments(arguments)) { + isArguments = function(obj) { + return has$1(obj, 'callee'); + }; + } +}()); + +var isArguments$1 = isArguments; + +// Is a given object a finite number? +function isFinite$1(obj) { + return !isSymbol(obj) && _isFinite(obj) && !isNaN(parseFloat(obj)); +} + +// Is the given value `NaN`? +function isNaN$1(obj) { + return isNumber(obj) && _isNaN(obj); +} + +// Predicate-generating function. Often useful outside of Underscore. +function constant(value) { + return function() { + return value; + }; +} + +// Common internal logic for `isArrayLike` and `isBufferLike`. +function createSizePropertyCheck(getSizeProperty) { + return function(collection) { + var sizeProperty = getSizeProperty(collection); + return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= MAX_ARRAY_INDEX; + } +} + +// Internal helper to generate a function to obtain property `key` from `obj`. +function shallowProperty(key) { + return function(obj) { + return obj == null ? void 0 : obj[key]; + }; +} + +// Internal helper to obtain the `byteLength` property of an object. +var getByteLength = shallowProperty('byteLength'); + +// Internal helper to determine whether we should spend extensive checks against +// `ArrayBuffer` et al. +var isBufferLike = createSizePropertyCheck(getByteLength); + +// Is a given value a typed array? +var typedArrayPattern = /\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/; +function isTypedArray(obj) { + // `ArrayBuffer.isView` is the most future-proof, so use it when available. + // Otherwise, fall back on the above regular expression. + return nativeIsView ? (nativeIsView(obj) && !isDataView$1(obj)) : + isBufferLike(obj) && typedArrayPattern.test(toString.call(obj)); +} + +var isTypedArray$1 = supportsArrayBuffer ? isTypedArray : constant(false); + +// Internal helper to obtain the `length` property of an object. +var getLength = shallowProperty('length'); + +// Internal helper to create a simple lookup structure. +// `collectNonEnumProps` used to depend on `_.contains`, but this led to +// circular imports. `emulatedSet` is a one-off solution that only works for +// arrays of strings. +function emulatedSet(keys) { + var hash = {}; + for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true; + return { + contains: function(key) { return hash[key] === true; }, + push: function(key) { + hash[key] = true; + return keys.push(key); + } + }; +} + +// Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't +// be iterated by `for key in ...` and thus missed. Extends `keys` in place if +// needed. +function collectNonEnumProps(obj, keys) { + keys = emulatedSet(keys); + var nonEnumIdx = nonEnumerableProps.length; + var constructor = obj.constructor; + var proto = (isFunction$1(constructor) && constructor.prototype) || ObjProto; + + // Constructor is a special case. + var prop = 'constructor'; + if (has$1(obj, prop) && !keys.contains(prop)) keys.push(prop); + + while (nonEnumIdx--) { + prop = nonEnumerableProps[nonEnumIdx]; + if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) { + keys.push(prop); + } + } +} + +// Retrieve the names of an object's own properties. +// Delegates to **ECMAScript 5**'s native `Object.keys`. +function keys(obj) { + if (!isObject(obj)) return []; + if (nativeKeys) return nativeKeys(obj); + var keys = []; + for (var key in obj) if (has$1(obj, key)) keys.push(key); + // Ahem, IE < 9. + if (hasEnumBug) collectNonEnumProps(obj, keys); + return keys; +} + +// Is a given array, string, or object empty? +// An "empty" object has no enumerable own-properties. +function isEmpty(obj) { + if (obj == null) return true; + // Skip the more expensive `toString`-based type checks if `obj` has no + // `.length`. + var length = getLength(obj); + if (typeof length == 'number' && ( + isArray(obj) || isString(obj) || isArguments$1(obj) + )) return length === 0; + return getLength(keys(obj)) === 0; +} + +// Returns whether an object has a given set of `key:value` pairs. +function isMatch(object, attrs) { + var _keys = keys(attrs), length = _keys.length; + if (object == null) return !length; + var obj = Object(object); + for (var i = 0; i < length; i++) { + var key = _keys[i]; + if (attrs[key] !== obj[key] || !(key in obj)) return false; + } + return true; +} + +// If Underscore is called as a function, it returns a wrapped object that can +// be used OO-style. This wrapper holds altered versions of all functions added +// through `_.mixin`. Wrapped objects may be chained. +function _$1(obj) { + if (obj instanceof _$1) return obj; + if (!(this instanceof _$1)) return new _$1(obj); + this._wrapped = obj; +} + +_$1.VERSION = VERSION; + +// Extracts the result from a wrapped and chained object. +_$1.prototype.value = function() { + return this._wrapped; +}; + +// Provide unwrapping proxies for some methods used in engine operations +// such as arithmetic and JSON stringification. +_$1.prototype.valueOf = _$1.prototype.toJSON = _$1.prototype.value; + +_$1.prototype.toString = function() { + return String(this._wrapped); +}; + +// Internal function to wrap or shallow-copy an ArrayBuffer, +// typed array or DataView to a new view, reusing the buffer. +function toBufferView(bufferSource) { + return new Uint8Array( + bufferSource.buffer || bufferSource, + bufferSource.byteOffset || 0, + getByteLength(bufferSource) + ); +} + +// We use this string twice, so give it a name for minification. +var tagDataView = '[object DataView]'; + +// Internal recursive comparison function for `_.isEqual`. +function eq(a, b, aStack, bStack) { + // Identical objects are equal. `0 === -0`, but they aren't identical. + // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal). + if (a === b) return a !== 0 || 1 / a === 1 / b; + // `null` or `undefined` only equal to itself (strict comparison). + if (a == null || b == null) return false; + // `NaN`s are equivalent, but non-reflexive. + if (a !== a) return b !== b; + // Exhaust primitive checks + var type = typeof a; + if (type !== 'function' && type !== 'object' && typeof b != 'object') return false; + return deepEq(a, b, aStack, bStack); +} + +// Internal recursive comparison function for `_.isEqual`. +function deepEq(a, b, aStack, bStack) { + // Unwrap any wrapped objects. + if (a instanceof _$1) a = a._wrapped; + if (b instanceof _$1) b = b._wrapped; + // Compare `[[Class]]` names. + var className = toString.call(a); + if (className !== toString.call(b)) return false; + // Work around a bug in IE 10 - Edge 13. + if (hasStringTagBug && className == '[object Object]' && isDataView$1(a)) { + if (!isDataView$1(b)) return false; + className = tagDataView; + } + switch (className) { + // These types are compared by value. + case '[object RegExp]': + // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i') + case '[object String]': + // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is + // equivalent to `new String("5")`. + return '' + a === '' + b; + case '[object Number]': + // `NaN`s are equivalent, but non-reflexive. + // Object(NaN) is equivalent to NaN. + if (+a !== +a) return +b !== +b; + // An `egal` comparison is performed for other numeric values. + return +a === 0 ? 1 / +a === 1 / b : +a === +b; + case '[object Date]': + case '[object Boolean]': + // Coerce dates and booleans to numeric primitive values. Dates are compared by their + // millisecond representations. Note that invalid dates with millisecond representations + // of `NaN` are not equivalent. + return +a === +b; + case '[object Symbol]': + return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b); + case '[object ArrayBuffer]': + case tagDataView: + // Coerce to typed array so we can fall through. + return deepEq(toBufferView(a), toBufferView(b), aStack, bStack); + } + + var areArrays = className === '[object Array]'; + if (!areArrays && isTypedArray$1(a)) { + var byteLength = getByteLength(a); + if (byteLength !== getByteLength(b)) return false; + if (a.buffer === b.buffer && a.byteOffset === b.byteOffset) return true; + areArrays = true; + } + if (!areArrays) { + if (typeof a != 'object' || typeof b != 'object') return false; + + // Objects with different constructors are not equivalent, but `Object`s or `Array`s + // from different frames are. + var aCtor = a.constructor, bCtor = b.constructor; + if (aCtor !== bCtor && !(isFunction$1(aCtor) && aCtor instanceof aCtor && + isFunction$1(bCtor) && bCtor instanceof bCtor) + && ('constructor' in a && 'constructor' in b)) { + return false; + } + } + // Assume equality for cyclic structures. The algorithm for detecting cyclic + // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. + + // Initializing stack of traversed objects. + // It's done here since we only need them for objects and arrays comparison. + aStack = aStack || []; + bStack = bStack || []; + var length = aStack.length; + while (length--) { + // Linear search. Performance is inversely proportional to the number of + // unique nested structures. + if (aStack[length] === a) return bStack[length] === b; + } + + // Add the first object to the stack of traversed objects. + aStack.push(a); + bStack.push(b); + + // Recursively compare objects and arrays. + if (areArrays) { + // Compare array lengths to determine if a deep comparison is necessary. + length = a.length; + if (length !== b.length) return false; + // Deep compare the contents, ignoring non-numeric properties. + while (length--) { + if (!eq(a[length], b[length], aStack, bStack)) return false; + } + } else { + // Deep compare objects. + var _keys = keys(a), key; + length = _keys.length; + // Ensure that both objects contain the same number of properties before comparing deep equality. + if (keys(b).length !== length) return false; + while (length--) { + // Deep compare each member + key = _keys[length]; + if (!(has$1(b, key) && eq(a[key], b[key], aStack, bStack))) return false; + } + } + // Remove the first object from the stack of traversed objects. + aStack.pop(); + bStack.pop(); + return true; +} + +// Perform a deep comparison to check if two objects are equal. +function isEqual(a, b) { + return eq(a, b); +} + +// Retrieve all the enumerable property names of an object. +function allKeys(obj) { + if (!isObject(obj)) return []; + var keys = []; + for (var key in obj) keys.push(key); + // Ahem, IE < 9. + if (hasEnumBug) collectNonEnumProps(obj, keys); + return keys; +} + +// Since the regular `Object.prototype.toString` type tests don't work for +// some types in IE 11, we use a fingerprinting heuristic instead, based +// on the methods. It's not great, but it's the best we got. +// The fingerprint method lists are defined below. +function ie11fingerprint(methods) { + var length = getLength(methods); + return function(obj) { + if (obj == null) return false; + // `Map`, `WeakMap` and `Set` have no enumerable keys. + var keys = allKeys(obj); + if (getLength(keys)) return false; + for (var i = 0; i < length; i++) { + if (!isFunction$1(obj[methods[i]])) return false; + } + // If we are testing against `WeakMap`, we need to ensure that + // `obj` doesn't have a `forEach` method in order to distinguish + // it from a regular `Map`. + return methods !== weakMapMethods || !isFunction$1(obj[forEachName]); + }; +} + +// In the interest of compact minification, we write +// each string in the fingerprints only once. +var forEachName = 'forEach', + hasName = 'has', + commonInit = ['clear', 'delete'], + mapTail = ['get', hasName, 'set']; + +// `Map`, `WeakMap` and `Set` each have slightly different +// combinations of the above sublists. +var mapMethods = commonInit.concat(forEachName, mapTail), + weakMapMethods = commonInit.concat(mapTail), + setMethods = ['add'].concat(commonInit, forEachName, hasName); + +var isMap = isIE11 ? ie11fingerprint(mapMethods) : tagTester('Map'); + +var isWeakMap = isIE11 ? ie11fingerprint(weakMapMethods) : tagTester('WeakMap'); + +var isSet = isIE11 ? ie11fingerprint(setMethods) : tagTester('Set'); + +var isWeakSet = tagTester('WeakSet'); + +// Retrieve the values of an object's properties. +function values(obj) { + var _keys = keys(obj); + var length = _keys.length; + var values = Array(length); + for (var i = 0; i < length; i++) { + values[i] = obj[_keys[i]]; + } + return values; +} + +// Convert an object into a list of `[key, value]` pairs. +// The opposite of `_.object` with one argument. +function pairs(obj) { + var _keys = keys(obj); + var length = _keys.length; + var pairs = Array(length); + for (var i = 0; i < length; i++) { + pairs[i] = [_keys[i], obj[_keys[i]]]; + } + return pairs; +} + +// Invert the keys and values of an object. The values must be serializable. +function invert(obj) { + var result = {}; + var _keys = keys(obj); + for (var i = 0, length = _keys.length; i < length; i++) { + result[obj[_keys[i]]] = _keys[i]; + } + return result; +} + +// Return a sorted list of the function names available on the object. +function functions(obj) { + var names = []; + for (var key in obj) { + if (isFunction$1(obj[key])) names.push(key); + } + return names.sort(); +} + +// An internal function for creating assigner functions. +function createAssigner(keysFunc, defaults) { + return function(obj) { + var length = arguments.length; + if (defaults) obj = Object(obj); + if (length < 2 || obj == null) return obj; + for (var index = 1; index < length; index++) { + var source = arguments[index], + keys = keysFunc(source), + l = keys.length; + for (var i = 0; i < l; i++) { + var key = keys[i]; + if (!defaults || obj[key] === void 0) obj[key] = source[key]; + } + } + return obj; + }; +} + +// Extend a given object with all the properties in passed-in object(s). +var extend = createAssigner(allKeys); + +// Assigns a given object with all the own properties in the passed-in +// object(s). +// (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) +var extendOwn = createAssigner(keys); + +// Fill in a given object with default properties. +var defaults = createAssigner(allKeys, true); + +// Create a naked function reference for surrogate-prototype-swapping. +function ctor() { + return function(){}; +} + +// An internal function for creating a new object that inherits from another. +function baseCreate(prototype) { + if (!isObject(prototype)) return {}; + if (nativeCreate) return nativeCreate(prototype); + var Ctor = ctor(); + Ctor.prototype = prototype; + var result = new Ctor; + Ctor.prototype = null; + return result; +} + +// Creates an object that inherits from the given prototype object. +// If additional properties are provided then they will be added to the +// created object. +function create(prototype, props) { + var result = baseCreate(prototype); + if (props) extendOwn(result, props); + return result; +} + +// Create a (shallow-cloned) duplicate of an object. +function clone(obj) { + if (!isObject(obj)) return obj; + return isArray(obj) ? obj.slice() : extend({}, obj); +} + +// Invokes `interceptor` with the `obj` and then returns `obj`. +// The primary purpose of this method is to "tap into" a method chain, in +// order to perform operations on intermediate results within the chain. +function tap(obj, interceptor) { + interceptor(obj); + return obj; +} + +// Normalize a (deep) property `path` to array. +// Like `_.iteratee`, this function can be customized. +function toPath$1(path) { + return isArray(path) ? path : [path]; +} +_$1.toPath = toPath$1; + +// Internal wrapper for `_.toPath` to enable minification. +// Similar to `cb` for `_.iteratee`. +function toPath(path) { + return _$1.toPath(path); +} + +// Internal function to obtain a nested property in `obj` along `path`. +function deepGet(obj, path) { + var length = path.length; + for (var i = 0; i < length; i++) { + if (obj == null) return void 0; + obj = obj[path[i]]; + } + return length ? obj : void 0; +} + +// Get the value of the (deep) property on `path` from `object`. +// If any property in `path` does not exist or if the value is +// `undefined`, return `defaultValue` instead. +// The `path` is normalized through `_.toPath`. +function get(object, path, defaultValue) { + var value = deepGet(object, toPath(path)); + return isUndefined(value) ? defaultValue : value; +} + +// Shortcut function for checking if an object has a given property directly on +// itself (in other words, not on a prototype). Unlike the internal `has` +// function, this public version can also traverse nested properties. +function has(obj, path) { + path = toPath(path); + var length = path.length; + for (var i = 0; i < length; i++) { + var key = path[i]; + if (!has$1(obj, key)) return false; + obj = obj[key]; + } + return !!length; +} + +// Keep the identity function around for default iteratees. +function identity(value) { + return value; +} + +// Returns a predicate for checking whether an object has a given set of +// `key:value` pairs. +function matcher(attrs) { + attrs = extendOwn({}, attrs); + return function(obj) { + return isMatch(obj, attrs); + }; +} + +// Creates a function that, when passed an object, will traverse that object’s +// properties down the given `path`, specified as an array of keys or indices. +function property(path) { + path = toPath(path); + return function(obj) { + return deepGet(obj, path); + }; +} + +// Internal function that returns an efficient (for current engines) version +// of the passed-in callback, to be repeatedly applied in other Underscore +// functions. +function optimizeCb(func, context, argCount) { + if (context === void 0) return func; + switch (argCount == null ? 3 : argCount) { + case 1: return function(value) { + return func.call(context, value); + }; + // The 2-argument case is omitted because we’re not using it. + case 3: return function(value, index, collection) { + return func.call(context, value, index, collection); + }; + case 4: return function(accumulator, value, index, collection) { + return func.call(context, accumulator, value, index, collection); + }; + } + return function() { + return func.apply(context, arguments); + }; +} + +// An internal function to generate callbacks that can be applied to each +// element in a collection, returning the desired result — either `_.identity`, +// an arbitrary callback, a property matcher, or a property accessor. +function baseIteratee(value, context, argCount) { + if (value == null) return identity; + if (isFunction$1(value)) return optimizeCb(value, context, argCount); + if (isObject(value) && !isArray(value)) return matcher(value); + return property(value); +} + +// External wrapper for our callback generator. Users may customize +// `_.iteratee` if they want additional predicate/iteratee shorthand styles. +// This abstraction hides the internal-only `argCount` argument. +function iteratee(value, context) { + return baseIteratee(value, context, Infinity); +} +_$1.iteratee = iteratee; + +// The function we call internally to generate a callback. It invokes +// `_.iteratee` if overridden, otherwise `baseIteratee`. +function cb(value, context, argCount) { + if (_$1.iteratee !== iteratee) return _$1.iteratee(value, context); + return baseIteratee(value, context, argCount); +} + +// Returns the results of applying the `iteratee` to each element of `obj`. +// In contrast to `_.map` it returns an object. +function mapObject(obj, iteratee, context) { + iteratee = cb(iteratee, context); + var _keys = keys(obj), + length = _keys.length, + results = {}; + for (var index = 0; index < length; index++) { + var currentKey = _keys[index]; + results[currentKey] = iteratee(obj[currentKey], currentKey, obj); + } + return results; +} + +// Predicate-generating function. Often useful outside of Underscore. +function noop(){} + +// Generates a function for a given object that returns a given property. +function propertyOf(obj) { + if (obj == null) return noop; + return function(path) { + return get(obj, path); + }; +} + +// Run a function **n** times. +function times(n, iteratee, context) { + var accum = Array(Math.max(0, n)); + iteratee = optimizeCb(iteratee, context, 1); + for (var i = 0; i < n; i++) accum[i] = iteratee(i); + return accum; +} + +// Return a random integer between `min` and `max` (inclusive). +function random(min, max) { + if (max == null) { + max = min; + min = 0; + } + return min + Math.floor(Math.random() * (max - min + 1)); +} + +// A (possibly faster) way to get the current timestamp as an integer. +var now = Date.now || function() { + return new Date().getTime(); +}; + +// Internal helper to generate functions for escaping and unescaping strings +// to/from HTML interpolation. +function createEscaper(map) { + var escaper = function(match) { + return map[match]; + }; + // Regexes for identifying a key that needs to be escaped. + var source = '(?:' + keys(map).join('|') + ')'; + var testRegexp = RegExp(source); + var replaceRegexp = RegExp(source, 'g'); + return function(string) { + string = string == null ? '' : '' + string; + return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string; + }; +} + +// Internal list of HTML entities for escaping. +var escapeMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '`': '`' +}; + +// Function for escaping strings to HTML interpolation. +var _escape = createEscaper(escapeMap); + +// Internal list of HTML entities for unescaping. +var unescapeMap = invert(escapeMap); + +// Function for unescaping strings from HTML interpolation. +var _unescape = createEscaper(unescapeMap); + +// By default, Underscore uses ERB-style template delimiters. Change the +// following template settings to use alternative delimiters. +var templateSettings = _$1.templateSettings = { + evaluate: /<%([\s\S]+?)%>/g, + interpolate: /<%=([\s\S]+?)%>/g, + escape: /<%-([\s\S]+?)%>/g +}; + +// When customizing `_.templateSettings`, if you don't want to define an +// interpolation, evaluation or escaping regex, we need one that is +// guaranteed not to match. +var noMatch = /(.)^/; + +// Certain characters need to be escaped so that they can be put into a +// string literal. +var escapes = { + "'": "'", + '\\': '\\', + '\r': 'r', + '\n': 'n', + '\u2028': 'u2028', + '\u2029': 'u2029' +}; + +var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g; + +function escapeChar(match) { + return '\\' + escapes[match]; +} + +// In order to prevent third-party code injection through +// `_.templateSettings.variable`, we test it against the following regular +// expression. It is intentionally a bit more liberal than just matching valid +// identifiers, but still prevents possible loopholes through defaults or +// destructuring assignment. +var bareIdentifier = /^\s*(\w|\$)+\s*$/; + +// JavaScript micro-templating, similar to John Resig's implementation. +// Underscore templating handles arbitrary delimiters, preserves whitespace, +// and correctly escapes quotes within interpolated code. +// NB: `oldSettings` only exists for backwards compatibility. +function template(text, settings, oldSettings) { + if (!settings && oldSettings) settings = oldSettings; + settings = defaults({}, settings, _$1.templateSettings); + + // Combine delimiters into one regular expression via alternation. + var matcher = RegExp([ + (settings.escape || noMatch).source, + (settings.interpolate || noMatch).source, + (settings.evaluate || noMatch).source + ].join('|') + '|$', 'g'); + + // Compile the template source, escaping string literals appropriately. + var index = 0; + var source = "__p+='"; + text.replace(matcher, function(match, escape, interpolate, evaluate, offset) { + source += text.slice(index, offset).replace(escapeRegExp, escapeChar); + index = offset + match.length; + + if (escape) { + source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'"; + } else if (interpolate) { + source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'"; + } else if (evaluate) { + source += "';\n" + evaluate + "\n__p+='"; + } + + // Adobe VMs need the match returned to produce the correct offset. + return match; + }); + source += "';\n"; + + var argument = settings.variable; + if (argument) { + // Insure against third-party code injection. (CVE-2021-23358) + if (!bareIdentifier.test(argument)) throw new Error( + 'variable is not a bare identifier: ' + argument + ); + } else { + // If a variable is not specified, place data values in local scope. + source = 'with(obj||{}){\n' + source + '}\n'; + argument = 'obj'; + } + + source = "var __t,__p='',__j=Array.prototype.join," + + "print=function(){__p+=__j.call(arguments,'');};\n" + + source + 'return __p;\n'; + + var render; + try { + render = new Function(argument, '_', source); + } catch (e) { + e.source = source; + throw e; + } + + var template = function(data) { + return render.call(this, data, _$1); + }; + + // Provide the compiled source as a convenience for precompilation. + template.source = 'function(' + argument + '){\n' + source + '}'; + + return template; +} + +// Traverses the children of `obj` along `path`. If a child is a function, it +// is invoked with its parent as context. Returns the value of the final +// child, or `fallback` if any child is undefined. +function result(obj, path, fallback) { + path = toPath(path); + var length = path.length; + if (!length) { + return isFunction$1(fallback) ? fallback.call(obj) : fallback; + } + for (var i = 0; i < length; i++) { + var prop = obj == null ? void 0 : obj[path[i]]; + if (prop === void 0) { + prop = fallback; + i = length; // Ensure we don't continue iterating. + } + obj = isFunction$1(prop) ? prop.call(obj) : prop; + } + return obj; +} + +// Generate a unique integer id (unique within the entire client session). +// Useful for temporary DOM ids. +var idCounter = 0; +function uniqueId(prefix) { + var id = ++idCounter + ''; + return prefix ? prefix + id : id; +} + +// Start chaining a wrapped Underscore object. +function chain(obj) { + var instance = _$1(obj); + instance._chain = true; + return instance; +} + +// Internal function to execute `sourceFunc` bound to `context` with optional +// `args`. Determines whether to execute a function as a constructor or as a +// normal function. +function executeBound(sourceFunc, boundFunc, context, callingContext, args) { + if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args); + var self = baseCreate(sourceFunc.prototype); + var result = sourceFunc.apply(self, args); + if (isObject(result)) return result; + return self; +} + +// Partially apply a function by creating a version that has had some of its +// arguments pre-filled, without changing its dynamic `this` context. `_` acts +// as a placeholder by default, allowing any combination of arguments to be +// pre-filled. Set `_.partial.placeholder` for a custom placeholder argument. +var partial = restArguments(function(func, boundArgs) { + var placeholder = partial.placeholder; + var bound = function() { + var position = 0, length = boundArgs.length; + var args = Array(length); + for (var i = 0; i < length; i++) { + args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i]; + } + while (position < arguments.length) args.push(arguments[position++]); + return executeBound(func, bound, this, this, args); + }; + return bound; +}); + +partial.placeholder = _$1; + +// Create a function bound to a given object (assigning `this`, and arguments, +// optionally). +var bind = restArguments(function(func, context, args) { + if (!isFunction$1(func)) throw new TypeError('Bind must be called on a function'); + var bound = restArguments(function(callArgs) { + return executeBound(func, bound, context, this, args.concat(callArgs)); + }); + return bound; +}); + +// Internal helper for collection methods to determine whether a collection +// should be iterated as an array or as an object. +// Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength +// Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094 +var isArrayLike = createSizePropertyCheck(getLength); + +// Internal implementation of a recursive `flatten` function. +function flatten$1(input, depth, strict, output) { + output = output || []; + if (!depth && depth !== 0) { + depth = Infinity; + } else if (depth <= 0) { + return output.concat(input); + } + var idx = output.length; + for (var i = 0, length = getLength(input); i < length; i++) { + var value = input[i]; + if (isArrayLike(value) && (isArray(value) || isArguments$1(value))) { + // Flatten current level of array or arguments object. + if (depth > 1) { + flatten$1(value, depth - 1, strict, output); + idx = output.length; + } else { + var j = 0, len = value.length; + while (j < len) output[idx++] = value[j++]; + } + } else if (!strict) { + output[idx++] = value; + } + } + return output; +} + +// Bind a number of an object's methods to that object. Remaining arguments +// are the method names to be bound. Useful for ensuring that all callbacks +// defined on an object belong to it. +var bindAll = restArguments(function(obj, keys) { + keys = flatten$1(keys, false, false); + var index = keys.length; + if (index < 1) throw new Error('bindAll must be passed function names'); + while (index--) { + var key = keys[index]; + obj[key] = bind(obj[key], obj); + } + return obj; +}); + +// Memoize an expensive function by storing its results. +function memoize(func, hasher) { + var memoize = function(key) { + var cache = memoize.cache; + var address = '' + (hasher ? hasher.apply(this, arguments) : key); + if (!has$1(cache, address)) cache[address] = func.apply(this, arguments); + return cache[address]; + }; + memoize.cache = {}; + return memoize; +} + +// Delays a function for the given number of milliseconds, and then calls +// it with the arguments supplied. +var delay = restArguments(function(func, wait, args) { + return setTimeout(function() { + return func.apply(null, args); + }, wait); +}); + +// Defers a function, scheduling it to run after the current call stack has +// cleared. +var defer = partial(delay, _$1, 1); + +// Returns a function, that, when invoked, will only be triggered at most once +// during a given window of time. Normally, the throttled function will run +// as much as it can, without ever going more than once per `wait` duration; +// but if you'd like to disable the execution on the leading edge, pass +// `{leading: false}`. To disable execution on the trailing edge, ditto. +function throttle(func, wait, options) { + var timeout, context, args, result; + var previous = 0; + if (!options) options = {}; + + var later = function() { + previous = options.leading === false ? 0 : now(); + timeout = null; + result = func.apply(context, args); + if (!timeout) context = args = null; + }; + + var throttled = function() { + var _now = now(); + if (!previous && options.leading === false) previous = _now; + var remaining = wait - (_now - previous); + context = this; + args = arguments; + if (remaining <= 0 || remaining > wait) { + if (timeout) { + clearTimeout(timeout); + timeout = null; + } + previous = _now; + result = func.apply(context, args); + if (!timeout) context = args = null; + } else if (!timeout && options.trailing !== false) { + timeout = setTimeout(later, remaining); + } + return result; + }; + + throttled.cancel = function() { + clearTimeout(timeout); + previous = 0; + timeout = context = args = null; + }; + + return throttled; +} + +// When a sequence of calls of the returned function ends, the argument +// function is triggered. The end of a sequence is defined by the `wait` +// parameter. If `immediate` is passed, the argument function will be +// triggered at the beginning of the sequence instead of at the end. +function debounce(func, wait, immediate) { + var timeout, previous, args, result, context; + + var later = function() { + var passed = now() - previous; + if (wait > passed) { + timeout = setTimeout(later, wait - passed); + } else { + timeout = null; + if (!immediate) result = func.apply(context, args); + // This check is needed because `func` can recursively invoke `debounced`. + if (!timeout) args = context = null; + } + }; + + var debounced = restArguments(function(_args) { + context = this; + args = _args; + previous = now(); + if (!timeout) { + timeout = setTimeout(later, wait); + if (immediate) result = func.apply(context, args); + } + return result; + }); + + debounced.cancel = function() { + clearTimeout(timeout); + timeout = args = context = null; + }; + + return debounced; +} + +// Returns the first function passed as an argument to the second, +// allowing you to adjust arguments, run code before and after, and +// conditionally execute the original function. +function wrap(func, wrapper) { + return partial(wrapper, func); +} + +// Returns a negated version of the passed-in predicate. +function negate(predicate) { + return function() { + return !predicate.apply(this, arguments); + }; +} + +// Returns a function that is the composition of a list of functions, each +// consuming the return value of the function that follows. +function compose() { + var args = arguments; + var start = args.length - 1; + return function() { + var i = start; + var result = args[start].apply(this, arguments); + while (i--) result = args[i].call(this, result); + return result; + }; +} + +// Returns a function that will only be executed on and after the Nth call. +function after(times, func) { + return function() { + if (--times < 1) { + return func.apply(this, arguments); + } + }; +} + +// Returns a function that will only be executed up to (but not including) the +// Nth call. +function before(times, func) { + var memo; + return function() { + if (--times > 0) { + memo = func.apply(this, arguments); + } + if (times <= 1) func = null; + return memo; + }; +} + +// Returns a function that will be executed at most one time, no matter how +// often you call it. Useful for lazy initialization. +var once = partial(before, 2); + +// Returns the first key on an object that passes a truth test. +function findKey(obj, predicate, context) { + predicate = cb(predicate, context); + var _keys = keys(obj), key; + for (var i = 0, length = _keys.length; i < length; i++) { + key = _keys[i]; + if (predicate(obj[key], key, obj)) return key; + } +} + +// Internal function to generate `_.findIndex` and `_.findLastIndex`. +function createPredicateIndexFinder(dir) { + return function(array, predicate, context) { + predicate = cb(predicate, context); + var length = getLength(array); + var index = dir > 0 ? 0 : length - 1; + for (; index >= 0 && index < length; index += dir) { + if (predicate(array[index], index, array)) return index; + } + return -1; + }; +} + +// Returns the first index on an array-like that passes a truth test. +var findIndex = createPredicateIndexFinder(1); + +// Returns the last index on an array-like that passes a truth test. +var findLastIndex = createPredicateIndexFinder(-1); + +// Use a comparator function to figure out the smallest index at which +// an object should be inserted so as to maintain order. Uses binary search. +function sortedIndex(array, obj, iteratee, context) { + iteratee = cb(iteratee, context, 1); + var value = iteratee(obj); + var low = 0, high = getLength(array); + while (low < high) { + var mid = Math.floor((low + high) / 2); + if (iteratee(array[mid]) < value) low = mid + 1; else high = mid; + } + return low; +} + +// Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions. +function createIndexFinder(dir, predicateFind, sortedIndex) { + return function(array, item, idx) { + var i = 0, length = getLength(array); + if (typeof idx == 'number') { + if (dir > 0) { + i = idx >= 0 ? idx : Math.max(idx + length, i); + } else { + length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1; + } + } else if (sortedIndex && idx && length) { + idx = sortedIndex(array, item); + return array[idx] === item ? idx : -1; + } + if (item !== item) { + idx = predicateFind(slice.call(array, i, length), isNaN$1); + return idx >= 0 ? idx + i : -1; + } + for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) { + if (array[idx] === item) return idx; + } + return -1; + }; +} + +// Return the position of the first occurrence of an item in an array, +// or -1 if the item is not included in the array. +// If the array is large and already in sort order, pass `true` +// for **isSorted** to use binary search. +var indexOf = createIndexFinder(1, findIndex, sortedIndex); + +// Return the position of the last occurrence of an item in an array, +// or -1 if the item is not included in the array. +var lastIndexOf = createIndexFinder(-1, findLastIndex); + +// Return the first value which passes a truth test. +function find(obj, predicate, context) { + var keyFinder = isArrayLike(obj) ? findIndex : findKey; + var key = keyFinder(obj, predicate, context); + if (key !== void 0 && key !== -1) return obj[key]; +} + +// Convenience version of a common use case of `_.find`: getting the first +// object containing specific `key:value` pairs. +function findWhere(obj, attrs) { + return find(obj, matcher(attrs)); +} + +// The cornerstone for collection functions, an `each` +// implementation, aka `forEach`. +// Handles raw objects in addition to array-likes. Treats all +// sparse array-likes as if they were dense. +function each(obj, iteratee, context) { + iteratee = optimizeCb(iteratee, context); + var i, length; + if (isArrayLike(obj)) { + for (i = 0, length = obj.length; i < length; i++) { + iteratee(obj[i], i, obj); + } + } else { + var _keys = keys(obj); + for (i = 0, length = _keys.length; i < length; i++) { + iteratee(obj[_keys[i]], _keys[i], obj); + } + } + return obj; +} + +// Return the results of applying the iteratee to each element. +function map(obj, iteratee, context) { + iteratee = cb(iteratee, context); + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length, + results = Array(length); + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + results[index] = iteratee(obj[currentKey], currentKey, obj); + } + return results; +} + +// Internal helper to create a reducing function, iterating left or right. +function createReduce(dir) { + // Wrap code that reassigns argument variables in a separate function than + // the one that accesses `arguments.length` to avoid a perf hit. (#1991) + var reducer = function(obj, iteratee, memo, initial) { + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length, + index = dir > 0 ? 0 : length - 1; + if (!initial) { + memo = obj[_keys ? _keys[index] : index]; + index += dir; + } + for (; index >= 0 && index < length; index += dir) { + var currentKey = _keys ? _keys[index] : index; + memo = iteratee(memo, obj[currentKey], currentKey, obj); + } + return memo; + }; + + return function(obj, iteratee, memo, context) { + var initial = arguments.length >= 3; + return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial); + }; +} + +// **Reduce** builds up a single result from a list of values, aka `inject`, +// or `foldl`. +var reduce = createReduce(1); + +// The right-associative version of reduce, also known as `foldr`. +var reduceRight = createReduce(-1); + +// Return all the elements that pass a truth test. +function filter(obj, predicate, context) { + var results = []; + predicate = cb(predicate, context); + each(obj, function(value, index, list) { + if (predicate(value, index, list)) results.push(value); + }); + return results; +} + +// Return all the elements for which a truth test fails. +function reject(obj, predicate, context) { + return filter(obj, negate(cb(predicate)), context); +} + +// Determine whether all of the elements pass a truth test. +function every(obj, predicate, context) { + predicate = cb(predicate, context); + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + if (!predicate(obj[currentKey], currentKey, obj)) return false; + } + return true; +} + +// Determine if at least one element in the object passes a truth test. +function some(obj, predicate, context) { + predicate = cb(predicate, context); + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + if (predicate(obj[currentKey], currentKey, obj)) return true; + } + return false; +} + +// Determine if the array or object contains a given item (using `===`). +function contains(obj, item, fromIndex, guard) { + if (!isArrayLike(obj)) obj = values(obj); + if (typeof fromIndex != 'number' || guard) fromIndex = 0; + return indexOf(obj, item, fromIndex) >= 0; +} + +// Invoke a method (with arguments) on every item in a collection. +var invoke = restArguments(function(obj, path, args) { + var contextPath, func; + if (isFunction$1(path)) { + func = path; + } else { + path = toPath(path); + contextPath = path.slice(0, -1); + path = path[path.length - 1]; + } + return map(obj, function(context) { + var method = func; + if (!method) { + if (contextPath && contextPath.length) { + context = deepGet(context, contextPath); + } + if (context == null) return void 0; + method = context[path]; + } + return method == null ? method : method.apply(context, args); + }); +}); + +// Convenience version of a common use case of `_.map`: fetching a property. +function pluck(obj, key) { + return map(obj, property(key)); +} + +// Convenience version of a common use case of `_.filter`: selecting only +// objects containing specific `key:value` pairs. +function where(obj, attrs) { + return filter(obj, matcher(attrs)); +} + +// Return the maximum element (or element-based computation). +function max(obj, iteratee, context) { + var result = -Infinity, lastComputed = -Infinity, + value, computed; + if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) { + obj = isArrayLike(obj) ? obj : values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value != null && value > result) { + result = value; + } + } + } else { + iteratee = cb(iteratee, context); + each(obj, function(v, index, list) { + computed = iteratee(v, index, list); + if (computed > lastComputed || (computed === -Infinity && result === -Infinity)) { + result = v; + lastComputed = computed; + } + }); + } + return result; +} + +// Return the minimum element (or element-based computation). +function min(obj, iteratee, context) { + var result = Infinity, lastComputed = Infinity, + value, computed; + if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) { + obj = isArrayLike(obj) ? obj : values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value != null && value < result) { + result = value; + } + } + } else { + iteratee = cb(iteratee, context); + each(obj, function(v, index, list) { + computed = iteratee(v, index, list); + if (computed < lastComputed || (computed === Infinity && result === Infinity)) { + result = v; + lastComputed = computed; + } + }); + } + return result; +} + +// Safely create a real, live array from anything iterable. +var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g; +function toArray(obj) { + if (!obj) return []; + if (isArray(obj)) return slice.call(obj); + if (isString(obj)) { + // Keep surrogate pair characters together. + return obj.match(reStrSymbol); + } + if (isArrayLike(obj)) return map(obj, identity); + return values(obj); +} + +// Sample **n** random values from a collection using the modern version of the +// [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher–Yates_shuffle). +// If **n** is not specified, returns a single random element. +// The internal `guard` argument allows it to work with `_.map`. +function sample(obj, n, guard) { + if (n == null || guard) { + if (!isArrayLike(obj)) obj = values(obj); + return obj[random(obj.length - 1)]; + } + var sample = toArray(obj); + var length = getLength(sample); + n = Math.max(Math.min(n, length), 0); + var last = length - 1; + for (var index = 0; index < n; index++) { + var rand = random(index, last); + var temp = sample[index]; + sample[index] = sample[rand]; + sample[rand] = temp; + } + return sample.slice(0, n); +} + +// Shuffle a collection. +function shuffle(obj) { + return sample(obj, Infinity); +} + +// Sort the object's values by a criterion produced by an iteratee. +function sortBy(obj, iteratee, context) { + var index = 0; + iteratee = cb(iteratee, context); + return pluck(map(obj, function(value, key, list) { + return { + value: value, + index: index++, + criteria: iteratee(value, key, list) + }; + }).sort(function(left, right) { + var a = left.criteria; + var b = right.criteria; + if (a !== b) { + if (a > b || a === void 0) return 1; + if (a < b || b === void 0) return -1; + } + return left.index - right.index; + }), 'value'); +} + +// An internal function used for aggregate "group by" operations. +function group(behavior, partition) { + return function(obj, iteratee, context) { + var result = partition ? [[], []] : {}; + iteratee = cb(iteratee, context); + each(obj, function(value, index) { + var key = iteratee(value, index, obj); + behavior(result, value, key); + }); + return result; + }; +} + +// Groups the object's values by a criterion. Pass either a string attribute +// to group by, or a function that returns the criterion. +var groupBy = group(function(result, value, key) { + if (has$1(result, key)) result[key].push(value); else result[key] = [value]; +}); + +// Indexes the object's values by a criterion, similar to `_.groupBy`, but for +// when you know that your index values will be unique. +var indexBy = group(function(result, value, key) { + result[key] = value; +}); + +// Counts instances of an object that group by a certain criterion. Pass +// either a string attribute to count by, or a function that returns the +// criterion. +var countBy = group(function(result, value, key) { + if (has$1(result, key)) result[key]++; else result[key] = 1; +}); + +// Split a collection into two arrays: one whose elements all pass the given +// truth test, and one whose elements all do not pass the truth test. +var partition = group(function(result, value, pass) { + result[pass ? 0 : 1].push(value); +}, true); + +// Return the number of elements in a collection. +function size(obj) { + if (obj == null) return 0; + return isArrayLike(obj) ? obj.length : keys(obj).length; +} + +// Internal `_.pick` helper function to determine whether `key` is an enumerable +// property name of `obj`. +function keyInObj(value, key, obj) { + return key in obj; +} + +// Return a copy of the object only containing the allowed properties. +var pick = restArguments(function(obj, keys) { + var result = {}, iteratee = keys[0]; + if (obj == null) return result; + if (isFunction$1(iteratee)) { + if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]); + keys = allKeys(obj); + } else { + iteratee = keyInObj; + keys = flatten$1(keys, false, false); + obj = Object(obj); + } + for (var i = 0, length = keys.length; i < length; i++) { + var key = keys[i]; + var value = obj[key]; + if (iteratee(value, key, obj)) result[key] = value; + } + return result; +}); + +// Return a copy of the object without the disallowed properties. +var omit = restArguments(function(obj, keys) { + var iteratee = keys[0], context; + if (isFunction$1(iteratee)) { + iteratee = negate(iteratee); + if (keys.length > 1) context = keys[1]; + } else { + keys = map(flatten$1(keys, false, false), String); + iteratee = function(value, key) { + return !contains(keys, key); + }; + } + return pick(obj, iteratee, context); +}); + +// Returns everything but the last entry of the array. Especially useful on +// the arguments object. Passing **n** will return all the values in +// the array, excluding the last N. +function initial(array, n, guard) { + return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n))); +} + +// Get the first element of an array. Passing **n** will return the first N +// values in the array. The **guard** check allows it to work with `_.map`. +function first(array, n, guard) { + if (array == null || array.length < 1) return n == null || guard ? void 0 : []; + if (n == null || guard) return array[0]; + return initial(array, array.length - n); +} + +// Returns everything but the first entry of the `array`. Especially useful on +// the `arguments` object. Passing an **n** will return the rest N values in the +// `array`. +function rest(array, n, guard) { + return slice.call(array, n == null || guard ? 1 : n); +} + +// Get the last element of an array. Passing **n** will return the last N +// values in the array. +function last(array, n, guard) { + if (array == null || array.length < 1) return n == null || guard ? void 0 : []; + if (n == null || guard) return array[array.length - 1]; + return rest(array, Math.max(0, array.length - n)); +} + +// Trim out all falsy values from an array. +function compact(array) { + return filter(array, Boolean); +} + +// Flatten out an array, either recursively (by default), or up to `depth`. +// Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively. +function flatten(array, depth) { + return flatten$1(array, depth, false); +} + +// Take the difference between one array and a number of other arrays. +// Only the elements present in just the first array will remain. +var difference = restArguments(function(array, rest) { + rest = flatten$1(rest, true, true); + return filter(array, function(value){ + return !contains(rest, value); + }); +}); + +// Return a version of the array that does not contain the specified value(s). +var without = restArguments(function(array, otherArrays) { + return difference(array, otherArrays); +}); + +// Produce a duplicate-free version of the array. If the array has already +// been sorted, you have the option of using a faster algorithm. +// The faster algorithm will not work with an iteratee if the iteratee +// is not a one-to-one function, so providing an iteratee will disable +// the faster algorithm. +function uniq(array, isSorted, iteratee, context) { + if (!isBoolean(isSorted)) { + context = iteratee; + iteratee = isSorted; + isSorted = false; + } + if (iteratee != null) iteratee = cb(iteratee, context); + var result = []; + var seen = []; + for (var i = 0, length = getLength(array); i < length; i++) { + var value = array[i], + computed = iteratee ? iteratee(value, i, array) : value; + if (isSorted && !iteratee) { + if (!i || seen !== computed) result.push(value); + seen = computed; + } else if (iteratee) { + if (!contains(seen, computed)) { + seen.push(computed); + result.push(value); + } + } else if (!contains(result, value)) { + result.push(value); + } + } + return result; +} + +// Produce an array that contains the union: each distinct element from all of +// the passed-in arrays. +var union = restArguments(function(arrays) { + return uniq(flatten$1(arrays, true, true)); +}); + +// Produce an array that contains every item shared between all the +// passed-in arrays. +function intersection(array) { + var result = []; + var argsLength = arguments.length; + for (var i = 0, length = getLength(array); i < length; i++) { + var item = array[i]; + if (contains(result, item)) continue; + var j; + for (j = 1; j < argsLength; j++) { + if (!contains(arguments[j], item)) break; + } + if (j === argsLength) result.push(item); + } + return result; +} + +// Complement of zip. Unzip accepts an array of arrays and groups +// each array's elements on shared indices. +function unzip(array) { + var length = (array && max(array, getLength).length) || 0; + var result = Array(length); + + for (var index = 0; index < length; index++) { + result[index] = pluck(array, index); + } + return result; +} + +// Zip together multiple lists into a single array -- elements that share +// an index go together. +var zip = restArguments(unzip); + +// Converts lists into objects. Pass either a single array of `[key, value]` +// pairs, or two parallel arrays of the same length -- one of keys, and one of +// the corresponding values. Passing by pairs is the reverse of `_.pairs`. +function object(list, values) { + var result = {}; + for (var i = 0, length = getLength(list); i < length; i++) { + if (values) { + result[list[i]] = values[i]; + } else { + result[list[i][0]] = list[i][1]; + } + } + return result; +} + +// Generate an integer Array containing an arithmetic progression. A port of +// the native Python `range()` function. See +// [the Python documentation](https://docs.python.org/library/functions.html#range). +function range(start, stop, step) { + if (stop == null) { + stop = start || 0; + start = 0; + } + if (!step) { + step = stop < start ? -1 : 1; + } + + var length = Math.max(Math.ceil((stop - start) / step), 0); + var range = Array(length); + + for (var idx = 0; idx < length; idx++, start += step) { + range[idx] = start; + } + + return range; +} + +// Chunk a single array into multiple arrays, each containing `count` or fewer +// items. +function chunk(array, count) { + if (count == null || count < 1) return []; + var result = []; + var i = 0, length = array.length; + while (i < length) { + result.push(slice.call(array, i, i += count)); + } + return result; +} + +// Helper function to continue chaining intermediate results. +function chainResult(instance, obj) { + return instance._chain ? _$1(obj).chain() : obj; +} + +// Add your own custom functions to the Underscore object. +function mixin(obj) { + each(functions(obj), function(name) { + var func = _$1[name] = obj[name]; + _$1.prototype[name] = function() { + var args = [this._wrapped]; + push.apply(args, arguments); + return chainResult(this, func.apply(_$1, args)); + }; + }); + return _$1; +} + +// Add all mutator `Array` functions to the wrapper. +each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { + var method = ArrayProto[name]; + _$1.prototype[name] = function() { + var obj = this._wrapped; + if (obj != null) { + method.apply(obj, arguments); + if ((name === 'shift' || name === 'splice') && obj.length === 0) { + delete obj[0]; + } + } + return chainResult(this, obj); + }; +}); + +// Add all accessor `Array` functions to the wrapper. +each(['concat', 'join', 'slice'], function(name) { + var method = ArrayProto[name]; + _$1.prototype[name] = function() { + var obj = this._wrapped; + if (obj != null) obj = method.apply(obj, arguments); + return chainResult(this, obj); + }; +}); + +// Named Exports + +var allExports = { + __proto__: null, + VERSION: VERSION, + restArguments: restArguments, + isObject: isObject, + isNull: isNull, + isUndefined: isUndefined, + isBoolean: isBoolean, + isElement: isElement, + isString: isString, + isNumber: isNumber, + isDate: isDate, + isRegExp: isRegExp, + isError: isError, + isSymbol: isSymbol, + isArrayBuffer: isArrayBuffer, + isDataView: isDataView$1, + isArray: isArray, + isFunction: isFunction$1, + isArguments: isArguments$1, + isFinite: isFinite$1, + isNaN: isNaN$1, + isTypedArray: isTypedArray$1, + isEmpty: isEmpty, + isMatch: isMatch, + isEqual: isEqual, + isMap: isMap, + isWeakMap: isWeakMap, + isSet: isSet, + isWeakSet: isWeakSet, + keys: keys, + allKeys: allKeys, + values: values, + pairs: pairs, + invert: invert, + functions: functions, + methods: functions, + extend: extend, + extendOwn: extendOwn, + assign: extendOwn, + defaults: defaults, + create: create, + clone: clone, + tap: tap, + get: get, + has: has, + mapObject: mapObject, + identity: identity, + constant: constant, + noop: noop, + toPath: toPath$1, + property: property, + propertyOf: propertyOf, + matcher: matcher, + matches: matcher, + times: times, + random: random, + now: now, + escape: _escape, + unescape: _unescape, + templateSettings: templateSettings, + template: template, + result: result, + uniqueId: uniqueId, + chain: chain, + iteratee: iteratee, + partial: partial, + bind: bind, + bindAll: bindAll, + memoize: memoize, + delay: delay, + defer: defer, + throttle: throttle, + debounce: debounce, + wrap: wrap, + negate: negate, + compose: compose, + after: after, + before: before, + once: once, + findKey: findKey, + findIndex: findIndex, + findLastIndex: findLastIndex, + sortedIndex: sortedIndex, + indexOf: indexOf, + lastIndexOf: lastIndexOf, + find: find, + detect: find, + findWhere: findWhere, + each: each, + forEach: each, + map: map, + collect: map, + reduce: reduce, + foldl: reduce, + inject: reduce, + reduceRight: reduceRight, + foldr: reduceRight, + filter: filter, + select: filter, + reject: reject, + every: every, + all: every, + some: some, + any: some, + contains: contains, + includes: contains, + include: contains, + invoke: invoke, + pluck: pluck, + where: where, + max: max, + min: min, + shuffle: shuffle, + sample: sample, + sortBy: sortBy, + groupBy: groupBy, + indexBy: indexBy, + countBy: countBy, + partition: partition, + toArray: toArray, + size: size, + pick: pick, + omit: omit, + first: first, + head: first, + take: first, + initial: initial, + last: last, + rest: rest, + tail: rest, + drop: rest, + compact: compact, + flatten: flatten, + without: without, + uniq: uniq, + unique: uniq, + union: union, + intersection: intersection, + difference: difference, + unzip: unzip, + transpose: unzip, + zip: zip, + object: object, + range: range, + chunk: chunk, + mixin: mixin, + 'default': _$1 +}; + +// Default Export + +// Add all of the Underscore functions to the wrapper object. +var _ = mixin(allExports); +// Legacy Node.js API. +_._ = _; + +exports.VERSION = VERSION; +exports._ = _; +exports._escape = _escape; +exports._unescape = _unescape; +exports.after = after; +exports.allKeys = allKeys; +exports.before = before; +exports.bind = bind; +exports.bindAll = bindAll; +exports.chain = chain; +exports.chunk = chunk; +exports.clone = clone; +exports.compact = compact; +exports.compose = compose; +exports.constant = constant; +exports.contains = contains; +exports.countBy = countBy; +exports.create = create; +exports.debounce = debounce; +exports.defaults = defaults; +exports.defer = defer; +exports.delay = delay; +exports.difference = difference; +exports.each = each; +exports.every = every; +exports.extend = extend; +exports.extendOwn = extendOwn; +exports.filter = filter; +exports.find = find; +exports.findIndex = findIndex; +exports.findKey = findKey; +exports.findLastIndex = findLastIndex; +exports.findWhere = findWhere; +exports.first = first; +exports.flatten = flatten; +exports.functions = functions; +exports.get = get; +exports.groupBy = groupBy; +exports.has = has; +exports.identity = identity; +exports.indexBy = indexBy; +exports.indexOf = indexOf; +exports.initial = initial; +exports.intersection = intersection; +exports.invert = invert; +exports.invoke = invoke; +exports.isArguments = isArguments$1; +exports.isArray = isArray; +exports.isArrayBuffer = isArrayBuffer; +exports.isBoolean = isBoolean; +exports.isDataView = isDataView$1; +exports.isDate = isDate; +exports.isElement = isElement; +exports.isEmpty = isEmpty; +exports.isEqual = isEqual; +exports.isError = isError; +exports.isFinite = isFinite$1; +exports.isFunction = isFunction$1; +exports.isMap = isMap; +exports.isMatch = isMatch; +exports.isNaN = isNaN$1; +exports.isNull = isNull; +exports.isNumber = isNumber; +exports.isObject = isObject; +exports.isRegExp = isRegExp; +exports.isSet = isSet; +exports.isString = isString; +exports.isSymbol = isSymbol; +exports.isTypedArray = isTypedArray$1; +exports.isUndefined = isUndefined; +exports.isWeakMap = isWeakMap; +exports.isWeakSet = isWeakSet; +exports.iteratee = iteratee; +exports.keys = keys; +exports.last = last; +exports.lastIndexOf = lastIndexOf; +exports.map = map; +exports.mapObject = mapObject; +exports.matcher = matcher; +exports.max = max; +exports.memoize = memoize; +exports.min = min; +exports.mixin = mixin; +exports.negate = negate; +exports.noop = noop; +exports.now = now; +exports.object = object; +exports.omit = omit; +exports.once = once; +exports.pairs = pairs; +exports.partial = partial; +exports.partition = partition; +exports.pick = pick; +exports.pluck = pluck; +exports.property = property; +exports.propertyOf = propertyOf; +exports.random = random; +exports.range = range; +exports.reduce = reduce; +exports.reduceRight = reduceRight; +exports.reject = reject; +exports.rest = rest; +exports.restArguments = restArguments; +exports.result = result; +exports.sample = sample; +exports.shuffle = shuffle; +exports.size = size; +exports.some = some; +exports.sortBy = sortBy; +exports.sortedIndex = sortedIndex; +exports.tap = tap; +exports.template = template; +exports.templateSettings = templateSettings; +exports.throttle = throttle; +exports.times = times; +exports.toArray = toArray; +exports.toPath = toPath$1; +exports.union = union; +exports.uniq = uniq; +exports.uniqueId = uniqueId; +exports.unzip = unzip; +exports.values = values; +exports.where = where; +exports.without = without; +exports.wrap = wrap; +exports.zip = zip; +//# sourceMappingURL=underscore-node-f.cjs.map + + +/***/ }), + +/***/ 5067: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +// Underscore.js 1.13.6 +// https://underscorejs.org +// (c) 2009-2022 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors +// Underscore may be freely distributed under the MIT license. + +var underscoreNodeF = __nccwpck_require__(6717); + + + +module.exports = underscoreNodeF._; +//# sourceMappingURL=underscore-node.cjs.map + + +/***/ }), + +/***/ 1907: +/***/ ((module) => { + +"use strict"; +module.exports = JSON.parse('[[[0,44],"disallowed_STD3_valid"],[[45,46],"valid"],[[47,47],"disallowed_STD3_valid"],[[48,57],"valid"],[[58,64],"disallowed_STD3_valid"],[[65,65],"mapped",[97]],[[66,66],"mapped",[98]],[[67,67],"mapped",[99]],[[68,68],"mapped",[100]],[[69,69],"mapped",[101]],[[70,70],"mapped",[102]],[[71,71],"mapped",[103]],[[72,72],"mapped",[104]],[[73,73],"mapped",[105]],[[74,74],"mapped",[106]],[[75,75],"mapped",[107]],[[76,76],"mapped",[108]],[[77,77],"mapped",[109]],[[78,78],"mapped",[110]],[[79,79],"mapped",[111]],[[80,80],"mapped",[112]],[[81,81],"mapped",[113]],[[82,82],"mapped",[114]],[[83,83],"mapped",[115]],[[84,84],"mapped",[116]],[[85,85],"mapped",[117]],[[86,86],"mapped",[118]],[[87,87],"mapped",[119]],[[88,88],"mapped",[120]],[[89,89],"mapped",[121]],[[90,90],"mapped",[122]],[[91,96],"disallowed_STD3_valid"],[[97,122],"valid"],[[123,127],"disallowed_STD3_valid"],[[128,159],"disallowed"],[[160,160],"disallowed_STD3_mapped",[32]],[[161,167],"valid",[],"NV8"],[[168,168],"disallowed_STD3_mapped",[32,776]],[[169,169],"valid",[],"NV8"],[[170,170],"mapped",[97]],[[171,172],"valid",[],"NV8"],[[173,173],"ignored"],[[174,174],"valid",[],"NV8"],[[175,175],"disallowed_STD3_mapped",[32,772]],[[176,177],"valid",[],"NV8"],[[178,178],"mapped",[50]],[[179,179],"mapped",[51]],[[180,180],"disallowed_STD3_mapped",[32,769]],[[181,181],"mapped",[956]],[[182,182],"valid",[],"NV8"],[[183,183],"valid"],[[184,184],"disallowed_STD3_mapped",[32,807]],[[185,185],"mapped",[49]],[[186,186],"mapped",[111]],[[187,187],"valid",[],"NV8"],[[188,188],"mapped",[49,8260,52]],[[189,189],"mapped",[49,8260,50]],[[190,190],"mapped",[51,8260,52]],[[191,191],"valid",[],"NV8"],[[192,192],"mapped",[224]],[[193,193],"mapped",[225]],[[194,194],"mapped",[226]],[[195,195],"mapped",[227]],[[196,196],"mapped",[228]],[[197,197],"mapped",[229]],[[198,198],"mapped",[230]],[[199,199],"mapped",[231]],[[200,200],"mapped",[232]],[[201,201],"mapped",[233]],[[202,202],"mapped",[234]],[[203,203],"mapped",[235]],[[204,204],"mapped",[236]],[[205,205],"mapped",[237]],[[206,206],"mapped",[238]],[[207,207],"mapped",[239]],[[208,208],"mapped",[240]],[[209,209],"mapped",[241]],[[210,210],"mapped",[242]],[[211,211],"mapped",[243]],[[212,212],"mapped",[244]],[[213,213],"mapped",[245]],[[214,214],"mapped",[246]],[[215,215],"valid",[],"NV8"],[[216,216],"mapped",[248]],[[217,217],"mapped",[249]],[[218,218],"mapped",[250]],[[219,219],"mapped",[251]],[[220,220],"mapped",[252]],[[221,221],"mapped",[253]],[[222,222],"mapped",[254]],[[223,223],"deviation",[115,115]],[[224,246],"valid"],[[247,247],"valid",[],"NV8"],[[248,255],"valid"],[[256,256],"mapped",[257]],[[257,257],"valid"],[[258,258],"mapped",[259]],[[259,259],"valid"],[[260,260],"mapped",[261]],[[261,261],"valid"],[[262,262],"mapped",[263]],[[263,263],"valid"],[[264,264],"mapped",[265]],[[265,265],"valid"],[[266,266],"mapped",[267]],[[267,267],"valid"],[[268,268],"mapped",[269]],[[269,269],"valid"],[[270,270],"mapped",[271]],[[271,271],"valid"],[[272,272],"mapped",[273]],[[273,273],"valid"],[[274,274],"mapped",[275]],[[275,275],"valid"],[[276,276],"mapped",[277]],[[277,277],"valid"],[[278,278],"mapped",[279]],[[279,279],"valid"],[[280,280],"mapped",[281]],[[281,281],"valid"],[[282,282],"mapped",[283]],[[283,283],"valid"],[[284,284],"mapped",[285]],[[285,285],"valid"],[[286,286],"mapped",[287]],[[287,287],"valid"],[[288,288],"mapped",[289]],[[289,289],"valid"],[[290,290],"mapped",[291]],[[291,291],"valid"],[[292,292],"mapped",[293]],[[293,293],"valid"],[[294,294],"mapped",[295]],[[295,295],"valid"],[[296,296],"mapped",[297]],[[297,297],"valid"],[[298,298],"mapped",[299]],[[299,299],"valid"],[[300,300],"mapped",[301]],[[301,301],"valid"],[[302,302],"mapped",[303]],[[303,303],"valid"],[[304,304],"mapped",[105,775]],[[305,305],"valid"],[[306,307],"mapped",[105,106]],[[308,308],"mapped",[309]],[[309,309],"valid"],[[310,310],"mapped",[311]],[[311,312],"valid"],[[313,313],"mapped",[314]],[[314,314],"valid"],[[315,315],"mapped",[316]],[[316,316],"valid"],[[317,317],"mapped",[318]],[[318,318],"valid"],[[319,320],"mapped",[108,183]],[[321,321],"mapped",[322]],[[322,322],"valid"],[[323,323],"mapped",[324]],[[324,324],"valid"],[[325,325],"mapped",[326]],[[326,326],"valid"],[[327,327],"mapped",[328]],[[328,328],"valid"],[[329,329],"mapped",[700,110]],[[330,330],"mapped",[331]],[[331,331],"valid"],[[332,332],"mapped",[333]],[[333,333],"valid"],[[334,334],"mapped",[335]],[[335,335],"valid"],[[336,336],"mapped",[337]],[[337,337],"valid"],[[338,338],"mapped",[339]],[[339,339],"valid"],[[340,340],"mapped",[341]],[[341,341],"valid"],[[342,342],"mapped",[343]],[[343,343],"valid"],[[344,344],"mapped",[345]],[[345,345],"valid"],[[346,346],"mapped",[347]],[[347,347],"valid"],[[348,348],"mapped",[349]],[[349,349],"valid"],[[350,350],"mapped",[351]],[[351,351],"valid"],[[352,352],"mapped",[353]],[[353,353],"valid"],[[354,354],"mapped",[355]],[[355,355],"valid"],[[356,356],"mapped",[357]],[[357,357],"valid"],[[358,358],"mapped",[359]],[[359,359],"valid"],[[360,360],"mapped",[361]],[[361,361],"valid"],[[362,362],"mapped",[363]],[[363,363],"valid"],[[364,364],"mapped",[365]],[[365,365],"valid"],[[366,366],"mapped",[367]],[[367,367],"valid"],[[368,368],"mapped",[369]],[[369,369],"valid"],[[370,370],"mapped",[371]],[[371,371],"valid"],[[372,372],"mapped",[373]],[[373,373],"valid"],[[374,374],"mapped",[375]],[[375,375],"valid"],[[376,376],"mapped",[255]],[[377,377],"mapped",[378]],[[378,378],"valid"],[[379,379],"mapped",[380]],[[380,380],"valid"],[[381,381],"mapped",[382]],[[382,382],"valid"],[[383,383],"mapped",[115]],[[384,384],"valid"],[[385,385],"mapped",[595]],[[386,386],"mapped",[387]],[[387,387],"valid"],[[388,388],"mapped",[389]],[[389,389],"valid"],[[390,390],"mapped",[596]],[[391,391],"mapped",[392]],[[392,392],"valid"],[[393,393],"mapped",[598]],[[394,394],"mapped",[599]],[[395,395],"mapped",[396]],[[396,397],"valid"],[[398,398],"mapped",[477]],[[399,399],"mapped",[601]],[[400,400],"mapped",[603]],[[401,401],"mapped",[402]],[[402,402],"valid"],[[403,403],"mapped",[608]],[[404,404],"mapped",[611]],[[405,405],"valid"],[[406,406],"mapped",[617]],[[407,407],"mapped",[616]],[[408,408],"mapped",[409]],[[409,411],"valid"],[[412,412],"mapped",[623]],[[413,413],"mapped",[626]],[[414,414],"valid"],[[415,415],"mapped",[629]],[[416,416],"mapped",[417]],[[417,417],"valid"],[[418,418],"mapped",[419]],[[419,419],"valid"],[[420,420],"mapped",[421]],[[421,421],"valid"],[[422,422],"mapped",[640]],[[423,423],"mapped",[424]],[[424,424],"valid"],[[425,425],"mapped",[643]],[[426,427],"valid"],[[428,428],"mapped",[429]],[[429,429],"valid"],[[430,430],"mapped",[648]],[[431,431],"mapped",[432]],[[432,432],"valid"],[[433,433],"mapped",[650]],[[434,434],"mapped",[651]],[[435,435],"mapped",[436]],[[436,436],"valid"],[[437,437],"mapped",[438]],[[438,438],"valid"],[[439,439],"mapped",[658]],[[440,440],"mapped",[441]],[[441,443],"valid"],[[444,444],"mapped",[445]],[[445,451],"valid"],[[452,454],"mapped",[100,382]],[[455,457],"mapped",[108,106]],[[458,460],"mapped",[110,106]],[[461,461],"mapped",[462]],[[462,462],"valid"],[[463,463],"mapped",[464]],[[464,464],"valid"],[[465,465],"mapped",[466]],[[466,466],"valid"],[[467,467],"mapped",[468]],[[468,468],"valid"],[[469,469],"mapped",[470]],[[470,470],"valid"],[[471,471],"mapped",[472]],[[472,472],"valid"],[[473,473],"mapped",[474]],[[474,474],"valid"],[[475,475],"mapped",[476]],[[476,477],"valid"],[[478,478],"mapped",[479]],[[479,479],"valid"],[[480,480],"mapped",[481]],[[481,481],"valid"],[[482,482],"mapped",[483]],[[483,483],"valid"],[[484,484],"mapped",[485]],[[485,485],"valid"],[[486,486],"mapped",[487]],[[487,487],"valid"],[[488,488],"mapped",[489]],[[489,489],"valid"],[[490,490],"mapped",[491]],[[491,491],"valid"],[[492,492],"mapped",[493]],[[493,493],"valid"],[[494,494],"mapped",[495]],[[495,496],"valid"],[[497,499],"mapped",[100,122]],[[500,500],"mapped",[501]],[[501,501],"valid"],[[502,502],"mapped",[405]],[[503,503],"mapped",[447]],[[504,504],"mapped",[505]],[[505,505],"valid"],[[506,506],"mapped",[507]],[[507,507],"valid"],[[508,508],"mapped",[509]],[[509,509],"valid"],[[510,510],"mapped",[511]],[[511,511],"valid"],[[512,512],"mapped",[513]],[[513,513],"valid"],[[514,514],"mapped",[515]],[[515,515],"valid"],[[516,516],"mapped",[517]],[[517,517],"valid"],[[518,518],"mapped",[519]],[[519,519],"valid"],[[520,520],"mapped",[521]],[[521,521],"valid"],[[522,522],"mapped",[523]],[[523,523],"valid"],[[524,524],"mapped",[525]],[[525,525],"valid"],[[526,526],"mapped",[527]],[[527,527],"valid"],[[528,528],"mapped",[529]],[[529,529],"valid"],[[530,530],"mapped",[531]],[[531,531],"valid"],[[532,532],"mapped",[533]],[[533,533],"valid"],[[534,534],"mapped",[535]],[[535,535],"valid"],[[536,536],"mapped",[537]],[[537,537],"valid"],[[538,538],"mapped",[539]],[[539,539],"valid"],[[540,540],"mapped",[541]],[[541,541],"valid"],[[542,542],"mapped",[543]],[[543,543],"valid"],[[544,544],"mapped",[414]],[[545,545],"valid"],[[546,546],"mapped",[547]],[[547,547],"valid"],[[548,548],"mapped",[549]],[[549,549],"valid"],[[550,550],"mapped",[551]],[[551,551],"valid"],[[552,552],"mapped",[553]],[[553,553],"valid"],[[554,554],"mapped",[555]],[[555,555],"valid"],[[556,556],"mapped",[557]],[[557,557],"valid"],[[558,558],"mapped",[559]],[[559,559],"valid"],[[560,560],"mapped",[561]],[[561,561],"valid"],[[562,562],"mapped",[563]],[[563,563],"valid"],[[564,566],"valid"],[[567,569],"valid"],[[570,570],"mapped",[11365]],[[571,571],"mapped",[572]],[[572,572],"valid"],[[573,573],"mapped",[410]],[[574,574],"mapped",[11366]],[[575,576],"valid"],[[577,577],"mapped",[578]],[[578,578],"valid"],[[579,579],"mapped",[384]],[[580,580],"mapped",[649]],[[581,581],"mapped",[652]],[[582,582],"mapped",[583]],[[583,583],"valid"],[[584,584],"mapped",[585]],[[585,585],"valid"],[[586,586],"mapped",[587]],[[587,587],"valid"],[[588,588],"mapped",[589]],[[589,589],"valid"],[[590,590],"mapped",[591]],[[591,591],"valid"],[[592,680],"valid"],[[681,685],"valid"],[[686,687],"valid"],[[688,688],"mapped",[104]],[[689,689],"mapped",[614]],[[690,690],"mapped",[106]],[[691,691],"mapped",[114]],[[692,692],"mapped",[633]],[[693,693],"mapped",[635]],[[694,694],"mapped",[641]],[[695,695],"mapped",[119]],[[696,696],"mapped",[121]],[[697,705],"valid"],[[706,709],"valid",[],"NV8"],[[710,721],"valid"],[[722,727],"valid",[],"NV8"],[[728,728],"disallowed_STD3_mapped",[32,774]],[[729,729],"disallowed_STD3_mapped",[32,775]],[[730,730],"disallowed_STD3_mapped",[32,778]],[[731,731],"disallowed_STD3_mapped",[32,808]],[[732,732],"disallowed_STD3_mapped",[32,771]],[[733,733],"disallowed_STD3_mapped",[32,779]],[[734,734],"valid",[],"NV8"],[[735,735],"valid",[],"NV8"],[[736,736],"mapped",[611]],[[737,737],"mapped",[108]],[[738,738],"mapped",[115]],[[739,739],"mapped",[120]],[[740,740],"mapped",[661]],[[741,745],"valid",[],"NV8"],[[746,747],"valid",[],"NV8"],[[748,748],"valid"],[[749,749],"valid",[],"NV8"],[[750,750],"valid"],[[751,767],"valid",[],"NV8"],[[768,831],"valid"],[[832,832],"mapped",[768]],[[833,833],"mapped",[769]],[[834,834],"valid"],[[835,835],"mapped",[787]],[[836,836],"mapped",[776,769]],[[837,837],"mapped",[953]],[[838,846],"valid"],[[847,847],"ignored"],[[848,855],"valid"],[[856,860],"valid"],[[861,863],"valid"],[[864,865],"valid"],[[866,866],"valid"],[[867,879],"valid"],[[880,880],"mapped",[881]],[[881,881],"valid"],[[882,882],"mapped",[883]],[[883,883],"valid"],[[884,884],"mapped",[697]],[[885,885],"valid"],[[886,886],"mapped",[887]],[[887,887],"valid"],[[888,889],"disallowed"],[[890,890],"disallowed_STD3_mapped",[32,953]],[[891,893],"valid"],[[894,894],"disallowed_STD3_mapped",[59]],[[895,895],"mapped",[1011]],[[896,899],"disallowed"],[[900,900],"disallowed_STD3_mapped",[32,769]],[[901,901],"disallowed_STD3_mapped",[32,776,769]],[[902,902],"mapped",[940]],[[903,903],"mapped",[183]],[[904,904],"mapped",[941]],[[905,905],"mapped",[942]],[[906,906],"mapped",[943]],[[907,907],"disallowed"],[[908,908],"mapped",[972]],[[909,909],"disallowed"],[[910,910],"mapped",[973]],[[911,911],"mapped",[974]],[[912,912],"valid"],[[913,913],"mapped",[945]],[[914,914],"mapped",[946]],[[915,915],"mapped",[947]],[[916,916],"mapped",[948]],[[917,917],"mapped",[949]],[[918,918],"mapped",[950]],[[919,919],"mapped",[951]],[[920,920],"mapped",[952]],[[921,921],"mapped",[953]],[[922,922],"mapped",[954]],[[923,923],"mapped",[955]],[[924,924],"mapped",[956]],[[925,925],"mapped",[957]],[[926,926],"mapped",[958]],[[927,927],"mapped",[959]],[[928,928],"mapped",[960]],[[929,929],"mapped",[961]],[[930,930],"disallowed"],[[931,931],"mapped",[963]],[[932,932],"mapped",[964]],[[933,933],"mapped",[965]],[[934,934],"mapped",[966]],[[935,935],"mapped",[967]],[[936,936],"mapped",[968]],[[937,937],"mapped",[969]],[[938,938],"mapped",[970]],[[939,939],"mapped",[971]],[[940,961],"valid"],[[962,962],"deviation",[963]],[[963,974],"valid"],[[975,975],"mapped",[983]],[[976,976],"mapped",[946]],[[977,977],"mapped",[952]],[[978,978],"mapped",[965]],[[979,979],"mapped",[973]],[[980,980],"mapped",[971]],[[981,981],"mapped",[966]],[[982,982],"mapped",[960]],[[983,983],"valid"],[[984,984],"mapped",[985]],[[985,985],"valid"],[[986,986],"mapped",[987]],[[987,987],"valid"],[[988,988],"mapped",[989]],[[989,989],"valid"],[[990,990],"mapped",[991]],[[991,991],"valid"],[[992,992],"mapped",[993]],[[993,993],"valid"],[[994,994],"mapped",[995]],[[995,995],"valid"],[[996,996],"mapped",[997]],[[997,997],"valid"],[[998,998],"mapped",[999]],[[999,999],"valid"],[[1000,1000],"mapped",[1001]],[[1001,1001],"valid"],[[1002,1002],"mapped",[1003]],[[1003,1003],"valid"],[[1004,1004],"mapped",[1005]],[[1005,1005],"valid"],[[1006,1006],"mapped",[1007]],[[1007,1007],"valid"],[[1008,1008],"mapped",[954]],[[1009,1009],"mapped",[961]],[[1010,1010],"mapped",[963]],[[1011,1011],"valid"],[[1012,1012],"mapped",[952]],[[1013,1013],"mapped",[949]],[[1014,1014],"valid",[],"NV8"],[[1015,1015],"mapped",[1016]],[[1016,1016],"valid"],[[1017,1017],"mapped",[963]],[[1018,1018],"mapped",[1019]],[[1019,1019],"valid"],[[1020,1020],"valid"],[[1021,1021],"mapped",[891]],[[1022,1022],"mapped",[892]],[[1023,1023],"mapped",[893]],[[1024,1024],"mapped",[1104]],[[1025,1025],"mapped",[1105]],[[1026,1026],"mapped",[1106]],[[1027,1027],"mapped",[1107]],[[1028,1028],"mapped",[1108]],[[1029,1029],"mapped",[1109]],[[1030,1030],"mapped",[1110]],[[1031,1031],"mapped",[1111]],[[1032,1032],"mapped",[1112]],[[1033,1033],"mapped",[1113]],[[1034,1034],"mapped",[1114]],[[1035,1035],"mapped",[1115]],[[1036,1036],"mapped",[1116]],[[1037,1037],"mapped",[1117]],[[1038,1038],"mapped",[1118]],[[1039,1039],"mapped",[1119]],[[1040,1040],"mapped",[1072]],[[1041,1041],"mapped",[1073]],[[1042,1042],"mapped",[1074]],[[1043,1043],"mapped",[1075]],[[1044,1044],"mapped",[1076]],[[1045,1045],"mapped",[1077]],[[1046,1046],"mapped",[1078]],[[1047,1047],"mapped",[1079]],[[1048,1048],"mapped",[1080]],[[1049,1049],"mapped",[1081]],[[1050,1050],"mapped",[1082]],[[1051,1051],"mapped",[1083]],[[1052,1052],"mapped",[1084]],[[1053,1053],"mapped",[1085]],[[1054,1054],"mapped",[1086]],[[1055,1055],"mapped",[1087]],[[1056,1056],"mapped",[1088]],[[1057,1057],"mapped",[1089]],[[1058,1058],"mapped",[1090]],[[1059,1059],"mapped",[1091]],[[1060,1060],"mapped",[1092]],[[1061,1061],"mapped",[1093]],[[1062,1062],"mapped",[1094]],[[1063,1063],"mapped",[1095]],[[1064,1064],"mapped",[1096]],[[1065,1065],"mapped",[1097]],[[1066,1066],"mapped",[1098]],[[1067,1067],"mapped",[1099]],[[1068,1068],"mapped",[1100]],[[1069,1069],"mapped",[1101]],[[1070,1070],"mapped",[1102]],[[1071,1071],"mapped",[1103]],[[1072,1103],"valid"],[[1104,1104],"valid"],[[1105,1116],"valid"],[[1117,1117],"valid"],[[1118,1119],"valid"],[[1120,1120],"mapped",[1121]],[[1121,1121],"valid"],[[1122,1122],"mapped",[1123]],[[1123,1123],"valid"],[[1124,1124],"mapped",[1125]],[[1125,1125],"valid"],[[1126,1126],"mapped",[1127]],[[1127,1127],"valid"],[[1128,1128],"mapped",[1129]],[[1129,1129],"valid"],[[1130,1130],"mapped",[1131]],[[1131,1131],"valid"],[[1132,1132],"mapped",[1133]],[[1133,1133],"valid"],[[1134,1134],"mapped",[1135]],[[1135,1135],"valid"],[[1136,1136],"mapped",[1137]],[[1137,1137],"valid"],[[1138,1138],"mapped",[1139]],[[1139,1139],"valid"],[[1140,1140],"mapped",[1141]],[[1141,1141],"valid"],[[1142,1142],"mapped",[1143]],[[1143,1143],"valid"],[[1144,1144],"mapped",[1145]],[[1145,1145],"valid"],[[1146,1146],"mapped",[1147]],[[1147,1147],"valid"],[[1148,1148],"mapped",[1149]],[[1149,1149],"valid"],[[1150,1150],"mapped",[1151]],[[1151,1151],"valid"],[[1152,1152],"mapped",[1153]],[[1153,1153],"valid"],[[1154,1154],"valid",[],"NV8"],[[1155,1158],"valid"],[[1159,1159],"valid"],[[1160,1161],"valid",[],"NV8"],[[1162,1162],"mapped",[1163]],[[1163,1163],"valid"],[[1164,1164],"mapped",[1165]],[[1165,1165],"valid"],[[1166,1166],"mapped",[1167]],[[1167,1167],"valid"],[[1168,1168],"mapped",[1169]],[[1169,1169],"valid"],[[1170,1170],"mapped",[1171]],[[1171,1171],"valid"],[[1172,1172],"mapped",[1173]],[[1173,1173],"valid"],[[1174,1174],"mapped",[1175]],[[1175,1175],"valid"],[[1176,1176],"mapped",[1177]],[[1177,1177],"valid"],[[1178,1178],"mapped",[1179]],[[1179,1179],"valid"],[[1180,1180],"mapped",[1181]],[[1181,1181],"valid"],[[1182,1182],"mapped",[1183]],[[1183,1183],"valid"],[[1184,1184],"mapped",[1185]],[[1185,1185],"valid"],[[1186,1186],"mapped",[1187]],[[1187,1187],"valid"],[[1188,1188],"mapped",[1189]],[[1189,1189],"valid"],[[1190,1190],"mapped",[1191]],[[1191,1191],"valid"],[[1192,1192],"mapped",[1193]],[[1193,1193],"valid"],[[1194,1194],"mapped",[1195]],[[1195,1195],"valid"],[[1196,1196],"mapped",[1197]],[[1197,1197],"valid"],[[1198,1198],"mapped",[1199]],[[1199,1199],"valid"],[[1200,1200],"mapped",[1201]],[[1201,1201],"valid"],[[1202,1202],"mapped",[1203]],[[1203,1203],"valid"],[[1204,1204],"mapped",[1205]],[[1205,1205],"valid"],[[1206,1206],"mapped",[1207]],[[1207,1207],"valid"],[[1208,1208],"mapped",[1209]],[[1209,1209],"valid"],[[1210,1210],"mapped",[1211]],[[1211,1211],"valid"],[[1212,1212],"mapped",[1213]],[[1213,1213],"valid"],[[1214,1214],"mapped",[1215]],[[1215,1215],"valid"],[[1216,1216],"disallowed"],[[1217,1217],"mapped",[1218]],[[1218,1218],"valid"],[[1219,1219],"mapped",[1220]],[[1220,1220],"valid"],[[1221,1221],"mapped",[1222]],[[1222,1222],"valid"],[[1223,1223],"mapped",[1224]],[[1224,1224],"valid"],[[1225,1225],"mapped",[1226]],[[1226,1226],"valid"],[[1227,1227],"mapped",[1228]],[[1228,1228],"valid"],[[1229,1229],"mapped",[1230]],[[1230,1230],"valid"],[[1231,1231],"valid"],[[1232,1232],"mapped",[1233]],[[1233,1233],"valid"],[[1234,1234],"mapped",[1235]],[[1235,1235],"valid"],[[1236,1236],"mapped",[1237]],[[1237,1237],"valid"],[[1238,1238],"mapped",[1239]],[[1239,1239],"valid"],[[1240,1240],"mapped",[1241]],[[1241,1241],"valid"],[[1242,1242],"mapped",[1243]],[[1243,1243],"valid"],[[1244,1244],"mapped",[1245]],[[1245,1245],"valid"],[[1246,1246],"mapped",[1247]],[[1247,1247],"valid"],[[1248,1248],"mapped",[1249]],[[1249,1249],"valid"],[[1250,1250],"mapped",[1251]],[[1251,1251],"valid"],[[1252,1252],"mapped",[1253]],[[1253,1253],"valid"],[[1254,1254],"mapped",[1255]],[[1255,1255],"valid"],[[1256,1256],"mapped",[1257]],[[1257,1257],"valid"],[[1258,1258],"mapped",[1259]],[[1259,1259],"valid"],[[1260,1260],"mapped",[1261]],[[1261,1261],"valid"],[[1262,1262],"mapped",[1263]],[[1263,1263],"valid"],[[1264,1264],"mapped",[1265]],[[1265,1265],"valid"],[[1266,1266],"mapped",[1267]],[[1267,1267],"valid"],[[1268,1268],"mapped",[1269]],[[1269,1269],"valid"],[[1270,1270],"mapped",[1271]],[[1271,1271],"valid"],[[1272,1272],"mapped",[1273]],[[1273,1273],"valid"],[[1274,1274],"mapped",[1275]],[[1275,1275],"valid"],[[1276,1276],"mapped",[1277]],[[1277,1277],"valid"],[[1278,1278],"mapped",[1279]],[[1279,1279],"valid"],[[1280,1280],"mapped",[1281]],[[1281,1281],"valid"],[[1282,1282],"mapped",[1283]],[[1283,1283],"valid"],[[1284,1284],"mapped",[1285]],[[1285,1285],"valid"],[[1286,1286],"mapped",[1287]],[[1287,1287],"valid"],[[1288,1288],"mapped",[1289]],[[1289,1289],"valid"],[[1290,1290],"mapped",[1291]],[[1291,1291],"valid"],[[1292,1292],"mapped",[1293]],[[1293,1293],"valid"],[[1294,1294],"mapped",[1295]],[[1295,1295],"valid"],[[1296,1296],"mapped",[1297]],[[1297,1297],"valid"],[[1298,1298],"mapped",[1299]],[[1299,1299],"valid"],[[1300,1300],"mapped",[1301]],[[1301,1301],"valid"],[[1302,1302],"mapped",[1303]],[[1303,1303],"valid"],[[1304,1304],"mapped",[1305]],[[1305,1305],"valid"],[[1306,1306],"mapped",[1307]],[[1307,1307],"valid"],[[1308,1308],"mapped",[1309]],[[1309,1309],"valid"],[[1310,1310],"mapped",[1311]],[[1311,1311],"valid"],[[1312,1312],"mapped",[1313]],[[1313,1313],"valid"],[[1314,1314],"mapped",[1315]],[[1315,1315],"valid"],[[1316,1316],"mapped",[1317]],[[1317,1317],"valid"],[[1318,1318],"mapped",[1319]],[[1319,1319],"valid"],[[1320,1320],"mapped",[1321]],[[1321,1321],"valid"],[[1322,1322],"mapped",[1323]],[[1323,1323],"valid"],[[1324,1324],"mapped",[1325]],[[1325,1325],"valid"],[[1326,1326],"mapped",[1327]],[[1327,1327],"valid"],[[1328,1328],"disallowed"],[[1329,1329],"mapped",[1377]],[[1330,1330],"mapped",[1378]],[[1331,1331],"mapped",[1379]],[[1332,1332],"mapped",[1380]],[[1333,1333],"mapped",[1381]],[[1334,1334],"mapped",[1382]],[[1335,1335],"mapped",[1383]],[[1336,1336],"mapped",[1384]],[[1337,1337],"mapped",[1385]],[[1338,1338],"mapped",[1386]],[[1339,1339],"mapped",[1387]],[[1340,1340],"mapped",[1388]],[[1341,1341],"mapped",[1389]],[[1342,1342],"mapped",[1390]],[[1343,1343],"mapped",[1391]],[[1344,1344],"mapped",[1392]],[[1345,1345],"mapped",[1393]],[[1346,1346],"mapped",[1394]],[[1347,1347],"mapped",[1395]],[[1348,1348],"mapped",[1396]],[[1349,1349],"mapped",[1397]],[[1350,1350],"mapped",[1398]],[[1351,1351],"mapped",[1399]],[[1352,1352],"mapped",[1400]],[[1353,1353],"mapped",[1401]],[[1354,1354],"mapped",[1402]],[[1355,1355],"mapped",[1403]],[[1356,1356],"mapped",[1404]],[[1357,1357],"mapped",[1405]],[[1358,1358],"mapped",[1406]],[[1359,1359],"mapped",[1407]],[[1360,1360],"mapped",[1408]],[[1361,1361],"mapped",[1409]],[[1362,1362],"mapped",[1410]],[[1363,1363],"mapped",[1411]],[[1364,1364],"mapped",[1412]],[[1365,1365],"mapped",[1413]],[[1366,1366],"mapped",[1414]],[[1367,1368],"disallowed"],[[1369,1369],"valid"],[[1370,1375],"valid",[],"NV8"],[[1376,1376],"disallowed"],[[1377,1414],"valid"],[[1415,1415],"mapped",[1381,1410]],[[1416,1416],"disallowed"],[[1417,1417],"valid",[],"NV8"],[[1418,1418],"valid",[],"NV8"],[[1419,1420],"disallowed"],[[1421,1422],"valid",[],"NV8"],[[1423,1423],"valid",[],"NV8"],[[1424,1424],"disallowed"],[[1425,1441],"valid"],[[1442,1442],"valid"],[[1443,1455],"valid"],[[1456,1465],"valid"],[[1466,1466],"valid"],[[1467,1469],"valid"],[[1470,1470],"valid",[],"NV8"],[[1471,1471],"valid"],[[1472,1472],"valid",[],"NV8"],[[1473,1474],"valid"],[[1475,1475],"valid",[],"NV8"],[[1476,1476],"valid"],[[1477,1477],"valid"],[[1478,1478],"valid",[],"NV8"],[[1479,1479],"valid"],[[1480,1487],"disallowed"],[[1488,1514],"valid"],[[1515,1519],"disallowed"],[[1520,1524],"valid"],[[1525,1535],"disallowed"],[[1536,1539],"disallowed"],[[1540,1540],"disallowed"],[[1541,1541],"disallowed"],[[1542,1546],"valid",[],"NV8"],[[1547,1547],"valid",[],"NV8"],[[1548,1548],"valid",[],"NV8"],[[1549,1551],"valid",[],"NV8"],[[1552,1557],"valid"],[[1558,1562],"valid"],[[1563,1563],"valid",[],"NV8"],[[1564,1564],"disallowed"],[[1565,1565],"disallowed"],[[1566,1566],"valid",[],"NV8"],[[1567,1567],"valid",[],"NV8"],[[1568,1568],"valid"],[[1569,1594],"valid"],[[1595,1599],"valid"],[[1600,1600],"valid",[],"NV8"],[[1601,1618],"valid"],[[1619,1621],"valid"],[[1622,1624],"valid"],[[1625,1630],"valid"],[[1631,1631],"valid"],[[1632,1641],"valid"],[[1642,1645],"valid",[],"NV8"],[[1646,1647],"valid"],[[1648,1652],"valid"],[[1653,1653],"mapped",[1575,1652]],[[1654,1654],"mapped",[1608,1652]],[[1655,1655],"mapped",[1735,1652]],[[1656,1656],"mapped",[1610,1652]],[[1657,1719],"valid"],[[1720,1721],"valid"],[[1722,1726],"valid"],[[1727,1727],"valid"],[[1728,1742],"valid"],[[1743,1743],"valid"],[[1744,1747],"valid"],[[1748,1748],"valid",[],"NV8"],[[1749,1756],"valid"],[[1757,1757],"disallowed"],[[1758,1758],"valid",[],"NV8"],[[1759,1768],"valid"],[[1769,1769],"valid",[],"NV8"],[[1770,1773],"valid"],[[1774,1775],"valid"],[[1776,1785],"valid"],[[1786,1790],"valid"],[[1791,1791],"valid"],[[1792,1805],"valid",[],"NV8"],[[1806,1806],"disallowed"],[[1807,1807],"disallowed"],[[1808,1836],"valid"],[[1837,1839],"valid"],[[1840,1866],"valid"],[[1867,1868],"disallowed"],[[1869,1871],"valid"],[[1872,1901],"valid"],[[1902,1919],"valid"],[[1920,1968],"valid"],[[1969,1969],"valid"],[[1970,1983],"disallowed"],[[1984,2037],"valid"],[[2038,2042],"valid",[],"NV8"],[[2043,2047],"disallowed"],[[2048,2093],"valid"],[[2094,2095],"disallowed"],[[2096,2110],"valid",[],"NV8"],[[2111,2111],"disallowed"],[[2112,2139],"valid"],[[2140,2141],"disallowed"],[[2142,2142],"valid",[],"NV8"],[[2143,2207],"disallowed"],[[2208,2208],"valid"],[[2209,2209],"valid"],[[2210,2220],"valid"],[[2221,2226],"valid"],[[2227,2228],"valid"],[[2229,2274],"disallowed"],[[2275,2275],"valid"],[[2276,2302],"valid"],[[2303,2303],"valid"],[[2304,2304],"valid"],[[2305,2307],"valid"],[[2308,2308],"valid"],[[2309,2361],"valid"],[[2362,2363],"valid"],[[2364,2381],"valid"],[[2382,2382],"valid"],[[2383,2383],"valid"],[[2384,2388],"valid"],[[2389,2389],"valid"],[[2390,2391],"valid"],[[2392,2392],"mapped",[2325,2364]],[[2393,2393],"mapped",[2326,2364]],[[2394,2394],"mapped",[2327,2364]],[[2395,2395],"mapped",[2332,2364]],[[2396,2396],"mapped",[2337,2364]],[[2397,2397],"mapped",[2338,2364]],[[2398,2398],"mapped",[2347,2364]],[[2399,2399],"mapped",[2351,2364]],[[2400,2403],"valid"],[[2404,2405],"valid",[],"NV8"],[[2406,2415],"valid"],[[2416,2416],"valid",[],"NV8"],[[2417,2418],"valid"],[[2419,2423],"valid"],[[2424,2424],"valid"],[[2425,2426],"valid"],[[2427,2428],"valid"],[[2429,2429],"valid"],[[2430,2431],"valid"],[[2432,2432],"valid"],[[2433,2435],"valid"],[[2436,2436],"disallowed"],[[2437,2444],"valid"],[[2445,2446],"disallowed"],[[2447,2448],"valid"],[[2449,2450],"disallowed"],[[2451,2472],"valid"],[[2473,2473],"disallowed"],[[2474,2480],"valid"],[[2481,2481],"disallowed"],[[2482,2482],"valid"],[[2483,2485],"disallowed"],[[2486,2489],"valid"],[[2490,2491],"disallowed"],[[2492,2492],"valid"],[[2493,2493],"valid"],[[2494,2500],"valid"],[[2501,2502],"disallowed"],[[2503,2504],"valid"],[[2505,2506],"disallowed"],[[2507,2509],"valid"],[[2510,2510],"valid"],[[2511,2518],"disallowed"],[[2519,2519],"valid"],[[2520,2523],"disallowed"],[[2524,2524],"mapped",[2465,2492]],[[2525,2525],"mapped",[2466,2492]],[[2526,2526],"disallowed"],[[2527,2527],"mapped",[2479,2492]],[[2528,2531],"valid"],[[2532,2533],"disallowed"],[[2534,2545],"valid"],[[2546,2554],"valid",[],"NV8"],[[2555,2555],"valid",[],"NV8"],[[2556,2560],"disallowed"],[[2561,2561],"valid"],[[2562,2562],"valid"],[[2563,2563],"valid"],[[2564,2564],"disallowed"],[[2565,2570],"valid"],[[2571,2574],"disallowed"],[[2575,2576],"valid"],[[2577,2578],"disallowed"],[[2579,2600],"valid"],[[2601,2601],"disallowed"],[[2602,2608],"valid"],[[2609,2609],"disallowed"],[[2610,2610],"valid"],[[2611,2611],"mapped",[2610,2620]],[[2612,2612],"disallowed"],[[2613,2613],"valid"],[[2614,2614],"mapped",[2616,2620]],[[2615,2615],"disallowed"],[[2616,2617],"valid"],[[2618,2619],"disallowed"],[[2620,2620],"valid"],[[2621,2621],"disallowed"],[[2622,2626],"valid"],[[2627,2630],"disallowed"],[[2631,2632],"valid"],[[2633,2634],"disallowed"],[[2635,2637],"valid"],[[2638,2640],"disallowed"],[[2641,2641],"valid"],[[2642,2648],"disallowed"],[[2649,2649],"mapped",[2582,2620]],[[2650,2650],"mapped",[2583,2620]],[[2651,2651],"mapped",[2588,2620]],[[2652,2652],"valid"],[[2653,2653],"disallowed"],[[2654,2654],"mapped",[2603,2620]],[[2655,2661],"disallowed"],[[2662,2676],"valid"],[[2677,2677],"valid"],[[2678,2688],"disallowed"],[[2689,2691],"valid"],[[2692,2692],"disallowed"],[[2693,2699],"valid"],[[2700,2700],"valid"],[[2701,2701],"valid"],[[2702,2702],"disallowed"],[[2703,2705],"valid"],[[2706,2706],"disallowed"],[[2707,2728],"valid"],[[2729,2729],"disallowed"],[[2730,2736],"valid"],[[2737,2737],"disallowed"],[[2738,2739],"valid"],[[2740,2740],"disallowed"],[[2741,2745],"valid"],[[2746,2747],"disallowed"],[[2748,2757],"valid"],[[2758,2758],"disallowed"],[[2759,2761],"valid"],[[2762,2762],"disallowed"],[[2763,2765],"valid"],[[2766,2767],"disallowed"],[[2768,2768],"valid"],[[2769,2783],"disallowed"],[[2784,2784],"valid"],[[2785,2787],"valid"],[[2788,2789],"disallowed"],[[2790,2799],"valid"],[[2800,2800],"valid",[],"NV8"],[[2801,2801],"valid",[],"NV8"],[[2802,2808],"disallowed"],[[2809,2809],"valid"],[[2810,2816],"disallowed"],[[2817,2819],"valid"],[[2820,2820],"disallowed"],[[2821,2828],"valid"],[[2829,2830],"disallowed"],[[2831,2832],"valid"],[[2833,2834],"disallowed"],[[2835,2856],"valid"],[[2857,2857],"disallowed"],[[2858,2864],"valid"],[[2865,2865],"disallowed"],[[2866,2867],"valid"],[[2868,2868],"disallowed"],[[2869,2869],"valid"],[[2870,2873],"valid"],[[2874,2875],"disallowed"],[[2876,2883],"valid"],[[2884,2884],"valid"],[[2885,2886],"disallowed"],[[2887,2888],"valid"],[[2889,2890],"disallowed"],[[2891,2893],"valid"],[[2894,2901],"disallowed"],[[2902,2903],"valid"],[[2904,2907],"disallowed"],[[2908,2908],"mapped",[2849,2876]],[[2909,2909],"mapped",[2850,2876]],[[2910,2910],"disallowed"],[[2911,2913],"valid"],[[2914,2915],"valid"],[[2916,2917],"disallowed"],[[2918,2927],"valid"],[[2928,2928],"valid",[],"NV8"],[[2929,2929],"valid"],[[2930,2935],"valid",[],"NV8"],[[2936,2945],"disallowed"],[[2946,2947],"valid"],[[2948,2948],"disallowed"],[[2949,2954],"valid"],[[2955,2957],"disallowed"],[[2958,2960],"valid"],[[2961,2961],"disallowed"],[[2962,2965],"valid"],[[2966,2968],"disallowed"],[[2969,2970],"valid"],[[2971,2971],"disallowed"],[[2972,2972],"valid"],[[2973,2973],"disallowed"],[[2974,2975],"valid"],[[2976,2978],"disallowed"],[[2979,2980],"valid"],[[2981,2983],"disallowed"],[[2984,2986],"valid"],[[2987,2989],"disallowed"],[[2990,2997],"valid"],[[2998,2998],"valid"],[[2999,3001],"valid"],[[3002,3005],"disallowed"],[[3006,3010],"valid"],[[3011,3013],"disallowed"],[[3014,3016],"valid"],[[3017,3017],"disallowed"],[[3018,3021],"valid"],[[3022,3023],"disallowed"],[[3024,3024],"valid"],[[3025,3030],"disallowed"],[[3031,3031],"valid"],[[3032,3045],"disallowed"],[[3046,3046],"valid"],[[3047,3055],"valid"],[[3056,3058],"valid",[],"NV8"],[[3059,3066],"valid",[],"NV8"],[[3067,3071],"disallowed"],[[3072,3072],"valid"],[[3073,3075],"valid"],[[3076,3076],"disallowed"],[[3077,3084],"valid"],[[3085,3085],"disallowed"],[[3086,3088],"valid"],[[3089,3089],"disallowed"],[[3090,3112],"valid"],[[3113,3113],"disallowed"],[[3114,3123],"valid"],[[3124,3124],"valid"],[[3125,3129],"valid"],[[3130,3132],"disallowed"],[[3133,3133],"valid"],[[3134,3140],"valid"],[[3141,3141],"disallowed"],[[3142,3144],"valid"],[[3145,3145],"disallowed"],[[3146,3149],"valid"],[[3150,3156],"disallowed"],[[3157,3158],"valid"],[[3159,3159],"disallowed"],[[3160,3161],"valid"],[[3162,3162],"valid"],[[3163,3167],"disallowed"],[[3168,3169],"valid"],[[3170,3171],"valid"],[[3172,3173],"disallowed"],[[3174,3183],"valid"],[[3184,3191],"disallowed"],[[3192,3199],"valid",[],"NV8"],[[3200,3200],"disallowed"],[[3201,3201],"valid"],[[3202,3203],"valid"],[[3204,3204],"disallowed"],[[3205,3212],"valid"],[[3213,3213],"disallowed"],[[3214,3216],"valid"],[[3217,3217],"disallowed"],[[3218,3240],"valid"],[[3241,3241],"disallowed"],[[3242,3251],"valid"],[[3252,3252],"disallowed"],[[3253,3257],"valid"],[[3258,3259],"disallowed"],[[3260,3261],"valid"],[[3262,3268],"valid"],[[3269,3269],"disallowed"],[[3270,3272],"valid"],[[3273,3273],"disallowed"],[[3274,3277],"valid"],[[3278,3284],"disallowed"],[[3285,3286],"valid"],[[3287,3293],"disallowed"],[[3294,3294],"valid"],[[3295,3295],"disallowed"],[[3296,3297],"valid"],[[3298,3299],"valid"],[[3300,3301],"disallowed"],[[3302,3311],"valid"],[[3312,3312],"disallowed"],[[3313,3314],"valid"],[[3315,3328],"disallowed"],[[3329,3329],"valid"],[[3330,3331],"valid"],[[3332,3332],"disallowed"],[[3333,3340],"valid"],[[3341,3341],"disallowed"],[[3342,3344],"valid"],[[3345,3345],"disallowed"],[[3346,3368],"valid"],[[3369,3369],"valid"],[[3370,3385],"valid"],[[3386,3386],"valid"],[[3387,3388],"disallowed"],[[3389,3389],"valid"],[[3390,3395],"valid"],[[3396,3396],"valid"],[[3397,3397],"disallowed"],[[3398,3400],"valid"],[[3401,3401],"disallowed"],[[3402,3405],"valid"],[[3406,3406],"valid"],[[3407,3414],"disallowed"],[[3415,3415],"valid"],[[3416,3422],"disallowed"],[[3423,3423],"valid"],[[3424,3425],"valid"],[[3426,3427],"valid"],[[3428,3429],"disallowed"],[[3430,3439],"valid"],[[3440,3445],"valid",[],"NV8"],[[3446,3448],"disallowed"],[[3449,3449],"valid",[],"NV8"],[[3450,3455],"valid"],[[3456,3457],"disallowed"],[[3458,3459],"valid"],[[3460,3460],"disallowed"],[[3461,3478],"valid"],[[3479,3481],"disallowed"],[[3482,3505],"valid"],[[3506,3506],"disallowed"],[[3507,3515],"valid"],[[3516,3516],"disallowed"],[[3517,3517],"valid"],[[3518,3519],"disallowed"],[[3520,3526],"valid"],[[3527,3529],"disallowed"],[[3530,3530],"valid"],[[3531,3534],"disallowed"],[[3535,3540],"valid"],[[3541,3541],"disallowed"],[[3542,3542],"valid"],[[3543,3543],"disallowed"],[[3544,3551],"valid"],[[3552,3557],"disallowed"],[[3558,3567],"valid"],[[3568,3569],"disallowed"],[[3570,3571],"valid"],[[3572,3572],"valid",[],"NV8"],[[3573,3584],"disallowed"],[[3585,3634],"valid"],[[3635,3635],"mapped",[3661,3634]],[[3636,3642],"valid"],[[3643,3646],"disallowed"],[[3647,3647],"valid",[],"NV8"],[[3648,3662],"valid"],[[3663,3663],"valid",[],"NV8"],[[3664,3673],"valid"],[[3674,3675],"valid",[],"NV8"],[[3676,3712],"disallowed"],[[3713,3714],"valid"],[[3715,3715],"disallowed"],[[3716,3716],"valid"],[[3717,3718],"disallowed"],[[3719,3720],"valid"],[[3721,3721],"disallowed"],[[3722,3722],"valid"],[[3723,3724],"disallowed"],[[3725,3725],"valid"],[[3726,3731],"disallowed"],[[3732,3735],"valid"],[[3736,3736],"disallowed"],[[3737,3743],"valid"],[[3744,3744],"disallowed"],[[3745,3747],"valid"],[[3748,3748],"disallowed"],[[3749,3749],"valid"],[[3750,3750],"disallowed"],[[3751,3751],"valid"],[[3752,3753],"disallowed"],[[3754,3755],"valid"],[[3756,3756],"disallowed"],[[3757,3762],"valid"],[[3763,3763],"mapped",[3789,3762]],[[3764,3769],"valid"],[[3770,3770],"disallowed"],[[3771,3773],"valid"],[[3774,3775],"disallowed"],[[3776,3780],"valid"],[[3781,3781],"disallowed"],[[3782,3782],"valid"],[[3783,3783],"disallowed"],[[3784,3789],"valid"],[[3790,3791],"disallowed"],[[3792,3801],"valid"],[[3802,3803],"disallowed"],[[3804,3804],"mapped",[3755,3737]],[[3805,3805],"mapped",[3755,3745]],[[3806,3807],"valid"],[[3808,3839],"disallowed"],[[3840,3840],"valid"],[[3841,3850],"valid",[],"NV8"],[[3851,3851],"valid"],[[3852,3852],"mapped",[3851]],[[3853,3863],"valid",[],"NV8"],[[3864,3865],"valid"],[[3866,3871],"valid",[],"NV8"],[[3872,3881],"valid"],[[3882,3892],"valid",[],"NV8"],[[3893,3893],"valid"],[[3894,3894],"valid",[],"NV8"],[[3895,3895],"valid"],[[3896,3896],"valid",[],"NV8"],[[3897,3897],"valid"],[[3898,3901],"valid",[],"NV8"],[[3902,3906],"valid"],[[3907,3907],"mapped",[3906,4023]],[[3908,3911],"valid"],[[3912,3912],"disallowed"],[[3913,3916],"valid"],[[3917,3917],"mapped",[3916,4023]],[[3918,3921],"valid"],[[3922,3922],"mapped",[3921,4023]],[[3923,3926],"valid"],[[3927,3927],"mapped",[3926,4023]],[[3928,3931],"valid"],[[3932,3932],"mapped",[3931,4023]],[[3933,3944],"valid"],[[3945,3945],"mapped",[3904,4021]],[[3946,3946],"valid"],[[3947,3948],"valid"],[[3949,3952],"disallowed"],[[3953,3954],"valid"],[[3955,3955],"mapped",[3953,3954]],[[3956,3956],"valid"],[[3957,3957],"mapped",[3953,3956]],[[3958,3958],"mapped",[4018,3968]],[[3959,3959],"mapped",[4018,3953,3968]],[[3960,3960],"mapped",[4019,3968]],[[3961,3961],"mapped",[4019,3953,3968]],[[3962,3968],"valid"],[[3969,3969],"mapped",[3953,3968]],[[3970,3972],"valid"],[[3973,3973],"valid",[],"NV8"],[[3974,3979],"valid"],[[3980,3983],"valid"],[[3984,3986],"valid"],[[3987,3987],"mapped",[3986,4023]],[[3988,3989],"valid"],[[3990,3990],"valid"],[[3991,3991],"valid"],[[3992,3992],"disallowed"],[[3993,3996],"valid"],[[3997,3997],"mapped",[3996,4023]],[[3998,4001],"valid"],[[4002,4002],"mapped",[4001,4023]],[[4003,4006],"valid"],[[4007,4007],"mapped",[4006,4023]],[[4008,4011],"valid"],[[4012,4012],"mapped",[4011,4023]],[[4013,4013],"valid"],[[4014,4016],"valid"],[[4017,4023],"valid"],[[4024,4024],"valid"],[[4025,4025],"mapped",[3984,4021]],[[4026,4028],"valid"],[[4029,4029],"disallowed"],[[4030,4037],"valid",[],"NV8"],[[4038,4038],"valid"],[[4039,4044],"valid",[],"NV8"],[[4045,4045],"disallowed"],[[4046,4046],"valid",[],"NV8"],[[4047,4047],"valid",[],"NV8"],[[4048,4049],"valid",[],"NV8"],[[4050,4052],"valid",[],"NV8"],[[4053,4056],"valid",[],"NV8"],[[4057,4058],"valid",[],"NV8"],[[4059,4095],"disallowed"],[[4096,4129],"valid"],[[4130,4130],"valid"],[[4131,4135],"valid"],[[4136,4136],"valid"],[[4137,4138],"valid"],[[4139,4139],"valid"],[[4140,4146],"valid"],[[4147,4149],"valid"],[[4150,4153],"valid"],[[4154,4159],"valid"],[[4160,4169],"valid"],[[4170,4175],"valid",[],"NV8"],[[4176,4185],"valid"],[[4186,4249],"valid"],[[4250,4253],"valid"],[[4254,4255],"valid",[],"NV8"],[[4256,4293],"disallowed"],[[4294,4294],"disallowed"],[[4295,4295],"mapped",[11559]],[[4296,4300],"disallowed"],[[4301,4301],"mapped",[11565]],[[4302,4303],"disallowed"],[[4304,4342],"valid"],[[4343,4344],"valid"],[[4345,4346],"valid"],[[4347,4347],"valid",[],"NV8"],[[4348,4348],"mapped",[4316]],[[4349,4351],"valid"],[[4352,4441],"valid",[],"NV8"],[[4442,4446],"valid",[],"NV8"],[[4447,4448],"disallowed"],[[4449,4514],"valid",[],"NV8"],[[4515,4519],"valid",[],"NV8"],[[4520,4601],"valid",[],"NV8"],[[4602,4607],"valid",[],"NV8"],[[4608,4614],"valid"],[[4615,4615],"valid"],[[4616,4678],"valid"],[[4679,4679],"valid"],[[4680,4680],"valid"],[[4681,4681],"disallowed"],[[4682,4685],"valid"],[[4686,4687],"disallowed"],[[4688,4694],"valid"],[[4695,4695],"disallowed"],[[4696,4696],"valid"],[[4697,4697],"disallowed"],[[4698,4701],"valid"],[[4702,4703],"disallowed"],[[4704,4742],"valid"],[[4743,4743],"valid"],[[4744,4744],"valid"],[[4745,4745],"disallowed"],[[4746,4749],"valid"],[[4750,4751],"disallowed"],[[4752,4782],"valid"],[[4783,4783],"valid"],[[4784,4784],"valid"],[[4785,4785],"disallowed"],[[4786,4789],"valid"],[[4790,4791],"disallowed"],[[4792,4798],"valid"],[[4799,4799],"disallowed"],[[4800,4800],"valid"],[[4801,4801],"disallowed"],[[4802,4805],"valid"],[[4806,4807],"disallowed"],[[4808,4814],"valid"],[[4815,4815],"valid"],[[4816,4822],"valid"],[[4823,4823],"disallowed"],[[4824,4846],"valid"],[[4847,4847],"valid"],[[4848,4878],"valid"],[[4879,4879],"valid"],[[4880,4880],"valid"],[[4881,4881],"disallowed"],[[4882,4885],"valid"],[[4886,4887],"disallowed"],[[4888,4894],"valid"],[[4895,4895],"valid"],[[4896,4934],"valid"],[[4935,4935],"valid"],[[4936,4954],"valid"],[[4955,4956],"disallowed"],[[4957,4958],"valid"],[[4959,4959],"valid"],[[4960,4960],"valid",[],"NV8"],[[4961,4988],"valid",[],"NV8"],[[4989,4991],"disallowed"],[[4992,5007],"valid"],[[5008,5017],"valid",[],"NV8"],[[5018,5023],"disallowed"],[[5024,5108],"valid"],[[5109,5109],"valid"],[[5110,5111],"disallowed"],[[5112,5112],"mapped",[5104]],[[5113,5113],"mapped",[5105]],[[5114,5114],"mapped",[5106]],[[5115,5115],"mapped",[5107]],[[5116,5116],"mapped",[5108]],[[5117,5117],"mapped",[5109]],[[5118,5119],"disallowed"],[[5120,5120],"valid",[],"NV8"],[[5121,5740],"valid"],[[5741,5742],"valid",[],"NV8"],[[5743,5750],"valid"],[[5751,5759],"valid"],[[5760,5760],"disallowed"],[[5761,5786],"valid"],[[5787,5788],"valid",[],"NV8"],[[5789,5791],"disallowed"],[[5792,5866],"valid"],[[5867,5872],"valid",[],"NV8"],[[5873,5880],"valid"],[[5881,5887],"disallowed"],[[5888,5900],"valid"],[[5901,5901],"disallowed"],[[5902,5908],"valid"],[[5909,5919],"disallowed"],[[5920,5940],"valid"],[[5941,5942],"valid",[],"NV8"],[[5943,5951],"disallowed"],[[5952,5971],"valid"],[[5972,5983],"disallowed"],[[5984,5996],"valid"],[[5997,5997],"disallowed"],[[5998,6000],"valid"],[[6001,6001],"disallowed"],[[6002,6003],"valid"],[[6004,6015],"disallowed"],[[6016,6067],"valid"],[[6068,6069],"disallowed"],[[6070,6099],"valid"],[[6100,6102],"valid",[],"NV8"],[[6103,6103],"valid"],[[6104,6107],"valid",[],"NV8"],[[6108,6108],"valid"],[[6109,6109],"valid"],[[6110,6111],"disallowed"],[[6112,6121],"valid"],[[6122,6127],"disallowed"],[[6128,6137],"valid",[],"NV8"],[[6138,6143],"disallowed"],[[6144,6149],"valid",[],"NV8"],[[6150,6150],"disallowed"],[[6151,6154],"valid",[],"NV8"],[[6155,6157],"ignored"],[[6158,6158],"disallowed"],[[6159,6159],"disallowed"],[[6160,6169],"valid"],[[6170,6175],"disallowed"],[[6176,6263],"valid"],[[6264,6271],"disallowed"],[[6272,6313],"valid"],[[6314,6314],"valid"],[[6315,6319],"disallowed"],[[6320,6389],"valid"],[[6390,6399],"disallowed"],[[6400,6428],"valid"],[[6429,6430],"valid"],[[6431,6431],"disallowed"],[[6432,6443],"valid"],[[6444,6447],"disallowed"],[[6448,6459],"valid"],[[6460,6463],"disallowed"],[[6464,6464],"valid",[],"NV8"],[[6465,6467],"disallowed"],[[6468,6469],"valid",[],"NV8"],[[6470,6509],"valid"],[[6510,6511],"disallowed"],[[6512,6516],"valid"],[[6517,6527],"disallowed"],[[6528,6569],"valid"],[[6570,6571],"valid"],[[6572,6575],"disallowed"],[[6576,6601],"valid"],[[6602,6607],"disallowed"],[[6608,6617],"valid"],[[6618,6618],"valid",[],"XV8"],[[6619,6621],"disallowed"],[[6622,6623],"valid",[],"NV8"],[[6624,6655],"valid",[],"NV8"],[[6656,6683],"valid"],[[6684,6685],"disallowed"],[[6686,6687],"valid",[],"NV8"],[[6688,6750],"valid"],[[6751,6751],"disallowed"],[[6752,6780],"valid"],[[6781,6782],"disallowed"],[[6783,6793],"valid"],[[6794,6799],"disallowed"],[[6800,6809],"valid"],[[6810,6815],"disallowed"],[[6816,6822],"valid",[],"NV8"],[[6823,6823],"valid"],[[6824,6829],"valid",[],"NV8"],[[6830,6831],"disallowed"],[[6832,6845],"valid"],[[6846,6846],"valid",[],"NV8"],[[6847,6911],"disallowed"],[[6912,6987],"valid"],[[6988,6991],"disallowed"],[[6992,7001],"valid"],[[7002,7018],"valid",[],"NV8"],[[7019,7027],"valid"],[[7028,7036],"valid",[],"NV8"],[[7037,7039],"disallowed"],[[7040,7082],"valid"],[[7083,7085],"valid"],[[7086,7097],"valid"],[[7098,7103],"valid"],[[7104,7155],"valid"],[[7156,7163],"disallowed"],[[7164,7167],"valid",[],"NV8"],[[7168,7223],"valid"],[[7224,7226],"disallowed"],[[7227,7231],"valid",[],"NV8"],[[7232,7241],"valid"],[[7242,7244],"disallowed"],[[7245,7293],"valid"],[[7294,7295],"valid",[],"NV8"],[[7296,7359],"disallowed"],[[7360,7367],"valid",[],"NV8"],[[7368,7375],"disallowed"],[[7376,7378],"valid"],[[7379,7379],"valid",[],"NV8"],[[7380,7410],"valid"],[[7411,7414],"valid"],[[7415,7415],"disallowed"],[[7416,7417],"valid"],[[7418,7423],"disallowed"],[[7424,7467],"valid"],[[7468,7468],"mapped",[97]],[[7469,7469],"mapped",[230]],[[7470,7470],"mapped",[98]],[[7471,7471],"valid"],[[7472,7472],"mapped",[100]],[[7473,7473],"mapped",[101]],[[7474,7474],"mapped",[477]],[[7475,7475],"mapped",[103]],[[7476,7476],"mapped",[104]],[[7477,7477],"mapped",[105]],[[7478,7478],"mapped",[106]],[[7479,7479],"mapped",[107]],[[7480,7480],"mapped",[108]],[[7481,7481],"mapped",[109]],[[7482,7482],"mapped",[110]],[[7483,7483],"valid"],[[7484,7484],"mapped",[111]],[[7485,7485],"mapped",[547]],[[7486,7486],"mapped",[112]],[[7487,7487],"mapped",[114]],[[7488,7488],"mapped",[116]],[[7489,7489],"mapped",[117]],[[7490,7490],"mapped",[119]],[[7491,7491],"mapped",[97]],[[7492,7492],"mapped",[592]],[[7493,7493],"mapped",[593]],[[7494,7494],"mapped",[7426]],[[7495,7495],"mapped",[98]],[[7496,7496],"mapped",[100]],[[7497,7497],"mapped",[101]],[[7498,7498],"mapped",[601]],[[7499,7499],"mapped",[603]],[[7500,7500],"mapped",[604]],[[7501,7501],"mapped",[103]],[[7502,7502],"valid"],[[7503,7503],"mapped",[107]],[[7504,7504],"mapped",[109]],[[7505,7505],"mapped",[331]],[[7506,7506],"mapped",[111]],[[7507,7507],"mapped",[596]],[[7508,7508],"mapped",[7446]],[[7509,7509],"mapped",[7447]],[[7510,7510],"mapped",[112]],[[7511,7511],"mapped",[116]],[[7512,7512],"mapped",[117]],[[7513,7513],"mapped",[7453]],[[7514,7514],"mapped",[623]],[[7515,7515],"mapped",[118]],[[7516,7516],"mapped",[7461]],[[7517,7517],"mapped",[946]],[[7518,7518],"mapped",[947]],[[7519,7519],"mapped",[948]],[[7520,7520],"mapped",[966]],[[7521,7521],"mapped",[967]],[[7522,7522],"mapped",[105]],[[7523,7523],"mapped",[114]],[[7524,7524],"mapped",[117]],[[7525,7525],"mapped",[118]],[[7526,7526],"mapped",[946]],[[7527,7527],"mapped",[947]],[[7528,7528],"mapped",[961]],[[7529,7529],"mapped",[966]],[[7530,7530],"mapped",[967]],[[7531,7531],"valid"],[[7532,7543],"valid"],[[7544,7544],"mapped",[1085]],[[7545,7578],"valid"],[[7579,7579],"mapped",[594]],[[7580,7580],"mapped",[99]],[[7581,7581],"mapped",[597]],[[7582,7582],"mapped",[240]],[[7583,7583],"mapped",[604]],[[7584,7584],"mapped",[102]],[[7585,7585],"mapped",[607]],[[7586,7586],"mapped",[609]],[[7587,7587],"mapped",[613]],[[7588,7588],"mapped",[616]],[[7589,7589],"mapped",[617]],[[7590,7590],"mapped",[618]],[[7591,7591],"mapped",[7547]],[[7592,7592],"mapped",[669]],[[7593,7593],"mapped",[621]],[[7594,7594],"mapped",[7557]],[[7595,7595],"mapped",[671]],[[7596,7596],"mapped",[625]],[[7597,7597],"mapped",[624]],[[7598,7598],"mapped",[626]],[[7599,7599],"mapped",[627]],[[7600,7600],"mapped",[628]],[[7601,7601],"mapped",[629]],[[7602,7602],"mapped",[632]],[[7603,7603],"mapped",[642]],[[7604,7604],"mapped",[643]],[[7605,7605],"mapped",[427]],[[7606,7606],"mapped",[649]],[[7607,7607],"mapped",[650]],[[7608,7608],"mapped",[7452]],[[7609,7609],"mapped",[651]],[[7610,7610],"mapped",[652]],[[7611,7611],"mapped",[122]],[[7612,7612],"mapped",[656]],[[7613,7613],"mapped",[657]],[[7614,7614],"mapped",[658]],[[7615,7615],"mapped",[952]],[[7616,7619],"valid"],[[7620,7626],"valid"],[[7627,7654],"valid"],[[7655,7669],"valid"],[[7670,7675],"disallowed"],[[7676,7676],"valid"],[[7677,7677],"valid"],[[7678,7679],"valid"],[[7680,7680],"mapped",[7681]],[[7681,7681],"valid"],[[7682,7682],"mapped",[7683]],[[7683,7683],"valid"],[[7684,7684],"mapped",[7685]],[[7685,7685],"valid"],[[7686,7686],"mapped",[7687]],[[7687,7687],"valid"],[[7688,7688],"mapped",[7689]],[[7689,7689],"valid"],[[7690,7690],"mapped",[7691]],[[7691,7691],"valid"],[[7692,7692],"mapped",[7693]],[[7693,7693],"valid"],[[7694,7694],"mapped",[7695]],[[7695,7695],"valid"],[[7696,7696],"mapped",[7697]],[[7697,7697],"valid"],[[7698,7698],"mapped",[7699]],[[7699,7699],"valid"],[[7700,7700],"mapped",[7701]],[[7701,7701],"valid"],[[7702,7702],"mapped",[7703]],[[7703,7703],"valid"],[[7704,7704],"mapped",[7705]],[[7705,7705],"valid"],[[7706,7706],"mapped",[7707]],[[7707,7707],"valid"],[[7708,7708],"mapped",[7709]],[[7709,7709],"valid"],[[7710,7710],"mapped",[7711]],[[7711,7711],"valid"],[[7712,7712],"mapped",[7713]],[[7713,7713],"valid"],[[7714,7714],"mapped",[7715]],[[7715,7715],"valid"],[[7716,7716],"mapped",[7717]],[[7717,7717],"valid"],[[7718,7718],"mapped",[7719]],[[7719,7719],"valid"],[[7720,7720],"mapped",[7721]],[[7721,7721],"valid"],[[7722,7722],"mapped",[7723]],[[7723,7723],"valid"],[[7724,7724],"mapped",[7725]],[[7725,7725],"valid"],[[7726,7726],"mapped",[7727]],[[7727,7727],"valid"],[[7728,7728],"mapped",[7729]],[[7729,7729],"valid"],[[7730,7730],"mapped",[7731]],[[7731,7731],"valid"],[[7732,7732],"mapped",[7733]],[[7733,7733],"valid"],[[7734,7734],"mapped",[7735]],[[7735,7735],"valid"],[[7736,7736],"mapped",[7737]],[[7737,7737],"valid"],[[7738,7738],"mapped",[7739]],[[7739,7739],"valid"],[[7740,7740],"mapped",[7741]],[[7741,7741],"valid"],[[7742,7742],"mapped",[7743]],[[7743,7743],"valid"],[[7744,7744],"mapped",[7745]],[[7745,7745],"valid"],[[7746,7746],"mapped",[7747]],[[7747,7747],"valid"],[[7748,7748],"mapped",[7749]],[[7749,7749],"valid"],[[7750,7750],"mapped",[7751]],[[7751,7751],"valid"],[[7752,7752],"mapped",[7753]],[[7753,7753],"valid"],[[7754,7754],"mapped",[7755]],[[7755,7755],"valid"],[[7756,7756],"mapped",[7757]],[[7757,7757],"valid"],[[7758,7758],"mapped",[7759]],[[7759,7759],"valid"],[[7760,7760],"mapped",[7761]],[[7761,7761],"valid"],[[7762,7762],"mapped",[7763]],[[7763,7763],"valid"],[[7764,7764],"mapped",[7765]],[[7765,7765],"valid"],[[7766,7766],"mapped",[7767]],[[7767,7767],"valid"],[[7768,7768],"mapped",[7769]],[[7769,7769],"valid"],[[7770,7770],"mapped",[7771]],[[7771,7771],"valid"],[[7772,7772],"mapped",[7773]],[[7773,7773],"valid"],[[7774,7774],"mapped",[7775]],[[7775,7775],"valid"],[[7776,7776],"mapped",[7777]],[[7777,7777],"valid"],[[7778,7778],"mapped",[7779]],[[7779,7779],"valid"],[[7780,7780],"mapped",[7781]],[[7781,7781],"valid"],[[7782,7782],"mapped",[7783]],[[7783,7783],"valid"],[[7784,7784],"mapped",[7785]],[[7785,7785],"valid"],[[7786,7786],"mapped",[7787]],[[7787,7787],"valid"],[[7788,7788],"mapped",[7789]],[[7789,7789],"valid"],[[7790,7790],"mapped",[7791]],[[7791,7791],"valid"],[[7792,7792],"mapped",[7793]],[[7793,7793],"valid"],[[7794,7794],"mapped",[7795]],[[7795,7795],"valid"],[[7796,7796],"mapped",[7797]],[[7797,7797],"valid"],[[7798,7798],"mapped",[7799]],[[7799,7799],"valid"],[[7800,7800],"mapped",[7801]],[[7801,7801],"valid"],[[7802,7802],"mapped",[7803]],[[7803,7803],"valid"],[[7804,7804],"mapped",[7805]],[[7805,7805],"valid"],[[7806,7806],"mapped",[7807]],[[7807,7807],"valid"],[[7808,7808],"mapped",[7809]],[[7809,7809],"valid"],[[7810,7810],"mapped",[7811]],[[7811,7811],"valid"],[[7812,7812],"mapped",[7813]],[[7813,7813],"valid"],[[7814,7814],"mapped",[7815]],[[7815,7815],"valid"],[[7816,7816],"mapped",[7817]],[[7817,7817],"valid"],[[7818,7818],"mapped",[7819]],[[7819,7819],"valid"],[[7820,7820],"mapped",[7821]],[[7821,7821],"valid"],[[7822,7822],"mapped",[7823]],[[7823,7823],"valid"],[[7824,7824],"mapped",[7825]],[[7825,7825],"valid"],[[7826,7826],"mapped",[7827]],[[7827,7827],"valid"],[[7828,7828],"mapped",[7829]],[[7829,7833],"valid"],[[7834,7834],"mapped",[97,702]],[[7835,7835],"mapped",[7777]],[[7836,7837],"valid"],[[7838,7838],"mapped",[115,115]],[[7839,7839],"valid"],[[7840,7840],"mapped",[7841]],[[7841,7841],"valid"],[[7842,7842],"mapped",[7843]],[[7843,7843],"valid"],[[7844,7844],"mapped",[7845]],[[7845,7845],"valid"],[[7846,7846],"mapped",[7847]],[[7847,7847],"valid"],[[7848,7848],"mapped",[7849]],[[7849,7849],"valid"],[[7850,7850],"mapped",[7851]],[[7851,7851],"valid"],[[7852,7852],"mapped",[7853]],[[7853,7853],"valid"],[[7854,7854],"mapped",[7855]],[[7855,7855],"valid"],[[7856,7856],"mapped",[7857]],[[7857,7857],"valid"],[[7858,7858],"mapped",[7859]],[[7859,7859],"valid"],[[7860,7860],"mapped",[7861]],[[7861,7861],"valid"],[[7862,7862],"mapped",[7863]],[[7863,7863],"valid"],[[7864,7864],"mapped",[7865]],[[7865,7865],"valid"],[[7866,7866],"mapped",[7867]],[[7867,7867],"valid"],[[7868,7868],"mapped",[7869]],[[7869,7869],"valid"],[[7870,7870],"mapped",[7871]],[[7871,7871],"valid"],[[7872,7872],"mapped",[7873]],[[7873,7873],"valid"],[[7874,7874],"mapped",[7875]],[[7875,7875],"valid"],[[7876,7876],"mapped",[7877]],[[7877,7877],"valid"],[[7878,7878],"mapped",[7879]],[[7879,7879],"valid"],[[7880,7880],"mapped",[7881]],[[7881,7881],"valid"],[[7882,7882],"mapped",[7883]],[[7883,7883],"valid"],[[7884,7884],"mapped",[7885]],[[7885,7885],"valid"],[[7886,7886],"mapped",[7887]],[[7887,7887],"valid"],[[7888,7888],"mapped",[7889]],[[7889,7889],"valid"],[[7890,7890],"mapped",[7891]],[[7891,7891],"valid"],[[7892,7892],"mapped",[7893]],[[7893,7893],"valid"],[[7894,7894],"mapped",[7895]],[[7895,7895],"valid"],[[7896,7896],"mapped",[7897]],[[7897,7897],"valid"],[[7898,7898],"mapped",[7899]],[[7899,7899],"valid"],[[7900,7900],"mapped",[7901]],[[7901,7901],"valid"],[[7902,7902],"mapped",[7903]],[[7903,7903],"valid"],[[7904,7904],"mapped",[7905]],[[7905,7905],"valid"],[[7906,7906],"mapped",[7907]],[[7907,7907],"valid"],[[7908,7908],"mapped",[7909]],[[7909,7909],"valid"],[[7910,7910],"mapped",[7911]],[[7911,7911],"valid"],[[7912,7912],"mapped",[7913]],[[7913,7913],"valid"],[[7914,7914],"mapped",[7915]],[[7915,7915],"valid"],[[7916,7916],"mapped",[7917]],[[7917,7917],"valid"],[[7918,7918],"mapped",[7919]],[[7919,7919],"valid"],[[7920,7920],"mapped",[7921]],[[7921,7921],"valid"],[[7922,7922],"mapped",[7923]],[[7923,7923],"valid"],[[7924,7924],"mapped",[7925]],[[7925,7925],"valid"],[[7926,7926],"mapped",[7927]],[[7927,7927],"valid"],[[7928,7928],"mapped",[7929]],[[7929,7929],"valid"],[[7930,7930],"mapped",[7931]],[[7931,7931],"valid"],[[7932,7932],"mapped",[7933]],[[7933,7933],"valid"],[[7934,7934],"mapped",[7935]],[[7935,7935],"valid"],[[7936,7943],"valid"],[[7944,7944],"mapped",[7936]],[[7945,7945],"mapped",[7937]],[[7946,7946],"mapped",[7938]],[[7947,7947],"mapped",[7939]],[[7948,7948],"mapped",[7940]],[[7949,7949],"mapped",[7941]],[[7950,7950],"mapped",[7942]],[[7951,7951],"mapped",[7943]],[[7952,7957],"valid"],[[7958,7959],"disallowed"],[[7960,7960],"mapped",[7952]],[[7961,7961],"mapped",[7953]],[[7962,7962],"mapped",[7954]],[[7963,7963],"mapped",[7955]],[[7964,7964],"mapped",[7956]],[[7965,7965],"mapped",[7957]],[[7966,7967],"disallowed"],[[7968,7975],"valid"],[[7976,7976],"mapped",[7968]],[[7977,7977],"mapped",[7969]],[[7978,7978],"mapped",[7970]],[[7979,7979],"mapped",[7971]],[[7980,7980],"mapped",[7972]],[[7981,7981],"mapped",[7973]],[[7982,7982],"mapped",[7974]],[[7983,7983],"mapped",[7975]],[[7984,7991],"valid"],[[7992,7992],"mapped",[7984]],[[7993,7993],"mapped",[7985]],[[7994,7994],"mapped",[7986]],[[7995,7995],"mapped",[7987]],[[7996,7996],"mapped",[7988]],[[7997,7997],"mapped",[7989]],[[7998,7998],"mapped",[7990]],[[7999,7999],"mapped",[7991]],[[8000,8005],"valid"],[[8006,8007],"disallowed"],[[8008,8008],"mapped",[8000]],[[8009,8009],"mapped",[8001]],[[8010,8010],"mapped",[8002]],[[8011,8011],"mapped",[8003]],[[8012,8012],"mapped",[8004]],[[8013,8013],"mapped",[8005]],[[8014,8015],"disallowed"],[[8016,8023],"valid"],[[8024,8024],"disallowed"],[[8025,8025],"mapped",[8017]],[[8026,8026],"disallowed"],[[8027,8027],"mapped",[8019]],[[8028,8028],"disallowed"],[[8029,8029],"mapped",[8021]],[[8030,8030],"disallowed"],[[8031,8031],"mapped",[8023]],[[8032,8039],"valid"],[[8040,8040],"mapped",[8032]],[[8041,8041],"mapped",[8033]],[[8042,8042],"mapped",[8034]],[[8043,8043],"mapped",[8035]],[[8044,8044],"mapped",[8036]],[[8045,8045],"mapped",[8037]],[[8046,8046],"mapped",[8038]],[[8047,8047],"mapped",[8039]],[[8048,8048],"valid"],[[8049,8049],"mapped",[940]],[[8050,8050],"valid"],[[8051,8051],"mapped",[941]],[[8052,8052],"valid"],[[8053,8053],"mapped",[942]],[[8054,8054],"valid"],[[8055,8055],"mapped",[943]],[[8056,8056],"valid"],[[8057,8057],"mapped",[972]],[[8058,8058],"valid"],[[8059,8059],"mapped",[973]],[[8060,8060],"valid"],[[8061,8061],"mapped",[974]],[[8062,8063],"disallowed"],[[8064,8064],"mapped",[7936,953]],[[8065,8065],"mapped",[7937,953]],[[8066,8066],"mapped",[7938,953]],[[8067,8067],"mapped",[7939,953]],[[8068,8068],"mapped",[7940,953]],[[8069,8069],"mapped",[7941,953]],[[8070,8070],"mapped",[7942,953]],[[8071,8071],"mapped",[7943,953]],[[8072,8072],"mapped",[7936,953]],[[8073,8073],"mapped",[7937,953]],[[8074,8074],"mapped",[7938,953]],[[8075,8075],"mapped",[7939,953]],[[8076,8076],"mapped",[7940,953]],[[8077,8077],"mapped",[7941,953]],[[8078,8078],"mapped",[7942,953]],[[8079,8079],"mapped",[7943,953]],[[8080,8080],"mapped",[7968,953]],[[8081,8081],"mapped",[7969,953]],[[8082,8082],"mapped",[7970,953]],[[8083,8083],"mapped",[7971,953]],[[8084,8084],"mapped",[7972,953]],[[8085,8085],"mapped",[7973,953]],[[8086,8086],"mapped",[7974,953]],[[8087,8087],"mapped",[7975,953]],[[8088,8088],"mapped",[7968,953]],[[8089,8089],"mapped",[7969,953]],[[8090,8090],"mapped",[7970,953]],[[8091,8091],"mapped",[7971,953]],[[8092,8092],"mapped",[7972,953]],[[8093,8093],"mapped",[7973,953]],[[8094,8094],"mapped",[7974,953]],[[8095,8095],"mapped",[7975,953]],[[8096,8096],"mapped",[8032,953]],[[8097,8097],"mapped",[8033,953]],[[8098,8098],"mapped",[8034,953]],[[8099,8099],"mapped",[8035,953]],[[8100,8100],"mapped",[8036,953]],[[8101,8101],"mapped",[8037,953]],[[8102,8102],"mapped",[8038,953]],[[8103,8103],"mapped",[8039,953]],[[8104,8104],"mapped",[8032,953]],[[8105,8105],"mapped",[8033,953]],[[8106,8106],"mapped",[8034,953]],[[8107,8107],"mapped",[8035,953]],[[8108,8108],"mapped",[8036,953]],[[8109,8109],"mapped",[8037,953]],[[8110,8110],"mapped",[8038,953]],[[8111,8111],"mapped",[8039,953]],[[8112,8113],"valid"],[[8114,8114],"mapped",[8048,953]],[[8115,8115],"mapped",[945,953]],[[8116,8116],"mapped",[940,953]],[[8117,8117],"disallowed"],[[8118,8118],"valid"],[[8119,8119],"mapped",[8118,953]],[[8120,8120],"mapped",[8112]],[[8121,8121],"mapped",[8113]],[[8122,8122],"mapped",[8048]],[[8123,8123],"mapped",[940]],[[8124,8124],"mapped",[945,953]],[[8125,8125],"disallowed_STD3_mapped",[32,787]],[[8126,8126],"mapped",[953]],[[8127,8127],"disallowed_STD3_mapped",[32,787]],[[8128,8128],"disallowed_STD3_mapped",[32,834]],[[8129,8129],"disallowed_STD3_mapped",[32,776,834]],[[8130,8130],"mapped",[8052,953]],[[8131,8131],"mapped",[951,953]],[[8132,8132],"mapped",[942,953]],[[8133,8133],"disallowed"],[[8134,8134],"valid"],[[8135,8135],"mapped",[8134,953]],[[8136,8136],"mapped",[8050]],[[8137,8137],"mapped",[941]],[[8138,8138],"mapped",[8052]],[[8139,8139],"mapped",[942]],[[8140,8140],"mapped",[951,953]],[[8141,8141],"disallowed_STD3_mapped",[32,787,768]],[[8142,8142],"disallowed_STD3_mapped",[32,787,769]],[[8143,8143],"disallowed_STD3_mapped",[32,787,834]],[[8144,8146],"valid"],[[8147,8147],"mapped",[912]],[[8148,8149],"disallowed"],[[8150,8151],"valid"],[[8152,8152],"mapped",[8144]],[[8153,8153],"mapped",[8145]],[[8154,8154],"mapped",[8054]],[[8155,8155],"mapped",[943]],[[8156,8156],"disallowed"],[[8157,8157],"disallowed_STD3_mapped",[32,788,768]],[[8158,8158],"disallowed_STD3_mapped",[32,788,769]],[[8159,8159],"disallowed_STD3_mapped",[32,788,834]],[[8160,8162],"valid"],[[8163,8163],"mapped",[944]],[[8164,8167],"valid"],[[8168,8168],"mapped",[8160]],[[8169,8169],"mapped",[8161]],[[8170,8170],"mapped",[8058]],[[8171,8171],"mapped",[973]],[[8172,8172],"mapped",[8165]],[[8173,8173],"disallowed_STD3_mapped",[32,776,768]],[[8174,8174],"disallowed_STD3_mapped",[32,776,769]],[[8175,8175],"disallowed_STD3_mapped",[96]],[[8176,8177],"disallowed"],[[8178,8178],"mapped",[8060,953]],[[8179,8179],"mapped",[969,953]],[[8180,8180],"mapped",[974,953]],[[8181,8181],"disallowed"],[[8182,8182],"valid"],[[8183,8183],"mapped",[8182,953]],[[8184,8184],"mapped",[8056]],[[8185,8185],"mapped",[972]],[[8186,8186],"mapped",[8060]],[[8187,8187],"mapped",[974]],[[8188,8188],"mapped",[969,953]],[[8189,8189],"disallowed_STD3_mapped",[32,769]],[[8190,8190],"disallowed_STD3_mapped",[32,788]],[[8191,8191],"disallowed"],[[8192,8202],"disallowed_STD3_mapped",[32]],[[8203,8203],"ignored"],[[8204,8205],"deviation",[]],[[8206,8207],"disallowed"],[[8208,8208],"valid",[],"NV8"],[[8209,8209],"mapped",[8208]],[[8210,8214],"valid",[],"NV8"],[[8215,8215],"disallowed_STD3_mapped",[32,819]],[[8216,8227],"valid",[],"NV8"],[[8228,8230],"disallowed"],[[8231,8231],"valid",[],"NV8"],[[8232,8238],"disallowed"],[[8239,8239],"disallowed_STD3_mapped",[32]],[[8240,8242],"valid",[],"NV8"],[[8243,8243],"mapped",[8242,8242]],[[8244,8244],"mapped",[8242,8242,8242]],[[8245,8245],"valid",[],"NV8"],[[8246,8246],"mapped",[8245,8245]],[[8247,8247],"mapped",[8245,8245,8245]],[[8248,8251],"valid",[],"NV8"],[[8252,8252],"disallowed_STD3_mapped",[33,33]],[[8253,8253],"valid",[],"NV8"],[[8254,8254],"disallowed_STD3_mapped",[32,773]],[[8255,8262],"valid",[],"NV8"],[[8263,8263],"disallowed_STD3_mapped",[63,63]],[[8264,8264],"disallowed_STD3_mapped",[63,33]],[[8265,8265],"disallowed_STD3_mapped",[33,63]],[[8266,8269],"valid",[],"NV8"],[[8270,8274],"valid",[],"NV8"],[[8275,8276],"valid",[],"NV8"],[[8277,8278],"valid",[],"NV8"],[[8279,8279],"mapped",[8242,8242,8242,8242]],[[8280,8286],"valid",[],"NV8"],[[8287,8287],"disallowed_STD3_mapped",[32]],[[8288,8288],"ignored"],[[8289,8291],"disallowed"],[[8292,8292],"ignored"],[[8293,8293],"disallowed"],[[8294,8297],"disallowed"],[[8298,8303],"disallowed"],[[8304,8304],"mapped",[48]],[[8305,8305],"mapped",[105]],[[8306,8307],"disallowed"],[[8308,8308],"mapped",[52]],[[8309,8309],"mapped",[53]],[[8310,8310],"mapped",[54]],[[8311,8311],"mapped",[55]],[[8312,8312],"mapped",[56]],[[8313,8313],"mapped",[57]],[[8314,8314],"disallowed_STD3_mapped",[43]],[[8315,8315],"mapped",[8722]],[[8316,8316],"disallowed_STD3_mapped",[61]],[[8317,8317],"disallowed_STD3_mapped",[40]],[[8318,8318],"disallowed_STD3_mapped",[41]],[[8319,8319],"mapped",[110]],[[8320,8320],"mapped",[48]],[[8321,8321],"mapped",[49]],[[8322,8322],"mapped",[50]],[[8323,8323],"mapped",[51]],[[8324,8324],"mapped",[52]],[[8325,8325],"mapped",[53]],[[8326,8326],"mapped",[54]],[[8327,8327],"mapped",[55]],[[8328,8328],"mapped",[56]],[[8329,8329],"mapped",[57]],[[8330,8330],"disallowed_STD3_mapped",[43]],[[8331,8331],"mapped",[8722]],[[8332,8332],"disallowed_STD3_mapped",[61]],[[8333,8333],"disallowed_STD3_mapped",[40]],[[8334,8334],"disallowed_STD3_mapped",[41]],[[8335,8335],"disallowed"],[[8336,8336],"mapped",[97]],[[8337,8337],"mapped",[101]],[[8338,8338],"mapped",[111]],[[8339,8339],"mapped",[120]],[[8340,8340],"mapped",[601]],[[8341,8341],"mapped",[104]],[[8342,8342],"mapped",[107]],[[8343,8343],"mapped",[108]],[[8344,8344],"mapped",[109]],[[8345,8345],"mapped",[110]],[[8346,8346],"mapped",[112]],[[8347,8347],"mapped",[115]],[[8348,8348],"mapped",[116]],[[8349,8351],"disallowed"],[[8352,8359],"valid",[],"NV8"],[[8360,8360],"mapped",[114,115]],[[8361,8362],"valid",[],"NV8"],[[8363,8363],"valid",[],"NV8"],[[8364,8364],"valid",[],"NV8"],[[8365,8367],"valid",[],"NV8"],[[8368,8369],"valid",[],"NV8"],[[8370,8373],"valid",[],"NV8"],[[8374,8376],"valid",[],"NV8"],[[8377,8377],"valid",[],"NV8"],[[8378,8378],"valid",[],"NV8"],[[8379,8381],"valid",[],"NV8"],[[8382,8382],"valid",[],"NV8"],[[8383,8399],"disallowed"],[[8400,8417],"valid",[],"NV8"],[[8418,8419],"valid",[],"NV8"],[[8420,8426],"valid",[],"NV8"],[[8427,8427],"valid",[],"NV8"],[[8428,8431],"valid",[],"NV8"],[[8432,8432],"valid",[],"NV8"],[[8433,8447],"disallowed"],[[8448,8448],"disallowed_STD3_mapped",[97,47,99]],[[8449,8449],"disallowed_STD3_mapped",[97,47,115]],[[8450,8450],"mapped",[99]],[[8451,8451],"mapped",[176,99]],[[8452,8452],"valid",[],"NV8"],[[8453,8453],"disallowed_STD3_mapped",[99,47,111]],[[8454,8454],"disallowed_STD3_mapped",[99,47,117]],[[8455,8455],"mapped",[603]],[[8456,8456],"valid",[],"NV8"],[[8457,8457],"mapped",[176,102]],[[8458,8458],"mapped",[103]],[[8459,8462],"mapped",[104]],[[8463,8463],"mapped",[295]],[[8464,8465],"mapped",[105]],[[8466,8467],"mapped",[108]],[[8468,8468],"valid",[],"NV8"],[[8469,8469],"mapped",[110]],[[8470,8470],"mapped",[110,111]],[[8471,8472],"valid",[],"NV8"],[[8473,8473],"mapped",[112]],[[8474,8474],"mapped",[113]],[[8475,8477],"mapped",[114]],[[8478,8479],"valid",[],"NV8"],[[8480,8480],"mapped",[115,109]],[[8481,8481],"mapped",[116,101,108]],[[8482,8482],"mapped",[116,109]],[[8483,8483],"valid",[],"NV8"],[[8484,8484],"mapped",[122]],[[8485,8485],"valid",[],"NV8"],[[8486,8486],"mapped",[969]],[[8487,8487],"valid",[],"NV8"],[[8488,8488],"mapped",[122]],[[8489,8489],"valid",[],"NV8"],[[8490,8490],"mapped",[107]],[[8491,8491],"mapped",[229]],[[8492,8492],"mapped",[98]],[[8493,8493],"mapped",[99]],[[8494,8494],"valid",[],"NV8"],[[8495,8496],"mapped",[101]],[[8497,8497],"mapped",[102]],[[8498,8498],"disallowed"],[[8499,8499],"mapped",[109]],[[8500,8500],"mapped",[111]],[[8501,8501],"mapped",[1488]],[[8502,8502],"mapped",[1489]],[[8503,8503],"mapped",[1490]],[[8504,8504],"mapped",[1491]],[[8505,8505],"mapped",[105]],[[8506,8506],"valid",[],"NV8"],[[8507,8507],"mapped",[102,97,120]],[[8508,8508],"mapped",[960]],[[8509,8510],"mapped",[947]],[[8511,8511],"mapped",[960]],[[8512,8512],"mapped",[8721]],[[8513,8516],"valid",[],"NV8"],[[8517,8518],"mapped",[100]],[[8519,8519],"mapped",[101]],[[8520,8520],"mapped",[105]],[[8521,8521],"mapped",[106]],[[8522,8523],"valid",[],"NV8"],[[8524,8524],"valid",[],"NV8"],[[8525,8525],"valid",[],"NV8"],[[8526,8526],"valid"],[[8527,8527],"valid",[],"NV8"],[[8528,8528],"mapped",[49,8260,55]],[[8529,8529],"mapped",[49,8260,57]],[[8530,8530],"mapped",[49,8260,49,48]],[[8531,8531],"mapped",[49,8260,51]],[[8532,8532],"mapped",[50,8260,51]],[[8533,8533],"mapped",[49,8260,53]],[[8534,8534],"mapped",[50,8260,53]],[[8535,8535],"mapped",[51,8260,53]],[[8536,8536],"mapped",[52,8260,53]],[[8537,8537],"mapped",[49,8260,54]],[[8538,8538],"mapped",[53,8260,54]],[[8539,8539],"mapped",[49,8260,56]],[[8540,8540],"mapped",[51,8260,56]],[[8541,8541],"mapped",[53,8260,56]],[[8542,8542],"mapped",[55,8260,56]],[[8543,8543],"mapped",[49,8260]],[[8544,8544],"mapped",[105]],[[8545,8545],"mapped",[105,105]],[[8546,8546],"mapped",[105,105,105]],[[8547,8547],"mapped",[105,118]],[[8548,8548],"mapped",[118]],[[8549,8549],"mapped",[118,105]],[[8550,8550],"mapped",[118,105,105]],[[8551,8551],"mapped",[118,105,105,105]],[[8552,8552],"mapped",[105,120]],[[8553,8553],"mapped",[120]],[[8554,8554],"mapped",[120,105]],[[8555,8555],"mapped",[120,105,105]],[[8556,8556],"mapped",[108]],[[8557,8557],"mapped",[99]],[[8558,8558],"mapped",[100]],[[8559,8559],"mapped",[109]],[[8560,8560],"mapped",[105]],[[8561,8561],"mapped",[105,105]],[[8562,8562],"mapped",[105,105,105]],[[8563,8563],"mapped",[105,118]],[[8564,8564],"mapped",[118]],[[8565,8565],"mapped",[118,105]],[[8566,8566],"mapped",[118,105,105]],[[8567,8567],"mapped",[118,105,105,105]],[[8568,8568],"mapped",[105,120]],[[8569,8569],"mapped",[120]],[[8570,8570],"mapped",[120,105]],[[8571,8571],"mapped",[120,105,105]],[[8572,8572],"mapped",[108]],[[8573,8573],"mapped",[99]],[[8574,8574],"mapped",[100]],[[8575,8575],"mapped",[109]],[[8576,8578],"valid",[],"NV8"],[[8579,8579],"disallowed"],[[8580,8580],"valid"],[[8581,8584],"valid",[],"NV8"],[[8585,8585],"mapped",[48,8260,51]],[[8586,8587],"valid",[],"NV8"],[[8588,8591],"disallowed"],[[8592,8682],"valid",[],"NV8"],[[8683,8691],"valid",[],"NV8"],[[8692,8703],"valid",[],"NV8"],[[8704,8747],"valid",[],"NV8"],[[8748,8748],"mapped",[8747,8747]],[[8749,8749],"mapped",[8747,8747,8747]],[[8750,8750],"valid",[],"NV8"],[[8751,8751],"mapped",[8750,8750]],[[8752,8752],"mapped",[8750,8750,8750]],[[8753,8799],"valid",[],"NV8"],[[8800,8800],"disallowed_STD3_valid"],[[8801,8813],"valid",[],"NV8"],[[8814,8815],"disallowed_STD3_valid"],[[8816,8945],"valid",[],"NV8"],[[8946,8959],"valid",[],"NV8"],[[8960,8960],"valid",[],"NV8"],[[8961,8961],"valid",[],"NV8"],[[8962,9000],"valid",[],"NV8"],[[9001,9001],"mapped",[12296]],[[9002,9002],"mapped",[12297]],[[9003,9082],"valid",[],"NV8"],[[9083,9083],"valid",[],"NV8"],[[9084,9084],"valid",[],"NV8"],[[9085,9114],"valid",[],"NV8"],[[9115,9166],"valid",[],"NV8"],[[9167,9168],"valid",[],"NV8"],[[9169,9179],"valid",[],"NV8"],[[9180,9191],"valid",[],"NV8"],[[9192,9192],"valid",[],"NV8"],[[9193,9203],"valid",[],"NV8"],[[9204,9210],"valid",[],"NV8"],[[9211,9215],"disallowed"],[[9216,9252],"valid",[],"NV8"],[[9253,9254],"valid",[],"NV8"],[[9255,9279],"disallowed"],[[9280,9290],"valid",[],"NV8"],[[9291,9311],"disallowed"],[[9312,9312],"mapped",[49]],[[9313,9313],"mapped",[50]],[[9314,9314],"mapped",[51]],[[9315,9315],"mapped",[52]],[[9316,9316],"mapped",[53]],[[9317,9317],"mapped",[54]],[[9318,9318],"mapped",[55]],[[9319,9319],"mapped",[56]],[[9320,9320],"mapped",[57]],[[9321,9321],"mapped",[49,48]],[[9322,9322],"mapped",[49,49]],[[9323,9323],"mapped",[49,50]],[[9324,9324],"mapped",[49,51]],[[9325,9325],"mapped",[49,52]],[[9326,9326],"mapped",[49,53]],[[9327,9327],"mapped",[49,54]],[[9328,9328],"mapped",[49,55]],[[9329,9329],"mapped",[49,56]],[[9330,9330],"mapped",[49,57]],[[9331,9331],"mapped",[50,48]],[[9332,9332],"disallowed_STD3_mapped",[40,49,41]],[[9333,9333],"disallowed_STD3_mapped",[40,50,41]],[[9334,9334],"disallowed_STD3_mapped",[40,51,41]],[[9335,9335],"disallowed_STD3_mapped",[40,52,41]],[[9336,9336],"disallowed_STD3_mapped",[40,53,41]],[[9337,9337],"disallowed_STD3_mapped",[40,54,41]],[[9338,9338],"disallowed_STD3_mapped",[40,55,41]],[[9339,9339],"disallowed_STD3_mapped",[40,56,41]],[[9340,9340],"disallowed_STD3_mapped",[40,57,41]],[[9341,9341],"disallowed_STD3_mapped",[40,49,48,41]],[[9342,9342],"disallowed_STD3_mapped",[40,49,49,41]],[[9343,9343],"disallowed_STD3_mapped",[40,49,50,41]],[[9344,9344],"disallowed_STD3_mapped",[40,49,51,41]],[[9345,9345],"disallowed_STD3_mapped",[40,49,52,41]],[[9346,9346],"disallowed_STD3_mapped",[40,49,53,41]],[[9347,9347],"disallowed_STD3_mapped",[40,49,54,41]],[[9348,9348],"disallowed_STD3_mapped",[40,49,55,41]],[[9349,9349],"disallowed_STD3_mapped",[40,49,56,41]],[[9350,9350],"disallowed_STD3_mapped",[40,49,57,41]],[[9351,9351],"disallowed_STD3_mapped",[40,50,48,41]],[[9352,9371],"disallowed"],[[9372,9372],"disallowed_STD3_mapped",[40,97,41]],[[9373,9373],"disallowed_STD3_mapped",[40,98,41]],[[9374,9374],"disallowed_STD3_mapped",[40,99,41]],[[9375,9375],"disallowed_STD3_mapped",[40,100,41]],[[9376,9376],"disallowed_STD3_mapped",[40,101,41]],[[9377,9377],"disallowed_STD3_mapped",[40,102,41]],[[9378,9378],"disallowed_STD3_mapped",[40,103,41]],[[9379,9379],"disallowed_STD3_mapped",[40,104,41]],[[9380,9380],"disallowed_STD3_mapped",[40,105,41]],[[9381,9381],"disallowed_STD3_mapped",[40,106,41]],[[9382,9382],"disallowed_STD3_mapped",[40,107,41]],[[9383,9383],"disallowed_STD3_mapped",[40,108,41]],[[9384,9384],"disallowed_STD3_mapped",[40,109,41]],[[9385,9385],"disallowed_STD3_mapped",[40,110,41]],[[9386,9386],"disallowed_STD3_mapped",[40,111,41]],[[9387,9387],"disallowed_STD3_mapped",[40,112,41]],[[9388,9388],"disallowed_STD3_mapped",[40,113,41]],[[9389,9389],"disallowed_STD3_mapped",[40,114,41]],[[9390,9390],"disallowed_STD3_mapped",[40,115,41]],[[9391,9391],"disallowed_STD3_mapped",[40,116,41]],[[9392,9392],"disallowed_STD3_mapped",[40,117,41]],[[9393,9393],"disallowed_STD3_mapped",[40,118,41]],[[9394,9394],"disallowed_STD3_mapped",[40,119,41]],[[9395,9395],"disallowed_STD3_mapped",[40,120,41]],[[9396,9396],"disallowed_STD3_mapped",[40,121,41]],[[9397,9397],"disallowed_STD3_mapped",[40,122,41]],[[9398,9398],"mapped",[97]],[[9399,9399],"mapped",[98]],[[9400,9400],"mapped",[99]],[[9401,9401],"mapped",[100]],[[9402,9402],"mapped",[101]],[[9403,9403],"mapped",[102]],[[9404,9404],"mapped",[103]],[[9405,9405],"mapped",[104]],[[9406,9406],"mapped",[105]],[[9407,9407],"mapped",[106]],[[9408,9408],"mapped",[107]],[[9409,9409],"mapped",[108]],[[9410,9410],"mapped",[109]],[[9411,9411],"mapped",[110]],[[9412,9412],"mapped",[111]],[[9413,9413],"mapped",[112]],[[9414,9414],"mapped",[113]],[[9415,9415],"mapped",[114]],[[9416,9416],"mapped",[115]],[[9417,9417],"mapped",[116]],[[9418,9418],"mapped",[117]],[[9419,9419],"mapped",[118]],[[9420,9420],"mapped",[119]],[[9421,9421],"mapped",[120]],[[9422,9422],"mapped",[121]],[[9423,9423],"mapped",[122]],[[9424,9424],"mapped",[97]],[[9425,9425],"mapped",[98]],[[9426,9426],"mapped",[99]],[[9427,9427],"mapped",[100]],[[9428,9428],"mapped",[101]],[[9429,9429],"mapped",[102]],[[9430,9430],"mapped",[103]],[[9431,9431],"mapped",[104]],[[9432,9432],"mapped",[105]],[[9433,9433],"mapped",[106]],[[9434,9434],"mapped",[107]],[[9435,9435],"mapped",[108]],[[9436,9436],"mapped",[109]],[[9437,9437],"mapped",[110]],[[9438,9438],"mapped",[111]],[[9439,9439],"mapped",[112]],[[9440,9440],"mapped",[113]],[[9441,9441],"mapped",[114]],[[9442,9442],"mapped",[115]],[[9443,9443],"mapped",[116]],[[9444,9444],"mapped",[117]],[[9445,9445],"mapped",[118]],[[9446,9446],"mapped",[119]],[[9447,9447],"mapped",[120]],[[9448,9448],"mapped",[121]],[[9449,9449],"mapped",[122]],[[9450,9450],"mapped",[48]],[[9451,9470],"valid",[],"NV8"],[[9471,9471],"valid",[],"NV8"],[[9472,9621],"valid",[],"NV8"],[[9622,9631],"valid",[],"NV8"],[[9632,9711],"valid",[],"NV8"],[[9712,9719],"valid",[],"NV8"],[[9720,9727],"valid",[],"NV8"],[[9728,9747],"valid",[],"NV8"],[[9748,9749],"valid",[],"NV8"],[[9750,9751],"valid",[],"NV8"],[[9752,9752],"valid",[],"NV8"],[[9753,9753],"valid",[],"NV8"],[[9754,9839],"valid",[],"NV8"],[[9840,9841],"valid",[],"NV8"],[[9842,9853],"valid",[],"NV8"],[[9854,9855],"valid",[],"NV8"],[[9856,9865],"valid",[],"NV8"],[[9866,9873],"valid",[],"NV8"],[[9874,9884],"valid",[],"NV8"],[[9885,9885],"valid",[],"NV8"],[[9886,9887],"valid",[],"NV8"],[[9888,9889],"valid",[],"NV8"],[[9890,9905],"valid",[],"NV8"],[[9906,9906],"valid",[],"NV8"],[[9907,9916],"valid",[],"NV8"],[[9917,9919],"valid",[],"NV8"],[[9920,9923],"valid",[],"NV8"],[[9924,9933],"valid",[],"NV8"],[[9934,9934],"valid",[],"NV8"],[[9935,9953],"valid",[],"NV8"],[[9954,9954],"valid",[],"NV8"],[[9955,9955],"valid",[],"NV8"],[[9956,9959],"valid",[],"NV8"],[[9960,9983],"valid",[],"NV8"],[[9984,9984],"valid",[],"NV8"],[[9985,9988],"valid",[],"NV8"],[[9989,9989],"valid",[],"NV8"],[[9990,9993],"valid",[],"NV8"],[[9994,9995],"valid",[],"NV8"],[[9996,10023],"valid",[],"NV8"],[[10024,10024],"valid",[],"NV8"],[[10025,10059],"valid",[],"NV8"],[[10060,10060],"valid",[],"NV8"],[[10061,10061],"valid",[],"NV8"],[[10062,10062],"valid",[],"NV8"],[[10063,10066],"valid",[],"NV8"],[[10067,10069],"valid",[],"NV8"],[[10070,10070],"valid",[],"NV8"],[[10071,10071],"valid",[],"NV8"],[[10072,10078],"valid",[],"NV8"],[[10079,10080],"valid",[],"NV8"],[[10081,10087],"valid",[],"NV8"],[[10088,10101],"valid",[],"NV8"],[[10102,10132],"valid",[],"NV8"],[[10133,10135],"valid",[],"NV8"],[[10136,10159],"valid",[],"NV8"],[[10160,10160],"valid",[],"NV8"],[[10161,10174],"valid",[],"NV8"],[[10175,10175],"valid",[],"NV8"],[[10176,10182],"valid",[],"NV8"],[[10183,10186],"valid",[],"NV8"],[[10187,10187],"valid",[],"NV8"],[[10188,10188],"valid",[],"NV8"],[[10189,10189],"valid",[],"NV8"],[[10190,10191],"valid",[],"NV8"],[[10192,10219],"valid",[],"NV8"],[[10220,10223],"valid",[],"NV8"],[[10224,10239],"valid",[],"NV8"],[[10240,10495],"valid",[],"NV8"],[[10496,10763],"valid",[],"NV8"],[[10764,10764],"mapped",[8747,8747,8747,8747]],[[10765,10867],"valid",[],"NV8"],[[10868,10868],"disallowed_STD3_mapped",[58,58,61]],[[10869,10869],"disallowed_STD3_mapped",[61,61]],[[10870,10870],"disallowed_STD3_mapped",[61,61,61]],[[10871,10971],"valid",[],"NV8"],[[10972,10972],"mapped",[10973,824]],[[10973,11007],"valid",[],"NV8"],[[11008,11021],"valid",[],"NV8"],[[11022,11027],"valid",[],"NV8"],[[11028,11034],"valid",[],"NV8"],[[11035,11039],"valid",[],"NV8"],[[11040,11043],"valid",[],"NV8"],[[11044,11084],"valid",[],"NV8"],[[11085,11087],"valid",[],"NV8"],[[11088,11092],"valid",[],"NV8"],[[11093,11097],"valid",[],"NV8"],[[11098,11123],"valid",[],"NV8"],[[11124,11125],"disallowed"],[[11126,11157],"valid",[],"NV8"],[[11158,11159],"disallowed"],[[11160,11193],"valid",[],"NV8"],[[11194,11196],"disallowed"],[[11197,11208],"valid",[],"NV8"],[[11209,11209],"disallowed"],[[11210,11217],"valid",[],"NV8"],[[11218,11243],"disallowed"],[[11244,11247],"valid",[],"NV8"],[[11248,11263],"disallowed"],[[11264,11264],"mapped",[11312]],[[11265,11265],"mapped",[11313]],[[11266,11266],"mapped",[11314]],[[11267,11267],"mapped",[11315]],[[11268,11268],"mapped",[11316]],[[11269,11269],"mapped",[11317]],[[11270,11270],"mapped",[11318]],[[11271,11271],"mapped",[11319]],[[11272,11272],"mapped",[11320]],[[11273,11273],"mapped",[11321]],[[11274,11274],"mapped",[11322]],[[11275,11275],"mapped",[11323]],[[11276,11276],"mapped",[11324]],[[11277,11277],"mapped",[11325]],[[11278,11278],"mapped",[11326]],[[11279,11279],"mapped",[11327]],[[11280,11280],"mapped",[11328]],[[11281,11281],"mapped",[11329]],[[11282,11282],"mapped",[11330]],[[11283,11283],"mapped",[11331]],[[11284,11284],"mapped",[11332]],[[11285,11285],"mapped",[11333]],[[11286,11286],"mapped",[11334]],[[11287,11287],"mapped",[11335]],[[11288,11288],"mapped",[11336]],[[11289,11289],"mapped",[11337]],[[11290,11290],"mapped",[11338]],[[11291,11291],"mapped",[11339]],[[11292,11292],"mapped",[11340]],[[11293,11293],"mapped",[11341]],[[11294,11294],"mapped",[11342]],[[11295,11295],"mapped",[11343]],[[11296,11296],"mapped",[11344]],[[11297,11297],"mapped",[11345]],[[11298,11298],"mapped",[11346]],[[11299,11299],"mapped",[11347]],[[11300,11300],"mapped",[11348]],[[11301,11301],"mapped",[11349]],[[11302,11302],"mapped",[11350]],[[11303,11303],"mapped",[11351]],[[11304,11304],"mapped",[11352]],[[11305,11305],"mapped",[11353]],[[11306,11306],"mapped",[11354]],[[11307,11307],"mapped",[11355]],[[11308,11308],"mapped",[11356]],[[11309,11309],"mapped",[11357]],[[11310,11310],"mapped",[11358]],[[11311,11311],"disallowed"],[[11312,11358],"valid"],[[11359,11359],"disallowed"],[[11360,11360],"mapped",[11361]],[[11361,11361],"valid"],[[11362,11362],"mapped",[619]],[[11363,11363],"mapped",[7549]],[[11364,11364],"mapped",[637]],[[11365,11366],"valid"],[[11367,11367],"mapped",[11368]],[[11368,11368],"valid"],[[11369,11369],"mapped",[11370]],[[11370,11370],"valid"],[[11371,11371],"mapped",[11372]],[[11372,11372],"valid"],[[11373,11373],"mapped",[593]],[[11374,11374],"mapped",[625]],[[11375,11375],"mapped",[592]],[[11376,11376],"mapped",[594]],[[11377,11377],"valid"],[[11378,11378],"mapped",[11379]],[[11379,11379],"valid"],[[11380,11380],"valid"],[[11381,11381],"mapped",[11382]],[[11382,11383],"valid"],[[11384,11387],"valid"],[[11388,11388],"mapped",[106]],[[11389,11389],"mapped",[118]],[[11390,11390],"mapped",[575]],[[11391,11391],"mapped",[576]],[[11392,11392],"mapped",[11393]],[[11393,11393],"valid"],[[11394,11394],"mapped",[11395]],[[11395,11395],"valid"],[[11396,11396],"mapped",[11397]],[[11397,11397],"valid"],[[11398,11398],"mapped",[11399]],[[11399,11399],"valid"],[[11400,11400],"mapped",[11401]],[[11401,11401],"valid"],[[11402,11402],"mapped",[11403]],[[11403,11403],"valid"],[[11404,11404],"mapped",[11405]],[[11405,11405],"valid"],[[11406,11406],"mapped",[11407]],[[11407,11407],"valid"],[[11408,11408],"mapped",[11409]],[[11409,11409],"valid"],[[11410,11410],"mapped",[11411]],[[11411,11411],"valid"],[[11412,11412],"mapped",[11413]],[[11413,11413],"valid"],[[11414,11414],"mapped",[11415]],[[11415,11415],"valid"],[[11416,11416],"mapped",[11417]],[[11417,11417],"valid"],[[11418,11418],"mapped",[11419]],[[11419,11419],"valid"],[[11420,11420],"mapped",[11421]],[[11421,11421],"valid"],[[11422,11422],"mapped",[11423]],[[11423,11423],"valid"],[[11424,11424],"mapped",[11425]],[[11425,11425],"valid"],[[11426,11426],"mapped",[11427]],[[11427,11427],"valid"],[[11428,11428],"mapped",[11429]],[[11429,11429],"valid"],[[11430,11430],"mapped",[11431]],[[11431,11431],"valid"],[[11432,11432],"mapped",[11433]],[[11433,11433],"valid"],[[11434,11434],"mapped",[11435]],[[11435,11435],"valid"],[[11436,11436],"mapped",[11437]],[[11437,11437],"valid"],[[11438,11438],"mapped",[11439]],[[11439,11439],"valid"],[[11440,11440],"mapped",[11441]],[[11441,11441],"valid"],[[11442,11442],"mapped",[11443]],[[11443,11443],"valid"],[[11444,11444],"mapped",[11445]],[[11445,11445],"valid"],[[11446,11446],"mapped",[11447]],[[11447,11447],"valid"],[[11448,11448],"mapped",[11449]],[[11449,11449],"valid"],[[11450,11450],"mapped",[11451]],[[11451,11451],"valid"],[[11452,11452],"mapped",[11453]],[[11453,11453],"valid"],[[11454,11454],"mapped",[11455]],[[11455,11455],"valid"],[[11456,11456],"mapped",[11457]],[[11457,11457],"valid"],[[11458,11458],"mapped",[11459]],[[11459,11459],"valid"],[[11460,11460],"mapped",[11461]],[[11461,11461],"valid"],[[11462,11462],"mapped",[11463]],[[11463,11463],"valid"],[[11464,11464],"mapped",[11465]],[[11465,11465],"valid"],[[11466,11466],"mapped",[11467]],[[11467,11467],"valid"],[[11468,11468],"mapped",[11469]],[[11469,11469],"valid"],[[11470,11470],"mapped",[11471]],[[11471,11471],"valid"],[[11472,11472],"mapped",[11473]],[[11473,11473],"valid"],[[11474,11474],"mapped",[11475]],[[11475,11475],"valid"],[[11476,11476],"mapped",[11477]],[[11477,11477],"valid"],[[11478,11478],"mapped",[11479]],[[11479,11479],"valid"],[[11480,11480],"mapped",[11481]],[[11481,11481],"valid"],[[11482,11482],"mapped",[11483]],[[11483,11483],"valid"],[[11484,11484],"mapped",[11485]],[[11485,11485],"valid"],[[11486,11486],"mapped",[11487]],[[11487,11487],"valid"],[[11488,11488],"mapped",[11489]],[[11489,11489],"valid"],[[11490,11490],"mapped",[11491]],[[11491,11492],"valid"],[[11493,11498],"valid",[],"NV8"],[[11499,11499],"mapped",[11500]],[[11500,11500],"valid"],[[11501,11501],"mapped",[11502]],[[11502,11505],"valid"],[[11506,11506],"mapped",[11507]],[[11507,11507],"valid"],[[11508,11512],"disallowed"],[[11513,11519],"valid",[],"NV8"],[[11520,11557],"valid"],[[11558,11558],"disallowed"],[[11559,11559],"valid"],[[11560,11564],"disallowed"],[[11565,11565],"valid"],[[11566,11567],"disallowed"],[[11568,11621],"valid"],[[11622,11623],"valid"],[[11624,11630],"disallowed"],[[11631,11631],"mapped",[11617]],[[11632,11632],"valid",[],"NV8"],[[11633,11646],"disallowed"],[[11647,11647],"valid"],[[11648,11670],"valid"],[[11671,11679],"disallowed"],[[11680,11686],"valid"],[[11687,11687],"disallowed"],[[11688,11694],"valid"],[[11695,11695],"disallowed"],[[11696,11702],"valid"],[[11703,11703],"disallowed"],[[11704,11710],"valid"],[[11711,11711],"disallowed"],[[11712,11718],"valid"],[[11719,11719],"disallowed"],[[11720,11726],"valid"],[[11727,11727],"disallowed"],[[11728,11734],"valid"],[[11735,11735],"disallowed"],[[11736,11742],"valid"],[[11743,11743],"disallowed"],[[11744,11775],"valid"],[[11776,11799],"valid",[],"NV8"],[[11800,11803],"valid",[],"NV8"],[[11804,11805],"valid",[],"NV8"],[[11806,11822],"valid",[],"NV8"],[[11823,11823],"valid"],[[11824,11824],"valid",[],"NV8"],[[11825,11825],"valid",[],"NV8"],[[11826,11835],"valid",[],"NV8"],[[11836,11842],"valid",[],"NV8"],[[11843,11903],"disallowed"],[[11904,11929],"valid",[],"NV8"],[[11930,11930],"disallowed"],[[11931,11934],"valid",[],"NV8"],[[11935,11935],"mapped",[27597]],[[11936,12018],"valid",[],"NV8"],[[12019,12019],"mapped",[40863]],[[12020,12031],"disallowed"],[[12032,12032],"mapped",[19968]],[[12033,12033],"mapped",[20008]],[[12034,12034],"mapped",[20022]],[[12035,12035],"mapped",[20031]],[[12036,12036],"mapped",[20057]],[[12037,12037],"mapped",[20101]],[[12038,12038],"mapped",[20108]],[[12039,12039],"mapped",[20128]],[[12040,12040],"mapped",[20154]],[[12041,12041],"mapped",[20799]],[[12042,12042],"mapped",[20837]],[[12043,12043],"mapped",[20843]],[[12044,12044],"mapped",[20866]],[[12045,12045],"mapped",[20886]],[[12046,12046],"mapped",[20907]],[[12047,12047],"mapped",[20960]],[[12048,12048],"mapped",[20981]],[[12049,12049],"mapped",[20992]],[[12050,12050],"mapped",[21147]],[[12051,12051],"mapped",[21241]],[[12052,12052],"mapped",[21269]],[[12053,12053],"mapped",[21274]],[[12054,12054],"mapped",[21304]],[[12055,12055],"mapped",[21313]],[[12056,12056],"mapped",[21340]],[[12057,12057],"mapped",[21353]],[[12058,12058],"mapped",[21378]],[[12059,12059],"mapped",[21430]],[[12060,12060],"mapped",[21448]],[[12061,12061],"mapped",[21475]],[[12062,12062],"mapped",[22231]],[[12063,12063],"mapped",[22303]],[[12064,12064],"mapped",[22763]],[[12065,12065],"mapped",[22786]],[[12066,12066],"mapped",[22794]],[[12067,12067],"mapped",[22805]],[[12068,12068],"mapped",[22823]],[[12069,12069],"mapped",[22899]],[[12070,12070],"mapped",[23376]],[[12071,12071],"mapped",[23424]],[[12072,12072],"mapped",[23544]],[[12073,12073],"mapped",[23567]],[[12074,12074],"mapped",[23586]],[[12075,12075],"mapped",[23608]],[[12076,12076],"mapped",[23662]],[[12077,12077],"mapped",[23665]],[[12078,12078],"mapped",[24027]],[[12079,12079],"mapped",[24037]],[[12080,12080],"mapped",[24049]],[[12081,12081],"mapped",[24062]],[[12082,12082],"mapped",[24178]],[[12083,12083],"mapped",[24186]],[[12084,12084],"mapped",[24191]],[[12085,12085],"mapped",[24308]],[[12086,12086],"mapped",[24318]],[[12087,12087],"mapped",[24331]],[[12088,12088],"mapped",[24339]],[[12089,12089],"mapped",[24400]],[[12090,12090],"mapped",[24417]],[[12091,12091],"mapped",[24435]],[[12092,12092],"mapped",[24515]],[[12093,12093],"mapped",[25096]],[[12094,12094],"mapped",[25142]],[[12095,12095],"mapped",[25163]],[[12096,12096],"mapped",[25903]],[[12097,12097],"mapped",[25908]],[[12098,12098],"mapped",[25991]],[[12099,12099],"mapped",[26007]],[[12100,12100],"mapped",[26020]],[[12101,12101],"mapped",[26041]],[[12102,12102],"mapped",[26080]],[[12103,12103],"mapped",[26085]],[[12104,12104],"mapped",[26352]],[[12105,12105],"mapped",[26376]],[[12106,12106],"mapped",[26408]],[[12107,12107],"mapped",[27424]],[[12108,12108],"mapped",[27490]],[[12109,12109],"mapped",[27513]],[[12110,12110],"mapped",[27571]],[[12111,12111],"mapped",[27595]],[[12112,12112],"mapped",[27604]],[[12113,12113],"mapped",[27611]],[[12114,12114],"mapped",[27663]],[[12115,12115],"mapped",[27668]],[[12116,12116],"mapped",[27700]],[[12117,12117],"mapped",[28779]],[[12118,12118],"mapped",[29226]],[[12119,12119],"mapped",[29238]],[[12120,12120],"mapped",[29243]],[[12121,12121],"mapped",[29247]],[[12122,12122],"mapped",[29255]],[[12123,12123],"mapped",[29273]],[[12124,12124],"mapped",[29275]],[[12125,12125],"mapped",[29356]],[[12126,12126],"mapped",[29572]],[[12127,12127],"mapped",[29577]],[[12128,12128],"mapped",[29916]],[[12129,12129],"mapped",[29926]],[[12130,12130],"mapped",[29976]],[[12131,12131],"mapped",[29983]],[[12132,12132],"mapped",[29992]],[[12133,12133],"mapped",[30000]],[[12134,12134],"mapped",[30091]],[[12135,12135],"mapped",[30098]],[[12136,12136],"mapped",[30326]],[[12137,12137],"mapped",[30333]],[[12138,12138],"mapped",[30382]],[[12139,12139],"mapped",[30399]],[[12140,12140],"mapped",[30446]],[[12141,12141],"mapped",[30683]],[[12142,12142],"mapped",[30690]],[[12143,12143],"mapped",[30707]],[[12144,12144],"mapped",[31034]],[[12145,12145],"mapped",[31160]],[[12146,12146],"mapped",[31166]],[[12147,12147],"mapped",[31348]],[[12148,12148],"mapped",[31435]],[[12149,12149],"mapped",[31481]],[[12150,12150],"mapped",[31859]],[[12151,12151],"mapped",[31992]],[[12152,12152],"mapped",[32566]],[[12153,12153],"mapped",[32593]],[[12154,12154],"mapped",[32650]],[[12155,12155],"mapped",[32701]],[[12156,12156],"mapped",[32769]],[[12157,12157],"mapped",[32780]],[[12158,12158],"mapped",[32786]],[[12159,12159],"mapped",[32819]],[[12160,12160],"mapped",[32895]],[[12161,12161],"mapped",[32905]],[[12162,12162],"mapped",[33251]],[[12163,12163],"mapped",[33258]],[[12164,12164],"mapped",[33267]],[[12165,12165],"mapped",[33276]],[[12166,12166],"mapped",[33292]],[[12167,12167],"mapped",[33307]],[[12168,12168],"mapped",[33311]],[[12169,12169],"mapped",[33390]],[[12170,12170],"mapped",[33394]],[[12171,12171],"mapped",[33400]],[[12172,12172],"mapped",[34381]],[[12173,12173],"mapped",[34411]],[[12174,12174],"mapped",[34880]],[[12175,12175],"mapped",[34892]],[[12176,12176],"mapped",[34915]],[[12177,12177],"mapped",[35198]],[[12178,12178],"mapped",[35211]],[[12179,12179],"mapped",[35282]],[[12180,12180],"mapped",[35328]],[[12181,12181],"mapped",[35895]],[[12182,12182],"mapped",[35910]],[[12183,12183],"mapped",[35925]],[[12184,12184],"mapped",[35960]],[[12185,12185],"mapped",[35997]],[[12186,12186],"mapped",[36196]],[[12187,12187],"mapped",[36208]],[[12188,12188],"mapped",[36275]],[[12189,12189],"mapped",[36523]],[[12190,12190],"mapped",[36554]],[[12191,12191],"mapped",[36763]],[[12192,12192],"mapped",[36784]],[[12193,12193],"mapped",[36789]],[[12194,12194],"mapped",[37009]],[[12195,12195],"mapped",[37193]],[[12196,12196],"mapped",[37318]],[[12197,12197],"mapped",[37324]],[[12198,12198],"mapped",[37329]],[[12199,12199],"mapped",[38263]],[[12200,12200],"mapped",[38272]],[[12201,12201],"mapped",[38428]],[[12202,12202],"mapped",[38582]],[[12203,12203],"mapped",[38585]],[[12204,12204],"mapped",[38632]],[[12205,12205],"mapped",[38737]],[[12206,12206],"mapped",[38750]],[[12207,12207],"mapped",[38754]],[[12208,12208],"mapped",[38761]],[[12209,12209],"mapped",[38859]],[[12210,12210],"mapped",[38893]],[[12211,12211],"mapped",[38899]],[[12212,12212],"mapped",[38913]],[[12213,12213],"mapped",[39080]],[[12214,12214],"mapped",[39131]],[[12215,12215],"mapped",[39135]],[[12216,12216],"mapped",[39318]],[[12217,12217],"mapped",[39321]],[[12218,12218],"mapped",[39340]],[[12219,12219],"mapped",[39592]],[[12220,12220],"mapped",[39640]],[[12221,12221],"mapped",[39647]],[[12222,12222],"mapped",[39717]],[[12223,12223],"mapped",[39727]],[[12224,12224],"mapped",[39730]],[[12225,12225],"mapped",[39740]],[[12226,12226],"mapped",[39770]],[[12227,12227],"mapped",[40165]],[[12228,12228],"mapped",[40565]],[[12229,12229],"mapped",[40575]],[[12230,12230],"mapped",[40613]],[[12231,12231],"mapped",[40635]],[[12232,12232],"mapped",[40643]],[[12233,12233],"mapped",[40653]],[[12234,12234],"mapped",[40657]],[[12235,12235],"mapped",[40697]],[[12236,12236],"mapped",[40701]],[[12237,12237],"mapped",[40718]],[[12238,12238],"mapped",[40723]],[[12239,12239],"mapped",[40736]],[[12240,12240],"mapped",[40763]],[[12241,12241],"mapped",[40778]],[[12242,12242],"mapped",[40786]],[[12243,12243],"mapped",[40845]],[[12244,12244],"mapped",[40860]],[[12245,12245],"mapped",[40864]],[[12246,12271],"disallowed"],[[12272,12283],"disallowed"],[[12284,12287],"disallowed"],[[12288,12288],"disallowed_STD3_mapped",[32]],[[12289,12289],"valid",[],"NV8"],[[12290,12290],"mapped",[46]],[[12291,12292],"valid",[],"NV8"],[[12293,12295],"valid"],[[12296,12329],"valid",[],"NV8"],[[12330,12333],"valid"],[[12334,12341],"valid",[],"NV8"],[[12342,12342],"mapped",[12306]],[[12343,12343],"valid",[],"NV8"],[[12344,12344],"mapped",[21313]],[[12345,12345],"mapped",[21316]],[[12346,12346],"mapped",[21317]],[[12347,12347],"valid",[],"NV8"],[[12348,12348],"valid"],[[12349,12349],"valid",[],"NV8"],[[12350,12350],"valid",[],"NV8"],[[12351,12351],"valid",[],"NV8"],[[12352,12352],"disallowed"],[[12353,12436],"valid"],[[12437,12438],"valid"],[[12439,12440],"disallowed"],[[12441,12442],"valid"],[[12443,12443],"disallowed_STD3_mapped",[32,12441]],[[12444,12444],"disallowed_STD3_mapped",[32,12442]],[[12445,12446],"valid"],[[12447,12447],"mapped",[12424,12426]],[[12448,12448],"valid",[],"NV8"],[[12449,12542],"valid"],[[12543,12543],"mapped",[12467,12488]],[[12544,12548],"disallowed"],[[12549,12588],"valid"],[[12589,12589],"valid"],[[12590,12592],"disallowed"],[[12593,12593],"mapped",[4352]],[[12594,12594],"mapped",[4353]],[[12595,12595],"mapped",[4522]],[[12596,12596],"mapped",[4354]],[[12597,12597],"mapped",[4524]],[[12598,12598],"mapped",[4525]],[[12599,12599],"mapped",[4355]],[[12600,12600],"mapped",[4356]],[[12601,12601],"mapped",[4357]],[[12602,12602],"mapped",[4528]],[[12603,12603],"mapped",[4529]],[[12604,12604],"mapped",[4530]],[[12605,12605],"mapped",[4531]],[[12606,12606],"mapped",[4532]],[[12607,12607],"mapped",[4533]],[[12608,12608],"mapped",[4378]],[[12609,12609],"mapped",[4358]],[[12610,12610],"mapped",[4359]],[[12611,12611],"mapped",[4360]],[[12612,12612],"mapped",[4385]],[[12613,12613],"mapped",[4361]],[[12614,12614],"mapped",[4362]],[[12615,12615],"mapped",[4363]],[[12616,12616],"mapped",[4364]],[[12617,12617],"mapped",[4365]],[[12618,12618],"mapped",[4366]],[[12619,12619],"mapped",[4367]],[[12620,12620],"mapped",[4368]],[[12621,12621],"mapped",[4369]],[[12622,12622],"mapped",[4370]],[[12623,12623],"mapped",[4449]],[[12624,12624],"mapped",[4450]],[[12625,12625],"mapped",[4451]],[[12626,12626],"mapped",[4452]],[[12627,12627],"mapped",[4453]],[[12628,12628],"mapped",[4454]],[[12629,12629],"mapped",[4455]],[[12630,12630],"mapped",[4456]],[[12631,12631],"mapped",[4457]],[[12632,12632],"mapped",[4458]],[[12633,12633],"mapped",[4459]],[[12634,12634],"mapped",[4460]],[[12635,12635],"mapped",[4461]],[[12636,12636],"mapped",[4462]],[[12637,12637],"mapped",[4463]],[[12638,12638],"mapped",[4464]],[[12639,12639],"mapped",[4465]],[[12640,12640],"mapped",[4466]],[[12641,12641],"mapped",[4467]],[[12642,12642],"mapped",[4468]],[[12643,12643],"mapped",[4469]],[[12644,12644],"disallowed"],[[12645,12645],"mapped",[4372]],[[12646,12646],"mapped",[4373]],[[12647,12647],"mapped",[4551]],[[12648,12648],"mapped",[4552]],[[12649,12649],"mapped",[4556]],[[12650,12650],"mapped",[4558]],[[12651,12651],"mapped",[4563]],[[12652,12652],"mapped",[4567]],[[12653,12653],"mapped",[4569]],[[12654,12654],"mapped",[4380]],[[12655,12655],"mapped",[4573]],[[12656,12656],"mapped",[4575]],[[12657,12657],"mapped",[4381]],[[12658,12658],"mapped",[4382]],[[12659,12659],"mapped",[4384]],[[12660,12660],"mapped",[4386]],[[12661,12661],"mapped",[4387]],[[12662,12662],"mapped",[4391]],[[12663,12663],"mapped",[4393]],[[12664,12664],"mapped",[4395]],[[12665,12665],"mapped",[4396]],[[12666,12666],"mapped",[4397]],[[12667,12667],"mapped",[4398]],[[12668,12668],"mapped",[4399]],[[12669,12669],"mapped",[4402]],[[12670,12670],"mapped",[4406]],[[12671,12671],"mapped",[4416]],[[12672,12672],"mapped",[4423]],[[12673,12673],"mapped",[4428]],[[12674,12674],"mapped",[4593]],[[12675,12675],"mapped",[4594]],[[12676,12676],"mapped",[4439]],[[12677,12677],"mapped",[4440]],[[12678,12678],"mapped",[4441]],[[12679,12679],"mapped",[4484]],[[12680,12680],"mapped",[4485]],[[12681,12681],"mapped",[4488]],[[12682,12682],"mapped",[4497]],[[12683,12683],"mapped",[4498]],[[12684,12684],"mapped",[4500]],[[12685,12685],"mapped",[4510]],[[12686,12686],"mapped",[4513]],[[12687,12687],"disallowed"],[[12688,12689],"valid",[],"NV8"],[[12690,12690],"mapped",[19968]],[[12691,12691],"mapped",[20108]],[[12692,12692],"mapped",[19977]],[[12693,12693],"mapped",[22235]],[[12694,12694],"mapped",[19978]],[[12695,12695],"mapped",[20013]],[[12696,12696],"mapped",[19979]],[[12697,12697],"mapped",[30002]],[[12698,12698],"mapped",[20057]],[[12699,12699],"mapped",[19993]],[[12700,12700],"mapped",[19969]],[[12701,12701],"mapped",[22825]],[[12702,12702],"mapped",[22320]],[[12703,12703],"mapped",[20154]],[[12704,12727],"valid"],[[12728,12730],"valid"],[[12731,12735],"disallowed"],[[12736,12751],"valid",[],"NV8"],[[12752,12771],"valid",[],"NV8"],[[12772,12783],"disallowed"],[[12784,12799],"valid"],[[12800,12800],"disallowed_STD3_mapped",[40,4352,41]],[[12801,12801],"disallowed_STD3_mapped",[40,4354,41]],[[12802,12802],"disallowed_STD3_mapped",[40,4355,41]],[[12803,12803],"disallowed_STD3_mapped",[40,4357,41]],[[12804,12804],"disallowed_STD3_mapped",[40,4358,41]],[[12805,12805],"disallowed_STD3_mapped",[40,4359,41]],[[12806,12806],"disallowed_STD3_mapped",[40,4361,41]],[[12807,12807],"disallowed_STD3_mapped",[40,4363,41]],[[12808,12808],"disallowed_STD3_mapped",[40,4364,41]],[[12809,12809],"disallowed_STD3_mapped",[40,4366,41]],[[12810,12810],"disallowed_STD3_mapped",[40,4367,41]],[[12811,12811],"disallowed_STD3_mapped",[40,4368,41]],[[12812,12812],"disallowed_STD3_mapped",[40,4369,41]],[[12813,12813],"disallowed_STD3_mapped",[40,4370,41]],[[12814,12814],"disallowed_STD3_mapped",[40,44032,41]],[[12815,12815],"disallowed_STD3_mapped",[40,45208,41]],[[12816,12816],"disallowed_STD3_mapped",[40,45796,41]],[[12817,12817],"disallowed_STD3_mapped",[40,46972,41]],[[12818,12818],"disallowed_STD3_mapped",[40,47560,41]],[[12819,12819],"disallowed_STD3_mapped",[40,48148,41]],[[12820,12820],"disallowed_STD3_mapped",[40,49324,41]],[[12821,12821],"disallowed_STD3_mapped",[40,50500,41]],[[12822,12822],"disallowed_STD3_mapped",[40,51088,41]],[[12823,12823],"disallowed_STD3_mapped",[40,52264,41]],[[12824,12824],"disallowed_STD3_mapped",[40,52852,41]],[[12825,12825],"disallowed_STD3_mapped",[40,53440,41]],[[12826,12826],"disallowed_STD3_mapped",[40,54028,41]],[[12827,12827],"disallowed_STD3_mapped",[40,54616,41]],[[12828,12828],"disallowed_STD3_mapped",[40,51452,41]],[[12829,12829],"disallowed_STD3_mapped",[40,50724,51204,41]],[[12830,12830],"disallowed_STD3_mapped",[40,50724,54980,41]],[[12831,12831],"disallowed"],[[12832,12832],"disallowed_STD3_mapped",[40,19968,41]],[[12833,12833],"disallowed_STD3_mapped",[40,20108,41]],[[12834,12834],"disallowed_STD3_mapped",[40,19977,41]],[[12835,12835],"disallowed_STD3_mapped",[40,22235,41]],[[12836,12836],"disallowed_STD3_mapped",[40,20116,41]],[[12837,12837],"disallowed_STD3_mapped",[40,20845,41]],[[12838,12838],"disallowed_STD3_mapped",[40,19971,41]],[[12839,12839],"disallowed_STD3_mapped",[40,20843,41]],[[12840,12840],"disallowed_STD3_mapped",[40,20061,41]],[[12841,12841],"disallowed_STD3_mapped",[40,21313,41]],[[12842,12842],"disallowed_STD3_mapped",[40,26376,41]],[[12843,12843],"disallowed_STD3_mapped",[40,28779,41]],[[12844,12844],"disallowed_STD3_mapped",[40,27700,41]],[[12845,12845],"disallowed_STD3_mapped",[40,26408,41]],[[12846,12846],"disallowed_STD3_mapped",[40,37329,41]],[[12847,12847],"disallowed_STD3_mapped",[40,22303,41]],[[12848,12848],"disallowed_STD3_mapped",[40,26085,41]],[[12849,12849],"disallowed_STD3_mapped",[40,26666,41]],[[12850,12850],"disallowed_STD3_mapped",[40,26377,41]],[[12851,12851],"disallowed_STD3_mapped",[40,31038,41]],[[12852,12852],"disallowed_STD3_mapped",[40,21517,41]],[[12853,12853],"disallowed_STD3_mapped",[40,29305,41]],[[12854,12854],"disallowed_STD3_mapped",[40,36001,41]],[[12855,12855],"disallowed_STD3_mapped",[40,31069,41]],[[12856,12856],"disallowed_STD3_mapped",[40,21172,41]],[[12857,12857],"disallowed_STD3_mapped",[40,20195,41]],[[12858,12858],"disallowed_STD3_mapped",[40,21628,41]],[[12859,12859],"disallowed_STD3_mapped",[40,23398,41]],[[12860,12860],"disallowed_STD3_mapped",[40,30435,41]],[[12861,12861],"disallowed_STD3_mapped",[40,20225,41]],[[12862,12862],"disallowed_STD3_mapped",[40,36039,41]],[[12863,12863],"disallowed_STD3_mapped",[40,21332,41]],[[12864,12864],"disallowed_STD3_mapped",[40,31085,41]],[[12865,12865],"disallowed_STD3_mapped",[40,20241,41]],[[12866,12866],"disallowed_STD3_mapped",[40,33258,41]],[[12867,12867],"disallowed_STD3_mapped",[40,33267,41]],[[12868,12868],"mapped",[21839]],[[12869,12869],"mapped",[24188]],[[12870,12870],"mapped",[25991]],[[12871,12871],"mapped",[31631]],[[12872,12879],"valid",[],"NV8"],[[12880,12880],"mapped",[112,116,101]],[[12881,12881],"mapped",[50,49]],[[12882,12882],"mapped",[50,50]],[[12883,12883],"mapped",[50,51]],[[12884,12884],"mapped",[50,52]],[[12885,12885],"mapped",[50,53]],[[12886,12886],"mapped",[50,54]],[[12887,12887],"mapped",[50,55]],[[12888,12888],"mapped",[50,56]],[[12889,12889],"mapped",[50,57]],[[12890,12890],"mapped",[51,48]],[[12891,12891],"mapped",[51,49]],[[12892,12892],"mapped",[51,50]],[[12893,12893],"mapped",[51,51]],[[12894,12894],"mapped",[51,52]],[[12895,12895],"mapped",[51,53]],[[12896,12896],"mapped",[4352]],[[12897,12897],"mapped",[4354]],[[12898,12898],"mapped",[4355]],[[12899,12899],"mapped",[4357]],[[12900,12900],"mapped",[4358]],[[12901,12901],"mapped",[4359]],[[12902,12902],"mapped",[4361]],[[12903,12903],"mapped",[4363]],[[12904,12904],"mapped",[4364]],[[12905,12905],"mapped",[4366]],[[12906,12906],"mapped",[4367]],[[12907,12907],"mapped",[4368]],[[12908,12908],"mapped",[4369]],[[12909,12909],"mapped",[4370]],[[12910,12910],"mapped",[44032]],[[12911,12911],"mapped",[45208]],[[12912,12912],"mapped",[45796]],[[12913,12913],"mapped",[46972]],[[12914,12914],"mapped",[47560]],[[12915,12915],"mapped",[48148]],[[12916,12916],"mapped",[49324]],[[12917,12917],"mapped",[50500]],[[12918,12918],"mapped",[51088]],[[12919,12919],"mapped",[52264]],[[12920,12920],"mapped",[52852]],[[12921,12921],"mapped",[53440]],[[12922,12922],"mapped",[54028]],[[12923,12923],"mapped",[54616]],[[12924,12924],"mapped",[52280,44256]],[[12925,12925],"mapped",[51452,51032]],[[12926,12926],"mapped",[50864]],[[12927,12927],"valid",[],"NV8"],[[12928,12928],"mapped",[19968]],[[12929,12929],"mapped",[20108]],[[12930,12930],"mapped",[19977]],[[12931,12931],"mapped",[22235]],[[12932,12932],"mapped",[20116]],[[12933,12933],"mapped",[20845]],[[12934,12934],"mapped",[19971]],[[12935,12935],"mapped",[20843]],[[12936,12936],"mapped",[20061]],[[12937,12937],"mapped",[21313]],[[12938,12938],"mapped",[26376]],[[12939,12939],"mapped",[28779]],[[12940,12940],"mapped",[27700]],[[12941,12941],"mapped",[26408]],[[12942,12942],"mapped",[37329]],[[12943,12943],"mapped",[22303]],[[12944,12944],"mapped",[26085]],[[12945,12945],"mapped",[26666]],[[12946,12946],"mapped",[26377]],[[12947,12947],"mapped",[31038]],[[12948,12948],"mapped",[21517]],[[12949,12949],"mapped",[29305]],[[12950,12950],"mapped",[36001]],[[12951,12951],"mapped",[31069]],[[12952,12952],"mapped",[21172]],[[12953,12953],"mapped",[31192]],[[12954,12954],"mapped",[30007]],[[12955,12955],"mapped",[22899]],[[12956,12956],"mapped",[36969]],[[12957,12957],"mapped",[20778]],[[12958,12958],"mapped",[21360]],[[12959,12959],"mapped",[27880]],[[12960,12960],"mapped",[38917]],[[12961,12961],"mapped",[20241]],[[12962,12962],"mapped",[20889]],[[12963,12963],"mapped",[27491]],[[12964,12964],"mapped",[19978]],[[12965,12965],"mapped",[20013]],[[12966,12966],"mapped",[19979]],[[12967,12967],"mapped",[24038]],[[12968,12968],"mapped",[21491]],[[12969,12969],"mapped",[21307]],[[12970,12970],"mapped",[23447]],[[12971,12971],"mapped",[23398]],[[12972,12972],"mapped",[30435]],[[12973,12973],"mapped",[20225]],[[12974,12974],"mapped",[36039]],[[12975,12975],"mapped",[21332]],[[12976,12976],"mapped",[22812]],[[12977,12977],"mapped",[51,54]],[[12978,12978],"mapped",[51,55]],[[12979,12979],"mapped",[51,56]],[[12980,12980],"mapped",[51,57]],[[12981,12981],"mapped",[52,48]],[[12982,12982],"mapped",[52,49]],[[12983,12983],"mapped",[52,50]],[[12984,12984],"mapped",[52,51]],[[12985,12985],"mapped",[52,52]],[[12986,12986],"mapped",[52,53]],[[12987,12987],"mapped",[52,54]],[[12988,12988],"mapped",[52,55]],[[12989,12989],"mapped",[52,56]],[[12990,12990],"mapped",[52,57]],[[12991,12991],"mapped",[53,48]],[[12992,12992],"mapped",[49,26376]],[[12993,12993],"mapped",[50,26376]],[[12994,12994],"mapped",[51,26376]],[[12995,12995],"mapped",[52,26376]],[[12996,12996],"mapped",[53,26376]],[[12997,12997],"mapped",[54,26376]],[[12998,12998],"mapped",[55,26376]],[[12999,12999],"mapped",[56,26376]],[[13000,13000],"mapped",[57,26376]],[[13001,13001],"mapped",[49,48,26376]],[[13002,13002],"mapped",[49,49,26376]],[[13003,13003],"mapped",[49,50,26376]],[[13004,13004],"mapped",[104,103]],[[13005,13005],"mapped",[101,114,103]],[[13006,13006],"mapped",[101,118]],[[13007,13007],"mapped",[108,116,100]],[[13008,13008],"mapped",[12450]],[[13009,13009],"mapped",[12452]],[[13010,13010],"mapped",[12454]],[[13011,13011],"mapped",[12456]],[[13012,13012],"mapped",[12458]],[[13013,13013],"mapped",[12459]],[[13014,13014],"mapped",[12461]],[[13015,13015],"mapped",[12463]],[[13016,13016],"mapped",[12465]],[[13017,13017],"mapped",[12467]],[[13018,13018],"mapped",[12469]],[[13019,13019],"mapped",[12471]],[[13020,13020],"mapped",[12473]],[[13021,13021],"mapped",[12475]],[[13022,13022],"mapped",[12477]],[[13023,13023],"mapped",[12479]],[[13024,13024],"mapped",[12481]],[[13025,13025],"mapped",[12484]],[[13026,13026],"mapped",[12486]],[[13027,13027],"mapped",[12488]],[[13028,13028],"mapped",[12490]],[[13029,13029],"mapped",[12491]],[[13030,13030],"mapped",[12492]],[[13031,13031],"mapped",[12493]],[[13032,13032],"mapped",[12494]],[[13033,13033],"mapped",[12495]],[[13034,13034],"mapped",[12498]],[[13035,13035],"mapped",[12501]],[[13036,13036],"mapped",[12504]],[[13037,13037],"mapped",[12507]],[[13038,13038],"mapped",[12510]],[[13039,13039],"mapped",[12511]],[[13040,13040],"mapped",[12512]],[[13041,13041],"mapped",[12513]],[[13042,13042],"mapped",[12514]],[[13043,13043],"mapped",[12516]],[[13044,13044],"mapped",[12518]],[[13045,13045],"mapped",[12520]],[[13046,13046],"mapped",[12521]],[[13047,13047],"mapped",[12522]],[[13048,13048],"mapped",[12523]],[[13049,13049],"mapped",[12524]],[[13050,13050],"mapped",[12525]],[[13051,13051],"mapped",[12527]],[[13052,13052],"mapped",[12528]],[[13053,13053],"mapped",[12529]],[[13054,13054],"mapped",[12530]],[[13055,13055],"disallowed"],[[13056,13056],"mapped",[12450,12497,12540,12488]],[[13057,13057],"mapped",[12450,12523,12501,12449]],[[13058,13058],"mapped",[12450,12531,12506,12450]],[[13059,13059],"mapped",[12450,12540,12523]],[[13060,13060],"mapped",[12452,12491,12531,12464]],[[13061,13061],"mapped",[12452,12531,12481]],[[13062,13062],"mapped",[12454,12457,12531]],[[13063,13063],"mapped",[12456,12473,12463,12540,12489]],[[13064,13064],"mapped",[12456,12540,12459,12540]],[[13065,13065],"mapped",[12458,12531,12473]],[[13066,13066],"mapped",[12458,12540,12512]],[[13067,13067],"mapped",[12459,12452,12522]],[[13068,13068],"mapped",[12459,12521,12483,12488]],[[13069,13069],"mapped",[12459,12525,12522,12540]],[[13070,13070],"mapped",[12460,12525,12531]],[[13071,13071],"mapped",[12460,12531,12510]],[[13072,13072],"mapped",[12462,12460]],[[13073,13073],"mapped",[12462,12491,12540]],[[13074,13074],"mapped",[12461,12517,12522,12540]],[[13075,13075],"mapped",[12462,12523,12480,12540]],[[13076,13076],"mapped",[12461,12525]],[[13077,13077],"mapped",[12461,12525,12464,12521,12512]],[[13078,13078],"mapped",[12461,12525,12513,12540,12488,12523]],[[13079,13079],"mapped",[12461,12525,12527,12483,12488]],[[13080,13080],"mapped",[12464,12521,12512]],[[13081,13081],"mapped",[12464,12521,12512,12488,12531]],[[13082,13082],"mapped",[12463,12523,12476,12452,12525]],[[13083,13083],"mapped",[12463,12525,12540,12493]],[[13084,13084],"mapped",[12465,12540,12473]],[[13085,13085],"mapped",[12467,12523,12490]],[[13086,13086],"mapped",[12467,12540,12509]],[[13087,13087],"mapped",[12469,12452,12463,12523]],[[13088,13088],"mapped",[12469,12531,12481,12540,12512]],[[13089,13089],"mapped",[12471,12522,12531,12464]],[[13090,13090],"mapped",[12475,12531,12481]],[[13091,13091],"mapped",[12475,12531,12488]],[[13092,13092],"mapped",[12480,12540,12473]],[[13093,13093],"mapped",[12487,12471]],[[13094,13094],"mapped",[12489,12523]],[[13095,13095],"mapped",[12488,12531]],[[13096,13096],"mapped",[12490,12494]],[[13097,13097],"mapped",[12494,12483,12488]],[[13098,13098],"mapped",[12495,12452,12484]],[[13099,13099],"mapped",[12497,12540,12475,12531,12488]],[[13100,13100],"mapped",[12497,12540,12484]],[[13101,13101],"mapped",[12496,12540,12524,12523]],[[13102,13102],"mapped",[12500,12450,12473,12488,12523]],[[13103,13103],"mapped",[12500,12463,12523]],[[13104,13104],"mapped",[12500,12467]],[[13105,13105],"mapped",[12499,12523]],[[13106,13106],"mapped",[12501,12449,12521,12483,12489]],[[13107,13107],"mapped",[12501,12451,12540,12488]],[[13108,13108],"mapped",[12502,12483,12471,12455,12523]],[[13109,13109],"mapped",[12501,12521,12531]],[[13110,13110],"mapped",[12504,12463,12479,12540,12523]],[[13111,13111],"mapped",[12506,12477]],[[13112,13112],"mapped",[12506,12491,12498]],[[13113,13113],"mapped",[12504,12523,12484]],[[13114,13114],"mapped",[12506,12531,12473]],[[13115,13115],"mapped",[12506,12540,12472]],[[13116,13116],"mapped",[12505,12540,12479]],[[13117,13117],"mapped",[12509,12452,12531,12488]],[[13118,13118],"mapped",[12508,12523,12488]],[[13119,13119],"mapped",[12507,12531]],[[13120,13120],"mapped",[12509,12531,12489]],[[13121,13121],"mapped",[12507,12540,12523]],[[13122,13122],"mapped",[12507,12540,12531]],[[13123,13123],"mapped",[12510,12452,12463,12525]],[[13124,13124],"mapped",[12510,12452,12523]],[[13125,13125],"mapped",[12510,12483,12495]],[[13126,13126],"mapped",[12510,12523,12463]],[[13127,13127],"mapped",[12510,12531,12471,12519,12531]],[[13128,13128],"mapped",[12511,12463,12525,12531]],[[13129,13129],"mapped",[12511,12522]],[[13130,13130],"mapped",[12511,12522,12496,12540,12523]],[[13131,13131],"mapped",[12513,12460]],[[13132,13132],"mapped",[12513,12460,12488,12531]],[[13133,13133],"mapped",[12513,12540,12488,12523]],[[13134,13134],"mapped",[12516,12540,12489]],[[13135,13135],"mapped",[12516,12540,12523]],[[13136,13136],"mapped",[12518,12450,12531]],[[13137,13137],"mapped",[12522,12483,12488,12523]],[[13138,13138],"mapped",[12522,12521]],[[13139,13139],"mapped",[12523,12500,12540]],[[13140,13140],"mapped",[12523,12540,12502,12523]],[[13141,13141],"mapped",[12524,12512]],[[13142,13142],"mapped",[12524,12531,12488,12466,12531]],[[13143,13143],"mapped",[12527,12483,12488]],[[13144,13144],"mapped",[48,28857]],[[13145,13145],"mapped",[49,28857]],[[13146,13146],"mapped",[50,28857]],[[13147,13147],"mapped",[51,28857]],[[13148,13148],"mapped",[52,28857]],[[13149,13149],"mapped",[53,28857]],[[13150,13150],"mapped",[54,28857]],[[13151,13151],"mapped",[55,28857]],[[13152,13152],"mapped",[56,28857]],[[13153,13153],"mapped",[57,28857]],[[13154,13154],"mapped",[49,48,28857]],[[13155,13155],"mapped",[49,49,28857]],[[13156,13156],"mapped",[49,50,28857]],[[13157,13157],"mapped",[49,51,28857]],[[13158,13158],"mapped",[49,52,28857]],[[13159,13159],"mapped",[49,53,28857]],[[13160,13160],"mapped",[49,54,28857]],[[13161,13161],"mapped",[49,55,28857]],[[13162,13162],"mapped",[49,56,28857]],[[13163,13163],"mapped",[49,57,28857]],[[13164,13164],"mapped",[50,48,28857]],[[13165,13165],"mapped",[50,49,28857]],[[13166,13166],"mapped",[50,50,28857]],[[13167,13167],"mapped",[50,51,28857]],[[13168,13168],"mapped",[50,52,28857]],[[13169,13169],"mapped",[104,112,97]],[[13170,13170],"mapped",[100,97]],[[13171,13171],"mapped",[97,117]],[[13172,13172],"mapped",[98,97,114]],[[13173,13173],"mapped",[111,118]],[[13174,13174],"mapped",[112,99]],[[13175,13175],"mapped",[100,109]],[[13176,13176],"mapped",[100,109,50]],[[13177,13177],"mapped",[100,109,51]],[[13178,13178],"mapped",[105,117]],[[13179,13179],"mapped",[24179,25104]],[[13180,13180],"mapped",[26157,21644]],[[13181,13181],"mapped",[22823,27491]],[[13182,13182],"mapped",[26126,27835]],[[13183,13183],"mapped",[26666,24335,20250,31038]],[[13184,13184],"mapped",[112,97]],[[13185,13185],"mapped",[110,97]],[[13186,13186],"mapped",[956,97]],[[13187,13187],"mapped",[109,97]],[[13188,13188],"mapped",[107,97]],[[13189,13189],"mapped",[107,98]],[[13190,13190],"mapped",[109,98]],[[13191,13191],"mapped",[103,98]],[[13192,13192],"mapped",[99,97,108]],[[13193,13193],"mapped",[107,99,97,108]],[[13194,13194],"mapped",[112,102]],[[13195,13195],"mapped",[110,102]],[[13196,13196],"mapped",[956,102]],[[13197,13197],"mapped",[956,103]],[[13198,13198],"mapped",[109,103]],[[13199,13199],"mapped",[107,103]],[[13200,13200],"mapped",[104,122]],[[13201,13201],"mapped",[107,104,122]],[[13202,13202],"mapped",[109,104,122]],[[13203,13203],"mapped",[103,104,122]],[[13204,13204],"mapped",[116,104,122]],[[13205,13205],"mapped",[956,108]],[[13206,13206],"mapped",[109,108]],[[13207,13207],"mapped",[100,108]],[[13208,13208],"mapped",[107,108]],[[13209,13209],"mapped",[102,109]],[[13210,13210],"mapped",[110,109]],[[13211,13211],"mapped",[956,109]],[[13212,13212],"mapped",[109,109]],[[13213,13213],"mapped",[99,109]],[[13214,13214],"mapped",[107,109]],[[13215,13215],"mapped",[109,109,50]],[[13216,13216],"mapped",[99,109,50]],[[13217,13217],"mapped",[109,50]],[[13218,13218],"mapped",[107,109,50]],[[13219,13219],"mapped",[109,109,51]],[[13220,13220],"mapped",[99,109,51]],[[13221,13221],"mapped",[109,51]],[[13222,13222],"mapped",[107,109,51]],[[13223,13223],"mapped",[109,8725,115]],[[13224,13224],"mapped",[109,8725,115,50]],[[13225,13225],"mapped",[112,97]],[[13226,13226],"mapped",[107,112,97]],[[13227,13227],"mapped",[109,112,97]],[[13228,13228],"mapped",[103,112,97]],[[13229,13229],"mapped",[114,97,100]],[[13230,13230],"mapped",[114,97,100,8725,115]],[[13231,13231],"mapped",[114,97,100,8725,115,50]],[[13232,13232],"mapped",[112,115]],[[13233,13233],"mapped",[110,115]],[[13234,13234],"mapped",[956,115]],[[13235,13235],"mapped",[109,115]],[[13236,13236],"mapped",[112,118]],[[13237,13237],"mapped",[110,118]],[[13238,13238],"mapped",[956,118]],[[13239,13239],"mapped",[109,118]],[[13240,13240],"mapped",[107,118]],[[13241,13241],"mapped",[109,118]],[[13242,13242],"mapped",[112,119]],[[13243,13243],"mapped",[110,119]],[[13244,13244],"mapped",[956,119]],[[13245,13245],"mapped",[109,119]],[[13246,13246],"mapped",[107,119]],[[13247,13247],"mapped",[109,119]],[[13248,13248],"mapped",[107,969]],[[13249,13249],"mapped",[109,969]],[[13250,13250],"disallowed"],[[13251,13251],"mapped",[98,113]],[[13252,13252],"mapped",[99,99]],[[13253,13253],"mapped",[99,100]],[[13254,13254],"mapped",[99,8725,107,103]],[[13255,13255],"disallowed"],[[13256,13256],"mapped",[100,98]],[[13257,13257],"mapped",[103,121]],[[13258,13258],"mapped",[104,97]],[[13259,13259],"mapped",[104,112]],[[13260,13260],"mapped",[105,110]],[[13261,13261],"mapped",[107,107]],[[13262,13262],"mapped",[107,109]],[[13263,13263],"mapped",[107,116]],[[13264,13264],"mapped",[108,109]],[[13265,13265],"mapped",[108,110]],[[13266,13266],"mapped",[108,111,103]],[[13267,13267],"mapped",[108,120]],[[13268,13268],"mapped",[109,98]],[[13269,13269],"mapped",[109,105,108]],[[13270,13270],"mapped",[109,111,108]],[[13271,13271],"mapped",[112,104]],[[13272,13272],"disallowed"],[[13273,13273],"mapped",[112,112,109]],[[13274,13274],"mapped",[112,114]],[[13275,13275],"mapped",[115,114]],[[13276,13276],"mapped",[115,118]],[[13277,13277],"mapped",[119,98]],[[13278,13278],"mapped",[118,8725,109]],[[13279,13279],"mapped",[97,8725,109]],[[13280,13280],"mapped",[49,26085]],[[13281,13281],"mapped",[50,26085]],[[13282,13282],"mapped",[51,26085]],[[13283,13283],"mapped",[52,26085]],[[13284,13284],"mapped",[53,26085]],[[13285,13285],"mapped",[54,26085]],[[13286,13286],"mapped",[55,26085]],[[13287,13287],"mapped",[56,26085]],[[13288,13288],"mapped",[57,26085]],[[13289,13289],"mapped",[49,48,26085]],[[13290,13290],"mapped",[49,49,26085]],[[13291,13291],"mapped",[49,50,26085]],[[13292,13292],"mapped",[49,51,26085]],[[13293,13293],"mapped",[49,52,26085]],[[13294,13294],"mapped",[49,53,26085]],[[13295,13295],"mapped",[49,54,26085]],[[13296,13296],"mapped",[49,55,26085]],[[13297,13297],"mapped",[49,56,26085]],[[13298,13298],"mapped",[49,57,26085]],[[13299,13299],"mapped",[50,48,26085]],[[13300,13300],"mapped",[50,49,26085]],[[13301,13301],"mapped",[50,50,26085]],[[13302,13302],"mapped",[50,51,26085]],[[13303,13303],"mapped",[50,52,26085]],[[13304,13304],"mapped",[50,53,26085]],[[13305,13305],"mapped",[50,54,26085]],[[13306,13306],"mapped",[50,55,26085]],[[13307,13307],"mapped",[50,56,26085]],[[13308,13308],"mapped",[50,57,26085]],[[13309,13309],"mapped",[51,48,26085]],[[13310,13310],"mapped",[51,49,26085]],[[13311,13311],"mapped",[103,97,108]],[[13312,19893],"valid"],[[19894,19903],"disallowed"],[[19904,19967],"valid",[],"NV8"],[[19968,40869],"valid"],[[40870,40891],"valid"],[[40892,40899],"valid"],[[40900,40907],"valid"],[[40908,40908],"valid"],[[40909,40917],"valid"],[[40918,40959],"disallowed"],[[40960,42124],"valid"],[[42125,42127],"disallowed"],[[42128,42145],"valid",[],"NV8"],[[42146,42147],"valid",[],"NV8"],[[42148,42163],"valid",[],"NV8"],[[42164,42164],"valid",[],"NV8"],[[42165,42176],"valid",[],"NV8"],[[42177,42177],"valid",[],"NV8"],[[42178,42180],"valid",[],"NV8"],[[42181,42181],"valid",[],"NV8"],[[42182,42182],"valid",[],"NV8"],[[42183,42191],"disallowed"],[[42192,42237],"valid"],[[42238,42239],"valid",[],"NV8"],[[42240,42508],"valid"],[[42509,42511],"valid",[],"NV8"],[[42512,42539],"valid"],[[42540,42559],"disallowed"],[[42560,42560],"mapped",[42561]],[[42561,42561],"valid"],[[42562,42562],"mapped",[42563]],[[42563,42563],"valid"],[[42564,42564],"mapped",[42565]],[[42565,42565],"valid"],[[42566,42566],"mapped",[42567]],[[42567,42567],"valid"],[[42568,42568],"mapped",[42569]],[[42569,42569],"valid"],[[42570,42570],"mapped",[42571]],[[42571,42571],"valid"],[[42572,42572],"mapped",[42573]],[[42573,42573],"valid"],[[42574,42574],"mapped",[42575]],[[42575,42575],"valid"],[[42576,42576],"mapped",[42577]],[[42577,42577],"valid"],[[42578,42578],"mapped",[42579]],[[42579,42579],"valid"],[[42580,42580],"mapped",[42581]],[[42581,42581],"valid"],[[42582,42582],"mapped",[42583]],[[42583,42583],"valid"],[[42584,42584],"mapped",[42585]],[[42585,42585],"valid"],[[42586,42586],"mapped",[42587]],[[42587,42587],"valid"],[[42588,42588],"mapped",[42589]],[[42589,42589],"valid"],[[42590,42590],"mapped",[42591]],[[42591,42591],"valid"],[[42592,42592],"mapped",[42593]],[[42593,42593],"valid"],[[42594,42594],"mapped",[42595]],[[42595,42595],"valid"],[[42596,42596],"mapped",[42597]],[[42597,42597],"valid"],[[42598,42598],"mapped",[42599]],[[42599,42599],"valid"],[[42600,42600],"mapped",[42601]],[[42601,42601],"valid"],[[42602,42602],"mapped",[42603]],[[42603,42603],"valid"],[[42604,42604],"mapped",[42605]],[[42605,42607],"valid"],[[42608,42611],"valid",[],"NV8"],[[42612,42619],"valid"],[[42620,42621],"valid"],[[42622,42622],"valid",[],"NV8"],[[42623,42623],"valid"],[[42624,42624],"mapped",[42625]],[[42625,42625],"valid"],[[42626,42626],"mapped",[42627]],[[42627,42627],"valid"],[[42628,42628],"mapped",[42629]],[[42629,42629],"valid"],[[42630,42630],"mapped",[42631]],[[42631,42631],"valid"],[[42632,42632],"mapped",[42633]],[[42633,42633],"valid"],[[42634,42634],"mapped",[42635]],[[42635,42635],"valid"],[[42636,42636],"mapped",[42637]],[[42637,42637],"valid"],[[42638,42638],"mapped",[42639]],[[42639,42639],"valid"],[[42640,42640],"mapped",[42641]],[[42641,42641],"valid"],[[42642,42642],"mapped",[42643]],[[42643,42643],"valid"],[[42644,42644],"mapped",[42645]],[[42645,42645],"valid"],[[42646,42646],"mapped",[42647]],[[42647,42647],"valid"],[[42648,42648],"mapped",[42649]],[[42649,42649],"valid"],[[42650,42650],"mapped",[42651]],[[42651,42651],"valid"],[[42652,42652],"mapped",[1098]],[[42653,42653],"mapped",[1100]],[[42654,42654],"valid"],[[42655,42655],"valid"],[[42656,42725],"valid"],[[42726,42735],"valid",[],"NV8"],[[42736,42737],"valid"],[[42738,42743],"valid",[],"NV8"],[[42744,42751],"disallowed"],[[42752,42774],"valid",[],"NV8"],[[42775,42778],"valid"],[[42779,42783],"valid"],[[42784,42785],"valid",[],"NV8"],[[42786,42786],"mapped",[42787]],[[42787,42787],"valid"],[[42788,42788],"mapped",[42789]],[[42789,42789],"valid"],[[42790,42790],"mapped",[42791]],[[42791,42791],"valid"],[[42792,42792],"mapped",[42793]],[[42793,42793],"valid"],[[42794,42794],"mapped",[42795]],[[42795,42795],"valid"],[[42796,42796],"mapped",[42797]],[[42797,42797],"valid"],[[42798,42798],"mapped",[42799]],[[42799,42801],"valid"],[[42802,42802],"mapped",[42803]],[[42803,42803],"valid"],[[42804,42804],"mapped",[42805]],[[42805,42805],"valid"],[[42806,42806],"mapped",[42807]],[[42807,42807],"valid"],[[42808,42808],"mapped",[42809]],[[42809,42809],"valid"],[[42810,42810],"mapped",[42811]],[[42811,42811],"valid"],[[42812,42812],"mapped",[42813]],[[42813,42813],"valid"],[[42814,42814],"mapped",[42815]],[[42815,42815],"valid"],[[42816,42816],"mapped",[42817]],[[42817,42817],"valid"],[[42818,42818],"mapped",[42819]],[[42819,42819],"valid"],[[42820,42820],"mapped",[42821]],[[42821,42821],"valid"],[[42822,42822],"mapped",[42823]],[[42823,42823],"valid"],[[42824,42824],"mapped",[42825]],[[42825,42825],"valid"],[[42826,42826],"mapped",[42827]],[[42827,42827],"valid"],[[42828,42828],"mapped",[42829]],[[42829,42829],"valid"],[[42830,42830],"mapped",[42831]],[[42831,42831],"valid"],[[42832,42832],"mapped",[42833]],[[42833,42833],"valid"],[[42834,42834],"mapped",[42835]],[[42835,42835],"valid"],[[42836,42836],"mapped",[42837]],[[42837,42837],"valid"],[[42838,42838],"mapped",[42839]],[[42839,42839],"valid"],[[42840,42840],"mapped",[42841]],[[42841,42841],"valid"],[[42842,42842],"mapped",[42843]],[[42843,42843],"valid"],[[42844,42844],"mapped",[42845]],[[42845,42845],"valid"],[[42846,42846],"mapped",[42847]],[[42847,42847],"valid"],[[42848,42848],"mapped",[42849]],[[42849,42849],"valid"],[[42850,42850],"mapped",[42851]],[[42851,42851],"valid"],[[42852,42852],"mapped",[42853]],[[42853,42853],"valid"],[[42854,42854],"mapped",[42855]],[[42855,42855],"valid"],[[42856,42856],"mapped",[42857]],[[42857,42857],"valid"],[[42858,42858],"mapped",[42859]],[[42859,42859],"valid"],[[42860,42860],"mapped",[42861]],[[42861,42861],"valid"],[[42862,42862],"mapped",[42863]],[[42863,42863],"valid"],[[42864,42864],"mapped",[42863]],[[42865,42872],"valid"],[[42873,42873],"mapped",[42874]],[[42874,42874],"valid"],[[42875,42875],"mapped",[42876]],[[42876,42876],"valid"],[[42877,42877],"mapped",[7545]],[[42878,42878],"mapped",[42879]],[[42879,42879],"valid"],[[42880,42880],"mapped",[42881]],[[42881,42881],"valid"],[[42882,42882],"mapped",[42883]],[[42883,42883],"valid"],[[42884,42884],"mapped",[42885]],[[42885,42885],"valid"],[[42886,42886],"mapped",[42887]],[[42887,42888],"valid"],[[42889,42890],"valid",[],"NV8"],[[42891,42891],"mapped",[42892]],[[42892,42892],"valid"],[[42893,42893],"mapped",[613]],[[42894,42894],"valid"],[[42895,42895],"valid"],[[42896,42896],"mapped",[42897]],[[42897,42897],"valid"],[[42898,42898],"mapped",[42899]],[[42899,42899],"valid"],[[42900,42901],"valid"],[[42902,42902],"mapped",[42903]],[[42903,42903],"valid"],[[42904,42904],"mapped",[42905]],[[42905,42905],"valid"],[[42906,42906],"mapped",[42907]],[[42907,42907],"valid"],[[42908,42908],"mapped",[42909]],[[42909,42909],"valid"],[[42910,42910],"mapped",[42911]],[[42911,42911],"valid"],[[42912,42912],"mapped",[42913]],[[42913,42913],"valid"],[[42914,42914],"mapped",[42915]],[[42915,42915],"valid"],[[42916,42916],"mapped",[42917]],[[42917,42917],"valid"],[[42918,42918],"mapped",[42919]],[[42919,42919],"valid"],[[42920,42920],"mapped",[42921]],[[42921,42921],"valid"],[[42922,42922],"mapped",[614]],[[42923,42923],"mapped",[604]],[[42924,42924],"mapped",[609]],[[42925,42925],"mapped",[620]],[[42926,42927],"disallowed"],[[42928,42928],"mapped",[670]],[[42929,42929],"mapped",[647]],[[42930,42930],"mapped",[669]],[[42931,42931],"mapped",[43859]],[[42932,42932],"mapped",[42933]],[[42933,42933],"valid"],[[42934,42934],"mapped",[42935]],[[42935,42935],"valid"],[[42936,42998],"disallowed"],[[42999,42999],"valid"],[[43000,43000],"mapped",[295]],[[43001,43001],"mapped",[339]],[[43002,43002],"valid"],[[43003,43007],"valid"],[[43008,43047],"valid"],[[43048,43051],"valid",[],"NV8"],[[43052,43055],"disallowed"],[[43056,43065],"valid",[],"NV8"],[[43066,43071],"disallowed"],[[43072,43123],"valid"],[[43124,43127],"valid",[],"NV8"],[[43128,43135],"disallowed"],[[43136,43204],"valid"],[[43205,43213],"disallowed"],[[43214,43215],"valid",[],"NV8"],[[43216,43225],"valid"],[[43226,43231],"disallowed"],[[43232,43255],"valid"],[[43256,43258],"valid",[],"NV8"],[[43259,43259],"valid"],[[43260,43260],"valid",[],"NV8"],[[43261,43261],"valid"],[[43262,43263],"disallowed"],[[43264,43309],"valid"],[[43310,43311],"valid",[],"NV8"],[[43312,43347],"valid"],[[43348,43358],"disallowed"],[[43359,43359],"valid",[],"NV8"],[[43360,43388],"valid",[],"NV8"],[[43389,43391],"disallowed"],[[43392,43456],"valid"],[[43457,43469],"valid",[],"NV8"],[[43470,43470],"disallowed"],[[43471,43481],"valid"],[[43482,43485],"disallowed"],[[43486,43487],"valid",[],"NV8"],[[43488,43518],"valid"],[[43519,43519],"disallowed"],[[43520,43574],"valid"],[[43575,43583],"disallowed"],[[43584,43597],"valid"],[[43598,43599],"disallowed"],[[43600,43609],"valid"],[[43610,43611],"disallowed"],[[43612,43615],"valid",[],"NV8"],[[43616,43638],"valid"],[[43639,43641],"valid",[],"NV8"],[[43642,43643],"valid"],[[43644,43647],"valid"],[[43648,43714],"valid"],[[43715,43738],"disallowed"],[[43739,43741],"valid"],[[43742,43743],"valid",[],"NV8"],[[43744,43759],"valid"],[[43760,43761],"valid",[],"NV8"],[[43762,43766],"valid"],[[43767,43776],"disallowed"],[[43777,43782],"valid"],[[43783,43784],"disallowed"],[[43785,43790],"valid"],[[43791,43792],"disallowed"],[[43793,43798],"valid"],[[43799,43807],"disallowed"],[[43808,43814],"valid"],[[43815,43815],"disallowed"],[[43816,43822],"valid"],[[43823,43823],"disallowed"],[[43824,43866],"valid"],[[43867,43867],"valid",[],"NV8"],[[43868,43868],"mapped",[42791]],[[43869,43869],"mapped",[43831]],[[43870,43870],"mapped",[619]],[[43871,43871],"mapped",[43858]],[[43872,43875],"valid"],[[43876,43877],"valid"],[[43878,43887],"disallowed"],[[43888,43888],"mapped",[5024]],[[43889,43889],"mapped",[5025]],[[43890,43890],"mapped",[5026]],[[43891,43891],"mapped",[5027]],[[43892,43892],"mapped",[5028]],[[43893,43893],"mapped",[5029]],[[43894,43894],"mapped",[5030]],[[43895,43895],"mapped",[5031]],[[43896,43896],"mapped",[5032]],[[43897,43897],"mapped",[5033]],[[43898,43898],"mapped",[5034]],[[43899,43899],"mapped",[5035]],[[43900,43900],"mapped",[5036]],[[43901,43901],"mapped",[5037]],[[43902,43902],"mapped",[5038]],[[43903,43903],"mapped",[5039]],[[43904,43904],"mapped",[5040]],[[43905,43905],"mapped",[5041]],[[43906,43906],"mapped",[5042]],[[43907,43907],"mapped",[5043]],[[43908,43908],"mapped",[5044]],[[43909,43909],"mapped",[5045]],[[43910,43910],"mapped",[5046]],[[43911,43911],"mapped",[5047]],[[43912,43912],"mapped",[5048]],[[43913,43913],"mapped",[5049]],[[43914,43914],"mapped",[5050]],[[43915,43915],"mapped",[5051]],[[43916,43916],"mapped",[5052]],[[43917,43917],"mapped",[5053]],[[43918,43918],"mapped",[5054]],[[43919,43919],"mapped",[5055]],[[43920,43920],"mapped",[5056]],[[43921,43921],"mapped",[5057]],[[43922,43922],"mapped",[5058]],[[43923,43923],"mapped",[5059]],[[43924,43924],"mapped",[5060]],[[43925,43925],"mapped",[5061]],[[43926,43926],"mapped",[5062]],[[43927,43927],"mapped",[5063]],[[43928,43928],"mapped",[5064]],[[43929,43929],"mapped",[5065]],[[43930,43930],"mapped",[5066]],[[43931,43931],"mapped",[5067]],[[43932,43932],"mapped",[5068]],[[43933,43933],"mapped",[5069]],[[43934,43934],"mapped",[5070]],[[43935,43935],"mapped",[5071]],[[43936,43936],"mapped",[5072]],[[43937,43937],"mapped",[5073]],[[43938,43938],"mapped",[5074]],[[43939,43939],"mapped",[5075]],[[43940,43940],"mapped",[5076]],[[43941,43941],"mapped",[5077]],[[43942,43942],"mapped",[5078]],[[43943,43943],"mapped",[5079]],[[43944,43944],"mapped",[5080]],[[43945,43945],"mapped",[5081]],[[43946,43946],"mapped",[5082]],[[43947,43947],"mapped",[5083]],[[43948,43948],"mapped",[5084]],[[43949,43949],"mapped",[5085]],[[43950,43950],"mapped",[5086]],[[43951,43951],"mapped",[5087]],[[43952,43952],"mapped",[5088]],[[43953,43953],"mapped",[5089]],[[43954,43954],"mapped",[5090]],[[43955,43955],"mapped",[5091]],[[43956,43956],"mapped",[5092]],[[43957,43957],"mapped",[5093]],[[43958,43958],"mapped",[5094]],[[43959,43959],"mapped",[5095]],[[43960,43960],"mapped",[5096]],[[43961,43961],"mapped",[5097]],[[43962,43962],"mapped",[5098]],[[43963,43963],"mapped",[5099]],[[43964,43964],"mapped",[5100]],[[43965,43965],"mapped",[5101]],[[43966,43966],"mapped",[5102]],[[43967,43967],"mapped",[5103]],[[43968,44010],"valid"],[[44011,44011],"valid",[],"NV8"],[[44012,44013],"valid"],[[44014,44015],"disallowed"],[[44016,44025],"valid"],[[44026,44031],"disallowed"],[[44032,55203],"valid"],[[55204,55215],"disallowed"],[[55216,55238],"valid",[],"NV8"],[[55239,55242],"disallowed"],[[55243,55291],"valid",[],"NV8"],[[55292,55295],"disallowed"],[[55296,57343],"disallowed"],[[57344,63743],"disallowed"],[[63744,63744],"mapped",[35912]],[[63745,63745],"mapped",[26356]],[[63746,63746],"mapped",[36554]],[[63747,63747],"mapped",[36040]],[[63748,63748],"mapped",[28369]],[[63749,63749],"mapped",[20018]],[[63750,63750],"mapped",[21477]],[[63751,63752],"mapped",[40860]],[[63753,63753],"mapped",[22865]],[[63754,63754],"mapped",[37329]],[[63755,63755],"mapped",[21895]],[[63756,63756],"mapped",[22856]],[[63757,63757],"mapped",[25078]],[[63758,63758],"mapped",[30313]],[[63759,63759],"mapped",[32645]],[[63760,63760],"mapped",[34367]],[[63761,63761],"mapped",[34746]],[[63762,63762],"mapped",[35064]],[[63763,63763],"mapped",[37007]],[[63764,63764],"mapped",[27138]],[[63765,63765],"mapped",[27931]],[[63766,63766],"mapped",[28889]],[[63767,63767],"mapped",[29662]],[[63768,63768],"mapped",[33853]],[[63769,63769],"mapped",[37226]],[[63770,63770],"mapped",[39409]],[[63771,63771],"mapped",[20098]],[[63772,63772],"mapped",[21365]],[[63773,63773],"mapped",[27396]],[[63774,63774],"mapped",[29211]],[[63775,63775],"mapped",[34349]],[[63776,63776],"mapped",[40478]],[[63777,63777],"mapped",[23888]],[[63778,63778],"mapped",[28651]],[[63779,63779],"mapped",[34253]],[[63780,63780],"mapped",[35172]],[[63781,63781],"mapped",[25289]],[[63782,63782],"mapped",[33240]],[[63783,63783],"mapped",[34847]],[[63784,63784],"mapped",[24266]],[[63785,63785],"mapped",[26391]],[[63786,63786],"mapped",[28010]],[[63787,63787],"mapped",[29436]],[[63788,63788],"mapped",[37070]],[[63789,63789],"mapped",[20358]],[[63790,63790],"mapped",[20919]],[[63791,63791],"mapped",[21214]],[[63792,63792],"mapped",[25796]],[[63793,63793],"mapped",[27347]],[[63794,63794],"mapped",[29200]],[[63795,63795],"mapped",[30439]],[[63796,63796],"mapped",[32769]],[[63797,63797],"mapped",[34310]],[[63798,63798],"mapped",[34396]],[[63799,63799],"mapped",[36335]],[[63800,63800],"mapped",[38706]],[[63801,63801],"mapped",[39791]],[[63802,63802],"mapped",[40442]],[[63803,63803],"mapped",[30860]],[[63804,63804],"mapped",[31103]],[[63805,63805],"mapped",[32160]],[[63806,63806],"mapped",[33737]],[[63807,63807],"mapped",[37636]],[[63808,63808],"mapped",[40575]],[[63809,63809],"mapped",[35542]],[[63810,63810],"mapped",[22751]],[[63811,63811],"mapped",[24324]],[[63812,63812],"mapped",[31840]],[[63813,63813],"mapped",[32894]],[[63814,63814],"mapped",[29282]],[[63815,63815],"mapped",[30922]],[[63816,63816],"mapped",[36034]],[[63817,63817],"mapped",[38647]],[[63818,63818],"mapped",[22744]],[[63819,63819],"mapped",[23650]],[[63820,63820],"mapped",[27155]],[[63821,63821],"mapped",[28122]],[[63822,63822],"mapped",[28431]],[[63823,63823],"mapped",[32047]],[[63824,63824],"mapped",[32311]],[[63825,63825],"mapped",[38475]],[[63826,63826],"mapped",[21202]],[[63827,63827],"mapped",[32907]],[[63828,63828],"mapped",[20956]],[[63829,63829],"mapped",[20940]],[[63830,63830],"mapped",[31260]],[[63831,63831],"mapped",[32190]],[[63832,63832],"mapped",[33777]],[[63833,63833],"mapped",[38517]],[[63834,63834],"mapped",[35712]],[[63835,63835],"mapped",[25295]],[[63836,63836],"mapped",[27138]],[[63837,63837],"mapped",[35582]],[[63838,63838],"mapped",[20025]],[[63839,63839],"mapped",[23527]],[[63840,63840],"mapped",[24594]],[[63841,63841],"mapped",[29575]],[[63842,63842],"mapped",[30064]],[[63843,63843],"mapped",[21271]],[[63844,63844],"mapped",[30971]],[[63845,63845],"mapped",[20415]],[[63846,63846],"mapped",[24489]],[[63847,63847],"mapped",[19981]],[[63848,63848],"mapped",[27852]],[[63849,63849],"mapped",[25976]],[[63850,63850],"mapped",[32034]],[[63851,63851],"mapped",[21443]],[[63852,63852],"mapped",[22622]],[[63853,63853],"mapped",[30465]],[[63854,63854],"mapped",[33865]],[[63855,63855],"mapped",[35498]],[[63856,63856],"mapped",[27578]],[[63857,63857],"mapped",[36784]],[[63858,63858],"mapped",[27784]],[[63859,63859],"mapped",[25342]],[[63860,63860],"mapped",[33509]],[[63861,63861],"mapped",[25504]],[[63862,63862],"mapped",[30053]],[[63863,63863],"mapped",[20142]],[[63864,63864],"mapped",[20841]],[[63865,63865],"mapped",[20937]],[[63866,63866],"mapped",[26753]],[[63867,63867],"mapped",[31975]],[[63868,63868],"mapped",[33391]],[[63869,63869],"mapped",[35538]],[[63870,63870],"mapped",[37327]],[[63871,63871],"mapped",[21237]],[[63872,63872],"mapped",[21570]],[[63873,63873],"mapped",[22899]],[[63874,63874],"mapped",[24300]],[[63875,63875],"mapped",[26053]],[[63876,63876],"mapped",[28670]],[[63877,63877],"mapped",[31018]],[[63878,63878],"mapped",[38317]],[[63879,63879],"mapped",[39530]],[[63880,63880],"mapped",[40599]],[[63881,63881],"mapped",[40654]],[[63882,63882],"mapped",[21147]],[[63883,63883],"mapped",[26310]],[[63884,63884],"mapped",[27511]],[[63885,63885],"mapped",[36706]],[[63886,63886],"mapped",[24180]],[[63887,63887],"mapped",[24976]],[[63888,63888],"mapped",[25088]],[[63889,63889],"mapped",[25754]],[[63890,63890],"mapped",[28451]],[[63891,63891],"mapped",[29001]],[[63892,63892],"mapped",[29833]],[[63893,63893],"mapped",[31178]],[[63894,63894],"mapped",[32244]],[[63895,63895],"mapped",[32879]],[[63896,63896],"mapped",[36646]],[[63897,63897],"mapped",[34030]],[[63898,63898],"mapped",[36899]],[[63899,63899],"mapped",[37706]],[[63900,63900],"mapped",[21015]],[[63901,63901],"mapped",[21155]],[[63902,63902],"mapped",[21693]],[[63903,63903],"mapped",[28872]],[[63904,63904],"mapped",[35010]],[[63905,63905],"mapped",[35498]],[[63906,63906],"mapped",[24265]],[[63907,63907],"mapped",[24565]],[[63908,63908],"mapped",[25467]],[[63909,63909],"mapped",[27566]],[[63910,63910],"mapped",[31806]],[[63911,63911],"mapped",[29557]],[[63912,63912],"mapped",[20196]],[[63913,63913],"mapped",[22265]],[[63914,63914],"mapped",[23527]],[[63915,63915],"mapped",[23994]],[[63916,63916],"mapped",[24604]],[[63917,63917],"mapped",[29618]],[[63918,63918],"mapped",[29801]],[[63919,63919],"mapped",[32666]],[[63920,63920],"mapped",[32838]],[[63921,63921],"mapped",[37428]],[[63922,63922],"mapped",[38646]],[[63923,63923],"mapped",[38728]],[[63924,63924],"mapped",[38936]],[[63925,63925],"mapped",[20363]],[[63926,63926],"mapped",[31150]],[[63927,63927],"mapped",[37300]],[[63928,63928],"mapped",[38584]],[[63929,63929],"mapped",[24801]],[[63930,63930],"mapped",[20102]],[[63931,63931],"mapped",[20698]],[[63932,63932],"mapped",[23534]],[[63933,63933],"mapped",[23615]],[[63934,63934],"mapped",[26009]],[[63935,63935],"mapped",[27138]],[[63936,63936],"mapped",[29134]],[[63937,63937],"mapped",[30274]],[[63938,63938],"mapped",[34044]],[[63939,63939],"mapped",[36988]],[[63940,63940],"mapped",[40845]],[[63941,63941],"mapped",[26248]],[[63942,63942],"mapped",[38446]],[[63943,63943],"mapped",[21129]],[[63944,63944],"mapped",[26491]],[[63945,63945],"mapped",[26611]],[[63946,63946],"mapped",[27969]],[[63947,63947],"mapped",[28316]],[[63948,63948],"mapped",[29705]],[[63949,63949],"mapped",[30041]],[[63950,63950],"mapped",[30827]],[[63951,63951],"mapped",[32016]],[[63952,63952],"mapped",[39006]],[[63953,63953],"mapped",[20845]],[[63954,63954],"mapped",[25134]],[[63955,63955],"mapped",[38520]],[[63956,63956],"mapped",[20523]],[[63957,63957],"mapped",[23833]],[[63958,63958],"mapped",[28138]],[[63959,63959],"mapped",[36650]],[[63960,63960],"mapped",[24459]],[[63961,63961],"mapped",[24900]],[[63962,63962],"mapped",[26647]],[[63963,63963],"mapped",[29575]],[[63964,63964],"mapped",[38534]],[[63965,63965],"mapped",[21033]],[[63966,63966],"mapped",[21519]],[[63967,63967],"mapped",[23653]],[[63968,63968],"mapped",[26131]],[[63969,63969],"mapped",[26446]],[[63970,63970],"mapped",[26792]],[[63971,63971],"mapped",[27877]],[[63972,63972],"mapped",[29702]],[[63973,63973],"mapped",[30178]],[[63974,63974],"mapped",[32633]],[[63975,63975],"mapped",[35023]],[[63976,63976],"mapped",[35041]],[[63977,63977],"mapped",[37324]],[[63978,63978],"mapped",[38626]],[[63979,63979],"mapped",[21311]],[[63980,63980],"mapped",[28346]],[[63981,63981],"mapped",[21533]],[[63982,63982],"mapped",[29136]],[[63983,63983],"mapped",[29848]],[[63984,63984],"mapped",[34298]],[[63985,63985],"mapped",[38563]],[[63986,63986],"mapped",[40023]],[[63987,63987],"mapped",[40607]],[[63988,63988],"mapped",[26519]],[[63989,63989],"mapped",[28107]],[[63990,63990],"mapped",[33256]],[[63991,63991],"mapped",[31435]],[[63992,63992],"mapped",[31520]],[[63993,63993],"mapped",[31890]],[[63994,63994],"mapped",[29376]],[[63995,63995],"mapped",[28825]],[[63996,63996],"mapped",[35672]],[[63997,63997],"mapped",[20160]],[[63998,63998],"mapped",[33590]],[[63999,63999],"mapped",[21050]],[[64000,64000],"mapped",[20999]],[[64001,64001],"mapped",[24230]],[[64002,64002],"mapped",[25299]],[[64003,64003],"mapped",[31958]],[[64004,64004],"mapped",[23429]],[[64005,64005],"mapped",[27934]],[[64006,64006],"mapped",[26292]],[[64007,64007],"mapped",[36667]],[[64008,64008],"mapped",[34892]],[[64009,64009],"mapped",[38477]],[[64010,64010],"mapped",[35211]],[[64011,64011],"mapped",[24275]],[[64012,64012],"mapped",[20800]],[[64013,64013],"mapped",[21952]],[[64014,64015],"valid"],[[64016,64016],"mapped",[22618]],[[64017,64017],"valid"],[[64018,64018],"mapped",[26228]],[[64019,64020],"valid"],[[64021,64021],"mapped",[20958]],[[64022,64022],"mapped",[29482]],[[64023,64023],"mapped",[30410]],[[64024,64024],"mapped",[31036]],[[64025,64025],"mapped",[31070]],[[64026,64026],"mapped",[31077]],[[64027,64027],"mapped",[31119]],[[64028,64028],"mapped",[38742]],[[64029,64029],"mapped",[31934]],[[64030,64030],"mapped",[32701]],[[64031,64031],"valid"],[[64032,64032],"mapped",[34322]],[[64033,64033],"valid"],[[64034,64034],"mapped",[35576]],[[64035,64036],"valid"],[[64037,64037],"mapped",[36920]],[[64038,64038],"mapped",[37117]],[[64039,64041],"valid"],[[64042,64042],"mapped",[39151]],[[64043,64043],"mapped",[39164]],[[64044,64044],"mapped",[39208]],[[64045,64045],"mapped",[40372]],[[64046,64046],"mapped",[37086]],[[64047,64047],"mapped",[38583]],[[64048,64048],"mapped",[20398]],[[64049,64049],"mapped",[20711]],[[64050,64050],"mapped",[20813]],[[64051,64051],"mapped",[21193]],[[64052,64052],"mapped",[21220]],[[64053,64053],"mapped",[21329]],[[64054,64054],"mapped",[21917]],[[64055,64055],"mapped",[22022]],[[64056,64056],"mapped",[22120]],[[64057,64057],"mapped",[22592]],[[64058,64058],"mapped",[22696]],[[64059,64059],"mapped",[23652]],[[64060,64060],"mapped",[23662]],[[64061,64061],"mapped",[24724]],[[64062,64062],"mapped",[24936]],[[64063,64063],"mapped",[24974]],[[64064,64064],"mapped",[25074]],[[64065,64065],"mapped",[25935]],[[64066,64066],"mapped",[26082]],[[64067,64067],"mapped",[26257]],[[64068,64068],"mapped",[26757]],[[64069,64069],"mapped",[28023]],[[64070,64070],"mapped",[28186]],[[64071,64071],"mapped",[28450]],[[64072,64072],"mapped",[29038]],[[64073,64073],"mapped",[29227]],[[64074,64074],"mapped",[29730]],[[64075,64075],"mapped",[30865]],[[64076,64076],"mapped",[31038]],[[64077,64077],"mapped",[31049]],[[64078,64078],"mapped",[31048]],[[64079,64079],"mapped",[31056]],[[64080,64080],"mapped",[31062]],[[64081,64081],"mapped",[31069]],[[64082,64082],"mapped",[31117]],[[64083,64083],"mapped",[31118]],[[64084,64084],"mapped",[31296]],[[64085,64085],"mapped",[31361]],[[64086,64086],"mapped",[31680]],[[64087,64087],"mapped",[32244]],[[64088,64088],"mapped",[32265]],[[64089,64089],"mapped",[32321]],[[64090,64090],"mapped",[32626]],[[64091,64091],"mapped",[32773]],[[64092,64092],"mapped",[33261]],[[64093,64094],"mapped",[33401]],[[64095,64095],"mapped",[33879]],[[64096,64096],"mapped",[35088]],[[64097,64097],"mapped",[35222]],[[64098,64098],"mapped",[35585]],[[64099,64099],"mapped",[35641]],[[64100,64100],"mapped",[36051]],[[64101,64101],"mapped",[36104]],[[64102,64102],"mapped",[36790]],[[64103,64103],"mapped",[36920]],[[64104,64104],"mapped",[38627]],[[64105,64105],"mapped",[38911]],[[64106,64106],"mapped",[38971]],[[64107,64107],"mapped",[24693]],[[64108,64108],"mapped",[148206]],[[64109,64109],"mapped",[33304]],[[64110,64111],"disallowed"],[[64112,64112],"mapped",[20006]],[[64113,64113],"mapped",[20917]],[[64114,64114],"mapped",[20840]],[[64115,64115],"mapped",[20352]],[[64116,64116],"mapped",[20805]],[[64117,64117],"mapped",[20864]],[[64118,64118],"mapped",[21191]],[[64119,64119],"mapped",[21242]],[[64120,64120],"mapped",[21917]],[[64121,64121],"mapped",[21845]],[[64122,64122],"mapped",[21913]],[[64123,64123],"mapped",[21986]],[[64124,64124],"mapped",[22618]],[[64125,64125],"mapped",[22707]],[[64126,64126],"mapped",[22852]],[[64127,64127],"mapped",[22868]],[[64128,64128],"mapped",[23138]],[[64129,64129],"mapped",[23336]],[[64130,64130],"mapped",[24274]],[[64131,64131],"mapped",[24281]],[[64132,64132],"mapped",[24425]],[[64133,64133],"mapped",[24493]],[[64134,64134],"mapped",[24792]],[[64135,64135],"mapped",[24910]],[[64136,64136],"mapped",[24840]],[[64137,64137],"mapped",[24974]],[[64138,64138],"mapped",[24928]],[[64139,64139],"mapped",[25074]],[[64140,64140],"mapped",[25140]],[[64141,64141],"mapped",[25540]],[[64142,64142],"mapped",[25628]],[[64143,64143],"mapped",[25682]],[[64144,64144],"mapped",[25942]],[[64145,64145],"mapped",[26228]],[[64146,64146],"mapped",[26391]],[[64147,64147],"mapped",[26395]],[[64148,64148],"mapped",[26454]],[[64149,64149],"mapped",[27513]],[[64150,64150],"mapped",[27578]],[[64151,64151],"mapped",[27969]],[[64152,64152],"mapped",[28379]],[[64153,64153],"mapped",[28363]],[[64154,64154],"mapped",[28450]],[[64155,64155],"mapped",[28702]],[[64156,64156],"mapped",[29038]],[[64157,64157],"mapped",[30631]],[[64158,64158],"mapped",[29237]],[[64159,64159],"mapped",[29359]],[[64160,64160],"mapped",[29482]],[[64161,64161],"mapped",[29809]],[[64162,64162],"mapped",[29958]],[[64163,64163],"mapped",[30011]],[[64164,64164],"mapped",[30237]],[[64165,64165],"mapped",[30239]],[[64166,64166],"mapped",[30410]],[[64167,64167],"mapped",[30427]],[[64168,64168],"mapped",[30452]],[[64169,64169],"mapped",[30538]],[[64170,64170],"mapped",[30528]],[[64171,64171],"mapped",[30924]],[[64172,64172],"mapped",[31409]],[[64173,64173],"mapped",[31680]],[[64174,64174],"mapped",[31867]],[[64175,64175],"mapped",[32091]],[[64176,64176],"mapped",[32244]],[[64177,64177],"mapped",[32574]],[[64178,64178],"mapped",[32773]],[[64179,64179],"mapped",[33618]],[[64180,64180],"mapped",[33775]],[[64181,64181],"mapped",[34681]],[[64182,64182],"mapped",[35137]],[[64183,64183],"mapped",[35206]],[[64184,64184],"mapped",[35222]],[[64185,64185],"mapped",[35519]],[[64186,64186],"mapped",[35576]],[[64187,64187],"mapped",[35531]],[[64188,64188],"mapped",[35585]],[[64189,64189],"mapped",[35582]],[[64190,64190],"mapped",[35565]],[[64191,64191],"mapped",[35641]],[[64192,64192],"mapped",[35722]],[[64193,64193],"mapped",[36104]],[[64194,64194],"mapped",[36664]],[[64195,64195],"mapped",[36978]],[[64196,64196],"mapped",[37273]],[[64197,64197],"mapped",[37494]],[[64198,64198],"mapped",[38524]],[[64199,64199],"mapped",[38627]],[[64200,64200],"mapped",[38742]],[[64201,64201],"mapped",[38875]],[[64202,64202],"mapped",[38911]],[[64203,64203],"mapped",[38923]],[[64204,64204],"mapped",[38971]],[[64205,64205],"mapped",[39698]],[[64206,64206],"mapped",[40860]],[[64207,64207],"mapped",[141386]],[[64208,64208],"mapped",[141380]],[[64209,64209],"mapped",[144341]],[[64210,64210],"mapped",[15261]],[[64211,64211],"mapped",[16408]],[[64212,64212],"mapped",[16441]],[[64213,64213],"mapped",[152137]],[[64214,64214],"mapped",[154832]],[[64215,64215],"mapped",[163539]],[[64216,64216],"mapped",[40771]],[[64217,64217],"mapped",[40846]],[[64218,64255],"disallowed"],[[64256,64256],"mapped",[102,102]],[[64257,64257],"mapped",[102,105]],[[64258,64258],"mapped",[102,108]],[[64259,64259],"mapped",[102,102,105]],[[64260,64260],"mapped",[102,102,108]],[[64261,64262],"mapped",[115,116]],[[64263,64274],"disallowed"],[[64275,64275],"mapped",[1396,1398]],[[64276,64276],"mapped",[1396,1381]],[[64277,64277],"mapped",[1396,1387]],[[64278,64278],"mapped",[1406,1398]],[[64279,64279],"mapped",[1396,1389]],[[64280,64284],"disallowed"],[[64285,64285],"mapped",[1497,1460]],[[64286,64286],"valid"],[[64287,64287],"mapped",[1522,1463]],[[64288,64288],"mapped",[1506]],[[64289,64289],"mapped",[1488]],[[64290,64290],"mapped",[1491]],[[64291,64291],"mapped",[1492]],[[64292,64292],"mapped",[1499]],[[64293,64293],"mapped",[1500]],[[64294,64294],"mapped",[1501]],[[64295,64295],"mapped",[1512]],[[64296,64296],"mapped",[1514]],[[64297,64297],"disallowed_STD3_mapped",[43]],[[64298,64298],"mapped",[1513,1473]],[[64299,64299],"mapped",[1513,1474]],[[64300,64300],"mapped",[1513,1468,1473]],[[64301,64301],"mapped",[1513,1468,1474]],[[64302,64302],"mapped",[1488,1463]],[[64303,64303],"mapped",[1488,1464]],[[64304,64304],"mapped",[1488,1468]],[[64305,64305],"mapped",[1489,1468]],[[64306,64306],"mapped",[1490,1468]],[[64307,64307],"mapped",[1491,1468]],[[64308,64308],"mapped",[1492,1468]],[[64309,64309],"mapped",[1493,1468]],[[64310,64310],"mapped",[1494,1468]],[[64311,64311],"disallowed"],[[64312,64312],"mapped",[1496,1468]],[[64313,64313],"mapped",[1497,1468]],[[64314,64314],"mapped",[1498,1468]],[[64315,64315],"mapped",[1499,1468]],[[64316,64316],"mapped",[1500,1468]],[[64317,64317],"disallowed"],[[64318,64318],"mapped",[1502,1468]],[[64319,64319],"disallowed"],[[64320,64320],"mapped",[1504,1468]],[[64321,64321],"mapped",[1505,1468]],[[64322,64322],"disallowed"],[[64323,64323],"mapped",[1507,1468]],[[64324,64324],"mapped",[1508,1468]],[[64325,64325],"disallowed"],[[64326,64326],"mapped",[1510,1468]],[[64327,64327],"mapped",[1511,1468]],[[64328,64328],"mapped",[1512,1468]],[[64329,64329],"mapped",[1513,1468]],[[64330,64330],"mapped",[1514,1468]],[[64331,64331],"mapped",[1493,1465]],[[64332,64332],"mapped",[1489,1471]],[[64333,64333],"mapped",[1499,1471]],[[64334,64334],"mapped",[1508,1471]],[[64335,64335],"mapped",[1488,1500]],[[64336,64337],"mapped",[1649]],[[64338,64341],"mapped",[1659]],[[64342,64345],"mapped",[1662]],[[64346,64349],"mapped",[1664]],[[64350,64353],"mapped",[1658]],[[64354,64357],"mapped",[1663]],[[64358,64361],"mapped",[1657]],[[64362,64365],"mapped",[1700]],[[64366,64369],"mapped",[1702]],[[64370,64373],"mapped",[1668]],[[64374,64377],"mapped",[1667]],[[64378,64381],"mapped",[1670]],[[64382,64385],"mapped",[1671]],[[64386,64387],"mapped",[1677]],[[64388,64389],"mapped",[1676]],[[64390,64391],"mapped",[1678]],[[64392,64393],"mapped",[1672]],[[64394,64395],"mapped",[1688]],[[64396,64397],"mapped",[1681]],[[64398,64401],"mapped",[1705]],[[64402,64405],"mapped",[1711]],[[64406,64409],"mapped",[1715]],[[64410,64413],"mapped",[1713]],[[64414,64415],"mapped",[1722]],[[64416,64419],"mapped",[1723]],[[64420,64421],"mapped",[1728]],[[64422,64425],"mapped",[1729]],[[64426,64429],"mapped",[1726]],[[64430,64431],"mapped",[1746]],[[64432,64433],"mapped",[1747]],[[64434,64449],"valid",[],"NV8"],[[64450,64466],"disallowed"],[[64467,64470],"mapped",[1709]],[[64471,64472],"mapped",[1735]],[[64473,64474],"mapped",[1734]],[[64475,64476],"mapped",[1736]],[[64477,64477],"mapped",[1735,1652]],[[64478,64479],"mapped",[1739]],[[64480,64481],"mapped",[1733]],[[64482,64483],"mapped",[1737]],[[64484,64487],"mapped",[1744]],[[64488,64489],"mapped",[1609]],[[64490,64491],"mapped",[1574,1575]],[[64492,64493],"mapped",[1574,1749]],[[64494,64495],"mapped",[1574,1608]],[[64496,64497],"mapped",[1574,1735]],[[64498,64499],"mapped",[1574,1734]],[[64500,64501],"mapped",[1574,1736]],[[64502,64504],"mapped",[1574,1744]],[[64505,64507],"mapped",[1574,1609]],[[64508,64511],"mapped",[1740]],[[64512,64512],"mapped",[1574,1580]],[[64513,64513],"mapped",[1574,1581]],[[64514,64514],"mapped",[1574,1605]],[[64515,64515],"mapped",[1574,1609]],[[64516,64516],"mapped",[1574,1610]],[[64517,64517],"mapped",[1576,1580]],[[64518,64518],"mapped",[1576,1581]],[[64519,64519],"mapped",[1576,1582]],[[64520,64520],"mapped",[1576,1605]],[[64521,64521],"mapped",[1576,1609]],[[64522,64522],"mapped",[1576,1610]],[[64523,64523],"mapped",[1578,1580]],[[64524,64524],"mapped",[1578,1581]],[[64525,64525],"mapped",[1578,1582]],[[64526,64526],"mapped",[1578,1605]],[[64527,64527],"mapped",[1578,1609]],[[64528,64528],"mapped",[1578,1610]],[[64529,64529],"mapped",[1579,1580]],[[64530,64530],"mapped",[1579,1605]],[[64531,64531],"mapped",[1579,1609]],[[64532,64532],"mapped",[1579,1610]],[[64533,64533],"mapped",[1580,1581]],[[64534,64534],"mapped",[1580,1605]],[[64535,64535],"mapped",[1581,1580]],[[64536,64536],"mapped",[1581,1605]],[[64537,64537],"mapped",[1582,1580]],[[64538,64538],"mapped",[1582,1581]],[[64539,64539],"mapped",[1582,1605]],[[64540,64540],"mapped",[1587,1580]],[[64541,64541],"mapped",[1587,1581]],[[64542,64542],"mapped",[1587,1582]],[[64543,64543],"mapped",[1587,1605]],[[64544,64544],"mapped",[1589,1581]],[[64545,64545],"mapped",[1589,1605]],[[64546,64546],"mapped",[1590,1580]],[[64547,64547],"mapped",[1590,1581]],[[64548,64548],"mapped",[1590,1582]],[[64549,64549],"mapped",[1590,1605]],[[64550,64550],"mapped",[1591,1581]],[[64551,64551],"mapped",[1591,1605]],[[64552,64552],"mapped",[1592,1605]],[[64553,64553],"mapped",[1593,1580]],[[64554,64554],"mapped",[1593,1605]],[[64555,64555],"mapped",[1594,1580]],[[64556,64556],"mapped",[1594,1605]],[[64557,64557],"mapped",[1601,1580]],[[64558,64558],"mapped",[1601,1581]],[[64559,64559],"mapped",[1601,1582]],[[64560,64560],"mapped",[1601,1605]],[[64561,64561],"mapped",[1601,1609]],[[64562,64562],"mapped",[1601,1610]],[[64563,64563],"mapped",[1602,1581]],[[64564,64564],"mapped",[1602,1605]],[[64565,64565],"mapped",[1602,1609]],[[64566,64566],"mapped",[1602,1610]],[[64567,64567],"mapped",[1603,1575]],[[64568,64568],"mapped",[1603,1580]],[[64569,64569],"mapped",[1603,1581]],[[64570,64570],"mapped",[1603,1582]],[[64571,64571],"mapped",[1603,1604]],[[64572,64572],"mapped",[1603,1605]],[[64573,64573],"mapped",[1603,1609]],[[64574,64574],"mapped",[1603,1610]],[[64575,64575],"mapped",[1604,1580]],[[64576,64576],"mapped",[1604,1581]],[[64577,64577],"mapped",[1604,1582]],[[64578,64578],"mapped",[1604,1605]],[[64579,64579],"mapped",[1604,1609]],[[64580,64580],"mapped",[1604,1610]],[[64581,64581],"mapped",[1605,1580]],[[64582,64582],"mapped",[1605,1581]],[[64583,64583],"mapped",[1605,1582]],[[64584,64584],"mapped",[1605,1605]],[[64585,64585],"mapped",[1605,1609]],[[64586,64586],"mapped",[1605,1610]],[[64587,64587],"mapped",[1606,1580]],[[64588,64588],"mapped",[1606,1581]],[[64589,64589],"mapped",[1606,1582]],[[64590,64590],"mapped",[1606,1605]],[[64591,64591],"mapped",[1606,1609]],[[64592,64592],"mapped",[1606,1610]],[[64593,64593],"mapped",[1607,1580]],[[64594,64594],"mapped",[1607,1605]],[[64595,64595],"mapped",[1607,1609]],[[64596,64596],"mapped",[1607,1610]],[[64597,64597],"mapped",[1610,1580]],[[64598,64598],"mapped",[1610,1581]],[[64599,64599],"mapped",[1610,1582]],[[64600,64600],"mapped",[1610,1605]],[[64601,64601],"mapped",[1610,1609]],[[64602,64602],"mapped",[1610,1610]],[[64603,64603],"mapped",[1584,1648]],[[64604,64604],"mapped",[1585,1648]],[[64605,64605],"mapped",[1609,1648]],[[64606,64606],"disallowed_STD3_mapped",[32,1612,1617]],[[64607,64607],"disallowed_STD3_mapped",[32,1613,1617]],[[64608,64608],"disallowed_STD3_mapped",[32,1614,1617]],[[64609,64609],"disallowed_STD3_mapped",[32,1615,1617]],[[64610,64610],"disallowed_STD3_mapped",[32,1616,1617]],[[64611,64611],"disallowed_STD3_mapped",[32,1617,1648]],[[64612,64612],"mapped",[1574,1585]],[[64613,64613],"mapped",[1574,1586]],[[64614,64614],"mapped",[1574,1605]],[[64615,64615],"mapped",[1574,1606]],[[64616,64616],"mapped",[1574,1609]],[[64617,64617],"mapped",[1574,1610]],[[64618,64618],"mapped",[1576,1585]],[[64619,64619],"mapped",[1576,1586]],[[64620,64620],"mapped",[1576,1605]],[[64621,64621],"mapped",[1576,1606]],[[64622,64622],"mapped",[1576,1609]],[[64623,64623],"mapped",[1576,1610]],[[64624,64624],"mapped",[1578,1585]],[[64625,64625],"mapped",[1578,1586]],[[64626,64626],"mapped",[1578,1605]],[[64627,64627],"mapped",[1578,1606]],[[64628,64628],"mapped",[1578,1609]],[[64629,64629],"mapped",[1578,1610]],[[64630,64630],"mapped",[1579,1585]],[[64631,64631],"mapped",[1579,1586]],[[64632,64632],"mapped",[1579,1605]],[[64633,64633],"mapped",[1579,1606]],[[64634,64634],"mapped",[1579,1609]],[[64635,64635],"mapped",[1579,1610]],[[64636,64636],"mapped",[1601,1609]],[[64637,64637],"mapped",[1601,1610]],[[64638,64638],"mapped",[1602,1609]],[[64639,64639],"mapped",[1602,1610]],[[64640,64640],"mapped",[1603,1575]],[[64641,64641],"mapped",[1603,1604]],[[64642,64642],"mapped",[1603,1605]],[[64643,64643],"mapped",[1603,1609]],[[64644,64644],"mapped",[1603,1610]],[[64645,64645],"mapped",[1604,1605]],[[64646,64646],"mapped",[1604,1609]],[[64647,64647],"mapped",[1604,1610]],[[64648,64648],"mapped",[1605,1575]],[[64649,64649],"mapped",[1605,1605]],[[64650,64650],"mapped",[1606,1585]],[[64651,64651],"mapped",[1606,1586]],[[64652,64652],"mapped",[1606,1605]],[[64653,64653],"mapped",[1606,1606]],[[64654,64654],"mapped",[1606,1609]],[[64655,64655],"mapped",[1606,1610]],[[64656,64656],"mapped",[1609,1648]],[[64657,64657],"mapped",[1610,1585]],[[64658,64658],"mapped",[1610,1586]],[[64659,64659],"mapped",[1610,1605]],[[64660,64660],"mapped",[1610,1606]],[[64661,64661],"mapped",[1610,1609]],[[64662,64662],"mapped",[1610,1610]],[[64663,64663],"mapped",[1574,1580]],[[64664,64664],"mapped",[1574,1581]],[[64665,64665],"mapped",[1574,1582]],[[64666,64666],"mapped",[1574,1605]],[[64667,64667],"mapped",[1574,1607]],[[64668,64668],"mapped",[1576,1580]],[[64669,64669],"mapped",[1576,1581]],[[64670,64670],"mapped",[1576,1582]],[[64671,64671],"mapped",[1576,1605]],[[64672,64672],"mapped",[1576,1607]],[[64673,64673],"mapped",[1578,1580]],[[64674,64674],"mapped",[1578,1581]],[[64675,64675],"mapped",[1578,1582]],[[64676,64676],"mapped",[1578,1605]],[[64677,64677],"mapped",[1578,1607]],[[64678,64678],"mapped",[1579,1605]],[[64679,64679],"mapped",[1580,1581]],[[64680,64680],"mapped",[1580,1605]],[[64681,64681],"mapped",[1581,1580]],[[64682,64682],"mapped",[1581,1605]],[[64683,64683],"mapped",[1582,1580]],[[64684,64684],"mapped",[1582,1605]],[[64685,64685],"mapped",[1587,1580]],[[64686,64686],"mapped",[1587,1581]],[[64687,64687],"mapped",[1587,1582]],[[64688,64688],"mapped",[1587,1605]],[[64689,64689],"mapped",[1589,1581]],[[64690,64690],"mapped",[1589,1582]],[[64691,64691],"mapped",[1589,1605]],[[64692,64692],"mapped",[1590,1580]],[[64693,64693],"mapped",[1590,1581]],[[64694,64694],"mapped",[1590,1582]],[[64695,64695],"mapped",[1590,1605]],[[64696,64696],"mapped",[1591,1581]],[[64697,64697],"mapped",[1592,1605]],[[64698,64698],"mapped",[1593,1580]],[[64699,64699],"mapped",[1593,1605]],[[64700,64700],"mapped",[1594,1580]],[[64701,64701],"mapped",[1594,1605]],[[64702,64702],"mapped",[1601,1580]],[[64703,64703],"mapped",[1601,1581]],[[64704,64704],"mapped",[1601,1582]],[[64705,64705],"mapped",[1601,1605]],[[64706,64706],"mapped",[1602,1581]],[[64707,64707],"mapped",[1602,1605]],[[64708,64708],"mapped",[1603,1580]],[[64709,64709],"mapped",[1603,1581]],[[64710,64710],"mapped",[1603,1582]],[[64711,64711],"mapped",[1603,1604]],[[64712,64712],"mapped",[1603,1605]],[[64713,64713],"mapped",[1604,1580]],[[64714,64714],"mapped",[1604,1581]],[[64715,64715],"mapped",[1604,1582]],[[64716,64716],"mapped",[1604,1605]],[[64717,64717],"mapped",[1604,1607]],[[64718,64718],"mapped",[1605,1580]],[[64719,64719],"mapped",[1605,1581]],[[64720,64720],"mapped",[1605,1582]],[[64721,64721],"mapped",[1605,1605]],[[64722,64722],"mapped",[1606,1580]],[[64723,64723],"mapped",[1606,1581]],[[64724,64724],"mapped",[1606,1582]],[[64725,64725],"mapped",[1606,1605]],[[64726,64726],"mapped",[1606,1607]],[[64727,64727],"mapped",[1607,1580]],[[64728,64728],"mapped",[1607,1605]],[[64729,64729],"mapped",[1607,1648]],[[64730,64730],"mapped",[1610,1580]],[[64731,64731],"mapped",[1610,1581]],[[64732,64732],"mapped",[1610,1582]],[[64733,64733],"mapped",[1610,1605]],[[64734,64734],"mapped",[1610,1607]],[[64735,64735],"mapped",[1574,1605]],[[64736,64736],"mapped",[1574,1607]],[[64737,64737],"mapped",[1576,1605]],[[64738,64738],"mapped",[1576,1607]],[[64739,64739],"mapped",[1578,1605]],[[64740,64740],"mapped",[1578,1607]],[[64741,64741],"mapped",[1579,1605]],[[64742,64742],"mapped",[1579,1607]],[[64743,64743],"mapped",[1587,1605]],[[64744,64744],"mapped",[1587,1607]],[[64745,64745],"mapped",[1588,1605]],[[64746,64746],"mapped",[1588,1607]],[[64747,64747],"mapped",[1603,1604]],[[64748,64748],"mapped",[1603,1605]],[[64749,64749],"mapped",[1604,1605]],[[64750,64750],"mapped",[1606,1605]],[[64751,64751],"mapped",[1606,1607]],[[64752,64752],"mapped",[1610,1605]],[[64753,64753],"mapped",[1610,1607]],[[64754,64754],"mapped",[1600,1614,1617]],[[64755,64755],"mapped",[1600,1615,1617]],[[64756,64756],"mapped",[1600,1616,1617]],[[64757,64757],"mapped",[1591,1609]],[[64758,64758],"mapped",[1591,1610]],[[64759,64759],"mapped",[1593,1609]],[[64760,64760],"mapped",[1593,1610]],[[64761,64761],"mapped",[1594,1609]],[[64762,64762],"mapped",[1594,1610]],[[64763,64763],"mapped",[1587,1609]],[[64764,64764],"mapped",[1587,1610]],[[64765,64765],"mapped",[1588,1609]],[[64766,64766],"mapped",[1588,1610]],[[64767,64767],"mapped",[1581,1609]],[[64768,64768],"mapped",[1581,1610]],[[64769,64769],"mapped",[1580,1609]],[[64770,64770],"mapped",[1580,1610]],[[64771,64771],"mapped",[1582,1609]],[[64772,64772],"mapped",[1582,1610]],[[64773,64773],"mapped",[1589,1609]],[[64774,64774],"mapped",[1589,1610]],[[64775,64775],"mapped",[1590,1609]],[[64776,64776],"mapped",[1590,1610]],[[64777,64777],"mapped",[1588,1580]],[[64778,64778],"mapped",[1588,1581]],[[64779,64779],"mapped",[1588,1582]],[[64780,64780],"mapped",[1588,1605]],[[64781,64781],"mapped",[1588,1585]],[[64782,64782],"mapped",[1587,1585]],[[64783,64783],"mapped",[1589,1585]],[[64784,64784],"mapped",[1590,1585]],[[64785,64785],"mapped",[1591,1609]],[[64786,64786],"mapped",[1591,1610]],[[64787,64787],"mapped",[1593,1609]],[[64788,64788],"mapped",[1593,1610]],[[64789,64789],"mapped",[1594,1609]],[[64790,64790],"mapped",[1594,1610]],[[64791,64791],"mapped",[1587,1609]],[[64792,64792],"mapped",[1587,1610]],[[64793,64793],"mapped",[1588,1609]],[[64794,64794],"mapped",[1588,1610]],[[64795,64795],"mapped",[1581,1609]],[[64796,64796],"mapped",[1581,1610]],[[64797,64797],"mapped",[1580,1609]],[[64798,64798],"mapped",[1580,1610]],[[64799,64799],"mapped",[1582,1609]],[[64800,64800],"mapped",[1582,1610]],[[64801,64801],"mapped",[1589,1609]],[[64802,64802],"mapped",[1589,1610]],[[64803,64803],"mapped",[1590,1609]],[[64804,64804],"mapped",[1590,1610]],[[64805,64805],"mapped",[1588,1580]],[[64806,64806],"mapped",[1588,1581]],[[64807,64807],"mapped",[1588,1582]],[[64808,64808],"mapped",[1588,1605]],[[64809,64809],"mapped",[1588,1585]],[[64810,64810],"mapped",[1587,1585]],[[64811,64811],"mapped",[1589,1585]],[[64812,64812],"mapped",[1590,1585]],[[64813,64813],"mapped",[1588,1580]],[[64814,64814],"mapped",[1588,1581]],[[64815,64815],"mapped",[1588,1582]],[[64816,64816],"mapped",[1588,1605]],[[64817,64817],"mapped",[1587,1607]],[[64818,64818],"mapped",[1588,1607]],[[64819,64819],"mapped",[1591,1605]],[[64820,64820],"mapped",[1587,1580]],[[64821,64821],"mapped",[1587,1581]],[[64822,64822],"mapped",[1587,1582]],[[64823,64823],"mapped",[1588,1580]],[[64824,64824],"mapped",[1588,1581]],[[64825,64825],"mapped",[1588,1582]],[[64826,64826],"mapped",[1591,1605]],[[64827,64827],"mapped",[1592,1605]],[[64828,64829],"mapped",[1575,1611]],[[64830,64831],"valid",[],"NV8"],[[64832,64847],"disallowed"],[[64848,64848],"mapped",[1578,1580,1605]],[[64849,64850],"mapped",[1578,1581,1580]],[[64851,64851],"mapped",[1578,1581,1605]],[[64852,64852],"mapped",[1578,1582,1605]],[[64853,64853],"mapped",[1578,1605,1580]],[[64854,64854],"mapped",[1578,1605,1581]],[[64855,64855],"mapped",[1578,1605,1582]],[[64856,64857],"mapped",[1580,1605,1581]],[[64858,64858],"mapped",[1581,1605,1610]],[[64859,64859],"mapped",[1581,1605,1609]],[[64860,64860],"mapped",[1587,1581,1580]],[[64861,64861],"mapped",[1587,1580,1581]],[[64862,64862],"mapped",[1587,1580,1609]],[[64863,64864],"mapped",[1587,1605,1581]],[[64865,64865],"mapped",[1587,1605,1580]],[[64866,64867],"mapped",[1587,1605,1605]],[[64868,64869],"mapped",[1589,1581,1581]],[[64870,64870],"mapped",[1589,1605,1605]],[[64871,64872],"mapped",[1588,1581,1605]],[[64873,64873],"mapped",[1588,1580,1610]],[[64874,64875],"mapped",[1588,1605,1582]],[[64876,64877],"mapped",[1588,1605,1605]],[[64878,64878],"mapped",[1590,1581,1609]],[[64879,64880],"mapped",[1590,1582,1605]],[[64881,64882],"mapped",[1591,1605,1581]],[[64883,64883],"mapped",[1591,1605,1605]],[[64884,64884],"mapped",[1591,1605,1610]],[[64885,64885],"mapped",[1593,1580,1605]],[[64886,64887],"mapped",[1593,1605,1605]],[[64888,64888],"mapped",[1593,1605,1609]],[[64889,64889],"mapped",[1594,1605,1605]],[[64890,64890],"mapped",[1594,1605,1610]],[[64891,64891],"mapped",[1594,1605,1609]],[[64892,64893],"mapped",[1601,1582,1605]],[[64894,64894],"mapped",[1602,1605,1581]],[[64895,64895],"mapped",[1602,1605,1605]],[[64896,64896],"mapped",[1604,1581,1605]],[[64897,64897],"mapped",[1604,1581,1610]],[[64898,64898],"mapped",[1604,1581,1609]],[[64899,64900],"mapped",[1604,1580,1580]],[[64901,64902],"mapped",[1604,1582,1605]],[[64903,64904],"mapped",[1604,1605,1581]],[[64905,64905],"mapped",[1605,1581,1580]],[[64906,64906],"mapped",[1605,1581,1605]],[[64907,64907],"mapped",[1605,1581,1610]],[[64908,64908],"mapped",[1605,1580,1581]],[[64909,64909],"mapped",[1605,1580,1605]],[[64910,64910],"mapped",[1605,1582,1580]],[[64911,64911],"mapped",[1605,1582,1605]],[[64912,64913],"disallowed"],[[64914,64914],"mapped",[1605,1580,1582]],[[64915,64915],"mapped",[1607,1605,1580]],[[64916,64916],"mapped",[1607,1605,1605]],[[64917,64917],"mapped",[1606,1581,1605]],[[64918,64918],"mapped",[1606,1581,1609]],[[64919,64920],"mapped",[1606,1580,1605]],[[64921,64921],"mapped",[1606,1580,1609]],[[64922,64922],"mapped",[1606,1605,1610]],[[64923,64923],"mapped",[1606,1605,1609]],[[64924,64925],"mapped",[1610,1605,1605]],[[64926,64926],"mapped",[1576,1582,1610]],[[64927,64927],"mapped",[1578,1580,1610]],[[64928,64928],"mapped",[1578,1580,1609]],[[64929,64929],"mapped",[1578,1582,1610]],[[64930,64930],"mapped",[1578,1582,1609]],[[64931,64931],"mapped",[1578,1605,1610]],[[64932,64932],"mapped",[1578,1605,1609]],[[64933,64933],"mapped",[1580,1605,1610]],[[64934,64934],"mapped",[1580,1581,1609]],[[64935,64935],"mapped",[1580,1605,1609]],[[64936,64936],"mapped",[1587,1582,1609]],[[64937,64937],"mapped",[1589,1581,1610]],[[64938,64938],"mapped",[1588,1581,1610]],[[64939,64939],"mapped",[1590,1581,1610]],[[64940,64940],"mapped",[1604,1580,1610]],[[64941,64941],"mapped",[1604,1605,1610]],[[64942,64942],"mapped",[1610,1581,1610]],[[64943,64943],"mapped",[1610,1580,1610]],[[64944,64944],"mapped",[1610,1605,1610]],[[64945,64945],"mapped",[1605,1605,1610]],[[64946,64946],"mapped",[1602,1605,1610]],[[64947,64947],"mapped",[1606,1581,1610]],[[64948,64948],"mapped",[1602,1605,1581]],[[64949,64949],"mapped",[1604,1581,1605]],[[64950,64950],"mapped",[1593,1605,1610]],[[64951,64951],"mapped",[1603,1605,1610]],[[64952,64952],"mapped",[1606,1580,1581]],[[64953,64953],"mapped",[1605,1582,1610]],[[64954,64954],"mapped",[1604,1580,1605]],[[64955,64955],"mapped",[1603,1605,1605]],[[64956,64956],"mapped",[1604,1580,1605]],[[64957,64957],"mapped",[1606,1580,1581]],[[64958,64958],"mapped",[1580,1581,1610]],[[64959,64959],"mapped",[1581,1580,1610]],[[64960,64960],"mapped",[1605,1580,1610]],[[64961,64961],"mapped",[1601,1605,1610]],[[64962,64962],"mapped",[1576,1581,1610]],[[64963,64963],"mapped",[1603,1605,1605]],[[64964,64964],"mapped",[1593,1580,1605]],[[64965,64965],"mapped",[1589,1605,1605]],[[64966,64966],"mapped",[1587,1582,1610]],[[64967,64967],"mapped",[1606,1580,1610]],[[64968,64975],"disallowed"],[[64976,65007],"disallowed"],[[65008,65008],"mapped",[1589,1604,1746]],[[65009,65009],"mapped",[1602,1604,1746]],[[65010,65010],"mapped",[1575,1604,1604,1607]],[[65011,65011],"mapped",[1575,1603,1576,1585]],[[65012,65012],"mapped",[1605,1581,1605,1583]],[[65013,65013],"mapped",[1589,1604,1593,1605]],[[65014,65014],"mapped",[1585,1587,1608,1604]],[[65015,65015],"mapped",[1593,1604,1610,1607]],[[65016,65016],"mapped",[1608,1587,1604,1605]],[[65017,65017],"mapped",[1589,1604,1609]],[[65018,65018],"disallowed_STD3_mapped",[1589,1604,1609,32,1575,1604,1604,1607,32,1593,1604,1610,1607,32,1608,1587,1604,1605]],[[65019,65019],"disallowed_STD3_mapped",[1580,1604,32,1580,1604,1575,1604,1607]],[[65020,65020],"mapped",[1585,1740,1575,1604]],[[65021,65021],"valid",[],"NV8"],[[65022,65023],"disallowed"],[[65024,65039],"ignored"],[[65040,65040],"disallowed_STD3_mapped",[44]],[[65041,65041],"mapped",[12289]],[[65042,65042],"disallowed"],[[65043,65043],"disallowed_STD3_mapped",[58]],[[65044,65044],"disallowed_STD3_mapped",[59]],[[65045,65045],"disallowed_STD3_mapped",[33]],[[65046,65046],"disallowed_STD3_mapped",[63]],[[65047,65047],"mapped",[12310]],[[65048,65048],"mapped",[12311]],[[65049,65049],"disallowed"],[[65050,65055],"disallowed"],[[65056,65059],"valid"],[[65060,65062],"valid"],[[65063,65069],"valid"],[[65070,65071],"valid"],[[65072,65072],"disallowed"],[[65073,65073],"mapped",[8212]],[[65074,65074],"mapped",[8211]],[[65075,65076],"disallowed_STD3_mapped",[95]],[[65077,65077],"disallowed_STD3_mapped",[40]],[[65078,65078],"disallowed_STD3_mapped",[41]],[[65079,65079],"disallowed_STD3_mapped",[123]],[[65080,65080],"disallowed_STD3_mapped",[125]],[[65081,65081],"mapped",[12308]],[[65082,65082],"mapped",[12309]],[[65083,65083],"mapped",[12304]],[[65084,65084],"mapped",[12305]],[[65085,65085],"mapped",[12298]],[[65086,65086],"mapped",[12299]],[[65087,65087],"mapped",[12296]],[[65088,65088],"mapped",[12297]],[[65089,65089],"mapped",[12300]],[[65090,65090],"mapped",[12301]],[[65091,65091],"mapped",[12302]],[[65092,65092],"mapped",[12303]],[[65093,65094],"valid",[],"NV8"],[[65095,65095],"disallowed_STD3_mapped",[91]],[[65096,65096],"disallowed_STD3_mapped",[93]],[[65097,65100],"disallowed_STD3_mapped",[32,773]],[[65101,65103],"disallowed_STD3_mapped",[95]],[[65104,65104],"disallowed_STD3_mapped",[44]],[[65105,65105],"mapped",[12289]],[[65106,65106],"disallowed"],[[65107,65107],"disallowed"],[[65108,65108],"disallowed_STD3_mapped",[59]],[[65109,65109],"disallowed_STD3_mapped",[58]],[[65110,65110],"disallowed_STD3_mapped",[63]],[[65111,65111],"disallowed_STD3_mapped",[33]],[[65112,65112],"mapped",[8212]],[[65113,65113],"disallowed_STD3_mapped",[40]],[[65114,65114],"disallowed_STD3_mapped",[41]],[[65115,65115],"disallowed_STD3_mapped",[123]],[[65116,65116],"disallowed_STD3_mapped",[125]],[[65117,65117],"mapped",[12308]],[[65118,65118],"mapped",[12309]],[[65119,65119],"disallowed_STD3_mapped",[35]],[[65120,65120],"disallowed_STD3_mapped",[38]],[[65121,65121],"disallowed_STD3_mapped",[42]],[[65122,65122],"disallowed_STD3_mapped",[43]],[[65123,65123],"mapped",[45]],[[65124,65124],"disallowed_STD3_mapped",[60]],[[65125,65125],"disallowed_STD3_mapped",[62]],[[65126,65126],"disallowed_STD3_mapped",[61]],[[65127,65127],"disallowed"],[[65128,65128],"disallowed_STD3_mapped",[92]],[[65129,65129],"disallowed_STD3_mapped",[36]],[[65130,65130],"disallowed_STD3_mapped",[37]],[[65131,65131],"disallowed_STD3_mapped",[64]],[[65132,65135],"disallowed"],[[65136,65136],"disallowed_STD3_mapped",[32,1611]],[[65137,65137],"mapped",[1600,1611]],[[65138,65138],"disallowed_STD3_mapped",[32,1612]],[[65139,65139],"valid"],[[65140,65140],"disallowed_STD3_mapped",[32,1613]],[[65141,65141],"disallowed"],[[65142,65142],"disallowed_STD3_mapped",[32,1614]],[[65143,65143],"mapped",[1600,1614]],[[65144,65144],"disallowed_STD3_mapped",[32,1615]],[[65145,65145],"mapped",[1600,1615]],[[65146,65146],"disallowed_STD3_mapped",[32,1616]],[[65147,65147],"mapped",[1600,1616]],[[65148,65148],"disallowed_STD3_mapped",[32,1617]],[[65149,65149],"mapped",[1600,1617]],[[65150,65150],"disallowed_STD3_mapped",[32,1618]],[[65151,65151],"mapped",[1600,1618]],[[65152,65152],"mapped",[1569]],[[65153,65154],"mapped",[1570]],[[65155,65156],"mapped",[1571]],[[65157,65158],"mapped",[1572]],[[65159,65160],"mapped",[1573]],[[65161,65164],"mapped",[1574]],[[65165,65166],"mapped",[1575]],[[65167,65170],"mapped",[1576]],[[65171,65172],"mapped",[1577]],[[65173,65176],"mapped",[1578]],[[65177,65180],"mapped",[1579]],[[65181,65184],"mapped",[1580]],[[65185,65188],"mapped",[1581]],[[65189,65192],"mapped",[1582]],[[65193,65194],"mapped",[1583]],[[65195,65196],"mapped",[1584]],[[65197,65198],"mapped",[1585]],[[65199,65200],"mapped",[1586]],[[65201,65204],"mapped",[1587]],[[65205,65208],"mapped",[1588]],[[65209,65212],"mapped",[1589]],[[65213,65216],"mapped",[1590]],[[65217,65220],"mapped",[1591]],[[65221,65224],"mapped",[1592]],[[65225,65228],"mapped",[1593]],[[65229,65232],"mapped",[1594]],[[65233,65236],"mapped",[1601]],[[65237,65240],"mapped",[1602]],[[65241,65244],"mapped",[1603]],[[65245,65248],"mapped",[1604]],[[65249,65252],"mapped",[1605]],[[65253,65256],"mapped",[1606]],[[65257,65260],"mapped",[1607]],[[65261,65262],"mapped",[1608]],[[65263,65264],"mapped",[1609]],[[65265,65268],"mapped",[1610]],[[65269,65270],"mapped",[1604,1570]],[[65271,65272],"mapped",[1604,1571]],[[65273,65274],"mapped",[1604,1573]],[[65275,65276],"mapped",[1604,1575]],[[65277,65278],"disallowed"],[[65279,65279],"ignored"],[[65280,65280],"disallowed"],[[65281,65281],"disallowed_STD3_mapped",[33]],[[65282,65282],"disallowed_STD3_mapped",[34]],[[65283,65283],"disallowed_STD3_mapped",[35]],[[65284,65284],"disallowed_STD3_mapped",[36]],[[65285,65285],"disallowed_STD3_mapped",[37]],[[65286,65286],"disallowed_STD3_mapped",[38]],[[65287,65287],"disallowed_STD3_mapped",[39]],[[65288,65288],"disallowed_STD3_mapped",[40]],[[65289,65289],"disallowed_STD3_mapped",[41]],[[65290,65290],"disallowed_STD3_mapped",[42]],[[65291,65291],"disallowed_STD3_mapped",[43]],[[65292,65292],"disallowed_STD3_mapped",[44]],[[65293,65293],"mapped",[45]],[[65294,65294],"mapped",[46]],[[65295,65295],"disallowed_STD3_mapped",[47]],[[65296,65296],"mapped",[48]],[[65297,65297],"mapped",[49]],[[65298,65298],"mapped",[50]],[[65299,65299],"mapped",[51]],[[65300,65300],"mapped",[52]],[[65301,65301],"mapped",[53]],[[65302,65302],"mapped",[54]],[[65303,65303],"mapped",[55]],[[65304,65304],"mapped",[56]],[[65305,65305],"mapped",[57]],[[65306,65306],"disallowed_STD3_mapped",[58]],[[65307,65307],"disallowed_STD3_mapped",[59]],[[65308,65308],"disallowed_STD3_mapped",[60]],[[65309,65309],"disallowed_STD3_mapped",[61]],[[65310,65310],"disallowed_STD3_mapped",[62]],[[65311,65311],"disallowed_STD3_mapped",[63]],[[65312,65312],"disallowed_STD3_mapped",[64]],[[65313,65313],"mapped",[97]],[[65314,65314],"mapped",[98]],[[65315,65315],"mapped",[99]],[[65316,65316],"mapped",[100]],[[65317,65317],"mapped",[101]],[[65318,65318],"mapped",[102]],[[65319,65319],"mapped",[103]],[[65320,65320],"mapped",[104]],[[65321,65321],"mapped",[105]],[[65322,65322],"mapped",[106]],[[65323,65323],"mapped",[107]],[[65324,65324],"mapped",[108]],[[65325,65325],"mapped",[109]],[[65326,65326],"mapped",[110]],[[65327,65327],"mapped",[111]],[[65328,65328],"mapped",[112]],[[65329,65329],"mapped",[113]],[[65330,65330],"mapped",[114]],[[65331,65331],"mapped",[115]],[[65332,65332],"mapped",[116]],[[65333,65333],"mapped",[117]],[[65334,65334],"mapped",[118]],[[65335,65335],"mapped",[119]],[[65336,65336],"mapped",[120]],[[65337,65337],"mapped",[121]],[[65338,65338],"mapped",[122]],[[65339,65339],"disallowed_STD3_mapped",[91]],[[65340,65340],"disallowed_STD3_mapped",[92]],[[65341,65341],"disallowed_STD3_mapped",[93]],[[65342,65342],"disallowed_STD3_mapped",[94]],[[65343,65343],"disallowed_STD3_mapped",[95]],[[65344,65344],"disallowed_STD3_mapped",[96]],[[65345,65345],"mapped",[97]],[[65346,65346],"mapped",[98]],[[65347,65347],"mapped",[99]],[[65348,65348],"mapped",[100]],[[65349,65349],"mapped",[101]],[[65350,65350],"mapped",[102]],[[65351,65351],"mapped",[103]],[[65352,65352],"mapped",[104]],[[65353,65353],"mapped",[105]],[[65354,65354],"mapped",[106]],[[65355,65355],"mapped",[107]],[[65356,65356],"mapped",[108]],[[65357,65357],"mapped",[109]],[[65358,65358],"mapped",[110]],[[65359,65359],"mapped",[111]],[[65360,65360],"mapped",[112]],[[65361,65361],"mapped",[113]],[[65362,65362],"mapped",[114]],[[65363,65363],"mapped",[115]],[[65364,65364],"mapped",[116]],[[65365,65365],"mapped",[117]],[[65366,65366],"mapped",[118]],[[65367,65367],"mapped",[119]],[[65368,65368],"mapped",[120]],[[65369,65369],"mapped",[121]],[[65370,65370],"mapped",[122]],[[65371,65371],"disallowed_STD3_mapped",[123]],[[65372,65372],"disallowed_STD3_mapped",[124]],[[65373,65373],"disallowed_STD3_mapped",[125]],[[65374,65374],"disallowed_STD3_mapped",[126]],[[65375,65375],"mapped",[10629]],[[65376,65376],"mapped",[10630]],[[65377,65377],"mapped",[46]],[[65378,65378],"mapped",[12300]],[[65379,65379],"mapped",[12301]],[[65380,65380],"mapped",[12289]],[[65381,65381],"mapped",[12539]],[[65382,65382],"mapped",[12530]],[[65383,65383],"mapped",[12449]],[[65384,65384],"mapped",[12451]],[[65385,65385],"mapped",[12453]],[[65386,65386],"mapped",[12455]],[[65387,65387],"mapped",[12457]],[[65388,65388],"mapped",[12515]],[[65389,65389],"mapped",[12517]],[[65390,65390],"mapped",[12519]],[[65391,65391],"mapped",[12483]],[[65392,65392],"mapped",[12540]],[[65393,65393],"mapped",[12450]],[[65394,65394],"mapped",[12452]],[[65395,65395],"mapped",[12454]],[[65396,65396],"mapped",[12456]],[[65397,65397],"mapped",[12458]],[[65398,65398],"mapped",[12459]],[[65399,65399],"mapped",[12461]],[[65400,65400],"mapped",[12463]],[[65401,65401],"mapped",[12465]],[[65402,65402],"mapped",[12467]],[[65403,65403],"mapped",[12469]],[[65404,65404],"mapped",[12471]],[[65405,65405],"mapped",[12473]],[[65406,65406],"mapped",[12475]],[[65407,65407],"mapped",[12477]],[[65408,65408],"mapped",[12479]],[[65409,65409],"mapped",[12481]],[[65410,65410],"mapped",[12484]],[[65411,65411],"mapped",[12486]],[[65412,65412],"mapped",[12488]],[[65413,65413],"mapped",[12490]],[[65414,65414],"mapped",[12491]],[[65415,65415],"mapped",[12492]],[[65416,65416],"mapped",[12493]],[[65417,65417],"mapped",[12494]],[[65418,65418],"mapped",[12495]],[[65419,65419],"mapped",[12498]],[[65420,65420],"mapped",[12501]],[[65421,65421],"mapped",[12504]],[[65422,65422],"mapped",[12507]],[[65423,65423],"mapped",[12510]],[[65424,65424],"mapped",[12511]],[[65425,65425],"mapped",[12512]],[[65426,65426],"mapped",[12513]],[[65427,65427],"mapped",[12514]],[[65428,65428],"mapped",[12516]],[[65429,65429],"mapped",[12518]],[[65430,65430],"mapped",[12520]],[[65431,65431],"mapped",[12521]],[[65432,65432],"mapped",[12522]],[[65433,65433],"mapped",[12523]],[[65434,65434],"mapped",[12524]],[[65435,65435],"mapped",[12525]],[[65436,65436],"mapped",[12527]],[[65437,65437],"mapped",[12531]],[[65438,65438],"mapped",[12441]],[[65439,65439],"mapped",[12442]],[[65440,65440],"disallowed"],[[65441,65441],"mapped",[4352]],[[65442,65442],"mapped",[4353]],[[65443,65443],"mapped",[4522]],[[65444,65444],"mapped",[4354]],[[65445,65445],"mapped",[4524]],[[65446,65446],"mapped",[4525]],[[65447,65447],"mapped",[4355]],[[65448,65448],"mapped",[4356]],[[65449,65449],"mapped",[4357]],[[65450,65450],"mapped",[4528]],[[65451,65451],"mapped",[4529]],[[65452,65452],"mapped",[4530]],[[65453,65453],"mapped",[4531]],[[65454,65454],"mapped",[4532]],[[65455,65455],"mapped",[4533]],[[65456,65456],"mapped",[4378]],[[65457,65457],"mapped",[4358]],[[65458,65458],"mapped",[4359]],[[65459,65459],"mapped",[4360]],[[65460,65460],"mapped",[4385]],[[65461,65461],"mapped",[4361]],[[65462,65462],"mapped",[4362]],[[65463,65463],"mapped",[4363]],[[65464,65464],"mapped",[4364]],[[65465,65465],"mapped",[4365]],[[65466,65466],"mapped",[4366]],[[65467,65467],"mapped",[4367]],[[65468,65468],"mapped",[4368]],[[65469,65469],"mapped",[4369]],[[65470,65470],"mapped",[4370]],[[65471,65473],"disallowed"],[[65474,65474],"mapped",[4449]],[[65475,65475],"mapped",[4450]],[[65476,65476],"mapped",[4451]],[[65477,65477],"mapped",[4452]],[[65478,65478],"mapped",[4453]],[[65479,65479],"mapped",[4454]],[[65480,65481],"disallowed"],[[65482,65482],"mapped",[4455]],[[65483,65483],"mapped",[4456]],[[65484,65484],"mapped",[4457]],[[65485,65485],"mapped",[4458]],[[65486,65486],"mapped",[4459]],[[65487,65487],"mapped",[4460]],[[65488,65489],"disallowed"],[[65490,65490],"mapped",[4461]],[[65491,65491],"mapped",[4462]],[[65492,65492],"mapped",[4463]],[[65493,65493],"mapped",[4464]],[[65494,65494],"mapped",[4465]],[[65495,65495],"mapped",[4466]],[[65496,65497],"disallowed"],[[65498,65498],"mapped",[4467]],[[65499,65499],"mapped",[4468]],[[65500,65500],"mapped",[4469]],[[65501,65503],"disallowed"],[[65504,65504],"mapped",[162]],[[65505,65505],"mapped",[163]],[[65506,65506],"mapped",[172]],[[65507,65507],"disallowed_STD3_mapped",[32,772]],[[65508,65508],"mapped",[166]],[[65509,65509],"mapped",[165]],[[65510,65510],"mapped",[8361]],[[65511,65511],"disallowed"],[[65512,65512],"mapped",[9474]],[[65513,65513],"mapped",[8592]],[[65514,65514],"mapped",[8593]],[[65515,65515],"mapped",[8594]],[[65516,65516],"mapped",[8595]],[[65517,65517],"mapped",[9632]],[[65518,65518],"mapped",[9675]],[[65519,65528],"disallowed"],[[65529,65531],"disallowed"],[[65532,65532],"disallowed"],[[65533,65533],"disallowed"],[[65534,65535],"disallowed"],[[65536,65547],"valid"],[[65548,65548],"disallowed"],[[65549,65574],"valid"],[[65575,65575],"disallowed"],[[65576,65594],"valid"],[[65595,65595],"disallowed"],[[65596,65597],"valid"],[[65598,65598],"disallowed"],[[65599,65613],"valid"],[[65614,65615],"disallowed"],[[65616,65629],"valid"],[[65630,65663],"disallowed"],[[65664,65786],"valid"],[[65787,65791],"disallowed"],[[65792,65794],"valid",[],"NV8"],[[65795,65798],"disallowed"],[[65799,65843],"valid",[],"NV8"],[[65844,65846],"disallowed"],[[65847,65855],"valid",[],"NV8"],[[65856,65930],"valid",[],"NV8"],[[65931,65932],"valid",[],"NV8"],[[65933,65935],"disallowed"],[[65936,65947],"valid",[],"NV8"],[[65948,65951],"disallowed"],[[65952,65952],"valid",[],"NV8"],[[65953,65999],"disallowed"],[[66000,66044],"valid",[],"NV8"],[[66045,66045],"valid"],[[66046,66175],"disallowed"],[[66176,66204],"valid"],[[66205,66207],"disallowed"],[[66208,66256],"valid"],[[66257,66271],"disallowed"],[[66272,66272],"valid"],[[66273,66299],"valid",[],"NV8"],[[66300,66303],"disallowed"],[[66304,66334],"valid"],[[66335,66335],"valid"],[[66336,66339],"valid",[],"NV8"],[[66340,66351],"disallowed"],[[66352,66368],"valid"],[[66369,66369],"valid",[],"NV8"],[[66370,66377],"valid"],[[66378,66378],"valid",[],"NV8"],[[66379,66383],"disallowed"],[[66384,66426],"valid"],[[66427,66431],"disallowed"],[[66432,66461],"valid"],[[66462,66462],"disallowed"],[[66463,66463],"valid",[],"NV8"],[[66464,66499],"valid"],[[66500,66503],"disallowed"],[[66504,66511],"valid"],[[66512,66517],"valid",[],"NV8"],[[66518,66559],"disallowed"],[[66560,66560],"mapped",[66600]],[[66561,66561],"mapped",[66601]],[[66562,66562],"mapped",[66602]],[[66563,66563],"mapped",[66603]],[[66564,66564],"mapped",[66604]],[[66565,66565],"mapped",[66605]],[[66566,66566],"mapped",[66606]],[[66567,66567],"mapped",[66607]],[[66568,66568],"mapped",[66608]],[[66569,66569],"mapped",[66609]],[[66570,66570],"mapped",[66610]],[[66571,66571],"mapped",[66611]],[[66572,66572],"mapped",[66612]],[[66573,66573],"mapped",[66613]],[[66574,66574],"mapped",[66614]],[[66575,66575],"mapped",[66615]],[[66576,66576],"mapped",[66616]],[[66577,66577],"mapped",[66617]],[[66578,66578],"mapped",[66618]],[[66579,66579],"mapped",[66619]],[[66580,66580],"mapped",[66620]],[[66581,66581],"mapped",[66621]],[[66582,66582],"mapped",[66622]],[[66583,66583],"mapped",[66623]],[[66584,66584],"mapped",[66624]],[[66585,66585],"mapped",[66625]],[[66586,66586],"mapped",[66626]],[[66587,66587],"mapped",[66627]],[[66588,66588],"mapped",[66628]],[[66589,66589],"mapped",[66629]],[[66590,66590],"mapped",[66630]],[[66591,66591],"mapped",[66631]],[[66592,66592],"mapped",[66632]],[[66593,66593],"mapped",[66633]],[[66594,66594],"mapped",[66634]],[[66595,66595],"mapped",[66635]],[[66596,66596],"mapped",[66636]],[[66597,66597],"mapped",[66637]],[[66598,66598],"mapped",[66638]],[[66599,66599],"mapped",[66639]],[[66600,66637],"valid"],[[66638,66717],"valid"],[[66718,66719],"disallowed"],[[66720,66729],"valid"],[[66730,66815],"disallowed"],[[66816,66855],"valid"],[[66856,66863],"disallowed"],[[66864,66915],"valid"],[[66916,66926],"disallowed"],[[66927,66927],"valid",[],"NV8"],[[66928,67071],"disallowed"],[[67072,67382],"valid"],[[67383,67391],"disallowed"],[[67392,67413],"valid"],[[67414,67423],"disallowed"],[[67424,67431],"valid"],[[67432,67583],"disallowed"],[[67584,67589],"valid"],[[67590,67591],"disallowed"],[[67592,67592],"valid"],[[67593,67593],"disallowed"],[[67594,67637],"valid"],[[67638,67638],"disallowed"],[[67639,67640],"valid"],[[67641,67643],"disallowed"],[[67644,67644],"valid"],[[67645,67646],"disallowed"],[[67647,67647],"valid"],[[67648,67669],"valid"],[[67670,67670],"disallowed"],[[67671,67679],"valid",[],"NV8"],[[67680,67702],"valid"],[[67703,67711],"valid",[],"NV8"],[[67712,67742],"valid"],[[67743,67750],"disallowed"],[[67751,67759],"valid",[],"NV8"],[[67760,67807],"disallowed"],[[67808,67826],"valid"],[[67827,67827],"disallowed"],[[67828,67829],"valid"],[[67830,67834],"disallowed"],[[67835,67839],"valid",[],"NV8"],[[67840,67861],"valid"],[[67862,67865],"valid",[],"NV8"],[[67866,67867],"valid",[],"NV8"],[[67868,67870],"disallowed"],[[67871,67871],"valid",[],"NV8"],[[67872,67897],"valid"],[[67898,67902],"disallowed"],[[67903,67903],"valid",[],"NV8"],[[67904,67967],"disallowed"],[[67968,68023],"valid"],[[68024,68027],"disallowed"],[[68028,68029],"valid",[],"NV8"],[[68030,68031],"valid"],[[68032,68047],"valid",[],"NV8"],[[68048,68049],"disallowed"],[[68050,68095],"valid",[],"NV8"],[[68096,68099],"valid"],[[68100,68100],"disallowed"],[[68101,68102],"valid"],[[68103,68107],"disallowed"],[[68108,68115],"valid"],[[68116,68116],"disallowed"],[[68117,68119],"valid"],[[68120,68120],"disallowed"],[[68121,68147],"valid"],[[68148,68151],"disallowed"],[[68152,68154],"valid"],[[68155,68158],"disallowed"],[[68159,68159],"valid"],[[68160,68167],"valid",[],"NV8"],[[68168,68175],"disallowed"],[[68176,68184],"valid",[],"NV8"],[[68185,68191],"disallowed"],[[68192,68220],"valid"],[[68221,68223],"valid",[],"NV8"],[[68224,68252],"valid"],[[68253,68255],"valid",[],"NV8"],[[68256,68287],"disallowed"],[[68288,68295],"valid"],[[68296,68296],"valid",[],"NV8"],[[68297,68326],"valid"],[[68327,68330],"disallowed"],[[68331,68342],"valid",[],"NV8"],[[68343,68351],"disallowed"],[[68352,68405],"valid"],[[68406,68408],"disallowed"],[[68409,68415],"valid",[],"NV8"],[[68416,68437],"valid"],[[68438,68439],"disallowed"],[[68440,68447],"valid",[],"NV8"],[[68448,68466],"valid"],[[68467,68471],"disallowed"],[[68472,68479],"valid",[],"NV8"],[[68480,68497],"valid"],[[68498,68504],"disallowed"],[[68505,68508],"valid",[],"NV8"],[[68509,68520],"disallowed"],[[68521,68527],"valid",[],"NV8"],[[68528,68607],"disallowed"],[[68608,68680],"valid"],[[68681,68735],"disallowed"],[[68736,68736],"mapped",[68800]],[[68737,68737],"mapped",[68801]],[[68738,68738],"mapped",[68802]],[[68739,68739],"mapped",[68803]],[[68740,68740],"mapped",[68804]],[[68741,68741],"mapped",[68805]],[[68742,68742],"mapped",[68806]],[[68743,68743],"mapped",[68807]],[[68744,68744],"mapped",[68808]],[[68745,68745],"mapped",[68809]],[[68746,68746],"mapped",[68810]],[[68747,68747],"mapped",[68811]],[[68748,68748],"mapped",[68812]],[[68749,68749],"mapped",[68813]],[[68750,68750],"mapped",[68814]],[[68751,68751],"mapped",[68815]],[[68752,68752],"mapped",[68816]],[[68753,68753],"mapped",[68817]],[[68754,68754],"mapped",[68818]],[[68755,68755],"mapped",[68819]],[[68756,68756],"mapped",[68820]],[[68757,68757],"mapped",[68821]],[[68758,68758],"mapped",[68822]],[[68759,68759],"mapped",[68823]],[[68760,68760],"mapped",[68824]],[[68761,68761],"mapped",[68825]],[[68762,68762],"mapped",[68826]],[[68763,68763],"mapped",[68827]],[[68764,68764],"mapped",[68828]],[[68765,68765],"mapped",[68829]],[[68766,68766],"mapped",[68830]],[[68767,68767],"mapped",[68831]],[[68768,68768],"mapped",[68832]],[[68769,68769],"mapped",[68833]],[[68770,68770],"mapped",[68834]],[[68771,68771],"mapped",[68835]],[[68772,68772],"mapped",[68836]],[[68773,68773],"mapped",[68837]],[[68774,68774],"mapped",[68838]],[[68775,68775],"mapped",[68839]],[[68776,68776],"mapped",[68840]],[[68777,68777],"mapped",[68841]],[[68778,68778],"mapped",[68842]],[[68779,68779],"mapped",[68843]],[[68780,68780],"mapped",[68844]],[[68781,68781],"mapped",[68845]],[[68782,68782],"mapped",[68846]],[[68783,68783],"mapped",[68847]],[[68784,68784],"mapped",[68848]],[[68785,68785],"mapped",[68849]],[[68786,68786],"mapped",[68850]],[[68787,68799],"disallowed"],[[68800,68850],"valid"],[[68851,68857],"disallowed"],[[68858,68863],"valid",[],"NV8"],[[68864,69215],"disallowed"],[[69216,69246],"valid",[],"NV8"],[[69247,69631],"disallowed"],[[69632,69702],"valid"],[[69703,69709],"valid",[],"NV8"],[[69710,69713],"disallowed"],[[69714,69733],"valid",[],"NV8"],[[69734,69743],"valid"],[[69744,69758],"disallowed"],[[69759,69759],"valid"],[[69760,69818],"valid"],[[69819,69820],"valid",[],"NV8"],[[69821,69821],"disallowed"],[[69822,69825],"valid",[],"NV8"],[[69826,69839],"disallowed"],[[69840,69864],"valid"],[[69865,69871],"disallowed"],[[69872,69881],"valid"],[[69882,69887],"disallowed"],[[69888,69940],"valid"],[[69941,69941],"disallowed"],[[69942,69951],"valid"],[[69952,69955],"valid",[],"NV8"],[[69956,69967],"disallowed"],[[69968,70003],"valid"],[[70004,70005],"valid",[],"NV8"],[[70006,70006],"valid"],[[70007,70015],"disallowed"],[[70016,70084],"valid"],[[70085,70088],"valid",[],"NV8"],[[70089,70089],"valid",[],"NV8"],[[70090,70092],"valid"],[[70093,70093],"valid",[],"NV8"],[[70094,70095],"disallowed"],[[70096,70105],"valid"],[[70106,70106],"valid"],[[70107,70107],"valid",[],"NV8"],[[70108,70108],"valid"],[[70109,70111],"valid",[],"NV8"],[[70112,70112],"disallowed"],[[70113,70132],"valid",[],"NV8"],[[70133,70143],"disallowed"],[[70144,70161],"valid"],[[70162,70162],"disallowed"],[[70163,70199],"valid"],[[70200,70205],"valid",[],"NV8"],[[70206,70271],"disallowed"],[[70272,70278],"valid"],[[70279,70279],"disallowed"],[[70280,70280],"valid"],[[70281,70281],"disallowed"],[[70282,70285],"valid"],[[70286,70286],"disallowed"],[[70287,70301],"valid"],[[70302,70302],"disallowed"],[[70303,70312],"valid"],[[70313,70313],"valid",[],"NV8"],[[70314,70319],"disallowed"],[[70320,70378],"valid"],[[70379,70383],"disallowed"],[[70384,70393],"valid"],[[70394,70399],"disallowed"],[[70400,70400],"valid"],[[70401,70403],"valid"],[[70404,70404],"disallowed"],[[70405,70412],"valid"],[[70413,70414],"disallowed"],[[70415,70416],"valid"],[[70417,70418],"disallowed"],[[70419,70440],"valid"],[[70441,70441],"disallowed"],[[70442,70448],"valid"],[[70449,70449],"disallowed"],[[70450,70451],"valid"],[[70452,70452],"disallowed"],[[70453,70457],"valid"],[[70458,70459],"disallowed"],[[70460,70468],"valid"],[[70469,70470],"disallowed"],[[70471,70472],"valid"],[[70473,70474],"disallowed"],[[70475,70477],"valid"],[[70478,70479],"disallowed"],[[70480,70480],"valid"],[[70481,70486],"disallowed"],[[70487,70487],"valid"],[[70488,70492],"disallowed"],[[70493,70499],"valid"],[[70500,70501],"disallowed"],[[70502,70508],"valid"],[[70509,70511],"disallowed"],[[70512,70516],"valid"],[[70517,70783],"disallowed"],[[70784,70853],"valid"],[[70854,70854],"valid",[],"NV8"],[[70855,70855],"valid"],[[70856,70863],"disallowed"],[[70864,70873],"valid"],[[70874,71039],"disallowed"],[[71040,71093],"valid"],[[71094,71095],"disallowed"],[[71096,71104],"valid"],[[71105,71113],"valid",[],"NV8"],[[71114,71127],"valid",[],"NV8"],[[71128,71133],"valid"],[[71134,71167],"disallowed"],[[71168,71232],"valid"],[[71233,71235],"valid",[],"NV8"],[[71236,71236],"valid"],[[71237,71247],"disallowed"],[[71248,71257],"valid"],[[71258,71295],"disallowed"],[[71296,71351],"valid"],[[71352,71359],"disallowed"],[[71360,71369],"valid"],[[71370,71423],"disallowed"],[[71424,71449],"valid"],[[71450,71452],"disallowed"],[[71453,71467],"valid"],[[71468,71471],"disallowed"],[[71472,71481],"valid"],[[71482,71487],"valid",[],"NV8"],[[71488,71839],"disallowed"],[[71840,71840],"mapped",[71872]],[[71841,71841],"mapped",[71873]],[[71842,71842],"mapped",[71874]],[[71843,71843],"mapped",[71875]],[[71844,71844],"mapped",[71876]],[[71845,71845],"mapped",[71877]],[[71846,71846],"mapped",[71878]],[[71847,71847],"mapped",[71879]],[[71848,71848],"mapped",[71880]],[[71849,71849],"mapped",[71881]],[[71850,71850],"mapped",[71882]],[[71851,71851],"mapped",[71883]],[[71852,71852],"mapped",[71884]],[[71853,71853],"mapped",[71885]],[[71854,71854],"mapped",[71886]],[[71855,71855],"mapped",[71887]],[[71856,71856],"mapped",[71888]],[[71857,71857],"mapped",[71889]],[[71858,71858],"mapped",[71890]],[[71859,71859],"mapped",[71891]],[[71860,71860],"mapped",[71892]],[[71861,71861],"mapped",[71893]],[[71862,71862],"mapped",[71894]],[[71863,71863],"mapped",[71895]],[[71864,71864],"mapped",[71896]],[[71865,71865],"mapped",[71897]],[[71866,71866],"mapped",[71898]],[[71867,71867],"mapped",[71899]],[[71868,71868],"mapped",[71900]],[[71869,71869],"mapped",[71901]],[[71870,71870],"mapped",[71902]],[[71871,71871],"mapped",[71903]],[[71872,71913],"valid"],[[71914,71922],"valid",[],"NV8"],[[71923,71934],"disallowed"],[[71935,71935],"valid"],[[71936,72383],"disallowed"],[[72384,72440],"valid"],[[72441,73727],"disallowed"],[[73728,74606],"valid"],[[74607,74648],"valid"],[[74649,74649],"valid"],[[74650,74751],"disallowed"],[[74752,74850],"valid",[],"NV8"],[[74851,74862],"valid",[],"NV8"],[[74863,74863],"disallowed"],[[74864,74867],"valid",[],"NV8"],[[74868,74868],"valid",[],"NV8"],[[74869,74879],"disallowed"],[[74880,75075],"valid"],[[75076,77823],"disallowed"],[[77824,78894],"valid"],[[78895,82943],"disallowed"],[[82944,83526],"valid"],[[83527,92159],"disallowed"],[[92160,92728],"valid"],[[92729,92735],"disallowed"],[[92736,92766],"valid"],[[92767,92767],"disallowed"],[[92768,92777],"valid"],[[92778,92781],"disallowed"],[[92782,92783],"valid",[],"NV8"],[[92784,92879],"disallowed"],[[92880,92909],"valid"],[[92910,92911],"disallowed"],[[92912,92916],"valid"],[[92917,92917],"valid",[],"NV8"],[[92918,92927],"disallowed"],[[92928,92982],"valid"],[[92983,92991],"valid",[],"NV8"],[[92992,92995],"valid"],[[92996,92997],"valid",[],"NV8"],[[92998,93007],"disallowed"],[[93008,93017],"valid"],[[93018,93018],"disallowed"],[[93019,93025],"valid",[],"NV8"],[[93026,93026],"disallowed"],[[93027,93047],"valid"],[[93048,93052],"disallowed"],[[93053,93071],"valid"],[[93072,93951],"disallowed"],[[93952,94020],"valid"],[[94021,94031],"disallowed"],[[94032,94078],"valid"],[[94079,94094],"disallowed"],[[94095,94111],"valid"],[[94112,110591],"disallowed"],[[110592,110593],"valid"],[[110594,113663],"disallowed"],[[113664,113770],"valid"],[[113771,113775],"disallowed"],[[113776,113788],"valid"],[[113789,113791],"disallowed"],[[113792,113800],"valid"],[[113801,113807],"disallowed"],[[113808,113817],"valid"],[[113818,113819],"disallowed"],[[113820,113820],"valid",[],"NV8"],[[113821,113822],"valid"],[[113823,113823],"valid",[],"NV8"],[[113824,113827],"ignored"],[[113828,118783],"disallowed"],[[118784,119029],"valid",[],"NV8"],[[119030,119039],"disallowed"],[[119040,119078],"valid",[],"NV8"],[[119079,119080],"disallowed"],[[119081,119081],"valid",[],"NV8"],[[119082,119133],"valid",[],"NV8"],[[119134,119134],"mapped",[119127,119141]],[[119135,119135],"mapped",[119128,119141]],[[119136,119136],"mapped",[119128,119141,119150]],[[119137,119137],"mapped",[119128,119141,119151]],[[119138,119138],"mapped",[119128,119141,119152]],[[119139,119139],"mapped",[119128,119141,119153]],[[119140,119140],"mapped",[119128,119141,119154]],[[119141,119154],"valid",[],"NV8"],[[119155,119162],"disallowed"],[[119163,119226],"valid",[],"NV8"],[[119227,119227],"mapped",[119225,119141]],[[119228,119228],"mapped",[119226,119141]],[[119229,119229],"mapped",[119225,119141,119150]],[[119230,119230],"mapped",[119226,119141,119150]],[[119231,119231],"mapped",[119225,119141,119151]],[[119232,119232],"mapped",[119226,119141,119151]],[[119233,119261],"valid",[],"NV8"],[[119262,119272],"valid",[],"NV8"],[[119273,119295],"disallowed"],[[119296,119365],"valid",[],"NV8"],[[119366,119551],"disallowed"],[[119552,119638],"valid",[],"NV8"],[[119639,119647],"disallowed"],[[119648,119665],"valid",[],"NV8"],[[119666,119807],"disallowed"],[[119808,119808],"mapped",[97]],[[119809,119809],"mapped",[98]],[[119810,119810],"mapped",[99]],[[119811,119811],"mapped",[100]],[[119812,119812],"mapped",[101]],[[119813,119813],"mapped",[102]],[[119814,119814],"mapped",[103]],[[119815,119815],"mapped",[104]],[[119816,119816],"mapped",[105]],[[119817,119817],"mapped",[106]],[[119818,119818],"mapped",[107]],[[119819,119819],"mapped",[108]],[[119820,119820],"mapped",[109]],[[119821,119821],"mapped",[110]],[[119822,119822],"mapped",[111]],[[119823,119823],"mapped",[112]],[[119824,119824],"mapped",[113]],[[119825,119825],"mapped",[114]],[[119826,119826],"mapped",[115]],[[119827,119827],"mapped",[116]],[[119828,119828],"mapped",[117]],[[119829,119829],"mapped",[118]],[[119830,119830],"mapped",[119]],[[119831,119831],"mapped",[120]],[[119832,119832],"mapped",[121]],[[119833,119833],"mapped",[122]],[[119834,119834],"mapped",[97]],[[119835,119835],"mapped",[98]],[[119836,119836],"mapped",[99]],[[119837,119837],"mapped",[100]],[[119838,119838],"mapped",[101]],[[119839,119839],"mapped",[102]],[[119840,119840],"mapped",[103]],[[119841,119841],"mapped",[104]],[[119842,119842],"mapped",[105]],[[119843,119843],"mapped",[106]],[[119844,119844],"mapped",[107]],[[119845,119845],"mapped",[108]],[[119846,119846],"mapped",[109]],[[119847,119847],"mapped",[110]],[[119848,119848],"mapped",[111]],[[119849,119849],"mapped",[112]],[[119850,119850],"mapped",[113]],[[119851,119851],"mapped",[114]],[[119852,119852],"mapped",[115]],[[119853,119853],"mapped",[116]],[[119854,119854],"mapped",[117]],[[119855,119855],"mapped",[118]],[[119856,119856],"mapped",[119]],[[119857,119857],"mapped",[120]],[[119858,119858],"mapped",[121]],[[119859,119859],"mapped",[122]],[[119860,119860],"mapped",[97]],[[119861,119861],"mapped",[98]],[[119862,119862],"mapped",[99]],[[119863,119863],"mapped",[100]],[[119864,119864],"mapped",[101]],[[119865,119865],"mapped",[102]],[[119866,119866],"mapped",[103]],[[119867,119867],"mapped",[104]],[[119868,119868],"mapped",[105]],[[119869,119869],"mapped",[106]],[[119870,119870],"mapped",[107]],[[119871,119871],"mapped",[108]],[[119872,119872],"mapped",[109]],[[119873,119873],"mapped",[110]],[[119874,119874],"mapped",[111]],[[119875,119875],"mapped",[112]],[[119876,119876],"mapped",[113]],[[119877,119877],"mapped",[114]],[[119878,119878],"mapped",[115]],[[119879,119879],"mapped",[116]],[[119880,119880],"mapped",[117]],[[119881,119881],"mapped",[118]],[[119882,119882],"mapped",[119]],[[119883,119883],"mapped",[120]],[[119884,119884],"mapped",[121]],[[119885,119885],"mapped",[122]],[[119886,119886],"mapped",[97]],[[119887,119887],"mapped",[98]],[[119888,119888],"mapped",[99]],[[119889,119889],"mapped",[100]],[[119890,119890],"mapped",[101]],[[119891,119891],"mapped",[102]],[[119892,119892],"mapped",[103]],[[119893,119893],"disallowed"],[[119894,119894],"mapped",[105]],[[119895,119895],"mapped",[106]],[[119896,119896],"mapped",[107]],[[119897,119897],"mapped",[108]],[[119898,119898],"mapped",[109]],[[119899,119899],"mapped",[110]],[[119900,119900],"mapped",[111]],[[119901,119901],"mapped",[112]],[[119902,119902],"mapped",[113]],[[119903,119903],"mapped",[114]],[[119904,119904],"mapped",[115]],[[119905,119905],"mapped",[116]],[[119906,119906],"mapped",[117]],[[119907,119907],"mapped",[118]],[[119908,119908],"mapped",[119]],[[119909,119909],"mapped",[120]],[[119910,119910],"mapped",[121]],[[119911,119911],"mapped",[122]],[[119912,119912],"mapped",[97]],[[119913,119913],"mapped",[98]],[[119914,119914],"mapped",[99]],[[119915,119915],"mapped",[100]],[[119916,119916],"mapped",[101]],[[119917,119917],"mapped",[102]],[[119918,119918],"mapped",[103]],[[119919,119919],"mapped",[104]],[[119920,119920],"mapped",[105]],[[119921,119921],"mapped",[106]],[[119922,119922],"mapped",[107]],[[119923,119923],"mapped",[108]],[[119924,119924],"mapped",[109]],[[119925,119925],"mapped",[110]],[[119926,119926],"mapped",[111]],[[119927,119927],"mapped",[112]],[[119928,119928],"mapped",[113]],[[119929,119929],"mapped",[114]],[[119930,119930],"mapped",[115]],[[119931,119931],"mapped",[116]],[[119932,119932],"mapped",[117]],[[119933,119933],"mapped",[118]],[[119934,119934],"mapped",[119]],[[119935,119935],"mapped",[120]],[[119936,119936],"mapped",[121]],[[119937,119937],"mapped",[122]],[[119938,119938],"mapped",[97]],[[119939,119939],"mapped",[98]],[[119940,119940],"mapped",[99]],[[119941,119941],"mapped",[100]],[[119942,119942],"mapped",[101]],[[119943,119943],"mapped",[102]],[[119944,119944],"mapped",[103]],[[119945,119945],"mapped",[104]],[[119946,119946],"mapped",[105]],[[119947,119947],"mapped",[106]],[[119948,119948],"mapped",[107]],[[119949,119949],"mapped",[108]],[[119950,119950],"mapped",[109]],[[119951,119951],"mapped",[110]],[[119952,119952],"mapped",[111]],[[119953,119953],"mapped",[112]],[[119954,119954],"mapped",[113]],[[119955,119955],"mapped",[114]],[[119956,119956],"mapped",[115]],[[119957,119957],"mapped",[116]],[[119958,119958],"mapped",[117]],[[119959,119959],"mapped",[118]],[[119960,119960],"mapped",[119]],[[119961,119961],"mapped",[120]],[[119962,119962],"mapped",[121]],[[119963,119963],"mapped",[122]],[[119964,119964],"mapped",[97]],[[119965,119965],"disallowed"],[[119966,119966],"mapped",[99]],[[119967,119967],"mapped",[100]],[[119968,119969],"disallowed"],[[119970,119970],"mapped",[103]],[[119971,119972],"disallowed"],[[119973,119973],"mapped",[106]],[[119974,119974],"mapped",[107]],[[119975,119976],"disallowed"],[[119977,119977],"mapped",[110]],[[119978,119978],"mapped",[111]],[[119979,119979],"mapped",[112]],[[119980,119980],"mapped",[113]],[[119981,119981],"disallowed"],[[119982,119982],"mapped",[115]],[[119983,119983],"mapped",[116]],[[119984,119984],"mapped",[117]],[[119985,119985],"mapped",[118]],[[119986,119986],"mapped",[119]],[[119987,119987],"mapped",[120]],[[119988,119988],"mapped",[121]],[[119989,119989],"mapped",[122]],[[119990,119990],"mapped",[97]],[[119991,119991],"mapped",[98]],[[119992,119992],"mapped",[99]],[[119993,119993],"mapped",[100]],[[119994,119994],"disallowed"],[[119995,119995],"mapped",[102]],[[119996,119996],"disallowed"],[[119997,119997],"mapped",[104]],[[119998,119998],"mapped",[105]],[[119999,119999],"mapped",[106]],[[120000,120000],"mapped",[107]],[[120001,120001],"mapped",[108]],[[120002,120002],"mapped",[109]],[[120003,120003],"mapped",[110]],[[120004,120004],"disallowed"],[[120005,120005],"mapped",[112]],[[120006,120006],"mapped",[113]],[[120007,120007],"mapped",[114]],[[120008,120008],"mapped",[115]],[[120009,120009],"mapped",[116]],[[120010,120010],"mapped",[117]],[[120011,120011],"mapped",[118]],[[120012,120012],"mapped",[119]],[[120013,120013],"mapped",[120]],[[120014,120014],"mapped",[121]],[[120015,120015],"mapped",[122]],[[120016,120016],"mapped",[97]],[[120017,120017],"mapped",[98]],[[120018,120018],"mapped",[99]],[[120019,120019],"mapped",[100]],[[120020,120020],"mapped",[101]],[[120021,120021],"mapped",[102]],[[120022,120022],"mapped",[103]],[[120023,120023],"mapped",[104]],[[120024,120024],"mapped",[105]],[[120025,120025],"mapped",[106]],[[120026,120026],"mapped",[107]],[[120027,120027],"mapped",[108]],[[120028,120028],"mapped",[109]],[[120029,120029],"mapped",[110]],[[120030,120030],"mapped",[111]],[[120031,120031],"mapped",[112]],[[120032,120032],"mapped",[113]],[[120033,120033],"mapped",[114]],[[120034,120034],"mapped",[115]],[[120035,120035],"mapped",[116]],[[120036,120036],"mapped",[117]],[[120037,120037],"mapped",[118]],[[120038,120038],"mapped",[119]],[[120039,120039],"mapped",[120]],[[120040,120040],"mapped",[121]],[[120041,120041],"mapped",[122]],[[120042,120042],"mapped",[97]],[[120043,120043],"mapped",[98]],[[120044,120044],"mapped",[99]],[[120045,120045],"mapped",[100]],[[120046,120046],"mapped",[101]],[[120047,120047],"mapped",[102]],[[120048,120048],"mapped",[103]],[[120049,120049],"mapped",[104]],[[120050,120050],"mapped",[105]],[[120051,120051],"mapped",[106]],[[120052,120052],"mapped",[107]],[[120053,120053],"mapped",[108]],[[120054,120054],"mapped",[109]],[[120055,120055],"mapped",[110]],[[120056,120056],"mapped",[111]],[[120057,120057],"mapped",[112]],[[120058,120058],"mapped",[113]],[[120059,120059],"mapped",[114]],[[120060,120060],"mapped",[115]],[[120061,120061],"mapped",[116]],[[120062,120062],"mapped",[117]],[[120063,120063],"mapped",[118]],[[120064,120064],"mapped",[119]],[[120065,120065],"mapped",[120]],[[120066,120066],"mapped",[121]],[[120067,120067],"mapped",[122]],[[120068,120068],"mapped",[97]],[[120069,120069],"mapped",[98]],[[120070,120070],"disallowed"],[[120071,120071],"mapped",[100]],[[120072,120072],"mapped",[101]],[[120073,120073],"mapped",[102]],[[120074,120074],"mapped",[103]],[[120075,120076],"disallowed"],[[120077,120077],"mapped",[106]],[[120078,120078],"mapped",[107]],[[120079,120079],"mapped",[108]],[[120080,120080],"mapped",[109]],[[120081,120081],"mapped",[110]],[[120082,120082],"mapped",[111]],[[120083,120083],"mapped",[112]],[[120084,120084],"mapped",[113]],[[120085,120085],"disallowed"],[[120086,120086],"mapped",[115]],[[120087,120087],"mapped",[116]],[[120088,120088],"mapped",[117]],[[120089,120089],"mapped",[118]],[[120090,120090],"mapped",[119]],[[120091,120091],"mapped",[120]],[[120092,120092],"mapped",[121]],[[120093,120093],"disallowed"],[[120094,120094],"mapped",[97]],[[120095,120095],"mapped",[98]],[[120096,120096],"mapped",[99]],[[120097,120097],"mapped",[100]],[[120098,120098],"mapped",[101]],[[120099,120099],"mapped",[102]],[[120100,120100],"mapped",[103]],[[120101,120101],"mapped",[104]],[[120102,120102],"mapped",[105]],[[120103,120103],"mapped",[106]],[[120104,120104],"mapped",[107]],[[120105,120105],"mapped",[108]],[[120106,120106],"mapped",[109]],[[120107,120107],"mapped",[110]],[[120108,120108],"mapped",[111]],[[120109,120109],"mapped",[112]],[[120110,120110],"mapped",[113]],[[120111,120111],"mapped",[114]],[[120112,120112],"mapped",[115]],[[120113,120113],"mapped",[116]],[[120114,120114],"mapped",[117]],[[120115,120115],"mapped",[118]],[[120116,120116],"mapped",[119]],[[120117,120117],"mapped",[120]],[[120118,120118],"mapped",[121]],[[120119,120119],"mapped",[122]],[[120120,120120],"mapped",[97]],[[120121,120121],"mapped",[98]],[[120122,120122],"disallowed"],[[120123,120123],"mapped",[100]],[[120124,120124],"mapped",[101]],[[120125,120125],"mapped",[102]],[[120126,120126],"mapped",[103]],[[120127,120127],"disallowed"],[[120128,120128],"mapped",[105]],[[120129,120129],"mapped",[106]],[[120130,120130],"mapped",[107]],[[120131,120131],"mapped",[108]],[[120132,120132],"mapped",[109]],[[120133,120133],"disallowed"],[[120134,120134],"mapped",[111]],[[120135,120137],"disallowed"],[[120138,120138],"mapped",[115]],[[120139,120139],"mapped",[116]],[[120140,120140],"mapped",[117]],[[120141,120141],"mapped",[118]],[[120142,120142],"mapped",[119]],[[120143,120143],"mapped",[120]],[[120144,120144],"mapped",[121]],[[120145,120145],"disallowed"],[[120146,120146],"mapped",[97]],[[120147,120147],"mapped",[98]],[[120148,120148],"mapped",[99]],[[120149,120149],"mapped",[100]],[[120150,120150],"mapped",[101]],[[120151,120151],"mapped",[102]],[[120152,120152],"mapped",[103]],[[120153,120153],"mapped",[104]],[[120154,120154],"mapped",[105]],[[120155,120155],"mapped",[106]],[[120156,120156],"mapped",[107]],[[120157,120157],"mapped",[108]],[[120158,120158],"mapped",[109]],[[120159,120159],"mapped",[110]],[[120160,120160],"mapped",[111]],[[120161,120161],"mapped",[112]],[[120162,120162],"mapped",[113]],[[120163,120163],"mapped",[114]],[[120164,120164],"mapped",[115]],[[120165,120165],"mapped",[116]],[[120166,120166],"mapped",[117]],[[120167,120167],"mapped",[118]],[[120168,120168],"mapped",[119]],[[120169,120169],"mapped",[120]],[[120170,120170],"mapped",[121]],[[120171,120171],"mapped",[122]],[[120172,120172],"mapped",[97]],[[120173,120173],"mapped",[98]],[[120174,120174],"mapped",[99]],[[120175,120175],"mapped",[100]],[[120176,120176],"mapped",[101]],[[120177,120177],"mapped",[102]],[[120178,120178],"mapped",[103]],[[120179,120179],"mapped",[104]],[[120180,120180],"mapped",[105]],[[120181,120181],"mapped",[106]],[[120182,120182],"mapped",[107]],[[120183,120183],"mapped",[108]],[[120184,120184],"mapped",[109]],[[120185,120185],"mapped",[110]],[[120186,120186],"mapped",[111]],[[120187,120187],"mapped",[112]],[[120188,120188],"mapped",[113]],[[120189,120189],"mapped",[114]],[[120190,120190],"mapped",[115]],[[120191,120191],"mapped",[116]],[[120192,120192],"mapped",[117]],[[120193,120193],"mapped",[118]],[[120194,120194],"mapped",[119]],[[120195,120195],"mapped",[120]],[[120196,120196],"mapped",[121]],[[120197,120197],"mapped",[122]],[[120198,120198],"mapped",[97]],[[120199,120199],"mapped",[98]],[[120200,120200],"mapped",[99]],[[120201,120201],"mapped",[100]],[[120202,120202],"mapped",[101]],[[120203,120203],"mapped",[102]],[[120204,120204],"mapped",[103]],[[120205,120205],"mapped",[104]],[[120206,120206],"mapped",[105]],[[120207,120207],"mapped",[106]],[[120208,120208],"mapped",[107]],[[120209,120209],"mapped",[108]],[[120210,120210],"mapped",[109]],[[120211,120211],"mapped",[110]],[[120212,120212],"mapped",[111]],[[120213,120213],"mapped",[112]],[[120214,120214],"mapped",[113]],[[120215,120215],"mapped",[114]],[[120216,120216],"mapped",[115]],[[120217,120217],"mapped",[116]],[[120218,120218],"mapped",[117]],[[120219,120219],"mapped",[118]],[[120220,120220],"mapped",[119]],[[120221,120221],"mapped",[120]],[[120222,120222],"mapped",[121]],[[120223,120223],"mapped",[122]],[[120224,120224],"mapped",[97]],[[120225,120225],"mapped",[98]],[[120226,120226],"mapped",[99]],[[120227,120227],"mapped",[100]],[[120228,120228],"mapped",[101]],[[120229,120229],"mapped",[102]],[[120230,120230],"mapped",[103]],[[120231,120231],"mapped",[104]],[[120232,120232],"mapped",[105]],[[120233,120233],"mapped",[106]],[[120234,120234],"mapped",[107]],[[120235,120235],"mapped",[108]],[[120236,120236],"mapped",[109]],[[120237,120237],"mapped",[110]],[[120238,120238],"mapped",[111]],[[120239,120239],"mapped",[112]],[[120240,120240],"mapped",[113]],[[120241,120241],"mapped",[114]],[[120242,120242],"mapped",[115]],[[120243,120243],"mapped",[116]],[[120244,120244],"mapped",[117]],[[120245,120245],"mapped",[118]],[[120246,120246],"mapped",[119]],[[120247,120247],"mapped",[120]],[[120248,120248],"mapped",[121]],[[120249,120249],"mapped",[122]],[[120250,120250],"mapped",[97]],[[120251,120251],"mapped",[98]],[[120252,120252],"mapped",[99]],[[120253,120253],"mapped",[100]],[[120254,120254],"mapped",[101]],[[120255,120255],"mapped",[102]],[[120256,120256],"mapped",[103]],[[120257,120257],"mapped",[104]],[[120258,120258],"mapped",[105]],[[120259,120259],"mapped",[106]],[[120260,120260],"mapped",[107]],[[120261,120261],"mapped",[108]],[[120262,120262],"mapped",[109]],[[120263,120263],"mapped",[110]],[[120264,120264],"mapped",[111]],[[120265,120265],"mapped",[112]],[[120266,120266],"mapped",[113]],[[120267,120267],"mapped",[114]],[[120268,120268],"mapped",[115]],[[120269,120269],"mapped",[116]],[[120270,120270],"mapped",[117]],[[120271,120271],"mapped",[118]],[[120272,120272],"mapped",[119]],[[120273,120273],"mapped",[120]],[[120274,120274],"mapped",[121]],[[120275,120275],"mapped",[122]],[[120276,120276],"mapped",[97]],[[120277,120277],"mapped",[98]],[[120278,120278],"mapped",[99]],[[120279,120279],"mapped",[100]],[[120280,120280],"mapped",[101]],[[120281,120281],"mapped",[102]],[[120282,120282],"mapped",[103]],[[120283,120283],"mapped",[104]],[[120284,120284],"mapped",[105]],[[120285,120285],"mapped",[106]],[[120286,120286],"mapped",[107]],[[120287,120287],"mapped",[108]],[[120288,120288],"mapped",[109]],[[120289,120289],"mapped",[110]],[[120290,120290],"mapped",[111]],[[120291,120291],"mapped",[112]],[[120292,120292],"mapped",[113]],[[120293,120293],"mapped",[114]],[[120294,120294],"mapped",[115]],[[120295,120295],"mapped",[116]],[[120296,120296],"mapped",[117]],[[120297,120297],"mapped",[118]],[[120298,120298],"mapped",[119]],[[120299,120299],"mapped",[120]],[[120300,120300],"mapped",[121]],[[120301,120301],"mapped",[122]],[[120302,120302],"mapped",[97]],[[120303,120303],"mapped",[98]],[[120304,120304],"mapped",[99]],[[120305,120305],"mapped",[100]],[[120306,120306],"mapped",[101]],[[120307,120307],"mapped",[102]],[[120308,120308],"mapped",[103]],[[120309,120309],"mapped",[104]],[[120310,120310],"mapped",[105]],[[120311,120311],"mapped",[106]],[[120312,120312],"mapped",[107]],[[120313,120313],"mapped",[108]],[[120314,120314],"mapped",[109]],[[120315,120315],"mapped",[110]],[[120316,120316],"mapped",[111]],[[120317,120317],"mapped",[112]],[[120318,120318],"mapped",[113]],[[120319,120319],"mapped",[114]],[[120320,120320],"mapped",[115]],[[120321,120321],"mapped",[116]],[[120322,120322],"mapped",[117]],[[120323,120323],"mapped",[118]],[[120324,120324],"mapped",[119]],[[120325,120325],"mapped",[120]],[[120326,120326],"mapped",[121]],[[120327,120327],"mapped",[122]],[[120328,120328],"mapped",[97]],[[120329,120329],"mapped",[98]],[[120330,120330],"mapped",[99]],[[120331,120331],"mapped",[100]],[[120332,120332],"mapped",[101]],[[120333,120333],"mapped",[102]],[[120334,120334],"mapped",[103]],[[120335,120335],"mapped",[104]],[[120336,120336],"mapped",[105]],[[120337,120337],"mapped",[106]],[[120338,120338],"mapped",[107]],[[120339,120339],"mapped",[108]],[[120340,120340],"mapped",[109]],[[120341,120341],"mapped",[110]],[[120342,120342],"mapped",[111]],[[120343,120343],"mapped",[112]],[[120344,120344],"mapped",[113]],[[120345,120345],"mapped",[114]],[[120346,120346],"mapped",[115]],[[120347,120347],"mapped",[116]],[[120348,120348],"mapped",[117]],[[120349,120349],"mapped",[118]],[[120350,120350],"mapped",[119]],[[120351,120351],"mapped",[120]],[[120352,120352],"mapped",[121]],[[120353,120353],"mapped",[122]],[[120354,120354],"mapped",[97]],[[120355,120355],"mapped",[98]],[[120356,120356],"mapped",[99]],[[120357,120357],"mapped",[100]],[[120358,120358],"mapped",[101]],[[120359,120359],"mapped",[102]],[[120360,120360],"mapped",[103]],[[120361,120361],"mapped",[104]],[[120362,120362],"mapped",[105]],[[120363,120363],"mapped",[106]],[[120364,120364],"mapped",[107]],[[120365,120365],"mapped",[108]],[[120366,120366],"mapped",[109]],[[120367,120367],"mapped",[110]],[[120368,120368],"mapped",[111]],[[120369,120369],"mapped",[112]],[[120370,120370],"mapped",[113]],[[120371,120371],"mapped",[114]],[[120372,120372],"mapped",[115]],[[120373,120373],"mapped",[116]],[[120374,120374],"mapped",[117]],[[120375,120375],"mapped",[118]],[[120376,120376],"mapped",[119]],[[120377,120377],"mapped",[120]],[[120378,120378],"mapped",[121]],[[120379,120379],"mapped",[122]],[[120380,120380],"mapped",[97]],[[120381,120381],"mapped",[98]],[[120382,120382],"mapped",[99]],[[120383,120383],"mapped",[100]],[[120384,120384],"mapped",[101]],[[120385,120385],"mapped",[102]],[[120386,120386],"mapped",[103]],[[120387,120387],"mapped",[104]],[[120388,120388],"mapped",[105]],[[120389,120389],"mapped",[106]],[[120390,120390],"mapped",[107]],[[120391,120391],"mapped",[108]],[[120392,120392],"mapped",[109]],[[120393,120393],"mapped",[110]],[[120394,120394],"mapped",[111]],[[120395,120395],"mapped",[112]],[[120396,120396],"mapped",[113]],[[120397,120397],"mapped",[114]],[[120398,120398],"mapped",[115]],[[120399,120399],"mapped",[116]],[[120400,120400],"mapped",[117]],[[120401,120401],"mapped",[118]],[[120402,120402],"mapped",[119]],[[120403,120403],"mapped",[120]],[[120404,120404],"mapped",[121]],[[120405,120405],"mapped",[122]],[[120406,120406],"mapped",[97]],[[120407,120407],"mapped",[98]],[[120408,120408],"mapped",[99]],[[120409,120409],"mapped",[100]],[[120410,120410],"mapped",[101]],[[120411,120411],"mapped",[102]],[[120412,120412],"mapped",[103]],[[120413,120413],"mapped",[104]],[[120414,120414],"mapped",[105]],[[120415,120415],"mapped",[106]],[[120416,120416],"mapped",[107]],[[120417,120417],"mapped",[108]],[[120418,120418],"mapped",[109]],[[120419,120419],"mapped",[110]],[[120420,120420],"mapped",[111]],[[120421,120421],"mapped",[112]],[[120422,120422],"mapped",[113]],[[120423,120423],"mapped",[114]],[[120424,120424],"mapped",[115]],[[120425,120425],"mapped",[116]],[[120426,120426],"mapped",[117]],[[120427,120427],"mapped",[118]],[[120428,120428],"mapped",[119]],[[120429,120429],"mapped",[120]],[[120430,120430],"mapped",[121]],[[120431,120431],"mapped",[122]],[[120432,120432],"mapped",[97]],[[120433,120433],"mapped",[98]],[[120434,120434],"mapped",[99]],[[120435,120435],"mapped",[100]],[[120436,120436],"mapped",[101]],[[120437,120437],"mapped",[102]],[[120438,120438],"mapped",[103]],[[120439,120439],"mapped",[104]],[[120440,120440],"mapped",[105]],[[120441,120441],"mapped",[106]],[[120442,120442],"mapped",[107]],[[120443,120443],"mapped",[108]],[[120444,120444],"mapped",[109]],[[120445,120445],"mapped",[110]],[[120446,120446],"mapped",[111]],[[120447,120447],"mapped",[112]],[[120448,120448],"mapped",[113]],[[120449,120449],"mapped",[114]],[[120450,120450],"mapped",[115]],[[120451,120451],"mapped",[116]],[[120452,120452],"mapped",[117]],[[120453,120453],"mapped",[118]],[[120454,120454],"mapped",[119]],[[120455,120455],"mapped",[120]],[[120456,120456],"mapped",[121]],[[120457,120457],"mapped",[122]],[[120458,120458],"mapped",[97]],[[120459,120459],"mapped",[98]],[[120460,120460],"mapped",[99]],[[120461,120461],"mapped",[100]],[[120462,120462],"mapped",[101]],[[120463,120463],"mapped",[102]],[[120464,120464],"mapped",[103]],[[120465,120465],"mapped",[104]],[[120466,120466],"mapped",[105]],[[120467,120467],"mapped",[106]],[[120468,120468],"mapped",[107]],[[120469,120469],"mapped",[108]],[[120470,120470],"mapped",[109]],[[120471,120471],"mapped",[110]],[[120472,120472],"mapped",[111]],[[120473,120473],"mapped",[112]],[[120474,120474],"mapped",[113]],[[120475,120475],"mapped",[114]],[[120476,120476],"mapped",[115]],[[120477,120477],"mapped",[116]],[[120478,120478],"mapped",[117]],[[120479,120479],"mapped",[118]],[[120480,120480],"mapped",[119]],[[120481,120481],"mapped",[120]],[[120482,120482],"mapped",[121]],[[120483,120483],"mapped",[122]],[[120484,120484],"mapped",[305]],[[120485,120485],"mapped",[567]],[[120486,120487],"disallowed"],[[120488,120488],"mapped",[945]],[[120489,120489],"mapped",[946]],[[120490,120490],"mapped",[947]],[[120491,120491],"mapped",[948]],[[120492,120492],"mapped",[949]],[[120493,120493],"mapped",[950]],[[120494,120494],"mapped",[951]],[[120495,120495],"mapped",[952]],[[120496,120496],"mapped",[953]],[[120497,120497],"mapped",[954]],[[120498,120498],"mapped",[955]],[[120499,120499],"mapped",[956]],[[120500,120500],"mapped",[957]],[[120501,120501],"mapped",[958]],[[120502,120502],"mapped",[959]],[[120503,120503],"mapped",[960]],[[120504,120504],"mapped",[961]],[[120505,120505],"mapped",[952]],[[120506,120506],"mapped",[963]],[[120507,120507],"mapped",[964]],[[120508,120508],"mapped",[965]],[[120509,120509],"mapped",[966]],[[120510,120510],"mapped",[967]],[[120511,120511],"mapped",[968]],[[120512,120512],"mapped",[969]],[[120513,120513],"mapped",[8711]],[[120514,120514],"mapped",[945]],[[120515,120515],"mapped",[946]],[[120516,120516],"mapped",[947]],[[120517,120517],"mapped",[948]],[[120518,120518],"mapped",[949]],[[120519,120519],"mapped",[950]],[[120520,120520],"mapped",[951]],[[120521,120521],"mapped",[952]],[[120522,120522],"mapped",[953]],[[120523,120523],"mapped",[954]],[[120524,120524],"mapped",[955]],[[120525,120525],"mapped",[956]],[[120526,120526],"mapped",[957]],[[120527,120527],"mapped",[958]],[[120528,120528],"mapped",[959]],[[120529,120529],"mapped",[960]],[[120530,120530],"mapped",[961]],[[120531,120532],"mapped",[963]],[[120533,120533],"mapped",[964]],[[120534,120534],"mapped",[965]],[[120535,120535],"mapped",[966]],[[120536,120536],"mapped",[967]],[[120537,120537],"mapped",[968]],[[120538,120538],"mapped",[969]],[[120539,120539],"mapped",[8706]],[[120540,120540],"mapped",[949]],[[120541,120541],"mapped",[952]],[[120542,120542],"mapped",[954]],[[120543,120543],"mapped",[966]],[[120544,120544],"mapped",[961]],[[120545,120545],"mapped",[960]],[[120546,120546],"mapped",[945]],[[120547,120547],"mapped",[946]],[[120548,120548],"mapped",[947]],[[120549,120549],"mapped",[948]],[[120550,120550],"mapped",[949]],[[120551,120551],"mapped",[950]],[[120552,120552],"mapped",[951]],[[120553,120553],"mapped",[952]],[[120554,120554],"mapped",[953]],[[120555,120555],"mapped",[954]],[[120556,120556],"mapped",[955]],[[120557,120557],"mapped",[956]],[[120558,120558],"mapped",[957]],[[120559,120559],"mapped",[958]],[[120560,120560],"mapped",[959]],[[120561,120561],"mapped",[960]],[[120562,120562],"mapped",[961]],[[120563,120563],"mapped",[952]],[[120564,120564],"mapped",[963]],[[120565,120565],"mapped",[964]],[[120566,120566],"mapped",[965]],[[120567,120567],"mapped",[966]],[[120568,120568],"mapped",[967]],[[120569,120569],"mapped",[968]],[[120570,120570],"mapped",[969]],[[120571,120571],"mapped",[8711]],[[120572,120572],"mapped",[945]],[[120573,120573],"mapped",[946]],[[120574,120574],"mapped",[947]],[[120575,120575],"mapped",[948]],[[120576,120576],"mapped",[949]],[[120577,120577],"mapped",[950]],[[120578,120578],"mapped",[951]],[[120579,120579],"mapped",[952]],[[120580,120580],"mapped",[953]],[[120581,120581],"mapped",[954]],[[120582,120582],"mapped",[955]],[[120583,120583],"mapped",[956]],[[120584,120584],"mapped",[957]],[[120585,120585],"mapped",[958]],[[120586,120586],"mapped",[959]],[[120587,120587],"mapped",[960]],[[120588,120588],"mapped",[961]],[[120589,120590],"mapped",[963]],[[120591,120591],"mapped",[964]],[[120592,120592],"mapped",[965]],[[120593,120593],"mapped",[966]],[[120594,120594],"mapped",[967]],[[120595,120595],"mapped",[968]],[[120596,120596],"mapped",[969]],[[120597,120597],"mapped",[8706]],[[120598,120598],"mapped",[949]],[[120599,120599],"mapped",[952]],[[120600,120600],"mapped",[954]],[[120601,120601],"mapped",[966]],[[120602,120602],"mapped",[961]],[[120603,120603],"mapped",[960]],[[120604,120604],"mapped",[945]],[[120605,120605],"mapped",[946]],[[120606,120606],"mapped",[947]],[[120607,120607],"mapped",[948]],[[120608,120608],"mapped",[949]],[[120609,120609],"mapped",[950]],[[120610,120610],"mapped",[951]],[[120611,120611],"mapped",[952]],[[120612,120612],"mapped",[953]],[[120613,120613],"mapped",[954]],[[120614,120614],"mapped",[955]],[[120615,120615],"mapped",[956]],[[120616,120616],"mapped",[957]],[[120617,120617],"mapped",[958]],[[120618,120618],"mapped",[959]],[[120619,120619],"mapped",[960]],[[120620,120620],"mapped",[961]],[[120621,120621],"mapped",[952]],[[120622,120622],"mapped",[963]],[[120623,120623],"mapped",[964]],[[120624,120624],"mapped",[965]],[[120625,120625],"mapped",[966]],[[120626,120626],"mapped",[967]],[[120627,120627],"mapped",[968]],[[120628,120628],"mapped",[969]],[[120629,120629],"mapped",[8711]],[[120630,120630],"mapped",[945]],[[120631,120631],"mapped",[946]],[[120632,120632],"mapped",[947]],[[120633,120633],"mapped",[948]],[[120634,120634],"mapped",[949]],[[120635,120635],"mapped",[950]],[[120636,120636],"mapped",[951]],[[120637,120637],"mapped",[952]],[[120638,120638],"mapped",[953]],[[120639,120639],"mapped",[954]],[[120640,120640],"mapped",[955]],[[120641,120641],"mapped",[956]],[[120642,120642],"mapped",[957]],[[120643,120643],"mapped",[958]],[[120644,120644],"mapped",[959]],[[120645,120645],"mapped",[960]],[[120646,120646],"mapped",[961]],[[120647,120648],"mapped",[963]],[[120649,120649],"mapped",[964]],[[120650,120650],"mapped",[965]],[[120651,120651],"mapped",[966]],[[120652,120652],"mapped",[967]],[[120653,120653],"mapped",[968]],[[120654,120654],"mapped",[969]],[[120655,120655],"mapped",[8706]],[[120656,120656],"mapped",[949]],[[120657,120657],"mapped",[952]],[[120658,120658],"mapped",[954]],[[120659,120659],"mapped",[966]],[[120660,120660],"mapped",[961]],[[120661,120661],"mapped",[960]],[[120662,120662],"mapped",[945]],[[120663,120663],"mapped",[946]],[[120664,120664],"mapped",[947]],[[120665,120665],"mapped",[948]],[[120666,120666],"mapped",[949]],[[120667,120667],"mapped",[950]],[[120668,120668],"mapped",[951]],[[120669,120669],"mapped",[952]],[[120670,120670],"mapped",[953]],[[120671,120671],"mapped",[954]],[[120672,120672],"mapped",[955]],[[120673,120673],"mapped",[956]],[[120674,120674],"mapped",[957]],[[120675,120675],"mapped",[958]],[[120676,120676],"mapped",[959]],[[120677,120677],"mapped",[960]],[[120678,120678],"mapped",[961]],[[120679,120679],"mapped",[952]],[[120680,120680],"mapped",[963]],[[120681,120681],"mapped",[964]],[[120682,120682],"mapped",[965]],[[120683,120683],"mapped",[966]],[[120684,120684],"mapped",[967]],[[120685,120685],"mapped",[968]],[[120686,120686],"mapped",[969]],[[120687,120687],"mapped",[8711]],[[120688,120688],"mapped",[945]],[[120689,120689],"mapped",[946]],[[120690,120690],"mapped",[947]],[[120691,120691],"mapped",[948]],[[120692,120692],"mapped",[949]],[[120693,120693],"mapped",[950]],[[120694,120694],"mapped",[951]],[[120695,120695],"mapped",[952]],[[120696,120696],"mapped",[953]],[[120697,120697],"mapped",[954]],[[120698,120698],"mapped",[955]],[[120699,120699],"mapped",[956]],[[120700,120700],"mapped",[957]],[[120701,120701],"mapped",[958]],[[120702,120702],"mapped",[959]],[[120703,120703],"mapped",[960]],[[120704,120704],"mapped",[961]],[[120705,120706],"mapped",[963]],[[120707,120707],"mapped",[964]],[[120708,120708],"mapped",[965]],[[120709,120709],"mapped",[966]],[[120710,120710],"mapped",[967]],[[120711,120711],"mapped",[968]],[[120712,120712],"mapped",[969]],[[120713,120713],"mapped",[8706]],[[120714,120714],"mapped",[949]],[[120715,120715],"mapped",[952]],[[120716,120716],"mapped",[954]],[[120717,120717],"mapped",[966]],[[120718,120718],"mapped",[961]],[[120719,120719],"mapped",[960]],[[120720,120720],"mapped",[945]],[[120721,120721],"mapped",[946]],[[120722,120722],"mapped",[947]],[[120723,120723],"mapped",[948]],[[120724,120724],"mapped",[949]],[[120725,120725],"mapped",[950]],[[120726,120726],"mapped",[951]],[[120727,120727],"mapped",[952]],[[120728,120728],"mapped",[953]],[[120729,120729],"mapped",[954]],[[120730,120730],"mapped",[955]],[[120731,120731],"mapped",[956]],[[120732,120732],"mapped",[957]],[[120733,120733],"mapped",[958]],[[120734,120734],"mapped",[959]],[[120735,120735],"mapped",[960]],[[120736,120736],"mapped",[961]],[[120737,120737],"mapped",[952]],[[120738,120738],"mapped",[963]],[[120739,120739],"mapped",[964]],[[120740,120740],"mapped",[965]],[[120741,120741],"mapped",[966]],[[120742,120742],"mapped",[967]],[[120743,120743],"mapped",[968]],[[120744,120744],"mapped",[969]],[[120745,120745],"mapped",[8711]],[[120746,120746],"mapped",[945]],[[120747,120747],"mapped",[946]],[[120748,120748],"mapped",[947]],[[120749,120749],"mapped",[948]],[[120750,120750],"mapped",[949]],[[120751,120751],"mapped",[950]],[[120752,120752],"mapped",[951]],[[120753,120753],"mapped",[952]],[[120754,120754],"mapped",[953]],[[120755,120755],"mapped",[954]],[[120756,120756],"mapped",[955]],[[120757,120757],"mapped",[956]],[[120758,120758],"mapped",[957]],[[120759,120759],"mapped",[958]],[[120760,120760],"mapped",[959]],[[120761,120761],"mapped",[960]],[[120762,120762],"mapped",[961]],[[120763,120764],"mapped",[963]],[[120765,120765],"mapped",[964]],[[120766,120766],"mapped",[965]],[[120767,120767],"mapped",[966]],[[120768,120768],"mapped",[967]],[[120769,120769],"mapped",[968]],[[120770,120770],"mapped",[969]],[[120771,120771],"mapped",[8706]],[[120772,120772],"mapped",[949]],[[120773,120773],"mapped",[952]],[[120774,120774],"mapped",[954]],[[120775,120775],"mapped",[966]],[[120776,120776],"mapped",[961]],[[120777,120777],"mapped",[960]],[[120778,120779],"mapped",[989]],[[120780,120781],"disallowed"],[[120782,120782],"mapped",[48]],[[120783,120783],"mapped",[49]],[[120784,120784],"mapped",[50]],[[120785,120785],"mapped",[51]],[[120786,120786],"mapped",[52]],[[120787,120787],"mapped",[53]],[[120788,120788],"mapped",[54]],[[120789,120789],"mapped",[55]],[[120790,120790],"mapped",[56]],[[120791,120791],"mapped",[57]],[[120792,120792],"mapped",[48]],[[120793,120793],"mapped",[49]],[[120794,120794],"mapped",[50]],[[120795,120795],"mapped",[51]],[[120796,120796],"mapped",[52]],[[120797,120797],"mapped",[53]],[[120798,120798],"mapped",[54]],[[120799,120799],"mapped",[55]],[[120800,120800],"mapped",[56]],[[120801,120801],"mapped",[57]],[[120802,120802],"mapped",[48]],[[120803,120803],"mapped",[49]],[[120804,120804],"mapped",[50]],[[120805,120805],"mapped",[51]],[[120806,120806],"mapped",[52]],[[120807,120807],"mapped",[53]],[[120808,120808],"mapped",[54]],[[120809,120809],"mapped",[55]],[[120810,120810],"mapped",[56]],[[120811,120811],"mapped",[57]],[[120812,120812],"mapped",[48]],[[120813,120813],"mapped",[49]],[[120814,120814],"mapped",[50]],[[120815,120815],"mapped",[51]],[[120816,120816],"mapped",[52]],[[120817,120817],"mapped",[53]],[[120818,120818],"mapped",[54]],[[120819,120819],"mapped",[55]],[[120820,120820],"mapped",[56]],[[120821,120821],"mapped",[57]],[[120822,120822],"mapped",[48]],[[120823,120823],"mapped",[49]],[[120824,120824],"mapped",[50]],[[120825,120825],"mapped",[51]],[[120826,120826],"mapped",[52]],[[120827,120827],"mapped",[53]],[[120828,120828],"mapped",[54]],[[120829,120829],"mapped",[55]],[[120830,120830],"mapped",[56]],[[120831,120831],"mapped",[57]],[[120832,121343],"valid",[],"NV8"],[[121344,121398],"valid"],[[121399,121402],"valid",[],"NV8"],[[121403,121452],"valid"],[[121453,121460],"valid",[],"NV8"],[[121461,121461],"valid"],[[121462,121475],"valid",[],"NV8"],[[121476,121476],"valid"],[[121477,121483],"valid",[],"NV8"],[[121484,121498],"disallowed"],[[121499,121503],"valid"],[[121504,121504],"disallowed"],[[121505,121519],"valid"],[[121520,124927],"disallowed"],[[124928,125124],"valid"],[[125125,125126],"disallowed"],[[125127,125135],"valid",[],"NV8"],[[125136,125142],"valid"],[[125143,126463],"disallowed"],[[126464,126464],"mapped",[1575]],[[126465,126465],"mapped",[1576]],[[126466,126466],"mapped",[1580]],[[126467,126467],"mapped",[1583]],[[126468,126468],"disallowed"],[[126469,126469],"mapped",[1608]],[[126470,126470],"mapped",[1586]],[[126471,126471],"mapped",[1581]],[[126472,126472],"mapped",[1591]],[[126473,126473],"mapped",[1610]],[[126474,126474],"mapped",[1603]],[[126475,126475],"mapped",[1604]],[[126476,126476],"mapped",[1605]],[[126477,126477],"mapped",[1606]],[[126478,126478],"mapped",[1587]],[[126479,126479],"mapped",[1593]],[[126480,126480],"mapped",[1601]],[[126481,126481],"mapped",[1589]],[[126482,126482],"mapped",[1602]],[[126483,126483],"mapped",[1585]],[[126484,126484],"mapped",[1588]],[[126485,126485],"mapped",[1578]],[[126486,126486],"mapped",[1579]],[[126487,126487],"mapped",[1582]],[[126488,126488],"mapped",[1584]],[[126489,126489],"mapped",[1590]],[[126490,126490],"mapped",[1592]],[[126491,126491],"mapped",[1594]],[[126492,126492],"mapped",[1646]],[[126493,126493],"mapped",[1722]],[[126494,126494],"mapped",[1697]],[[126495,126495],"mapped",[1647]],[[126496,126496],"disallowed"],[[126497,126497],"mapped",[1576]],[[126498,126498],"mapped",[1580]],[[126499,126499],"disallowed"],[[126500,126500],"mapped",[1607]],[[126501,126502],"disallowed"],[[126503,126503],"mapped",[1581]],[[126504,126504],"disallowed"],[[126505,126505],"mapped",[1610]],[[126506,126506],"mapped",[1603]],[[126507,126507],"mapped",[1604]],[[126508,126508],"mapped",[1605]],[[126509,126509],"mapped",[1606]],[[126510,126510],"mapped",[1587]],[[126511,126511],"mapped",[1593]],[[126512,126512],"mapped",[1601]],[[126513,126513],"mapped",[1589]],[[126514,126514],"mapped",[1602]],[[126515,126515],"disallowed"],[[126516,126516],"mapped",[1588]],[[126517,126517],"mapped",[1578]],[[126518,126518],"mapped",[1579]],[[126519,126519],"mapped",[1582]],[[126520,126520],"disallowed"],[[126521,126521],"mapped",[1590]],[[126522,126522],"disallowed"],[[126523,126523],"mapped",[1594]],[[126524,126529],"disallowed"],[[126530,126530],"mapped",[1580]],[[126531,126534],"disallowed"],[[126535,126535],"mapped",[1581]],[[126536,126536],"disallowed"],[[126537,126537],"mapped",[1610]],[[126538,126538],"disallowed"],[[126539,126539],"mapped",[1604]],[[126540,126540],"disallowed"],[[126541,126541],"mapped",[1606]],[[126542,126542],"mapped",[1587]],[[126543,126543],"mapped",[1593]],[[126544,126544],"disallowed"],[[126545,126545],"mapped",[1589]],[[126546,126546],"mapped",[1602]],[[126547,126547],"disallowed"],[[126548,126548],"mapped",[1588]],[[126549,126550],"disallowed"],[[126551,126551],"mapped",[1582]],[[126552,126552],"disallowed"],[[126553,126553],"mapped",[1590]],[[126554,126554],"disallowed"],[[126555,126555],"mapped",[1594]],[[126556,126556],"disallowed"],[[126557,126557],"mapped",[1722]],[[126558,126558],"disallowed"],[[126559,126559],"mapped",[1647]],[[126560,126560],"disallowed"],[[126561,126561],"mapped",[1576]],[[126562,126562],"mapped",[1580]],[[126563,126563],"disallowed"],[[126564,126564],"mapped",[1607]],[[126565,126566],"disallowed"],[[126567,126567],"mapped",[1581]],[[126568,126568],"mapped",[1591]],[[126569,126569],"mapped",[1610]],[[126570,126570],"mapped",[1603]],[[126571,126571],"disallowed"],[[126572,126572],"mapped",[1605]],[[126573,126573],"mapped",[1606]],[[126574,126574],"mapped",[1587]],[[126575,126575],"mapped",[1593]],[[126576,126576],"mapped",[1601]],[[126577,126577],"mapped",[1589]],[[126578,126578],"mapped",[1602]],[[126579,126579],"disallowed"],[[126580,126580],"mapped",[1588]],[[126581,126581],"mapped",[1578]],[[126582,126582],"mapped",[1579]],[[126583,126583],"mapped",[1582]],[[126584,126584],"disallowed"],[[126585,126585],"mapped",[1590]],[[126586,126586],"mapped",[1592]],[[126587,126587],"mapped",[1594]],[[126588,126588],"mapped",[1646]],[[126589,126589],"disallowed"],[[126590,126590],"mapped",[1697]],[[126591,126591],"disallowed"],[[126592,126592],"mapped",[1575]],[[126593,126593],"mapped",[1576]],[[126594,126594],"mapped",[1580]],[[126595,126595],"mapped",[1583]],[[126596,126596],"mapped",[1607]],[[126597,126597],"mapped",[1608]],[[126598,126598],"mapped",[1586]],[[126599,126599],"mapped",[1581]],[[126600,126600],"mapped",[1591]],[[126601,126601],"mapped",[1610]],[[126602,126602],"disallowed"],[[126603,126603],"mapped",[1604]],[[126604,126604],"mapped",[1605]],[[126605,126605],"mapped",[1606]],[[126606,126606],"mapped",[1587]],[[126607,126607],"mapped",[1593]],[[126608,126608],"mapped",[1601]],[[126609,126609],"mapped",[1589]],[[126610,126610],"mapped",[1602]],[[126611,126611],"mapped",[1585]],[[126612,126612],"mapped",[1588]],[[126613,126613],"mapped",[1578]],[[126614,126614],"mapped",[1579]],[[126615,126615],"mapped",[1582]],[[126616,126616],"mapped",[1584]],[[126617,126617],"mapped",[1590]],[[126618,126618],"mapped",[1592]],[[126619,126619],"mapped",[1594]],[[126620,126624],"disallowed"],[[126625,126625],"mapped",[1576]],[[126626,126626],"mapped",[1580]],[[126627,126627],"mapped",[1583]],[[126628,126628],"disallowed"],[[126629,126629],"mapped",[1608]],[[126630,126630],"mapped",[1586]],[[126631,126631],"mapped",[1581]],[[126632,126632],"mapped",[1591]],[[126633,126633],"mapped",[1610]],[[126634,126634],"disallowed"],[[126635,126635],"mapped",[1604]],[[126636,126636],"mapped",[1605]],[[126637,126637],"mapped",[1606]],[[126638,126638],"mapped",[1587]],[[126639,126639],"mapped",[1593]],[[126640,126640],"mapped",[1601]],[[126641,126641],"mapped",[1589]],[[126642,126642],"mapped",[1602]],[[126643,126643],"mapped",[1585]],[[126644,126644],"mapped",[1588]],[[126645,126645],"mapped",[1578]],[[126646,126646],"mapped",[1579]],[[126647,126647],"mapped",[1582]],[[126648,126648],"mapped",[1584]],[[126649,126649],"mapped",[1590]],[[126650,126650],"mapped",[1592]],[[126651,126651],"mapped",[1594]],[[126652,126703],"disallowed"],[[126704,126705],"valid",[],"NV8"],[[126706,126975],"disallowed"],[[126976,127019],"valid",[],"NV8"],[[127020,127023],"disallowed"],[[127024,127123],"valid",[],"NV8"],[[127124,127135],"disallowed"],[[127136,127150],"valid",[],"NV8"],[[127151,127152],"disallowed"],[[127153,127166],"valid",[],"NV8"],[[127167,127167],"valid",[],"NV8"],[[127168,127168],"disallowed"],[[127169,127183],"valid",[],"NV8"],[[127184,127184],"disallowed"],[[127185,127199],"valid",[],"NV8"],[[127200,127221],"valid",[],"NV8"],[[127222,127231],"disallowed"],[[127232,127232],"disallowed"],[[127233,127233],"disallowed_STD3_mapped",[48,44]],[[127234,127234],"disallowed_STD3_mapped",[49,44]],[[127235,127235],"disallowed_STD3_mapped",[50,44]],[[127236,127236],"disallowed_STD3_mapped",[51,44]],[[127237,127237],"disallowed_STD3_mapped",[52,44]],[[127238,127238],"disallowed_STD3_mapped",[53,44]],[[127239,127239],"disallowed_STD3_mapped",[54,44]],[[127240,127240],"disallowed_STD3_mapped",[55,44]],[[127241,127241],"disallowed_STD3_mapped",[56,44]],[[127242,127242],"disallowed_STD3_mapped",[57,44]],[[127243,127244],"valid",[],"NV8"],[[127245,127247],"disallowed"],[[127248,127248],"disallowed_STD3_mapped",[40,97,41]],[[127249,127249],"disallowed_STD3_mapped",[40,98,41]],[[127250,127250],"disallowed_STD3_mapped",[40,99,41]],[[127251,127251],"disallowed_STD3_mapped",[40,100,41]],[[127252,127252],"disallowed_STD3_mapped",[40,101,41]],[[127253,127253],"disallowed_STD3_mapped",[40,102,41]],[[127254,127254],"disallowed_STD3_mapped",[40,103,41]],[[127255,127255],"disallowed_STD3_mapped",[40,104,41]],[[127256,127256],"disallowed_STD3_mapped",[40,105,41]],[[127257,127257],"disallowed_STD3_mapped",[40,106,41]],[[127258,127258],"disallowed_STD3_mapped",[40,107,41]],[[127259,127259],"disallowed_STD3_mapped",[40,108,41]],[[127260,127260],"disallowed_STD3_mapped",[40,109,41]],[[127261,127261],"disallowed_STD3_mapped",[40,110,41]],[[127262,127262],"disallowed_STD3_mapped",[40,111,41]],[[127263,127263],"disallowed_STD3_mapped",[40,112,41]],[[127264,127264],"disallowed_STD3_mapped",[40,113,41]],[[127265,127265],"disallowed_STD3_mapped",[40,114,41]],[[127266,127266],"disallowed_STD3_mapped",[40,115,41]],[[127267,127267],"disallowed_STD3_mapped",[40,116,41]],[[127268,127268],"disallowed_STD3_mapped",[40,117,41]],[[127269,127269],"disallowed_STD3_mapped",[40,118,41]],[[127270,127270],"disallowed_STD3_mapped",[40,119,41]],[[127271,127271],"disallowed_STD3_mapped",[40,120,41]],[[127272,127272],"disallowed_STD3_mapped",[40,121,41]],[[127273,127273],"disallowed_STD3_mapped",[40,122,41]],[[127274,127274],"mapped",[12308,115,12309]],[[127275,127275],"mapped",[99]],[[127276,127276],"mapped",[114]],[[127277,127277],"mapped",[99,100]],[[127278,127278],"mapped",[119,122]],[[127279,127279],"disallowed"],[[127280,127280],"mapped",[97]],[[127281,127281],"mapped",[98]],[[127282,127282],"mapped",[99]],[[127283,127283],"mapped",[100]],[[127284,127284],"mapped",[101]],[[127285,127285],"mapped",[102]],[[127286,127286],"mapped",[103]],[[127287,127287],"mapped",[104]],[[127288,127288],"mapped",[105]],[[127289,127289],"mapped",[106]],[[127290,127290],"mapped",[107]],[[127291,127291],"mapped",[108]],[[127292,127292],"mapped",[109]],[[127293,127293],"mapped",[110]],[[127294,127294],"mapped",[111]],[[127295,127295],"mapped",[112]],[[127296,127296],"mapped",[113]],[[127297,127297],"mapped",[114]],[[127298,127298],"mapped",[115]],[[127299,127299],"mapped",[116]],[[127300,127300],"mapped",[117]],[[127301,127301],"mapped",[118]],[[127302,127302],"mapped",[119]],[[127303,127303],"mapped",[120]],[[127304,127304],"mapped",[121]],[[127305,127305],"mapped",[122]],[[127306,127306],"mapped",[104,118]],[[127307,127307],"mapped",[109,118]],[[127308,127308],"mapped",[115,100]],[[127309,127309],"mapped",[115,115]],[[127310,127310],"mapped",[112,112,118]],[[127311,127311],"mapped",[119,99]],[[127312,127318],"valid",[],"NV8"],[[127319,127319],"valid",[],"NV8"],[[127320,127326],"valid",[],"NV8"],[[127327,127327],"valid",[],"NV8"],[[127328,127337],"valid",[],"NV8"],[[127338,127338],"mapped",[109,99]],[[127339,127339],"mapped",[109,100]],[[127340,127343],"disallowed"],[[127344,127352],"valid",[],"NV8"],[[127353,127353],"valid",[],"NV8"],[[127354,127354],"valid",[],"NV8"],[[127355,127356],"valid",[],"NV8"],[[127357,127358],"valid",[],"NV8"],[[127359,127359],"valid",[],"NV8"],[[127360,127369],"valid",[],"NV8"],[[127370,127373],"valid",[],"NV8"],[[127374,127375],"valid",[],"NV8"],[[127376,127376],"mapped",[100,106]],[[127377,127386],"valid",[],"NV8"],[[127387,127461],"disallowed"],[[127462,127487],"valid",[],"NV8"],[[127488,127488],"mapped",[12411,12363]],[[127489,127489],"mapped",[12467,12467]],[[127490,127490],"mapped",[12469]],[[127491,127503],"disallowed"],[[127504,127504],"mapped",[25163]],[[127505,127505],"mapped",[23383]],[[127506,127506],"mapped",[21452]],[[127507,127507],"mapped",[12487]],[[127508,127508],"mapped",[20108]],[[127509,127509],"mapped",[22810]],[[127510,127510],"mapped",[35299]],[[127511,127511],"mapped",[22825]],[[127512,127512],"mapped",[20132]],[[127513,127513],"mapped",[26144]],[[127514,127514],"mapped",[28961]],[[127515,127515],"mapped",[26009]],[[127516,127516],"mapped",[21069]],[[127517,127517],"mapped",[24460]],[[127518,127518],"mapped",[20877]],[[127519,127519],"mapped",[26032]],[[127520,127520],"mapped",[21021]],[[127521,127521],"mapped",[32066]],[[127522,127522],"mapped",[29983]],[[127523,127523],"mapped",[36009]],[[127524,127524],"mapped",[22768]],[[127525,127525],"mapped",[21561]],[[127526,127526],"mapped",[28436]],[[127527,127527],"mapped",[25237]],[[127528,127528],"mapped",[25429]],[[127529,127529],"mapped",[19968]],[[127530,127530],"mapped",[19977]],[[127531,127531],"mapped",[36938]],[[127532,127532],"mapped",[24038]],[[127533,127533],"mapped",[20013]],[[127534,127534],"mapped",[21491]],[[127535,127535],"mapped",[25351]],[[127536,127536],"mapped",[36208]],[[127537,127537],"mapped",[25171]],[[127538,127538],"mapped",[31105]],[[127539,127539],"mapped",[31354]],[[127540,127540],"mapped",[21512]],[[127541,127541],"mapped",[28288]],[[127542,127542],"mapped",[26377]],[[127543,127543],"mapped",[26376]],[[127544,127544],"mapped",[30003]],[[127545,127545],"mapped",[21106]],[[127546,127546],"mapped",[21942]],[[127547,127551],"disallowed"],[[127552,127552],"mapped",[12308,26412,12309]],[[127553,127553],"mapped",[12308,19977,12309]],[[127554,127554],"mapped",[12308,20108,12309]],[[127555,127555],"mapped",[12308,23433,12309]],[[127556,127556],"mapped",[12308,28857,12309]],[[127557,127557],"mapped",[12308,25171,12309]],[[127558,127558],"mapped",[12308,30423,12309]],[[127559,127559],"mapped",[12308,21213,12309]],[[127560,127560],"mapped",[12308,25943,12309]],[[127561,127567],"disallowed"],[[127568,127568],"mapped",[24471]],[[127569,127569],"mapped",[21487]],[[127570,127743],"disallowed"],[[127744,127776],"valid",[],"NV8"],[[127777,127788],"valid",[],"NV8"],[[127789,127791],"valid",[],"NV8"],[[127792,127797],"valid",[],"NV8"],[[127798,127798],"valid",[],"NV8"],[[127799,127868],"valid",[],"NV8"],[[127869,127869],"valid",[],"NV8"],[[127870,127871],"valid",[],"NV8"],[[127872,127891],"valid",[],"NV8"],[[127892,127903],"valid",[],"NV8"],[[127904,127940],"valid",[],"NV8"],[[127941,127941],"valid",[],"NV8"],[[127942,127946],"valid",[],"NV8"],[[127947,127950],"valid",[],"NV8"],[[127951,127955],"valid",[],"NV8"],[[127956,127967],"valid",[],"NV8"],[[127968,127984],"valid",[],"NV8"],[[127985,127991],"valid",[],"NV8"],[[127992,127999],"valid",[],"NV8"],[[128000,128062],"valid",[],"NV8"],[[128063,128063],"valid",[],"NV8"],[[128064,128064],"valid",[],"NV8"],[[128065,128065],"valid",[],"NV8"],[[128066,128247],"valid",[],"NV8"],[[128248,128248],"valid",[],"NV8"],[[128249,128252],"valid",[],"NV8"],[[128253,128254],"valid",[],"NV8"],[[128255,128255],"valid",[],"NV8"],[[128256,128317],"valid",[],"NV8"],[[128318,128319],"valid",[],"NV8"],[[128320,128323],"valid",[],"NV8"],[[128324,128330],"valid",[],"NV8"],[[128331,128335],"valid",[],"NV8"],[[128336,128359],"valid",[],"NV8"],[[128360,128377],"valid",[],"NV8"],[[128378,128378],"disallowed"],[[128379,128419],"valid",[],"NV8"],[[128420,128420],"disallowed"],[[128421,128506],"valid",[],"NV8"],[[128507,128511],"valid",[],"NV8"],[[128512,128512],"valid",[],"NV8"],[[128513,128528],"valid",[],"NV8"],[[128529,128529],"valid",[],"NV8"],[[128530,128532],"valid",[],"NV8"],[[128533,128533],"valid",[],"NV8"],[[128534,128534],"valid",[],"NV8"],[[128535,128535],"valid",[],"NV8"],[[128536,128536],"valid",[],"NV8"],[[128537,128537],"valid",[],"NV8"],[[128538,128538],"valid",[],"NV8"],[[128539,128539],"valid",[],"NV8"],[[128540,128542],"valid",[],"NV8"],[[128543,128543],"valid",[],"NV8"],[[128544,128549],"valid",[],"NV8"],[[128550,128551],"valid",[],"NV8"],[[128552,128555],"valid",[],"NV8"],[[128556,128556],"valid",[],"NV8"],[[128557,128557],"valid",[],"NV8"],[[128558,128559],"valid",[],"NV8"],[[128560,128563],"valid",[],"NV8"],[[128564,128564],"valid",[],"NV8"],[[128565,128576],"valid",[],"NV8"],[[128577,128578],"valid",[],"NV8"],[[128579,128580],"valid",[],"NV8"],[[128581,128591],"valid",[],"NV8"],[[128592,128639],"valid",[],"NV8"],[[128640,128709],"valid",[],"NV8"],[[128710,128719],"valid",[],"NV8"],[[128720,128720],"valid",[],"NV8"],[[128721,128735],"disallowed"],[[128736,128748],"valid",[],"NV8"],[[128749,128751],"disallowed"],[[128752,128755],"valid",[],"NV8"],[[128756,128767],"disallowed"],[[128768,128883],"valid",[],"NV8"],[[128884,128895],"disallowed"],[[128896,128980],"valid",[],"NV8"],[[128981,129023],"disallowed"],[[129024,129035],"valid",[],"NV8"],[[129036,129039],"disallowed"],[[129040,129095],"valid",[],"NV8"],[[129096,129103],"disallowed"],[[129104,129113],"valid",[],"NV8"],[[129114,129119],"disallowed"],[[129120,129159],"valid",[],"NV8"],[[129160,129167],"disallowed"],[[129168,129197],"valid",[],"NV8"],[[129198,129295],"disallowed"],[[129296,129304],"valid",[],"NV8"],[[129305,129407],"disallowed"],[[129408,129412],"valid",[],"NV8"],[[129413,129471],"disallowed"],[[129472,129472],"valid",[],"NV8"],[[129473,131069],"disallowed"],[[131070,131071],"disallowed"],[[131072,173782],"valid"],[[173783,173823],"disallowed"],[[173824,177972],"valid"],[[177973,177983],"disallowed"],[[177984,178205],"valid"],[[178206,178207],"disallowed"],[[178208,183969],"valid"],[[183970,194559],"disallowed"],[[194560,194560],"mapped",[20029]],[[194561,194561],"mapped",[20024]],[[194562,194562],"mapped",[20033]],[[194563,194563],"mapped",[131362]],[[194564,194564],"mapped",[20320]],[[194565,194565],"mapped",[20398]],[[194566,194566],"mapped",[20411]],[[194567,194567],"mapped",[20482]],[[194568,194568],"mapped",[20602]],[[194569,194569],"mapped",[20633]],[[194570,194570],"mapped",[20711]],[[194571,194571],"mapped",[20687]],[[194572,194572],"mapped",[13470]],[[194573,194573],"mapped",[132666]],[[194574,194574],"mapped",[20813]],[[194575,194575],"mapped",[20820]],[[194576,194576],"mapped",[20836]],[[194577,194577],"mapped",[20855]],[[194578,194578],"mapped",[132380]],[[194579,194579],"mapped",[13497]],[[194580,194580],"mapped",[20839]],[[194581,194581],"mapped",[20877]],[[194582,194582],"mapped",[132427]],[[194583,194583],"mapped",[20887]],[[194584,194584],"mapped",[20900]],[[194585,194585],"mapped",[20172]],[[194586,194586],"mapped",[20908]],[[194587,194587],"mapped",[20917]],[[194588,194588],"mapped",[168415]],[[194589,194589],"mapped",[20981]],[[194590,194590],"mapped",[20995]],[[194591,194591],"mapped",[13535]],[[194592,194592],"mapped",[21051]],[[194593,194593],"mapped",[21062]],[[194594,194594],"mapped",[21106]],[[194595,194595],"mapped",[21111]],[[194596,194596],"mapped",[13589]],[[194597,194597],"mapped",[21191]],[[194598,194598],"mapped",[21193]],[[194599,194599],"mapped",[21220]],[[194600,194600],"mapped",[21242]],[[194601,194601],"mapped",[21253]],[[194602,194602],"mapped",[21254]],[[194603,194603],"mapped",[21271]],[[194604,194604],"mapped",[21321]],[[194605,194605],"mapped",[21329]],[[194606,194606],"mapped",[21338]],[[194607,194607],"mapped",[21363]],[[194608,194608],"mapped",[21373]],[[194609,194611],"mapped",[21375]],[[194612,194612],"mapped",[133676]],[[194613,194613],"mapped",[28784]],[[194614,194614],"mapped",[21450]],[[194615,194615],"mapped",[21471]],[[194616,194616],"mapped",[133987]],[[194617,194617],"mapped",[21483]],[[194618,194618],"mapped",[21489]],[[194619,194619],"mapped",[21510]],[[194620,194620],"mapped",[21662]],[[194621,194621],"mapped",[21560]],[[194622,194622],"mapped",[21576]],[[194623,194623],"mapped",[21608]],[[194624,194624],"mapped",[21666]],[[194625,194625],"mapped",[21750]],[[194626,194626],"mapped",[21776]],[[194627,194627],"mapped",[21843]],[[194628,194628],"mapped",[21859]],[[194629,194630],"mapped",[21892]],[[194631,194631],"mapped",[21913]],[[194632,194632],"mapped",[21931]],[[194633,194633],"mapped",[21939]],[[194634,194634],"mapped",[21954]],[[194635,194635],"mapped",[22294]],[[194636,194636],"mapped",[22022]],[[194637,194637],"mapped",[22295]],[[194638,194638],"mapped",[22097]],[[194639,194639],"mapped",[22132]],[[194640,194640],"mapped",[20999]],[[194641,194641],"mapped",[22766]],[[194642,194642],"mapped",[22478]],[[194643,194643],"mapped",[22516]],[[194644,194644],"mapped",[22541]],[[194645,194645],"mapped",[22411]],[[194646,194646],"mapped",[22578]],[[194647,194647],"mapped",[22577]],[[194648,194648],"mapped",[22700]],[[194649,194649],"mapped",[136420]],[[194650,194650],"mapped",[22770]],[[194651,194651],"mapped",[22775]],[[194652,194652],"mapped",[22790]],[[194653,194653],"mapped",[22810]],[[194654,194654],"mapped",[22818]],[[194655,194655],"mapped",[22882]],[[194656,194656],"mapped",[136872]],[[194657,194657],"mapped",[136938]],[[194658,194658],"mapped",[23020]],[[194659,194659],"mapped",[23067]],[[194660,194660],"mapped",[23079]],[[194661,194661],"mapped",[23000]],[[194662,194662],"mapped",[23142]],[[194663,194663],"mapped",[14062]],[[194664,194664],"disallowed"],[[194665,194665],"mapped",[23304]],[[194666,194667],"mapped",[23358]],[[194668,194668],"mapped",[137672]],[[194669,194669],"mapped",[23491]],[[194670,194670],"mapped",[23512]],[[194671,194671],"mapped",[23527]],[[194672,194672],"mapped",[23539]],[[194673,194673],"mapped",[138008]],[[194674,194674],"mapped",[23551]],[[194675,194675],"mapped",[23558]],[[194676,194676],"disallowed"],[[194677,194677],"mapped",[23586]],[[194678,194678],"mapped",[14209]],[[194679,194679],"mapped",[23648]],[[194680,194680],"mapped",[23662]],[[194681,194681],"mapped",[23744]],[[194682,194682],"mapped",[23693]],[[194683,194683],"mapped",[138724]],[[194684,194684],"mapped",[23875]],[[194685,194685],"mapped",[138726]],[[194686,194686],"mapped",[23918]],[[194687,194687],"mapped",[23915]],[[194688,194688],"mapped",[23932]],[[194689,194689],"mapped",[24033]],[[194690,194690],"mapped",[24034]],[[194691,194691],"mapped",[14383]],[[194692,194692],"mapped",[24061]],[[194693,194693],"mapped",[24104]],[[194694,194694],"mapped",[24125]],[[194695,194695],"mapped",[24169]],[[194696,194696],"mapped",[14434]],[[194697,194697],"mapped",[139651]],[[194698,194698],"mapped",[14460]],[[194699,194699],"mapped",[24240]],[[194700,194700],"mapped",[24243]],[[194701,194701],"mapped",[24246]],[[194702,194702],"mapped",[24266]],[[194703,194703],"mapped",[172946]],[[194704,194704],"mapped",[24318]],[[194705,194706],"mapped",[140081]],[[194707,194707],"mapped",[33281]],[[194708,194709],"mapped",[24354]],[[194710,194710],"mapped",[14535]],[[194711,194711],"mapped",[144056]],[[194712,194712],"mapped",[156122]],[[194713,194713],"mapped",[24418]],[[194714,194714],"mapped",[24427]],[[194715,194715],"mapped",[14563]],[[194716,194716],"mapped",[24474]],[[194717,194717],"mapped",[24525]],[[194718,194718],"mapped",[24535]],[[194719,194719],"mapped",[24569]],[[194720,194720],"mapped",[24705]],[[194721,194721],"mapped",[14650]],[[194722,194722],"mapped",[14620]],[[194723,194723],"mapped",[24724]],[[194724,194724],"mapped",[141012]],[[194725,194725],"mapped",[24775]],[[194726,194726],"mapped",[24904]],[[194727,194727],"mapped",[24908]],[[194728,194728],"mapped",[24910]],[[194729,194729],"mapped",[24908]],[[194730,194730],"mapped",[24954]],[[194731,194731],"mapped",[24974]],[[194732,194732],"mapped",[25010]],[[194733,194733],"mapped",[24996]],[[194734,194734],"mapped",[25007]],[[194735,194735],"mapped",[25054]],[[194736,194736],"mapped",[25074]],[[194737,194737],"mapped",[25078]],[[194738,194738],"mapped",[25104]],[[194739,194739],"mapped",[25115]],[[194740,194740],"mapped",[25181]],[[194741,194741],"mapped",[25265]],[[194742,194742],"mapped",[25300]],[[194743,194743],"mapped",[25424]],[[194744,194744],"mapped",[142092]],[[194745,194745],"mapped",[25405]],[[194746,194746],"mapped",[25340]],[[194747,194747],"mapped",[25448]],[[194748,194748],"mapped",[25475]],[[194749,194749],"mapped",[25572]],[[194750,194750],"mapped",[142321]],[[194751,194751],"mapped",[25634]],[[194752,194752],"mapped",[25541]],[[194753,194753],"mapped",[25513]],[[194754,194754],"mapped",[14894]],[[194755,194755],"mapped",[25705]],[[194756,194756],"mapped",[25726]],[[194757,194757],"mapped",[25757]],[[194758,194758],"mapped",[25719]],[[194759,194759],"mapped",[14956]],[[194760,194760],"mapped",[25935]],[[194761,194761],"mapped",[25964]],[[194762,194762],"mapped",[143370]],[[194763,194763],"mapped",[26083]],[[194764,194764],"mapped",[26360]],[[194765,194765],"mapped",[26185]],[[194766,194766],"mapped",[15129]],[[194767,194767],"mapped",[26257]],[[194768,194768],"mapped",[15112]],[[194769,194769],"mapped",[15076]],[[194770,194770],"mapped",[20882]],[[194771,194771],"mapped",[20885]],[[194772,194772],"mapped",[26368]],[[194773,194773],"mapped",[26268]],[[194774,194774],"mapped",[32941]],[[194775,194775],"mapped",[17369]],[[194776,194776],"mapped",[26391]],[[194777,194777],"mapped",[26395]],[[194778,194778],"mapped",[26401]],[[194779,194779],"mapped",[26462]],[[194780,194780],"mapped",[26451]],[[194781,194781],"mapped",[144323]],[[194782,194782],"mapped",[15177]],[[194783,194783],"mapped",[26618]],[[194784,194784],"mapped",[26501]],[[194785,194785],"mapped",[26706]],[[194786,194786],"mapped",[26757]],[[194787,194787],"mapped",[144493]],[[194788,194788],"mapped",[26766]],[[194789,194789],"mapped",[26655]],[[194790,194790],"mapped",[26900]],[[194791,194791],"mapped",[15261]],[[194792,194792],"mapped",[26946]],[[194793,194793],"mapped",[27043]],[[194794,194794],"mapped",[27114]],[[194795,194795],"mapped",[27304]],[[194796,194796],"mapped",[145059]],[[194797,194797],"mapped",[27355]],[[194798,194798],"mapped",[15384]],[[194799,194799],"mapped",[27425]],[[194800,194800],"mapped",[145575]],[[194801,194801],"mapped",[27476]],[[194802,194802],"mapped",[15438]],[[194803,194803],"mapped",[27506]],[[194804,194804],"mapped",[27551]],[[194805,194805],"mapped",[27578]],[[194806,194806],"mapped",[27579]],[[194807,194807],"mapped",[146061]],[[194808,194808],"mapped",[138507]],[[194809,194809],"mapped",[146170]],[[194810,194810],"mapped",[27726]],[[194811,194811],"mapped",[146620]],[[194812,194812],"mapped",[27839]],[[194813,194813],"mapped",[27853]],[[194814,194814],"mapped",[27751]],[[194815,194815],"mapped",[27926]],[[194816,194816],"mapped",[27966]],[[194817,194817],"mapped",[28023]],[[194818,194818],"mapped",[27969]],[[194819,194819],"mapped",[28009]],[[194820,194820],"mapped",[28024]],[[194821,194821],"mapped",[28037]],[[194822,194822],"mapped",[146718]],[[194823,194823],"mapped",[27956]],[[194824,194824],"mapped",[28207]],[[194825,194825],"mapped",[28270]],[[194826,194826],"mapped",[15667]],[[194827,194827],"mapped",[28363]],[[194828,194828],"mapped",[28359]],[[194829,194829],"mapped",[147153]],[[194830,194830],"mapped",[28153]],[[194831,194831],"mapped",[28526]],[[194832,194832],"mapped",[147294]],[[194833,194833],"mapped",[147342]],[[194834,194834],"mapped",[28614]],[[194835,194835],"mapped",[28729]],[[194836,194836],"mapped",[28702]],[[194837,194837],"mapped",[28699]],[[194838,194838],"mapped",[15766]],[[194839,194839],"mapped",[28746]],[[194840,194840],"mapped",[28797]],[[194841,194841],"mapped",[28791]],[[194842,194842],"mapped",[28845]],[[194843,194843],"mapped",[132389]],[[194844,194844],"mapped",[28997]],[[194845,194845],"mapped",[148067]],[[194846,194846],"mapped",[29084]],[[194847,194847],"disallowed"],[[194848,194848],"mapped",[29224]],[[194849,194849],"mapped",[29237]],[[194850,194850],"mapped",[29264]],[[194851,194851],"mapped",[149000]],[[194852,194852],"mapped",[29312]],[[194853,194853],"mapped",[29333]],[[194854,194854],"mapped",[149301]],[[194855,194855],"mapped",[149524]],[[194856,194856],"mapped",[29562]],[[194857,194857],"mapped",[29579]],[[194858,194858],"mapped",[16044]],[[194859,194859],"mapped",[29605]],[[194860,194861],"mapped",[16056]],[[194862,194862],"mapped",[29767]],[[194863,194863],"mapped",[29788]],[[194864,194864],"mapped",[29809]],[[194865,194865],"mapped",[29829]],[[194866,194866],"mapped",[29898]],[[194867,194867],"mapped",[16155]],[[194868,194868],"mapped",[29988]],[[194869,194869],"mapped",[150582]],[[194870,194870],"mapped",[30014]],[[194871,194871],"mapped",[150674]],[[194872,194872],"mapped",[30064]],[[194873,194873],"mapped",[139679]],[[194874,194874],"mapped",[30224]],[[194875,194875],"mapped",[151457]],[[194876,194876],"mapped",[151480]],[[194877,194877],"mapped",[151620]],[[194878,194878],"mapped",[16380]],[[194879,194879],"mapped",[16392]],[[194880,194880],"mapped",[30452]],[[194881,194881],"mapped",[151795]],[[194882,194882],"mapped",[151794]],[[194883,194883],"mapped",[151833]],[[194884,194884],"mapped",[151859]],[[194885,194885],"mapped",[30494]],[[194886,194887],"mapped",[30495]],[[194888,194888],"mapped",[30538]],[[194889,194889],"mapped",[16441]],[[194890,194890],"mapped",[30603]],[[194891,194891],"mapped",[16454]],[[194892,194892],"mapped",[16534]],[[194893,194893],"mapped",[152605]],[[194894,194894],"mapped",[30798]],[[194895,194895],"mapped",[30860]],[[194896,194896],"mapped",[30924]],[[194897,194897],"mapped",[16611]],[[194898,194898],"mapped",[153126]],[[194899,194899],"mapped",[31062]],[[194900,194900],"mapped",[153242]],[[194901,194901],"mapped",[153285]],[[194902,194902],"mapped",[31119]],[[194903,194903],"mapped",[31211]],[[194904,194904],"mapped",[16687]],[[194905,194905],"mapped",[31296]],[[194906,194906],"mapped",[31306]],[[194907,194907],"mapped",[31311]],[[194908,194908],"mapped",[153980]],[[194909,194910],"mapped",[154279]],[[194911,194911],"disallowed"],[[194912,194912],"mapped",[16898]],[[194913,194913],"mapped",[154539]],[[194914,194914],"mapped",[31686]],[[194915,194915],"mapped",[31689]],[[194916,194916],"mapped",[16935]],[[194917,194917],"mapped",[154752]],[[194918,194918],"mapped",[31954]],[[194919,194919],"mapped",[17056]],[[194920,194920],"mapped",[31976]],[[194921,194921],"mapped",[31971]],[[194922,194922],"mapped",[32000]],[[194923,194923],"mapped",[155526]],[[194924,194924],"mapped",[32099]],[[194925,194925],"mapped",[17153]],[[194926,194926],"mapped",[32199]],[[194927,194927],"mapped",[32258]],[[194928,194928],"mapped",[32325]],[[194929,194929],"mapped",[17204]],[[194930,194930],"mapped",[156200]],[[194931,194931],"mapped",[156231]],[[194932,194932],"mapped",[17241]],[[194933,194933],"mapped",[156377]],[[194934,194934],"mapped",[32634]],[[194935,194935],"mapped",[156478]],[[194936,194936],"mapped",[32661]],[[194937,194937],"mapped",[32762]],[[194938,194938],"mapped",[32773]],[[194939,194939],"mapped",[156890]],[[194940,194940],"mapped",[156963]],[[194941,194941],"mapped",[32864]],[[194942,194942],"mapped",[157096]],[[194943,194943],"mapped",[32880]],[[194944,194944],"mapped",[144223]],[[194945,194945],"mapped",[17365]],[[194946,194946],"mapped",[32946]],[[194947,194947],"mapped",[33027]],[[194948,194948],"mapped",[17419]],[[194949,194949],"mapped",[33086]],[[194950,194950],"mapped",[23221]],[[194951,194951],"mapped",[157607]],[[194952,194952],"mapped",[157621]],[[194953,194953],"mapped",[144275]],[[194954,194954],"mapped",[144284]],[[194955,194955],"mapped",[33281]],[[194956,194956],"mapped",[33284]],[[194957,194957],"mapped",[36766]],[[194958,194958],"mapped",[17515]],[[194959,194959],"mapped",[33425]],[[194960,194960],"mapped",[33419]],[[194961,194961],"mapped",[33437]],[[194962,194962],"mapped",[21171]],[[194963,194963],"mapped",[33457]],[[194964,194964],"mapped",[33459]],[[194965,194965],"mapped",[33469]],[[194966,194966],"mapped",[33510]],[[194967,194967],"mapped",[158524]],[[194968,194968],"mapped",[33509]],[[194969,194969],"mapped",[33565]],[[194970,194970],"mapped",[33635]],[[194971,194971],"mapped",[33709]],[[194972,194972],"mapped",[33571]],[[194973,194973],"mapped",[33725]],[[194974,194974],"mapped",[33767]],[[194975,194975],"mapped",[33879]],[[194976,194976],"mapped",[33619]],[[194977,194977],"mapped",[33738]],[[194978,194978],"mapped",[33740]],[[194979,194979],"mapped",[33756]],[[194980,194980],"mapped",[158774]],[[194981,194981],"mapped",[159083]],[[194982,194982],"mapped",[158933]],[[194983,194983],"mapped",[17707]],[[194984,194984],"mapped",[34033]],[[194985,194985],"mapped",[34035]],[[194986,194986],"mapped",[34070]],[[194987,194987],"mapped",[160714]],[[194988,194988],"mapped",[34148]],[[194989,194989],"mapped",[159532]],[[194990,194990],"mapped",[17757]],[[194991,194991],"mapped",[17761]],[[194992,194992],"mapped",[159665]],[[194993,194993],"mapped",[159954]],[[194994,194994],"mapped",[17771]],[[194995,194995],"mapped",[34384]],[[194996,194996],"mapped",[34396]],[[194997,194997],"mapped",[34407]],[[194998,194998],"mapped",[34409]],[[194999,194999],"mapped",[34473]],[[195000,195000],"mapped",[34440]],[[195001,195001],"mapped",[34574]],[[195002,195002],"mapped",[34530]],[[195003,195003],"mapped",[34681]],[[195004,195004],"mapped",[34600]],[[195005,195005],"mapped",[34667]],[[195006,195006],"mapped",[34694]],[[195007,195007],"disallowed"],[[195008,195008],"mapped",[34785]],[[195009,195009],"mapped",[34817]],[[195010,195010],"mapped",[17913]],[[195011,195011],"mapped",[34912]],[[195012,195012],"mapped",[34915]],[[195013,195013],"mapped",[161383]],[[195014,195014],"mapped",[35031]],[[195015,195015],"mapped",[35038]],[[195016,195016],"mapped",[17973]],[[195017,195017],"mapped",[35066]],[[195018,195018],"mapped",[13499]],[[195019,195019],"mapped",[161966]],[[195020,195020],"mapped",[162150]],[[195021,195021],"mapped",[18110]],[[195022,195022],"mapped",[18119]],[[195023,195023],"mapped",[35488]],[[195024,195024],"mapped",[35565]],[[195025,195025],"mapped",[35722]],[[195026,195026],"mapped",[35925]],[[195027,195027],"mapped",[162984]],[[195028,195028],"mapped",[36011]],[[195029,195029],"mapped",[36033]],[[195030,195030],"mapped",[36123]],[[195031,195031],"mapped",[36215]],[[195032,195032],"mapped",[163631]],[[195033,195033],"mapped",[133124]],[[195034,195034],"mapped",[36299]],[[195035,195035],"mapped",[36284]],[[195036,195036],"mapped",[36336]],[[195037,195037],"mapped",[133342]],[[195038,195038],"mapped",[36564]],[[195039,195039],"mapped",[36664]],[[195040,195040],"mapped",[165330]],[[195041,195041],"mapped",[165357]],[[195042,195042],"mapped",[37012]],[[195043,195043],"mapped",[37105]],[[195044,195044],"mapped",[37137]],[[195045,195045],"mapped",[165678]],[[195046,195046],"mapped",[37147]],[[195047,195047],"mapped",[37432]],[[195048,195048],"mapped",[37591]],[[195049,195049],"mapped",[37592]],[[195050,195050],"mapped",[37500]],[[195051,195051],"mapped",[37881]],[[195052,195052],"mapped",[37909]],[[195053,195053],"mapped",[166906]],[[195054,195054],"mapped",[38283]],[[195055,195055],"mapped",[18837]],[[195056,195056],"mapped",[38327]],[[195057,195057],"mapped",[167287]],[[195058,195058],"mapped",[18918]],[[195059,195059],"mapped",[38595]],[[195060,195060],"mapped",[23986]],[[195061,195061],"mapped",[38691]],[[195062,195062],"mapped",[168261]],[[195063,195063],"mapped",[168474]],[[195064,195064],"mapped",[19054]],[[195065,195065],"mapped",[19062]],[[195066,195066],"mapped",[38880]],[[195067,195067],"mapped",[168970]],[[195068,195068],"mapped",[19122]],[[195069,195069],"mapped",[169110]],[[195070,195071],"mapped",[38923]],[[195072,195072],"mapped",[38953]],[[195073,195073],"mapped",[169398]],[[195074,195074],"mapped",[39138]],[[195075,195075],"mapped",[19251]],[[195076,195076],"mapped",[39209]],[[195077,195077],"mapped",[39335]],[[195078,195078],"mapped",[39362]],[[195079,195079],"mapped",[39422]],[[195080,195080],"mapped",[19406]],[[195081,195081],"mapped",[170800]],[[195082,195082],"mapped",[39698]],[[195083,195083],"mapped",[40000]],[[195084,195084],"mapped",[40189]],[[195085,195085],"mapped",[19662]],[[195086,195086],"mapped",[19693]],[[195087,195087],"mapped",[40295]],[[195088,195088],"mapped",[172238]],[[195089,195089],"mapped",[19704]],[[195090,195090],"mapped",[172293]],[[195091,195091],"mapped",[172558]],[[195092,195092],"mapped",[172689]],[[195093,195093],"mapped",[40635]],[[195094,195094],"mapped",[19798]],[[195095,195095],"mapped",[40697]],[[195096,195096],"mapped",[40702]],[[195097,195097],"mapped",[40709]],[[195098,195098],"mapped",[40719]],[[195099,195099],"mapped",[40726]],[[195100,195100],"mapped",[40763]],[[195101,195101],"mapped",[173568]],[[195102,196605],"disallowed"],[[196606,196607],"disallowed"],[[196608,262141],"disallowed"],[[262142,262143],"disallowed"],[[262144,327677],"disallowed"],[[327678,327679],"disallowed"],[[327680,393213],"disallowed"],[[393214,393215],"disallowed"],[[393216,458749],"disallowed"],[[458750,458751],"disallowed"],[[458752,524285],"disallowed"],[[524286,524287],"disallowed"],[[524288,589821],"disallowed"],[[589822,589823],"disallowed"],[[589824,655357],"disallowed"],[[655358,655359],"disallowed"],[[655360,720893],"disallowed"],[[720894,720895],"disallowed"],[[720896,786429],"disallowed"],[[786430,786431],"disallowed"],[[786432,851965],"disallowed"],[[851966,851967],"disallowed"],[[851968,917501],"disallowed"],[[917502,917503],"disallowed"],[[917504,917504],"disallowed"],[[917505,917505],"disallowed"],[[917506,917535],"disallowed"],[[917536,917631],"disallowed"],[[917632,917759],"disallowed"],[[917760,917999],"ignored"],[[918000,983037],"disallowed"],[[983038,983039],"disallowed"],[[983040,1048573],"disallowed"],[[1048574,1048575],"disallowed"],[[1048576,1114109],"disallowed"],[[1114110,1114111],"disallowed"]]'); + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __nccwpck_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ var threw = true; +/******/ try { +/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __nccwpck_require__); +/******/ threw = false; +/******/ } finally { +/******/ if(threw) delete __webpack_module_cache__[moduleId]; +/******/ } +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/compat */ +/******/ +/******/ if (typeof __nccwpck_require__ !== 'undefined') __nccwpck_require__.ab = __dirname + "/"; +/******/ +/************************************************************************/ +/******/ +/******/ // startup +/******/ // Load entry module and return exports +/******/ // This entry module is referenced by other modules so it can't be inlined +/******/ var __webpack_exports__ = __nccwpck_require__(1307); +/******/ module.exports = __webpack_exports__; +/******/ +/******/ })() +; \ No newline at end of file diff --git a/.github/actions/javascript/getDeployPullRequestList/index.js b/.github/actions/javascript/getDeployPullRequestList/index.js index ac5d0e26998a..6f76ba496bea 100644 --- a/.github/actions/javascript/getDeployPullRequestList/index.js +++ b/.github/actions/javascript/getDeployPullRequestList/index.js @@ -808,6 +808,14 @@ class GithubUtils { .then((events) => _.filter(events, (event) => event.event === 'closed')) .then((closedEvents) => lodashGet(_.last(closedEvents), 'actor.login', '')); } + + static getArtifactByName(artefactName) { + return this.paginate(this.octokit.actions.listArtifactsForRepo, { + owner: CONST.GITHUB_OWNER, + repo: CONST.APP_REPO, + per_page: 100, + }).then((data) => _.findWhere(data.artifacts, {name: artefactName})); + } } module.exports = GithubUtils; diff --git a/.github/actions/javascript/getPullRequestDetails/index.js b/.github/actions/javascript/getPullRequestDetails/index.js index 6bf75635b0dd..f0892bb95f7f 100644 --- a/.github/actions/javascript/getPullRequestDetails/index.js +++ b/.github/actions/javascript/getPullRequestDetails/index.js @@ -603,6 +603,14 @@ class GithubUtils { .then((events) => _.filter(events, (event) => event.event === 'closed')) .then((closedEvents) => lodashGet(_.last(closedEvents), 'actor.login', '')); } + + static getArtifactByName(artefactName) { + return this.paginate(this.octokit.actions.listArtifactsForRepo, { + owner: CONST.GITHUB_OWNER, + repo: CONST.APP_REPO, + per_page: 100, + }).then((data) => _.findWhere(data.artifacts, {name: artefactName})); + } } module.exports = GithubUtils; diff --git a/.github/actions/javascript/getReleaseBody/index.js b/.github/actions/javascript/getReleaseBody/index.js index 0110cabaf5cc..9d47a83587ba 100644 --- a/.github/actions/javascript/getReleaseBody/index.js +++ b/.github/actions/javascript/getReleaseBody/index.js @@ -603,6 +603,14 @@ class GithubUtils { .then((events) => _.filter(events, (event) => event.event === 'closed')) .then((closedEvents) => lodashGet(_.last(closedEvents), 'actor.login', '')); } + + static getArtifactByName(artefactName) { + return this.paginate(this.octokit.actions.listArtifactsForRepo, { + owner: CONST.GITHUB_OWNER, + repo: CONST.APP_REPO, + per_page: 100, + }).then((data) => _.findWhere(data.artifacts, {name: artefactName})); + } } module.exports = GithubUtils; diff --git a/.github/actions/javascript/isStagingDeployLocked/index.js b/.github/actions/javascript/isStagingDeployLocked/index.js index 37fd0525b167..d157c86a1eb4 100644 --- a/.github/actions/javascript/isStagingDeployLocked/index.js +++ b/.github/actions/javascript/isStagingDeployLocked/index.js @@ -587,6 +587,14 @@ class GithubUtils { .then((events) => _.filter(events, (event) => event.event === 'closed')) .then((closedEvents) => lodashGet(_.last(closedEvents), 'actor.login', '')); } + + static getArtifactByName(artefactName) { + return this.paginate(this.octokit.actions.listArtifactsForRepo, { + owner: CONST.GITHUB_OWNER, + repo: CONST.APP_REPO, + per_page: 100, + }).then((data) => _.findWhere(data.artifacts, {name: artefactName})); + } } module.exports = GithubUtils; diff --git a/.github/actions/javascript/markPullRequestsAsDeployed/index.js b/.github/actions/javascript/markPullRequestsAsDeployed/index.js index 917206463277..472f7018d45b 100644 --- a/.github/actions/javascript/markPullRequestsAsDeployed/index.js +++ b/.github/actions/javascript/markPullRequestsAsDeployed/index.js @@ -752,6 +752,14 @@ class GithubUtils { .then((events) => _.filter(events, (event) => event.event === 'closed')) .then((closedEvents) => lodashGet(_.last(closedEvents), 'actor.login', '')); } + + static getArtifactByName(artefactName) { + return this.paginate(this.octokit.actions.listArtifactsForRepo, { + owner: CONST.GITHUB_OWNER, + repo: CONST.APP_REPO, + per_page: 100, + }).then((data) => _.findWhere(data.artifacts, {name: artefactName})); + } } module.exports = GithubUtils; diff --git a/.github/actions/javascript/postTestBuildComment/index.js b/.github/actions/javascript/postTestBuildComment/index.js index a29e237d2d92..a906f26c014d 100644 --- a/.github/actions/javascript/postTestBuildComment/index.js +++ b/.github/actions/javascript/postTestBuildComment/index.js @@ -662,6 +662,14 @@ class GithubUtils { .then((events) => _.filter(events, (event) => event.event === 'closed')) .then((closedEvents) => lodashGet(_.last(closedEvents), 'actor.login', '')); } + + static getArtifactByName(artefactName) { + return this.paginate(this.octokit.actions.listArtifactsForRepo, { + owner: CONST.GITHUB_OWNER, + repo: CONST.APP_REPO, + per_page: 100, + }).then((data) => _.findWhere(data.artifacts, {name: artefactName})); + } } module.exports = GithubUtils; diff --git a/.github/actions/javascript/reopenIssueWithComment/index.js b/.github/actions/javascript/reopenIssueWithComment/index.js index 0016cf146c61..05b5c7ee3695 100644 --- a/.github/actions/javascript/reopenIssueWithComment/index.js +++ b/.github/actions/javascript/reopenIssueWithComment/index.js @@ -557,6 +557,14 @@ class GithubUtils { .then((events) => _.filter(events, (event) => event.event === 'closed')) .then((closedEvents) => lodashGet(_.last(closedEvents), 'actor.login', '')); } + + static getArtifactByName(artefactName) { + return this.paginate(this.octokit.actions.listArtifactsForRepo, { + owner: CONST.GITHUB_OWNER, + repo: CONST.APP_REPO, + per_page: 100, + }).then((data) => _.findWhere(data.artifacts, {name: artefactName})); + } } module.exports = GithubUtils; diff --git a/.github/actions/javascript/reviewerChecklist/index.js b/.github/actions/javascript/reviewerChecklist/index.js index c0249e2c6346..a0089032c83a 100644 --- a/.github/actions/javascript/reviewerChecklist/index.js +++ b/.github/actions/javascript/reviewerChecklist/index.js @@ -1,6 +1,3 @@ -/** - * NOTE: This is a compiled file. DO NOT directly edit this file. - */ /******/ (() => { // webpackBootstrap /******/ var __webpack_modules__ = ({ @@ -557,6 +554,14 @@ class GithubUtils { .then((events) => _.filter(events, (event) => event.event === 'closed')) .then((closedEvents) => lodashGet(_.last(closedEvents), 'actor.login', '')); } + + static getArtifactByName(artefactName) { + return this.paginate(this.octokit.actions.listArtifactsForRepo, { + owner: CONST.GITHUB_OWNER, + repo: CONST.APP_REPO, + per_page: 100, + }).then((data) => _.findWhere(data.artifacts, {name: artefactName})); + } } module.exports = GithubUtils; @@ -16104,4 +16109,4 @@ getNumberOfItemsFromReviewerChecklist() module.exports = __webpack_exports__; /******/ })() -; +; \ No newline at end of file diff --git a/.github/actions/javascript/validateReassureOutput/index.js b/.github/actions/javascript/validateReassureOutput/index.js index e70c379697cd..49aca8bfc5c0 100644 --- a/.github/actions/javascript/validateReassureOutput/index.js +++ b/.github/actions/javascript/validateReassureOutput/index.js @@ -1,6 +1,3 @@ -/** - * NOTE: This is a compiled file. DO NOT directly edit this file. - */ /******/ (() => { // webpackBootstrap /******/ var __webpack_modules__ = ({ @@ -2879,4 +2876,4 @@ module.exports = require("util"); /******/ module.exports = __webpack_exports__; /******/ /******/ })() -; +; \ No newline at end of file diff --git a/.github/actions/javascript/verifySignedCommits/index.js b/.github/actions/javascript/verifySignedCommits/index.js index 61b0e2063d30..8b83cc77ef8b 100644 --- a/.github/actions/javascript/verifySignedCommits/index.js +++ b/.github/actions/javascript/verifySignedCommits/index.js @@ -557,6 +557,14 @@ class GithubUtils { .then((events) => _.filter(events, (event) => event.event === 'closed')) .then((closedEvents) => lodashGet(_.last(closedEvents), 'actor.login', '')); } + + static getArtifactByName(artefactName) { + return this.paginate(this.octokit.actions.listArtifactsForRepo, { + owner: CONST.GITHUB_OWNER, + repo: CONST.APP_REPO, + per_page: 100, + }).then((data) => _.findWhere(data.artifacts, {name: artefactName})); + } } module.exports = GithubUtils; diff --git a/.github/scripts/buildActions.sh b/.github/scripts/buildActions.sh index 4bc095ba6a29..501c1e5d8385 100755 --- a/.github/scripts/buildActions.sh +++ b/.github/scripts/buildActions.sh @@ -25,6 +25,7 @@ declare -r GITHUB_ACTIONS=( "$ACTIONS_DIR/authorChecklist/authorChecklist.ts" "$ACTIONS_DIR/reviewerChecklist/reviewerChecklist.js" "$ACTIONS_DIR/validateReassureOutput/validateReassureOutput.js" + "$ACTIONS_DIR/getArtifactInfo/getArtifactInfo.js" ) # This will be inserted at the top of all compiled files as a warning to devs. From a2767b51160429ccbb5452ef335013ed7e6872cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hanno=20J=2E=20G=C3=B6decke?= Date: Fri, 16 Feb 2024 15:39:19 +0100 Subject: [PATCH 232/288] fix typo --- .github/workflows/e2ePerformanceTests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2ePerformanceTests.yml b/.github/workflows/e2ePerformanceTests.yml index 8c36a1e40dea..a534268d689c 100644 --- a/.github/workflows/e2ePerformanceTests.yml +++ b/.github/workflows/e2ePerformanceTests.yml @@ -37,7 +37,7 @@ jobs: - name: Check if there's an existing artifact for this baseline id: checkForExistingArtifact - uses: ./.github/actions/javascript/getArtefactInfo + uses: ./.github/actions/javascript/getArtifactInfo with: GITHUB_TOKEN: ${{ secrets.OS_BOTIFY_COMMIT_TOKEN }} ARTIFACT_NAME: baseline-apk-${{ steps.getMostRecentRelease.outputs.VERSION }} From b1817afc3f3373d71f0fcfccba3b2f1e538baafa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kacper=20Miko=C5=82ajczak?= Date: Fri, 16 Feb 2024 15:44:38 +0100 Subject: [PATCH 233/288] fix a typo --- src/libs/SidebarUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/SidebarUtils.ts b/src/libs/SidebarUtils.ts index 695ca8a570a2..838770ea9255 100644 --- a/src/libs/SidebarUtils.ts +++ b/src/libs/SidebarUtils.ts @@ -13,7 +13,7 @@ import type {ReportActions} from '@src/types/onyx/ReportAction'; import type ReportAction from '@src/types/onyx/ReportAction'; import type DeepValueOf from '@src/types/utils/DeepValueOf'; import * as CollectionUtils from './CollectionUtils'; -import localeCompare from './localeCompare'; +import localeCompare from './LocaleCompare'; import * as LocalePhoneNumber from './LocalePhoneNumber'; import * as Localize from './Localize'; import * as OptionsListUtils from './OptionsListUtils'; From b755b56c7eff8e707725a262d6eb59a92c7dbc63 Mon Sep 17 00:00:00 2001 From: ren-jones <153645623+ren-jones@users.noreply.github.com> Date: Fri, 16 Feb 2024 08:46:53 -0600 Subject: [PATCH 234/288] Create Merge-accounts.md New account settings help article --- .../account-settings/Merge-accounts.md | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 docs/articles/expensify-classic/settings/account-settings/Merge-accounts.md diff --git a/docs/articles/expensify-classic/settings/account-settings/Merge-accounts.md b/docs/articles/expensify-classic/settings/account-settings/Merge-accounts.md new file mode 100644 index 000000000000..b2e3b0cdf55b --- /dev/null +++ b/docs/articles/expensify-classic/settings/account-settings/Merge-accounts.md @@ -0,0 +1,30 @@ +--- +title: Merge accounts +description: Merge two Expensify accounts into one +--- +
    + +If you have two Expensify accounts (for example, a personal account and a separate account for your company), you can combine the two accounts by merging them. Once merged, all receipts, expenses, expense reports, invoices, bills, imported cards, secondary logins, co-pilots, and group workspace settings from both accounts will be combined into one account. + +{% include info.html %} +Merging two accounts is a permanent action that cannot be reversed. To merge a company and personal account, you must sign in to your company account and merge your personal account with it. You cannot merge a company account into a personal account, nor can you merge two different company accounts together if they are private domains. +{% include end-info.html %} + +*Note: This process is currently not available from the mobile app and must be completed from the Expensify website.* + +1. Log in to Expensify using the account you want to keep as the primary. +2. Hover over Settings and click **Account**. +3. Under Account Details, scroll down to the Merge Accounts section. +4. Enter the email address or phone number associated with the account that you want to merge into this account. +5. Select the “Yes, I understand this is not reversible” checkbox to agree. +6. Click **Merge Accounts**. +7. Check your email for the magic code sent from Expensify and copy the code. +8. Paste the code into the field and click **Merge**. + +# FAQ + +**What information merges into my new account?** + +All receipts, expenses, expense reports, invoices, bills, imported cards, secondary logins, co-pilots, and group workspace settings will be merged into your new account. + +
    From 2b9224c026559fc2e63f7930e214b655faefdf54 Mon Sep 17 00:00:00 2001 From: tienifr Date: Fri, 16 Feb 2024 21:51:22 +0700 Subject: [PATCH 235/288] fix: Distance request preview in the main chat is grayed out offline when created online --- src/libs/actions/Report.ts | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/src/libs/actions/Report.ts b/src/libs/actions/Report.ts index 4a791dd41b31..9134f0a89e61 100644 --- a/src/libs/actions/Report.ts +++ b/src/libs/actions/Report.ts @@ -571,19 +571,6 @@ function openReport( ]; const successData: OnyxUpdate[] = [ - { - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT}${reportID}`, - value: { - pendingFields: { - createChat: null, - }, - errorFields: { - createChat: null, - }, - isOptimisticReport: false, - }, - }, { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_METADATA}${reportID}`, @@ -647,11 +634,26 @@ function openReport( key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`, value: {[optimisticCreatedAction.reportActionID]: optimisticCreatedAction}, }); - successData.push({ - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`, - value: {[optimisticCreatedAction.reportActionID]: {pendingAction: null}}, - }); + successData.push( + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`, + value: {[optimisticCreatedAction.reportActionID]: {pendingAction: null}}, + }, + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT}${reportID}`, + value: { + pendingFields: { + createChat: null, + }, + errorFields: { + createChat: null, + }, + isOptimisticReport: false, + }, + }, + ); // Add optimistic personal details for new participants const optimisticPersonalDetails: OnyxCollection = {}; From 3b1b71d69ced02e383e549c2e1cf952dabb07c4b Mon Sep 17 00:00:00 2001 From: Rachid L Date: Fri, 16 Feb 2024 15:58:07 +0100 Subject: [PATCH 236/288] Update src/components/EmojiPicker/EmojiPickerMenu/BaseEmojiPickerMenu.js Co-authored-by: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> --- .../EmojiPicker/EmojiPickerMenu/BaseEmojiPickerMenu.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/components/EmojiPicker/EmojiPickerMenu/BaseEmojiPickerMenu.js b/src/components/EmojiPicker/EmojiPickerMenu/BaseEmojiPickerMenu.js index 3c3804a42a24..c6f475b681ba 100644 --- a/src/components/EmojiPicker/EmojiPickerMenu/BaseEmojiPickerMenu.js +++ b/src/components/EmojiPicker/EmojiPickerMenu/BaseEmojiPickerMenu.js @@ -112,9 +112,7 @@ function BaseEmojiPickerMenu({headerEmojis, scrollToHeader, isFiltered, listWrap const styles = useThemeStyles(); const {windowWidth, isSmallScreenWidth} = useWindowDimensions(); - // related to https://github.com/Expensify/App/issues/34522 - const roundedWindowWidth = Math.floor(windowWidth); - const containerWidth = isSmallScreenWidth ? roundedWindowWidth : CONST.EMOJI_PICKER_SIZE.WIDTH; + const containerWidth = isSmallScreenWidth ? Math.floor(windowWidth) : CONST.EMOJI_PICKER_SIZE.WIDTH; const flattenListWrapperStyle = useMemo(() => StyleSheet.flatten(listWrapperStyle), [listWrapperStyle]); From 01025a91c72132b666e712eff3606326704c3e09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hanno=20J=2E=20G=C3=B6decke?= Date: Fri, 16 Feb 2024 16:03:23 +0100 Subject: [PATCH 237/288] fix actions --- .github/actions/javascript/authorChecklist/index.js | 8 ++++++++ .github/actions/javascript/awaitStagingDeploys/index.js | 2 +- .github/actions/javascript/checkDeployBlockers/index.js | 2 +- .../javascript/createOrUpdateStagingDeploy/index.js | 2 +- .github/actions/javascript/getArtifactInfo/index.js | 7 +++++-- .../actions/javascript/getDeployPullRequestList/index.js | 2 +- .github/actions/javascript/getPullRequestDetails/index.js | 2 +- .github/actions/javascript/getReleaseBody/index.js | 2 +- .github/actions/javascript/isStagingDeployLocked/index.js | 2 +- .../javascript/markPullRequestsAsDeployed/index.js | 2 +- .github/actions/javascript/postTestBuildComment/index.js | 2 +- .../actions/javascript/reopenIssueWithComment/index.js | 2 +- .github/actions/javascript/reviewerChecklist/index.js | 7 +++++-- .../actions/javascript/validateReassureOutput/index.js | 5 ++++- .github/actions/javascript/verifySignedCommits/index.js | 2 +- .github/libs/GithubUtils.js | 2 +- 16 files changed, 34 insertions(+), 17 deletions(-) diff --git a/.github/actions/javascript/authorChecklist/index.js b/.github/actions/javascript/authorChecklist/index.js index 137020670c10..528a0a11498a 100644 --- a/.github/actions/javascript/authorChecklist/index.js +++ b/.github/actions/javascript/authorChecklist/index.js @@ -557,6 +557,14 @@ class GithubUtils { .then((events) => _.filter(events, (event) => event.event === 'closed')) .then((closedEvents) => lodashGet(_.last(closedEvents), 'actor.login', '')); } + + static getArtifactByName(artefactName) { + return this.paginate(this.octokit.actions.listArtifactsForRepo, { + owner: CONST.GITHUB_OWNER, + repo: CONST.APP_REPO, + per_page: 100, + }).then((artifacts) => _.findWhere(artifacts, {name: artefactName})); + } } module.exports = GithubUtils; diff --git a/.github/actions/javascript/awaitStagingDeploys/index.js b/.github/actions/javascript/awaitStagingDeploys/index.js index 6383af818e30..f042dbb38a91 100644 --- a/.github/actions/javascript/awaitStagingDeploys/index.js +++ b/.github/actions/javascript/awaitStagingDeploys/index.js @@ -675,7 +675,7 @@ class GithubUtils { owner: CONST.GITHUB_OWNER, repo: CONST.APP_REPO, per_page: 100, - }).then((data) => _.findWhere(data.artifacts, {name: artefactName})); + }).then((artifacts) => _.findWhere(artifacts, {name: artefactName})); } } diff --git a/.github/actions/javascript/checkDeployBlockers/index.js b/.github/actions/javascript/checkDeployBlockers/index.js index 081858ac9692..8e10f8b1d8b6 100644 --- a/.github/actions/javascript/checkDeployBlockers/index.js +++ b/.github/actions/javascript/checkDeployBlockers/index.js @@ -642,7 +642,7 @@ class GithubUtils { owner: CONST.GITHUB_OWNER, repo: CONST.APP_REPO, per_page: 100, - }).then((data) => _.findWhere(data.artifacts, {name: artefactName})); + }).then((artifacts) => _.findWhere(artifacts, {name: artefactName})); } } diff --git a/.github/actions/javascript/createOrUpdateStagingDeploy/index.js b/.github/actions/javascript/createOrUpdateStagingDeploy/index.js index 202bddf3119f..fa6ec923528a 100644 --- a/.github/actions/javascript/createOrUpdateStagingDeploy/index.js +++ b/.github/actions/javascript/createOrUpdateStagingDeploy/index.js @@ -871,7 +871,7 @@ class GithubUtils { owner: CONST.GITHUB_OWNER, repo: CONST.APP_REPO, per_page: 100, - }).then((data) => _.findWhere(data.artifacts, {name: artefactName})); + }).then((artifacts) => _.findWhere(artifacts, {name: artefactName})); } } diff --git a/.github/actions/javascript/getArtifactInfo/index.js b/.github/actions/javascript/getArtifactInfo/index.js index f6cdfedb159d..ea56ff5f4ebd 100644 --- a/.github/actions/javascript/getArtifactInfo/index.js +++ b/.github/actions/javascript/getArtifactInfo/index.js @@ -1,3 +1,6 @@ +/** + * NOTE: This is a compiled file. DO NOT directly edit this file. + */ /******/ (() => { // webpackBootstrap /******/ var __webpack_modules__ = ({ @@ -598,7 +601,7 @@ class GithubUtils { owner: CONST.GITHUB_OWNER, repo: CONST.APP_REPO, per_page: 100, - }).then((data) => _.findWhere(data.artifacts, {name: artefactName})); + }).then((artifacts) => _.findWhere(artifacts, {name: artefactName})); } } @@ -16001,4 +16004,4 @@ module.exports = JSON.parse('[[[0,44],"disallowed_STD3_valid"],[[45,46],"valid"] /******/ module.exports = __webpack_exports__; /******/ /******/ })() -; \ No newline at end of file +; diff --git a/.github/actions/javascript/getDeployPullRequestList/index.js b/.github/actions/javascript/getDeployPullRequestList/index.js index 6f76ba496bea..479620a9a52d 100644 --- a/.github/actions/javascript/getDeployPullRequestList/index.js +++ b/.github/actions/javascript/getDeployPullRequestList/index.js @@ -814,7 +814,7 @@ class GithubUtils { owner: CONST.GITHUB_OWNER, repo: CONST.APP_REPO, per_page: 100, - }).then((data) => _.findWhere(data.artifacts, {name: artefactName})); + }).then((artifacts) => _.findWhere(artifacts, {name: artefactName})); } } diff --git a/.github/actions/javascript/getPullRequestDetails/index.js b/.github/actions/javascript/getPullRequestDetails/index.js index f0892bb95f7f..b8d7d821d64e 100644 --- a/.github/actions/javascript/getPullRequestDetails/index.js +++ b/.github/actions/javascript/getPullRequestDetails/index.js @@ -609,7 +609,7 @@ class GithubUtils { owner: CONST.GITHUB_OWNER, repo: CONST.APP_REPO, per_page: 100, - }).then((data) => _.findWhere(data.artifacts, {name: artefactName})); + }).then((artifacts) => _.findWhere(artifacts, {name: artefactName})); } } diff --git a/.github/actions/javascript/getReleaseBody/index.js b/.github/actions/javascript/getReleaseBody/index.js index 9d47a83587ba..cc1321ce5cd5 100644 --- a/.github/actions/javascript/getReleaseBody/index.js +++ b/.github/actions/javascript/getReleaseBody/index.js @@ -609,7 +609,7 @@ class GithubUtils { owner: CONST.GITHUB_OWNER, repo: CONST.APP_REPO, per_page: 100, - }).then((data) => _.findWhere(data.artifacts, {name: artefactName})); + }).then((artifacts) => _.findWhere(artifacts, {name: artefactName})); } } diff --git a/.github/actions/javascript/isStagingDeployLocked/index.js b/.github/actions/javascript/isStagingDeployLocked/index.js index d157c86a1eb4..8124c5795a5a 100644 --- a/.github/actions/javascript/isStagingDeployLocked/index.js +++ b/.github/actions/javascript/isStagingDeployLocked/index.js @@ -593,7 +593,7 @@ class GithubUtils { owner: CONST.GITHUB_OWNER, repo: CONST.APP_REPO, per_page: 100, - }).then((data) => _.findWhere(data.artifacts, {name: artefactName})); + }).then((artifacts) => _.findWhere(artifacts, {name: artefactName})); } } diff --git a/.github/actions/javascript/markPullRequestsAsDeployed/index.js b/.github/actions/javascript/markPullRequestsAsDeployed/index.js index 472f7018d45b..36cd0aaefe4a 100644 --- a/.github/actions/javascript/markPullRequestsAsDeployed/index.js +++ b/.github/actions/javascript/markPullRequestsAsDeployed/index.js @@ -758,7 +758,7 @@ class GithubUtils { owner: CONST.GITHUB_OWNER, repo: CONST.APP_REPO, per_page: 100, - }).then((data) => _.findWhere(data.artifacts, {name: artefactName})); + }).then((artifacts) => _.findWhere(artifacts, {name: artefactName})); } } diff --git a/.github/actions/javascript/postTestBuildComment/index.js b/.github/actions/javascript/postTestBuildComment/index.js index a906f26c014d..329e0d3aad5d 100644 --- a/.github/actions/javascript/postTestBuildComment/index.js +++ b/.github/actions/javascript/postTestBuildComment/index.js @@ -668,7 +668,7 @@ class GithubUtils { owner: CONST.GITHUB_OWNER, repo: CONST.APP_REPO, per_page: 100, - }).then((data) => _.findWhere(data.artifacts, {name: artefactName})); + }).then((artifacts) => _.findWhere(artifacts, {name: artefactName})); } } diff --git a/.github/actions/javascript/reopenIssueWithComment/index.js b/.github/actions/javascript/reopenIssueWithComment/index.js index 05b5c7ee3695..6a5f89badb5e 100644 --- a/.github/actions/javascript/reopenIssueWithComment/index.js +++ b/.github/actions/javascript/reopenIssueWithComment/index.js @@ -563,7 +563,7 @@ class GithubUtils { owner: CONST.GITHUB_OWNER, repo: CONST.APP_REPO, per_page: 100, - }).then((data) => _.findWhere(data.artifacts, {name: artefactName})); + }).then((artifacts) => _.findWhere(artifacts, {name: artefactName})); } } diff --git a/.github/actions/javascript/reviewerChecklist/index.js b/.github/actions/javascript/reviewerChecklist/index.js index a0089032c83a..322b529b89bf 100644 --- a/.github/actions/javascript/reviewerChecklist/index.js +++ b/.github/actions/javascript/reviewerChecklist/index.js @@ -1,3 +1,6 @@ +/** + * NOTE: This is a compiled file. DO NOT directly edit this file. + */ /******/ (() => { // webpackBootstrap /******/ var __webpack_modules__ = ({ @@ -560,7 +563,7 @@ class GithubUtils { owner: CONST.GITHUB_OWNER, repo: CONST.APP_REPO, per_page: 100, - }).then((data) => _.findWhere(data.artifacts, {name: artefactName})); + }).then((artifacts) => _.findWhere(artifacts, {name: artefactName})); } } @@ -16109,4 +16112,4 @@ getNumberOfItemsFromReviewerChecklist() module.exports = __webpack_exports__; /******/ })() -; \ No newline at end of file +; diff --git a/.github/actions/javascript/validateReassureOutput/index.js b/.github/actions/javascript/validateReassureOutput/index.js index 49aca8bfc5c0..e70c379697cd 100644 --- a/.github/actions/javascript/validateReassureOutput/index.js +++ b/.github/actions/javascript/validateReassureOutput/index.js @@ -1,3 +1,6 @@ +/** + * NOTE: This is a compiled file. DO NOT directly edit this file. + */ /******/ (() => { // webpackBootstrap /******/ var __webpack_modules__ = ({ @@ -2876,4 +2879,4 @@ module.exports = require("util"); /******/ module.exports = __webpack_exports__; /******/ /******/ })() -; \ No newline at end of file +; diff --git a/.github/actions/javascript/verifySignedCommits/index.js b/.github/actions/javascript/verifySignedCommits/index.js index 8b83cc77ef8b..ba188d3a2b86 100644 --- a/.github/actions/javascript/verifySignedCommits/index.js +++ b/.github/actions/javascript/verifySignedCommits/index.js @@ -563,7 +563,7 @@ class GithubUtils { owner: CONST.GITHUB_OWNER, repo: CONST.APP_REPO, per_page: 100, - }).then((data) => _.findWhere(data.artifacts, {name: artefactName})); + }).then((artifacts) => _.findWhere(artifacts, {name: artefactName})); } } diff --git a/.github/libs/GithubUtils.js b/.github/libs/GithubUtils.js index 5a8110d96de2..0cd407c78153 100644 --- a/.github/libs/GithubUtils.js +++ b/.github/libs/GithubUtils.js @@ -530,7 +530,7 @@ class GithubUtils { owner: CONST.GITHUB_OWNER, repo: CONST.APP_REPO, per_page: 100, - }).then((data) => _.findWhere(data.artifacts, {name: artefactName})); + }).then((artifacts) => _.findWhere(artifacts, {name: artefactName})); } } From 3cda1707d69864f79cfa741c2b9b11c025049590 Mon Sep 17 00:00:00 2001 From: dragnoir Date: Fri, 16 Feb 2024 16:04:42 +0100 Subject: [PATCH 238/288] Fix; width passed via listWrapperStyle in index.native.ts --- .../EmojiPicker/EmojiPickerMenu/BaseEmojiPickerMenu.js | 3 ++- src/components/EmojiPicker/EmojiPickerMenu/index.native.js | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/EmojiPicker/EmojiPickerMenu/BaseEmojiPickerMenu.js b/src/components/EmojiPicker/EmojiPickerMenu/BaseEmojiPickerMenu.js index c6f475b681ba..f9f8911a226b 100644 --- a/src/components/EmojiPicker/EmojiPickerMenu/BaseEmojiPickerMenu.js +++ b/src/components/EmojiPicker/EmojiPickerMenu/BaseEmojiPickerMenu.js @@ -112,6 +112,7 @@ function BaseEmojiPickerMenu({headerEmojis, scrollToHeader, isFiltered, listWrap const styles = useThemeStyles(); const {windowWidth, isSmallScreenWidth} = useWindowDimensions(); + // Math.floor(windowWidth) because some devices turn width value like 392.72727272727275 const containerWidth = isSmallScreenWidth ? Math.floor(windowWidth) : CONST.EMOJI_PICKER_SIZE.WIDTH; const flattenListWrapperStyle = useMemo(() => StyleSheet.flatten(listWrapperStyle), [listWrapperStyle]); @@ -124,7 +125,7 @@ function BaseEmojiPickerMenu({headerEmojis, scrollToHeader, isFiltered, listWrap onPress={scrollToHeader} /> )} - + Date: Fri, 16 Feb 2024 16:10:15 +0100 Subject: [PATCH 239/288] use compatible version of upload-artifact --- .github/actions/composite/buildAndroidE2EAPK/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/composite/buildAndroidE2EAPK/action.yml b/.github/actions/composite/buildAndroidE2EAPK/action.yml index 74a1f789d2bf..a84aa83e7247 100644 --- a/.github/actions/composite/buildAndroidE2EAPK/action.yml +++ b/.github/actions/composite/buildAndroidE2EAPK/action.yml @@ -73,7 +73,7 @@ runs: shell: bash - name: Upload APK - uses: actions/upload-artifact@65d862660abb392b8c4a3d1195a2108db131dd05 + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 if: ${{ inputs.UPLOAD_ARTIFACT == 'true' }} with: name: ${{ inputs.ARTIFACT_NAME }} From 866de49cd23a168e9e6436eb3e0d338cf27e333c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hanno=20J=2E=20G=C3=B6decke?= Date: Fri, 16 Feb 2024 16:14:44 +0100 Subject: [PATCH 240/288] REVERT ME: use relative inputs for testing --- .github/workflows/e2ePerformanceTests.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/e2ePerformanceTests.yml b/.github/workflows/e2ePerformanceTests.yml index a534268d689c..5cb28a17c3ef 100644 --- a/.github/workflows/e2ePerformanceTests.yml +++ b/.github/workflows/e2ePerformanceTests.yml @@ -37,6 +37,7 @@ jobs: - name: Check if there's an existing artifact for this baseline id: checkForExistingArtifact + # TODO: CHANGE TO MAIN GITHUB VERSION BEFORE MERGING uses: ./.github/actions/javascript/getArtifactInfo with: GITHUB_TOKEN: ${{ secrets.OS_BOTIFY_COMMIT_TOKEN }} @@ -52,7 +53,7 @@ jobs: git fetch origin tag ${{ steps.getMostRecentRelease.outputs.VERSION }} --no-tags --depth=1 git switch --detach ${{ steps.getMostRecentRelease.outputs.VERSION }} - - uses: Expensify/App/.github/actions/composite/buildAndroidE2EAPK@main + - uses: ./.github/actions/composite/buildAndroidE2EAPK if: ${{ !fromJSON(steps.checkForExistingArtifact.outputs.ARTIFACT_FOUND) }} with: ARTIFACT_NAME: baseline-apk-${{ steps.getMostRecentRelease.outputs.VERSION }} @@ -121,7 +122,8 @@ jobs: - name: Checkout "delta ref" run: git checkout ${{ steps.getDeltaRef.outputs.DELTA_REF }} - - uses: Expensify/App/.github/actions/composite/buildAndroidE2EAPK@main + #TODO: REVERT TO Expensify/App/.github/actions/composite/buildAndroidE2EAPK@main BEFORE MERGING!!! + - uses: ./.github/actions/composite/buildAndroidE2EAPK with: ARTIFACT_NAME: delta-apk-${{ steps.getDeltaRef.outputs.DELTA_REF }} UPLOAD_ARTIFACT: false From 7675c5836f173f506b2874e3fdf1556001bc7597 Mon Sep 17 00:00:00 2001 From: Rachid L Date: Fri, 16 Feb 2024 17:06:47 +0100 Subject: [PATCH 241/288] Update src/components/EmojiPicker/EmojiPickerMenu/BaseEmojiPickerMenu.js Co-authored-by: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> --- .../EmojiPicker/EmojiPickerMenu/BaseEmojiPickerMenu.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/EmojiPicker/EmojiPickerMenu/BaseEmojiPickerMenu.js b/src/components/EmojiPicker/EmojiPickerMenu/BaseEmojiPickerMenu.js index f9f8911a226b..5dbe7fdebbea 100644 --- a/src/components/EmojiPicker/EmojiPickerMenu/BaseEmojiPickerMenu.js +++ b/src/components/EmojiPicker/EmojiPickerMenu/BaseEmojiPickerMenu.js @@ -125,7 +125,7 @@ function BaseEmojiPickerMenu({headerEmojis, scrollToHeader, isFiltered, listWrap onPress={scrollToHeader} /> )} - + Date: Fri, 16 Feb 2024 17:06:54 +0100 Subject: [PATCH 242/288] Update src/components/EmojiPicker/EmojiPickerMenu/BaseEmojiPickerMenu.js Co-authored-by: Abdelhafidh Belalia <16493223+s77rt@users.noreply.github.com> --- .../EmojiPicker/EmojiPickerMenu/BaseEmojiPickerMenu.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/EmojiPicker/EmojiPickerMenu/BaseEmojiPickerMenu.js b/src/components/EmojiPicker/EmojiPickerMenu/BaseEmojiPickerMenu.js index 5dbe7fdebbea..77f058306643 100644 --- a/src/components/EmojiPicker/EmojiPickerMenu/BaseEmojiPickerMenu.js +++ b/src/components/EmojiPicker/EmojiPickerMenu/BaseEmojiPickerMenu.js @@ -112,8 +112,9 @@ function BaseEmojiPickerMenu({headerEmojis, scrollToHeader, isFiltered, listWrap const styles = useThemeStyles(); const {windowWidth, isSmallScreenWidth} = useWindowDimensions(); - // Math.floor(windowWidth) because some devices turn width value like 392.72727272727275 - const containerWidth = isSmallScreenWidth ? Math.floor(windowWidth) : CONST.EMOJI_PICKER_SIZE.WIDTH; + // Estimated list size should be a whole integer to avoid floating point precision errors + // More info: https://github.com/Expensify/App/issues/34522 + const listWidth = isSmallScreenWidth ? Math.floor(windowWidth) : CONST.EMOJI_PICKER_SIZE.WIDTH; const flattenListWrapperStyle = useMemo(() => StyleSheet.flatten(listWrapperStyle), [listWrapperStyle]); From 75903f78c0c4707f745d3f885069b5f1610396a6 Mon Sep 17 00:00:00 2001 From: dragnoir Date: Fri, 16 Feb 2024 17:13:53 +0100 Subject: [PATCH 243/288] fix: naming listWidth --- .../EmojiPicker/EmojiPickerMenu/BaseEmojiPickerMenu.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/EmojiPicker/EmojiPickerMenu/BaseEmojiPickerMenu.js b/src/components/EmojiPicker/EmojiPickerMenu/BaseEmojiPickerMenu.js index 77f058306643..b263885f0a60 100644 --- a/src/components/EmojiPicker/EmojiPickerMenu/BaseEmojiPickerMenu.js +++ b/src/components/EmojiPicker/EmojiPickerMenu/BaseEmojiPickerMenu.js @@ -138,7 +138,7 @@ function BaseEmojiPickerMenu({headerEmojis, scrollToHeader, isFiltered, listWrap ListEmptyComponent={ListEmptyComponent} alwaysBounceVertical={alwaysBounceVertical} estimatedItemSize={CONST.EMOJI_PICKER_ITEM_HEIGHT} - estimatedListSize={{height: flattenListWrapperStyle.height, width: containerWidth}} + estimatedListSize={{height: flattenListWrapperStyle.height, width: listWidth}} contentContainerStyle={styles.ph4} extraData={extraData} getItemType={getItemType} From 0ceb66792b157d22dd2e0aa26eda3d06d3d56973 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hanno=20J=2E=20G=C3=B6decke?= Date: Fri, 16 Feb 2024 18:27:37 +0100 Subject: [PATCH 244/288] fix upload delta build --- .github/actions/composite/buildAndroidE2EAPK/action.yml | 9 +++++---- .github/workflows/e2ePerformanceTests.yml | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/actions/composite/buildAndroidE2EAPK/action.yml b/.github/actions/composite/buildAndroidE2EAPK/action.yml index a84aa83e7247..47e13f6313a0 100644 --- a/.github/actions/composite/buildAndroidE2EAPK/action.yml +++ b/.github/actions/composite/buildAndroidE2EAPK/action.yml @@ -5,10 +5,11 @@ inputs: ARTIFACT_NAME: description: The name of the workflow artifact where the APK should be uploaded required: true - UPLOAD_ARTIFACT: - description: Whether to upload the APK as an artifact + ARTIFACT_RETENTION_DAYS: + description: The number of days to retain the artifact required: false - default: "true" + # Thats github default: + default: "90" PACKAGE_SCRIPT_NAME: description: The name of the npm script to run to build the APK required: true @@ -74,7 +75,7 @@ runs: - name: Upload APK uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 - if: ${{ inputs.UPLOAD_ARTIFACT == 'true' }} with: name: ${{ inputs.ARTIFACT_NAME }} path: ${{ inputs.APP_OUTPUT_PATH }} + retention-days: ${{ inputs.ARTIFACT_RETENTION_DAYS }} diff --git a/.github/workflows/e2ePerformanceTests.yml b/.github/workflows/e2ePerformanceTests.yml index 5cb28a17c3ef..f6985fbb89ad 100644 --- a/.github/workflows/e2ePerformanceTests.yml +++ b/.github/workflows/e2ePerformanceTests.yml @@ -126,7 +126,7 @@ jobs: - uses: ./.github/actions/composite/buildAndroidE2EAPK with: ARTIFACT_NAME: delta-apk-${{ steps.getDeltaRef.outputs.DELTA_REF }} - UPLOAD_ARTIFACT: false + ARTIFACT_RETENTION_DAYS: 3 # We don't need to store the delta apk for long, its only really needed for the next job in this workflow PACKAGE_SCRIPT_NAME: android-build-e2edelta APP_OUTPUT_PATH: android/app/build/outputs/apk/e2edelta/release/app-e2edelta-release.apk MAPBOX_SDK_DOWNLOAD_TOKEN: ${{ secrets.MAPBOX_SDK_DOWNLOAD_TOKEN }} From a936e5c36dc551dcd89b2b9aac410212a573c79f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hanno=20J=2E=20G=C3=B6decke?= Date: Fri, 16 Feb 2024 18:28:47 +0100 Subject: [PATCH 245/288] REVERT ME: testing release build not existing --- .github/workflows/e2ePerformanceTests.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/e2ePerformanceTests.yml b/.github/workflows/e2ePerformanceTests.yml index f6985fbb89ad..21b342a49f2c 100644 --- a/.github/workflows/e2ePerformanceTests.yml +++ b/.github/workflows/e2ePerformanceTests.yml @@ -31,7 +31,9 @@ jobs: - name: Get most recent release version id: getMostRecentRelease - run: echo "VERSION=$(gh release list --limit 1 | awk '{ print $1 }')" >> "$GITHUB_OUTPUT" + # run: echo "VERSION=$(gh release list --limit 1 | awk '{ print $1 }')" >> "$GITHUB_OUTPUT" + # TODO: REVERT TO ABOVE LINE; ONLY FOR TESTING + run: echo "VERSION=on_existing_version" >> "$GITHUB_OUTPUT" env: GITHUB_TOKEN: ${{ github.token }} From 3bb8be8c49daad590ecb0f00661770031fad745b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hanno=20J=2E=20G=C3=B6decke?= Date: Fri, 16 Feb 2024 18:33:35 +0100 Subject: [PATCH 246/288] REVERT ME: skip checkout for testing --- .github/workflows/e2ePerformanceTests.yml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/e2ePerformanceTests.yml b/.github/workflows/e2ePerformanceTests.yml index 21b342a49f2c..ffd56a4c4e18 100644 --- a/.github/workflows/e2ePerformanceTests.yml +++ b/.github/workflows/e2ePerformanceTests.yml @@ -49,11 +49,12 @@ jobs: if: ${{ fromJSON(steps.checkForExistingArtifact.outputs.ARTIFACT_FOUND) }} run: echo 'APK for baseline ${{ steps.getMostRecentRelease.outputs.VERSION }} already exists, reusing existing build' - - name: Checkout "Baseline" commit (last release) - if: ${{ !fromJSON(steps.checkForExistingArtifact.outputs.ARTIFACT_FOUND) }} - run: | - git fetch origin tag ${{ steps.getMostRecentRelease.outputs.VERSION }} --no-tags --depth=1 - git switch --detach ${{ steps.getMostRecentRelease.outputs.VERSION }} + # TODO: UNCOMMENT BELOW LINES BEFORE MERGING + # - name: Checkout "Baseline" commit (last release) + # if: ${{ !fromJSON(steps.checkForExistingArtifact.outputs.ARTIFACT_FOUND) }} + # run: | + # git fetch origin tag ${{ steps.getMostRecentRelease.outputs.VERSION }} --no-tags --depth=1 + # git switch --detach ${{ steps.getMostRecentRelease.outputs.VERSION }} - uses: ./.github/actions/composite/buildAndroidE2EAPK if: ${{ !fromJSON(steps.checkForExistingArtifact.outputs.ARTIFACT_FOUND) }} From 90b6158a023408fea4febf3ef8fce1621cde6c32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hanno=20J=2E=20G=C3=B6decke?= Date: Fri, 16 Feb 2024 19:54:54 +0100 Subject: [PATCH 247/288] revert temp changes --- .github/workflows/e2ePerformanceTests.yml | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/.github/workflows/e2ePerformanceTests.yml b/.github/workflows/e2ePerformanceTests.yml index ffd56a4c4e18..872759027661 100644 --- a/.github/workflows/e2ePerformanceTests.yml +++ b/.github/workflows/e2ePerformanceTests.yml @@ -31,15 +31,12 @@ jobs: - name: Get most recent release version id: getMostRecentRelease - # run: echo "VERSION=$(gh release list --limit 1 | awk '{ print $1 }')" >> "$GITHUB_OUTPUT" - # TODO: REVERT TO ABOVE LINE; ONLY FOR TESTING - run: echo "VERSION=on_existing_version" >> "$GITHUB_OUTPUT" + run: echo "VERSION=$(gh release list --limit 1 | awk '{ print $1 }')" >> "$GITHUB_OUTPUT" env: GITHUB_TOKEN: ${{ github.token }} - name: Check if there's an existing artifact for this baseline id: checkForExistingArtifact - # TODO: CHANGE TO MAIN GITHUB VERSION BEFORE MERGING uses: ./.github/actions/javascript/getArtifactInfo with: GITHUB_TOKEN: ${{ secrets.OS_BOTIFY_COMMIT_TOKEN }} @@ -49,12 +46,11 @@ jobs: if: ${{ fromJSON(steps.checkForExistingArtifact.outputs.ARTIFACT_FOUND) }} run: echo 'APK for baseline ${{ steps.getMostRecentRelease.outputs.VERSION }} already exists, reusing existing build' - # TODO: UNCOMMENT BELOW LINES BEFORE MERGING - # - name: Checkout "Baseline" commit (last release) - # if: ${{ !fromJSON(steps.checkForExistingArtifact.outputs.ARTIFACT_FOUND) }} - # run: | - # git fetch origin tag ${{ steps.getMostRecentRelease.outputs.VERSION }} --no-tags --depth=1 - # git switch --detach ${{ steps.getMostRecentRelease.outputs.VERSION }} + - name: Checkout "Baseline" commit (last release) + if: ${{ !fromJSON(steps.checkForExistingArtifact.outputs.ARTIFACT_FOUND) }} + run: | + git fetch origin tag ${{ steps.getMostRecentRelease.outputs.VERSION }} --no-tags --depth=1 + git switch --detach ${{ steps.getMostRecentRelease.outputs.VERSION }} - uses: ./.github/actions/composite/buildAndroidE2EAPK if: ${{ !fromJSON(steps.checkForExistingArtifact.outputs.ARTIFACT_FOUND) }} @@ -125,8 +121,7 @@ jobs: - name: Checkout "delta ref" run: git checkout ${{ steps.getDeltaRef.outputs.DELTA_REF }} - #TODO: REVERT TO Expensify/App/.github/actions/composite/buildAndroidE2EAPK@main BEFORE MERGING!!! - - uses: ./.github/actions/composite/buildAndroidE2EAPK + - uses: Expensify/App/.github/actions/composite/buildAndroidE2EAPK@main with: ARTIFACT_NAME: delta-apk-${{ steps.getDeltaRef.outputs.DELTA_REF }} ARTIFACT_RETENTION_DAYS: 3 # We don't need to store the delta apk for long, its only really needed for the next job in this workflow From 77fd34f1fbb37a6925b5ae33e735df4bedfcb0e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hanno=20J=2E=20G=C3=B6decke?= Date: Fri, 16 Feb 2024 19:55:29 +0100 Subject: [PATCH 248/288] use compatible version for downloading artifact --- .github/workflows/e2ePerformanceTests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2ePerformanceTests.yml b/.github/workflows/e2ePerformanceTests.yml index 872759027661..22742a4c7494 100644 --- a/.github/workflows/e2ePerformanceTests.yml +++ b/.github/workflows/e2ePerformanceTests.yml @@ -166,7 +166,7 @@ jobs: run: mv "${{steps.downloadBaselineAPK.outputs.download-path}}/app-e2e-release.apk" "${{steps.downloadBaselineAPK.outputs.download-path}}/app-e2eRelease.apk" - name: Download delta APK - uses: actions/download-artifact@e9ef242655d12993efdcda9058dee2db83a2cb9b + uses: actions/download-artifact@348754975ef0295bfa2c111cba996120cfdf8a5d id: downloadDeltaAPK with: name: delta-apk-${{ needs.buildDelta.outputs.DELTA_REF }} From a610aba7e8ff6d6c560e0ccee83cdff0a671277a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hanno=20J=2E=20G=C3=B6decke?= Date: Fri, 16 Feb 2024 19:59:12 +0100 Subject: [PATCH 249/288] use main version --- .github/workflows/e2ePerformanceTests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2ePerformanceTests.yml b/.github/workflows/e2ePerformanceTests.yml index 22742a4c7494..ad0f60bf4018 100644 --- a/.github/workflows/e2ePerformanceTests.yml +++ b/.github/workflows/e2ePerformanceTests.yml @@ -52,7 +52,7 @@ jobs: git fetch origin tag ${{ steps.getMostRecentRelease.outputs.VERSION }} --no-tags --depth=1 git switch --detach ${{ steps.getMostRecentRelease.outputs.VERSION }} - - uses: ./.github/actions/composite/buildAndroidE2EAPK + - uses: Expensify/App/.github/actions/composite/buildAndroidE2EAPK@main if: ${{ !fromJSON(steps.checkForExistingArtifact.outputs.ARTIFACT_FOUND) }} with: ARTIFACT_NAME: baseline-apk-${{ steps.getMostRecentRelease.outputs.VERSION }} From 06dcc04174e8f6363d973ddad36d613013dc43d5 Mon Sep 17 00:00:00 2001 From: Puneet Lath Date: Fri, 16 Feb 2024 15:15:57 -0500 Subject: [PATCH 250/288] Add UPDATEROOMDESCRIPTION report action type --- src/CONST.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/CONST.ts b/src/CONST.ts index 3936abafb923..df0e1ad1c4ee 100755 --- a/src/CONST.ts +++ b/src/CONST.ts @@ -648,6 +648,7 @@ const CONST = { INVITE_TO_ROOM: 'INVITETOROOM', REMOVE_FROM_ROOM: 'REMOVEFROMROOM', LEAVE_ROOM: 'LEAVEROOM', + UPDATE_ROOM_DESCRIPTION: 'UPDATEROOMDESCRIPTION', }, UNHOLD: 'UNHOLD', }, From c0547319a0c7603942cb205ccf1b08c83e2d9dd2 Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Fri, 16 Feb 2024 17:43:08 -0500 Subject: [PATCH 251/288] fix(Violations): revert translation --- src/languages/en.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/languages/en.ts b/src/languages/en.ts index 69e09283e97b..080c93400428 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -2303,7 +2303,8 @@ export default { overLimitAttendee: ({formattedLimit}: ViolationsOverLimitParams) => `Amount over ${formattedLimit}/person limit`, perDayLimit: ({formattedLimit}: ViolationsPerDayLimitParams) => `Amount over daily ${formattedLimit}/person category limit`, receiptNotSmartScanned: 'Receipt not verified. Please confirm accuracy.', - receiptRequired: (params: ViolationsReceiptRequiredParams) => `Receipt required${params ? ` over ${params.formattedLimit}${params.category ? ` category limit` : ''}` : ''}`, + receiptRequired: ({formattedLimit, category}: ViolationsReceiptRequiredParams) => + `Receipt required${formattedLimit && category ? ` over ${formattedLimit}${category ? ` category limit` : ''}` : ''}`, reviewRequired: 'Review required', rter: ({brokenBankConnection, email, isAdmin, isTransactionOlderThan7Days, member}: ViolationsRterParams) => { if (brokenBankConnection) { From 01f627943fc0676e7d2f452c620bb32ef7d07186 Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Fri, 16 Feb 2024 17:50:16 -0500 Subject: [PATCH 252/288] fix(Violations): move comment --- .../ReportActionItem/MoneyRequestPreview/index.tsx | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/components/ReportActionItem/MoneyRequestPreview/index.tsx b/src/components/ReportActionItem/MoneyRequestPreview/index.tsx index 81e36a423f66..e84a6fa9d25c 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview/index.tsx +++ b/src/components/ReportActionItem/MoneyRequestPreview/index.tsx @@ -1,5 +1,3 @@ -// We should not render the component if there is no iouReport and it's not a split. -// Moved outside of the component scope to allow memoization of values later. import lodashIsEmpty from 'lodash/isEmpty'; import React from 'react'; import {withOnyx} from 'react-native-onyx'; @@ -8,9 +6,9 @@ import ONYXKEYS from '@src/ONYXKEYS'; import MoneyRequestPreviewContent from './MoneyRequestPreviewContent'; import type {MoneyRequestPreviewOnyxProps, MoneyRequestPreviewProps} from './types'; -// We should not render the component if there is no iouReport and it's not a split. -// Moved outside of the component scope to allow for easier use of hooks in the main component. function MoneyRequestPreview(props: MoneyRequestPreviewProps) { + // We should not render the component if there is no iouReport and it's not a split. + // Moved outside of the component scope to allow for easier use of hooks in the main component. // eslint-disable-next-line react/jsx-props-no-spreading return lodashIsEmpty(props.iouReport) && !props.isBillSplit ? null : ; } From 9f21c3ee96b2a0b7c54aec0d57edcd47f342ab31 Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Fri, 16 Feb 2024 17:50:23 -0500 Subject: [PATCH 253/288] fix(Violations): refactor --- .../ReportActionItem/MoneyRequestPreview/index.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/components/ReportActionItem/MoneyRequestPreview/index.tsx b/src/components/ReportActionItem/MoneyRequestPreview/index.tsx index e84a6fa9d25c..1c502c53f99e 100644 --- a/src/components/ReportActionItem/MoneyRequestPreview/index.tsx +++ b/src/components/ReportActionItem/MoneyRequestPreview/index.tsx @@ -29,7 +29,11 @@ export default withOnyx( key: ONYXKEYS.SESSION, }, transaction: { - key: ({action}) => `${ONYXKEYS.COLLECTION.TRANSACTION}${ReportActionsUtils.isMoneyRequestAction(action) ? action?.originalMessage?.IOUTransactionID : 0 ?? 0}`, + key: ({action}) => { + const isMoneyRequestAction = ReportActionsUtils.isMoneyRequestAction(action); + const transactionID = isMoneyRequestAction ? action?.originalMessage?.IOUTransactionID : 0; + return `${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`; + }, }, walletTerms: { key: ONYXKEYS.WALLET_TERMS, From 79b0598a6cee617dadc25106ffd31c956b05cfb8 Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Fri, 16 Feb 2024 18:08:15 -0500 Subject: [PATCH 254/288] fix(Violations): respace comment --- src/libs/ErrorUtils.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/libs/ErrorUtils.ts b/src/libs/ErrorUtils.ts index ee6183af82e3..20313ee8912d 100644 --- a/src/libs/ErrorUtils.ts +++ b/src/libs/ErrorUtils.ts @@ -151,7 +151,9 @@ function addErrorMessage(errors: Errors, inputID? } } -/** Check if the error includes a receipt. */ +/** + * Check if the error includes a receipt. + */ function isReceiptError(message: unknown): message is ReceiptError { if (typeof message === 'string') { return false; From e3699d3a2bdac73c36001c4b6019c5143546bd22 Mon Sep 17 00:00:00 2001 From: Trevor Coleman Date: Fri, 16 Feb 2024 18:29:10 -0500 Subject: [PATCH 255/288] fix(Violations): harmonize translations --- src/languages/en.ts | 3 +-- src/languages/es.ts | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/languages/en.ts b/src/languages/en.ts index 080c93400428..a86cf18818b0 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -2303,8 +2303,7 @@ export default { overLimitAttendee: ({formattedLimit}: ViolationsOverLimitParams) => `Amount over ${formattedLimit}/person limit`, perDayLimit: ({formattedLimit}: ViolationsPerDayLimitParams) => `Amount over daily ${formattedLimit}/person category limit`, receiptNotSmartScanned: 'Receipt not verified. Please confirm accuracy.', - receiptRequired: ({formattedLimit, category}: ViolationsReceiptRequiredParams) => - `Receipt required${formattedLimit && category ? ` over ${formattedLimit}${category ? ` category limit` : ''}` : ''}`, + receiptRequired: (params: ViolationsReceiptRequiredParams) => `Receipt required${params ? ` over ${params.formattedLimit}${params.category ? ' category limit' : ''}` : ''}`, reviewRequired: 'Review required', rter: ({brokenBankConnection, email, isAdmin, isTransactionOlderThan7Days, member}: ViolationsRterParams) => { if (brokenBankConnection) { diff --git a/src/languages/es.ts b/src/languages/es.ts index 486e7d36f33d..b304f840fc8e 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -2793,8 +2793,8 @@ export default { overLimitAttendee: ({formattedLimit}: ViolationsOverLimitParams) => `Importe supera el límite${formattedLimit ? ` de ${formattedLimit}/persona` : ''}`, perDayLimit: ({formattedLimit}: ViolationsPerDayLimitParams) => `Importe supera el límite diario de la categoría${formattedLimit ? ` de ${formattedLimit}/persona` : ''}`, receiptNotSmartScanned: 'Recibo no verificado. Por favor, confirma su exactitud', - receiptRequired: ({category, formattedLimit}: ViolationsReceiptRequiredParams) => - `Recibo obligatorio${!category && !formattedLimit ? '' : ` para importes sobre${category ? ` el limite de la categoría de` : ''} ${formattedLimit}`}`, + receiptRequired: (params: ViolationsReceiptRequiredParams) => + `Recibo obligatorio${params ? ` para importes sobre${params.formattedLimit ? ` ${params.formattedLimit}` : ''}${params.category ? ' el límite de la categoría' : ''}` : ''}`, reviewRequired: 'Revisión requerida', rter: ({brokenBankConnection, isAdmin, email, isTransactionOlderThan7Days, member}: ViolationsRterParams) => { if (brokenBankConnection) { From bb1a68110d8eecad45bede4f1b3ad2810c668724 Mon Sep 17 00:00:00 2001 From: rory Date: Fri, 16 Feb 2024 18:40:55 -0800 Subject: [PATCH 256/288] Bump cloudflare version --- .github/workflows/deployExpensifyHelp.yml | 2 +- .github/workflows/platformDeploy.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deployExpensifyHelp.yml b/.github/workflows/deployExpensifyHelp.yml index 25b1b0dad341..831ec0c0b95e 100644 --- a/.github/workflows/deployExpensifyHelp.yml +++ b/.github/workflows/deployExpensifyHelp.yml @@ -53,7 +53,7 @@ jobs: directory: ./docs/_site - name: Setup Cloudflare CLI - run: pip3 install cloudflare==2.17.0 + run: pip3 install cloudflare==2.19.0 - name: Purge Cloudflare cache run: /home/runner/.local/bin/cli4 --verbose --delete hosts=["help.expensify.com"] /zones/:9ee042e6cfc7fd45e74aa7d2f78d617b/purge_cache diff --git a/.github/workflows/platformDeploy.yml b/.github/workflows/platformDeploy.yml index df3c2b3617bb..7c7b51240fdb 100644 --- a/.github/workflows/platformDeploy.yml +++ b/.github/workflows/platformDeploy.yml @@ -301,7 +301,7 @@ jobs: uses: ./.github/actions/composite/setupNode - name: Setup Cloudflare CLI - run: pip3 install cloudflare==2.17.0 + run: pip3 install cloudflare==2.19.0 - name: Configure AWS Credentials uses: aws-actions/configure-aws-credentials@v4 From 20af9e52db6031dea6d0086a6692682eb15e422a Mon Sep 17 00:00:00 2001 From: OSBotify Date: Sat, 17 Feb 2024 03:11:44 +0000 Subject: [PATCH 257/288] Update version to 1.4.42-2 --- android/app/build.gradle | 4 ++-- ios/NewExpensify/Info.plist | 2 +- ios/NewExpensifyTests/Info.plist | 2 +- ios/NotificationServiceExtension/Info.plist | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index c41f78e5aa31..c37b427daf63 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -98,8 +98,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1001044201 - versionName "1.4.42-1" + versionCode 1001044202 + versionName "1.4.42-2" } flavorDimensions "default" diff --git a/ios/NewExpensify/Info.plist b/ios/NewExpensify/Info.plist index 79a54cfd702c..60ccc41d056d 100644 --- a/ios/NewExpensify/Info.plist +++ b/ios/NewExpensify/Info.plist @@ -40,7 +40,7 @@ CFBundleVersion - 1.4.42.1 + 1.4.42.2 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/ios/NewExpensifyTests/Info.plist b/ios/NewExpensifyTests/Info.plist index d3084c0e07eb..3308fbfa510a 100644 --- a/ios/NewExpensifyTests/Info.plist +++ b/ios/NewExpensifyTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 1.4.42.1 + 1.4.42.2 diff --git a/ios/NotificationServiceExtension/Info.plist b/ios/NotificationServiceExtension/Info.plist index 93e1f6e20d17..5773eef2dba2 100644 --- a/ios/NotificationServiceExtension/Info.plist +++ b/ios/NotificationServiceExtension/Info.plist @@ -13,7 +13,7 @@ CFBundleShortVersionString 1.4.42 CFBundleVersion - 1.4.42.1 + 1.4.42.2 NSExtension NSExtensionPointIdentifier diff --git a/package-lock.json b/package-lock.json index b6ed99eb8580..c94923a81699 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "new.expensify", - "version": "1.4.42-1", + "version": "1.4.42-2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "new.expensify", - "version": "1.4.42-1", + "version": "1.4.42-2", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 161686f78345..825f5b5a9908 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "new.expensify", - "version": "1.4.42-1", + "version": "1.4.42-2", "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 6856016d366fa811d888800c848a76bd2b4fab2c Mon Sep 17 00:00:00 2001 From: Ishpaul Singh <104348397+ishpaul777@users.noreply.github.com> Date: Sat, 17 Feb 2024 18:31:44 +0530 Subject: [PATCH 258/288] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c7ad11c1c93e..72736b3fedb7 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,7 @@ For an M1 Mac, read this [SO](https://stackoverflow.com/questions/64901180/how-t * To run a on a **Development Simulator**: `npm run ios` * Changes applied to Javascript will be applied automatically, any changes to native code will require a recompile -If you want to run the app on an actual physical iOS device, please follow the instructions [here](https://github.com/Expensify/App/blob/docs/how-to-build-app-on-physcial-device/contributingGuides/HOW_TO_BUILD_APP_ON_PHYSICAL_IOS_DEVICE.md). +If you want to run the app on an actual physical iOS device, please follow the instructions [here](https://github.com/Expensify/App/blob/main/contributingGuides/HOW_TO_BUILD_APP_ON_PHYSICAL_IOS_DEVICE.md). ## Running the Android app 🤖 * Before installing Android dependencies, you need to obtain a token from Mapbox to download their SDKs. Please run `npm run configure-mapbox` and follow the instructions. If you already did this step for iOS, there is no need to repeat this step. From ed824786d97ef0b46fe4ef9e2e4028e51687d1c0 Mon Sep 17 00:00:00 2001 From: Abdelrahman Khattab Date: Sat, 17 Feb 2024 18:06:31 +0200 Subject: [PATCH 259/288] Hide the double offline indicator in bank steps --- .../BankInfo/substeps/Confirmation.tsx | 87 +++++----- .../ConfirmationUBO.tsx | 151 +++++++++-------- .../substeps/CompanyOwnersListUBO.tsx | 83 +++++---- .../PersonalInfo/substeps/Confirmation.tsx | 157 +++++++++--------- 4 files changed, 233 insertions(+), 245 deletions(-) diff --git a/src/pages/ReimbursementAccount/BankInfo/substeps/Confirmation.tsx b/src/pages/ReimbursementAccount/BankInfo/substeps/Confirmation.tsx index f2070e38b942..4105a5f03f36 100644 --- a/src/pages/ReimbursementAccount/BankInfo/substeps/Confirmation.tsx +++ b/src/pages/ReimbursementAccount/BankInfo/substeps/Confirmation.tsx @@ -5,7 +5,6 @@ import {withOnyx} from 'react-native-onyx'; import Button from '@components/Button'; import DotIndicatorMessage from '@components/DotIndicatorMessage'; import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; -import ScreenWrapper from '@components/ScreenWrapper'; import Text from '@components/Text'; import useLocalize from '@hooks/useLocalize'; import type {SubStepProps} from '@hooks/useSubStep/types'; @@ -46,57 +45,55 @@ function Confirmation({reimbursementAccount, reimbursementAccountDraft, onNext, }; return ( - - - {translate('bankAccount.letsDoubleCheck')} - {translate('bankAccount.thisBankAccount')} - {setupType === CONST.BANK_ACCOUNT.SUBSTEP.MANUAL && ( - - - - - - )} - {setupType === CONST.BANK_ACCOUNT.SUBSTEP.PLAID && ( + {translate('bankAccount.letsDoubleCheck')} + {translate('bankAccount.thisBankAccount')} + {setupType === CONST.BANK_ACCOUNT.SUBSTEP.MANUAL && ( + - )} - - {error && error.length > 0 && ( - - )} -

    2g0oVapxwnU+g922;G=Kn?NV}cCx-v#R;^Nu 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

    _s&P-*#(yytaYj@D?bZIIKH_d|L+?BVnc!>2g*_ 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%0A37Ym2-orr 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 z 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�!9ywecTxc!C1{>Cm+BpdMZovbD#`O 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

    ^UEQLRrhOK&h3#Zuf+Mep9P>1okDN-X7blO zn~VRAWi&`%%(l|bky>H47nkH;IsA^hG_s}NEOWodb0lkGrLPk_m7*|P{y4qPDhk(| zE6^EE3@mAbr{bF)qN@?YI{j@g9F@4Wz~QRBZ^b~Ot)c1;LVL3FM{_WbkMw)k4~ZtBscg z!U~kL4~rrHiE*99lQ%6l1lfw8c10q#<>9cmY4DhJg<~cZMJRDt{5+3pjrKC4?9W>c z&b>CY9&ZUIe|kA#!ho`GIdMajFX2KxL~j{6Hide?Hi9@FXN#LouzH>baRog)gIIWP z-wO{dM`>w;iTMwu56HWyjb=#o^JWhvh4%#o2^C>@?RVEMYUj_3m$=tZ+79KmjKY3} zj+b!RjmJLa@cAbViz`4$*f9XqEiRM+H)=BUINy2NkoETIWvZ2Kr@2oI!#a=8zkJNO z5vcV3`iwXld7<8ow>{1|SBHLiK>hB@f0ki-lHoFK$J^wV!cRnFtY$@s0vuvb3NzIu zC(bluLiBJ6KxnNnY}9cY-B~Bmd(Sj?Pm11Rc&C{4l)}Ri_EJtR1)7FaNvVzt{}(}) zi|H~%$epZGVOVK-`s3BDvRRyvLKTR99ClqKGD58C-Y5To<)Sz~KXeMX`mqKW^*c4cyfGpY-OKr4u!-uD6HBrOP~uaijsstJmLD zoNW7=sX+m3%5z@G=6DbB{BY$BL!_zJ3q}Iq8s)J`J{;WCZnDdSTz4qOCYhAN+LzC? zHvZ_}V;bdSY;F5SA;$gm`~kNWQ=StwqWy0Pv}s#C8VQsZoY2DxhL;!ssk*G+&c7-@ z0nb!_yFB|^79f1Ko8`TBKN~AJ^D&GCpfccDrBrA0Uo&qvD&V3><@|{oxxZXT&-oZl?qedI{eA*$1P_&1;yd?-T!Qq$Ov1+qUs{3DUN!s_j|aPz|^ zk^0mi`-a#wQ${gV)3K|3h^qBd-@++FyaV_5kzf)cLr&@bCoT>@ysA5Ov92qP;$m|3 zG6?l}oZ3mN!k-t&-(aQ25_^_48uowA%zZ=t8HIt>Z&S_u;;*pa13R!K!*VPybd`Nf z@4TYI&aHvBX1n4q@&g71{CueF2f?u76=sIu0VVO>pkyunGUnP7^_$p_AC~Tc1Baigjaik7A$%BiJB-m-HOlW zS6Qjy`d&R%cYLAzGAFcxZEmoC2i=BTHb^YSE>1R{qY?0STprRs1VdX@JOU?Z(WXBU~It|4i?a8TuhZF~_zK zpYYo}x)ZZ;1e{@n3>p1L<(Ed{Z*&_pK5*@9!6*yB7$Hl_17@(_X}#Kz+Qpfs^#Z;m(*tZu$ODlV;ofy36_LChFJ5n-;tZt%^^`_NAiA)>8>&!?IC?1 zK?!JXZf#`6m&ia6-SXd0YBENo;jrtbFVH|9KGv16=l4a{=M{V;aOzQMVe)|I5|ivrgKbU2IU;d z%Gg1|Hhctxiq_?Uy$n>7VyHkx5h^2V62v_?y zsQWyvyeT{qINgL(rRQn&FaX}6DUY;a?UR9q+8`q%-nBTaTHVJip2s1#Ir@o+WsAWz z2}%oHdxC|CQcEQjjC5@n(YIO%L_}I?d8%#hIwYw#3rS)g(%+wt1RFCq zRlEf>hn2>(6Dup&qi^Qxnb8I$cJAwQ!LJ%=p|bx^6L`#{3NF_}-(hhkQ!&Fs z@@!&c2eb`q?BZmf$p(NM#_LEjk|skU_Zj4zkDX8Hl{)_YRc^;!B9FLT&ueaRr{npz z^_<(S#8OG&(s-KPGhsO(Zzw!otbQ_h(?!hGtjykZ|8Akybgu*Nx*GQSn_bLPFMT|} z_|vs1ljFX(@8WpV72n6Oi#+0NNT<Sy3*nxm<}Mr%-MyMdEp@ByDvLP z%0A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 ^XI=bf!&Pp( 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Ⓢ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