From ef554fe9361b1292412c64134f790921bc91c389 Mon Sep 17 00:00:00 2001 From: WasiqB Date: Wed, 2 Oct 2024 09:53:38 +0300 Subject: [PATCH] feat: :sparkles: adding export to html feature --- app/(app)/results/page.tsx | 160 +++++++++++++++++++----------------- components/home/nav-bar.tsx | 30 ++++++- lib/utils.ts | 99 ++++++++++++++++++++++ package.json | 3 + pnpm-lock.yaml | 104 ++++++++++++++++++++++- 5 files changed, 315 insertions(+), 81 deletions(-) diff --git a/app/(app)/results/page.tsx b/app/(app)/results/page.tsx index b730db8..59f7bee 100644 --- a/app/(app)/results/page.tsx +++ b/app/(app)/results/page.tsx @@ -99,83 +99,91 @@ const ResultsPage = (): JSX.Element => { return (
- +
-
-
- - - Test Statistics - - Overall Test execution statistics - - - -
- - Total Tests - - {passed + failed + skipped} - - - - Passed - {passed} - - - Failed - {failed} - - - Skipped - {skipped} - -
-
-
-
-
- - -
- {result ? ( - - - Test Details - - List of all the executed test cases - - - - - - - ) : ( -

No data available

- )} -
+
+
+
+ + + Test Statistics + + Overall Test execution statistics + + + +
+ + Total Tests + + {passed + failed + skipped} + + + + Passed + {passed} + + + Failed + {failed} + + + Skipped + + {skipped} + + +
+
+
+
+
+ + +
+ {result ? ( + + + Test Details + + List of all the executed test cases + + + + + + + ) : ( +

No data available

+ )} +
+
); diff --git a/components/home/nav-bar.tsx b/components/home/nav-bar.tsx index f265196..183505e 100644 --- a/components/home/nav-bar.tsx +++ b/components/home/nav-bar.tsx @@ -6,13 +6,26 @@ import { Button } from '@/components/ui/button'; import Image from 'next/image'; import { GitHub } from '@/components/icons/github'; import { Sponsor } from '@/components/icons/sponsor'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from '../ui/dropdown-menu'; +import { DownloadIcon } from 'lucide-react'; +import { exportHTML } from '@/lib/utils'; interface NavBarProps { suffix?: string; cta?: string; + exportReport?: 'html' | undefined; } -export const NavBar = ({ suffix, cta }: NavBarProps): JSX.Element => { +export const NavBar = ({ + suffix, + cta, + exportReport, +}: NavBarProps): JSX.Element => { const [isScrolled, setIsScrolled] = useState(false); useEffect(() => { @@ -63,6 +76,21 @@ export const NavBar = ({ suffix, cta }: NavBarProps): JSX.Element => { + {exportReport && ( + + + + + + + Export HTML + + + + )} {cta && ( diff --git a/lib/utils.ts b/lib/utils.ts index a7c2663..5d483e8 100644 --- a/lib/utils.ts +++ b/lib/utils.ts @@ -1,6 +1,105 @@ import { clsx, type ClassValue } from 'clsx'; import { twMerge } from 'tailwind-merge'; +import JSZip from 'jszip'; +import FileSaver from 'file-saver'; export function cn(...inputs: ClassValue[]): string { return twMerge(clsx(inputs)); } + +export const exportHTML = async (): Promise => { + const zip = new JSZip(); + + // Wait for any animations or transitions to complete + await new Promise((resolve) => setTimeout(resolve, 1000)); + + // Capture the current state of the DOM + const content = document.querySelector('#content'); + if (!content) { + console.error('Content element not found'); + return; + } + + // Create a new HTML document + const doc = document.implementation.createHTMLDocument('Exported Report'); + + // Copy the content + doc.head.innerHTML = document.head.innerHTML; + + // Remove unnecessary tags from the head + const tagsToRemove = [ + 'script', + 'noscript', + 'link[rel="preload"]', + 'link[rel="preconnect"]', + 'link[rel="dns-prefetch"]', + ]; + tagsToRemove.forEach((selector) => { + doc.head.querySelectorAll(selector).forEach((el) => el.remove()); + }); + + // Inline all stylesheets + const styles = doc.head.querySelectorAll('link[rel="stylesheet"]'); + for (const style of styles) { + if (style instanceof HTMLLinkElement && style.href) { + try { + const response = await fetch(style.href); + const css = await response.text(); + const inlineStyle = doc.createElement('style'); + inlineStyle.textContent = css; + style.parentNode?.replaceChild(inlineStyle, style); + } catch (error) { + console.error(`Failed to fetch stylesheet: ${style.href}`, error); + } + } + } + + // Copy the content + doc.body.innerHTML = ` +
+ ${content.innerHTML} +
+ `; + + // Remove interactive elements from the NavBar + const navbarButtons = doc.body.querySelectorAll('nav button'); + navbarButtons.forEach((button) => button.remove()); + + // Process images + const images = doc.getElementsByTagName('img'); + for (let i = 0; i < images.length; i++) { + const img = images[i]; + if (img.src) { + try { + const response = await fetch(img.src); + const blob = await response.blob(); + const imgFileName = `images/image${i}.${blob.type.split('/')[1]}`; + zip.file(imgFileName, blob); + img.src = imgFileName; + } catch (error) { + console.error(`Failed to fetch image: ${img.src}`, error); + } + } + } + + // Add necessary scripts + const scriptContent = ` + // Add any necessary JavaScript here + document.addEventListener('DOMContentLoaded', function() { + // Initialize any components or functionality here + }); + `; + const scriptTag = doc.createElement('script'); + scriptTag.textContent = scriptContent; + doc.body.appendChild(scriptTag); + + // Get the final HTML content + const finalHtmlContent = `${doc.documentElement.outerHTML}`; + + // Add the HTML file to the zip + zip.file('report.html', finalHtmlContent); + + // Generate the zip file + const zipContent = await zip.generateAsync({ type: 'blob' }); + FileSaver.saveAs(zipContent, 'report.zip'); +}; diff --git a/package.json b/package.json index 88b80d8..4f42a25 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,8 @@ "clsx": "^2.1.1", "cmdk": "1.0.0", "date-fns": "^4.1.0", + "file-saver": "^2.0.5", + "jszip": "^3.10.1", "lucide-react": "^0.446.0", "next": "14.2.13", "next-themes": "^0.3.0", @@ -50,6 +52,7 @@ "@next/eslint-plugin-next": "^14.2.13", "@stylistic/eslint-plugin-js": "^2.8.0", "@stylistic/eslint-plugin-ts": "^2.8.0", + "@types/file-saver": "^2.0.7", "@types/node": "^22.7.4", "@types/react": "^18.3.10", "@types/react-dom": "^18", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c2d3b04..0f6d9cf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -68,6 +68,12 @@ importers: date-fns: specifier: ^4.1.0 version: 4.1.0 + file-saver: + specifier: ^2.0.5 + version: 2.0.5 + jszip: + specifier: ^3.10.1 + version: 3.10.1 lucide-react: specifier: ^0.446.0 version: 0.446.0(react@18.3.1) @@ -114,6 +120,9 @@ importers: '@stylistic/eslint-plugin-ts': specifier: ^2.8.0 version: 2.8.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@types/file-saver': + specifier: ^2.0.7 + version: 2.0.7 '@types/node': specifier: ^22.7.4 version: 22.7.4 @@ -1008,6 +1017,9 @@ packages: '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/file-saver@2.0.7': + resolution: {integrity: sha512-dNKVfHd/jk0SkR/exKGj2ggkB45MAkzvWCaqLUUgkyjITkGNzH8H+yUwr+BLJUBjZOe9w8X3wgmXhZDRg1ED6A==} + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -1340,6 +1352,9 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -1710,6 +1725,9 @@ packages: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} + file-saver@2.0.5: + resolution: {integrity: sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==} + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -1847,6 +1865,9 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} + immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} @@ -1855,6 +1876,9 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + internal-slot@1.0.7: resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} engines: {node: '>= 0.4'} @@ -1994,6 +2018,9 @@ packages: resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} engines: {node: '>= 0.4'} + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} @@ -2042,6 +2069,9 @@ packages: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} + jszip@3.10.1: + resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -2056,6 +2086,9 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + lie@3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} @@ -2244,6 +2277,9 @@ packages: package-json-from-dist@1.0.0: resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -2404,6 +2440,9 @@ packages: engines: {node: '>=14'} hasBin: true + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} @@ -2487,6 +2526,9 @@ packages: read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -2545,6 +2587,9 @@ packages: resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} engines: {node: '>=0.4'} + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + safe-regex-test@1.0.3: resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} engines: {node: '>= 0.4'} @@ -2572,6 +2617,9 @@ packages: resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} engines: {node: '>= 0.4'} + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -2645,6 +2693,9 @@ packages: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -3672,6 +3723,8 @@ snapshots: '@types/estree@1.0.6': {} + '@types/file-saver@2.0.7': {} + '@types/json-schema@7.0.15': {} '@types/json5@0.0.29': {} @@ -4075,6 +4128,8 @@ snapshots: concat-map@0.0.1: {} + core-util-is@1.0.3: {} + cross-spawn@7.0.3: dependencies: path-key: 3.1.1 @@ -4351,7 +4406,7 @@ snapshots: eslint: 9.11.1(jiti@2.0.0) eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.6.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@9.11.1(jiti@2.0.0)) - eslint-plugin-import: 2.30.0(@typescript-eslint/parser@8.6.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@9.11.1(jiti@2.0.0)) + eslint-plugin-import: 2.30.0(@typescript-eslint/parser@8.8.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2))(eslint@9.11.1(jiti@2.0.0)) eslint-plugin-jsx-a11y: 6.10.0(eslint@9.11.1(jiti@2.0.0)) eslint-plugin-react: 7.36.1(eslint@9.11.1(jiti@2.0.0)) eslint-plugin-react-hooks: 4.6.2(eslint@9.11.1(jiti@2.0.0)) @@ -4386,7 +4441,7 @@ snapshots: is-bun-module: 1.2.1 is-glob: 4.0.3 optionalDependencies: - eslint-plugin-import: 2.30.0(@typescript-eslint/parser@8.6.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@9.11.1(jiti@2.0.0)) + eslint-plugin-import: 2.30.0(@typescript-eslint/parser@8.8.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2))(eslint@9.11.1(jiti@2.0.0)) transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node @@ -4404,7 +4459,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-import@2.30.0(@typescript-eslint/parser@8.6.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@9.11.1(jiti@2.0.0)): + eslint-plugin-import@2.30.0(@typescript-eslint/parser@8.8.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2))(eslint@9.11.1(jiti@2.0.0)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -4426,7 +4481,7 @@ snapshots: semver: 6.3.1 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.6.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@typescript-eslint/parser': 8.8.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -4602,6 +4657,8 @@ snapshots: dependencies: flat-cache: 4.0.1 + file-saver@2.0.5: {} + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -4733,6 +4790,8 @@ snapshots: ignore@5.3.2: {} + immediate@3.0.6: {} + import-fresh@3.3.0: dependencies: parent-module: 1.0.1 @@ -4740,6 +4799,8 @@ snapshots: imurmurhash@0.1.4: {} + inherits@2.0.4: {} + internal-slot@1.0.7: dependencies: es-errors: 1.3.0 @@ -4867,6 +4928,8 @@ snapshots: call-bind: 1.0.7 get-intrinsic: 1.2.4 + isarray@1.0.0: {} + isarray@2.0.5: {} isexe@2.0.0: {} @@ -4919,6 +4982,13 @@ snapshots: object.assign: 4.1.5 object.values: 1.2.0 + jszip@3.10.1: + dependencies: + lie: 3.3.0 + pako: 1.0.11 + readable-stream: 2.3.8 + setimmediate: 1.0.5 + keyv@4.5.4: dependencies: json-buffer: 3.0.1 @@ -4934,6 +5004,10 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + lie@3.3.0: + dependencies: + immediate: 3.0.6 + lilconfig@2.1.0: {} lilconfig@3.1.2: {} @@ -5135,6 +5209,8 @@ snapshots: package-json-from-dist@1.0.0: {} + pako@1.0.11: {} + parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -5219,6 +5295,8 @@ snapshots: prettier@3.3.3: {} + process-nextick-args@2.0.1: {} + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 @@ -5305,6 +5383,16 @@ snapshots: dependencies: pify: 2.3.0 + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + readdirp@3.6.0: dependencies: picomatch: 2.3.1 @@ -5381,6 +5469,8 @@ snapshots: has-symbols: 1.0.3 isarray: 2.0.5 + safe-buffer@5.1.2: {} + safe-regex-test@1.0.3: dependencies: call-bind: 1.0.7 @@ -5413,6 +5503,8 @@ snapshots: functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 + setimmediate@1.0.5: {} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -5510,6 +5602,10 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.0.0 + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1