From b65f6526ae044efa302e0fef433ac9698b8b3314 Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Sat, 23 Mar 2024 18:14:36 -0500 Subject: [PATCH 01/71] fix by truncation --- src/components/MenuItem.tsx | 173 +++++++++++++++++++++++++++++++++++- 1 file changed, 172 insertions(+), 1 deletion(-) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index 6835bcf3f5fc..abbbd320f8bf 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -240,6 +240,177 @@ type MenuItemBaseProps = { }; type MenuItemProps = (IconProps | AvatarProps | NoIcon) & MenuItemBaseProps; +const ASTERISK_ITALIC = '*'; +const UNDERSCORE_ITALIC = '_'; +const ASTERISK_BOLD = '**'; +const UNDERSCORE_BOLD = '__'; +const ESCAPED_UNDERSCORE = '\\_'; +const ESCAPED_ASTERISK = '\\*' +const ASTERISK_PLACEHOLDER_REGEXP = /ASTERISKPLACEHOLDER/gm; +const UNDERSCORE_PLACEHOLDER_REGEXP = /UNDERSCOREPLACEHOLDER/gm; +const UNDERSCORE_BOLD_PLACEHOLDER_REGEXP = /UNDERSCOREBOLDPLACEHOLDER/gm; +const ASTERISK_BOLD_PLACEHOLDER_REGEXP = /ASTERISKBOLDPLACEHOLDER/gm; +const UNDERSCORE_ITALIC_PLACEHOLDER_REGEXP = /UNDERSCOREITALICPLACEHOLDER/gm; +const ASTERISK_ITALIC_PLACEHOLDER_REGEXP = /ASTERISKITALICPLACEHOLDER/gm; + + +const ESCAPED_ASTERISK_REGEXP = /\\\*/g; + +const ESCAPED_UNDERSCORE_REGEXP = /\\_/g; +const UNDERSCORE_BOLD_REGEXP = /(__)(.*?)(__)/g; +const ASTERISK_BOLD_REGEXP = /(\*\*)(.*?)(\*\*)/g; +const UNDERSCORE_ITALIC_REGEXP = /(_)(.*?)(_)/g; +const ASTERISK_ITALIC_REGEXP = /(\*)(.*?)(\*)/g; + +const HYPERLINK = /^\[([^[]+)\]\(([^)]+)\)/; + +const formatMarkers = [ + ASTERISK_BOLD_PLACEHOLDER_REGEXP.source, + UNDERSCORE_BOLD_PLACEHOLDER_REGEXP.source, + ASTERISK_ITALIC_PLACEHOLDER_REGEXP.source, + UNDERSCORE_ITALIC_PLACEHOLDER_REGEXP.source, +]; + +const formatPlaceholdersMap = { + [UNDERSCORE_PLACEHOLDER_REGEXP.source]: ESCAPED_UNDERSCORE.length, + [ASTERISK_PLACEHOLDER_REGEXP.source]: ESCAPED_ASTERISK.length, +} + +const findFormatPlaceholderAhead = (text: string) => { + const formatPlaceholders = Object.keys(formatPlaceholdersMap); + + for (let i = 0, l = formatPlaceholders.length; i < l; i++) { + if (text.startsWith(formatPlaceholders[i])) { + return formatPlaceholders[i]; + } + } + + return null; +} + +const findFormatMarkerAhead = (text: string, formatStack: string[]): string | null => { + for (let i = 0, l = formatMarkers.length; i < l; i++) { + if (text.startsWith(formatMarkers[i])) { + if (formatStack[formatStack.length - 1] === formatMarkers[i]) { + formatStack.pop(); + } else { + formatStack.push(formatMarkers[i]); + } + return formatMarkers[i]; + } + } + + return null; +}; + +const replaceFormatMarkersWithPlaceholders = (text: string): string => + text + .replace(ESCAPED_UNDERSCORE_REGEXP, UNDERSCORE_PLACEHOLDER_REGEXP.source) + .replace(ESCAPED_ASTERISK_REGEXP, ASTERISK_PLACEHOLDER_REGEXP.source) + .replace( + UNDERSCORE_BOLD_REGEXP, + `${UNDERSCORE_BOLD_PLACEHOLDER_REGEXP.source}$2${UNDERSCORE_BOLD_PLACEHOLDER_REGEXP.source}` + ) + .replace( + ASTERISK_BOLD_REGEXP, + `${ASTERISK_BOLD_PLACEHOLDER_REGEXP.source}$2${ASTERISK_BOLD_PLACEHOLDER_REGEXP.source}` + ) + .replace( + UNDERSCORE_ITALIC_REGEXP, + `${UNDERSCORE_ITALIC_PLACEHOLDER_REGEXP.source}$2${UNDERSCORE_ITALIC_PLACEHOLDER_REGEXP.source}` + ) + .replace( + ASTERISK_ITALIC_REGEXP, + `${ASTERISK_ITALIC_PLACEHOLDER_REGEXP.source}$2${ASTERISK_ITALIC_PLACEHOLDER_REGEXP.source}` + ); + +const replaceFormatPlaceholdersWithMarkers = (text: string): string => + text + .replace(UNDERSCORE_PLACEHOLDER_REGEXP, ESCAPED_UNDERSCORE) + .replace(ASTERISK_PLACEHOLDER_REGEXP, ESCAPED_ASTERISK) + .replace(UNDERSCORE_BOLD_PLACEHOLDER_REGEXP, UNDERSCORE_BOLD) + .replace(ASTERISK_BOLD_PLACEHOLDER_REGEXP, ASTERISK_BOLD) + .replace(UNDERSCORE_ITALIC_PLACEHOLDER_REGEXP, UNDERSCORE_ITALIC) + .replace(ASTERISK_ITALIC_PLACEHOLDER_REGEXP, ASTERISK_ITALIC); + +const truncate = (text: string, limit: number, ellipsis: boolean): string => { + let count = 0; + + const truncateString = (tText:string) => { + const formatStack = [] as string[]; + let skipCountIncrement = false; + let outputText = ''; + let index = 0; + + while (count < limit && index < tText.length) { + const formatMarker = findFormatMarkerAhead(tText.substring(index), formatStack); + if (formatMarker) { + outputText += formatMarker; + index += formatMarker.length; + skipCountIncrement = true; + } + + const formatPlaceholder = findFormatPlaceholderAhead(tText.substring(index)); + if (formatPlaceholder) { + outputText += formatPlaceholder; + index += formatPlaceholder.length; + skipCountIncrement = true; + count += formatPlaceholdersMap[formatPlaceholder]; + } + + const hyperlinkAheadRegexp = new RegExp(HYPERLINK); + const hyperlinkMatch = hyperlinkAheadRegexp.exec(tText.substring(index)); + if (hyperlinkMatch) { + const hyperlinkText = hyperlinkMatch[1]; + const hyperlinkUrl = hyperlinkMatch[2]; + + outputText += `[${truncateString(hyperlinkText)}](${hyperlinkUrl})`; + index += hyperlinkMatch[0].length; + skipCountIncrement = true; + } + + if (!formatMarker && !hyperlinkMatch) { + outputText += tText[index]; + index++; + } + + if (!skipCountIncrement) { + count++; + } + + skipCountIncrement = false; + } + + outputText = outputText.trimEnd(); + + while (formatStack.length > 0) { + outputText += formatStack.pop(); + } + + return outputText; + }; + + let outputText = truncateString(text); + + if (ellipsis && outputText.length < text.length) { + outputText += '...'; + } + + return outputText; +}; + +function truncateMarkdown(text = '', options: { limit?: number; ellipsis?: boolean } = {}): string { + const { limit, ellipsis } = options || {}; + + if (Number.isNaN(parseInt(limit as unknown as string, 10)) || text.length <= (limit ?? 0)) { + return text; + } + + let outputText = replaceFormatMarkersWithPlaceholders(text); + outputText = truncate(outputText, limit ?? 0, ellipsis ?? false); + outputText = replaceFormatPlaceholdersWithMarkers(outputText); + return outputText; +} function MenuItem( { @@ -514,7 +685,7 @@ function MenuItem( {!!title && (shouldRenderAsHTML || (shouldParseTitle && !!html.length)) && ( - + )} {!shouldRenderAsHTML && !shouldParseTitle && !!title && ( From 203401af944e46959a8a52831ebf88af9ccdff7b Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Mon, 1 Apr 2024 20:16:12 -0500 Subject: [PATCH 02/71] Move code to expensify-common --- src/components/MenuItem.tsx | 158 ------------------------------------ 1 file changed, 158 deletions(-) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index abbbd320f8bf..680003380013 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -240,164 +240,6 @@ type MenuItemBaseProps = { }; type MenuItemProps = (IconProps | AvatarProps | NoIcon) & MenuItemBaseProps; -const ASTERISK_ITALIC = '*'; -const UNDERSCORE_ITALIC = '_'; -const ASTERISK_BOLD = '**'; -const UNDERSCORE_BOLD = '__'; -const ESCAPED_UNDERSCORE = '\\_'; -const ESCAPED_ASTERISK = '\\*' -const ASTERISK_PLACEHOLDER_REGEXP = /ASTERISKPLACEHOLDER/gm; -const UNDERSCORE_PLACEHOLDER_REGEXP = /UNDERSCOREPLACEHOLDER/gm; -const UNDERSCORE_BOLD_PLACEHOLDER_REGEXP = /UNDERSCOREBOLDPLACEHOLDER/gm; -const ASTERISK_BOLD_PLACEHOLDER_REGEXP = /ASTERISKBOLDPLACEHOLDER/gm; -const UNDERSCORE_ITALIC_PLACEHOLDER_REGEXP = /UNDERSCOREITALICPLACEHOLDER/gm; -const ASTERISK_ITALIC_PLACEHOLDER_REGEXP = /ASTERISKITALICPLACEHOLDER/gm; - - -const ESCAPED_ASTERISK_REGEXP = /\\\*/g; - -const ESCAPED_UNDERSCORE_REGEXP = /\\_/g; -const UNDERSCORE_BOLD_REGEXP = /(__)(.*?)(__)/g; -const ASTERISK_BOLD_REGEXP = /(\*\*)(.*?)(\*\*)/g; -const UNDERSCORE_ITALIC_REGEXP = /(_)(.*?)(_)/g; -const ASTERISK_ITALIC_REGEXP = /(\*)(.*?)(\*)/g; - -const HYPERLINK = /^\[([^[]+)\]\(([^)]+)\)/; - -const formatMarkers = [ - ASTERISK_BOLD_PLACEHOLDER_REGEXP.source, - UNDERSCORE_BOLD_PLACEHOLDER_REGEXP.source, - ASTERISK_ITALIC_PLACEHOLDER_REGEXP.source, - UNDERSCORE_ITALIC_PLACEHOLDER_REGEXP.source, -]; - -const formatPlaceholdersMap = { - [UNDERSCORE_PLACEHOLDER_REGEXP.source]: ESCAPED_UNDERSCORE.length, - [ASTERISK_PLACEHOLDER_REGEXP.source]: ESCAPED_ASTERISK.length, -} - -const findFormatPlaceholderAhead = (text: string) => { - const formatPlaceholders = Object.keys(formatPlaceholdersMap); - - for (let i = 0, l = formatPlaceholders.length; i < l; i++) { - if (text.startsWith(formatPlaceholders[i])) { - return formatPlaceholders[i]; - } - } - - return null; -} - -const findFormatMarkerAhead = (text: string, formatStack: string[]): string | null => { - for (let i = 0, l = formatMarkers.length; i < l; i++) { - if (text.startsWith(formatMarkers[i])) { - if (formatStack[formatStack.length - 1] === formatMarkers[i]) { - formatStack.pop(); - } else { - formatStack.push(formatMarkers[i]); - } - return formatMarkers[i]; - } - } - - return null; -}; - -const replaceFormatMarkersWithPlaceholders = (text: string): string => - text - .replace(ESCAPED_UNDERSCORE_REGEXP, UNDERSCORE_PLACEHOLDER_REGEXP.source) - .replace(ESCAPED_ASTERISK_REGEXP, ASTERISK_PLACEHOLDER_REGEXP.source) - .replace( - UNDERSCORE_BOLD_REGEXP, - `${UNDERSCORE_BOLD_PLACEHOLDER_REGEXP.source}$2${UNDERSCORE_BOLD_PLACEHOLDER_REGEXP.source}` - ) - .replace( - ASTERISK_BOLD_REGEXP, - `${ASTERISK_BOLD_PLACEHOLDER_REGEXP.source}$2${ASTERISK_BOLD_PLACEHOLDER_REGEXP.source}` - ) - .replace( - UNDERSCORE_ITALIC_REGEXP, - `${UNDERSCORE_ITALIC_PLACEHOLDER_REGEXP.source}$2${UNDERSCORE_ITALIC_PLACEHOLDER_REGEXP.source}` - ) - .replace( - ASTERISK_ITALIC_REGEXP, - `${ASTERISK_ITALIC_PLACEHOLDER_REGEXP.source}$2${ASTERISK_ITALIC_PLACEHOLDER_REGEXP.source}` - ); - -const replaceFormatPlaceholdersWithMarkers = (text: string): string => - text - .replace(UNDERSCORE_PLACEHOLDER_REGEXP, ESCAPED_UNDERSCORE) - .replace(ASTERISK_PLACEHOLDER_REGEXP, ESCAPED_ASTERISK) - .replace(UNDERSCORE_BOLD_PLACEHOLDER_REGEXP, UNDERSCORE_BOLD) - .replace(ASTERISK_BOLD_PLACEHOLDER_REGEXP, ASTERISK_BOLD) - .replace(UNDERSCORE_ITALIC_PLACEHOLDER_REGEXP, UNDERSCORE_ITALIC) - .replace(ASTERISK_ITALIC_PLACEHOLDER_REGEXP, ASTERISK_ITALIC); - -const truncate = (text: string, limit: number, ellipsis: boolean): string => { - let count = 0; - - const truncateString = (tText:string) => { - const formatStack = [] as string[]; - let skipCountIncrement = false; - let outputText = ''; - let index = 0; - - while (count < limit && index < tText.length) { - const formatMarker = findFormatMarkerAhead(tText.substring(index), formatStack); - if (formatMarker) { - outputText += formatMarker; - index += formatMarker.length; - skipCountIncrement = true; - } - - const formatPlaceholder = findFormatPlaceholderAhead(tText.substring(index)); - if (formatPlaceholder) { - outputText += formatPlaceholder; - index += formatPlaceholder.length; - skipCountIncrement = true; - count += formatPlaceholdersMap[formatPlaceholder]; - } - - const hyperlinkAheadRegexp = new RegExp(HYPERLINK); - const hyperlinkMatch = hyperlinkAheadRegexp.exec(tText.substring(index)); - if (hyperlinkMatch) { - const hyperlinkText = hyperlinkMatch[1]; - const hyperlinkUrl = hyperlinkMatch[2]; - - outputText += `[${truncateString(hyperlinkText)}](${hyperlinkUrl})`; - index += hyperlinkMatch[0].length; - skipCountIncrement = true; - } - - if (!formatMarker && !hyperlinkMatch) { - outputText += tText[index]; - index++; - } - - if (!skipCountIncrement) { - count++; - } - - skipCountIncrement = false; - } - - outputText = outputText.trimEnd(); - - while (formatStack.length > 0) { - outputText += formatStack.pop(); - } - - return outputText; - }; - - let outputText = truncateString(text); - - if (ellipsis && outputText.length < text.length) { - outputText += '...'; - } - - return outputText; -}; function truncateMarkdown(text = '', options: { limit?: number; ellipsis?: boolean } = {}): string { const { limit, ellipsis } = options || {}; From 3a0ce572e975789f00c37af9d7c5e7b0c97fdfd3 Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Fri, 12 Apr 2024 09:54:01 -0500 Subject: [PATCH 03/71] Update MenuItem.tsx --- src/components/MenuItem.tsx | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index 7e26bf05ae53..ced36e5c2b75 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -252,20 +252,6 @@ type MenuItemBaseProps = { }; type MenuItemProps = (IconProps | AvatarProps | NoIcon) & MenuItemBaseProps; - -function truncateMarkdown(text = '', options: { limit?: number; ellipsis?: boolean } = {}): string { - const { limit, ellipsis } = options || {}; - - if (Number.isNaN(parseInt(limit as unknown as string, 10)) || text.length <= (limit ?? 0)) { - return text; - } - - let outputText = replaceFormatMarkersWithPlaceholders(text); - outputText = truncate(outputText, limit ?? 0, ellipsis ?? false); - outputText = replaceFormatPlaceholdersWithMarkers(outputText); - return outputText; -} - function MenuItem( { interactive = true, @@ -429,6 +415,8 @@ function MenuItem( } }; + const parser = new ExpensiMark(); + return ( {!!label && !isLabelHoverable && ( @@ -551,7 +539,7 @@ function MenuItem( {!!title && (shouldRenderAsHTML || (shouldParseTitle && !!html.length)) && ( - + )} {!shouldRenderAsHTML && !shouldParseTitle && !!title && ( From 8c64ad613e219097858eb1e381fc25cb50f2864c Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Fri, 19 Apr 2024 14:48:26 -0500 Subject: [PATCH 04/71] add example --- src/components/MenuItem.tsx | 41 +++++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index b73e1d91d4ff..b52f1906599d 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -416,7 +416,44 @@ function MenuItem( } }; - const parser = new ExpensiMark(); + const truncateMarkdown = (markdownText: string, limit: number, addEllipsis = true) => { + if (markdownText.length <= limit) { + return markdownText; + } + + // Truncate directly on the markdown text to preserve markdown syntax as much as possible + let truncatedText = markdownText.substring(0, limit); + + // Avoid cutting the text in the middle of a Markdown element (like [link](url)) + const lastSpace = truncatedText.lastIndexOf(' '); + const lastOpenBracket = truncatedText.lastIndexOf('['); + const lastCloseBracket = truncatedText.lastIndexOf(']'); + const lastOpenParen = truncatedText.lastIndexOf('('); + const lastCloseParen = truncatedText.lastIndexOf(')'); + + // Extend the cut-off point to avoid breaking Markdown links and parenthesis syntax + if (lastCloseBracket > lastOpenBracket && lastCloseBracket > lastSpace) { + const nextCloseParen = markdownText.indexOf(')', lastCloseBracket); + if (nextCloseParen !== -1 && nextCloseParen <= limit) { + truncatedText = markdownText.substring(0, nextCloseParen + 1); + } else { + truncatedText = markdownText.substring(0, lastCloseBracket + 1); + } + } else if (lastCloseParen > lastOpenParen && lastCloseParen > lastSpace) { + truncatedText = markdownText.substring(0, lastCloseParen + 1); + } else { + truncatedText = markdownText.substring(0, lastSpace); + } + + // Add ellipsis if specified + if (addEllipsis) { + truncatedText += '...'; + } + + return truncatedText; + }; + + const maxDescLength = 300; return ( @@ -541,7 +578,7 @@ function MenuItem( {!!title && (shouldRenderAsHTML || (shouldParseTitle && !!html.length)) && ( - + )} {!shouldRenderAsHTML && !shouldParseTitle && !!title && ( From f331bb0b4b28edfd0da523d436569ef7b22d9c27 Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Mon, 29 Apr 2024 23:26:45 -0500 Subject: [PATCH 05/71] fixed truncation --- src/components/MenuItem.tsx | 26 +++++++++++++++++++----- src/pages/ReportDetailsPage.tsx | 36 +++++++++++++++++---------------- 2 files changed, 40 insertions(+), 22 deletions(-) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index b082e5cb2010..705a3944d7e5 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -420,13 +420,29 @@ function MenuItem( } }; - const truncateMarkdown = (markdownText: string, limit: number, addEllipsis = true) => { + const truncateMarkdown = (htmlText: string, limit: number, addEllipsis = true) => { + const parser = new ExpensiMark(); + const markdownText = parser.htmlToMarkdown(htmlText); if (markdownText.length <= limit) { return markdownText; } - // Truncate directly on the markdown text to preserve markdown syntax as much as possible - let truncatedText = markdownText.substring(0, limit); + + const markdownChars = markdownText.split(''); + let characterCount = 0; + let overallIndex = 0; + + for (const char of markdownChars) { + if (/[a-zA-Z\s\n]/.test(char)) { + characterCount++; + } + overallIndex++; + if (characterCount >= limit) { + break; + } + } + + let truncatedText = markdownText.substring(0, overallIndex); // Avoid cutting the text in the middle of a Markdown element (like [link](url)) const lastSpace = truncatedText.lastIndexOf(' '); @@ -438,7 +454,7 @@ function MenuItem( // Extend the cut-off point to avoid breaking Markdown links and parenthesis syntax if (lastCloseBracket > lastOpenBracket && lastCloseBracket > lastSpace) { const nextCloseParen = markdownText.indexOf(')', lastCloseBracket); - if (nextCloseParen !== -1 && nextCloseParen <= limit) { + if (nextCloseParen !== -1 && nextCloseParen <= overallIndex) { truncatedText = markdownText.substring(0, nextCloseParen + 1); } else { truncatedText = markdownText.substring(0, lastCloseBracket + 1); @@ -454,7 +470,7 @@ function MenuItem( truncatedText += '...'; } - return truncatedText; + return parser.replace(truncatedText); }; const maxDescLength = 300; diff --git a/src/pages/ReportDetailsPage.tsx b/src/pages/ReportDetailsPage.tsx index 5ea00361d8c4..469133285c8c 100644 --- a/src/pages/ReportDetailsPage.tsx +++ b/src/pages/ReportDetailsPage.tsx @@ -315,7 +315,7 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD {shouldShowReportDescription && ( - + )} {isGroupChat && } - {menuItems.map((item) => { - const brickRoadIndicator = - ReportUtils.hasReportNameError(report) && item.key === CONST.REPORT_DETAILS_MENU_ITEM.SETTINGS ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined; - return ( - - ); - })} + + {menuItems.map((item) => { + const brickRoadIndicator = + ReportUtils.hasReportNameError(report) && item.key === CONST.REPORT_DETAILS_MENU_ITEM.SETTINGS ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined; + return ( + + ); + })} + From dcd26a09510ffafc9a3516a077ea5c254c07ec40 Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Mon, 29 Apr 2024 23:49:33 -0500 Subject: [PATCH 06/71] ran prettier --- src/components/MenuItem.tsx | 3 +-- src/pages/ReportDetailsPage.tsx | 5 ++++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index 705a3944d7e5..d2aa28105917 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -427,7 +427,6 @@ function MenuItem( return markdownText; } - const markdownChars = markdownText.split(''); let characterCount = 0; let overallIndex = 0; @@ -473,7 +472,7 @@ function MenuItem( return parser.replace(truncatedText); }; - const maxDescLength = 300; + const maxDescLength = 280; return ( diff --git a/src/pages/ReportDetailsPage.tsx b/src/pages/ReportDetailsPage.tsx index 469133285c8c..7aa51569e6c4 100644 --- a/src/pages/ReportDetailsPage.tsx +++ b/src/pages/ReportDetailsPage.tsx @@ -315,7 +315,10 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD {shouldShowReportDescription && ( - + Date: Tue, 30 Apr 2024 11:31:20 -0500 Subject: [PATCH 07/71] added more comments --- src/components/MenuItem.tsx | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index d2aa28105917..e527106dd37f 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -420,17 +420,32 @@ function MenuItem( } }; - const truncateMarkdown = (htmlText: string, limit: number, addEllipsis = true) => { + /** + * Converts the given HTML text to Markdown and truncates it to the specified limit. + * If the text is truncated, an ellipsis is added at the end. + * + * @param htmlText + * @param limit + * @param addEllipsis + * @returns + */ + const truncateHTML = (htmlText: string, limit: number, addEllipsis = true) => { const parser = new ExpensiMark(); const markdownText = parser.htmlToMarkdown(htmlText); + + // if the text is already shorter than the limit, return it as is if (markdownText.length <= limit) { - return markdownText; + return htmlText; } + // here, we want to split the markdown by character, so that we are consistent with our character slicing const markdownChars = markdownText.split(''); let characterCount = 0; let overallIndex = 0; + // we want to loop through our markdown characters until we reach the limit, avoiding any symbols + // that are not part of the text (like links, images, block quote, etc.) + // this makes it so that we don't count the markdown syntax characters towards the limit (it needs to be char specific limit) for (const char of markdownChars) { if (/[a-zA-Z\s\n]/.test(char)) { characterCount++; @@ -441,6 +456,7 @@ function MenuItem( } } + // now that we have the index of the last character, we can slice the markdown text let truncatedText = markdownText.substring(0, overallIndex); // Avoid cutting the text in the middle of a Markdown element (like [link](url)) @@ -597,7 +613,7 @@ function MenuItem( {!!title && (shouldRenderAsHTML || (shouldParseTitle && !!html.length)) && ( - + )} {!shouldRenderAsHTML && !shouldParseTitle && !!title && ( From de55c6269104d13ab15727d60096492a579203ae Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Tue, 30 Apr 2024 12:26:24 -0500 Subject: [PATCH 08/71] prettier --- src/components/MenuItem.tsx | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index e527106dd37f..45fd8bf76f04 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -423,13 +423,14 @@ function MenuItem( /** * Converts the given HTML text to Markdown and truncates it to the specified limit. * If the text is truncated, an ellipsis is added at the end. - * - * @param htmlText - * @param limit - * @param addEllipsis - * @returns + * + * @param htmlText + * @param limit + * @param addEllipsis + * @returns */ const truncateHTML = (htmlText: string, limit: number, addEllipsis = true) => { + console.log(title); const parser = new ExpensiMark(); const markdownText = parser.htmlToMarkdown(htmlText); @@ -443,7 +444,7 @@ function MenuItem( let characterCount = 0; let overallIndex = 0; - // we want to loop through our markdown characters until we reach the limit, avoiding any symbols + // we want to loop through our markdown characters until we reach the limit, avoiding any symbols // that are not part of the text (like links, images, block quote, etc.) // this makes it so that we don't count the markdown syntax characters towards the limit (it needs to be char specific limit) for (const char of markdownChars) { From 74dadb12c163994ea702d14e4113bc0f635fa09d Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Wed, 8 May 2024 12:18:55 -0500 Subject: [PATCH 09/71] changed truncate function to html only --- src/components/MenuItem.tsx | 236 +++++++++++++++++++++++++++--------- 1 file changed, 182 insertions(+), 54 deletions(-) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index 9e8860ed8a61..c6e66eb9cf11 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -436,76 +436,204 @@ function MenuItem( } }; + interface TruncateOptions { + ellipsis?: string; + truncateLastWord?: boolean; + slop?: number; + keepImageTag?: boolean; + } + /** - * Converts the given HTML text to Markdown and truncates it to the specified limit. - * If the text is truncated, an ellipsis is added at the end. + * Truncate HTML string and keep tag safe. + * pulled from https://github.com/huang47/nodejs-html-truncate/blob/master/lib/truncate.js * - * @param htmlText - * @param limit - * @param addEllipsis - * @returns + * @method truncate + * @param {String} string string needs to be truncated + * @param {Number} maxLength length of truncated string + * @param {Object} options (optional) + * @param {Boolean} [options.keepImageTag] flag to specify if keep image tag, false by default + * @param {Boolean} [options.truncateLastWord] truncates last word, true by default + * @param {Number} [options.slop] tolerance when options.truncateLastWord is false before we give up and just truncate at the maxLength position, 10 by default (but not greater than maxLength) + * @param {Boolean|String} [options.ellipsis] omission symbol for truncated string, '...' by default + * @return {String} truncated string */ - const truncateHTML = (htmlText: string, limit: number, addEllipsis = true) => { - console.log(title); - const parser = new ExpensiMark(); - const markdownText = parser.htmlToMarkdown(htmlText); + function truncate(string: string, maxLength: number, options?: TruncateOptions): string { + const EMPTY_OBJECT = {}, + EMPTY_STRING = '', + DEFAULT_TRUNCATE_SYMBOL = '...', + DEFAULT_SLOP = 10 > maxLength ? maxLength : 10, + EXCLUDE_TAGS = ['img', 'br'], // non-closed tags + items: string[] = [], // stack for saving tags + KEY_VALUE_REGEX = '([\\w|-]+\\s*=\\s*"[^"]*"\\s*)*', + IS_CLOSE_REGEX = '\\s*\\/?\\s*', + CLOSE_REGEX = '\\s*\\/\\s*', + SELF_CLOSE_REGEX = new RegExp('<\\/?\\w+\\s*' + KEY_VALUE_REGEX + CLOSE_REGEX + '>'), + HTML_TAG_REGEX = new RegExp('<\\/?\\w+\\s*' + KEY_VALUE_REGEX + IS_CLOSE_REGEX + '>'), + URL_REGEX = /(((ftp|https?):\/\/)[\-\w@:%_\+.~#?,&\/\/=]+)|((mailto:)?[_.\w\-]+@([\w][\w\-]+\.)+[a-zA-Z]{2,3})/g, // Simple regexp + IMAGE_TAG_REGEX = new RegExp(''), + WORD_BREAK_REGEX = new RegExp('\\W+', 'g'); + let matches: RegExpExecArray | null = HTML_TAG_REGEX.exec(string); + let result, + index, + tail, + tag, + selfClose = null; + let content = EMPTY_STRING; // truncated text storage + let total = 0; // record how many characters we traced so far + + const opts: TruncateOptions = options || EMPTY_OBJECT; + opts.ellipsis = opts.ellipsis !== undefined ? opts.ellipsis : DEFAULT_TRUNCATE_SYMBOL; + opts.truncateLastWord = opts.truncateLastWord !== undefined ? opts.truncateLastWord : true; + opts.slop = opts.slop !== undefined ? opts.slop : DEFAULT_SLOP; + + function _removeImageTag(string: string): string { + const match = IMAGE_TAG_REGEX.exec(string); + if (!match) { + return string; + } + + const index = match.index, + len = match[0].length; + + return string.substring(0, index) + string.substring(index + len); + } + + function _dumpCloseTag(tags: string[]): string { + let html = ''; + + tags.reverse().forEach((tag) => { + // dump non-excluded tags only + if (EXCLUDE_TAGS.indexOf(tag) === -1) { + html += ''; + } + }); - // if the text is already shorter than the limit, return it as is - if (markdownText.length <= limit) { - return htmlText; + return html; } - // here, we want to split the markdown by character, so that we are consistent with our character slicing - const markdownChars = markdownText.split(''); - let characterCount = 0; - let overallIndex = 0; - - // we want to loop through our markdown characters until we reach the limit, avoiding any symbols - // that are not part of the text (like links, images, block quote, etc.) - // this makes it so that we don't count the markdown syntax characters towards the limit (it needs to be char specific limit) - for (const char of markdownChars) { - if (/[a-zA-Z\s\n]/.test(char)) { - characterCount++; + function _getTag(string: string): string { + let tail = string.indexOf(' '); + + // TODO: + // we have to figure out how to handle non-well-formatted HTML case + if (tail === -1) { + tail = string.indexOf('>'); + if (tail === -1) { + throw new Error('HTML tag is not well-formed : ' + string); + } } - overallIndex++; - if (characterCount >= limit) { - break; + + return string.substring(1, tail); + } + + function _getEndPosition(string: string, tailPos?: number): number { + const defaultPos = maxLength - total; + const slop = opts.slop || DEFAULT_SLOP; + let position = defaultPos; + const isShort = defaultPos < slop || 0, + slopPos = isShort ? defaultPos : slop - 1, + substr = string.slice(isShort ? 0 : defaultPos - slop, tailPos || defaultPos + slop), + result = WORD_BREAK_REGEX.exec(substr); + + if (!opts.truncateLastWord) { + if (tailPos && substr.length <= tailPos) { + position = substr.length; + } else { + while (result !== null) { + // a natural break position before the hard break position + if (result.index < slopPos) { + position = defaultPos - (slopPos - result.index); + // keep seeking closer to the hard break position + // unless a natural break is at position 0 + if (result.index === 0 && defaultPos <= 1) break; + } + // a natural break position exactly at the hard break position + else if (result.index === slopPos) { + position = defaultPos; + break; // seek no more + } + // a natural break position after the hard break position + else { + position = defaultPos + (result.index - slopPos); + break; // seek no more + } + } + } + if (string.charAt(position - 1).match(/\s$/)) position--; } + return position; } - // now that we have the index of the last character, we can slice the markdown text - let truncatedText = markdownText.substring(0, overallIndex); - - // Avoid cutting the text in the middle of a Markdown element (like [link](url)) - const lastSpace = truncatedText.lastIndexOf(' '); - const lastOpenBracket = truncatedText.lastIndexOf('['); - const lastCloseBracket = truncatedText.lastIndexOf(']'); - const lastOpenParen = truncatedText.lastIndexOf('('); - const lastCloseParen = truncatedText.lastIndexOf(')'); - - // Extend the cut-off point to avoid breaking Markdown links and parenthesis syntax - if (lastCloseBracket > lastOpenBracket && lastCloseBracket > lastSpace) { - const nextCloseParen = markdownText.indexOf(')', lastCloseBracket); - if (nextCloseParen !== -1 && nextCloseParen <= overallIndex) { - truncatedText = markdownText.substring(0, nextCloseParen + 1); + while (matches) { + matches = HTML_TAG_REGEX.exec(string); + + if (!matches) { + if (total >= maxLength) { + break; + } + + matches = URL_REGEX.exec(string); + if (!matches || matches.index >= maxLength) { + content += string.substring(0, _getEndPosition(string)); + break; + } + + while (matches) { + result = matches[0]; + index = matches.index; + content += string.substring(0, index + result.length - total); + string = string.substring(index + result.length); + matches = URL_REGEX.exec(string); + } + break; + } + + result = matches[0]; + index = matches.index; + + if (total + index > maxLength) { + // exceed given `maxLength`, dump everything to clear stack + content += string.substring(0, _getEndPosition(string, index)); + break; } else { - truncatedText = markdownText.substring(0, lastCloseBracket + 1); + total += index; + content += string.substring(0, index); } - } else if (lastCloseParen > lastOpenParen && lastCloseParen > lastSpace) { - truncatedText = markdownText.substring(0, lastCloseParen + 1); - } else { - truncatedText = markdownText.substring(0, lastSpace); + + if ('/' === result[1]) { + // move out open tag + items.pop(); + selfClose = null; + } else { + selfClose = SELF_CLOSE_REGEX.exec(result); + if (!selfClose) { + tag = _getTag(result); + + items.push(tag); + } + } + + if (selfClose) { + content += selfClose[0]; + } else { + content += result; + } + string = string.substring(index + result.length); } - // Add ellipsis if specified - if (addEllipsis) { - truncatedText += '...'; + if (string.length > maxLength - total && opts.ellipsis) { + content += opts.ellipsis; } + content += _dumpCloseTag(items); - return parser.replace(truncatedText); - }; + if (!opts.keepImageTag) { + content = _removeImageTag(content); + } + + return content; + } - const maxDescLength = 280; + const maxDescLength = 100; return ( @@ -630,7 +758,7 @@ function MenuItem( {!!title && (shouldRenderAsHTML || (shouldParseTitle && !!html.length)) && ( - + )} {!shouldRenderAsHTML && !shouldParseTitle && !!title && ( From 6cf6c14145948685a1e9542ad6dafa96bf647467 Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Tue, 14 May 2024 21:21:44 -0500 Subject: [PATCH 10/71] updated regex, removed redundant code --- src/components/MenuItem.tsx | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index c6e66eb9cf11..7d4c481f52e2 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -462,13 +462,11 @@ function MenuItem( EMPTY_STRING = '', DEFAULT_TRUNCATE_SYMBOL = '...', DEFAULT_SLOP = 10 > maxLength ? maxLength : 10, - EXCLUDE_TAGS = ['img', 'br'], // non-closed tags items: string[] = [], // stack for saving tags KEY_VALUE_REGEX = '([\\w|-]+\\s*=\\s*"[^"]*"\\s*)*', IS_CLOSE_REGEX = '\\s*\\/?\\s*', - CLOSE_REGEX = '\\s*\\/\\s*', - SELF_CLOSE_REGEX = new RegExp('<\\/?\\w+\\s*' + KEY_VALUE_REGEX + CLOSE_REGEX + '>'), - HTML_TAG_REGEX = new RegExp('<\\/?\\w+\\s*' + KEY_VALUE_REGEX + IS_CLOSE_REGEX + '>'), + SELF_CLOSE_REGEX = new RegExp('<\\/?(\\w+)((?:\\s+(?:\\w+|-)+(?:\\s*=\\s*(?:"(?:\\\\.|[^"\\\\])*"|\'(?:\\\\.|[^\'\\\\])*\'|[^\'">\\s]+))?)*)\\s*\\/?>'), + HTML_TAG_REGEX = new RegExp('<\\/?(\\w+)((?:\\s+(?:\\w+|-)+(?:\\s*=\\s*(?:"(?:\\\\.|[^"\\\\])*"|\'(?:\\\\.|[^\'\\\\])*\'|[^\'">\\s]+))?)*)\\s*\\/?>'), URL_REGEX = /(((ftp|https?):\/\/)[\-\w@:%_\+.~#?,&\/\/=]+)|((mailto:)?[_.\w\-]+@([\w][\w\-]+\.)+[a-zA-Z]{2,3})/g, // Simple regexp IMAGE_TAG_REGEX = new RegExp(''), WORD_BREAK_REGEX = new RegExp('\\W+', 'g'); @@ -502,10 +500,7 @@ function MenuItem( let html = ''; tags.reverse().forEach((tag) => { - // dump non-excluded tags only - if (EXCLUDE_TAGS.indexOf(tag) === -1) { - html += ''; - } + html += ''; }); return html; @@ -608,7 +603,6 @@ function MenuItem( selfClose = SELF_CLOSE_REGEX.exec(result); if (!selfClose) { tag = _getTag(result); - items.push(tag); } } From 47820fc4557e625b7e5bbcd70f81628ade836bfa Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Tue, 14 May 2024 23:57:05 -0500 Subject: [PATCH 11/71] Update MenuItem.tsx --- src/components/MenuItem.tsx | 26 +------------------------- 1 file changed, 1 insertion(+), 25 deletions(-) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index 641163e4e8c2..bcf20d3aff3b 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -672,30 +672,6 @@ function MenuItem( {label} - )} - - {!!title && (shouldRenderAsHTML || (shouldParseTitle && !!html.length)) && ( - - - - )} - {!shouldRenderAsHTML && !shouldParseTitle && !!title && ( - - {renderTitleContent()} - - )} - {shouldShowTitleIcon && titleIcon && ( - - - - )} )} @@ -781,7 +757,7 @@ function MenuItem( {!!title && (shouldRenderAsHTML || (shouldParseTitle && !!html.length)) && ( - + )} {!shouldRenderAsHTML && !shouldParseTitle && !!title && ( From 1dd2e6cc5ef30f7da8f06c9cb022883db56ae933 Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Sun, 2 Jun 2024 11:35:18 -0500 Subject: [PATCH 12/71] Update src/components/MenuItem.tsx Co-authored-by: Shubham Agrawal <58412969+shubham1206agra@users.noreply.github.com> --- src/components/MenuItem.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index c816a0b529f1..7faef4ca3d03 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -475,7 +475,7 @@ function MenuItem( DEFAULT_TRUNCATE_SYMBOL = '...', DEFAULT_SLOP = 10 > maxLength ? maxLength : 10, items: string[] = [], // stack for saving tags - KEY_VALUE_REGEX = '([\\w|-]+\\s*=\\s*"[^"]*"\\s*)*', + KEY_VALUE_REGEX = '((?:\\s+(?:\\w+|-)+(?:\\s*=\\s*(?:"(?:\\\\.|[^"\\\\])*"|\'(?:\\\\.|[^\'\\\\])*\'|[^\'">\\s]+))?)*)', IS_CLOSE_REGEX = '\\s*\\/?\\s*', SELF_CLOSE_REGEX = new RegExp('<\\/?(\\w+)((?:\\s+(?:\\w+|-)+(?:\\s*=\\s*(?:"(?:\\\\.|[^"\\\\])*"|\'(?:\\\\.|[^\'\\\\])*\'|[^\'">\\s]+))?)*)\\s*\\/?>'), HTML_TAG_REGEX = new RegExp('<\\/?(\\w+)((?:\\s+(?:\\w+|-)+(?:\\s*=\\s*(?:"(?:\\\\.|[^"\\\\])*"|\'(?:\\\\.|[^\'\\\\])*\'|[^\'">\\s]+))?)*)\\s*\\/?>'), From 17559645ba78008e057fd701767b54da48cc9cb9 Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Sun, 2 Jun 2024 11:35:25 -0500 Subject: [PATCH 13/71] Update src/components/MenuItem.tsx Co-authored-by: Shubham Agrawal <58412969+shubham1206agra@users.noreply.github.com> --- src/components/MenuItem.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index 7faef4ca3d03..8ba259315191 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -480,7 +480,7 @@ function MenuItem( SELF_CLOSE_REGEX = new RegExp('<\\/?(\\w+)((?:\\s+(?:\\w+|-)+(?:\\s*=\\s*(?:"(?:\\\\.|[^"\\\\])*"|\'(?:\\\\.|[^\'\\\\])*\'|[^\'">\\s]+))?)*)\\s*\\/?>'), HTML_TAG_REGEX = new RegExp('<\\/?(\\w+)((?:\\s+(?:\\w+|-)+(?:\\s*=\\s*(?:"(?:\\\\.|[^"\\\\])*"|\'(?:\\\\.|[^\'\\\\])*\'|[^\'">\\s]+))?)*)\\s*\\/?>'), URL_REGEX = /(((ftp|https?):\/\/)[\-\w@:%_\+.~#?,&\/\/=]+)|((mailto:)?[_.\w\-]+@([\w][\w\-]+\.)+[a-zA-Z]{2,3})/g, // Simple regexp - IMAGE_TAG_REGEX = new RegExp(''), + IMAGE_TAG_REGEX = new RegExp(''), WORD_BREAK_REGEX = new RegExp('\\W+', 'g'); let matches: RegExpExecArray | null = HTML_TAG_REGEX.exec(string); let result, From 1543cf9a62d55ced9fdc291d93b519d668b2abd6 Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Sun, 2 Jun 2024 11:35:34 -0500 Subject: [PATCH 14/71] Update src/components/MenuItem.tsx Co-authored-by: Shubham Agrawal <58412969+shubham1206agra@users.noreply.github.com> --- src/components/MenuItem.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index 8ba259315191..29391a68e9d3 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -477,8 +477,8 @@ function MenuItem( items: string[] = [], // stack for saving tags KEY_VALUE_REGEX = '((?:\\s+(?:\\w+|-)+(?:\\s*=\\s*(?:"(?:\\\\.|[^"\\\\])*"|\'(?:\\\\.|[^\'\\\\])*\'|[^\'">\\s]+))?)*)', IS_CLOSE_REGEX = '\\s*\\/?\\s*', - SELF_CLOSE_REGEX = new RegExp('<\\/?(\\w+)((?:\\s+(?:\\w+|-)+(?:\\s*=\\s*(?:"(?:\\\\.|[^"\\\\])*"|\'(?:\\\\.|[^\'\\\\])*\'|[^\'">\\s]+))?)*)\\s*\\/?>'), - HTML_TAG_REGEX = new RegExp('<\\/?(\\w+)((?:\\s+(?:\\w+|-)+(?:\\s*=\\s*(?:"(?:\\\\.|[^"\\\\])*"|\'(?:\\\\.|[^\'\\\\])*\'|[^\'">\\s]+))?)*)\\s*\\/?>'), + SELF_CLOSE_REGEX = new RegExp('<\\/?(\\w+)' + KEY_VALUE_REGEX + CLOSE_REGEX + '>'),, + HTML_TAG_REGEX = new RegExp('<\\/?(\\w+)' + KEY_VALUE_REGEX + IS_CLOSE_REGEX + '>'), URL_REGEX = /(((ftp|https?):\/\/)[\-\w@:%_\+.~#?,&\/\/=]+)|((mailto:)?[_.\w\-]+@([\w][\w\-]+\.)+[a-zA-Z]{2,3})/g, // Simple regexp IMAGE_TAG_REGEX = new RegExp(''), WORD_BREAK_REGEX = new RegExp('\\W+', 'g'); From 50da8d9d54c808861dd1cdd459199db5e320b3b6 Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Sun, 2 Jun 2024 11:35:48 -0500 Subject: [PATCH 15/71] Update src/components/MenuItem.tsx Co-authored-by: Shubham Agrawal <58412969+shubham1206agra@users.noreply.github.com> --- src/components/MenuItem.tsx | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index 29391a68e9d3..f9e3c072c2b5 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -518,21 +518,6 @@ function MenuItem( return html; } - function _getTag(string: string): string { - let tail = string.indexOf(' '); - - // TODO: - // we have to figure out how to handle non-well-formatted HTML case - if (tail === -1) { - tail = string.indexOf('>'); - if (tail === -1) { - throw new Error('HTML tag is not well-formed : ' + string); - } - } - - return string.substring(1, tail); - } - function _getEndPosition(string: string, tailPos?: number): number { const defaultPos = maxLength - total; const slop = opts.slop || DEFAULT_SLOP; From d12a41591dd9f60e64755918c9ee2f83e8d5f780 Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Sun, 2 Jun 2024 11:36:01 -0500 Subject: [PATCH 16/71] Update src/components/MenuItem.tsx Co-authored-by: Shubham Agrawal <58412969+shubham1206agra@users.noreply.github.com> --- src/components/MenuItem.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index f9e3c072c2b5..2c2322ecbfbb 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -599,7 +599,7 @@ function MenuItem( } else { selfClose = SELF_CLOSE_REGEX.exec(result); if (!selfClose) { - tag = _getTag(result); + tag = matches[1]; items.push(tag); } } From 81296139eb9a26c6980cc92a4f4649ddfcac0312 Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Sun, 2 Jun 2024 11:36:10 -0500 Subject: [PATCH 17/71] Update src/components/MenuItem.tsx Co-authored-by: Shubham Agrawal <58412969+shubham1206agra@users.noreply.github.com> --- src/components/MenuItem.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index 2c2322ecbfbb..1eece6642b49 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -477,6 +477,7 @@ function MenuItem( items: string[] = [], // stack for saving tags KEY_VALUE_REGEX = '((?:\\s+(?:\\w+|-)+(?:\\s*=\\s*(?:"(?:\\\\.|[^"\\\\])*"|\'(?:\\\\.|[^\'\\\\])*\'|[^\'">\\s]+))?)*)', IS_CLOSE_REGEX = '\\s*\\/?\\s*', + CLOSE_REGEX = '\\s*\\/\\s*' SELF_CLOSE_REGEX = new RegExp('<\\/?(\\w+)' + KEY_VALUE_REGEX + CLOSE_REGEX + '>'),, HTML_TAG_REGEX = new RegExp('<\\/?(\\w+)' + KEY_VALUE_REGEX + IS_CLOSE_REGEX + '>'), URL_REGEX = /(((ftp|https?):\/\/)[\-\w@:%_\+.~#?,&\/\/=]+)|((mailto:)?[_.\w\-]+@([\w][\w\-]+\.)+[a-zA-Z]{2,3})/g, // Simple regexp From 5b8b1512de048cccd43935a7e97e3c26e68c9023 Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Sun, 2 Jun 2024 15:46:41 -0500 Subject: [PATCH 18/71] reworked naming --- src/components/MenuItem.tsx | 195 +++++++++++++++++------------------- 1 file changed, 91 insertions(+), 104 deletions(-) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index 1eece6642b49..afbf80942af7 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -448,181 +448,168 @@ function MenuItem( } }; - interface TruncateOptions { + type TruncateOptions = { ellipsis?: string; truncateLastWord?: boolean; slop?: number; keepImageTag?: boolean; - } + }; /** * Truncate HTML string and keep tag safe. * pulled from https://github.com/huang47/nodejs-html-truncate/blob/master/lib/truncate.js * - * @method truncate - * @param {String} string string needs to be truncated - * @param {Number} maxLength length of truncated string - * @param {Object} options (optional) - * @param {Boolean} [options.keepImageTag] flag to specify if keep image tag, false by default - * @param {Boolean} [options.truncateLastWord] truncates last word, true by default - * @param {Number} [options.slop] tolerance when options.truncateLastWord is false before we give up and just truncate at the maxLength position, 10 by default (but not greater than maxLength) - * @param {Boolean|String} [options.ellipsis] omission symbol for truncated string, '...' by default - * @return {String} truncated string + * @param string - The string that needs to be truncated + * @param maxLength - Length of truncated string + * @param options - Optional configuration options + * @returns The truncated string */ - function truncate(string: string, maxLength: number, options?: TruncateOptions): string { - const EMPTY_OBJECT = {}, - EMPTY_STRING = '', - DEFAULT_TRUNCATE_SYMBOL = '...', - DEFAULT_SLOP = 10 > maxLength ? maxLength : 10, - items: string[] = [], // stack for saving tags - KEY_VALUE_REGEX = '((?:\\s+(?:\\w+|-)+(?:\\s*=\\s*(?:"(?:\\\\.|[^"\\\\])*"|\'(?:\\\\.|[^\'\\\\])*\'|[^\'">\\s]+))?)*)', - IS_CLOSE_REGEX = '\\s*\\/?\\s*', - CLOSE_REGEX = '\\s*\\/\\s*' - SELF_CLOSE_REGEX = new RegExp('<\\/?(\\w+)' + KEY_VALUE_REGEX + CLOSE_REGEX + '>'),, - HTML_TAG_REGEX = new RegExp('<\\/?(\\w+)' + KEY_VALUE_REGEX + IS_CLOSE_REGEX + '>'), - URL_REGEX = /(((ftp|https?):\/\/)[\-\w@:%_\+.~#?,&\/\/=]+)|((mailto:)?[_.\w\-]+@([\w][\w\-]+\.)+[a-zA-Z]{2,3})/g, // Simple regexp - IMAGE_TAG_REGEX = new RegExp(''), - WORD_BREAK_REGEX = new RegExp('\\W+', 'g'); - let matches: RegExpExecArray | null = HTML_TAG_REGEX.exec(string); - let result, - index, - tail, - tag, - selfClose = null; - let content = EMPTY_STRING; // truncated text storage - let total = 0; // record how many characters we traced so far - - const opts: TruncateOptions = options || EMPTY_OBJECT; - opts.ellipsis = opts.ellipsis !== undefined ? opts.ellipsis : DEFAULT_TRUNCATE_SYMBOL; - opts.truncateLastWord = opts.truncateLastWord !== undefined ? opts.truncateLastWord : true; - opts.slop = opts.slop !== undefined ? opts.slop : DEFAULT_SLOP; - - function _removeImageTag(string: string): string { - const match = IMAGE_TAG_REGEX.exec(string); + function truncate(htmlString: string, maxLength: number, options?: TruncateOptions): string { + const EMPTY_STRING = ''; + const DEFAULT_TRUNCATE_SYMBOL = '...'; + const DEFAULT_SLOP = Math.min(10, maxLength); + const tagsStack: string[] = []; + const KEY_VALUE_REGEX = '((?:\\s+(?:\\w+|-)+(?:\\s*=\\s*(?:"(?:\\\\.|[^"\\\\])*"|\'(?:\\\\.|[^\'\\\\])*\'|[^\'">\\s]+))?)*)'; + const IS_CLOSE_REGEX = '\\s*\\/?\\s*'; + const CLOSE_REGEX = '\\s*\\/\\s*'; + const SELF_CLOSE_REGEX = new RegExp(`<\\/?(\\w+)${KEY_VALUE_REGEX}${CLOSE_REGEX}>`); + const HTML_TAG_REGEX = new RegExp(`<\\/?(\\w+)${KEY_VALUE_REGEX}${IS_CLOSE_REGEX}>`); + const URL_REGEX = /(((ftp|https?):\/\/)[\\-\w@:%_\\+.~#?,&\\/\\/=]+)|((mailto:)?[_.\w\\-]+@([\w][\w\\-]+\.)+[a-zA-Z]{2,3})/g; + const IMAGE_TAG_REGEX = new RegExp(``); + let truncatedContent = EMPTY_STRING; + let alteredHtmlString = htmlString; + + let totalLength = 0; + + let matches: RegExpExecArray | null = HTML_TAG_REGEX.exec(htmlString); + let result: RegExpExecArray | null; + let endResult: string | number | null; + let index; + let tag; + let selfClose = null; + + const opts: TruncateOptions = { + ellipsis: DEFAULT_TRUNCATE_SYMBOL, + truncateLastWord: true, + slop: DEFAULT_SLOP, + ...options, + }; + + function removeImageTag(content: string): string { + const match = IMAGE_TAG_REGEX.exec(content); if (!match) { - return string; + return content; } - const index = match.index, - len = match[0].length; + const matchIndex = match.index; + const matchLength = match[0].length; - return string.substring(0, index) + string.substring(index + len); + return content.substring(0, matchIndex) + content.substring(matchIndex + matchLength); } - function _dumpCloseTag(tags: string[]): string { - let html = ''; - - tags.reverse().forEach((tag) => { - html += ''; - }); - - return html; + function closeTags(tags: string[]): string { + return tags + .reverse() + .map((mappedTag) => ``) + .join(''); } - function _getEndPosition(string: string, tailPos?: number): number { - const defaultPos = maxLength - total; - const slop = opts.slop || DEFAULT_SLOP; + function getEndPosition(content: string, tailPos?: number): number { + const defaultPos = maxLength - totalLength; + const slop = opts.slop ?? DEFAULT_SLOP; let position = defaultPos; - const isShort = defaultPos < slop || 0, - slopPos = isShort ? defaultPos : slop - 1, - substr = string.slice(isShort ? 0 : defaultPos - slop, tailPos || defaultPos + slop), - result = WORD_BREAK_REGEX.exec(substr); + const isShort = defaultPos < slop; + const slopPos = isShort ? defaultPos : slop - 1; + const substr = content.slice(isShort ? 0 : defaultPos - slop, tailPos ?? defaultPos + slop); if (!opts.truncateLastWord) { if (tailPos && substr.length <= tailPos) { position = substr.length; } else { while (result !== null) { - // a natural break position before the hard break position if (result.index < slopPos) { position = defaultPos - (slopPos - result.index); - // keep seeking closer to the hard break position - // unless a natural break is at position 0 - if (result.index === 0 && defaultPos <= 1) break; - } - // a natural break position exactly at the hard break position - else if (result.index === slopPos) { + if (result.index === 0 && defaultPos <= 1) { + break; + } + } else if (result.index === slopPos) { position = defaultPos; - break; // seek no more - } - // a natural break position after the hard break position - else { + break; + } else { position = defaultPos + (result.index - slopPos); - break; // seek no more + break; } } } - if (string.charAt(position - 1).match(/\s$/)) position--; + if (content.charAt(position - 1).match(/\s$/)) { + position--; + } } return position; } while (matches) { - matches = HTML_TAG_REGEX.exec(string); + matches = HTML_TAG_REGEX.exec(htmlString); if (!matches) { - if (total >= maxLength) { + if (totalLength >= maxLength) { break; } - matches = URL_REGEX.exec(string); + matches = URL_REGEX.exec(htmlString); if (!matches || matches.index >= maxLength) { - content += string.substring(0, _getEndPosition(string)); + truncatedContent += htmlString.substring(0, getEndPosition(htmlString)); break; } while (matches) { - result = matches[0]; - index = matches.index; - content += string.substring(0, index + result.length - total); - string = string.substring(index + result.length); - matches = URL_REGEX.exec(string); + endResult = matches[0]; + if (endResult !== null) { + index = matches.index; + truncatedContent += htmlString.substring(0, index + endResult.length - totalLength); + alteredHtmlString = htmlString.substring(index + endResult.length); + matches = URL_REGEX.exec(alteredHtmlString); + } } break; } - result = matches[0]; + endResult = matches[0]; index = matches.index; - if (total + index > maxLength) { - // exceed given `maxLength`, dump everything to clear stack - content += string.substring(0, _getEndPosition(string, index)); + if (totalLength + index > maxLength) { + truncatedContent += htmlString.substring(0, getEndPosition(htmlString, index)); break; } else { - total += index; - content += string.substring(0, index); + totalLength += index; + truncatedContent += htmlString.substring(0, index); } - if ('/' === result[1]) { - // move out open tag - items.pop(); + if (endResult[1] === '/') { + tagsStack.pop(); selfClose = null; } else { - selfClose = SELF_CLOSE_REGEX.exec(result); + selfClose = SELF_CLOSE_REGEX.exec(endResult); if (!selfClose) { tag = matches[1]; - items.push(tag); + tagsStack.push(tag); } } - if (selfClose) { - content += selfClose[0]; - } else { - content += result; - } - string = string.substring(index + result.length); + truncatedContent += selfClose ? selfClose[0] : endResult; + alteredHtmlString = htmlString.substring(index + endResult.length); } - if (string.length > maxLength - total && opts.ellipsis) { - content += opts.ellipsis; + if (htmlString.length > maxLength - totalLength && opts.ellipsis) { + truncatedContent += opts.ellipsis; } - content += _dumpCloseTag(items); + truncatedContent += closeTags(tagsStack); if (!opts.keepImageTag) { - content = _removeImageTag(content); + truncatedContent = removeImageTag(truncatedContent); } - return content; + return truncatedContent; } const maxDescLength = 100; From f0b7b0d3fb1355ff4200b8a250d31ba739718a70 Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Sun, 2 Jun 2024 16:10:52 -0500 Subject: [PATCH 19/71] Update MenuItem.tsx --- src/components/MenuItem.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index afbf80942af7..bcb8758000ba 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -597,7 +597,8 @@ function MenuItem( } truncatedContent += selfClose ? selfClose[0] : endResult; - alteredHtmlString = htmlString.substring(index + endResult.length); + // eslint-disable-next-line no-param-reassign + htmlString = htmlString.substring(index + endResult.length); // Update htmlString } if (htmlString.length > maxLength - totalLength && opts.ellipsis) { From 3fd5d4ec027b19da2f73e8eb336f3736dac67f90 Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Sun, 2 Jun 2024 16:14:09 -0500 Subject: [PATCH 20/71] Update MenuItem.tsx --- src/components/MenuItem.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index bcb8758000ba..5a11e4e1eaeb 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -477,7 +477,6 @@ function MenuItem( const URL_REGEX = /(((ftp|https?):\/\/)[\\-\w@:%_\\+.~#?,&\\/\\/=]+)|((mailto:)?[_.\w\\-]+@([\w][\w\\-]+\.)+[a-zA-Z]{2,3})/g; const IMAGE_TAG_REGEX = new RegExp(``); let truncatedContent = EMPTY_STRING; - let alteredHtmlString = htmlString; let totalLength = 0; @@ -567,8 +566,9 @@ function MenuItem( if (endResult !== null) { index = matches.index; truncatedContent += htmlString.substring(0, index + endResult.length - totalLength); - alteredHtmlString = htmlString.substring(index + endResult.length); - matches = URL_REGEX.exec(alteredHtmlString); + // eslint-disable-next-line no-param-reassign + htmlString = htmlString.substring(index + endResult.length); + matches = URL_REGEX.exec(htmlString); } } break; From 1066565786dc7b94b1686819318093cfa54d33ab Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Sun, 2 Jun 2024 16:42:31 -0500 Subject: [PATCH 21/71] reworked wordbreak section --- src/components/MenuItem.tsx | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index 5a11e4e1eaeb..c41bb9c2574e 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -459,7 +459,7 @@ function MenuItem( * Truncate HTML string and keep tag safe. * pulled from https://github.com/huang47/nodejs-html-truncate/blob/master/lib/truncate.js * - * @param string - The string that needs to be truncated + * @param htmlString - The string that needs to be truncated * @param maxLength - Length of truncated string * @param options - Optional configuration options * @returns The truncated string @@ -476,12 +476,12 @@ function MenuItem( const HTML_TAG_REGEX = new RegExp(`<\\/?(\\w+)${KEY_VALUE_REGEX}${IS_CLOSE_REGEX}>`); const URL_REGEX = /(((ftp|https?):\/\/)[\\-\w@:%_\\+.~#?,&\\/\\/=]+)|((mailto:)?[_.\w\\-]+@([\w][\w\\-]+\.)+[a-zA-Z]{2,3})/g; const IMAGE_TAG_REGEX = new RegExp(``); + const WORD_BREAK_REGEX = new RegExp('\\W+', 'g'); let truncatedContent = EMPTY_STRING; let totalLength = 0; let matches: RegExpExecArray | null = HTML_TAG_REGEX.exec(htmlString); - let result: RegExpExecArray | null; let endResult: string | number | null; let index; let tag; @@ -520,22 +520,23 @@ function MenuItem( const isShort = defaultPos < slop; const slopPos = isShort ? defaultPos : slop - 1; const substr = content.slice(isShort ? 0 : defaultPos - slop, tailPos ?? defaultPos + slop); + const wordBreakMatch = WORD_BREAK_REGEX.exec(substr); if (!opts.truncateLastWord) { if (tailPos && substr.length <= tailPos) { position = substr.length; } else { - while (result !== null) { - if (result.index < slopPos) { - position = defaultPos - (slopPos - result.index); - if (result.index === 0 && defaultPos <= 1) { + while (wordBreakMatch !== null) { + if (wordBreakMatch.index < slopPos) { + position = defaultPos - (slopPos - wordBreakMatch.index); + if (wordBreakMatch.index === 0 && defaultPos <= 1) { break; } - } else if (result.index === slopPos) { + } else if (wordBreakMatch.index === slopPos) { position = defaultPos; break; } else { - position = defaultPos + (result.index - slopPos); + position = defaultPos + (wordBreakMatch.index - slopPos); break; } } @@ -589,7 +590,7 @@ function MenuItem( tagsStack.pop(); selfClose = null; } else { - selfClose = SELF_CLOSE_REGEX.exec(endResult); + selfClose = SELF_CLOSE_REGEX.exec(endResult[0]); if (!selfClose) { tag = matches[1]; tagsStack.push(tag); From 3c1b144964ee233778847c364fa0279d4bba8a75 Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Fri, 7 Jun 2024 09:36:37 -0500 Subject: [PATCH 22/71] Update src/components/MenuItem.tsx Co-authored-by: Shubham Agrawal <58412969+shubham1206agra@users.noreply.github.com> --- src/components/MenuItem.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index babe9b32b3b2..7fe143494c6c 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -452,7 +452,7 @@ function MenuItem( ellipsis?: string; truncateLastWord?: boolean; slop?: number; - keepImageTag?: boolean; + removeImageTag?: boolean; }; /** From cd915615c39c729f59dd7f6fc73828ca6b7b2b71 Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Fri, 7 Jun 2024 09:36:53 -0500 Subject: [PATCH 23/71] Update src/components/MenuItem.tsx Co-authored-by: Shubham Agrawal <58412969+shubham1206agra@users.noreply.github.com> --- src/components/MenuItem.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index 7fe143494c6c..bdbf73741e38 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -607,7 +607,7 @@ function MenuItem( } truncatedContent += closeTags(tagsStack); - if (!opts.keepImageTag) { + if (opts.removeImageTag) { truncatedContent = removeImageTag(truncatedContent); } From 7992c533569f911f8944083d9674e2d6643fafa6 Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Fri, 7 Jun 2024 09:37:03 -0500 Subject: [PATCH 24/71] Update src/components/MenuItem.tsx Co-authored-by: Shubham Agrawal <58412969+shubham1206agra@users.noreply.github.com> --- src/components/MenuItem.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index bdbf73741e38..9a1c9abb8eb6 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -590,7 +590,7 @@ function MenuItem( tagsStack.pop(); selfClose = null; } else { - selfClose = SELF_CLOSE_REGEX.exec(endResult[0]); + selfClose = SELF_CLOSE_REGEX.exec(endResult); if (!selfClose) { tag = matches[1]; tagsStack.push(tag); From 3d7302ca303e2bb834b846551b35aefd4f4cb01d Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Fri, 7 Jun 2024 09:57:06 -0500 Subject: [PATCH 25/71] Removed reviewed implementation --- src/components/MenuItem.tsx | 171 +----------------------------------- 1 file changed, 3 insertions(+), 168 deletions(-) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index 9a1c9abb8eb6..8e0cc81ce4ab 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -1,4 +1,4 @@ -import ExpensiMark from 'expensify-common/lib/ExpensiMark'; +import {ExpensiMark} from 'expensify-common'; import type {ImageContentFit} from 'expo-image'; import type {ReactNode} from 'react'; import React, {forwardRef, useContext, useMemo} from 'react'; @@ -448,173 +448,8 @@ function MenuItem( } }; - type TruncateOptions = { - ellipsis?: string; - truncateLastWord?: boolean; - slop?: number; - removeImageTag?: boolean; - }; - - /** - * Truncate HTML string and keep tag safe. - * pulled from https://github.com/huang47/nodejs-html-truncate/blob/master/lib/truncate.js - * - * @param htmlString - The string that needs to be truncated - * @param maxLength - Length of truncated string - * @param options - Optional configuration options - * @returns The truncated string - */ - function truncate(htmlString: string, maxLength: number, options?: TruncateOptions): string { - const EMPTY_STRING = ''; - const DEFAULT_TRUNCATE_SYMBOL = '...'; - const DEFAULT_SLOP = Math.min(10, maxLength); - const tagsStack: string[] = []; - const KEY_VALUE_REGEX = '((?:\\s+(?:\\w+|-)+(?:\\s*=\\s*(?:"(?:\\\\.|[^"\\\\])*"|\'(?:\\\\.|[^\'\\\\])*\'|[^\'">\\s]+))?)*)'; - const IS_CLOSE_REGEX = '\\s*\\/?\\s*'; - const CLOSE_REGEX = '\\s*\\/\\s*'; - const SELF_CLOSE_REGEX = new RegExp(`<\\/?(\\w+)${KEY_VALUE_REGEX}${CLOSE_REGEX}>`); - const HTML_TAG_REGEX = new RegExp(`<\\/?(\\w+)${KEY_VALUE_REGEX}${IS_CLOSE_REGEX}>`); - const URL_REGEX = /(((ftp|https?):\/\/)[\\-\w@:%_\\+.~#?,&\\/\\/=]+)|((mailto:)?[_.\w\\-]+@([\w][\w\\-]+\.)+[a-zA-Z]{2,3})/g; - const IMAGE_TAG_REGEX = new RegExp(``); - const WORD_BREAK_REGEX = new RegExp('\\W+', 'g'); - let truncatedContent = EMPTY_STRING; - - let totalLength = 0; - - let matches: RegExpExecArray | null = HTML_TAG_REGEX.exec(htmlString); - let endResult: string | number | null; - let index; - let tag; - let selfClose = null; - - const opts: TruncateOptions = { - ellipsis: DEFAULT_TRUNCATE_SYMBOL, - truncateLastWord: true, - slop: DEFAULT_SLOP, - ...options, - }; - - function removeImageTag(content: string): string { - const match = IMAGE_TAG_REGEX.exec(content); - if (!match) { - return content; - } - - const matchIndex = match.index; - const matchLength = match[0].length; - - return content.substring(0, matchIndex) + content.substring(matchIndex + matchLength); - } - - function closeTags(tags: string[]): string { - return tags - .reverse() - .map((mappedTag) => ``) - .join(''); - } - - function getEndPosition(content: string, tailPos?: number): number { - const defaultPos = maxLength - totalLength; - const slop = opts.slop ?? DEFAULT_SLOP; - let position = defaultPos; - const isShort = defaultPos < slop; - const slopPos = isShort ? defaultPos : slop - 1; - const substr = content.slice(isShort ? 0 : defaultPos - slop, tailPos ?? defaultPos + slop); - const wordBreakMatch = WORD_BREAK_REGEX.exec(substr); - - if (!opts.truncateLastWord) { - if (tailPos && substr.length <= tailPos) { - position = substr.length; - } else { - while (wordBreakMatch !== null) { - if (wordBreakMatch.index < slopPos) { - position = defaultPos - (slopPos - wordBreakMatch.index); - if (wordBreakMatch.index === 0 && defaultPos <= 1) { - break; - } - } else if (wordBreakMatch.index === slopPos) { - position = defaultPos; - break; - } else { - position = defaultPos + (wordBreakMatch.index - slopPos); - break; - } - } - } - if (content.charAt(position - 1).match(/\s$/)) { - position--; - } - } - return position; - } - - while (matches) { - matches = HTML_TAG_REGEX.exec(htmlString); - - if (!matches) { - if (totalLength >= maxLength) { - break; - } - - matches = URL_REGEX.exec(htmlString); - if (!matches || matches.index >= maxLength) { - truncatedContent += htmlString.substring(0, getEndPosition(htmlString)); - break; - } - - while (matches) { - endResult = matches[0]; - if (endResult !== null) { - index = matches.index; - truncatedContent += htmlString.substring(0, index + endResult.length - totalLength); - // eslint-disable-next-line no-param-reassign - htmlString = htmlString.substring(index + endResult.length); - matches = URL_REGEX.exec(htmlString); - } - } - break; - } - - endResult = matches[0]; - index = matches.index; - - if (totalLength + index > maxLength) { - truncatedContent += htmlString.substring(0, getEndPosition(htmlString, index)); - break; - } else { - totalLength += index; - truncatedContent += htmlString.substring(0, index); - } - - if (endResult[1] === '/') { - tagsStack.pop(); - selfClose = null; - } else { - selfClose = SELF_CLOSE_REGEX.exec(endResult); - if (!selfClose) { - tag = matches[1]; - tagsStack.push(tag); - } - } - - truncatedContent += selfClose ? selfClose[0] : endResult; - // eslint-disable-next-line no-param-reassign - htmlString = htmlString.substring(index + endResult.length); // Update htmlString - } - - if (htmlString.length > maxLength - totalLength && opts.ellipsis) { - truncatedContent += opts.ellipsis; - } - truncatedContent += closeTags(tagsStack); - - if (opts.removeImageTag) { - truncatedContent = removeImageTag(truncatedContent); - } - - return truncatedContent; - } - const maxDescLength = 100; + const parser = new ExpensiMark(); return ( @@ -746,7 +581,7 @@ function MenuItem( {!!title && (shouldRenderAsHTML || (shouldParseTitle && !!html.length)) && ( - + )} {!shouldRenderAsHTML && !shouldParseTitle && !!title && ( From 5ed6237c7ddf44ee8d57a4a664d5689252856574 Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Fri, 7 Jun 2024 10:00:30 -0500 Subject: [PATCH 26/71] ran prettier --- src/components/MenuItem.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index a561d11314ff..38753eb0bda9 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -595,9 +595,9 @@ function MenuItem( {(!!title || !!shouldShowTitleIcon) && ( {!!title && (shouldRenderAsHTML || (shouldParseTitle && !!html.length)) && ( - - - + + + )} {!shouldRenderAsHTML && !shouldParseTitle && !!title && ( Date: Mon, 15 Jul 2024 14:09:01 -0500 Subject: [PATCH 27/71] Update MenuItem.tsx --- src/components/MenuItem.tsx | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index 284ba5cc4555..b18285a8aceb 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -177,6 +177,9 @@ type MenuItemBaseProps = { /** Text that appears above the title */ label?: string; + /** Limit to truncate description for menu item */ + limit?: number; + isLabelHoverable?: boolean; /** Label to be displayed on the right */ @@ -357,6 +360,7 @@ function MenuItem( subtitle, shouldShowBasicTitle, label, + limit = 100, isLabelHoverable = true, rightLabel, shouldShowSelectedState = false, @@ -504,9 +508,6 @@ function MenuItem( } }; - const maxDescLength = 100; - const parser = new ExpensiMark(); - return ( {!!label && !isLabelHoverable && ( @@ -658,7 +659,7 @@ function MenuItem( {!!title && (shouldRenderAsHTML || (shouldParseTitle && !!html.length)) && ( - + )} {!shouldRenderAsHTML && !shouldParseTitle && !!title && ( From d50e29a6d245ad51b868cd158d6c42fa3a00841d Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Mon, 15 Jul 2024 16:24:04 -0500 Subject: [PATCH 28/71] Update Parser.ts --- src/libs/Parser.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/libs/Parser.ts b/src/libs/Parser.ts index cbfeb6e40922..bd98b18ff8bc 100644 --- a/src/libs/Parser.ts +++ b/src/libs/Parser.ts @@ -43,6 +43,10 @@ class ExpensiMarkWithContext extends ExpensiMark { cacheVideoAttributes: extras?.cacheVideoAttributes, }); } + + truncateHTML(htmlString: string, limit: number, extras?: {ellipsis: boolean}): string { + return super.truncateHTML(htmlString, limit, extras); + } } ExpensiMarkWithContext.setLogger(Log); From 87630b91bfa62338297422e290709d46cab24cbe Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Wed, 17 Jul 2024 12:13:32 -0500 Subject: [PATCH 29/71] updated expensify-common version --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 94e5ad0e3b74..1ad08a0f469e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -55,7 +55,7 @@ "date-fns-tz": "^2.0.0", "dom-serializer": "^0.2.2", "domhandler": "^4.3.0", - "expensify-common": "2.0.39", + "expensify-common": "2.0.49", "expo": "^50.0.3", "expo-av": "~13.10.4", "expo-image": "1.11.0", diff --git a/package.json b/package.json index 7ffde430369c..b7b4ba497d40 100644 --- a/package.json +++ b/package.json @@ -110,7 +110,7 @@ "date-fns-tz": "^2.0.0", "dom-serializer": "^0.2.2", "domhandler": "^4.3.0", - "expensify-common": "2.0.39", + "expensify-common": "2.0.49", "expo": "^50.0.3", "expo-av": "~13.10.4", "expo-image": "1.11.0", From 51414c9af760525dfd21711918b1161ab1f39edd Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Wed, 17 Jul 2024 12:22:39 -0500 Subject: [PATCH 30/71] revert package change... --- package-lock.json | 286 +++++++++------------------------------------- package.json | 32 +++--- 2 files changed, 69 insertions(+), 249 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1ad08a0f469e..abc223a50b38 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,19 +1,19 @@ { "name": "new.expensify", - "version": "9.0.8-3", + "version": "9.0.4-7", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "new.expensify", - "version": "9.0.8-3", + "version": "9.0.4-7", "hasInstallScript": true, "license": "MIT", "dependencies": { "@babel/plugin-proposal-private-methods": "^7.18.6", "@babel/plugin-proposal-private-property-in-object": "^7.21.11", "@dotlottie/react-player": "^1.6.3", - "@expensify/react-native-live-markdown": "0.1.103", + "@expensify/react-native-live-markdown": "0.1.88", "@expo/metro-runtime": "~3.1.1", "@formatjs/intl-datetimeformat": "^6.10.0", "@formatjs/intl-listformat": "^7.2.2", @@ -26,12 +26,12 @@ "@fullstory/react-native": "^1.4.2", "@gorhom/portal": "^1.0.14", "@invertase/react-native-apple-authentication": "^2.2.2", - "@kie/act-js": "^2.6.2", + "@kie/act-js": "^2.6.0", "@kie/mock-github": "2.0.1", "@onfido/react-native-sdk": "10.6.0", "@react-native-camera-roll/camera-roll": "7.4.0", "@react-native-clipboard/clipboard": "^1.13.2", - "@react-native-community/geolocation": "3.3.0", + "@react-native-community/geolocation": "3.2.1", "@react-native-community/netinfo": "11.2.1", "@react-native-firebase/analytics": "^12.3.0", "@react-native-firebase/app": "^12.3.0", @@ -55,7 +55,7 @@ "date-fns-tz": "^2.0.0", "dom-serializer": "^0.2.2", "domhandler": "^4.3.0", - "expensify-common": "2.0.49", + "expensify-common": "2.0.19", "expo": "^50.0.3", "expo-av": "~13.10.4", "expo-image": "1.11.0", @@ -79,7 +79,7 @@ "react-content-loader": "^7.0.0", "react-dom": "18.1.0", "react-error-boundary": "^4.0.11", - "react-fast-pdf": "1.0.14", + "react-fast-pdf": "1.0.13", "react-map-gl": "^7.1.3", "react-native": "0.73.4", "react-native-android-location-enabler": "^2.0.1", @@ -102,17 +102,17 @@ "react-native-linear-gradient": "^2.8.1", "react-native-localize": "^2.2.6", "react-native-modal": "^13.0.0", - "react-native-onyx": "2.0.56", - "react-native-pager-view": "6.3.3", + "react-native-onyx": "2.0.55", + "react-native-pager-view": "6.2.3", "react-native-pdf": "6.7.3", "react-native-performance": "^5.1.0", - "react-native-permissions": "^3.10.0", + "react-native-permissions": "^3.9.3", "react-native-picker-select": "git+https://github.com/Expensify/react-native-picker-select.git#da50d2c5c54e268499047f9cc98b8df4196c1ddf", - "react-native-plaid-link-sdk": "11.11.0", + "react-native-plaid-link-sdk": "11.5.0", "react-native-qrcode-svg": "^6.2.0", "react-native-quick-sqlite": "git+https://github.com/margelo/react-native-quick-sqlite#abc91857d4b3efb2020ec43abd2a508563b64316", "react-native-reanimated": "^3.8.0", - "react-native-release-profiler": "^0.2.1", + "react-native-release-profiler": "^0.1.6", "react-native-render-html": "6.3.1", "react-native-safe-area-context": "4.8.2", "react-native-screens": "3.32.0", @@ -200,7 +200,7 @@ "babel-jest": "29.4.1", "babel-loader": "^9.1.3", "babel-plugin-module-resolver": "^5.0.0", - "babel-plugin-react-compiler": "0.0.0-experimental-696af53-20240625", + "babel-plugin-react-compiler": "^0.0.0-experimental-c23de8d-20240515", "babel-plugin-react-native-web": "^0.18.7", "babel-plugin-transform-class-properties": "^6.24.1", "babel-plugin-transform-remove-console": "^6.9.4", @@ -219,7 +219,7 @@ "eslint-config-prettier": "^9.1.0", "eslint-plugin-jest": "^28.6.0", "eslint-plugin-jsdoc": "^46.2.6", - "eslint-plugin-react-compiler": "0.0.0-experimental-0998c1e-20240625", + "eslint-plugin-react-compiler": "^0.0.0-experimental-53bb89e-20240515", "eslint-plugin-react-native-a11y": "^3.3.0", "eslint-plugin-storybook": "^0.8.0", "eslint-plugin-testing-library": "^6.2.2", @@ -233,11 +233,9 @@ "memfs": "^4.6.0", "onchange": "^7.1.0", "patch-package": "^8.0.0", - "peggy": "^4.0.3", "portfinder": "^1.0.28", "prettier": "^2.8.8", "pusher-js-mock": "^0.3.3", - "react-compiler-healthcheck": "^0.0.0-experimental-b130d5f-20240625", "react-is": "^18.3.1", "react-native-clean-project": "^4.0.0-alpha4.0", "react-test-renderer": "18.2.0", @@ -3785,9 +3783,9 @@ } }, "node_modules/@expensify/react-native-live-markdown": { - "version": "0.1.103", - "resolved": "https://registry.npmjs.org/@expensify/react-native-live-markdown/-/react-native-live-markdown-0.1.103.tgz", - "integrity": "sha512-w9jQoxBE9LghfL8UdYbG+8A+CApmER/XMH8N7/bINn7w57+FnnBa5ckPWx6/UYX7OYsmYxSaHJLQkJEXYlDRZg==", + "version": "0.1.88", + "resolved": "https://registry.npmjs.org/@expensify/react-native-live-markdown/-/react-native-live-markdown-0.1.88.tgz", + "integrity": "sha512-78X5ACV+OL+aL6pfJAXyHkNuMGUc4Rheo4qLkIwLpmUIAiAxmY0B2lch5XHSNGf1a5ofvVbdQ6kl84+4E6DwlQ==", "workspaces": [ "parser", "example", @@ -7285,10 +7283,9 @@ } }, "node_modules/@kie/act-js": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@kie/act-js/-/act-js-2.6.2.tgz", - "integrity": "sha512-i366cfWluUi55rPZ6e9/aWH4tnw3Q6W1CKh9Gz6QjTvbAtS4KnUUy33I9aMXS6uwa0haw6MSahMM37vmuFCVpQ==", + "version": "2.6.0", "hasInstallScript": true, + "license": "SEE LICENSE IN LICENSE", "dependencies": { "@kie/mock-github": "^2.0.0", "adm-zip": "^0.5.10", @@ -7881,33 +7878,6 @@ "react-native": ">=0.70.0 <1.0.x" } }, - "node_modules/@peggyjs/from-mem": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@peggyjs/from-mem/-/from-mem-1.3.0.tgz", - "integrity": "sha512-kzGoIRJjkg3KuGI4bopz9UvF3KguzfxalHRDEIdqEZUe45xezsQ6cx30e0RKuxPUexojQRBfu89Okn7f4/QXsw==", - "dev": true, - "dependencies": { - "semver": "7.6.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@peggyjs/from-mem/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@perf-profiler/android": { "version": "0.12.1", "resolved": "https://registry.npmjs.org/@perf-profiler/android/-/android-0.12.1.tgz", @@ -9583,9 +9553,9 @@ "license": "MIT" }, "node_modules/@react-native-community/geolocation": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@react-native-community/geolocation/-/geolocation-3.3.0.tgz", - "integrity": "sha512-7DFeuotH7m7ImoXffN3TmlGSFn1XjvsaphPort0XZKipssYbdHiKhVVWG+jzisvDhcXikUc6nbUJgddVBL6RDg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@react-native-community/geolocation/-/geolocation-3.2.1.tgz", + "integrity": "sha512-/+HNzuRl4UCMma7KK+KYL8k2nxAGuW+DGxqmqfpiqKBlCkCUbuFHaZZdqVD6jpsn9r/ghe583ECLmd9SV9I4Bw==", "engines": { "node": ">=18.0.0" }, @@ -20361,9 +20331,9 @@ } }, "node_modules/babel-plugin-react-compiler": { - "version": "0.0.0-experimental-696af53-20240625", - "resolved": "https://registry.npmjs.org/babel-plugin-react-compiler/-/babel-plugin-react-compiler-0.0.0-experimental-696af53-20240625.tgz", - "integrity": "sha512-OUDKms8qmcm5bX0D+sJWC1YcKcd7AZ2aJ7eY6gkR+Xr7PDfkXLbqAld4Qs9B0ntjVbUMEtW/PjlQrxDtY4raHg==", + "version": "0.0.0-experimental-c23de8d-20240515", + "resolved": "https://registry.npmjs.org/babel-plugin-react-compiler/-/babel-plugin-react-compiler-0.0.0-experimental-c23de8d-20240515.tgz", + "integrity": "sha512-0XN2gmpT55QtAz5n7d5g91y1AuO9tRhWBaLgCRyc4ExHrlr7+LfxW+YTb3mOwxngkkiggwM8HyYsaEK9MqhnlQ==", "dev": true, "dependencies": { "@babel/generator": "7.2.0", @@ -25327,9 +25297,9 @@ } }, "node_modules/eslint-plugin-react-compiler": { - "version": "0.0.0-experimental-0998c1e-20240625", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-compiler/-/eslint-plugin-react-compiler-0.0.0-experimental-0998c1e-20240625.tgz", - "integrity": "sha512-npq2RomExoQI3jETs4OrifaygyJYgOcX/q74Q9OC7GmffLh5zSJaQpzjs2fi61NMNkJyIvTBD0C6sKTGGcetOw==", + "version": "0.0.0-experimental-53bb89e-20240515", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-compiler/-/eslint-plugin-react-compiler-0.0.0-experimental-53bb89e-20240515.tgz", + "integrity": "sha512-L3HV9qja1dnClRlR9aaWEJeJoGPH9cgjKq0sYqIOOH9uyWdVMH9CudsFr6yLva7dj05FpLZkiIaRSZJ3P/v6yQ==", "dev": true, "dependencies": { "@babel/core": "^7.24.4", @@ -26003,9 +25973,9 @@ } }, "node_modules/expensify-common": { - "version": "2.0.39", - "resolved": "https://registry.npmjs.org/expensify-common/-/expensify-common-2.0.39.tgz", - "integrity": "sha512-HyW7MiS8+ZWO2xye5TSsiKJfIsaGl0M2RlI+txJNF9GWeroA6kaXybTY1Ppq+cS+a7+MU/KMQh7GNnIMrvkf+w==", + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/expensify-common/-/expensify-common-2.0.19.tgz", + "integrity": "sha512-GdWlYiHOAapy/jxjcvL9NKGOofhoEuKIwvJNGNVHbDXcA+0NxVCNYrHt1yrLnVcE4KtK6PGT6fQ2Lp8NTCoA+g==", "dependencies": { "awesome-phonenumber": "^5.4.0", "classnames": "2.5.0", @@ -26017,7 +25987,7 @@ "prop-types": "15.8.1", "react": "16.12.0", "react-dom": "16.12.0", - "semver": "^7.6.2", + "semver": "^7.6.0", "simply-deferred": "git+https://github.com/Expensify/simply-deferred.git#77a08a95754660c7bd6e0b6979fdf84e8e831bf5", "ua-parser-js": "^1.0.37" } @@ -35887,32 +35857,6 @@ "through2": "^2.0.3" } }, - "node_modules/peggy": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/peggy/-/peggy-4.0.3.tgz", - "integrity": "sha512-v7/Pt6kGYsfXsCrfb52q7/yg5jaAwiVaUMAPLPvy4DJJU6Wwr72t6nDIqIDkGfzd1B4zeVuTnQT0RGeOhe/uSA==", - "dev": true, - "dependencies": { - "@peggyjs/from-mem": "1.3.0", - "commander": "^12.1.0", - "source-map-generator": "0.8.0" - }, - "bin": { - "peggy": "bin/peggy.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/peggy/node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true, - "engines": { - "node": ">=18" - } - }, "node_modules/pend": { "version": "1.2.0", "dev": true, @@ -36814,98 +36758,6 @@ "react-dom": ">=16.8.0" } }, - "node_modules/react-compiler-healthcheck": { - "version": "0.0.0-experimental-b130d5f-20240625", - "resolved": "https://registry.npmjs.org/react-compiler-healthcheck/-/react-compiler-healthcheck-0.0.0-experimental-b130d5f-20240625.tgz", - "integrity": "sha512-vf3Ipg+f19yOYQeRP938e5jWNEpwR6EX5pwBZdJUF9rt11vJ3ckgUVcF5qGWUU/7DB0N9MH1koBqwqMYabrBiQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.24.4", - "@babel/parser": "^7.24.4", - "chalk": "4", - "fast-glob": "^3.3.2", - "ora": "5.4.1", - "yargs": "^17.7.2", - "zod": "^3.22.4", - "zod-validation-error": "^3.0.3" - }, - "bin": { - "react-compiler-healthcheck": "dist/index.js" - }, - "engines": { - "node": "^14.17.0 || ^16.0.0 || >= 18.0.0" - } - }, - "node_modules/react-compiler-healthcheck/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/react-compiler-healthcheck/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/react-compiler-healthcheck/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/react-compiler-healthcheck/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/react-compiler-healthcheck/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/react-compiler-healthcheck/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/react-compiler-runtime": { "resolved": "lib/react-compiler-runtime", "link": true @@ -37042,9 +36894,9 @@ } }, "node_modules/react-fast-pdf": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/react-fast-pdf/-/react-fast-pdf-1.0.14.tgz", - "integrity": "sha512-iWomykxvnZtokIKpRK5xpaRfXz9ufrY7AVANtIBYsAZtX5/7VDlpIQwieljfMZwFc96TyceCnneufsgXpykTQw==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/react-fast-pdf/-/react-fast-pdf-1.0.13.tgz", + "integrity": "sha512-rF7NQZ26rJAI8ysRJaG71dl2c7AIq48ibbn7xCyF3lEZ/yOjA8BeR0utRwDjaHGtswQscgETboilhaaH5UtIYg==", "dependencies": { "react-pdf": "^7.7.0", "react-window": "^1.8.10" @@ -37425,9 +37277,9 @@ } }, "node_modules/react-native-onyx": { - "version": "2.0.56", - "resolved": "https://registry.npmjs.org/react-native-onyx/-/react-native-onyx-2.0.56.tgz", - "integrity": "sha512-3rn1+J4tli9zPS9w5x6tOAUz01wVHkiTFgtHoIwjD7HdLUO/9nk6H8JX6Oqb9Vzq2XQOSavUFRepIHnGvzNtgg==", + "version": "2.0.55", + "resolved": "https://registry.npmjs.org/react-native-onyx/-/react-native-onyx-2.0.55.tgz", + "integrity": "sha512-W0+hFY98uC3uije2JBFS1ON19iAe8u6Ls50T2Qrx9NMtzUFqEchMuR75L4F/kMvi/uwtQII+Cl02Pd52h/tdPg==", "dependencies": { "ascii-table": "0.0.9", "fast-equals": "^4.0.3", @@ -37461,9 +37313,9 @@ } }, "node_modules/react-native-pager-view": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/react-native-pager-view/-/react-native-pager-view-6.3.3.tgz", - "integrity": "sha512-HViKBlfN/kBJUSu5mRL/V9Bkf1j7uDZozGAjbzh4o9XYo11qVcIK7IwvfzqrkNerVSDy/cAmZcXbcyWnII8xMA==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/react-native-pager-view/-/react-native-pager-view-6.2.3.tgz", + "integrity": "sha512-dqVpXWFtPNfD3D2QQQr8BP+ullS5MhjRJuF8Z/qml4QTILcrWaW8F5iAxKkQR3Jl0ikcEryG/+SQlNcwlo0Ggg==", "peerDependencies": { "react": "*", "react-native": "*" @@ -37490,9 +37342,8 @@ } }, "node_modules/react-native-permissions": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/react-native-permissions/-/react-native-permissions-3.10.1.tgz", - "integrity": "sha512-Gc5BxxpjZn4QNUDiVeHOO0vXh3AH7ToolmwTJozqC6DsxV7NAf3ttap+8BSmzDR8WxuAM3Cror+YNiBhHJx7/w==", + "version": "3.9.3", + "license": "MIT", "peerDependencies": { "react": ">=16.13.1", "react-native": ">=0.63.3", @@ -37517,9 +37368,9 @@ } }, "node_modules/react-native-plaid-link-sdk": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/react-native-plaid-link-sdk/-/react-native-plaid-link-sdk-11.11.0.tgz", - "integrity": "sha512-Kmimhr6iOwCtIzsW7gygz48TzaZsdjnpgstJ2PM1q+THulOnx+BnkFu8UpLIGGkVe19E4wkxOAYL8kJ8vefNSQ==", + "version": "11.5.0", + "resolved": "https://registry.npmjs.org/react-native-plaid-link-sdk/-/react-native-plaid-link-sdk-11.5.0.tgz", + "integrity": "sha512-B3fwujxBS9nZwadXFcseU3nrYG7Ptob6p9eG/gXde65cqwErMaq2k1rVv3R17s/rpKnmU5Cx5pKOMmkxPUn08w==", "peerDependencies": { "react": "*", "react-native": "*" @@ -37578,15 +37429,14 @@ "license": "MIT" }, "node_modules/react-native-release-profiler": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/react-native-release-profiler/-/react-native-release-profiler-0.2.1.tgz", - "integrity": "sha512-gDOwEXypd4Gu++nlKyaVLHPfwrVkkdBrsjMrQORYTTDqcrD/OfuNZ8YK7p+u5LUNjnPD4WmBF88C5dEW7iM1lg==", + "version": "0.1.6", + "license": "MIT", "workspaces": [ "example" ], "dependencies": { - "commander": "^11.1.0", - "hermes-profile-transformer": "^0.0.9" + "@react-native-community/cli": "^12.2.1", + "commander": "^11.1.0" }, "bin": { "react-native-release-profiler": "lib/commonjs/cli.js" @@ -37606,25 +37456,6 @@ "node": ">=16" } }, - "node_modules/react-native-release-profiler/node_modules/hermes-profile-transformer": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/hermes-profile-transformer/-/hermes-profile-transformer-0.0.9.tgz", - "integrity": "sha512-JYPUE9zA+W/hpTIGBV+t2ODvntataLLMfntoEcpEpKFDwdR6+Quk9SwLnWX9y2A3ZII6N4T8w3TUBC2ejsEGBw==", - "dependencies": { - "source-map": "^0.7.3" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/react-native-release-profiler/node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "engines": { - "node": ">= 8" - } - }, "node_modules/react-native-render-html": { "version": "6.3.1", "license": "BSD-2-Clause", @@ -39549,9 +39380,11 @@ } }, "node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.0", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, "bin": { "semver": "bin/semver.js" }, @@ -40302,15 +40135,6 @@ "node": ">=0.10.0" } }, - "node_modules/source-map-generator": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/source-map-generator/-/source-map-generator-0.8.0.tgz", - "integrity": "sha512-psgxdGMwl5MZM9S3FWee4EgsEaIjahYV5AzGnwUvPhWeITz/j6rKpysQHlQ4USdxvINlb8lKfWGIXwfkrgtqkA==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, "node_modules/source-map-js": { "version": "1.0.2", "license": "BSD-3-Clause", diff --git a/package.json b/package.json index b7b4ba497d40..bc7306ee3782 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "new.expensify", - "version": "9.0.8-3", + "version": "9.0.4-7", "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.", @@ -60,15 +60,13 @@ "workflow-test": "./workflow_tests/scripts/runWorkflowTests.sh", "workflow-test:generate": "ts-node workflow_tests/utils/preGenerateTest.ts", "setup-https": "mkcert -install && mkcert -cert-file config/webpack/certificate.pem -key-file config/webpack/key.pem dev.new.expensify.com localhost 127.0.0.1", - "e2e-test-runner-build": "ncc build tests/e2e/testRunner.ts -o tests/e2e/dist/", - "react-compiler-healthcheck": "react-compiler-healthcheck --verbose", - "generate-search-parser": "peggy --format es -o src/libs/SearchParser/searchParser.js src/libs/SearchParser/searchParser.peggy " + "e2e-test-runner-build": "ncc build tests/e2e/testRunner.ts -o tests/e2e/dist/" }, "dependencies": { "@babel/plugin-proposal-private-methods": "^7.18.6", "@babel/plugin-proposal-private-property-in-object": "^7.21.11", "@dotlottie/react-player": "^1.6.3", - "@expensify/react-native-live-markdown": "0.1.103", + "@expensify/react-native-live-markdown": "0.1.88", "@expo/metro-runtime": "~3.1.1", "@formatjs/intl-datetimeformat": "^6.10.0", "@formatjs/intl-listformat": "^7.2.2", @@ -81,12 +79,12 @@ "@fullstory/react-native": "^1.4.2", "@gorhom/portal": "^1.0.14", "@invertase/react-native-apple-authentication": "^2.2.2", - "@kie/act-js": "^2.6.2", + "@kie/act-js": "^2.6.0", "@kie/mock-github": "2.0.1", "@onfido/react-native-sdk": "10.6.0", "@react-native-camera-roll/camera-roll": "7.4.0", "@react-native-clipboard/clipboard": "^1.13.2", - "@react-native-community/geolocation": "3.3.0", + "@react-native-community/geolocation": "3.2.1", "@react-native-community/netinfo": "11.2.1", "@react-native-firebase/analytics": "^12.3.0", "@react-native-firebase/app": "^12.3.0", @@ -110,7 +108,7 @@ "date-fns-tz": "^2.0.0", "dom-serializer": "^0.2.2", "domhandler": "^4.3.0", - "expensify-common": "2.0.49", + "expensify-common": "2.0.19", "expo": "^50.0.3", "expo-av": "~13.10.4", "expo-image": "1.11.0", @@ -134,7 +132,7 @@ "react-content-loader": "^7.0.0", "react-dom": "18.1.0", "react-error-boundary": "^4.0.11", - "react-fast-pdf": "1.0.14", + "react-fast-pdf": "1.0.13", "react-map-gl": "^7.1.3", "react-native": "0.73.4", "react-native-android-location-enabler": "^2.0.1", @@ -157,17 +155,17 @@ "react-native-linear-gradient": "^2.8.1", "react-native-localize": "^2.2.6", "react-native-modal": "^13.0.0", - "react-native-onyx": "2.0.56", - "react-native-pager-view": "6.3.3", + "react-native-onyx": "2.0.55", + "react-native-pager-view": "6.2.3", "react-native-pdf": "6.7.3", "react-native-performance": "^5.1.0", - "react-native-permissions": "^3.10.0", + "react-native-permissions": "^3.9.3", "react-native-picker-select": "git+https://github.com/Expensify/react-native-picker-select.git#da50d2c5c54e268499047f9cc98b8df4196c1ddf", - "react-native-plaid-link-sdk": "11.11.0", + "react-native-plaid-link-sdk": "11.5.0", "react-native-qrcode-svg": "^6.2.0", "react-native-quick-sqlite": "git+https://github.com/margelo/react-native-quick-sqlite#abc91857d4b3efb2020ec43abd2a508563b64316", "react-native-reanimated": "^3.8.0", - "react-native-release-profiler": "^0.2.1", + "react-native-release-profiler": "^0.1.6", "react-native-render-html": "6.3.1", "react-native-safe-area-context": "4.8.2", "react-native-screens": "3.32.0", @@ -255,7 +253,7 @@ "babel-jest": "29.4.1", "babel-loader": "^9.1.3", "babel-plugin-module-resolver": "^5.0.0", - "babel-plugin-react-compiler": "0.0.0-experimental-696af53-20240625", + "babel-plugin-react-compiler": "^0.0.0-experimental-c23de8d-20240515", "babel-plugin-react-native-web": "^0.18.7", "babel-plugin-transform-class-properties": "^6.24.1", "babel-plugin-transform-remove-console": "^6.9.4", @@ -274,7 +272,7 @@ "eslint-config-prettier": "^9.1.0", "eslint-plugin-jest": "^28.6.0", "eslint-plugin-jsdoc": "^46.2.6", - "eslint-plugin-react-compiler": "0.0.0-experimental-0998c1e-20240625", + "eslint-plugin-react-compiler": "^0.0.0-experimental-53bb89e-20240515", "eslint-plugin-react-native-a11y": "^3.3.0", "eslint-plugin-storybook": "^0.8.0", "eslint-plugin-testing-library": "^6.2.2", @@ -288,11 +286,9 @@ "memfs": "^4.6.0", "onchange": "^7.1.0", "patch-package": "^8.0.0", - "peggy": "^4.0.3", "portfinder": "^1.0.28", "prettier": "^2.8.8", "pusher-js-mock": "^0.3.3", - "react-compiler-healthcheck": "^0.0.0-experimental-b130d5f-20240625", "react-is": "^18.3.1", "react-native-clean-project": "^4.0.0-alpha4.0", "react-test-renderer": "18.2.0", From fd98fcba25c88b77e4f336d6b0bd46e984d54b9a Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Wed, 17 Jul 2024 13:34:08 -0500 Subject: [PATCH 31/71] reset package.json to main --- package-lock.json | 1511 ++++++++++++++++++++++++++++++++++++--------- package.json | 36 +- 2 files changed, 1233 insertions(+), 314 deletions(-) diff --git a/package-lock.json b/package-lock.json index abc223a50b38..6af6a9fecde1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,19 +1,19 @@ { "name": "new.expensify", - "version": "9.0.4-7", + "version": "9.0.8-3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "new.expensify", - "version": "9.0.4-7", + "version": "9.0.8-3", "hasInstallScript": true, "license": "MIT", "dependencies": { "@babel/plugin-proposal-private-methods": "^7.18.6", "@babel/plugin-proposal-private-property-in-object": "^7.21.11", "@dotlottie/react-player": "^1.6.3", - "@expensify/react-native-live-markdown": "0.1.88", + "@expensify/react-native-live-markdown": "0.1.103", "@expo/metro-runtime": "~3.1.1", "@formatjs/intl-datetimeformat": "^6.10.0", "@formatjs/intl-listformat": "^7.2.2", @@ -26,12 +26,12 @@ "@fullstory/react-native": "^1.4.2", "@gorhom/portal": "^1.0.14", "@invertase/react-native-apple-authentication": "^2.2.2", - "@kie/act-js": "^2.6.0", + "@kie/act-js": "^2.6.2", "@kie/mock-github": "2.0.1", "@onfido/react-native-sdk": "10.6.0", "@react-native-camera-roll/camera-roll": "7.4.0", "@react-native-clipboard/clipboard": "^1.13.2", - "@react-native-community/geolocation": "3.2.1", + "@react-native-community/geolocation": "3.3.0", "@react-native-community/netinfo": "11.2.1", "@react-native-firebase/analytics": "^12.3.0", "@react-native-firebase/app": "^12.3.0", @@ -55,7 +55,7 @@ "date-fns-tz": "^2.0.0", "dom-serializer": "^0.2.2", "domhandler": "^4.3.0", - "expensify-common": "2.0.19", + "expensify-common": "2.0.39", "expo": "^50.0.3", "expo-av": "~13.10.4", "expo-image": "1.11.0", @@ -79,7 +79,7 @@ "react-content-loader": "^7.0.0", "react-dom": "18.1.0", "react-error-boundary": "^4.0.11", - "react-fast-pdf": "1.0.13", + "react-fast-pdf": "1.0.14", "react-map-gl": "^7.1.3", "react-native": "0.73.4", "react-native-android-location-enabler": "^2.0.1", @@ -102,17 +102,17 @@ "react-native-linear-gradient": "^2.8.1", "react-native-localize": "^2.2.6", "react-native-modal": "^13.0.0", - "react-native-onyx": "2.0.55", - "react-native-pager-view": "6.2.3", + "react-native-onyx": "2.0.56", + "react-native-pager-view": "6.3.3", "react-native-pdf": "6.7.3", "react-native-performance": "^5.1.0", - "react-native-permissions": "^3.9.3", + "react-native-permissions": "^3.10.0", "react-native-picker-select": "git+https://github.com/Expensify/react-native-picker-select.git#da50d2c5c54e268499047f9cc98b8df4196c1ddf", - "react-native-plaid-link-sdk": "11.5.0", + "react-native-plaid-link-sdk": "11.11.0", "react-native-qrcode-svg": "^6.2.0", "react-native-quick-sqlite": "git+https://github.com/margelo/react-native-quick-sqlite#abc91857d4b3efb2020ec43abd2a508563b64316", "react-native-reanimated": "^3.8.0", - "react-native-release-profiler": "^0.1.6", + "react-native-release-profiler": "^0.2.1", "react-native-render-html": "6.3.1", "react-native-safe-area-context": "4.8.2", "react-native-screens": "3.32.0", @@ -200,7 +200,7 @@ "babel-jest": "29.4.1", "babel-loader": "^9.1.3", "babel-plugin-module-resolver": "^5.0.0", - "babel-plugin-react-compiler": "^0.0.0-experimental-c23de8d-20240515", + "babel-plugin-react-compiler": "0.0.0-experimental-696af53-20240625", "babel-plugin-react-native-web": "^0.18.7", "babel-plugin-transform-class-properties": "^6.24.1", "babel-plugin-transform-remove-console": "^6.9.4", @@ -212,14 +212,14 @@ "diff-so-fancy": "^1.3.0", "dotenv": "^16.0.3", "electron": "^29.4.1", - "electron-builder": "24.13.2", + "electron-builder": "25.0.0", "eslint": "^8.57.0", "eslint-config-airbnb-typescript": "^18.0.0", "eslint-config-expensify": "^2.0.52", "eslint-config-prettier": "^9.1.0", "eslint-plugin-jest": "^28.6.0", "eslint-plugin-jsdoc": "^46.2.6", - "eslint-plugin-react-compiler": "^0.0.0-experimental-53bb89e-20240515", + "eslint-plugin-react-compiler": "0.0.0-experimental-0998c1e-20240625", "eslint-plugin-react-native-a11y": "^3.3.0", "eslint-plugin-storybook": "^0.8.0", "eslint-plugin-testing-library": "^6.2.2", @@ -233,9 +233,11 @@ "memfs": "^4.6.0", "onchange": "^7.1.0", "patch-package": "^8.0.0", + "peggy": "^4.0.3", "portfinder": "^1.0.28", "prettier": "^2.8.8", "pusher-js-mock": "^0.3.3", + "react-compiler-healthcheck": "^0.0.0-experimental-b130d5f-20240625", "react-is": "^18.3.1", "react-native-clean-project": "^4.0.0-alpha4.0", "react-test-renderer": "18.2.0", @@ -2980,8 +2982,9 @@ }, "node_modules/@develar/schema-utils": { "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", + "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==", "dev": true, - "license": "MIT", "dependencies": { "ajv": "^6.12.0", "ajv-keywords": "^3.4.1" @@ -2996,8 +2999,9 @@ }, "node_modules/@develar/schema-utils/node_modules/ajv": { "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -3011,16 +3015,18 @@ }, "node_modules/@develar/schema-utils/node_modules/ajv-keywords": { "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, - "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" } }, "node_modules/@develar/schema-utils/node_modules/json-schema-traverse": { "version": "0.4.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.7", @@ -3105,9 +3111,10 @@ } }, "node_modules/@electron/asar": { - "version": "3.2.8", + "version": "3.2.10", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.10.tgz", + "integrity": "sha512-mvBSwIBUeiRscrCeJE1LwctAriBj65eUDm0Pc11iE5gRwzkmsdbS7FnZ1XUWjpSeQWL1L5g12Fc/SchPM9DUOw==", "dev": true, - "license": "MIT", "dependencies": { "commander": "^5.0.0", "glob": "^7.1.6", @@ -3122,8 +3129,9 @@ }, "node_modules/@electron/asar/node_modules/commander": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 6" } @@ -3186,9 +3194,10 @@ } }, "node_modules/@electron/notarize": { - "version": "2.2.1", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.3.2.tgz", + "integrity": "sha512-zfayxCe19euNwRycCty1C7lF7snk9YwfRpB5M8GLr1a4ICH63znxaPNAubrMvj0yDvVozqfgsdYpXVUnpWBDpg==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^4.1.1", "fs-extra": "^9.0.1", @@ -3199,9 +3208,10 @@ } }, "node_modules/@electron/osx-sign": { - "version": "1.0.5", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.0.tgz", + "integrity": "sha512-TEXhxlYSDRr9JWK5nWdOv5MtuUdaZ412uxIIEQ0hLt80o0HYWtQJBlW5QmrQDMtebzATaOjKG9UfCzLyA90zWQ==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "compare-version": "^0.1.2", "debug": "^4.3.4", @@ -3220,8 +3230,9 @@ }, "node_modules/@electron/osx-sign/node_modules/fs-extra": { "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, - "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -3233,8 +3244,9 @@ }, "node_modules/@electron/osx-sign/node_modules/isbinaryfile": { "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 8.0.0" }, @@ -3242,21 +3254,172 @@ "url": "https://github.com/sponsors/gjtorikian/" } }, + "node_modules/@electron/rebuild": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-3.6.0.tgz", + "integrity": "sha512-zF4x3QupRU3uNGaP5X1wjpmcjfw1H87kyqZ00Tc3HvriV+4gmOGuvQjGNkrJuXdsApssdNyVwLsy+TaeTGGcVw==", + "dev": true, + "dependencies": { + "@malept/cross-spawn-promise": "^2.0.0", + "chalk": "^4.0.0", + "debug": "^4.1.1", + "detect-libc": "^2.0.1", + "fs-extra": "^10.0.0", + "got": "^11.7.0", + "node-abi": "^3.45.0", + "node-api-version": "^0.2.0", + "node-gyp": "^9.0.0", + "ora": "^5.1.0", + "read-binary-file-arch": "^1.0.6", + "semver": "^7.3.5", + "tar": "^6.0.5", + "yargs": "^17.0.1" + }, + "bin": { + "electron-rebuild": "lib/cli.js" + }, + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/@electron/rebuild/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@electron/rebuild/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@electron/rebuild/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@electron/rebuild/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@electron/rebuild/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron/rebuild/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@electron/rebuild/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@electron/universal": { - "version": "1.5.1", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-2.0.1.tgz", + "integrity": "sha512-fKpv9kg4SPmt+hY7SVBnIYULE9QJl8L3sCfcBsnqbJwwBwAeTLokJ9TRt9y7bK0JAzIW2y78TVVjvnQEms/yyA==", "dev": true, - "license": "MIT", "dependencies": { - "@electron/asar": "^3.2.1", - "@malept/cross-spawn-promise": "^1.1.0", + "@electron/asar": "^3.2.7", + "@malept/cross-spawn-promise": "^2.0.0", "debug": "^4.3.1", - "dir-compare": "^3.0.0", - "fs-extra": "^9.0.1", - "minimatch": "^3.0.4", - "plist": "^3.0.4" + "dir-compare": "^4.2.0", + "fs-extra": "^11.1.1", + "minimatch": "^9.0.3", + "plist": "^3.1.0" }, "engines": { - "node": ">=8.6" + "node": ">=16.4" + } + }, + "node_modules/@electron/universal/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@electron/universal/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@electron/universal/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@emotion/use-insertion-effect-with-fallbacks": { @@ -3783,9 +3946,9 @@ } }, "node_modules/@expensify/react-native-live-markdown": { - "version": "0.1.88", - "resolved": "https://registry.npmjs.org/@expensify/react-native-live-markdown/-/react-native-live-markdown-0.1.88.tgz", - "integrity": "sha512-78X5ACV+OL+aL6pfJAXyHkNuMGUc4Rheo4qLkIwLpmUIAiAxmY0B2lch5XHSNGf1a5ofvVbdQ6kl84+4E6DwlQ==", + "version": "0.1.103", + "resolved": "https://registry.npmjs.org/@expensify/react-native-live-markdown/-/react-native-live-markdown-0.1.103.tgz", + "integrity": "sha512-w9jQoxBE9LghfL8UdYbG+8A+CApmER/XMH8N7/bINn7w57+FnnBa5ckPWx6/UYX7OYsmYxSaHJLQkJEXYlDRZg==", "workspaces": [ "parser", "example", @@ -7283,9 +7446,10 @@ } }, "node_modules/@kie/act-js": { - "version": "2.6.0", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@kie/act-js/-/act-js-2.6.2.tgz", + "integrity": "sha512-i366cfWluUi55rPZ6e9/aWH4tnw3Q6W1CKh9Gz6QjTvbAtS4KnUUy33I9aMXS6uwa0haw6MSahMM37vmuFCVpQ==", "hasInstallScript": true, - "license": "SEE LICENSE IN LICENSE", "dependencies": { "@kie/mock-github": "^2.0.0", "adm-zip": "^0.5.10", @@ -7415,7 +7579,9 @@ } }, "node_modules/@malept/cross-spawn-promise": { - "version": "1.1.1", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz", + "integrity": "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==", "dev": true, "funding": [ { @@ -7427,18 +7593,18 @@ "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" } ], - "license": "Apache-2.0", "dependencies": { "cross-spawn": "^7.0.1" }, "engines": { - "node": ">= 10" + "node": ">= 12.13.0" } }, "node_modules/@malept/flatpak-bundler": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz", + "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^4.1.1", "fs-extra": "^9.0.0", @@ -7878,6 +8044,33 @@ "react-native": ">=0.70.0 <1.0.x" } }, + "node_modules/@peggyjs/from-mem": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@peggyjs/from-mem/-/from-mem-1.3.0.tgz", + "integrity": "sha512-kzGoIRJjkg3KuGI4bopz9UvF3KguzfxalHRDEIdqEZUe45xezsQ6cx30e0RKuxPUexojQRBfu89Okn7f4/QXsw==", + "dev": true, + "dependencies": { + "semver": "7.6.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@peggyjs/from-mem/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@perf-profiler/android": { "version": "0.12.1", "resolved": "https://registry.npmjs.org/@perf-profiler/android/-/android-0.12.1.tgz", @@ -9553,9 +9746,9 @@ "license": "MIT" }, "node_modules/@react-native-community/geolocation": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@react-native-community/geolocation/-/geolocation-3.2.1.tgz", - "integrity": "sha512-/+HNzuRl4UCMma7KK+KYL8k2nxAGuW+DGxqmqfpiqKBlCkCUbuFHaZZdqVD6jpsn9r/ghe583ECLmd9SV9I4Bw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@react-native-community/geolocation/-/geolocation-3.3.0.tgz", + "integrity": "sha512-7DFeuotH7m7ImoXffN3TmlGSFn1XjvsaphPort0XZKipssYbdHiKhVVWG+jzisvDhcXikUc6nbUJgddVBL6RDg==", "engines": { "node": ">=18.0.0" }, @@ -17625,8 +17818,9 @@ }, "node_modules/@types/debug": { "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/ms": "*" } @@ -17713,8 +17907,9 @@ }, "node_modules/@types/fs-extra": { "version": "9.0.13", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", + "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*" } @@ -17901,8 +18096,9 @@ }, "node_modules/@types/ms": { "version": "0.7.34", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", + "dev": true }, "node_modules/@types/node": { "version": "20.11.5", @@ -17933,8 +18129,9 @@ }, "node_modules/@types/plist": { "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.5.tgz", + "integrity": "sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "@types/node": "*", @@ -18142,9 +18339,10 @@ "dev": true }, "node_modules/@types/verror": { - "version": "1.10.9", + "version": "1.10.10", + "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.10.tgz", + "integrity": "sha512-l4MM0Jppn18hb9xmM6wwD1uTdShpf9Pn80aXTStnK1C94gtPvJcV2FrDmbOQUAQfJ1cKZHktkQUDwEqaAKXMMg==", "dev": true, - "license": "MIT", "optional": true }, "node_modules/@types/webpack": { @@ -18917,8 +19115,9 @@ }, "node_modules/7zip-bin": { "version": "5.2.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.2.0.tgz", + "integrity": "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==", + "dev": true }, "node_modules/abab": { "version": "2.0.6", @@ -18926,8 +19125,8 @@ }, "node_modules/abbrev": { "version": "1.1.1", - "license": "ISC", - "optional": true + "devOptional": true, + "license": "ISC" }, "node_modules/abort-controller": { "version": "3.0.0", @@ -19045,6 +19244,18 @@ "node": ">= 6.0.0" } }, + "node_modules/agentkeepalive": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "dev": true, + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, "node_modules/aggregate-error": { "version": "3.1.0", "license": "MIT", @@ -19265,29 +19476,32 @@ } }, "node_modules/app-builder-bin": { - "version": "4.0.0", - "dev": true, - "license": "MIT" + "version": "5.0.0-alpha.4", + "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-5.0.0-alpha.4.tgz", + "integrity": "sha512-4MitKmOtfTdMONrtRoiaqJ6HtlVZXgrNX1PNdEzEHSAoXU85x7s+mo0IhAS9K9qgjyTVuLrM1E/HAMp5qGyoOA==", + "dev": true }, "node_modules/app-builder-lib": { - "version": "24.13.2", + "version": "25.0.0", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-25.0.0.tgz", + "integrity": "sha512-GIx0n/QvbeObY8rQTTp08UPn4pS9xSGZLq6cPRy/CyX/mTNN9pO/uU28MWgqjnYXk0bf/595vzDdAijuDyz5Zw==", "dev": true, - "license": "MIT", "dependencies": { "@develar/schema-utils": "~2.6.5", - "@electron/notarize": "2.2.1", - "@electron/osx-sign": "1.0.5", - "@electron/universal": "1.5.1", + "@electron/notarize": "2.3.2", + "@electron/osx-sign": "1.3.0", + "@electron/rebuild": "3.6.0", + "@electron/universal": "2.0.1", "@malept/flatpak-bundler": "^0.4.0", "@types/fs-extra": "9.0.13", "async-exit-hook": "^2.0.1", "bluebird-lst": "^1.0.9", - "builder-util": "24.13.1", - "builder-util-runtime": "9.2.4", + "builder-util": "25.0.0", + "builder-util-runtime": "9.2.5", "chromium-pickle-js": "^0.2.0", "debug": "^4.3.4", "ejs": "^3.1.8", - "electron-publish": "24.13.1", + "electron-publish": "25.0.0", "form-data": "^4.0.0", "fs-extra": "^10.1.0", "hosted-git-info": "^4.1.0", @@ -19295,8 +19509,9 @@ "isbinaryfile": "^5.0.0", "js-yaml": "^4.1.0", "lazy-val": "^1.0.5", - "minimatch": "^5.1.1", - "read-config-file": "6.3.2", + "minimatch": "^10.0.0", + "read-config-file": "6.4.0", + "resedit": "^1.7.0", "sanitize-filename": "^1.6.3", "semver": "^7.3.8", "tar": "^6.1.12", @@ -19306,27 +19521,30 @@ "node": ">=14.0.0" }, "peerDependencies": { - "dmg-builder": "24.13.2", - "electron-builder-squirrel-windows": "24.13.2" + "dmg-builder": "25.0.0", + "electron-builder-squirrel-windows": "25.0.0" } }, "node_modules/app-builder-lib/node_modules/argparse": { "version": "2.0.1", - "dev": true, - "license": "Python-2.0" + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true }, "node_modules/app-builder-lib/node_modules/brace-expansion": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/app-builder-lib/node_modules/form-data": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dev": true, - "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -19338,8 +19556,9 @@ }, "node_modules/app-builder-lib/node_modules/fs-extra": { "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, - "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -19351,8 +19570,9 @@ }, "node_modules/app-builder-lib/node_modules/js-yaml": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -19361,14 +19581,18 @@ } }, "node_modules/app-builder-lib/node_modules/minimatch": { - "version": "5.1.6", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=10" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/app-root-dir": { @@ -19388,13 +19612,14 @@ }, "node_modules/aproba": { "version": "1.2.0", - "license": "ISC", - "optional": true + "devOptional": true, + "license": "ISC" }, "node_modules/archiver": { "version": "5.3.2", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.2.tgz", + "integrity": "sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "archiver-utils": "^2.1.0", @@ -19411,8 +19636,9 @@ }, "node_modules/archiver-utils": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "glob": "^7.1.4", @@ -19432,8 +19658,9 @@ }, "node_modules/archiver/node_modules/readable-stream": { "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "inherits": "^2.0.3", @@ -19705,8 +19932,9 @@ }, "node_modules/assert-plus": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "dev": true, - "license": "MIT", "optional": true, "engines": { "node": ">=0.8" @@ -19749,8 +19977,9 @@ }, "node_modules/astral-regex": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true, - "license": "MIT", "optional": true, "engines": { "node": ">=8" @@ -19770,8 +19999,9 @@ }, "node_modules/async-exit-hook": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", + "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -20331,9 +20561,9 @@ } }, "node_modules/babel-plugin-react-compiler": { - "version": "0.0.0-experimental-c23de8d-20240515", - "resolved": "https://registry.npmjs.org/babel-plugin-react-compiler/-/babel-plugin-react-compiler-0.0.0-experimental-c23de8d-20240515.tgz", - "integrity": "sha512-0XN2gmpT55QtAz5n7d5g91y1AuO9tRhWBaLgCRyc4ExHrlr7+LfxW+YTb3mOwxngkkiggwM8HyYsaEK9MqhnlQ==", + "version": "0.0.0-experimental-696af53-20240625", + "resolved": "https://registry.npmjs.org/babel-plugin-react-compiler/-/babel-plugin-react-compiler-0.0.0-experimental-696af53-20240625.tgz", + "integrity": "sha512-OUDKms8qmcm5bX0D+sJWC1YcKcd7AZ2aJ7eY6gkR+Xr7PDfkXLbqAld4Qs9B0ntjVbUMEtW/PjlQrxDtY4raHg==", "dev": true, "dependencies": { "@babel/generator": "7.2.0", @@ -20912,13 +21142,15 @@ }, "node_modules/bluebird": { "version": "3.7.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true }, "node_modules/bluebird-lst": { "version": "1.0.9", + "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.9.tgz", + "integrity": "sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==", "dev": true, - "license": "MIT", "dependencies": { "bluebird": "^3.5.5" } @@ -21238,17 +21470,6 @@ "node": "*" } }, - "node_modules/buffer-equal": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/buffer-fill": { "version": "1.0.0", "license": "MIT" @@ -21262,15 +21483,16 @@ "license": "MIT" }, "node_modules/builder-util": { - "version": "24.13.1", + "version": "25.0.0", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-25.0.0.tgz", + "integrity": "sha512-cI8zIsipo/gciZ5jGEA1qYL5Em1N6cWoNMpeJWZAfOs3H9s5zQWKnAS7rTdlJpsJ88gEmL5/32yeXUF2Uzxw6w==", "dev": true, - "license": "MIT", "dependencies": { "@types/debug": "^4.1.6", "7zip-bin": "~5.2.0", - "app-builder-bin": "4.0.0", + "app-builder-bin": "v5.0.0-alpha.4", "bluebird-lst": "^1.0.9", - "builder-util-runtime": "9.2.4", + "builder-util-runtime": "9.2.5", "chalk": "^4.1.2", "cross-spawn": "^7.0.3", "debug": "^4.3.4", @@ -21285,9 +21507,10 @@ } }, "node_modules/builder-util-runtime": { - "version": "9.2.4", + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.5.tgz", + "integrity": "sha512-HjIDfhvqx/8B3TDN4GbABQcgpewTU4LMRTQPkVpKYV3lsuxEJoIfvg09GyWTNmfVNSUAYf+fbTN//JX4TH20pg==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^4.3.4", "sax": "^1.2.4" @@ -21298,8 +21521,9 @@ }, "node_modules/builder-util/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -21312,13 +21536,15 @@ }, "node_modules/builder-util/node_modules/argparse": { "version": "2.0.1", - "dev": true, - "license": "Python-2.0" + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true }, "node_modules/builder-util/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -21332,8 +21558,9 @@ }, "node_modules/builder-util/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -21343,13 +21570,15 @@ }, "node_modules/builder-util/node_modules/color-name": { "version": "1.1.4", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/builder-util/node_modules/fs-extra": { "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, - "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -21361,16 +21590,18 @@ }, "node_modules/builder-util/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/builder-util/node_modules/js-yaml": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -21380,8 +21611,9 @@ }, "node_modules/builder-util/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -21774,8 +22006,9 @@ }, "node_modules/chromium-pickle-js": { "version": "0.2.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", + "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", + "dev": true }, "node_modules/ci-info": { "version": "3.8.0", @@ -21981,8 +22214,9 @@ }, "node_modules/cli-truncate": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "slice-ansi": "^3.0.0", @@ -22135,8 +22369,8 @@ }, "node_modules/color-support": { "version": "1.1.3", + "devOptional": true, "license": "ISC", - "optional": true, "bin": { "color-support": "bin.js" } @@ -22201,8 +22435,9 @@ }, "node_modules/compare-version": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", + "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -22233,8 +22468,9 @@ }, "node_modules/compress-commons": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz", + "integrity": "sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "buffer-crc32": "^0.2.13", @@ -22248,8 +22484,9 @@ }, "node_modules/compress-commons/node_modules/readable-stream": { "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "inherits": "^2.0.3", @@ -22414,47 +22651,64 @@ } }, "node_modules/config-file-ts": { - "version": "0.2.6", + "version": "0.2.8-rc1", + "resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.8-rc1.tgz", + "integrity": "sha512-GtNECbVI82bT4RiDIzBSVuTKoSHufnU7Ce7/42bkWZJZFLjmDF2WBpVsvRkhKCfKBnTBb3qZrBwPpFBU/Myvhg==", "dev": true, - "license": "MIT", "dependencies": { - "glob": "^10.3.10", - "typescript": "^5.3.3" + "glob": "^10.3.12", + "typescript": "^5.4.3" } }, "node_modules/config-file-ts/node_modules/brace-expansion": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/config-file-ts/node_modules/glob": { - "version": "10.3.10", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, - "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, - "engines": { - "node": ">=16 || 14 >=14.17" + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/config-file-ts/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" }, "funding": { "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, "node_modules/config-file-ts/node_modules/minimatch": { - "version": "9.0.3", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -22466,9 +22720,10 @@ } }, "node_modules/config-file-ts/node_modules/minipass": { - "version": "7.0.4", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, - "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } @@ -22557,8 +22812,8 @@ }, "node_modules/console-control-strings": { "version": "1.1.0", - "license": "ISC", - "optional": true + "devOptional": true, + "license": "ISC" }, "node_modules/constants-browserify": { "version": "1.0.0", @@ -22776,8 +23031,9 @@ }, "node_modules/crc": { "version": "3.8.0", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", + "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "buffer": "^5.1.0" @@ -22785,8 +23041,9 @@ }, "node_modules/crc-32": { "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", "dev": true, - "license": "Apache-2.0", "peer": true, "bin": { "crc32": "bin/crc32.njs" @@ -22797,8 +23054,9 @@ }, "node_modules/crc32-stream": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz", + "integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "crc-32": "^1.2.0", @@ -22810,8 +23068,9 @@ }, "node_modules/crc32-stream/node_modules/readable-stream": { "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "inherits": "^2.0.3", @@ -23551,8 +23810,8 @@ }, "node_modules/delegates": { "version": "1.0.0", - "license": "MIT", - "optional": true + "devOptional": true, + "license": "MIT" }, "node_modules/denodeify": { "version": "1.2.1", @@ -23613,8 +23872,8 @@ }, "node_modules/detect-libc": { "version": "2.0.1", + "devOptional": true, "license": "Apache-2.0", - "optional": true, "engines": { "node": ">=8" } @@ -23707,12 +23966,13 @@ "license": "MIT" }, "node_modules/dir-compare": { - "version": "3.3.0", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-4.2.0.tgz", + "integrity": "sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==", "dev": true, - "license": "MIT", "dependencies": { - "buffer-equal": "^1.0.0", - "minimatch": "^3.0.4" + "minimatch": "^3.0.5", + "p-limit": "^3.1.0 " } }, "node_modules/dir-glob": { @@ -23726,13 +23986,14 @@ } }, "node_modules/dmg-builder": { - "version": "24.13.2", + "version": "25.0.0", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-25.0.0.tgz", + "integrity": "sha512-kXETWCy/JIXS8PHYc8Y0EdSWO02gpf4jleW74hkIp6o9WWTjAdBRw2fAcRBNIEBUJtVHFrgCYsEWh0wKFUB0+A==", "dev": true, - "license": "MIT", "dependencies": { - "app-builder-lib": "24.13.2", - "builder-util": "24.13.1", - "builder-util-runtime": "9.2.4", + "app-builder-lib": "25.0.0", + "builder-util": "25.0.0", + "builder-util-runtime": "9.2.5", "fs-extra": "^10.1.0", "iconv-lite": "^0.6.2", "js-yaml": "^4.1.0" @@ -23743,13 +24004,15 @@ }, "node_modules/dmg-builder/node_modules/argparse": { "version": "2.0.1", - "dev": true, - "license": "Python-2.0" + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true }, "node_modules/dmg-builder/node_modules/fs-extra": { "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, - "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -23761,8 +24024,9 @@ }, "node_modules/dmg-builder/node_modules/js-yaml": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -23772,8 +24036,9 @@ }, "node_modules/dmg-license": { "version": "1.0.11", + "resolved": "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.11.tgz", + "integrity": "sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==", "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -23797,8 +24062,9 @@ }, "node_modules/dmg-license/node_modules/ajv": { "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "fast-deep-equal": "^3.1.1", @@ -23813,8 +24079,9 @@ }, "node_modules/dmg-license/node_modules/json-schema-traverse": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, - "license": "MIT", "optional": true }, "node_modules/dns-packet": { @@ -23929,20 +24196,31 @@ } }, "node_modules/dotenv": { - "version": "16.3.1", + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=12" }, "funding": { - "url": "https://github.com/motdotla/dotenv?sponsor=1" + "url": "https://dotenvx.com" } }, "node_modules/dotenv-expand": { - "version": "5.1.0", + "version": "11.0.6", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.6.tgz", + "integrity": "sha512-8NHi73otpWsZGBSZwwknTXS5pqMOrk9+Ssrna8xCaxkzEpU9OTf9R5ArQGVw03//Zmk9MOwLPng9WwndvpAJ5g==", "dev": true, - "license": "BSD-2-Clause" + "dependencies": { + "dotenv": "^16.4.4" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } }, "node_modules/duplexer": { "version": "0.1.2", @@ -24010,19 +24288,20 @@ } }, "node_modules/electron-builder": { - "version": "24.13.2", + "version": "25.0.0", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-25.0.0.tgz", + "integrity": "sha512-3nEqF6KnoM206mLz1C70VXWCzXmH2boL82wkpgLB1GXgK3dly6ay/cepI+2BmQT4iWkIHeG8qH9bPjPj0hn+1A==", "dev": true, - "license": "MIT", "dependencies": { - "app-builder-lib": "24.13.2", - "builder-util": "24.13.1", - "builder-util-runtime": "9.2.4", + "app-builder-lib": "25.0.0", + "builder-util": "25.0.0", + "builder-util-runtime": "9.2.5", "chalk": "^4.1.2", - "dmg-builder": "24.13.2", + "dmg-builder": "25.0.0", "fs-extra": "^10.1.0", "is-ci": "^3.0.0", "lazy-val": "^1.0.5", - "read-config-file": "6.3.2", + "read-config-file": "6.4.0", "simple-update-notifier": "2.0.0", "yargs": "^17.6.2" }, @@ -24035,21 +24314,23 @@ } }, "node_modules/electron-builder-squirrel-windows": { - "version": "24.13.2", + "version": "25.0.0", + "resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-25.0.0.tgz", + "integrity": "sha512-bfARwAdye1UkFQZ7NedHZBcOek2lvDDeg/pCaXT4Nrki7gdwrvVY/Be/QJm7Smc6IR/mviozbL9ykUHQ/FSsbw==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { - "app-builder-lib": "24.13.2", + "app-builder-lib": "25.0.0", "archiver": "^5.3.1", - "builder-util": "24.13.1", + "builder-util": "25.0.0", "fs-extra": "^10.1.0" } }, "node_modules/electron-builder-squirrel-windows/node_modules/fs-extra": { "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "graceful-fs": "^4.2.0", @@ -24138,13 +24419,14 @@ } }, "node_modules/electron-publish": { - "version": "24.13.1", + "version": "25.0.0", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-25.0.0.tgz", + "integrity": "sha512-8wq3pVLq9bpd/jNKJGIXbeL8B8AovLojtCDkVSuSgrLtxEndqy5JfuadUKPAgbmh1zjholNAHsfHH9FS5yeYAg==", "dev": true, - "license": "MIT", "dependencies": { "@types/fs-extra": "^9.0.11", - "builder-util": "24.13.1", - "builder-util-runtime": "9.2.4", + "builder-util": "25.0.0", + "builder-util-runtime": "9.2.5", "chalk": "^4.1.2", "fs-extra": "^10.1.0", "lazy-val": "^1.0.5", @@ -24153,8 +24435,9 @@ }, "node_modules/electron-publish/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -24167,8 +24450,9 @@ }, "node_modules/electron-publish/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -24182,8 +24466,9 @@ }, "node_modules/electron-publish/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -24193,13 +24478,15 @@ }, "node_modules/electron-publish/node_modules/color-name": { "version": "1.1.4", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/electron-publish/node_modules/fs-extra": { "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, - "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -24211,16 +24498,18 @@ }, "node_modules/electron-publish/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/electron-publish/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -24283,6 +24572,15 @@ "node": ">= 0.8" } }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, "node_modules/end-of-stream": { "version": "1.4.4", "license": "MIT", @@ -25297,9 +25595,9 @@ } }, "node_modules/eslint-plugin-react-compiler": { - "version": "0.0.0-experimental-53bb89e-20240515", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-compiler/-/eslint-plugin-react-compiler-0.0.0-experimental-53bb89e-20240515.tgz", - "integrity": "sha512-L3HV9qja1dnClRlR9aaWEJeJoGPH9cgjKq0sYqIOOH9uyWdVMH9CudsFr6yLva7dj05FpLZkiIaRSZJ3P/v6yQ==", + "version": "0.0.0-experimental-0998c1e-20240625", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-compiler/-/eslint-plugin-react-compiler-0.0.0-experimental-0998c1e-20240625.tgz", + "integrity": "sha512-npq2RomExoQI3jETs4OrifaygyJYgOcX/q74Q9OC7GmffLh5zSJaQpzjs2fi61NMNkJyIvTBD0C6sKTGGcetOw==", "dev": true, "dependencies": { "@babel/core": "^7.24.4", @@ -25973,9 +26271,9 @@ } }, "node_modules/expensify-common": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/expensify-common/-/expensify-common-2.0.19.tgz", - "integrity": "sha512-GdWlYiHOAapy/jxjcvL9NKGOofhoEuKIwvJNGNVHbDXcA+0NxVCNYrHt1yrLnVcE4KtK6PGT6fQ2Lp8NTCoA+g==", + "version": "2.0.39", + "resolved": "https://registry.npmjs.org/expensify-common/-/expensify-common-2.0.39.tgz", + "integrity": "sha512-HyW7MiS8+ZWO2xye5TSsiKJfIsaGl0M2RlI+txJNF9GWeroA6kaXybTY1Ppq+cS+a7+MU/KMQh7GNnIMrvkf+w==", "dependencies": { "awesome-phonenumber": "^5.4.0", "classnames": "2.5.0", @@ -25987,7 +26285,7 @@ "prop-types": "15.8.1", "react": "16.12.0", "react-dom": "16.12.0", - "semver": "^7.6.0", + "semver": "^7.6.2", "simply-deferred": "git+https://github.com/Expensify/simply-deferred.git#77a08a95754660c7bd6e0b6979fdf84e8e831bf5", "ua-parser-js": "^1.0.37" } @@ -26351,6 +26649,12 @@ "node": ">=8" } }, + "node_modules/exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "dev": true + }, "node_modules/express": { "version": "4.18.1", "license": "MIT", @@ -26514,11 +26818,12 @@ }, "node_modules/extsprintf": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", + "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", "dev": true, "engines": [ "node >=0.6.0" ], - "license": "MIT", "optional": true }, "node_modules/fast-deep-equal": { @@ -27767,8 +28072,8 @@ }, "node_modules/has-unicode": { "version": "2.0.1", - "license": "ISC", - "optional": true + "devOptional": true, + "license": "ISC" }, "node_modules/has-value": { "version": "1.0.0", @@ -27994,8 +28299,9 @@ }, "node_modules/hosted-git-info": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -28255,6 +28561,15 @@ "node": ">=10.17.0" } }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dev": true, + "dependencies": { + "ms": "^2.0.0" + } + }, "node_modules/husky": { "version": "1.3.1", "dev": true, @@ -28530,8 +28845,9 @@ }, "node_modules/iconv-corefoundation": { "version": "1.1.7", + "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz", + "integrity": "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==", "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -28900,6 +29216,25 @@ "node": ">=0.10.0" } }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dev": true, + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/ip-address/node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true + }, "node_modules/ip-regex": { "version": "2.1.0", "license": "MIT", @@ -29047,8 +29382,9 @@ }, "node_modules/is-ci": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", "dev": true, - "license": "MIT", "dependencies": { "ci-info": "^3.2.0" }, @@ -29283,6 +29619,12 @@ "node": ">=0.10.0" } }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true + }, "node_modules/is-map": { "version": "2.0.2", "dev": true, @@ -29559,8 +29901,9 @@ }, "node_modules/isbinaryfile": { "version": "5.0.2", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.2.tgz", + "integrity": "sha512-GvcjojwonMjWbTkfMpnVHVqXW/wKMYDfEpY94/8zy8HFMOqb/VL6oeONq9v87q4ttVlaTLnGXnJD4B5B1OTGIg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 18.0.0" }, @@ -32329,6 +32672,12 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "dev": true + }, "node_modules/jsc-android": { "version": "250231.0.0", "license": "BSD-2-Clause" @@ -32677,13 +33026,15 @@ }, "node_modules/lazy-val": { "version": "1.0.5", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz", + "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==", + "dev": true }, "node_modules/lazystream": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "readable-stream": "^2.0.5" @@ -32902,20 +33253,23 @@ }, "node_modules/lodash.defaults": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/lodash.difference": { "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/lodash.flatten": { "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/lodash.isequal": { @@ -32924,8 +33278,9 @@ }, "node_modules/lodash.isplainobject": { "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/lodash.memoize": { @@ -32945,8 +33300,9 @@ }, "node_modules/lodash.union": { "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/log-symbols": { @@ -33314,6 +33670,175 @@ "url": "https://github.com/wojtekmaj/make-event-props?sponsor=1" } }, + "node_modules/make-fetch-happen": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/@npmcli/fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "dev": true, + "dependencies": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/@npmcli/move-file": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "dev": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/cacache": { + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/make-fetch-happen/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-fetch-happen/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-fetch-happen/node_modules/ssri": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "dev": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/unique-filename": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "dev": true, + "dependencies": { + "unique-slug": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/unique-slug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/makeerror": { "version": "1.0.12", "license": "BSD-3-Clause", @@ -34210,6 +34735,23 @@ "node": ">= 8" } }, + "node_modules/minipass-fetch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "dev": true, + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, "node_modules/minipass-flush": { "version": "1.0.5", "license": "ISC", @@ -34230,6 +34772,18 @@ "node": ">=8" } }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/minizlib": { "version": "2.1.2", "license": "MIT", @@ -34486,16 +35040,38 @@ "node": ">= 10.13" } }, + "node_modules/node-abi": { + "version": "3.65.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.65.0.tgz", + "integrity": "sha512-ThjYBfoDNr08AWx6hGaRbfPwxKV9kVzAzOzlLKbk2CuqXE2xnCh+cbAGnwM3t8Lq4v9rUB7VfondlkBckcJrVA==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/node-abort-controller": { "version": "3.1.1", "license": "MIT" }, "node_modules/node-addon-api": { "version": "1.7.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", + "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", "dev": true, - "license": "MIT", "optional": true }, + "node_modules/node-api-version": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.2.0.tgz", + "integrity": "sha512-fthTTsi8CxaBXMaBAD7ST2uylwvsnYxh2PfaScwpMhos6KlSFajXQPcM4ogNE1q2s3Lbz9GCGqeIHC+C6OZnKg==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + } + }, "node_modules/node-dir": { "version": "0.1.17", "license": "MIT", @@ -34553,6 +35129,95 @@ "node": ">= 6.13.0" } }, + "node_modules/node-gyp": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz", + "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^6.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^12.13 || ^14.13 || >=16" + } + }, + "node_modules/node-gyp/node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "deprecated": "This package is no longer supported.", + "dev": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/node-gyp/node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "deprecated": "This package is no longer supported.", + "dev": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/node-gyp/node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "deprecated": "This package is no longer supported.", + "dev": true, + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/node-gyp/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/node-int64": { "version": "0.4.0", "license": "MIT" @@ -34620,6 +35285,21 @@ "url": "https://github.com/sponsors/antelle" } }, + "node_modules/nopt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "dev": true, + "dependencies": { + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/normalize-package-data": { "version": "2.5.0", "license": "BSD-2-Clause", @@ -35846,6 +36526,16 @@ "path2d-polyfill": "^2.0.1" } }, + "node_modules/pe-library": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/pe-library/-/pe-library-0.4.0.tgz", + "integrity": "sha512-JAmVv2jGxmczplhHO7UoFGJ+pM/yMBpny3vNjwNFuaeQfzKlekQidZ8Ss8EJ0qee8wEQN4lY2IwtWx2oRfMsag==", + "dev": true, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, "node_modules/peek-stream": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/peek-stream/-/peek-stream-1.1.3.tgz", @@ -35857,6 +36547,32 @@ "through2": "^2.0.3" } }, + "node_modules/peggy": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/peggy/-/peggy-4.0.3.tgz", + "integrity": "sha512-v7/Pt6kGYsfXsCrfb52q7/yg5jaAwiVaUMAPLPvy4DJJU6Wwr72t6nDIqIDkGfzd1B4zeVuTnQT0RGeOhe/uSA==", + "dev": true, + "dependencies": { + "@peggyjs/from-mem": "1.3.0", + "commander": "^12.1.0", + "source-map-generator": "0.8.0" + }, + "bin": { + "peggy": "bin/peggy.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/peggy/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true, + "engines": { + "node": ">=18" + } + }, "node_modules/pend": { "version": "1.2.0", "dev": true, @@ -35989,14 +36705,24 @@ } }, "node_modules/plist": { - "version": "3.0.6", - "license": "MIT", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", "dependencies": { + "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", "xmlbuilder": "^15.1.1" }, "engines": { - "node": ">=6" + "node": ">=10.4.0" + } + }, + "node_modules/plist/node_modules/@xmldom/xmldom": { + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", + "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", + "engines": { + "node": ">=10.0.0" } }, "node_modules/plist/node_modules/xmlbuilder": { @@ -36758,6 +37484,98 @@ "react-dom": ">=16.8.0" } }, + "node_modules/react-compiler-healthcheck": { + "version": "0.0.0-experimental-b130d5f-20240625", + "resolved": "https://registry.npmjs.org/react-compiler-healthcheck/-/react-compiler-healthcheck-0.0.0-experimental-b130d5f-20240625.tgz", + "integrity": "sha512-vf3Ipg+f19yOYQeRP938e5jWNEpwR6EX5pwBZdJUF9rt11vJ3ckgUVcF5qGWUU/7DB0N9MH1koBqwqMYabrBiQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "chalk": "4", + "fast-glob": "^3.3.2", + "ora": "5.4.1", + "yargs": "^17.7.2", + "zod": "^3.22.4", + "zod-validation-error": "^3.0.3" + }, + "bin": { + "react-compiler-healthcheck": "dist/index.js" + }, + "engines": { + "node": "^14.17.0 || ^16.0.0 || >= 18.0.0" + } + }, + "node_modules/react-compiler-healthcheck/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/react-compiler-healthcheck/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/react-compiler-healthcheck/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/react-compiler-healthcheck/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/react-compiler-healthcheck/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/react-compiler-healthcheck/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/react-compiler-runtime": { "resolved": "lib/react-compiler-runtime", "link": true @@ -36894,9 +37712,9 @@ } }, "node_modules/react-fast-pdf": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/react-fast-pdf/-/react-fast-pdf-1.0.13.tgz", - "integrity": "sha512-rF7NQZ26rJAI8ysRJaG71dl2c7AIq48ibbn7xCyF3lEZ/yOjA8BeR0utRwDjaHGtswQscgETboilhaaH5UtIYg==", + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/react-fast-pdf/-/react-fast-pdf-1.0.14.tgz", + "integrity": "sha512-iWomykxvnZtokIKpRK5xpaRfXz9ufrY7AVANtIBYsAZtX5/7VDlpIQwieljfMZwFc96TyceCnneufsgXpykTQw==", "dependencies": { "react-pdf": "^7.7.0", "react-window": "^1.8.10" @@ -37277,9 +38095,9 @@ } }, "node_modules/react-native-onyx": { - "version": "2.0.55", - "resolved": "https://registry.npmjs.org/react-native-onyx/-/react-native-onyx-2.0.55.tgz", - "integrity": "sha512-W0+hFY98uC3uije2JBFS1ON19iAe8u6Ls50T2Qrx9NMtzUFqEchMuR75L4F/kMvi/uwtQII+Cl02Pd52h/tdPg==", + "version": "2.0.56", + "resolved": "https://registry.npmjs.org/react-native-onyx/-/react-native-onyx-2.0.56.tgz", + "integrity": "sha512-3rn1+J4tli9zPS9w5x6tOAUz01wVHkiTFgtHoIwjD7HdLUO/9nk6H8JX6Oqb9Vzq2XQOSavUFRepIHnGvzNtgg==", "dependencies": { "ascii-table": "0.0.9", "fast-equals": "^4.0.3", @@ -37313,9 +38131,9 @@ } }, "node_modules/react-native-pager-view": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/react-native-pager-view/-/react-native-pager-view-6.2.3.tgz", - "integrity": "sha512-dqVpXWFtPNfD3D2QQQr8BP+ullS5MhjRJuF8Z/qml4QTILcrWaW8F5iAxKkQR3Jl0ikcEryG/+SQlNcwlo0Ggg==", + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/react-native-pager-view/-/react-native-pager-view-6.3.3.tgz", + "integrity": "sha512-HViKBlfN/kBJUSu5mRL/V9Bkf1j7uDZozGAjbzh4o9XYo11qVcIK7IwvfzqrkNerVSDy/cAmZcXbcyWnII8xMA==", "peerDependencies": { "react": "*", "react-native": "*" @@ -37342,8 +38160,9 @@ } }, "node_modules/react-native-permissions": { - "version": "3.9.3", - "license": "MIT", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/react-native-permissions/-/react-native-permissions-3.10.1.tgz", + "integrity": "sha512-Gc5BxxpjZn4QNUDiVeHOO0vXh3AH7ToolmwTJozqC6DsxV7NAf3ttap+8BSmzDR8WxuAM3Cror+YNiBhHJx7/w==", "peerDependencies": { "react": ">=16.13.1", "react-native": ">=0.63.3", @@ -37368,9 +38187,9 @@ } }, "node_modules/react-native-plaid-link-sdk": { - "version": "11.5.0", - "resolved": "https://registry.npmjs.org/react-native-plaid-link-sdk/-/react-native-plaid-link-sdk-11.5.0.tgz", - "integrity": "sha512-B3fwujxBS9nZwadXFcseU3nrYG7Ptob6p9eG/gXde65cqwErMaq2k1rVv3R17s/rpKnmU5Cx5pKOMmkxPUn08w==", + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/react-native-plaid-link-sdk/-/react-native-plaid-link-sdk-11.11.0.tgz", + "integrity": "sha512-Kmimhr6iOwCtIzsW7gygz48TzaZsdjnpgstJ2PM1q+THulOnx+BnkFu8UpLIGGkVe19E4wkxOAYL8kJ8vefNSQ==", "peerDependencies": { "react": "*", "react-native": "*" @@ -37429,14 +38248,15 @@ "license": "MIT" }, "node_modules/react-native-release-profiler": { - "version": "0.1.6", - "license": "MIT", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/react-native-release-profiler/-/react-native-release-profiler-0.2.1.tgz", + "integrity": "sha512-gDOwEXypd4Gu++nlKyaVLHPfwrVkkdBrsjMrQORYTTDqcrD/OfuNZ8YK7p+u5LUNjnPD4WmBF88C5dEW7iM1lg==", "workspaces": [ "example" ], "dependencies": { - "@react-native-community/cli": "^12.2.1", - "commander": "^11.1.0" + "commander": "^11.1.0", + "hermes-profile-transformer": "^0.0.9" }, "bin": { "react-native-release-profiler": "lib/commonjs/cli.js" @@ -37456,6 +38276,25 @@ "node": ">=16" } }, + "node_modules/react-native-release-profiler/node_modules/hermes-profile-transformer": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/hermes-profile-transformer/-/hermes-profile-transformer-0.0.9.tgz", + "integrity": "sha512-JYPUE9zA+W/hpTIGBV+t2ODvntataLLMfntoEcpEpKFDwdR6+Quk9SwLnWX9y2A3ZII6N4T8w3TUBC2ejsEGBw==", + "dependencies": { + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/react-native-release-profiler/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "engines": { + "node": ">= 8" + } + }, "node_modules/react-native-render-html": { "version": "6.3.1", "license": "BSD-2-Clause", @@ -38416,6 +39255,18 @@ "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/read-binary-file-arch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz", + "integrity": "sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "bin": { + "read-binary-file-arch": "cli.js" + } + }, "node_modules/read-cmd-shim": { "version": "4.0.0", "license": "ISC", @@ -38424,16 +39275,17 @@ } }, "node_modules/read-config-file": { - "version": "6.3.2", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-6.4.0.tgz", + "integrity": "sha512-uB5QOBeF84PT61GlV11OTV4jUGHAO3iDEOP6v9ygxhG6Bs9PLg7WsjNT6mtIX2G+x8lJTr4ZWNeG6LDTKkNf2Q==", "dev": true, - "license": "MIT", "dependencies": { - "config-file-ts": "^0.2.4", - "dotenv": "^9.0.2", - "dotenv-expand": "^5.1.0", + "config-file-ts": "0.2.8-rc1", + "dotenv": "^16.4.5", + "dotenv-expand": "^11.0.6", "js-yaml": "^4.1.0", - "json5": "^2.2.0", - "lazy-val": "^1.0.4" + "json5": "^2.2.3", + "lazy-val": "^1.0.5" }, "engines": { "node": ">=12.0.0" @@ -38441,21 +39293,15 @@ }, "node_modules/read-config-file/node_modules/argparse": { "version": "2.0.1", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/read-config-file/node_modules/dotenv": { - "version": "9.0.2", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=10" - } + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true }, "node_modules/read-config-file/node_modules/js-yaml": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -38626,8 +39472,9 @@ }, "node_modules/readdir-glob": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", "dev": true, - "license": "Apache-2.0", "peer": true, "dependencies": { "minimatch": "^5.1.0" @@ -38635,8 +39482,9 @@ }, "node_modules/readdir-glob/node_modules/brace-expansion": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "balanced-match": "^1.0.0" @@ -38644,8 +39492,9 @@ }, "node_modules/readdir-glob/node_modules/minimatch": { "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, - "license": "ISC", "peer": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -39011,6 +39860,19 @@ "version": "1.0.0", "license": "MIT" }, + "node_modules/resedit": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/resedit/-/resedit-1.7.0.tgz", + "integrity": "sha512-dbsZ0gk5opWPFlKMqvxCrLCuMZUVmsW3yTPT0tT4mYwo5fjQM8c4HMN9ZJt6dRDqDV/78m9SU4rv24PN4NiYaA==", + "dev": true, + "dependencies": { + "pe-library": "^0.4.0" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, "node_modules/reselect": { "version": "4.1.7", "dev": true, @@ -39283,8 +40145,9 @@ }, "node_modules/sanitize-filename": { "version": "1.6.3", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", + "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", "dev": true, - "license": "WTFPL OR ISC", "dependencies": { "truncate-utf8-bytes": "^1.0.0" } @@ -39380,11 +40243,9 @@ } }, "node_modules/semver": { - "version": "7.6.0", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "bin": { "semver": "bin/semver.js" }, @@ -39826,8 +40687,9 @@ }, "node_modules/slice-ansi": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "ansi-styles": "^4.0.0", @@ -39840,8 +40702,9 @@ }, "node_modules/slice-ansi/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "color-convert": "^2.0.1" @@ -39855,8 +40718,9 @@ }, "node_modules/slice-ansi/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "color-name": "~1.1.4" @@ -39867,8 +40731,9 @@ }, "node_modules/slice-ansi/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, - "license": "MIT", "optional": true }, "node_modules/slugify": { @@ -39880,9 +40745,9 @@ }, "node_modules/smart-buffer": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "dev": true, - "license": "MIT", - "optional": true, "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" @@ -40088,6 +40953,34 @@ "websocket-driver": "^0.7.4" } }, + "node_modules/socks": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "dev": true, + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "dev": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/sort-asc": { "version": "0.2.0", "license": "MIT", @@ -40135,6 +41028,15 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-generator": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/source-map-generator/-/source-map-generator-0.8.0.tgz", + "integrity": "sha512-psgxdGMwl5MZM9S3FWee4EgsEaIjahYV5AzGnwUvPhWeITz/j6rKpysQHlQ4USdxvINlb8lKfWGIXwfkrgtqkA==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, "node_modules/source-map-js": { "version": "1.0.2", "license": "BSD-3-Clause", @@ -40365,8 +41267,9 @@ }, "node_modules/stat-mode": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", + "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 6" } @@ -41107,8 +42010,9 @@ }, "node_modules/temp-file": { "version": "3.4.0", + "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", + "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==", "dev": true, - "license": "MIT", "dependencies": { "async-exit-hook": "^2.0.1", "fs-extra": "^10.0.0" @@ -41116,8 +42020,9 @@ }, "node_modules/temp-file/node_modules/fs-extra": { "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, - "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -41459,16 +42364,18 @@ }, "node_modules/tmp": { "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", "dev": true, - "license": "MIT", "engines": { "node": ">=14.14" } }, "node_modules/tmp-promise": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", + "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", "dev": true, - "license": "MIT", "dependencies": { "tmp": "^0.2.0" } @@ -41609,8 +42516,9 @@ }, "node_modules/truncate-utf8-bytes": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", "dev": true, - "license": "WTFPL", "dependencies": { "utf8-byte-length": "^1.0.1" } @@ -42415,9 +43323,10 @@ "license": "MIT" }, "node_modules/utf8-byte-length": { - "version": "1.0.4", - "dev": true, - "license": "WTFPL" + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", + "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", + "dev": true }, "node_modules/util": { "version": "0.11.1", @@ -42503,8 +43412,9 @@ }, "node_modules/verror": { "version": "1.10.1", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", + "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "assert-plus": "^1.0.0", @@ -43632,8 +44542,8 @@ }, "node_modules/wide-align": { "version": "1.1.5", + "devOptional": true, "license": "ISC", - "optional": true, "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" } @@ -43920,8 +44830,9 @@ }, "node_modules/zip-stream": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.1.tgz", + "integrity": "sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "archiver-utils": "^3.0.4", @@ -43934,8 +44845,9 @@ }, "node_modules/zip-stream/node_modules/archiver-utils": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-3.0.4.tgz", + "integrity": "sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "glob": "^7.2.3", @@ -43955,8 +44867,10 @@ }, "node_modules/zip-stream/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, - "license": "ISC", "peer": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -43975,8 +44889,9 @@ }, "node_modules/zip-stream/node_modules/readable-stream": { "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "inherits": "^2.0.3", @@ -44008,4 +44923,4 @@ } } } -} +} \ No newline at end of file diff --git a/package.json b/package.json index bc7306ee3782..2de647104996 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "new.expensify", - "version": "9.0.4-7", + "version": "9.0.8-3", "author": "Expensify, Inc.", "homepage": "https://new.expensify.com", "description": "New Expensify is the next generation of Expensify: a reimagination of payments based atop a foundation of chat.", @@ -60,13 +60,15 @@ "workflow-test": "./workflow_tests/scripts/runWorkflowTests.sh", "workflow-test:generate": "ts-node workflow_tests/utils/preGenerateTest.ts", "setup-https": "mkcert -install && mkcert -cert-file config/webpack/certificate.pem -key-file config/webpack/key.pem dev.new.expensify.com localhost 127.0.0.1", - "e2e-test-runner-build": "ncc build tests/e2e/testRunner.ts -o tests/e2e/dist/" + "e2e-test-runner-build": "ncc build tests/e2e/testRunner.ts -o tests/e2e/dist/", + "react-compiler-healthcheck": "react-compiler-healthcheck --verbose", + "generate-search-parser": "peggy --format es -o src/libs/SearchParser/searchParser.js src/libs/SearchParser/searchParser.peggy " }, "dependencies": { "@babel/plugin-proposal-private-methods": "^7.18.6", "@babel/plugin-proposal-private-property-in-object": "^7.21.11", "@dotlottie/react-player": "^1.6.3", - "@expensify/react-native-live-markdown": "0.1.88", + "@expensify/react-native-live-markdown": "0.1.103", "@expo/metro-runtime": "~3.1.1", "@formatjs/intl-datetimeformat": "^6.10.0", "@formatjs/intl-listformat": "^7.2.2", @@ -79,12 +81,12 @@ "@fullstory/react-native": "^1.4.2", "@gorhom/portal": "^1.0.14", "@invertase/react-native-apple-authentication": "^2.2.2", - "@kie/act-js": "^2.6.0", + "@kie/act-js": "^2.6.2", "@kie/mock-github": "2.0.1", "@onfido/react-native-sdk": "10.6.0", "@react-native-camera-roll/camera-roll": "7.4.0", "@react-native-clipboard/clipboard": "^1.13.2", - "@react-native-community/geolocation": "3.2.1", + "@react-native-community/geolocation": "3.3.0", "@react-native-community/netinfo": "11.2.1", "@react-native-firebase/analytics": "^12.3.0", "@react-native-firebase/app": "^12.3.0", @@ -108,7 +110,7 @@ "date-fns-tz": "^2.0.0", "dom-serializer": "^0.2.2", "domhandler": "^4.3.0", - "expensify-common": "2.0.19", + "expensify-common": "2.0.39", "expo": "^50.0.3", "expo-av": "~13.10.4", "expo-image": "1.11.0", @@ -132,7 +134,7 @@ "react-content-loader": "^7.0.0", "react-dom": "18.1.0", "react-error-boundary": "^4.0.11", - "react-fast-pdf": "1.0.13", + "react-fast-pdf": "1.0.14", "react-map-gl": "^7.1.3", "react-native": "0.73.4", "react-native-android-location-enabler": "^2.0.1", @@ -155,17 +157,17 @@ "react-native-linear-gradient": "^2.8.1", "react-native-localize": "^2.2.6", "react-native-modal": "^13.0.0", - "react-native-onyx": "2.0.55", - "react-native-pager-view": "6.2.3", + "react-native-onyx": "2.0.56", + "react-native-pager-view": "6.3.3", "react-native-pdf": "6.7.3", "react-native-performance": "^5.1.0", - "react-native-permissions": "^3.9.3", + "react-native-permissions": "^3.10.0", "react-native-picker-select": "git+https://github.com/Expensify/react-native-picker-select.git#da50d2c5c54e268499047f9cc98b8df4196c1ddf", - "react-native-plaid-link-sdk": "11.5.0", + "react-native-plaid-link-sdk": "11.11.0", "react-native-qrcode-svg": "^6.2.0", "react-native-quick-sqlite": "git+https://github.com/margelo/react-native-quick-sqlite#abc91857d4b3efb2020ec43abd2a508563b64316", "react-native-reanimated": "^3.8.0", - "react-native-release-profiler": "^0.1.6", + "react-native-release-profiler": "^0.2.1", "react-native-render-html": "6.3.1", "react-native-safe-area-context": "4.8.2", "react-native-screens": "3.32.0", @@ -253,7 +255,7 @@ "babel-jest": "29.4.1", "babel-loader": "^9.1.3", "babel-plugin-module-resolver": "^5.0.0", - "babel-plugin-react-compiler": "^0.0.0-experimental-c23de8d-20240515", + "babel-plugin-react-compiler": "0.0.0-experimental-696af53-20240625", "babel-plugin-react-native-web": "^0.18.7", "babel-plugin-transform-class-properties": "^6.24.1", "babel-plugin-transform-remove-console": "^6.9.4", @@ -265,14 +267,14 @@ "diff-so-fancy": "^1.3.0", "dotenv": "^16.0.3", "electron": "^29.4.1", - "electron-builder": "24.13.2", + "electron-builder": "25.0.0", "eslint": "^8.57.0", "eslint-config-airbnb-typescript": "^18.0.0", "eslint-config-expensify": "^2.0.52", "eslint-config-prettier": "^9.1.0", "eslint-plugin-jest": "^28.6.0", "eslint-plugin-jsdoc": "^46.2.6", - "eslint-plugin-react-compiler": "^0.0.0-experimental-53bb89e-20240515", + "eslint-plugin-react-compiler": "0.0.0-experimental-0998c1e-20240625", "eslint-plugin-react-native-a11y": "^3.3.0", "eslint-plugin-storybook": "^0.8.0", "eslint-plugin-testing-library": "^6.2.2", @@ -286,9 +288,11 @@ "memfs": "^4.6.0", "onchange": "^7.1.0", "patch-package": "^8.0.0", + "peggy": "^4.0.3", "portfinder": "^1.0.28", "prettier": "^2.8.8", "pusher-js-mock": "^0.3.3", + "react-compiler-healthcheck": "^0.0.0-experimental-b130d5f-20240625", "react-is": "^18.3.1", "react-native-clean-project": "^4.0.0-alpha4.0", "react-test-renderer": "18.2.0", @@ -342,4 +346,4 @@ "node": "20.14.0", "npm": "10.7.0" } -} +} \ No newline at end of file From 727e764a9eb9983b0e2d5ea8c31cb6790ca6dc8f Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Wed, 17 Jul 2024 13:56:33 -0500 Subject: [PATCH 32/71] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2de647104996..e4b1d56dcd92 100644 --- a/package.json +++ b/package.json @@ -267,7 +267,7 @@ "diff-so-fancy": "^1.3.0", "dotenv": "^16.0.3", "electron": "^29.4.1", - "electron-builder": "25.0.0", + "electron-builder": "24.13.12", "eslint": "^8.57.0", "eslint-config-airbnb-typescript": "^18.0.0", "eslint-config-expensify": "^2.0.52", From 9adefcbf9c8926250b7ded2e81576820c97c062b Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Wed, 17 Jul 2024 14:29:34 -0500 Subject: [PATCH 33/71] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e4b1d56dcd92..d3faf588f81a 100644 --- a/package.json +++ b/package.json @@ -267,7 +267,7 @@ "diff-so-fancy": "^1.3.0", "dotenv": "^16.0.3", "electron": "^29.4.1", - "electron-builder": "24.13.12", + "electron-builder": "24.13.2", "eslint": "^8.57.0", "eslint-config-airbnb-typescript": "^18.0.0", "eslint-config-expensify": "^2.0.52", From daf01855d25256782c93efa4b417b18f91a5a17b Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Wed, 17 Jul 2024 14:30:34 -0500 Subject: [PATCH 34/71] Update MenuItem.tsx --- src/components/MenuItem.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index b18285a8aceb..8a704a9bdb8f 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -307,6 +307,7 @@ type MenuItemBaseProps = { /** Render custom content inside the tooltip. */ renderTooltipContent?: () => ReactNode; + }; type MenuItemProps = (IconProps | AvatarProps | NoIcon) & MenuItemBaseProps; From b4c677ab9577c3361805295e0596a454912b5c0c Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Wed, 17 Jul 2024 14:33:13 -0500 Subject: [PATCH 35/71] Update MenuItem.tsx --- src/components/MenuItem.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index 8a704a9bdb8f..5ccd5736004c 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -307,9 +307,9 @@ type MenuItemBaseProps = { /** Render custom content inside the tooltip. */ renderTooltipContent?: () => ReactNode; - }; + type MenuItemProps = (IconProps | AvatarProps | NoIcon) & MenuItemBaseProps; function MenuItem( { From 94fdf0aae5163fadc11a8485274208790f365d28 Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Wed, 17 Jul 2024 14:57:09 -0500 Subject: [PATCH 36/71] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2de647104996..66d3d4817bb6 100644 --- a/package.json +++ b/package.json @@ -110,7 +110,7 @@ "date-fns-tz": "^2.0.0", "dom-serializer": "^0.2.2", "domhandler": "^4.3.0", - "expensify-common": "2.0.39", + "expensify-common": "2.0.49", "expo": "^50.0.3", "expo-av": "~13.10.4", "expo-image": "1.11.0", From 91cb9d1e89334fc43ca0cbacb9335663206c5fc7 Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Wed, 17 Jul 2024 18:48:18 -0500 Subject: [PATCH 37/71] update expenify common --- package-lock.json | 18 +++++++++--------- package.json | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6af6a9fecde1..906bcc80e68f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -55,7 +55,7 @@ "date-fns-tz": "^2.0.0", "dom-serializer": "^0.2.2", "domhandler": "^4.3.0", - "expensify-common": "2.0.39", + "expensify-common": "^2.0.49", "expo": "^50.0.3", "expo-av": "~13.10.4", "expo-image": "1.11.0", @@ -26271,9 +26271,9 @@ } }, "node_modules/expensify-common": { - "version": "2.0.39", - "resolved": "https://registry.npmjs.org/expensify-common/-/expensify-common-2.0.39.tgz", - "integrity": "sha512-HyW7MiS8+ZWO2xye5TSsiKJfIsaGl0M2RlI+txJNF9GWeroA6kaXybTY1Ppq+cS+a7+MU/KMQh7GNnIMrvkf+w==", + "version": "2.0.49", + "resolved": "https://registry.npmjs.org/expensify-common/-/expensify-common-2.0.49.tgz", + "integrity": "sha512-67QbRuR2XEl2RoNLSbyqGWATIbOXPV42azAfs2sqNT6iyWKcOgHUqRkWPhxA0GmSW35lwq66bvgPVsQUfMGCow==", "dependencies": { "awesome-phonenumber": "^5.4.0", "classnames": "2.5.0", @@ -26287,7 +26287,7 @@ "react-dom": "16.12.0", "semver": "^7.6.2", "simply-deferred": "git+https://github.com/Expensify/simply-deferred.git#77a08a95754660c7bd6e0b6979fdf84e8e831bf5", - "ua-parser-js": "^1.0.37" + "ua-parser-js": "^1.0.38" } }, "node_modules/expensify-common/node_modules/react": { @@ -26324,9 +26324,9 @@ } }, "node_modules/expensify-common/node_modules/ua-parser-js": { - "version": "1.0.37", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.37.tgz", - "integrity": "sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==", + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.38.tgz", + "integrity": "sha512-Aq5ppTOfvrCMgAPneW1HfWj66Xi7XL+/mIy996R1/CLS/rcyJQm6QZdsKrUeivDFQ+Oc9Wyuwor8Ze8peEoUoQ==", "funding": [ { "type": "opencollective", @@ -44923,4 +44923,4 @@ } } } -} \ No newline at end of file +} diff --git a/package.json b/package.json index 66d3d4817bb6..e8e85ffabe97 100644 --- a/package.json +++ b/package.json @@ -110,7 +110,7 @@ "date-fns-tz": "^2.0.0", "dom-serializer": "^0.2.2", "domhandler": "^4.3.0", - "expensify-common": "2.0.49", + "expensify-common": "^2.0.49", "expo": "^50.0.3", "expo-av": "~13.10.4", "expo-image": "1.11.0", @@ -346,4 +346,4 @@ "node": "20.14.0", "npm": "10.7.0" } -} \ No newline at end of file +} From da86d9576961841d396588f5f57d0642539cb6f4 Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Wed, 17 Jul 2024 22:53:35 -0500 Subject: [PATCH 38/71] update options --- src/components/MenuItem.tsx | 2 +- src/libs/Parser.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index 5ccd5736004c..647504c46682 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -660,7 +660,7 @@ function MenuItem( {!!title && (shouldRenderAsHTML || (shouldParseTitle && !!html.length)) && ( - + )} {!shouldRenderAsHTML && !shouldParseTitle && !!title && ( diff --git a/src/libs/Parser.ts b/src/libs/Parser.ts index bd98b18ff8bc..bd17113c8f56 100644 --- a/src/libs/Parser.ts +++ b/src/libs/Parser.ts @@ -44,7 +44,7 @@ class ExpensiMarkWithContext extends ExpensiMark { }); } - truncateHTML(htmlString: string, limit: number, extras?: {ellipsis: boolean}): string { + truncateHTML(htmlString: string, limit: number, extras?: {ellipsis: string | undefined}): string { return super.truncateHTML(htmlString, limit, extras); } } From 619d82fe06894d1436f90a1b546b2c196cda5850 Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Wed, 17 Jul 2024 23:16:46 -0500 Subject: [PATCH 39/71] Update MenuItem.tsx --- src/components/MenuItem.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index 647504c46682..fe0db4f1016b 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -309,7 +309,6 @@ type MenuItemBaseProps = { renderTooltipContent?: () => ReactNode; }; - type MenuItemProps = (IconProps | AvatarProps | NoIcon) & MenuItemBaseProps; function MenuItem( { From c35ce60f129ee65e77c5ff26fd64fc476ea8897f Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Fri, 19 Jul 2024 14:04:53 -0500 Subject: [PATCH 40/71] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e8e85ffabe97..20a71a53a6dd 100644 --- a/package.json +++ b/package.json @@ -110,7 +110,7 @@ "date-fns-tz": "^2.0.0", "dom-serializer": "^0.2.2", "domhandler": "^4.3.0", - "expensify-common": "^2.0.49", + "expensify-common": "2.0.49", "expo": "^50.0.3", "expo-av": "~13.10.4", "expo-image": "1.11.0", From 76936780431d10dbd5d35169795ee8e0a59b3a68 Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Sun, 28 Jul 2024 09:16:07 -0500 Subject: [PATCH 41/71] Update MenuItem.tsx --- src/components/MenuItem.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index 17b06c8d6d44..5e5e9d2f0e75 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -362,7 +362,7 @@ function MenuItem( subtitle, shouldShowBasicTitle, label, - limit = 100, + limit, isLabelHoverable = true, rightLabel, shouldShowSelectedState = false, From d959a133924095b072bd82acbd0980f4bce727b9 Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Sun, 28 Jul 2024 09:23:01 -0500 Subject: [PATCH 42/71] Update MenuItem.tsx --- src/components/MenuItem.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index 5e5e9d2f0e75..51516f40c6b2 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -178,7 +178,7 @@ type MenuItemBaseProps = { label?: string; /** Limit to truncate description for menu item */ - limit?: number; + limit: number; isLabelHoverable?: boolean; @@ -362,7 +362,7 @@ function MenuItem( subtitle, shouldShowBasicTitle, label, - limit, + limit = 100, isLabelHoverable = true, rightLabel, shouldShowSelectedState = false, From c1ce0fe35a542506f24a1f5dbd84007988acbdc3 Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Sun, 28 Jul 2024 10:59:24 -0500 Subject: [PATCH 43/71] Update MenuItem.tsx --- src/components/MenuItem.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index 51516f40c6b2..ef1f04638db1 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -178,7 +178,7 @@ type MenuItemBaseProps = { label?: string; /** Limit to truncate description for menu item */ - limit: number; + limit?: number; isLabelHoverable?: boolean; @@ -362,7 +362,7 @@ function MenuItem( subtitle, shouldShowBasicTitle, label, - limit = 100, + limit, isLabelHoverable = true, rightLabel, shouldShowSelectedState = false, @@ -669,7 +669,7 @@ function MenuItem( {!!title && (shouldRenderAsHTML || (shouldParseTitle && !!html.length)) && ( - + )} {!shouldRenderAsHTML && !shouldParseTitle && !!title && ( From 2f9b0a2b8742d1745d353ddf0ef6a51915df35c5 Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Sun, 28 Jul 2024 11:00:18 -0500 Subject: [PATCH 44/71] Update MenuItem.tsx --- src/components/MenuItem.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index ef1f04638db1..41b6bce9edde 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -669,7 +669,7 @@ function MenuItem( {!!title && (shouldRenderAsHTML || (shouldParseTitle && !!html.length)) && ( - + )} {!shouldRenderAsHTML && !shouldParseTitle && !!title && ( From a76309c6712bc33edd6e1c936147426d34139036 Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Sun, 28 Jul 2024 12:00:59 -0500 Subject: [PATCH 45/71] Remove limiting all MenuItems and only limit MenuItemWithDescription --- src/components/MenuItem.tsx | 2 +- src/components/MenuItemWithTopDescription.tsx | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index 41b6bce9edde..2b85cf8cbb47 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -669,7 +669,7 @@ function MenuItem( {!!title && (shouldRenderAsHTML || (shouldParseTitle && !!html.length)) && ( - + )} {!shouldRenderAsHTML && !shouldParseTitle && !!title && ( diff --git a/src/components/MenuItemWithTopDescription.tsx b/src/components/MenuItemWithTopDescription.tsx index 0a48740de62e..1c924ff2258a 100644 --- a/src/components/MenuItemWithTopDescription.tsx +++ b/src/components/MenuItemWithTopDescription.tsx @@ -9,6 +9,7 @@ function MenuItemWithTopDescription(props: MenuItemProps, ref: ForwardedRef Date: Tue, 30 Jul 2024 09:47:49 -0500 Subject: [PATCH 46/71] added shouldTruncateDescription --- src/components/MenuItem.tsx | 12 ++++++++++-- src/components/MenuItemWithTopDescription.tsx | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index 2b85cf8cbb47..269b4c06122e 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -203,6 +203,9 @@ type MenuItemBaseProps = { /** Should we make this selectable with a checkbox */ shouldShowSelectedState?: boolean; + /** Should we truncate the description */ + shouldTruncateDescription?: boolean; + /** Whether this item is selected */ isSelected?: boolean; @@ -362,6 +365,7 @@ function MenuItem( subtitle, shouldShowBasicTitle, label, + shouldTruncateDescription, limit, isLabelHoverable = true, rightLabel, @@ -459,8 +463,12 @@ function MenuItem( titleToWrap = html; } + if (shouldTruncateDescription) { + titleToWrap = Parser.truncateHTML(titleToWrap, limit ?? 100, {ellipsis: '...'}); + } + return titleToWrap ? `${titleToWrap}` : ''; - }, [title, shouldRenderAsHTML, shouldParseTitle, html]); + }, [title, shouldRenderAsHTML, shouldParseTitle, limit, shouldTruncateDescription, html]); const processedHelperText = useMemo(() => { let textToWrap = ''; @@ -669,7 +677,7 @@ function MenuItem( {!!title && (shouldRenderAsHTML || (shouldParseTitle && !!html.length)) && ( - + )} {!shouldRenderAsHTML && !shouldParseTitle && !!title && ( diff --git a/src/components/MenuItemWithTopDescription.tsx b/src/components/MenuItemWithTopDescription.tsx index 1c924ff2258a..8a4c0d105283 100644 --- a/src/components/MenuItemWithTopDescription.tsx +++ b/src/components/MenuItemWithTopDescription.tsx @@ -9,10 +9,10 @@ function MenuItemWithTopDescription(props: MenuItemProps, ref: ForwardedRef ); } From 85570da76b01680ff08945ac0342cfd6f6b5bcfc Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Tue, 30 Jul 2024 12:34:25 -0500 Subject: [PATCH 47/71] Update src/components/MenuItem.tsx Co-authored-by: Shubham Agrawal <58412969+shubham1206agra@users.noreply.github.com> --- src/components/MenuItem.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index 269b4c06122e..cea9d97c41db 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -365,8 +365,8 @@ function MenuItem( subtitle, shouldShowBasicTitle, label, - shouldTruncateDescription, - limit, + shouldTruncateDescription = false, + limit = 100, isLabelHoverable = true, rightLabel, shouldShowSelectedState = false, From 93def06607b9a1681a852ec9822c8712f5d48ef6 Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Tue, 30 Jul 2024 12:35:20 -0500 Subject: [PATCH 48/71] Update src/components/MenuItem.tsx Co-authored-by: Shubham Agrawal <58412969+shubham1206agra@users.noreply.github.com> --- src/components/MenuItem.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index cea9d97c41db..de2897399a92 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -464,7 +464,7 @@ function MenuItem( } if (shouldTruncateDescription) { - titleToWrap = Parser.truncateHTML(titleToWrap, limit ?? 100, {ellipsis: '...'}); + titleToWrap = Parser.truncateHTML(titleToWrap, limit, {ellipsis: '...'}); } return titleToWrap ? `${titleToWrap}` : ''; From 2d1d8ad85d203c959c3b151d7556ecd17220351a Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Tue, 30 Jul 2024 12:35:51 -0500 Subject: [PATCH 49/71] Update src/components/MenuItemWithTopDescription.tsx Co-authored-by: Shubham Agrawal <58412969+shubham1206agra@users.noreply.github.com> --- src/components/MenuItemWithTopDescription.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/MenuItemWithTopDescription.tsx b/src/components/MenuItemWithTopDescription.tsx index 8a4c0d105283..0a48740de62e 100644 --- a/src/components/MenuItemWithTopDescription.tsx +++ b/src/components/MenuItemWithTopDescription.tsx @@ -12,7 +12,6 @@ function MenuItemWithTopDescription(props: MenuItemProps, ref: ForwardedRef ); } From 32ab203d1df64fd2bdf788ea1309aa6b01f7befa Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Tue, 30 Jul 2024 12:36:20 -0500 Subject: [PATCH 50/71] Update src/components/MenuItem.tsx Co-authored-by: Shubham Agrawal <58412969+shubham1206agra@users.noreply.github.com> --- src/components/MenuItem.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index de2897399a92..ba69194f5e48 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -468,7 +468,7 @@ function MenuItem( } return titleToWrap ? `${titleToWrap}` : ''; - }, [title, shouldRenderAsHTML, shouldParseTitle, limit, shouldTruncateDescription, html]); + }, [title, shouldRenderAsHTML, shouldParseTitle, limit, shouldTruncateTitle, html]); const processedHelperText = useMemo(() => { let textToWrap = ''; From a21c00c0be84fc3a3ab2aa0491befb79a26ad620 Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Tue, 30 Jul 2024 12:38:18 -0500 Subject: [PATCH 51/71] update limit to 200 --- src/components/MenuItem.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index ba69194f5e48..55590f038006 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -366,7 +366,7 @@ function MenuItem( shouldShowBasicTitle, label, shouldTruncateDescription = false, - limit = 100, + limit = 200, isLabelHoverable = true, rightLabel, shouldShowSelectedState = false, From 82d470a73f8cc785ce2690c018f509c1f3f975bb Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Tue, 30 Jul 2024 15:15:33 -0500 Subject: [PATCH 52/71] Update src/components/MenuItem.tsx Co-authored-by: Shubham Agrawal <58412969+shubham1206agra@users.noreply.github.com> --- src/components/MenuItem.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index 55590f038006..7ccc320ff4f3 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -203,8 +203,8 @@ type MenuItemBaseProps = { /** Should we make this selectable with a checkbox */ shouldShowSelectedState?: boolean; - /** Should we truncate the description */ - shouldTruncateDescription?: boolean; + /** Should we truncate the title */ + shouldTruncateTitle?: boolean; /** Whether this item is selected */ isSelected?: boolean; From 2a9ad8d7e2b3110444586bf579e2899ab2126aeb Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Tue, 30 Jul 2024 15:15:41 -0500 Subject: [PATCH 53/71] Update src/components/MenuItem.tsx Co-authored-by: Shubham Agrawal <58412969+shubham1206agra@users.noreply.github.com> --- src/components/MenuItem.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index 7ccc320ff4f3..4c726285d285 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -463,7 +463,7 @@ function MenuItem( titleToWrap = html; } - if (shouldTruncateDescription) { + if (shouldTruncateTitle) { titleToWrap = Parser.truncateHTML(titleToWrap, limit, {ellipsis: '...'}); } From dd3222f97cd40f20d45b4173b0278be44581c6d9 Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Tue, 30 Jul 2024 17:50:38 -0500 Subject: [PATCH 54/71] Update MenuItem.tsx --- src/components/MenuItem.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index 4c726285d285..dd32db89536b 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -365,7 +365,7 @@ function MenuItem( subtitle, shouldShowBasicTitle, label, - shouldTruncateDescription = false, + shouldTruncateTitle = false, limit = 200, isLabelHoverable = true, rightLabel, From 998e0faec6b4335440573456e8d2fac877132837 Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Sun, 4 Aug 2024 23:38:53 -0500 Subject: [PATCH 55/71] Added truncation toggle --- src/pages/ReportDetailsPage.tsx | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/pages/ReportDetailsPage.tsx b/src/pages/ReportDetailsPage.tsx index 5eaa7e299093..d996285ab0e2 100644 --- a/src/pages/ReportDetailsPage.tsx +++ b/src/pages/ReportDetailsPage.tsx @@ -127,7 +127,7 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD const isExpenseReport = isMoneyRequestReport || isInvoiceReport || isMoneyRequest; const isSingleTransactionView = isMoneyRequest || isTrackExpenseReport; const isSelfDMTrackExpenseReport = isTrackExpenseReport && ReportUtils.isSelfDM(parentReport); - + const [shouldTruncateTitle, setShouldTruncateTitle] = useState(true); const shouldDisableRename = useMemo(() => ReportUtils.shouldDisableRename(report), [report]); const parentNavigationSubtitleData = ReportUtils.getParentNavigationSubtitle(report); // eslint-disable-next-line react-compiler/react-compiler, react-hooks/exhaustive-deps -- policy is a dependency because `getChatRoomSubtitle` calls `getPolicyName` which in turn retrieves the value from the `policy` value stored in Onyx @@ -456,6 +456,12 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD return ReportUtils.getDisplayNamesWithTooltips(OptionsListUtils.getPersonalDetailsForAccountIDs(participants, personalDetails), hasMultipleParticipants); }, [participants, personalDetails]); + const toggleTruncateTitle = useCallback(() => { + if (!canEditReportDescription) { + setShouldTruncateTitle((prev) => !prev); + } + }, [canEditReportDescription]); + const icons = useMemo(() => ReportUtils.getIcons(report, personalDetails, null, '', -1, policy), [report, personalDetails, policy]); const chatRoomSubtitleText = chatRoomSubtitle ? ( @@ -715,12 +721,20 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD Navigation.navigate(ROUTES.REPORT_DESCRIPTION.getRoute(report.reportID))} + onPress={() => { + if (canEditReportDescription) { + Navigation.navigate(ROUTES.REPORT_DESCRIPTION.getRoute(report.reportID)); + } else { + toggleTruncateTitle(); + } + }} /> )} From c95efb10d2ffe8f9091085bd4b6b1289a652de2b Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Sun, 4 Aug 2024 23:57:42 -0500 Subject: [PATCH 56/71] Logic adjust --- src/pages/ReportDetailsPage.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/pages/ReportDetailsPage.tsx b/src/pages/ReportDetailsPage.tsx index d996285ab0e2..0795b66c605a 100644 --- a/src/pages/ReportDetailsPage.tsx +++ b/src/pages/ReportDetailsPage.tsx @@ -457,9 +457,10 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD }, [participants, personalDetails]); const toggleTruncateTitle = useCallback(() => { - if (!canEditReportDescription) { - setShouldTruncateTitle((prev) => !prev); + if (canEditReportDescription) { + return; } + setShouldTruncateTitle((prev) => !prev); }, [canEditReportDescription]); const icons = useMemo(() => ReportUtils.getIcons(report, personalDetails, null, '', -1, policy), [report, personalDetails, policy]); From 0c5ccf3f0ec5ee72f5f1776119131d6c32e99a50 Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Fri, 9 Aug 2024 10:25:47 -0500 Subject: [PATCH 57/71] updated report description page --- src/pages/ReportDetailsPage.tsx | 17 ++--------------- src/pages/RoomDescriptionPage.tsx | 8 ++++---- 2 files changed, 6 insertions(+), 19 deletions(-) diff --git a/src/pages/ReportDetailsPage.tsx b/src/pages/ReportDetailsPage.tsx index 0795b66c605a..8564c42021db 100644 --- a/src/pages/ReportDetailsPage.tsx +++ b/src/pages/ReportDetailsPage.tsx @@ -456,13 +456,6 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD return ReportUtils.getDisplayNamesWithTooltips(OptionsListUtils.getPersonalDetailsForAccountIDs(participants, personalDetails), hasMultipleParticipants); }, [participants, personalDetails]); - const toggleTruncateTitle = useCallback(() => { - if (canEditReportDescription) { - return; - } - setShouldTruncateTitle((prev) => !prev); - }, [canEditReportDescription]); - const icons = useMemo(() => ReportUtils.getIcons(report, personalDetails, null, '', -1, policy), [report, personalDetails, policy]); const chatRoomSubtitleText = chatRoomSubtitle ? ( @@ -721,7 +714,7 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD {shouldShowReportDescription && ( { - if (canEditReportDescription) { - Navigation.navigate(ROUTES.REPORT_DESCRIPTION.getRoute(report.reportID)); - } else { - toggleTruncateTitle(); - } - }} + onPress={() => Navigation.navigate(ROUTES.REPORT_DESCRIPTION.getRoute(report.reportID));} /> )} diff --git a/src/pages/RoomDescriptionPage.tsx b/src/pages/RoomDescriptionPage.tsx index 1103b0ba3d8a..02e2f2869908 100644 --- a/src/pages/RoomDescriptionPage.tsx +++ b/src/pages/RoomDescriptionPage.tsx @@ -60,13 +60,14 @@ function RoomDescriptionPage({report, policies}: RoomDescriptionPageProps) { }, []), ); + const canEdit = ReportUtils.canEditReportDescription(report, policy); return ( - + + {!canEdit && {description}} ); } From 0524ef29ba49cf6de5944d35db5fbf48aefb176e Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Mon, 12 Aug 2024 20:43:43 -0500 Subject: [PATCH 58/71] Update ReportDetailsPage.tsx --- src/pages/ReportDetailsPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/ReportDetailsPage.tsx b/src/pages/ReportDetailsPage.tsx index 111b8a3a3aeb..1278bdaef9d9 100644 --- a/src/pages/ReportDetailsPage.tsx +++ b/src/pages/ReportDetailsPage.tsx @@ -721,7 +721,7 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD limit={100} shouldCheckActionAllowedOnPress={false} description={translate('reportDescriptionPage.roomDescription')} - onPress={() => Navigation.navigate(ROUTES.REPORT_DESCRIPTION.getRoute(report.reportID));} + onPress={() => Navigation.navigate(ROUTES.REPORT_DESCRIPTION.getRoute(report.reportID))} /> )} From abbd948a25e3a84c70f3a095903186e133ce6ab1 Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Mon, 12 Aug 2024 21:13:16 -0500 Subject: [PATCH 59/71] Update ReportDetailsPage.tsx --- src/pages/ReportDetailsPage.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/pages/ReportDetailsPage.tsx b/src/pages/ReportDetailsPage.tsx index 1278bdaef9d9..e242c69dea9f 100644 --- a/src/pages/ReportDetailsPage.tsx +++ b/src/pages/ReportDetailsPage.tsx @@ -127,7 +127,6 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD const isExpenseReport = isMoneyRequestReport || isInvoiceReport || isMoneyRequest; const isSingleTransactionView = isMoneyRequest || isTrackExpenseReport; const isSelfDMTrackExpenseReport = isTrackExpenseReport && ReportUtils.isSelfDM(parentReport); - const [shouldTruncateTitle, setShouldTruncateTitle] = useState(true); const shouldDisableRename = useMemo(() => ReportUtils.shouldDisableRename(report), [report]); const parentNavigationSubtitleData = ReportUtils.getParentNavigationSubtitle(report); // eslint-disable-next-line react-compiler/react-compiler, react-hooks/exhaustive-deps -- policy is a dependency because `getChatRoomSubtitle` calls `getPolicyName` which in turn retrieves the value from the `policy` value stored in Onyx @@ -717,7 +716,7 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD interactive title={report.description} shouldRenderAsHTML - shouldTruncateTitle={shouldTruncateTitle} + shouldTruncateTitle limit={100} shouldCheckActionAllowedOnPress={false} description={translate('reportDescriptionPage.roomDescription')} From 57bab0128f1955a7978baaab9c7a8b17d1cf155b Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Mon, 12 Aug 2024 21:51:58 -0500 Subject: [PATCH 60/71] updated to add description for those not editing --- src/pages/RoomDescriptionPage.tsx | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/pages/RoomDescriptionPage.tsx b/src/pages/RoomDescriptionPage.tsx index 02e2f2869908..d078f54eaad4 100644 --- a/src/pages/RoomDescriptionPage.tsx +++ b/src/pages/RoomDescriptionPage.tsx @@ -21,6 +21,8 @@ import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import INPUT_IDS from '@src/types/form/ReportDescriptionForm'; import type * as OnyxTypes from '@src/types/onyx'; +import RenderHTML from '@components/RenderHTML'; +import ScrollView from '@components/ScrollView'; type RoomDescriptionPageProps = { /** Policy for the current report */ @@ -67,7 +69,7 @@ function RoomDescriptionPage({report, policies}: RoomDescriptionPageProps) { includeSafeAreaPaddingBottom={false} testID={RoomDescriptionPage.displayName} > - + + {!canEdit && ( + + + + )} - {!canEdit && {description}} ); } From 40f208dc3c19b37b7c3938898a396dde4b0795fd Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Mon, 12 Aug 2024 21:53:10 -0500 Subject: [PATCH 61/71] prettier --- src/pages/RoomDescriptionPage.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/RoomDescriptionPage.tsx b/src/pages/RoomDescriptionPage.tsx index d078f54eaad4..be70cf9529e3 100644 --- a/src/pages/RoomDescriptionPage.tsx +++ b/src/pages/RoomDescriptionPage.tsx @@ -6,7 +6,9 @@ import FullPageNotFoundView from '@components/BlockingViews/FullPageNotFoundView import FormProvider from '@components/Form/FormProvider'; import InputWrapper from '@components/Form/InputWrapper'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; +import RenderHTML from '@components/RenderHTML'; import ScreenWrapper from '@components/ScreenWrapper'; +import ScrollView from '@components/ScrollView'; import Text from '@components/Text'; import TextInput from '@components/TextInput'; import type {BaseTextInputRef} from '@components/TextInput/BaseTextInput/types'; @@ -21,8 +23,6 @@ import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import INPUT_IDS from '@src/types/form/ReportDescriptionForm'; import type * as OnyxTypes from '@src/types/onyx'; -import RenderHTML from '@components/RenderHTML'; -import ScrollView from '@components/ScrollView'; type RoomDescriptionPageProps = { /** Policy for the current report */ From db5771afc58c6d46eec7ef9c431a0c405e77300b Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Tue, 13 Aug 2024 12:08:48 -0500 Subject: [PATCH 62/71] revert.. --- src/pages/RoomDescriptionPage.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/pages/RoomDescriptionPage.tsx b/src/pages/RoomDescriptionPage.tsx index be70cf9529e3..a046d96a32d3 100644 --- a/src/pages/RoomDescriptionPage.tsx +++ b/src/pages/RoomDescriptionPage.tsx @@ -93,8 +93,10 @@ function RoomDescriptionPage({report, policies}: RoomDescriptionPageProps) { if (!el) { return; } + if (!reportDescriptionInputRef.current) { + updateMultilineInputRange(el); + } reportDescriptionInputRef.current = el; - updateMultilineInputRange(el); }} value={description} onChangeText={handleReportDescriptionChange} From 8109827355283a0e9770eb3ab29173fd95d23dd6 Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Thu, 22 Aug 2024 22:11:58 -0500 Subject: [PATCH 63/71] Update src/pages/RoomDescriptionPage.tsx Co-authored-by: Shubham Agrawal <58412969+shubham1206agra@users.noreply.github.com> --- src/pages/RoomDescriptionPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/RoomDescriptionPage.tsx b/src/pages/RoomDescriptionPage.tsx index a046d96a32d3..cc2692d8d8cf 100644 --- a/src/pages/RoomDescriptionPage.tsx +++ b/src/pages/RoomDescriptionPage.tsx @@ -104,7 +104,7 @@ function RoomDescriptionPage({report, policies}: RoomDescriptionPageProps) { isMarkdownEnabled /> - + )} {!canEdit && ( From 8b644709f5ea9e7592b2b97062cfff2503e23d26 Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Thu, 22 Aug 2024 22:12:24 -0500 Subject: [PATCH 64/71] Update src/pages/RoomDescriptionPage.tsx Co-authored-by: Shubham Agrawal <58412969+shubham1206agra@users.noreply.github.com> --- src/pages/RoomDescriptionPage.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/pages/RoomDescriptionPage.tsx b/src/pages/RoomDescriptionPage.tsx index cc2692d8d8cf..69da29d7d808 100644 --- a/src/pages/RoomDescriptionPage.tsx +++ b/src/pages/RoomDescriptionPage.tsx @@ -69,7 +69,6 @@ function RoomDescriptionPage({report, policies}: RoomDescriptionPageProps) { includeSafeAreaPaddingBottom={false} testID={RoomDescriptionPage.displayName} > - Date: Thu, 22 Aug 2024 22:12:38 -0500 Subject: [PATCH 65/71] Update src/pages/RoomDescriptionPage.tsx Co-authored-by: Shubham Agrawal <58412969+shubham1206agra@users.noreply.github.com> --- src/pages/RoomDescriptionPage.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/pages/RoomDescriptionPage.tsx b/src/pages/RoomDescriptionPage.tsx index 69da29d7d808..fa1da1ede8db 100644 --- a/src/pages/RoomDescriptionPage.tsx +++ b/src/pages/RoomDescriptionPage.tsx @@ -109,7 +109,6 @@ function RoomDescriptionPage({report, policies}: RoomDescriptionPageProps) { )} - ); } From 8cba44b33c159fe47e814e39d30fce5ae632417d Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Thu, 22 Aug 2024 22:12:49 -0500 Subject: [PATCH 66/71] Update src/pages/RoomDescriptionPage.tsx Co-authored-by: Shubham Agrawal <58412969+shubham1206agra@users.noreply.github.com> --- src/pages/RoomDescriptionPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/RoomDescriptionPage.tsx b/src/pages/RoomDescriptionPage.tsx index fa1da1ede8db..1ecf1ff7c759 100644 --- a/src/pages/RoomDescriptionPage.tsx +++ b/src/pages/RoomDescriptionPage.tsx @@ -70,7 +70,7 @@ function RoomDescriptionPage({report, policies}: RoomDescriptionPageProps) { testID={RoomDescriptionPage.displayName} > - Date: Thu, 22 Aug 2024 23:12:21 -0500 Subject: [PATCH 67/71] Update RoomDescriptionPage.tsx --- src/pages/RoomDescriptionPage.tsx | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/pages/RoomDescriptionPage.tsx b/src/pages/RoomDescriptionPage.tsx index 1ecf1ff7c759..6589a73c88e8 100644 --- a/src/pages/RoomDescriptionPage.tsx +++ b/src/pages/RoomDescriptionPage.tsx @@ -2,7 +2,6 @@ import {useFocusEffect} from '@react-navigation/native'; import React, {useCallback, useRef, useState} from 'react'; import {View} from 'react-native'; import type {OnyxCollection} from 'react-native-onyx'; -import FullPageNotFoundView from '@components/BlockingViews/FullPageNotFoundView'; import FormProvider from '@components/Form/FormProvider'; import InputWrapper from '@components/Form/InputWrapper'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; @@ -69,8 +68,9 @@ function RoomDescriptionPage({report, policies}: RoomDescriptionPageProps) { includeSafeAreaPaddingBottom={false} testID={RoomDescriptionPage.displayName} > - - {canEdit && ( + {canEdit && ( + - )} - {!canEdit && ( - - - - )} + + )} + {!canEdit && ( + + + + )} ); } From 77b6b37827e45ca5daba33c2764daf70e03df816 Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Mon, 26 Aug 2024 11:12:06 -0500 Subject: [PATCH 68/71] Update src/components/MenuItem.tsx Co-authored-by: Puneet Lath --- src/components/MenuItem.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index dd601971ee8f..1a533544d4a5 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -179,7 +179,7 @@ type MenuItemBaseProps = { label?: string; /** Limit to truncate description for menu item */ - limit?: number; + characterLimit?: number; isLabelHoverable?: boolean; From 6e80b2705bac2dad5c45ed1f4a5cb4da3147b19f Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Mon, 26 Aug 2024 11:12:17 -0500 Subject: [PATCH 69/71] Update src/components/MenuItem.tsx Co-authored-by: Puneet Lath --- src/components/MenuItem.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index 1a533544d4a5..ca7870210949 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -178,7 +178,7 @@ type MenuItemBaseProps = { /** Text that appears above the title */ label?: string; - /** Limit to truncate description for menu item */ + /** Character limit after which the menu item text will be truncated */ characterLimit?: number; isLabelHoverable?: boolean; From bce1cd5eefba746120be8973bfe70fa29ce7698f Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Mon, 26 Aug 2024 11:30:48 -0500 Subject: [PATCH 70/71] update param name --- src/components/MenuItem.tsx | 4 ++-- src/pages/ReportDetailsPage.tsx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index ca7870210949..ec18e57bde36 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -382,7 +382,7 @@ function MenuItem( shouldShowBasicTitle, label, shouldTruncateTitle = false, - limit = 200, + characterLimit = 200, isLabelHoverable = true, rightLabel, shouldShowSelectedState = false, @@ -489,7 +489,7 @@ function MenuItem( } return titleToWrap ? `${titleToWrap}` : ''; - }, [title, shouldRenderAsHTML, shouldParseTitle, limit, shouldTruncateTitle, html]); + }, [title, shouldRenderAsHTML, shouldParseTitle, characterLimit, shouldTruncateTitle, html]); const processedHelperText = useMemo(() => { let textToWrap = ''; diff --git a/src/pages/ReportDetailsPage.tsx b/src/pages/ReportDetailsPage.tsx index 5b0757122acc..de93ed7a3ced 100644 --- a/src/pages/ReportDetailsPage.tsx +++ b/src/pages/ReportDetailsPage.tsx @@ -724,7 +724,7 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD title={report.description} shouldRenderAsHTML shouldTruncateTitle - limit={100} + characterLimit={100} shouldCheckActionAllowedOnPress={false} description={translate('reportDescriptionPage.roomDescription')} onPress={() => Navigation.navigate(ROUTES.REPORT_DESCRIPTION.getRoute(report.reportID))} From a30023e357edc5ad6a66df6bfd738f522a8388aa Mon Sep 17 00:00:00 2001 From: Brandon Henry Date: Mon, 26 Aug 2024 11:39:07 -0500 Subject: [PATCH 71/71] Update MenuItem.tsx --- src/components/MenuItem.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/MenuItem.tsx b/src/components/MenuItem.tsx index ec18e57bde36..3993633da58d 100644 --- a/src/components/MenuItem.tsx +++ b/src/components/MenuItem.tsx @@ -485,7 +485,7 @@ function MenuItem( } if (shouldTruncateTitle) { - titleToWrap = Parser.truncateHTML(titleToWrap, limit, {ellipsis: '...'}); + titleToWrap = Parser.truncateHTML(titleToWrap, characterLimit, {ellipsis: '...'}); } return titleToWrap ? `${titleToWrap}` : '';