diff --git a/package.json b/package.json index 57cb932629..57349638a9 100644 --- a/package.json +++ b/package.json @@ -58,20 +58,20 @@ "@codemirror/lang-rust": "^6.0.1", "@codemirror/language": "^6.10.2", "@codemirror/state": "^6.4.1", - "@codemirror/view": "^6.28.0", + "@codemirror/view": "^6.30.0", "@firefox-devtools/react-contextmenu": "^5.1.1", "@fluent/bundle": "^0.18.0", "@fluent/langneg": "^0.7.0", "@fluent/react": "^0.15.2", - "@lezer/highlight": "^1.2.0", - "@tgwf/co2": "^0.15.0", + "@lezer/highlight": "^1.2.1", + "@tgwf/co2": "^0.16.0", "array-move": "^3.0.1", "array-range": "^1.0.1", "clamp": "^1.0.1", "classnames": "^2.5.1", "common-tags": "^1.8.2", "copy-to-clipboard": "^3.3.3", - "core-js": "^3.37.1", + "core-js": "^3.38.0", "escape-string-regexp": "^4.0.0", "gecko-profiler-demangle": "^0.3.3", "idb": "^8.0.0", @@ -81,10 +81,10 @@ "mixedtuplemap": "^1.0.0", "namedtuplemap": "^1.0.0", "photon-colors": "^3.3.2", - "query-string": "^9.0.0", + "query-string": "^9.1.0", "react": "^18.3.1", "react-dom": "^18.3.1", - "react-intersection-observer": "^9.10.3", + "react-intersection-observer": "^9.13.0", "react-redux": "^9.1.2", "react-splitter-layout": "^4.0.0", "react-transition-group": "^4.4.5", @@ -92,46 +92,46 @@ "redux-logger": "^3.0.6", "redux-thunk": "^3.1.0", "reselect": "^4.1.8", - "url": "^0.11.3", + "url": "^0.11.4", "weaktuplemap": "^1.0.0", "workbox-window": "^7.1.0" }, "devDependencies": { - "@babel/cli": "^7.24.7", - "@babel/core": "^7.24.7", - "@babel/eslint-parser": "^7.24.7", - "@babel/eslint-plugin": "^7.24.7", + "@babel/cli": "^7.24.8", + "@babel/core": "^7.25.2", + "@babel/eslint-parser": "^7.25.1", + "@babel/eslint-plugin": "^7.25.1", "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/preset-env": "^7.24.7", + "@babel/preset-env": "^7.25.3", "@babel/preset-flow": "^7.24.7", "@babel/preset-react": "^7.24.7", - "@testing-library/dom": "^10.1.0", - "@testing-library/jest-dom": "^6.4.6", + "@testing-library/dom": "^10.4.0", + "@testing-library/jest-dom": "^6.4.8", "@testing-library/react": "^16.0.0", "alex": "^11.0.1", - "autoprefixer": "^10.4.19", + "autoprefixer": "^10.4.20", "babel-jest": "^29.7.0", "babel-loader": "^9.1.3", "babel-plugin-module-resolver": "^5.0.2", - "browserslist": "^4.23.1", - "caniuse-lite": "^1.0.30001632", + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001640", "circular-dependency-plugin": "^5.2.1", "codecov": "^3.8.3", "copy-webpack-plugin": "^12.0.2", "cross-env": "^7.0.3", "css-loader": "^7.1.2", - "cssnano": "^7.0.2", + "cssnano": "^7.0.5", "devtools-license-check": "^0.9.0", "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", "eslint-import-resolver-alias": "^1.1.2", "eslint-plugin-flowtype": "^8.0.3", "eslint-plugin-import": "^2.29.1", - "eslint-plugin-jest": "^28.6.0", + "eslint-plugin-jest": "^28.8.0", "eslint-plugin-jest-dom": "^5.4.0", "eslint-plugin-jest-formatting": "^3.1.0", - "eslint-plugin-react": "^7.34.3", - "eslint-plugin-testing-library": "^6.2.2", + "eslint-plugin-react": "^7.35.0", + "eslint-plugin-testing-library": "^6.3.0", "espree": "^10.1.0", "fake-indexeddb": "^6.0.0", "fetch-mock-jest": "^1.5.1", @@ -139,29 +139,29 @@ "flow-bin": "^0.96.0", "flow-coverage-report": "^0.8.0", "flow-typed": "^4.0.0", - "glob": "^10.4.1", + "glob": "^10.4.5", "html-webpack-plugin": "^5.6.0", "husky": "^4.3.8", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", "jest-extended": "^4.0.2", "json-loader": "^0.5.7", - "local-web-server": "^5.3.3", + "local-web-server": "^5.4.0", "lockfile-lint": "^4.14.0", "mkdirp": "^3.0.1", "node-fetch": "^2.6.11", "npm-run-all": "^4.1.5", "open": "^10.1.0", - "postcss": "^8.4.38", + "postcss": "^8.4.41", "postcss-loader": "^8.1.1", - "prettier": "^3.3.1", + "prettier": "^3.3.3", "raw-loader": "^4.0.2", - "rimraf": "^5.0.7", + "rimraf": "^5.0.10", "style-loader": "^4.0.0", - "stylelint": "^16.6.1", + "stylelint": "^16.8.2", "stylelint-config-idiomatic-order": "^10.0.0", - "stylelint-config-standard": "^36.0.0", - "webpack": "^5.92.0", + "stylelint-config-standard": "^36.0.1", + "webpack": "^5.94.0", "webpack-cli": "^5.1.4", "webpack-dev-server": "^5.0.4", "workbox-webpack-plugin": "^7.1.0", diff --git a/src/actions/app.js b/src/actions/app.js index 2ba3166a7f..fdc215fcad 100644 --- a/src/actions/app.js +++ b/src/actions/app.js @@ -50,6 +50,7 @@ import type { UrlState, UploadedProfileInformation, IndexIntoCategoryList, + TabID, } from 'firefox-profiler/types'; import type { TabSlug } from 'firefox-profiler/app-logic/tabs-handling'; import type { @@ -428,3 +429,16 @@ export function toggleOpenCategoryInSidebar( category, }; } + +/** + * Change the selected browser tab filter for the profile. + * TabID here means the unique ID for a give browser tab and corresponds to + * multiple pages in the `profile.pages` array. + * If it's null it will undo the filter and will show the full profile. + */ +export function changeTabFilter(tabID: TabID | null): Action { + return { + type: 'CHANGE_TAB_FILTER', + tabID, + }; +} diff --git a/src/actions/profile-view.js b/src/actions/profile-view.js index 05f32cd080..6fe354ece7 100644 --- a/src/actions/profile-view.js +++ b/src/actions/profile-view.js @@ -1362,7 +1362,7 @@ function _findOtherVisibleThread( const localTrackOrder = getLocalTrackOrder(getState(), globalTrack.pid); const hiddenLocalTracks = getHiddenLocalTracks(getState(), globalTrack.pid); const localTrackIndexesToIgnore = localTrackIndexesToIgnoreByPid - ? localTrackIndexesToIgnoreByPid.get(globalTrack.pid) ?? new Set() + ? (localTrackIndexesToIgnoreByPid.get(globalTrack.pid) ?? new Set()) : new Set(); for (const trackIndex of localTrackOrder) { diff --git a/src/actions/receive-profile.js b/src/actions/receive-profile.js index b6b0da7658..00461eb039 100644 --- a/src/actions/receive-profile.js +++ b/src/actions/receive-profile.js @@ -914,6 +914,11 @@ function getSymbolStore( body: json, method: 'POST', mode: 'cors', + // Use a profiler-specific user agent, so that the symbolication server knows + // what's making this request. + headers: new Headers({ + 'User-Agent': `FirefoxProfiler/1.0 (+${location.origin})`, + }), }); return response.json(); } @@ -995,39 +1000,47 @@ export async function doSymbolicateProfile( dispatch(doneSymbolicating()); } +// From a BrowserConnectionStatus, this unwraps the included browserConnection +// when possible. +export function unwrapBrowserConnection( + browserConnectionStatus: BrowserConnectionStatus +): BrowserConnection { + switch (browserConnectionStatus.status) { + case 'ESTABLISHED': + // Good. This is the normal case. + break; + // The other cases are error cases. + case 'NOT_FIREFOX': + throw new Error('/from-browser only works in Firefox browsers'); + case 'NO_ATTEMPT': + throw new Error( + 'retrieveProfileFromBrowser should never be called while browserConnectionStatus is NO_ATTEMPT' + ); + case 'WAITING': + throw new Error( + 'retrieveProfileFromBrowser should never be called while browserConnectionStatus is WAITING' + ); + case 'DENIED': + throw browserConnectionStatus.error; + case 'TIMED_OUT': + throw new Error('Timed out when waiting for reply to WebChannel message'); + default: + throw assertExhaustiveCheck(browserConnectionStatus.status); + } + + // Now we know that browserConnectionStatus.status === 'ESTABLISHED'. + return browserConnectionStatus.browserConnection; +} + export function retrieveProfileFromBrowser( browserConnectionStatus: BrowserConnectionStatus, initialLoad: boolean = false ): ThunkAction> { return async (dispatch) => { try { - switch (browserConnectionStatus.status) { - case 'ESTABLISHED': - // Good. This is the normal case. - break; - // The other cases are error cases. - case 'NOT_FIREFOX': - throw new Error('/from-browser only works in Firefox browsers'); - case 'NO_ATTEMPT': - throw new Error( - 'retrieveProfileFromBrowser should never be called while browserConnectionStatus is NO_ATTEMPT' - ); - case 'WAITING': - throw new Error( - 'retrieveProfileFromBrowser should never be called while browserConnectionStatus is WAITING' - ); - case 'DENIED': - throw browserConnectionStatus.error; - case 'TIMED_OUT': - throw new Error( - 'Timed out when waiting for reply to WebChannel message' - ); - default: - throw assertExhaustiveCheck(browserConnectionStatus.status); - } - - // Now we know that browserConnectionStatus.status === 'ESTABLISHED'. - const browserConnection = browserConnectionStatus.browserConnection; + const browserConnection = unwrapBrowserConnection( + browserConnectionStatus + ); // XXX update state to show that we're connected to the browser @@ -1283,7 +1296,7 @@ async function _extractZipFromResponse( // Catch the error if unable to load the zip. return zip; } catch (error) { - const message = 'Unable to unzip the zip file.'; + const message = 'Unable to open the archive file.'; reportError(message); reportError('Error:', error); reportError('Fetch response:', response); @@ -1409,7 +1422,7 @@ export function retrieveProfileOrZipFromUrl( default: throw assertExhaustiveCheck( response.responseType, - 'Expected to receive a zip file or profile from _fetchProfile.' + 'Expected to receive an archive or profile from _fetchProfile.' ); } } catch (error) { diff --git a/src/actions/zipped-profiles.js b/src/actions/zipped-profiles.js index f2237a7eee..a545ee41be 100644 --- a/src/actions/zipped-profiles.js +++ b/src/actions/zipped-profiles.js @@ -50,7 +50,7 @@ export function viewProfileFromZip( const file = zipFileTable.file[zipFileIndex]; if (!file) { throw new Error( - 'Attempted to load a zip file that did not exist or was a directory.' + 'Attempted to load an archive that did not exist or was a directory.' ); } @@ -74,7 +74,7 @@ export function viewProfileFromZip( } } catch (error) { console.error( - 'Failed to process the profile in the zip file with the following error:' + 'Failed to process the profile in the archive with the following error:' ); console.error(error); dispatch({ type: 'FAILED_TO_PROCESS_PROFILE_FROM_ZIP_FILE', error }); diff --git a/src/app-logic/url-handling.js b/src/app-logic/url-handling.js index 774114c6b0..f2ce716633 100644 --- a/src/app-logic/url-handling.js +++ b/src/app-logic/url-handling.js @@ -153,6 +153,7 @@ type FullProfileSpecificBaseQuery = {| hiddenGlobalTracks: string, // "01" hiddenLocalTracksByPid: string, // "1549-0w8~1593-23~1598-01~1602-02~1607-1" localTrackOrderByPid: string, // "1549-780w6~1560-01" + tabID: TabID, // The following values are legacy, and will be converted to track-based values. These // value can't be upgraded using the typical URL upgrading process, as the full profile // must be fetched to compute the tracks. @@ -328,6 +329,7 @@ export function getQueryStringFromUrlState(urlState: UrlState): string { urlState.profileSpecific.full.localTrackOrderByPid, urlState.profileSpecific.full.localTrackOrderChangedPids ); + baseQuery.tabID = urlState.profileSpecific.full.tabFilter ?? undefined; break; } @@ -581,9 +583,17 @@ export function stateFromLocation( transforms[selectedThreadsKey] = parseTransforms(query.transforms); } - let tabID = null; + // oldTabID is used for the old active tab view that we had. We will remove + // it in the end, but have to keep this while we have the view. + let oldTabID = null; if (query.ctxId && Number.isInteger(Number(query.ctxId))) { - tabID = Number(query.ctxId); + oldTabID = Number(query.ctxId); + } + + // tabID is used for the tab selector that we have in our full view. + let tabID = null; + if (query.tabID && Number.isInteger(Number(query.tabID))) { + tabID = Number(query.tabID); } const selectedTab = @@ -631,7 +641,7 @@ export function stateFromLocation( symbolServerUrl: query.symbolServer || null, timelineTrackOrganization: validateTimelineTrackOrganization( query.view, - tabID + oldTabID ), profileSpecific: { implementation, @@ -663,6 +673,7 @@ export function stateFromLocation( ), localTrackOrderByPid, localTrackOrderChangedPids, + tabFilter: tabID, legacyThreadOrder: query.threadOrder ? query.threadOrder.split('-').map((index) => Number(index)) : null, @@ -1347,8 +1358,8 @@ function validateTimelineTrackOrganization( * provided or something else is provided for some reason. */ function validateTimelineType(type: ?string): TimelineType { - // Pretend this is a TimelineTrackOrganization so that we can exhaustively - // go through each option. + // Pretend this is a TimelineType so that we can exhaustively go through + // each option. const timelineType: TimelineType = (type: any); switch (timelineType) { case 'stack': diff --git a/src/components/app/ListOfPublishedProfiles.js b/src/components/app/ListOfPublishedProfiles.js index 94c04dbfef..bcb2f74ebb 100644 --- a/src/components/app/ListOfPublishedProfiles.js +++ b/src/components/app/ListOfPublishedProfiles.js @@ -26,6 +26,11 @@ import './ListOfPublishedProfiles.css'; // them by clicking on them, or delete them. function _formatRange(range: StartEndRange): string { + if (!Number.isFinite(range.start) || !Number.isFinite(range.end)) { + // Do not attempt to show if the range is NaN or Infinity, which happens + // if a profile doesn't have any samples or markers. + return ''; + } return formatSeconds(range.end - range.start, 3, 1); } diff --git a/src/components/app/ProfileViewer.js b/src/components/app/ProfileViewer.js index d2c71ee9f9..69b0ae1d34 100644 --- a/src/components/app/ProfileViewer.js +++ b/src/components/app/ProfileViewer.js @@ -110,7 +110,7 @@ class ProfileViewerImpl extends PureComponent { ); } @@ -246,16 +246,18 @@ class ZipFileViewerImpl extends React.PureComponent { switch (phase) { case 'NO_ZIP_FILE': console.error( - 'Loaded the ZipFileViewer component when there is no zip file.' + 'Loaded the ZipFileViewer component when there is no archive file.' + ); + return this._renderMessage( + Error: No archive file was found. ); - return this._renderMessage(Error: No zip file was found.); case 'LIST_FILES_IN_ZIP_FILE': return (

Firefox Profiler

-

Choose a profile from this zip file

+

Choose a profile from this archive

{ ); case 'PROCESS_PROFILE_FROM_ZIP_FILE': return this._renderMessage( - Loading the profile from the zip file... + Loading the profile from the archive... ); case 'FAILED_TO_PROCESS_PROFILE_FROM_ZIP_FILE': return this._renderMessage([ diff --git a/src/components/timeline/Selection.js b/src/components/timeline/Selection.js index bc96444dce..332efb3c26 100644 --- a/src/components/timeline/Selection.js +++ b/src/components/timeline/Selection.js @@ -347,6 +347,13 @@ class TimelineRulerAndSelection extends React.PureComponent { const { committedRange, width } = this.props; const { selectionStart, selectionEnd } = previewSelection; + if (!Number.isFinite(selectionStart) || !Number.isFinite(selectionEnd)) { + // Do not render the selection overlay if there is no data to display in + // the timeline. This prevents a crash on range selection if the profile + // is completely empty. + return null; + } + const beforeWidth = ((selectionStart - committedRange.start) / (committedRange.end - committedRange.start)) * @@ -429,6 +436,17 @@ class TimelineRulerAndSelection extends React.PureComponent { (committedRange.end - committedRange.start); } + let mousePosTimestamp = null; + if (mouseTimePosition !== null && Number.isFinite(mouseTimePosition)) { + // Only compute and display the timestamp when there is a mouse position + // and the position is not NaN or Infinity which is the case when there + // is no data in the timeline. + mousePosTimestamp = getFormattedTimeLength( + mouseTimePosition - zeroAt, + (committedRange.end - committedRange.start) / width + ); + } + return (
{ className="timelineSelectionHoverLine" style={{ visibility: - previewSelection.isModifying || hoverLocation === null + previewSelection.isModifying || + hoverLocation === null || + isNaN(hoverLocation) ? 'hidden' : undefined, left: hoverLocation === null ? '0' : `${hoverLocation}px`, }} > - {mouseTimePosition !== null - ? getFormattedTimeLength( - mouseTimePosition - zeroAt, - (committedRange.end - committedRange.start) / width - ) - : null} + {mousePosTimestamp}
diff --git a/src/profile-logic/processed-profile-versioning.js b/src/profile-logic/processed-profile-versioning.js index c46872d1cd..0f9145ce49 100644 --- a/src/profile-logic/processed-profile-versioning.js +++ b/src/profile-logic/processed-profile-versioning.js @@ -1983,7 +1983,7 @@ const _upgraders = { samples.stack = samples.stack.map((oldStackIndex) => oldStackIndex === null ? null - : mapForSamplingSelfStacks.get(oldStackIndex) ?? null + : (mapForSamplingSelfStacks.get(oldStackIndex) ?? null) ); markers.data.forEach((data) => { if (data && 'cause' in data && data.cause) { @@ -1994,7 +1994,7 @@ const _upgraders = { jsAllocations.stack = jsAllocations.stack.map((oldStackIndex) => oldStackIndex === null ? null - : mapForSyncBacktraces.get(oldStackIndex) ?? null + : (mapForSyncBacktraces.get(oldStackIndex) ?? null) ); } if (nativeAllocations !== undefined) { @@ -2002,7 +2002,7 @@ const _upgraders = { (oldStackIndex) => oldStackIndex === null ? null - : mapForSyncBacktraces.get(oldStackIndex) ?? null + : (mapForSyncBacktraces.get(oldStackIndex) ?? null) ); } } diff --git a/src/profile-logic/profile-data.js b/src/profile-logic/profile-data.js index 94f22830fa..59dc3cce65 100644 --- a/src/profile-logic/profile-data.js +++ b/src/profile-logic/profile-data.js @@ -82,6 +82,7 @@ import type { BottomBoxInfo, Bytes, ThreadWithReservedFunctions, + TabID, } from 'firefox-profiler/types'; import type { UniqueStringArray } from 'firefox-profiler/utils/unique-string-array'; @@ -2924,76 +2925,79 @@ export function filterToRetainedAllocations( } /** - * Extract the hostname and favicon from the first page if we are in single tab - * view. Currently we assume that we don't change the origin of webpages while - * profiling in web developer preset. That's why we are simply getting the first - * page we find that belongs to the active tab. Returns null if profiler is not - * in the single tab view at the moment. + * Extract the hostname and favicon from the last page for all tab ids. we + * assume that the user wants to know about the last loaded page in this tab. + * Returns null if we don't have information about pages (in older profiles). */ export function extractProfileFilterPageData( - pages: PageList | null, - relevantPages: Set -): ProfileFilterPageData | null { - if (relevantPages.size === 0 || pages === null) { - // Either we are not in single tab view, or we don't have pages array(which - // is the case for older profiles). Return early. - return null; - } - - // Getting the pages that are relevant and a top-most frame. - let filteredPages = pages.filter( - (page) => - // It's the top-most frame if `embedderInnerWindowID` is zero. - page.embedderInnerWindowID === 0 && relevantPages.has(page.innerWindowID) - ); - - if (filteredPages.length > 1) { - // If there are more than one top-most page, it's also good to filter out the - // `about:` pages so user can see their url they are actually profiling. - filteredPages = filteredPages.filter( - (page) => !page.url.startsWith('about:') + pagesMapByTabID: Map | null +): Map { + if (pagesMapByTabID === null) { + // We don't have pages array (which is the case for older profiles). Return early. + return new Map(); + } + + const pageDataByTabID = new Map(); + for (const [tabID, pages] of pagesMapByTabID) { + let topMostPages = pages.filter( + (page) => + // It's the top-most frame if `embedderInnerWindowID` is zero. + page.embedderInnerWindowID === 0 ); - } - if (filteredPages.length === 0) { - // There should be at least one relevant page. - console.error(`Expected a relevant page but couldn't find it.`); - return null; - } + if (topMostPages.length > 1) { + // If there are more than one top-most page, it's also good to filter out the + // `about:` pages so user can see their url they are actually profiling. + topMostPages = topMostPages.filter( + (page) => !page.url.startsWith('about:') + ); + } - const pageUrl = filteredPages[0].url; + if (topMostPages.length === 0) { + // There should be at least one topmost page. + console.error( + `Expected at least one topmost page for tabID ${tabID} but couldn't find it.` + ); + continue; + } - if (pageUrl.startsWith('about:')) { - // If we only have an `about:*` page, we should return early with a friendly - // origin and hostname. Otherwise the try block will fail. - return { - origin: pageUrl, - hostname: pageUrl, - favicon: null, - }; - } + // The last page is the one we care about. + const pageUrl = topMostPages[topMostPages.length - 1].url; + if (pageUrl.startsWith('about:')) { + // If we only have an `about:*` page, we should return early with a friendly + // origin and hostname. Otherwise the try block will always fail. + pageDataByTabID.set(tabID, { + origin: pageUrl, + hostname: pageUrl, + favicon: null, + }); + continue; + } - try { - const page = new URL(pageUrl); - // FIXME(Bug 1620546): This is not ideal and we should get the favicon - // either during profile capture or profile pre-process. - const favicon = new URL('/favicon.ico', page.origin); - if (favicon.protocol === 'http:') { - // Upgrade http requests. - favicon.protocol = 'https:'; + try { + const page = new URL(pageUrl); + // FIXME(Bug 1620546): This is not ideal and we should get the favicon + // either during profile capture or profile pre-process. + const favicon = new URL('/favicon.ico', page.origin); + if (favicon.protocol === 'http:') { + // Upgrade http requests. + favicon.protocol = 'https:'; + } + pageDataByTabID.set(tabID, { + origin: page.origin, + hostname: page.hostname, + favicon: favicon.href, + }); + } catch (e) { + console.error( + 'Error while extracing the hostname and favicon from the page url', + pageUrl + ); + continue; } - return { - origin: page.origin, - hostname: page.hostname, - favicon: favicon.href, - }; - } catch (e) { - console.error( - 'Error while extracing the hostname and favicon from the page url', - pageUrl - ); - return null; } + + return pageDataByTabID; } // Returns the resource index for a "url" or "webhost" resource which is created @@ -3679,3 +3683,86 @@ export function determineTimelineType(profile: Profile): TimelineType { // Have both category and CPU usage information. Use 'cpu-category'. return 'cpu-category'; } + +/** + * Compute a map of tab to thread indexes map. This is useful for learning which + * threads are involved for tabs. This is mainly used for the tab selector on + * the top left corner. + */ +export function computeTabToThreadIndexesMap( + threads: Thread[], + innerWindowIDToTabMap: Map | null +): Map> { + const tabToThreadIndexesMap = new Map(); + if (!innerWindowIDToTabMap) { + // There is no pages information in the profile, return an empty map. + return tabToThreadIndexesMap; + } + + // We need to iterate over all the samples and markers once to figure out + // which innerWindowIDs are present in each thread. This is probably not + // very cheap, but it'll allow us to not compute this information every + // time when we need it. + for (let threadIdx = 0; threadIdx < threads.length; threadIdx++) { + const thread = threads[threadIdx]; + + // First go over the innerWindowIDs of the samples. + for (let i = 0; i < thread.frameTable.length; i++) { + const innerWindowID = thread.frameTable.innerWindowID[i]; + if (innerWindowID === null) { + continue; + } + + const tabID = innerWindowIDToTabMap.get(innerWindowID); + if (tabID === undefined) { + // We couldn't find the tab of this innerWindowID, this should + // never happen, it might indicate a bug in Firefox. + console.warn( + `Failed to find the tabID of innerWindowID ${innerWindowID}` + ); + continue; + } + + let threadIndexes = tabToThreadIndexesMap.get(tabID); + if (!threadIndexes) { + threadIndexes = new Set(); + tabToThreadIndexesMap.set(tabID, threadIndexes); + } + threadIndexes.add(threadIdx); + } + + // Then go over the markers to find their innerWindowIDs. + for (let i = 0; i < thread.markers.length; i++) { + const markerData = thread.markers.data[i]; + + if (!markerData) { + continue; + } + + if ( + markerData.innerWindowID !== null && + markerData.innerWindowID !== undefined + ) { + const innerWindowID = markerData.innerWindowID; + const tabID = innerWindowIDToTabMap.get(innerWindowID); + if (tabID === undefined) { + // We couldn't find the tab of this innerWindowID, this should + // never happen, it might indicate a bug in Firefox. + console.warn( + `Failed to find the tabID of innerWindowID ${innerWindowID}` + ); + continue; + } + + let threadIndexes = tabToThreadIndexesMap.get(tabID); + if (!threadIndexes) { + threadIndexes = new Set(); + tabToThreadIndexesMap.set(tabID, threadIndexes); + } + threadIndexes.add(threadIdx); + } + } + } + + return tabToThreadIndexesMap; +} diff --git a/src/reducers/app.js b/src/reducers/app.js index 6af21fc20b..ac36d28ffc 100644 --- a/src/reducers/app.js +++ b/src/reducers/app.js @@ -140,6 +140,7 @@ const panelLayoutGeneration: Reducer = (state = 0, action) => { case 'TOGGLE_RESOURCES_PANEL': case 'ENABLE_EXPERIMENTAL_CPU_GRAPHS': case 'ENABLE_EXPERIMENTAL_PROCESS_CPU_TRACKS': + case 'CHANGE_TAB_FILTER': // Committed range changes: (fallthrough) case 'COMMIT_RANGE': case 'POP_COMMITTED_RANGES': diff --git a/src/reducers/url-state.js b/src/reducers/url-state.js index d08d0b906e..00b1d6b66a 100644 --- a/src/reducers/url-state.js +++ b/src/reducers/url-state.js @@ -24,6 +24,7 @@ import type { SourceViewState, AssemblyViewState, IsOpenPerPanelState, + TabID, } from 'firefox-profiler/types'; import type { TabSlug } from '../app-logic/tabs-handling'; @@ -508,6 +509,19 @@ const localTrackOrderChangedPids: Reducer> = ( } }; +/** + * This state controls whether or not we are filtering the full view for a + * specific Firefox tab. + */ +const tabFilter: Reducer = (state = null, action) => { + switch (action.type) { + case 'CHANGE_TAB_FILTER': + return action.tabID; + default: + return state; + } +}; + // If you update this reducer, please don't forget to update the profileName // reducer below as well. const pathInZipFile: Reducer = (state = null, action) => { @@ -671,6 +685,7 @@ const fullProfileSpecific = combineReducers({ localTrackOrderByPid, localTrackOrderChangedPids, showJsTracerSummary, + tabFilter, // The timeline tracks used to be hidden and sorted by thread indexes, rather than // track indexes. The only way to migrate this information to tracks-based data is to // first retrieve the profile, so they can't be upgraded by the normal url upgrading diff --git a/src/selectors/profile.js b/src/selectors/profile.js index d52692ca89..5a010873af 100644 --- a/src/selectors/profile.js +++ b/src/selectors/profile.js @@ -14,6 +14,7 @@ import { getFriendlyThreadName, processCounter, getInclusiveSampleIndexRangeForSelection, + computeTabToThreadIndexesMap, } from '../profile-logic/profile-data'; import { IPCMarkerCorrelations, @@ -347,6 +348,61 @@ function _createCounterSelectors(counterIndex: CounterIndex) { export const getIPCMarkerCorrelations: Selector = createSelector(getThreads, correlateIPCMarkers); +/** + * Returns an InnerWindowID -> Page map, so we can look up the page from inner + * window id quickly. Returns null if there are no pages in the profile. + */ +export const getInnerWindowIDToPageMap: Selector | null> = createSelector(getPageList, (pages) => { + if (!pages) { + // Return null if there are no pages. + return null; + } + + const innerWindowIDToPageMap: Map = new Map(); + for (const page of pages) { + innerWindowIDToPageMap.set(page.innerWindowID, page); + } + + return innerWindowIDToPageMap; +}); + +/** + * Returns an InnerWindowID -> TabID map, so we can find the TabID of a given + * innerWindowID quickly. Returns null if there are no pages in the profile. + */ +export const getInnerWindowIDToTabMap: Selector | null> = createSelector(getPageList, (pages) => { + if (!pages) { + // Return null if there are no pages. + return null; + } + + const innerWindowIDToTabMap: Map = new Map(); + for (const page of pages) { + innerWindowIDToTabMap.set(page.innerWindowID, page.tabID); + } + + return innerWindowIDToTabMap; +}); + +/** + * Return a map of tab to thread indexes map. This is useful for learning which + * threads are involved for tabs. This is mainly used for the tab selector on + * the top left corner. + */ +export const getTabToThreadIndexesMap: Selector>> = + createSelector( + getThreads, + getInnerWindowIDToTabMap, + (threads, innerWindowIDToTabMap) => + computeTabToThreadIndexesMap(threads, innerWindowIDToTabMap) + ); + /** * Tracks * @@ -653,27 +709,6 @@ export const getHiddenTrackCount: Selector = createSelector( } ); -/** - * Returns an InnerWindowID -> Page map, so we can look up the page from inner - * window id quickly. Returns null if there are no pages in the profile. - */ -export const getInnerWindowIDToPageMap: Selector | null> = createSelector(getPageList, (pages) => { - if (!pages) { - // Return null if there are no pages. - return null; - } - - const innerWindowIDToPageMap: Map = new Map(); - for (const page of pages) { - innerWindowIDToPageMap.set(page.innerWindowID, page); - } - - return innerWindowIDToPageMap; -}); - /** * Get the pages array and construct a Map of pages that we can use to get the * relationships of tabs. The constructed map is `Map`. @@ -696,36 +731,34 @@ export const getPagesMap: Selector | null> = createSelector( // Construction of TabID to Page array map. const pageMap: Map = new Map(); - const appendPageMap = (tabID, page) => { + + for (const page of pageList) { + // If this is an iframe, we recursively visit its parent. + const getTopMostParent = (item) => { + if (item.embedderInnerWindowID === 0) { + return item; + } + + // We are using a Map to make this more performant. + // It should be 1-2 loop iteration in 99% of the cases. + const parent = innerWindowIDToPageMap.get(item.embedderInnerWindowID); + if (parent !== undefined) { + return getTopMostParent(parent); + } + // This is very unlikely to happen. + return item; + }; + + const topMostParent = getTopMostParent(page); + + // Now we have the top most parent. We can append the pageMap. + const { tabID } = topMostParent; const tabEntry = pageMap.get(tabID); if (tabEntry === undefined) { pageMap.set(tabID, [page]); } else { tabEntry.push(page); } - }; - - for (const page of pageList) { - if (page.embedderInnerWindowID === undefined) { - // This is the top most page, which means the web page itself. - appendPageMap(page.tabID, page.innerWindowID); - } else { - // This is an iframe, we should find its parent to see find top most - // TabID, which is the tab ID for our case. - const getTopMostParent = (item) => { - // We are using a Map to make this more performant. - // It should be 1-2 loop iteration in 99% of the cases. - const parent = innerWindowIDToPageMap.get(item.embedderInnerWindowID); - if (parent !== undefined) { - return getTopMostParent(parent); - } - return item; - }; - - const parent = getTopMostParent(page); - // Now we have the top most parent. We can append the pageMap. - appendPageMap(parent.tabID, page); - } } return pageMap; @@ -837,18 +870,35 @@ export const getRelevantInnerWindowIDsForCurrentTab: Selector< ); /** - * Extracts the data of the first page on the tab filtered profile. - * Currently we assume that we don't change the origin of webpages while - * profiling in web developer preset. That's why we are simply getting the - * first page we find that belongs to the active tab. Returns null if profiler - * is not in the single tab view at the moment. + * Extract the hostname and favicon from the last page if we are in single tab + * Extract the hostname and favicon from the last page for all tab ids. we + * view. We assume that the user wants to know about the last loaded page in + * assume that the user wants to know about the last loaded page in this tab. + * this tab. + * returns an empty Map if we don't have information about pages (in older profiles). */ -export const getProfileFilterPageData: Selector = - createSelector( - getPageList, - getRelevantInnerWindowIDsForCurrentTab, - extractProfileFilterPageData - ); +export const getProfileFilterPageDataByTabID: Selector< + Map, +> = createSelector(getPagesMap, extractProfileFilterPageData); + +/** + * This returns the hostname and favicon information for the current tab id. + * Returns null if profiler is not in the single tab view at the moment. + * TODO: This is only used for the active tab view. Remove it later. + */ +export const getProfileFilterPageData: Selector< + ProfileFilterPageData | null, +> = (state) => { + const pageDataByTabID = getProfileFilterPageDataByTabID(state); + const activeTabID = getActiveTabID(state); + const timelineTrackOrganization = + UrlState.getTimelineTrackOrganization(state); + if (activeTabID === null || timelineTrackOrganization.type !== 'active-tab') { + return null; + } + + return pageDataByTabID.get(activeTabID) ?? null; +}; /** * Get the map of Thread ID -> Thread Name for easy access. diff --git a/src/selectors/url-state.js b/src/selectors/url-state.js index 3dcd067c0f..392b271ef3 100644 --- a/src/selectors/url-state.js +++ b/src/selectors/url-state.js @@ -34,6 +34,7 @@ import type { FullProfileSpecificUrlState, ActiveTabSpecificProfileUrlState, NativeSymbolInfo, + TabID, } from 'firefox-profiler/types'; import type { TabSlug } from '../app-logic/tabs-handling'; @@ -154,6 +155,10 @@ export const getHiddenLocalTracksByPid: Selector>> = ( export const getLocalTrackOrderByPid: Selector> = ( state ) => getFullProfileSpecificState(state).localTrackOrderByPid; +export const getTabFilter: Selector = (state) => + getFullProfileSpecificState(state).tabFilter; +export const hasTabFilter: Selector = (state) => + getTabFilter(state) !== null; /** * This selector does a simple lookup in the set of hidden tracks for a PID, and ensures diff --git a/src/test/components/Timeline.test.js b/src/test/components/Timeline.test.js index a5bfeb29a1..28e079ec14 100644 --- a/src/test/components/Timeline.test.js +++ b/src/test/components/Timeline.test.js @@ -48,6 +48,10 @@ import { getHumanReadableTracks, } from '../fixtures/profiles/tracks'; import { autoMockIntersectionObserver } from '../fixtures/mocks/intersection-observer'; +import { + getEmptyProfile, + getEmptyThread, +} from 'firefox-profiler/profile-logic/data-structures'; import type { Profile, ThreadIndex } from 'firefox-profiler/types'; @@ -1400,11 +1404,19 @@ describe('Timeline', function () { }); describe('TimelineSelection', () => { - function setup() { + function setup({ profileLength }: { profileLength: number } = {}) { const flushRafCalls = mockRaf(); - const profileLength = 10; - // There are 10 samples in this profile. - const { profile } = getProfileFromTextSamples('A '.repeat(profileLength)); + // Default to 10 samples in the profile. + profileLength = profileLength ?? 10; + let profile; + if (profileLength === 0) { + // Create an empty profile with a single thread since + // getProfileFromTextSamples doesn't like empty samples. + profile = getEmptyProfile(); + profile.threads = [getEmptyThread()]; + } else { + profile = getProfileFromTextSamples('A '.repeat(profileLength)).profile; + } // getBoundingClientRect is already mocked by autoMockElementSize. jest @@ -1485,4 +1497,16 @@ describe('TimelineSelection', () => { (TRACK_WIDTH * samplePosition) / profileLength ); }); + + it('does not crash when there are no samples or markers', () => { + const { moveMouseOnThreadCanvas } = setup({ profileLength: 0 }); + + // Hover over anywhere in the timeline to check if it'll crash. + moveMouseOnThreadCanvas({ + pageX: TRACK_WIDTH / 2, + pageY: TOP + 1, + }); + + expect(document.body).toMatchSnapshot(); + }); }); diff --git a/src/test/components/TrackBandwidth.test.js b/src/test/components/TrackBandwidth.test.js index ca60a91829..c6ee61d35e 100644 --- a/src/test/components/TrackBandwidth.test.js +++ b/src/test/components/TrackBandwidth.test.js @@ -209,6 +209,6 @@ describe('TrackBandwidth', function () { ); expect( screen.getByText(/current selection:/).nextSibling - ).toHaveTextContent('4.77MB\u2069 (\u20680.94\u2069 g CO₂e)'); + ).toHaveTextContent('4.77MB\u2069 (\u20680.93\u2069 g CO₂e)'); }); }); diff --git a/src/test/components/UrlManager.test.js b/src/test/components/UrlManager.test.js index 0159bc24ce..c63bd29711 100644 --- a/src/test/components/UrlManager.test.js +++ b/src/test/components/UrlManager.test.js @@ -41,6 +41,11 @@ describe('UrlManager', function () { } function setup(urlPath: ?string) { + jest + .spyOn(navigator, 'userAgent', 'get') + .mockReturnValue( + 'Mozilla/5.0 (X11; Linux x86_64; rv:131.0) Gecko/20100101 Firefox/131.0' + ); if (typeof urlPath === 'string') { window.location.replace(`http://localhost${urlPath}`); } diff --git a/src/test/components/WindowTitle.test.js b/src/test/components/WindowTitle.test.js index e5cc24a87a..c529a2f331 100644 --- a/src/test/components/WindowTitle.test.js +++ b/src/test/components/WindowTitle.test.js @@ -162,7 +162,7 @@ describe('WindowTitle', () => { ); - expect(document.title).toBe('Zip File Contents – Firefox Profiler'); + expect(document.title).toBe('Archive Contents – Firefox Profiler'); await act(() => store.dispatch( diff --git a/src/test/components/__snapshots__/Timeline.test.js.snap b/src/test/components/__snapshots__/Timeline.test.js.snap index c3fb07efb4..95001666a5 100644 --- a/src/test/components/__snapshots__/Timeline.test.js.snap +++ b/src/test/components/__snapshots__/Timeline.test.js.snap @@ -1,5 +1,278 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`TimelineSelection does not crash when there are no samples or markers 1`] = ` + +
+
+
+ +
+
    +
+
+
+
+
+
+
+
+
+
    +
  1. +
    +
    + +
    +
    +
    +
    +
    +
      +
    1. +
      +
      + +
      +
      +
      +
      +
      +
      + +
      +
      +
      +
      +
      + +

      + Activity Graph for + Empty +

      +

      + This graph shows a visual chart of thread activity. +

      +
      +
      +
      +
      +
      + +

      + Stack Graph for + Empty +

      +

      + This graph charts the stack height of each sample. +

      +
      +
      +
      +
      +
      +
      +
      +
    2. +
    +
  2. +
+
+
+
+ +
+ +
+ +`; + exports[`TimelineSelection renders the vertical line indicating the time position from the mouse cursor 1`] = `
diff --git a/src/test/components/__snapshots__/TrackBandwidth.test.js.snap b/src/test/components/__snapshots__/TrackBandwidth.test.js.snap index 878210884d..5769a4627b 100644 --- a/src/test/components/__snapshots__/TrackBandwidth.test.js.snap +++ b/src/test/components/__snapshots__/TrackBandwidth.test.js.snap @@ -37,7 +37,7 @@ exports[`TrackBandwidth has a tooltip that matches the snapshot 1`] = ` Data transferred up to this time :
- ⁨6.86MB⁩ (⁨1.4⁩ g CO₂e) + ⁨6.86MB⁩ (⁨1.3⁩ g CO₂e)
diff --git a/src/test/components/__snapshots__/ZipFileTree.test.js.snap b/src/test/components/__snapshots__/ZipFileTree.test.js.snap index 0d2794a398..7b6d7d3137 100644 --- a/src/test/components/__snapshots__/ZipFileTree.test.js.snap +++ b/src/test/components/__snapshots__/ZipFileTree.test.js.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`calltree/ZipFileTree clicking on a profile link kicks off the profile loading process when clicked 1`] = `"Loading the profile from the zip file..."`; +exports[`calltree/ZipFileTree clicking on a profile link kicks off the profile loading process when clicked 1`] = `"Loading the profile from the archive..."`; exports[`calltree/ZipFileTree renders a zip file tree 1`] = `

- Choose a profile from this zip file + Choose a profile from this archive

Inverted - * 0-10-20-30-40-50-60-70-80-90-91 0-10-20-30-40-50-60-70-80-90-91 <- Timing (ms) - * ================================ ================================ - * 0P 0P 0P 0P 0P 0P 0P 0P 0P 0P | 1P 2P 2P 3P 0P 1P 4J 5P 8J 4J - * 1P 1P 1P 1P 1P 1P 1P 1P 1P | 0P 1P 1P 1P 0P 1P 4P 7P 1P - * 2P 2P 3P 4J 4J 4J 4J | 0P 0P 0P 0P 1J 6P 0P - * 5J 5J | 0P 5J - * 6P | 4J - * 7P | 1P - * 8J | 0P - */ - - it('can handle inverted stacks', function () { - const store = storeWithProfile(); - store.dispatch(changeInvertCallstack(true)); - const stackTimingByDepth = selectedThreadSelectors.getStackTimingByDepth( - store.getState() - ); - expect(stackTimingByDepth).toEqual([ - { - start: [0, 10, 30, 40, 50, 60, 70, 80, 90], - end: [10, 30, 40, 50, 60, 70, 80, 90, 91], - callNode: [0, 2, 5, 8, 0, 9, 12, 16, 9], - length: 9, - }, - { - start: [0, 10, 30, 50, 60, 70, 80, 90], - end: [10, 30, 40, 60, 70, 80, 90, 91], - callNode: [1, 3, 6, 1, 10, 13, 17, 10], - length: 8, - }, - { - start: [10, 30, 60, 70, 80, 90], - end: [30, 40, 70, 80, 90, 91], - callNode: [4, 7, 11, 14, 18, 11], - length: 6, - }, - { - start: [70, 80], - end: [80, 90], - callNode: [15, 19], - length: 2, - }, - { start: [80], end: [90], callNode: [20], length: 1 }, - { start: [80], end: [90], callNode: [21], length: 1 }, - { start: [80], end: [90], callNode: [22], length: 1 }, - ]); - }); }); describe('selectors/getFlameGraphTiming', function () { diff --git a/src/test/store/profile-view.test.js b/src/test/store/profile-view.test.js index 92fec9d6a1..97905b63c1 100644 --- a/src/test/store/profile-view.test.js +++ b/src/test/store/profile-view.test.js @@ -19,6 +19,7 @@ import { addActiveTabInformationToProfile, getProfileWithEventDelays, getProfileWithThreadCPUDelta, + getThreadWithMarkers, } from '../fixtures/profiles/processed-profile'; import { getEmptyThread, @@ -3494,6 +3495,143 @@ describe('pages and active tab selectors', function () { ProfileViewSelectors.getRelevantInnerWindowIDsForCurrentTab(getState()) ).toEqual(new Set()); }); + + it('getTabToThreadIndexesMap will construct an empty map if the threads is empty', function () { + const { profile } = addActiveTabInformationToProfile( + getEmptyProfile(), + firstTabTabID + ); + // Adding an empty thread to the profile so the loadProfile function won't complain + profile.threads.push(getEmptyThread()); + const { getState } = storeWithProfile(profile); + + // The profile doesn't have any samples or markers. It should produce an empty map. + expect(ProfileViewSelectors.getTabToThreadIndexesMap(getState())).toEqual( + new Map() + ); + }); + + it('getTabToThreadIndexesMap will construct a correct map if the thread has samples with innerWindowIDs', function () { + const { profile, ...pageInfo } = addActiveTabInformationToProfile( + getEmptyProfile(), + firstTabTabID + ); + // Add 3 threads to add some samples. + profile.threads = [getEmptyThread(), getEmptyThread(), getEmptyThread()]; + + // Add some frames with innerWindowIDs now. Note that we only expand the + // innerWindowID array and not the others as we don't check them at all. + // + // Thread 0 and 1 will be present in firstTabTabID. + // Thread 1 and 2 will be present in secondTabTabID. + profile.threads[0].frameTable.innerWindowID[0] = + pageInfo.parentInnerWindowIDsWithChildren; + profile.threads[0].frameTable.length++; + + profile.threads[1].frameTable.innerWindowID[0] = + pageInfo.firstTabInnerWindowIDs[2]; + profile.threads[1].frameTable.length++; + profile.threads[1].frameTable.innerWindowID[1] = + pageInfo.secondTabInnerWindowIDs[0]; + profile.threads[1].frameTable.length++; + + profile.threads[2].frameTable.innerWindowID[0] = + pageInfo.secondTabInnerWindowIDs[1]; + profile.threads[2].frameTable.length++; + + const { getState } = storeWithProfile(profile); + + // It should match the new map of: + // Thread 0 and 1 will be present in firstTabTabID. + // Thread 1 and 2 will be present in secondTabTabID. + const result = [ + [pageInfo.firstTabTabID, new Set([0, 1])], + [pageInfo.secondTabTabID, new Set([1, 2])], + ]; + expect(ProfileViewSelectors.getTabToThreadIndexesMap(getState())).toEqual( + new Map(result) + ); + }); + + it('getTabToThreadIndexesMap will construct a correct map if the thread has markers with innerWindowIDs', function () { + const { profile, ...pageInfo } = addActiveTabInformationToProfile( + getEmptyProfile(), + firstTabTabID + ); + // Add 3 threads to add some samples. + // profile.threads = [getEmptyThread(), getEmptyThread(), getEmptyThread()]; + + // Add some frames with innerWindowIDs now. Note that we only expand the + // innerWindowID array and not the others as we don't check them at all. + // + // Thread 0 and 1 will be present in firstTabTabID. + // Thread 1 and 2 will be present in secondTabTabID. + profile.threads.push( + getThreadWithMarkers([ + [ + 'Test 1', + 1, + null, + { + type: 'tracing', + category: 'Navigation', + innerWindowID: pageInfo.parentInnerWindowIDsWithChildren, + }, + ], + ]) + ); + profile.threads.push( + getThreadWithMarkers([ + [ + 'Test 2', + 1, + null, + { + type: 'tracing', + category: 'Navigation', + innerWindowID: pageInfo.firstTabInnerWindowIDs[2], + }, + ], + [ + 'Test 3', + 2, + null, + { + type: 'tracing', + category: 'Navigation', + innerWindowID: pageInfo.secondTabInnerWindowIDs[0], + }, + ], + ]) + ); + profile.threads.push( + getThreadWithMarkers([ + [ + 'Test 4', + 1, + null, + { + type: 'tracing', + category: 'Navigation', + innerWindowID: pageInfo.secondTabInnerWindowIDs[1], + }, + ], + ]) + ); + + const { getState } = storeWithProfile(profile); + + // It should match the new map of: + // Thread 0 and 1 will be present in firstTabTabID. + // Thread 1 and 2 will be present in secondTabTabID. + const result = [ + [pageInfo.firstTabTabID, new Set([0, 1])], + [pageInfo.secondTabTabID, new Set([1, 2])], + ]; + expect(ProfileViewSelectors.getTabToThreadIndexesMap(getState())).toEqual( + new Map(result) + ); + }); }); describe('traced timing', function () { diff --git a/src/test/unit/__snapshots__/window-console.test.js.snap b/src/test/unit/__snapshots__/window-console.test.js.snap index e9b91bf42a..f52d898f52 100644 --- a/src/test/unit/__snapshots__/window-console.test.js.snap +++ b/src/test/unit/__snapshots__/window-console.test.js.snap @@ -13,11 +13,11 @@ Array [ | \\\\ / | | '_ \\\\| '__/ _ \\\\| _| | |/ _ \\\\ '_| |/ \\\\ _ / \\\\| | |_) | | | (_) | | | | | __/ | | | | .__/|_| \\\\___/|_| |_|_|\\\\___|_| - / - - \\\\ |_| - ,- V__V -. - -= __- * - .,=- - \`\\\\_ - _/ - \`-----' ", + / - - \\\\ |_| + ,- V__V -. + -= __- * - .,=- + \`\\\\_ - _/ + \`-----' ", "font-family: Menlo, monospace;", ], Array [ @@ -26,6 +26,7 @@ Array [ %cwindow.profile%c - The currently loaded profile %cwindow.filteredThread%c - The current filtered thread %cwindow.filteredMarkers%c - The current filtered and processed markers +%cwindow.selectedMarker%c - The selected processed marker in the current thread %cwindow.callTree%c - The call tree of the current filtered thread %cwindow.getState%c - The function that returns the current Redux state. %cwindow.selectors%c - All the selectors that are used to get data from the Redux state. @@ -34,6 +35,8 @@ Array [ %cwindow.experimental%c - The object that holds flags of all the experimental features. %cwindow.togglePseudoLocalization%c - Enable pseudo localizations by passing \\"accented\\" or \\"bidi\\" to this function, or disable using no parameters. %cwindow.toggleTimelineType%c - Toggle timeline graph type by passing \\"cpu-category\\", \\"category\\", or \\"stack\\". +%cwindow.retrieveRawProfileDataFromBrowser%c - Retrieve the profile attached to the current tab and returns it. Use \\"await\\" to call it. +%cwindow.saveToDisk%c - Saves to a file the parameter passed to it, with an optional filename parameter. You can use that to save the profile returned by \\"retrieveRawProfileDataFromBrowser\\". The profile format is documented here: %chttps://github.com/firefox-devtools/profiler/blob/main/docs-developer/processed-profile-format.md%c @@ -64,6 +67,12 @@ The CallTree class's source code is available here: "", "font-weight: bold;", "", + "font-weight: bold;", + "", + "font-weight: bold;", + "", + "font-weight: bold;", + "", "font-style: italic; text-decoration: underline;", "", "font-style: italic; text-decoration: underline;", diff --git a/src/test/unit/profile-data.test.js b/src/test/unit/profile-data.test.js index 5eff9f333f..ba75a95ad6 100644 --- a/src/test/unit/profile-data.test.js +++ b/src/test/unit/profile-data.test.js @@ -859,213 +859,434 @@ describe('convertStackToCallNodeAndCategoryPath', function () { }); describe('getSamplesSelectedStates', function () { - const { - profile, - funcNamesDictPerThread: [{ A, B, D, E, F }], - } = getProfileFromTextSamples(` - A A A A A - B D B D D - C E F G - `); - const thread = profile.threads[0]; - const callNodeInfo = getCallNodeInfo( - thread.stackTable, - thread.frameTable, - thread.funcTable, - 0 - ); - const stackIndexToCallNodeIndex = - callNodeInfo.getStackIndexToNonInvertedCallNodeIndex(); - const sampleCallNodes = getSampleIndexToCallNodeIndex( - thread.samples.stack, - stackIndexToCallNodeIndex - ); - - const A_B = callNodeInfo.getCallNodeIndexFromPath([A, B]); - const A_B_F = callNodeInfo.getCallNodeIndexFromPath([A, B, F]); - const A_D = callNodeInfo.getCallNodeIndexFromPath([A, D]); - const A_D_E = callNodeInfo.getCallNodeIndexFromPath([A, D, E]); - - it('determines the selection status of all the samples', function () { - expect( - getSamplesSelectedStates( - callNodeInfo, - sampleCallNodes, - sampleCallNodes, - A_B - ) - ).toEqual([ - 'SELECTED', - 'UNSELECTED_ORDERED_AFTER_SELECTED', - 'SELECTED', - 'UNSELECTED_ORDERED_AFTER_SELECTED', - 'UNSELECTED_ORDERED_AFTER_SELECTED', - ]); - expect( - getSamplesSelectedStates( - callNodeInfo, - sampleCallNodes, - sampleCallNodes, - A_D - ) - ).toEqual([ - 'UNSELECTED_ORDERED_BEFORE_SELECTED', - 'SELECTED', - 'UNSELECTED_ORDERED_BEFORE_SELECTED', - 'SELECTED', - 'SELECTED', - ]); - expect( - getSamplesSelectedStates( - callNodeInfo, - sampleCallNodes, - sampleCallNodes, - A_B_F - ) - ).toEqual([ - 'UNSELECTED_ORDERED_BEFORE_SELECTED', - 'UNSELECTED_ORDERED_AFTER_SELECTED', - 'SELECTED', - 'UNSELECTED_ORDERED_AFTER_SELECTED', - 'UNSELECTED_ORDERED_AFTER_SELECTED', - ]); - expect( - getSamplesSelectedStates( - callNodeInfo, - sampleCallNodes, - sampleCallNodes, - A_D_E - ) - ).toEqual([ - 'UNSELECTED_ORDERED_BEFORE_SELECTED', - 'SELECTED', - 'UNSELECTED_ORDERED_BEFORE_SELECTED', - 'UNSELECTED_ORDERED_AFTER_SELECTED', - 'UNSELECTED_ORDERED_BEFORE_SELECTED', - ]); + function setup(textSamples) { + const { + profile, + funcNamesDictPerThread: [funcNamesDict], + } = getProfileFromTextSamples(textSamples); + const thread = profile.threads[0]; + const callNodeInfo = getCallNodeInfo( + thread.stackTable, + thread.frameTable, + thread.funcTable, + 0 + ); + const stackIndexToCallNodeIndex = + callNodeInfo.getStackIndexToNonInvertedCallNodeIndex(); + const sampleCallNodes = getSampleIndexToCallNodeIndex( + thread.samples.stack, + stackIndexToCallNodeIndex + ); + + const categories = ensureExists( + profile.meta.categories, + 'Expected to find categories' + ); + const defaultCategory = categories.findIndex((c) => c.name === 'Other'); + const callNodeInfoInverted = getInvertedCallNodeInfo( + thread, + callNodeInfo.getNonInvertedCallNodeTable(), + stackIndexToCallNodeIndex, + defaultCategory + ); + const stackIndexToInvertedCallNodeIndex = + callNodeInfoInverted.getStackIndexToCallNodeIndex(); + const sampleInvertedCallNodes = getSampleIndexToCallNodeIndex( + thread.samples.stack, + stackIndexToInvertedCallNodeIndex + ); + + return { + callNodeInfo, + callNodeInfoInverted, + sampleInvertedCallNodes, + sampleCallNodes, + funcNamesDict, + }; + } + + describe('non-inverted', function () { + const { + callNodeInfo, + sampleCallNodes, + funcNamesDict: { A, B, D, E, F }, + } = setup(` + A A A A A + B D B D D + C E F G + `); + + const A_B = callNodeInfo.getCallNodeIndexFromPath([A, B]); + const A_B_F = callNodeInfo.getCallNodeIndexFromPath([A, B, F]); + const A_D = callNodeInfo.getCallNodeIndexFromPath([A, D]); + const A_D_E = callNodeInfo.getCallNodeIndexFromPath([A, D, E]); + + it('determines the selection status of all the samples', function () { + expect( + getSamplesSelectedStates( + callNodeInfo, + sampleCallNodes, + sampleCallNodes, + A_B + ) + ).toEqual([ + 'SELECTED', + 'UNSELECTED_ORDERED_AFTER_SELECTED', + 'SELECTED', + 'UNSELECTED_ORDERED_AFTER_SELECTED', + 'UNSELECTED_ORDERED_AFTER_SELECTED', + ]); + expect( + getSamplesSelectedStates( + callNodeInfo, + sampleCallNodes, + sampleCallNodes, + A_D + ) + ).toEqual([ + 'UNSELECTED_ORDERED_BEFORE_SELECTED', + 'SELECTED', + 'UNSELECTED_ORDERED_BEFORE_SELECTED', + 'SELECTED', + 'SELECTED', + ]); + expect( + getSamplesSelectedStates( + callNodeInfo, + sampleCallNodes, + sampleCallNodes, + A_B_F + ) + ).toEqual([ + 'UNSELECTED_ORDERED_BEFORE_SELECTED', + 'UNSELECTED_ORDERED_AFTER_SELECTED', + 'SELECTED', + 'UNSELECTED_ORDERED_AFTER_SELECTED', + 'UNSELECTED_ORDERED_AFTER_SELECTED', + ]); + expect( + getSamplesSelectedStates( + callNodeInfo, + sampleCallNodes, + sampleCallNodes, + A_D_E + ) + ).toEqual([ + 'UNSELECTED_ORDERED_BEFORE_SELECTED', + 'SELECTED', + 'UNSELECTED_ORDERED_BEFORE_SELECTED', + 'UNSELECTED_ORDERED_AFTER_SELECTED', + 'UNSELECTED_ORDERED_BEFORE_SELECTED', + ]); + }); + + it('can sort the samples based on their selection status', function () { + const comparator = getTreeOrderComparator(sampleCallNodes); + const samples = [4, 1, 3, 0, 2]; // some random order + samples.sort(comparator); + expect(samples).toEqual([0, 2, 4, 1, 3]); + expect(comparator(0, 0)).toBe(0); + expect(comparator(1, 1)).toBe(0); + expect(comparator(4, 4)).toBe(0); + expect(comparator(0, 2)).toBeLessThan(0); + expect(comparator(2, 0)).toBeGreaterThan(0); + }); }); - it('can sort the samples based on their selection status', function () { - const comparator = getTreeOrderComparator(sampleCallNodes); - const samples = [4, 1, 3, 0, 2]; // some random order - samples.sort(comparator); - expect(samples).toEqual([0, 2, 4, 1, 3]); - expect(comparator(0, 0)).toBe(0); - expect(comparator(1, 1)).toBe(0); - expect(comparator(4, 4)).toBe(0); - expect(comparator(0, 2)).toBeLessThan(0); - expect(comparator(2, 0)).toBeGreaterThan(0); + describe('inverted', function () { + /** + * - [cn0] A = A + * - [cn1] B = A -> B + * - [cn2] A = A -> B -> A + * - [cn3] C = A -> B -> C + * - [cn4] A = A -> A + * - [cn5] B = A -> A -> B + * - [cn6] C = A -> C + * + * + * - [in0] A + * - [in1] A + * - [in2] B + * - [in3] A + * - [in4] B + * - [in5] A + * - [in6] A + * - [in7] C + * - [in8] A + * - [in9] B + * - [in10] A + * */ + const { + callNodeInfoInverted, + sampleInvertedCallNodes, + funcNamesDict: { A, B, C }, + } = setup(` + A A A A A A A + A B B C B A + A C B + `); + + const inBA = callNodeInfoInverted.getCallNodeIndexFromPath([B, A]); + const inCBA = callNodeInfoInverted.getCallNodeIndexFromPath([C, B, A]); + const inB = callNodeInfoInverted.getCallNodeIndexFromPath([B]); + + // 0 1 2 3 4 5 6 + // A A A A A A A + // A B B C B A + // A C B + + it('determines the selection status of all the samples', function () { + // Test B <- A <- ... + // Only samples 2 and 6 have stacks ending in ... -> A -> B + expect( + getSamplesSelectedStates( + callNodeInfoInverted, + sampleInvertedCallNodes, + sampleInvertedCallNodes, + inBA + ) + ).toEqual([ + 'UNSELECTED_ORDERED_BEFORE_SELECTED', + 'UNSELECTED_ORDERED_BEFORE_SELECTED', + 'SELECTED', + 'UNSELECTED_ORDERED_BEFORE_SELECTED', + 'UNSELECTED_ORDERED_AFTER_SELECTED', + 'UNSELECTED_ORDERED_AFTER_SELECTED', + 'SELECTED', + ]); + // Test C <- B <- A <- ... + // Only sample 5 has a stack ending in ... -> A -> B -> C + expect( + getSamplesSelectedStates( + callNodeInfoInverted, + sampleInvertedCallNodes, + sampleInvertedCallNodes, + inCBA + ) + ).toEqual([ + 'UNSELECTED_ORDERED_BEFORE_SELECTED', + 'UNSELECTED_ORDERED_BEFORE_SELECTED', + 'UNSELECTED_ORDERED_BEFORE_SELECTED', + 'UNSELECTED_ORDERED_BEFORE_SELECTED', + 'UNSELECTED_ORDERED_BEFORE_SELECTED', + 'SELECTED', + 'UNSELECTED_ORDERED_BEFORE_SELECTED', + ]); + // Test B <- ... + // Only samples 2 and 6 have stacks ending in ... -> B + expect( + getSamplesSelectedStates( + callNodeInfoInverted, + sampleInvertedCallNodes, + sampleInvertedCallNodes, + inB + ) + ).toEqual([ + 'UNSELECTED_ORDERED_BEFORE_SELECTED', + 'UNSELECTED_ORDERED_BEFORE_SELECTED', + 'SELECTED', + 'UNSELECTED_ORDERED_BEFORE_SELECTED', + 'UNSELECTED_ORDERED_AFTER_SELECTED', + 'UNSELECTED_ORDERED_AFTER_SELECTED', + 'SELECTED', + ]); + }); + + it('can sort the samples based on their selection status', function () { + const comparator = getTreeOrderComparator(sampleInvertedCallNodes); + + /** + * original order (non-inverted): + * 0 1 2 3 4 5 6 + * A A A A A A A + * A B B C B A + * A C B + * + * sorted order ("inverted" if you read from bottom to top): + * A A A + * A B A A A B + * A A A B B C C + * 0 1 3 2 6 4 5 + */ + + // A should come before A <- B. + expect(comparator(0, 2)).toBeLessThan(0); + expect(comparator(2, 0)).toBeGreaterThan(0); + + // A <- A should come before A <- B. + expect(comparator(1, 2)).toBeLessThan(0); + expect(comparator(2, 1)).toBeGreaterThan(0); + + // Sort a random order of samples, make sure it's correct. + const samples = [5, 6, 0, 1, 2, 3, 4]; + samples.sort(comparator); + expect(samples).toEqual([0, 1, 3, 2, 6, 4, 5]); + + // The same sample index should always compare equally. + expect(comparator(0, 0)).toBe(0); + expect(comparator(1, 1)).toBe(0); + expect(comparator(4, 4)).toBe(0); + }); }); }); describe('extractProfileFilterPageData', function () { - const innerWindowIds = { - mozilla: 1, - aboutBlank: 2, - profiler: 3, - exampleSubFrame: 4, - unknown: 5, - }; - // This is the `profile.pages` array. - const pages = [ - { + const pages = { + mozilla: { tabID: 1111, - innerWindowID: innerWindowIds.mozilla, + innerWindowID: 1, url: 'https://www.mozilla.org', embedderInnerWindowID: 0, }, - { + aboutBlank: { tabID: 2222, - innerWindowID: innerWindowIds.aboutBlank, + innerWindowID: 2, url: 'about:blank', embedderInnerWindowID: 0, }, - { + profiler: { tabID: 2222, - innerWindowID: innerWindowIds.profiler, + innerWindowID: 3, url: 'https://profiler.firefox.com/public/xyz', embedderInnerWindowID: 0, }, - { + exampleSubFrame: { tabID: 2222, - innerWindowID: innerWindowIds.exampleSubFrame, + innerWindowID: 4, url: 'https://example.com/subframe', // This is a subframe of the page above. - embedderInnerWindowID: innerWindowIds.profiler, + embedderInnerWindowID: 3, }, - ]; + exampleTopFrame: { + tabID: 2222, + innerWindowID: 5, + url: 'https://example.com', + embedderInnerWindowID: 0, + }, + }; it('extracts the page data when there is only one relevant page', function () { // Adding only the https://www.mozilla.org page. - const relevantPages = new Set([innerWindowIds.mozilla]); - - const pageData = extractProfileFilterPageData(pages, relevantPages); - expect(pageData).toEqual({ - origin: 'https://www.mozilla.org', - hostname: 'www.mozilla.org', - favicon: 'https://www.mozilla.org/favicon.ico', - }); + const pagesMap = new Map([[pages.mozilla.tabID, [pages.mozilla]]]); + const pageData = extractProfileFilterPageData(pagesMap); + expect([...pageData]).toEqual([ + [ + pages.mozilla.tabID, + { + origin: 'https://www.mozilla.org', + hostname: 'www.mozilla.org', + favicon: 'https://www.mozilla.org/favicon.ico', + }, + ], + ]); }); it('extracts the page data when there are multiple relevant page', function () { - const relevantPages = new Set([ - innerWindowIds.profiler, - innerWindowIds.exampleSubFrame, + const pagesMap = new Map([ + [pages.profiler.tabID, [pages.profiler, pages.exampleSubFrame]], ]); - const pageData = extractProfileFilterPageData(pages, relevantPages); - expect(pageData).toEqual({ - origin: 'https://profiler.firefox.com', - hostname: 'profiler.firefox.com', - favicon: 'https://profiler.firefox.com/favicon.ico', - }); + const pageData = extractProfileFilterPageData(pagesMap); + expect([...pageData]).toEqual([ + [ + pages.profiler.tabID, + { + origin: 'https://profiler.firefox.com', + hostname: 'profiler.firefox.com', + favicon: 'https://profiler.firefox.com/favicon.ico', + }, + ], + ]); }); it('extracts the page data when there are multiple relevant page with about:blank', function () { - const relevantPages = new Set([ - innerWindowIds.aboutBlank, - innerWindowIds.profiler, + const pagesMap = new Map([ + [pages.profiler.tabID, [pages.aboutBlank, pages.profiler]], ]); - const pageData = extractProfileFilterPageData(pages, relevantPages); - expect(pageData).toEqual({ - origin: 'https://profiler.firefox.com', - hostname: 'profiler.firefox.com', - favicon: 'https://profiler.firefox.com/favicon.ico', - }); + const pageData = extractProfileFilterPageData(pagesMap); + expect([...pageData]).toEqual([ + [ + pages.profiler.tabID, + { + origin: 'https://profiler.firefox.com', + hostname: 'profiler.firefox.com', + favicon: 'https://profiler.firefox.com/favicon.ico', + }, + ], + ]); }); it('extracts the page data when there is only about:blank as relevant page', function () { - const relevantPages = new Set([innerWindowIds.aboutBlank]); - - const pageData = extractProfileFilterPageData(pages, relevantPages); - expect(pageData).toEqual({ - origin: 'about:blank', - hostname: 'about:blank', - favicon: null, - }); + const pagesMap = new Map([[pages.aboutBlank.tabID, [pages.aboutBlank]]]); + + const pageData = extractProfileFilterPageData(pagesMap); + expect([...pageData]).toEqual([ + [ + pages.aboutBlank.tabID, + { + origin: 'about:blank', + hostname: 'about:blank', + favicon: null, + }, + ], + ]); }); - it('fails to extract the page data when there is no profile data in common', function () { + it('fails to extract the page data when there is only a sub frame', function () { // Ignore the error we output when it fails. jest.spyOn(console, 'error').mockImplementation(() => {}); - const relevantPages = new Set([innerWindowIds.unknown]); - - const pageData = extractProfileFilterPageData(pages, relevantPages); + const pagesMap = new Map([ + [pages.exampleSubFrame.tabID, [pages.exampleSubFrame]], + ]); - expect(pageData).toEqual(null); + const pageData = extractProfileFilterPageData(pagesMap); + expect([...pageData]).toEqual([]); expect(console.error).toHaveBeenCalled(); }); - it('fails to extract the page data when there is only a sub frame', function () { - // Ignore the error we output when it fails. - jest.spyOn(console, 'error').mockImplementation(() => {}); - const relevantPages = new Set([innerWindowIds.exampleSubFrame]); + it('extracts the page data of the last frame when there are multiple relevant pages', function () { + const pagesMap = new Map([ + [pages.profiler.tabID, [pages.profiler, pages.exampleTopFrame]], + ]); - const pageData = extractProfileFilterPageData(pages, relevantPages); + const pageData = extractProfileFilterPageData(pagesMap); + expect([...pageData]).toEqual([ + [ + pages.profiler.tabID, + { + origin: 'https://example.com', + hostname: 'example.com', + favicon: 'https://example.com/favicon.ico', + }, + ], + ]); + }); - expect(pageData).toEqual(null); - expect(console.error).toHaveBeenCalled(); + it('can extract the data of several tabs', function () { + const pagesMap = new Map([ + [pages.mozilla.tabID, [pages.mozilla]], + [pages.profiler.tabID, [pages.profiler, pages.exampleSubFrame]], + ]); + const pageData = extractProfileFilterPageData(pagesMap); + expect([...pageData]).toEqual([ + [ + pages.mozilla.tabID, + { + origin: 'https://www.mozilla.org', + hostname: 'www.mozilla.org', + favicon: 'https://www.mozilla.org/favicon.ico', + }, + ], + [ + pages.profiler.tabID, + { + origin: 'https://profiler.firefox.com', + hostname: 'profiler.firefox.com', + favicon: 'https://profiler.firefox.com/favicon.ico', + }, + ], + ]); }); }); diff --git a/src/test/url-handling.test.js b/src/test/url-handling.test.js index 0bdd51510f..3fffcbea50 100644 --- a/src/test/url-handling.test.js +++ b/src/test/url-handling.test.js @@ -21,7 +21,11 @@ import { updateBottomBoxContentsAndMaybeOpen, closeBottomBox, } from '../actions/profile-view'; -import { changeSelectedTab, changeProfilesToCompare } from '../actions/app'; +import { + changeSelectedTab, + changeProfilesToCompare, + changeTabFilter, +} from '../actions/app'; import { stateFromLocation, getQueryStringFromUrlState, @@ -1984,3 +1988,58 @@ describe('URL persistence of bottom box (source view and assembly view)', functi ).toBeFalse(); }); }); + +describe('tab selector', function () { + function setup() { + const store = _getStoreWithURL(); + return store; + } + + it('can serialize the tabFilter properly', function () { + const { dispatch, getState } = setup(); + + // Change the tab filter. + let tabID = 123; + dispatch(changeTabFilter(tabID)); + + // Check if the state update happened properly. + expect(urlStateSelectors.getTabFilter(getState())).toBe(tabID); + expect(urlStateSelectors.hasTabFilter(getState())).toBe(true); + + // Check if the URL update happened properly. + let queryString = getQueryStringFromState(getState()); + expect(queryString).toContain(`tabID=${tabID}`); + + // Change it again and check. + tabID = 321; + dispatch(changeTabFilter(tabID)); + expect(urlStateSelectors.getTabFilter(getState())).toBe(tabID); + expect(urlStateSelectors.hasTabFilter(getState())).toBe(true); + queryString = getQueryStringFromState(getState()); + expect(queryString).toContain(`tabID=${tabID}`); + }); + + it('null value does not appear in the url', function () { + const { dispatch, getState } = setup(); + + // Change the tab filter. + const tabID = null; + dispatch(changeTabFilter(tabID)); + + // Check if the URL update happened properly. + expect(urlStateSelectors.getTabFilter(getState())).toBe(tabID); + expect(urlStateSelectors.hasTabFilter(getState())).toBe(false); + + // Make sure that null tabID is not present in the URL. + const queryString = getQueryStringFromState(getState()); + expect(queryString).not.toContain('tabID'); + }); + + it('can unserialize the tabFilter from URLs', () => { + const tabID = 123; + const { getState } = _getStoreWithURL({ search: `?tabID=${tabID}` }); + + expect(urlStateSelectors.getTabFilter(getState())).toEqual(tabID); + expect(urlStateSelectors.hasTabFilter(getState())).toEqual(true); + }); +}); diff --git a/src/types/actions.js b/src/types/actions.js index 8287529d4c..0bdd85e222 100644 --- a/src/types/actions.js +++ b/src/types/actions.js @@ -557,6 +557,10 @@ type UrlStateAction = +type: 'TOGGLE_SIDEBAR_OPEN_CATEGORY', +kind: string, +category: IndexIntoCategoryList, + |} + | {| + +type: 'CHANGE_TAB_FILTER', + +tabID: TabID | null, |}; type IconsAction = diff --git a/src/types/state.js b/src/types/state.js index f85dcb5d6d..67a8384a77 100644 --- a/src/types/state.js +++ b/src/types/state.js @@ -355,6 +355,7 @@ export type FullProfileSpecificUrlState = {| localTrackOrderByPid: Map, localTrackOrderChangedPids: Set, showJsTracerSummary: boolean, + tabFilter: TabID | null, legacyThreadOrder: ThreadIndex[] | null, legacyHiddenThreads: ThreadIndex[] | null, |}; diff --git a/src/utils/window-console.js b/src/utils/window-console.js index a891cba1e7..558fcdb7a1 100644 --- a/src/utils/window-console.js +++ b/src/utils/window-console.js @@ -2,11 +2,12 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ // @flow -import { stripIndent } from 'common-tags'; +import { stripIndent, oneLine } from 'common-tags'; import type { GetState, Dispatch, MixedObject } from 'firefox-profiler/types'; import { selectorsForConsole } from 'firefox-profiler/selectors'; import actions from 'firefox-profiler/actions'; import { shortenUrl } from 'firefox-profiler/utils/shorten-url'; +import { createBrowserConnection } from 'firefox-profiler/app-logic/browser-connection'; // Despite providing a good libdef for Object.defineProperty, Flow still // special-cases the `value` property: if it's missing it throws an error. Using @@ -60,6 +61,13 @@ export function addDataToWindowObject( }, }); + defineProperty(target, 'selectedMarker', { + enumerable: true, + get() { + return selectorsForConsole.selectedThread.getSelectedMarker(getState()); + }, + }); + target.experimental = { enableEventDelayTracks() { const areEventDelayTracksEnabled = dispatch( @@ -148,6 +156,60 @@ export function addDataToWindowObject( `); }; + target.retrieveRawProfileDataFromBrowser = async function (): Promise< + MixedObject | ArrayBuffer | null, + > { + // Note that a new connection is created instead of reusing the one in the + // redux state, as an attempt to make it work even in the worst situations. + const browserConnectionStatus = await createBrowserConnection(); + const browserConnection = actions.unwrapBrowserConnection( + browserConnectionStatus + ); + const rawGeckoProfile = await browserConnection.getProfile({ + onThirtySecondTimeout: () => { + console.log( + oneLine` + We were unable to connect to the browser within thirty seconds. + This might be because the profile is big or your machine is slower than usual. + Still waiting... + ` + ); + }, + }); + + return rawGeckoProfile; + }; + + target.saveToDisk = async function ( + unknownObject: ArrayBuffer | mixed, + filename?: string + ) { + if (unknownObject === undefined || unknownObject === null) { + console.error("We can't save a null or undefined variable."); + return; + } + + const arrayBufferOrString = + typeof unknownObject === 'string' || + String(unknownObject) === '[object ArrayBuffer]' + ? unknownObject + : JSON.stringify(unknownObject); + + const blob = new Blob([arrayBufferOrString], { + type: 'application/octet-stream', + }); + const blobUrl = URL.createObjectURL(blob); + + // Trigger the download programmatically + const downloadLink = document.createElement('a'); + downloadLink.href = blobUrl; + downloadLink.download = filename ?? 'profile.data'; + downloadLink.click(); + + // Clean up the URL object + URL.revokeObjectURL(blobUrl); + }; + target.shortenUrl = shortenUrl; target.getState = getState; target.selectors = selectorsForConsole; @@ -182,11 +244,11 @@ export function logFriendlyPreamble() { " | \\ / | | '_ \\| '__/ _ \\| _| | |/ _ \\ '_| ", ' |/ \\ _ / \\| | |_) | | | (_) | | | | | __/ | ', ' | | | .__/|_| \\___/|_| |_|_|\\___|_| ', - ' / - - \\ |_| ', - ' ,- V__V -. ', - ' -= __- * - .,=- ', - ' `\\_ - _/ ', - " `-----' ", + ' / - - \\ |_| ', + ' ,- V__V -. ', + ' -= __- * - .,=- ', + ' `\\_ - _/ ', + " `-----' ", ].join('\n'), 'font-family: Menlo, monospace;' ); @@ -198,6 +260,7 @@ export function logFriendlyPreamble() { %cwindow.profile%c - The currently loaded profile %cwindow.filteredThread%c - The current filtered thread %cwindow.filteredMarkers%c - The current filtered and processed markers + %cwindow.selectedMarker%c - The selected processed marker in the current thread %cwindow.callTree%c - The call tree of the current filtered thread %cwindow.getState%c - The function that returns the current Redux state. %cwindow.selectors%c - All the selectors that are used to get data from the Redux state. @@ -206,6 +269,8 @@ export function logFriendlyPreamble() { %cwindow.experimental%c - The object that holds flags of all the experimental features. %cwindow.togglePseudoLocalization%c - Enable pseudo localizations by passing "accented" or "bidi" to this function, or disable using no parameters. %cwindow.toggleTimelineType%c - Toggle timeline graph type by passing "cpu-category", "category", or "stack". + %cwindow.retrieveRawProfileDataFromBrowser%c - Retrieve the profile attached to the current tab and returns it. Use "await" to call it. + %cwindow.saveToDisk%c - Saves to a file the parameter passed to it, with an optional filename parameter. You can use that to save the profile returned by "retrieveRawProfileDataFromBrowser". The profile format is documented here: %chttps://github.com/firefox-devtools/profiler/blob/main/docs-developer/processed-profile-format.md%c @@ -225,6 +290,9 @@ export function logFriendlyPreamble() { // "window.filteredMarkers" bold, reset, + // "window.selectedMarker" + bold, + reset, // "window.callTree" bold, reset, @@ -249,6 +317,12 @@ export function logFriendlyPreamble() { // "window.toggleTimelineType" bold, reset, + // "window.retrieveRawProfileDataFromBrowser" + bold, + reset, + // "window.saveToDisk" + bold, + reset, // "processed-profile-format.md" link, reset, diff --git a/taskcluster/requirements.txt b/taskcluster/requirements.txt index 040a5043ee..ff780bd01a 100644 --- a/taskcluster/requirements.txt +++ b/taskcluster/requirements.txt @@ -16,9 +16,9 @@ binaryornot==0.4.4 \ --hash=sha256:359501dfc9d40632edc9fac890e19542db1a287bbcfa58175b66658392018061 \ --hash=sha256:b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4 # via cookiecutter -certifi==2023.7.22 \ - --hash=sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082 \ - --hash=sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9 +certifi==2024.7.4 \ + --hash=sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b \ + --hash=sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90 # via requests chardet==5.2.0 \ --hash=sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7 \ diff --git a/yarn.lock b/yarn.lock index 9d63b58f67..e2c67c7c15 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,12 +2,12 @@ # yarn lockfile v1 -"@75lb/deep-merge@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@75lb/deep-merge/-/deep-merge-1.1.1.tgz#3b06155b90d34f5f8cc2107d796f1853ba02fd6d" - integrity sha512-xvgv6pkMGBA6GwdyJbNAnDmfAIR/DfWhrj9jgWh3TY7gRm3KO46x/GPjRg6wJ0nOepwqrNxFfojebh0Df4h4Tw== +"@75lb/deep-merge@^1.1.1", "@75lb/deep-merge@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@75lb/deep-merge/-/deep-merge-1.1.2.tgz#6aa53d9730e64a159075da65d3bd057abfe1dde0" + integrity sha512-08K9ou5VNbheZFxM5tDWoqjA3ImC50DiuuJ2tj1yEPRfkp8lLLg6XAaJ4On+a0yAXor/8ay5gHnAIshRM44Kpw== dependencies: - lodash.assignwith "^4.2.0" + lodash "^4.17.21" typical "^7.1.1" "@aashutoshrathi/word-wrap@^1.2.3": @@ -37,10 +37,10 @@ jsonpointer "^5.0.0" leven "^3.1.0" -"@babel/cli@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.24.7.tgz#eb2868c1fa384b17ea88d60107577d3e6fd05c4e" - integrity sha512-8dfPprJgV4O14WTx+AQyEA+opgUKPrsIXX/MdL50J1n06EQJ6m1T+CdsJe0qEC0B/Xl85i+Un5KVAxd/PACX9A== +"@babel/cli@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.24.8.tgz#79eaa55a69c77cafbea3e87537fd1df5a5a2edf8" + integrity sha512-isdp+G6DpRyKc+3Gqxy2rjzgF7Zj9K0mzLNnxz+E/fgeag8qT3vVulX4gY9dGO1q0y+0lUv6V3a+uhUzMzrwXg== dependencies: "@jridgewell/trace-mapping" "^0.3.25" commander "^6.2.0" @@ -61,54 +61,54 @@ "@babel/highlight" "^7.24.7" picocolors "^1.0.0" -"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.7.tgz#d23bbea508c3883ba8251fb4164982c36ea577ed" - integrity sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw== +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.25.2": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.2.tgz#e41928bd33475305c586f6acbbb7e3ade7a6f7f5" + integrity sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ== -"@babel/core@^7.0.0", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.24.4", "@babel/core@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.7.tgz#b676450141e0b52a3d43bc91da86aa608f950ac4" - integrity sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g== +"@babel/core@^7.0.0", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.24.4", "@babel/core@^7.25.2": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.25.2.tgz#ed8eec275118d7613e77a352894cd12ded8eba77" + integrity sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.24.7" - "@babel/generator" "^7.24.7" - "@babel/helper-compilation-targets" "^7.24.7" - "@babel/helper-module-transforms" "^7.24.7" - "@babel/helpers" "^7.24.7" - "@babel/parser" "^7.24.7" - "@babel/template" "^7.24.7" - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" + "@babel/generator" "^7.25.0" + "@babel/helper-compilation-targets" "^7.25.2" + "@babel/helper-module-transforms" "^7.25.2" + "@babel/helpers" "^7.25.0" + "@babel/parser" "^7.25.0" + "@babel/template" "^7.25.0" + "@babel/traverse" "^7.25.2" + "@babel/types" "^7.25.2" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/eslint-parser@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.24.7.tgz#27ebab1a1ec21f48ae191a8aaac5b82baf80d9c7" - integrity sha512-SO5E3bVxDuxyNxM5agFv480YA2HO6ohZbGxbazZdIk3KQOPOGVNw6q78I9/lbviIf95eq6tPozeYnJLbjnC8IA== +"@babel/eslint-parser@^7.25.1": + version "7.25.1" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.25.1.tgz#469cee4bd18a88ff3edbdfbd227bd20e82aa9b82" + integrity sha512-Y956ghgTT4j7rKesabkh5WeqgSFZVFwaPR0IWFm7KFHFmmJ4afbG49SmfW4S+GyRPx0Dy5jxEWA5t0rpxfElWg== dependencies: "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" eslint-visitor-keys "^2.1.0" semver "^6.3.1" -"@babel/eslint-plugin@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/eslint-plugin/-/eslint-plugin-7.24.7.tgz#ebdab31638cdcc720f0c788813066e9b5c0b3e29" - integrity sha512-lODNPJnM+OfcxxBvdmI2YmUeC0fBK3k9yET5O+1Eukr8d5VpO19c6ARtNheE2t2i/8XNYTzp3HeGEAAGZH3nnQ== +"@babel/eslint-plugin@^7.25.1": + version "7.25.1" + resolved "https://registry.yarnpkg.com/@babel/eslint-plugin/-/eslint-plugin-7.25.1.tgz#fc7fff590ab566c9d643fdecf346b69064157ef9" + integrity sha512-jF04YOsrCbEeQk4s+FwsuRddwBiAHooMDG9/nrV83HiYQwEuQppbXTeXyydxCoH5oEWmVBI51wHuZrcIXMkPfw== dependencies: eslint-rule-composer "^0.3.0" -"@babel/generator@^7.24.7", "@babel/generator@^7.7.2": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.7.tgz#1654d01de20ad66b4b4d99c135471bc654c55e6d" - integrity sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA== +"@babel/generator@^7.25.0", "@babel/generator@^7.7.2": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.0.tgz#f858ddfa984350bc3d3b7f125073c9af6988f18e" + integrity sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw== dependencies: - "@babel/types" "^7.24.7" + "@babel/types" "^7.25.0" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" @@ -128,14 +128,14 @@ "@babel/traverse" "^7.24.7" "@babel/types" "^7.24.7" -"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz#4eb6c4a80d6ffeac25ab8cd9a21b5dfa48d503a9" - integrity sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg== +"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.24.7", "@babel/helper-compilation-targets@^7.24.8", "@babel/helper-compilation-targets@^7.25.2": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz#e1d9410a90974a3a5a66e84ff55ef62e3c02d06c" + integrity sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw== dependencies: - "@babel/compat-data" "^7.24.7" - "@babel/helper-validator-option" "^7.24.7" - browserslist "^4.22.2" + "@babel/compat-data" "^7.25.2" + "@babel/helper-validator-option" "^7.24.8" + browserslist "^4.23.1" lru-cache "^5.1.1" semver "^6.3.1" @@ -154,10 +154,10 @@ "@babel/helper-split-export-declaration" "^7.24.7" semver "^6.3.1" -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz#be4f435a80dc2b053c76eeb4b7d16dd22cfc89da" - integrity sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA== +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.24.7", "@babel/helper-create-regexp-features-plugin@^7.25.0": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz#24c75974ed74183797ffd5f134169316cd1808d9" + integrity sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g== dependencies: "@babel/helper-annotate-as-pure" "^7.24.7" regexpu-core "^5.3.1" @@ -189,20 +189,13 @@ "@babel/template" "^7.24.7" "@babel/types" "^7.24.7" -"@babel/helper-hoist-variables@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz#b4ede1cde2fd89436397f30dc9376ee06b0f25ee" - integrity sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ== - dependencies: - "@babel/types" "^7.24.7" - -"@babel/helper-member-expression-to-functions@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz#67613d068615a70e4ed5101099affc7a41c5225f" - integrity sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w== +"@babel/helper-member-expression-to-functions@^7.24.7", "@babel/helper-member-expression-to-functions@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz#6155e079c913357d24a4c20480db7c712a5c3fb6" + integrity sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA== dependencies: - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" + "@babel/traverse" "^7.24.8" + "@babel/types" "^7.24.8" "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.24.7": version "7.24.7" @@ -212,16 +205,15 @@ "@babel/traverse" "^7.24.7" "@babel/types" "^7.24.7" -"@babel/helper-module-transforms@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz#31b6c9a2930679498db65b685b1698bfd6c7daf8" - integrity sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ== +"@babel/helper-module-transforms@^7.24.7", "@babel/helper-module-transforms@^7.24.8", "@babel/helper-module-transforms@^7.25.0", "@babel/helper-module-transforms@^7.25.2": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz#ee713c29768100f2776edf04d4eb23b8d27a66e6" + integrity sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ== dependencies: - "@babel/helper-environment-visitor" "^7.24.7" "@babel/helper-module-imports" "^7.24.7" "@babel/helper-simple-access" "^7.24.7" - "@babel/helper-split-export-declaration" "^7.24.7" "@babel/helper-validator-identifier" "^7.24.7" + "@babel/traverse" "^7.25.2" "@babel/helper-optimise-call-expression@^7.24.7": version "7.24.7" @@ -230,28 +222,28 @@ dependencies: "@babel/types" "^7.24.7" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz#98c84fe6fe3d0d3ae7bfc3a5e166a46844feb2a0" - integrity sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.24.8", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz#94ee67e8ec0e5d44ea7baeb51e571bd26af07878" + integrity sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg== -"@babel/helper-remap-async-to-generator@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz#b3f0f203628522713849d49403f1a414468be4c7" - integrity sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA== +"@babel/helper-remap-async-to-generator@^7.24.7", "@babel/helper-remap-async-to-generator@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz#d2f0fbba059a42d68e5e378feaf181ef6055365e" + integrity sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw== dependencies: "@babel/helper-annotate-as-pure" "^7.24.7" - "@babel/helper-environment-visitor" "^7.24.7" - "@babel/helper-wrap-function" "^7.24.7" + "@babel/helper-wrap-function" "^7.25.0" + "@babel/traverse" "^7.25.0" -"@babel/helper-replace-supers@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz#f933b7eed81a1c0265740edc91491ce51250f765" - integrity sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg== +"@babel/helper-replace-supers@^7.24.7", "@babel/helper-replace-supers@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz#ff44deac1c9f619523fe2ca1fd650773792000a9" + integrity sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg== dependencies: - "@babel/helper-environment-visitor" "^7.24.7" - "@babel/helper-member-expression-to-functions" "^7.24.7" + "@babel/helper-member-expression-to-functions" "^7.24.8" "@babel/helper-optimise-call-expression" "^7.24.7" + "@babel/traverse" "^7.25.0" "@babel/helper-simple-access@^7.24.7": version "7.24.7" @@ -276,38 +268,37 @@ dependencies: "@babel/types" "^7.24.7" -"@babel/helper-string-parser@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz#4d2d0f14820ede3b9807ea5fc36dfc8cd7da07f2" - integrity sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg== +"@babel/helper-string-parser@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" + integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== "@babel/helper-validator-identifier@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== -"@babel/helper-validator-option@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz#24c3bb77c7a425d1742eec8fb433b5a1b38e62f6" - integrity sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw== +"@babel/helper-validator-option@^7.24.7", "@babel/helper-validator-option@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz#3725cdeea8b480e86d34df15304806a06975e33d" + integrity sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q== -"@babel/helper-wrap-function@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz#52d893af7e42edca7c6d2c6764549826336aae1f" - integrity sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw== +"@babel/helper-wrap-function@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz#dab12f0f593d6ca48c0062c28bcfb14ebe812f81" + integrity sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ== dependencies: - "@babel/helper-function-name" "^7.24.7" - "@babel/template" "^7.24.7" - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" + "@babel/template" "^7.25.0" + "@babel/traverse" "^7.25.0" + "@babel/types" "^7.25.0" -"@babel/helpers@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.7.tgz#aa2ccda29f62185acb5d42fb4a3a1b1082107416" - integrity sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg== +"@babel/helpers@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.0.tgz#e69beb7841cb93a6505531ede34f34e6a073650a" + integrity sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw== dependencies: - "@babel/template" "^7.24.7" - "@babel/types" "^7.24.7" + "@babel/template" "^7.25.0" + "@babel/types" "^7.25.0" "@babel/highlight@^7.24.7", "@babel/highlight@^7.9.0": version "7.24.7" @@ -319,25 +310,34 @@ js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.24.7", "@babel/parser@^7.7.0": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.7.tgz#9a5226f92f0c5c8ead550b750f5608e766c8ce85" - integrity sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.25.0", "@babel/parser@^7.25.3", "@babel/parser@^7.7.0": + version "7.25.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.3.tgz#91fb126768d944966263f0657ab222a642b82065" + integrity sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw== + dependencies: + "@babel/types" "^7.25.2" -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz#fd059fd27b184ea2b4c7e646868a9a381bbc3055" - integrity sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ== +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.3": + version "7.25.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz#dca427b45a6c0f5c095a1c639dfe2476a3daba7f" + integrity sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA== dependencies: - "@babel/helper-environment-visitor" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/traverse" "^7.25.3" -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz#468096ca44bbcbe8fcc570574e12eb1950e18107" - integrity sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg== +"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz#cd0c583e01369ef51676bdb3d7b603e17d2b3f73" + integrity sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz#749bde80356b295390954643de7635e0dffabe73" + integrity sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.8" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.24.7": version "7.24.7" @@ -348,13 +348,13 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" "@babel/plugin-transform-optional-chaining" "^7.24.7" -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz#71b21bb0286d5810e63a1538aa901c58e87375ec" - integrity sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg== +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz#3a82a70e7cb7294ad2559465ebcb871dfbf078fb" + integrity sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw== dependencies: - "@babel/helper-environment-visitor" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/traverse" "^7.25.0" "@babel/plugin-proposal-class-properties@^7.18.6": version "7.18.6" @@ -531,15 +531,15 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-async-generator-functions@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz#7330a5c50e05181ca52351b8fd01642000c96cfd" - integrity sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g== +"@babel/plugin-transform-async-generator-functions@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.0.tgz#b785cf35d73437f6276b1e30439a57a50747bddf" + integrity sha512-uaIi2FdqzjpAMvVqvB51S42oC2JEVgh0LDsGfZVDysWE8LrJtQC2jvKmOqEYThKyB7bDEb7BP1GYWDm7tABA0Q== dependencies: - "@babel/helper-environment-visitor" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-remap-async-to-generator" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-remap-async-to-generator" "^7.25.0" "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/traverse" "^7.25.0" "@babel/plugin-transform-async-to-generator@^7.24.7": version "7.24.7" @@ -557,12 +557,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-block-scoping@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz#42063e4deb850c7bd7c55e626bf4e7ab48e6ce02" - integrity sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ== +"@babel/plugin-transform-block-scoping@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz#23a6ed92e6b006d26b1869b1c91d1b917c2ea2ac" + integrity sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" "@babel/plugin-transform-class-properties@^7.24.7": version "7.24.7" @@ -581,18 +581,16 @@ "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-class-static-block" "^7.14.5" -"@babel/plugin-transform-classes@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.7.tgz#4ae6ef43a12492134138c1e45913f7c46c41b4bf" - integrity sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw== +"@babel/plugin-transform-classes@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.0.tgz#63122366527d88e0ef61b612554fe3f8c793991e" + integrity sha512-xyi6qjr/fYU304fiRwFbekzkqVJZ6A7hOjWZd+89FVcBqPV3S9Wuozz82xdpLspckeaafntbzglaW4pqpzvtSw== dependencies: "@babel/helper-annotate-as-pure" "^7.24.7" - "@babel/helper-compilation-targets" "^7.24.7" - "@babel/helper-environment-visitor" "^7.24.7" - "@babel/helper-function-name" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-replace-supers" "^7.24.7" - "@babel/helper-split-export-declaration" "^7.24.7" + "@babel/helper-compilation-targets" "^7.24.8" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-replace-supers" "^7.25.0" + "@babel/traverse" "^7.25.0" globals "^11.1.0" "@babel/plugin-transform-computed-properties@^7.24.7": @@ -603,12 +601,12 @@ "@babel/helper-plugin-utils" "^7.24.7" "@babel/template" "^7.24.7" -"@babel/plugin-transform-destructuring@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.7.tgz#a097f25292defb6e6cc16d6333a4cfc1e3c72d9e" - integrity sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw== +"@babel/plugin-transform-destructuring@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz#c828e814dbe42a2718a838c2a2e16a408e055550" + integrity sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" "@babel/plugin-transform-dotall-regex@^7.24.7": version "7.24.7" @@ -625,6 +623,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.7" +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz#809af7e3339466b49c034c683964ee8afb3e2604" + integrity sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.25.0" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/plugin-transform-dynamic-import@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz#4d8b95e3bae2b037673091aa09cd33fecd6419f4" @@ -665,14 +671,14 @@ "@babel/helper-plugin-utils" "^7.24.7" "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" -"@babel/plugin-transform-function-name@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz#6d8601fbffe665c894440ab4470bc721dd9131d6" - integrity sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w== +"@babel/plugin-transform-function-name@^7.25.1": + version "7.25.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz#b85e773097526c1a4fc4ba27322748643f26fc37" + integrity sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA== dependencies: - "@babel/helper-compilation-targets" "^7.24.7" - "@babel/helper-function-name" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-compilation-targets" "^7.24.8" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/traverse" "^7.25.1" "@babel/plugin-transform-json-strings@^7.24.7": version "7.24.7" @@ -682,12 +688,12 @@ "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-transform-literals@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz#36b505c1e655151a9d7607799a9988fc5467d06c" - integrity sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ== +"@babel/plugin-transform-literals@^7.25.2": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz#deb1ad14fc5490b9a65ed830e025bca849d8b5f3" + integrity sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" "@babel/plugin-transform-logical-assignment-operators@^7.24.7": version "7.24.7" @@ -712,24 +718,24 @@ "@babel/helper-module-transforms" "^7.24.7" "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-modules-commonjs@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz#9fd5f7fdadee9085886b183f1ad13d1ab260f4ab" - integrity sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ== +"@babel/plugin-transform-modules-commonjs@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz#ab6421e564b717cb475d6fff70ae7f103536ea3c" + integrity sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA== dependencies: - "@babel/helper-module-transforms" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-module-transforms" "^7.24.8" + "@babel/helper-plugin-utils" "^7.24.8" "@babel/helper-simple-access" "^7.24.7" -"@babel/plugin-transform-modules-systemjs@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz#f8012316c5098f6e8dee6ecd58e2bc6f003d0ce7" - integrity sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw== +"@babel/plugin-transform-modules-systemjs@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz#8f46cdc5f9e5af74f3bd019485a6cbe59685ea33" + integrity sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw== dependencies: - "@babel/helper-hoist-variables" "^7.24.7" - "@babel/helper-module-transforms" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-module-transforms" "^7.25.0" + "@babel/helper-plugin-utils" "^7.24.8" "@babel/helper-validator-identifier" "^7.24.7" + "@babel/traverse" "^7.25.0" "@babel/plugin-transform-modules-umd@^7.24.7": version "7.24.7" @@ -796,12 +802,12 @@ "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-transform-optional-chaining@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.7.tgz#b8f6848a80cf2da98a8a204429bec04756c6d454" - integrity sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ== +"@babel/plugin-transform-optional-chaining@^7.24.7", "@babel/plugin-transform-optional-chaining@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz#bb02a67b60ff0406085c13d104c99a835cdf365d" + integrity sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" "@babel/plugin-syntax-optional-chaining" "^7.8.3" @@ -914,12 +920,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-typeof-symbol@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.7.tgz#f074be466580d47d6e6b27473a840c9f9ca08fb0" - integrity sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg== +"@babel/plugin-transform-typeof-symbol@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz#383dab37fb073f5bfe6e60c654caac309f92ba1c" + integrity sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" "@babel/plugin-transform-unicode-escapes@^7.24.7": version "7.24.7" @@ -952,19 +958,20 @@ "@babel/helper-create-regexp-features-plugin" "^7.24.7" "@babel/helper-plugin-utils" "^7.24.7" -"@babel/preset-env@^7.11.0", "@babel/preset-env@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.24.7.tgz#ff067b4e30ba4a72f225f12f123173e77b987f37" - integrity sha512-1YZNsc+y6cTvWlDHidMBsQZrZfEFjRIo/BZCT906PMdzOyXtSLTgqGdrpcuTDCXyd11Am5uQULtDIcCfnTc8fQ== - dependencies: - "@babel/compat-data" "^7.24.7" - "@babel/helper-compilation-targets" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-validator-option" "^7.24.7" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.24.7" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.24.7" +"@babel/preset-env@^7.11.0", "@babel/preset-env@^7.25.3": + version "7.25.3" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.25.3.tgz#0bf4769d84ac51d1073ab4a86f00f30a3a83c67c" + integrity sha512-QsYW7UeAaXvLPX9tdVliMJE7MD7M6MLYVTovRTIwhoYQVFHR1rM4wO8wqAezYi3/BpSD+NzVCZ69R6smWiIi8g== + dependencies: + "@babel/compat-data" "^7.25.2" + "@babel/helper-compilation-targets" "^7.25.2" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-validator-option" "^7.24.8" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.25.3" + "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.25.0" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.25.0" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.7" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.24.7" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.25.0" "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" @@ -985,29 +992,30 @@ "@babel/plugin-syntax-top-level-await" "^7.14.5" "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" "@babel/plugin-transform-arrow-functions" "^7.24.7" - "@babel/plugin-transform-async-generator-functions" "^7.24.7" + "@babel/plugin-transform-async-generator-functions" "^7.25.0" "@babel/plugin-transform-async-to-generator" "^7.24.7" "@babel/plugin-transform-block-scoped-functions" "^7.24.7" - "@babel/plugin-transform-block-scoping" "^7.24.7" + "@babel/plugin-transform-block-scoping" "^7.25.0" "@babel/plugin-transform-class-properties" "^7.24.7" "@babel/plugin-transform-class-static-block" "^7.24.7" - "@babel/plugin-transform-classes" "^7.24.7" + "@babel/plugin-transform-classes" "^7.25.0" "@babel/plugin-transform-computed-properties" "^7.24.7" - "@babel/plugin-transform-destructuring" "^7.24.7" + "@babel/plugin-transform-destructuring" "^7.24.8" "@babel/plugin-transform-dotall-regex" "^7.24.7" "@babel/plugin-transform-duplicate-keys" "^7.24.7" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.25.0" "@babel/plugin-transform-dynamic-import" "^7.24.7" "@babel/plugin-transform-exponentiation-operator" "^7.24.7" "@babel/plugin-transform-export-namespace-from" "^7.24.7" "@babel/plugin-transform-for-of" "^7.24.7" - "@babel/plugin-transform-function-name" "^7.24.7" + "@babel/plugin-transform-function-name" "^7.25.1" "@babel/plugin-transform-json-strings" "^7.24.7" - "@babel/plugin-transform-literals" "^7.24.7" + "@babel/plugin-transform-literals" "^7.25.2" "@babel/plugin-transform-logical-assignment-operators" "^7.24.7" "@babel/plugin-transform-member-expression-literals" "^7.24.7" "@babel/plugin-transform-modules-amd" "^7.24.7" - "@babel/plugin-transform-modules-commonjs" "^7.24.7" - "@babel/plugin-transform-modules-systemjs" "^7.24.7" + "@babel/plugin-transform-modules-commonjs" "^7.24.8" + "@babel/plugin-transform-modules-systemjs" "^7.25.0" "@babel/plugin-transform-modules-umd" "^7.24.7" "@babel/plugin-transform-named-capturing-groups-regex" "^7.24.7" "@babel/plugin-transform-new-target" "^7.24.7" @@ -1016,7 +1024,7 @@ "@babel/plugin-transform-object-rest-spread" "^7.24.7" "@babel/plugin-transform-object-super" "^7.24.7" "@babel/plugin-transform-optional-catch-binding" "^7.24.7" - "@babel/plugin-transform-optional-chaining" "^7.24.7" + "@babel/plugin-transform-optional-chaining" "^7.24.8" "@babel/plugin-transform-parameters" "^7.24.7" "@babel/plugin-transform-private-methods" "^7.24.7" "@babel/plugin-transform-private-property-in-object" "^7.24.7" @@ -1027,7 +1035,7 @@ "@babel/plugin-transform-spread" "^7.24.7" "@babel/plugin-transform-sticky-regex" "^7.24.7" "@babel/plugin-transform-template-literals" "^7.24.7" - "@babel/plugin-transform-typeof-symbol" "^7.24.7" + "@babel/plugin-transform-typeof-symbol" "^7.24.8" "@babel/plugin-transform-unicode-escapes" "^7.24.7" "@babel/plugin-transform-unicode-property-regex" "^7.24.7" "@babel/plugin-transform-unicode-regex" "^7.24.7" @@ -1036,7 +1044,7 @@ babel-plugin-polyfill-corejs2 "^0.4.10" babel-plugin-polyfill-corejs3 "^0.10.4" babel-plugin-polyfill-regenerator "^0.6.1" - core-js-compat "^3.31.0" + core-js-compat "^3.37.1" semver "^6.3.1" "@babel/preset-flow@^7.24.7": @@ -1081,37 +1089,34 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/template@^7.24.7", "@babel/template@^7.3.3": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.7.tgz#02efcee317d0609d2c07117cb70ef8fb17ab7315" - integrity sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig== +"@babel/template@^7.24.7", "@babel/template@^7.25.0", "@babel/template@^7.3.3": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.0.tgz#e733dc3134b4fede528c15bc95e89cb98c52592a" + integrity sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q== dependencies: "@babel/code-frame" "^7.24.7" - "@babel/parser" "^7.24.7" - "@babel/types" "^7.24.7" + "@babel/parser" "^7.25.0" + "@babel/types" "^7.25.0" -"@babel/traverse@^7.24.7", "@babel/traverse@^7.7.0": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.7.tgz#de2b900163fa741721ba382163fe46a936c40cf5" - integrity sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA== +"@babel/traverse@^7.24.7", "@babel/traverse@^7.24.8", "@babel/traverse@^7.25.0", "@babel/traverse@^7.25.1", "@babel/traverse@^7.25.2", "@babel/traverse@^7.25.3", "@babel/traverse@^7.7.0": + version "7.25.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.3.tgz#f1b901951c83eda2f3e29450ce92743783373490" + integrity sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ== dependencies: "@babel/code-frame" "^7.24.7" - "@babel/generator" "^7.24.7" - "@babel/helper-environment-visitor" "^7.24.7" - "@babel/helper-function-name" "^7.24.7" - "@babel/helper-hoist-variables" "^7.24.7" - "@babel/helper-split-export-declaration" "^7.24.7" - "@babel/parser" "^7.24.7" - "@babel/types" "^7.24.7" + "@babel/generator" "^7.25.0" + "@babel/parser" "^7.25.3" + "@babel/template" "^7.25.0" + "@babel/types" "^7.25.2" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.24.7", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.7.tgz#6027fe12bc1aa724cd32ab113fb7f1988f1f66f2" - integrity sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q== +"@babel/types@^7.0.0", "@babel/types@^7.24.7", "@babel/types@^7.24.8", "@babel/types@^7.25.0", "@babel/types@^7.25.2", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.2.tgz#55fb231f7dc958cd69ea141a4c2997e819646125" + integrity sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q== dependencies: - "@babel/helper-string-parser" "^7.24.7" + "@babel/helper-string-parser" "^7.24.8" "@babel/helper-validator-identifier" "^7.24.7" to-fast-properties "^2.0.0" @@ -1185,34 +1190,34 @@ resolved "https://registry.yarnpkg.com/@codemirror/state/-/state-6.4.1.tgz#da57143695c056d9a3c38705ed34136e2b68171b" integrity sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A== -"@codemirror/view@^6.0.0", "@codemirror/view@^6.17.0", "@codemirror/view@^6.23.0", "@codemirror/view@^6.28.0": - version "6.28.0" - resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-6.28.0.tgz#7315e8f122b76319d9b95042cde2c9875e7eeb5e" - integrity sha512-fo7CelaUDKWIyemw4b+J57cWuRkOu4SWCCPfNDkPvfWkGjM9D5racHQXr4EQeYCD6zEBIBxGCeaKkQo+ysl0gA== +"@codemirror/view@^6.0.0", "@codemirror/view@^6.17.0", "@codemirror/view@^6.23.0", "@codemirror/view@^6.30.0": + version "6.30.0" + resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-6.30.0.tgz#4daceb2b3951477b99283b59b98ed0c01ce016b1" + integrity sha512-96Nmn8OeLh6aONQprIeYk8hGVnEuYpWuxKSkdsODOx9hWPxyuyZGvmvxV/JmLsp+CubMO1PsLaN5TNNgrl0UrQ== dependencies: "@codemirror/state" "^6.4.0" style-mod "^4.1.0" w3c-keyname "^2.2.4" -"@csstools/css-parser-algorithms@^2.6.3": - version "2.6.3" - resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.6.3.tgz#b5e7eb2bd2a42e968ef61484f1490a8a4148a8eb" - integrity sha512-xI/tL2zxzEbESvnSxwFgwvy5HS00oCXxL4MLs6HUiDcYfwowsoQaABKxUElp1ARITrINzBnsECOc1q0eg2GOrA== +"@csstools/css-parser-algorithms@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz#f14ade63bae5f6025ac85c7d03fe47a7ca0e58af" + integrity sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg== -"@csstools/css-tokenizer@^2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-2.3.1.tgz#3d47e101ad48d815a4bdce8159fb5764f087f17a" - integrity sha512-iMNHTyxLbBlWIfGtabT157LH9DUx9X8+Y3oymFEuMj8HNc+rpE3dPFGFgHjpKfjeFDjLjYIAIhXPGvS2lKxL9g== +"@csstools/css-tokenizer@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz#9dd9b10084f3011290f96789598091e5bcb3c29a" + integrity sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw== -"@csstools/media-query-list-parser@^2.1.11": - version "2.1.11" - resolved "https://registry.yarnpkg.com/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.11.tgz#465aa42f268599729350e305e1ae14a30c1daf51" - integrity sha512-uox5MVhvNHqitPP+SynrB1o8oPxPMt2JLgp5ghJOWf54WGQ5OKu47efne49r1SWqs3wRP8xSWjnO9MBKxhB1dA== +"@csstools/media-query-list-parser@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@csstools/media-query-list-parser/-/media-query-list-parser-3.0.1.tgz#9474e08e6d7767cf68c56bf1581b59d203360cb0" + integrity sha512-HNo8gGD02kHmcbX6PvCoUuOQvn4szyB9ca63vZHKX5A81QytgDG4oxG4IaEfHTlEZSZ6MjPEMWIVU+zF2PZcgw== -"@csstools/selector-specificity@^3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-3.1.1.tgz#63085d2995ca0f0e55aa8b8a07d69bfd48b844fe" - integrity sha512-a7cxGcJ2wIlMFLlh8z2ONm+715QkPHiyJcxwQlKOz/03GPw1COpfhcmC9wm4xlZfp//jWHNNMwzjtqHXVWU9KA== +"@csstools/selector-specificity@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-4.0.0.tgz#7dfccb9df5499e627e7bfdbb4021a06813a45dba" + integrity sha512-189nelqtPd8++phaHNwYovKZI0FOzH1vQEE3QhHHkNIGrg5fSs9CbYP3RvfEH5geztnIA9Jwq91wyOIwAW5JIQ== "@discoveryjs/json-ext@^0.5.0": version "0.5.7" @@ -1610,10 +1615,10 @@ "@lezer/highlight" "^1.0.0" "@lezer/lr" "^1.0.0" -"@lezer/highlight@^1.0.0", "@lezer/highlight@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@lezer/highlight/-/highlight-1.2.0.tgz#e5898c3644208b4b589084089dceeea2966f7780" - integrity sha512-WrS5Mw51sGrpqjlh3d4/fOwpEV2Hd3YOkp9DBt4k8XZQcoTHZFB7sx030A6OcahF4J1nDQAa3jXlTVVYH50IFA== +"@lezer/highlight@^1.0.0", "@lezer/highlight@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@lezer/highlight/-/highlight-1.2.1.tgz#596fa8f9aeb58a608be0a563e960c373cbf23f8b" + integrity sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA== dependencies: "@lezer/common" "^1.0.0" @@ -1945,10 +1950,10 @@ dependencies: defer-to-connect "^2.0.1" -"@testing-library/dom@^10.1.0": - version "10.1.0" - resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-10.1.0.tgz#2d073e49771ad614da999ca48f199919e5176fb6" - integrity sha512-wdsYKy5zupPyLCW2Je5DLHSxSfbIp6h80WoHOQc+RPtmPGA52O9x5MJEkv92Sjonpq+poOAtUKhh1kBGAXBrNA== +"@testing-library/dom@^10.4.0": + version "10.4.0" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-10.4.0.tgz#82a9d9462f11d240ecadbf406607c6ceeeff43a8" + integrity sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ== dependencies: "@babel/code-frame" "^7.10.4" "@babel/runtime" "^7.12.5" @@ -1959,10 +1964,10 @@ lz-string "^1.5.0" pretty-format "^27.0.2" -"@testing-library/jest-dom@^6.4.6": - version "6.4.6" - resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.4.6.tgz#ec1df8108651bed5475534955565bed88c6732ce" - integrity sha512-8qpnGVincVDLEcQXWaHOf6zmlbwTKc6Us6PPu4CRnPXCzo2OGBS5cwgMMOWdxDpEz1mkbvXHpEy99M5Yvt682w== +"@testing-library/jest-dom@^6.4.8": + version "6.4.8" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.4.8.tgz#9c435742b20c6183d4e7034f2b329d562c079daa" + integrity sha512-JD0G+Zc38f5MBHA4NgxQMR5XtO5Jx9g86jqturNTt2WUfRmLDIY7iKkWHDCCTiDuFMre6nxAD5wHw9W5kI4rGw== dependencies: "@adobe/css-tools" "^4.4.0" "@babel/runtime" "^7.9.2" @@ -1980,10 +1985,10 @@ dependencies: "@babel/runtime" "^7.12.5" -"@tgwf/co2@^0.15.0": - version "0.15.0" - resolved "https://registry.yarnpkg.com/@tgwf/co2/-/co2-0.15.0.tgz#a1603bfcad2e21757a222fc59e77455cae835658" - integrity sha512-H3Y+gw+GqRqzLj3rFZNfxHMSi2WpL3eCnnJqs9vOZHUM7/t+aaIG8WheV9PlILMat2bXXCk0hkJJTEW/NFDmTw== +"@tgwf/co2@^0.16.0": + version "0.16.0" + resolved "https://registry.yarnpkg.com/@tgwf/co2/-/co2-0.16.0.tgz#7c72ad260809f5b0d1e6e8982f689c83e0560a34" + integrity sha512-XaISEAE2ysQ6yHs4C1ZM/FFPPe04t1rXGVPzKi72dggPcOCaLvqXWSVdhxCih55mW/OLNGhmUax4SjNILSpGxA== "@tootallnate/once@1": version "1.1.2" @@ -2099,22 +2104,6 @@ dependencies: "@types/ms" "*" -"@types/eslint-scope@^3.7.3": - version "3.7.4" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" - integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== - dependencies: - "@types/eslint" "*" - "@types/estree" "*" - -"@types/eslint@*": - version "8.4.6" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.6.tgz#7976f054c1bccfcf514bff0564c0c41df5c08207" - integrity sha512-/fqTbjxyFUaYNO7VcW5g+4npmqVACz1bB7RTHYuLj+PRjw9hrCwrUXVQFpChUS0JsyEFvMZ7U/PfmvWgxJhI9g== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - "@types/estree-jsx@^0.0.1": version "0.0.1" resolved "https://registry.yarnpkg.com/@types/estree-jsx/-/estree-jsx-0.0.1.tgz#c36d7a1afeb47a95a8ee0b7bc8bc705db38f919d" @@ -2233,7 +2222,7 @@ "@types/tough-cookie" "*" parse5 "^7.0.0" -"@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": +"@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== @@ -2436,23 +2425,23 @@ "@typescript-eslint/types" "5.59.0" "@typescript-eslint/visitor-keys" "5.59.0" -"@typescript-eslint/scope-manager@7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.9.0.tgz#1dd3e63a4411db356a9d040e75864851b5f2619b" - integrity sha512-ZwPK4DeCDxr3GJltRz5iZejPFAAr4Wk3+2WIBaj1L5PYK5RgxExu/Y68FFVclN0y6GGwH8q+KgKRCvaTmFBbgQ== +"@typescript-eslint/scope-manager@8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.1.0.tgz#dd8987d2efebb71d230a1c71d82e84a7aead5c3d" + integrity sha512-DsuOZQji687sQUjm4N6c9xABJa7fjvfIdjqpSIIVOgaENf2jFXiM9hIBZOL3hb6DHK9Nvd2d7zZnoMLf9e0OtQ== dependencies: - "@typescript-eslint/types" "7.9.0" - "@typescript-eslint/visitor-keys" "7.9.0" + "@typescript-eslint/types" "8.1.0" + "@typescript-eslint/visitor-keys" "8.1.0" "@typescript-eslint/types@5.59.0": version "5.59.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.59.0.tgz#3fcdac7dbf923ec5251545acdd9f1d42d7c4fe32" integrity sha512-yR2h1NotF23xFFYKHZs17QJnB51J/s+ud4PYU4MqdZbzeNxpgUr05+dNeCN/bb6raslHvGdd6BFCkVhpPk/ZeA== -"@typescript-eslint/types@7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.9.0.tgz#b58e485e4bfba055659c7e683ad4f5f0821ae2ec" - integrity sha512-oZQD9HEWQanl9UfsbGVcZ2cGaR0YT5476xfWE0oE5kQa2sNK2frxOlkeacLOTh9po4AlUT5rtkGyYM5kew0z5w== +"@typescript-eslint/types@8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.1.0.tgz#fbf1eaa668a7e444ac507732ca9d3c3468e5db9c" + integrity sha512-q2/Bxa0gMOu/2/AKALI0tCKbG2zppccnRIRCW6BaaTlRVaPKft4oVYPp7WOPpcnsgbr0qROAVCVKCvIQ0tbWog== "@typescript-eslint/typescript-estree@5.59.0": version "5.59.0" @@ -2467,13 +2456,13 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/typescript-estree@7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.9.0.tgz#3395e27656060dc313a6b406c3a298b729685e07" - integrity sha512-zBCMCkrb2YjpKV3LA0ZJubtKCDxLttxfdGmwZvTqqWevUPN0FZvSI26FalGFFUZU/9YQK/A4xcQF9o/VVaCKAg== +"@typescript-eslint/typescript-estree@8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.1.0.tgz#c44e5667683c0bb5caa43192e27de6a994f4e4c4" + integrity sha512-NTHhmufocEkMiAord/g++gWKb0Fr34e9AExBRdqgWdVBaKoei2dIyYKD9Q0jBnvfbEA5zaf8plUFMUH6kQ0vGg== dependencies: - "@typescript-eslint/types" "7.9.0" - "@typescript-eslint/visitor-keys" "7.9.0" + "@typescript-eslint/types" "8.1.0" + "@typescript-eslint/visitor-keys" "8.1.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" @@ -2495,15 +2484,15 @@ eslint-scope "^5.1.1" semver "^7.3.7" -"@typescript-eslint/utils@^6.0.0 || ^7.0.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.9.0.tgz#1b96a34eefdca1c820cb1bbc2751d848b4540899" - integrity sha512-5KVRQCzZajmT4Ep+NEgjXCvjuypVvYHUW7RHlXzNPuak2oWpVoD1jf5xCP0dPAuNIchjC7uQyvbdaSTFaLqSdA== +"@typescript-eslint/utils@^6.0.0 || ^7.0.0 || ^8.0.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.1.0.tgz#a922985a43d2560ce0d293be79148fa80c1325e0" + integrity sha512-ypRueFNKTIFwqPeJBfeIpxZ895PQhNyH4YID6js0UoBImWYoSjBsahUn9KMiJXh94uOjVBgHD9AmkyPsPnFwJA== dependencies: "@eslint-community/eslint-utils" "^4.4.0" - "@typescript-eslint/scope-manager" "7.9.0" - "@typescript-eslint/types" "7.9.0" - "@typescript-eslint/typescript-estree" "7.9.0" + "@typescript-eslint/scope-manager" "8.1.0" + "@typescript-eslint/types" "8.1.0" + "@typescript-eslint/typescript-estree" "8.1.0" "@typescript-eslint/visitor-keys@5.59.0": version "5.59.0" @@ -2513,12 +2502,12 @@ "@typescript-eslint/types" "5.59.0" eslint-visitor-keys "^3.3.0" -"@typescript-eslint/visitor-keys@7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.9.0.tgz#82162656e339c3def02895f5c8546f6888d9b9ea" - integrity sha512-iESPx2TNLDNGQLyjKhUvIKprlP49XNEK+MvIf9nIO7ZZaZdbnfWKHnXAgufpxqfA0YryH8XToi4+CjBgVnFTSQ== +"@typescript-eslint/visitor-keys@8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.1.0.tgz#ab2b3a9699a8ddebf0c205e133f114c1fed9daad" + integrity sha512-ba0lNI19awqZ5ZNKh6wCModMwoZs457StTebQ0q1NP58zSi2F6MOZRXwfKZy+jB78JNJ/WH8GSh2IQNzXX8Nag== dependencies: - "@typescript-eslint/types" "7.9.0" + "@typescript-eslint/types" "8.1.0" eslint-visitor-keys "^3.4.3" "@ungap/structured-clone@^1.2.0": @@ -2826,10 +2815,10 @@ ansi-escape-sequences@^5.1.2: dependencies: array-back "^4.0.0" -ansi-escape-sequences@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-escape-sequences/-/ansi-escape-sequences-6.2.1.tgz#6127d70b55f6f49af8b6f8968921ce9a39f1f2ad" - integrity sha512-0gK95MrLXv+Vy5h4eKGvSX1yXopBqSYBi3/w4hekUxs/hHakF6asH9Gg7UXbb7IH9weAlVIrUzVOITNBr8Imag== +ansi-escape-sequences@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/ansi-escape-sequences/-/ansi-escape-sequences-6.2.2.tgz#6154a3acbcf9631026a83e2fd7f524db045eb7d3" + integrity sha512-mBPG9BZy4dMOJQ9BehU6ph8IKslvVppbqZ8APHnpfP+Hsx/hGow5PY46lSQL1vPPi1F5XTtO6p3GcH8O9c0cUg== dependencies: array-back "^6.2.2" @@ -2894,11 +2883,6 @@ ansi-styles@^6.1.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== -any-promise@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" - integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= - anymatch@^3.0.3, anymatch@~3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" @@ -2931,17 +2915,12 @@ aria-query@5.3.0, aria-query@^5.0.0: dependencies: dequal "^2.0.3" -array-back@^3.0.1, array-back@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0" - integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== - -array-back@^4.0.0, array-back@^4.0.1, array-back@^4.0.2: +array-back@^4.0.0, array-back@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.2.tgz#8004e999a6274586beeb27342168652fdb89fa1e" integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== -array-back@^6.2.0, array-back@^6.2.2: +array-back@^6.2.2: version "6.2.2" resolved "https://registry.yarnpkg.com/array-back/-/array-back-6.2.2.tgz#f567d99e9af88a6d3d2f9dfcc21db6f9ba9fd157" integrity sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw== @@ -3053,16 +3032,6 @@ array.prototype.reduce@^1.0.4: es-array-method-boxes-properly "^1.0.0" is-string "^1.0.7" -array.prototype.toreversed@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz#b989a6bf35c4c5051e1dc0325151bf8088954eba" - integrity sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - array.prototype.tosorted@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz#fe954678ff53034e717ea3352a03f0b0b86f7ffc" @@ -3123,16 +3092,16 @@ at-least-node@^1.0.0: resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -autoprefixer@^10.4.19: - version "10.4.19" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.19.tgz#ad25a856e82ee9d7898c59583c1afeb3fa65f89f" - integrity sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew== +autoprefixer@^10.4.20: + version "10.4.20" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.20.tgz#5caec14d43976ef42e32dcb4bd62878e96be5b3b" + integrity sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g== dependencies: - browserslist "^4.23.0" - caniuse-lite "^1.0.30001599" + browserslist "^4.23.3" + caniuse-lite "^1.0.30001646" fraction.js "^4.3.7" normalize-range "^0.1.2" - picocolors "^1.0.0" + picocolors "^1.0.1" postcss-value-parser "^4.2.0" available-typed-arrays@^1.0.7: @@ -3371,15 +3340,15 @@ browser-process-hrtime@^1.0.0: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== -browserslist@^4.0.0, browserslist@^4.21.10, browserslist@^4.22.2, browserslist@^4.23.0, browserslist@^4.23.1: - version "4.23.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.1.tgz#ce4af0534b3d37db5c1a4ca98b9080f985041e96" - integrity sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw== +browserslist@^4.0.0, browserslist@^4.21.10, browserslist@^4.23.0, browserslist@^4.23.1, browserslist@^4.23.3: + version "4.23.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.3.tgz#debb029d3c93ebc97ffbc8d9cbb03403e227c800" + integrity sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA== dependencies: - caniuse-lite "^1.0.30001629" - electron-to-chromium "^1.4.796" - node-releases "^2.0.14" - update-browserslist-db "^1.0.16" + caniuse-lite "^1.0.30001646" + electron-to-chromium "^1.5.4" + node-releases "^2.0.18" + update-browserslist-db "^1.1.0" bser@2.1.1: version "2.1.1" @@ -3423,10 +3392,10 @@ byte-size@^6.2.0: resolved "https://registry.yarnpkg.com/byte-size/-/byte-size-6.2.0.tgz#39fd52adedbbf7e8c3b3f7dea05e441549375c28" integrity sha512-6EspYUCAPMc7E2rltBgKwhG+Cmk0pDm9zDtF1Awe2dczNUL3YpZ8mTs/dueOTS1hqGWBOatqef4jYMGjln7WmA== -byte-size@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/byte-size/-/byte-size-8.1.0.tgz#6353d0bc14ab7a69abcefbf11f8db0145a862cb5" - integrity sha512-FkgMTAg44I0JtEaUAvuZTtU2a2YDmBRbQxdsQNSMtLCjhG0hMcF5b1IMN9UjSCJaU4nvlj/GER7B9sI4nKdCgA== +byte-size@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/byte-size/-/byte-size-9.0.0.tgz#ab0eaa699a5247d611ec806348ea4f1819a17d54" + integrity sha512-xrJ8Hki7eQ6xew55mM6TG9zHI852OoAHcPfduWWtR6yxk2upTuIZy13VioRBDyHReHDdbeDPifUboeNkK/sXXA== bytes@3.0.0: version "3.0.0" @@ -3546,16 +3515,23 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001599, caniuse-lite@^1.0.30001629, caniuse-lite@^1.0.30001632: - version "1.0.30001636" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz#b15f52d2bdb95fad32c2f53c0b68032b85188a78" - integrity sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001640, caniuse-lite@^1.0.30001646: + version "1.0.30001651" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz#52de59529e8b02b1aedcaaf5c05d9e23c0c28138" + integrity sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg== ccount@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== +chalk-template@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/chalk-template/-/chalk-template-0.4.0.tgz#692c034d0ed62436b9062c1707fadcd0f753204b" + integrity sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg== + dependencies: + chalk "^4.1.2" + chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -3573,7 +3549,7 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0: +chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -3845,25 +3821,25 @@ comma-separated-tokens@^2.0.0: resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.2.tgz#d4c25abb679b7751c880be623c1179780fe1dd98" integrity sha512-G5yTt3KQN4Yn7Yk4ed73hlZ1evrFKXeUW3086p3PRFNp7m2vIjI6Pg+Kgb+oyzhd9F2qdcoj67+y3SdxL5XWsg== -command-line-args@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-5.2.1.tgz#c44c32e437a57d7c51157696893c5909e9cec42e" - integrity sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg== +command-line-args@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-6.0.0.tgz#e4703592b0846a9ac440a5a1e2ffc0f89707701e" + integrity sha512-zDdHxHzlCp/gA1gy0VtPK3YL0Aob3ijJdwZ7H3HSl55hh8EziLtRlyj/od8EGRJfX8IjussC/mQkScl2Ms5Suw== dependencies: - array-back "^3.1.0" - find-replace "^3.0.0" + array-back "^6.2.2" + find-replace "^5.0.1" lodash.camelcase "^4.3.0" - typical "^4.0.0" + typical "^7.1.1" -command-line-usage@^6.1.3: - version "6.1.3" - resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-6.1.3.tgz#428fa5acde6a838779dfa30e44686f4b6761d957" - integrity sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw== +command-line-usage@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-7.0.3.tgz#6bce992354f6af10ecea2b631bfdf0c8b3bfaea3" + integrity sha512-PqMLy5+YGwhMh1wS04mVG44oqDsgyLRSKJBdOo1bnYhMKBW65gZF1dRp2OZRhiTjgUHljy99qkO7bsctLaw35Q== dependencies: - array-back "^4.0.2" - chalk "^2.4.2" - table-layout "^1.0.2" - typical "^5.2.0" + array-back "^6.2.2" + chalk-template "^0.4.0" + table-layout "^4.1.0" + typical "^7.1.1" commander@^10.0.1: version "10.0.1" @@ -4008,10 +3984,10 @@ cookie@0.6.0: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== -cookies@~0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.8.0.tgz#1293ce4b391740a8406e3c9870e828c4b54f3f90" - integrity sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow== +cookies@~0.9.0: + version "0.9.1" + resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.9.1.tgz#3ffed6f60bb4fb5f146feeedba50acc418af67e3" + integrity sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw== dependencies: depd "~2.0.0" keygrip "~1.1.0" @@ -4040,17 +4016,17 @@ copy-webpack-plugin@^12.0.2: schema-utils "^4.2.0" serialize-javascript "^6.0.2" -core-js-compat@^3.31.0, core-js-compat@^3.36.1: - version "3.36.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.36.1.tgz#1818695d72c99c25d621dca94e6883e190cea3c8" - integrity sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA== +core-js-compat@^3.36.1, core-js-compat@^3.37.1: + version "3.37.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.37.1.tgz#c844310c7852f4bdf49b8d339730b97e17ff09ee" + integrity sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg== dependencies: browserslist "^4.23.0" -core-js@^3.0.0, core-js@^3.37.1: - version "3.37.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.37.1.tgz#d21751ddb756518ac5a00e4d66499df981a62db9" - integrity sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw== +core-js@^3.0.0, core-js@^3.38.0: + version "3.38.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.38.0.tgz#8acb7c050bf2ccbb35f938c0d040132f6110f636" + integrity sha512-XPpwqEodRljce9KswjZShh95qJ1URisBeKCjUdq27YdenkslVe7OO0ZJhlYXAChW7OhXaRLl8AAba7IBfoIHug== core-util-is@~1.0.0: version "1.0.3" @@ -4263,54 +4239,54 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -cssnano-preset-default@^7.0.2: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-7.0.3.tgz#dd554e4d5bef3da50e40d725c7ba0b49053a993c" - integrity sha512-dQ3Ba1p/oewICp/szF1XjFFgql8OlOBrI2YNBUUwhHQnJNoMOcQTa+Bi7jSJN8r/eM1egW0Ud1se/S7qlduWKA== +cssnano-preset-default@^7.0.5: + version "7.0.5" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-7.0.5.tgz#916108ab2f73a45a83dc15be5ac83f7a0ff5fa0a" + integrity sha512-Jbzja0xaKwc5JzxPQoc+fotKpYtWEu4wQLMQe29CM0FjjdRjA4omvbGHl2DTGgARKxSTpPssBsok+ixv8uTBqw== dependencies: - browserslist "^4.23.1" + browserslist "^4.23.3" css-declaration-sorter "^7.2.0" cssnano-utils "^5.0.0" - postcss-calc "^10.0.0" - postcss-colormin "^7.0.1" - postcss-convert-values "^7.0.1" - postcss-discard-comments "^7.0.1" - postcss-discard-duplicates "^7.0.0" + postcss-calc "^10.0.1" + postcss-colormin "^7.0.2" + postcss-convert-values "^7.0.3" + postcss-discard-comments "^7.0.2" + postcss-discard-duplicates "^7.0.1" postcss-discard-empty "^7.0.0" postcss-discard-overridden "^7.0.0" - postcss-merge-longhand "^7.0.2" - postcss-merge-rules "^7.0.2" + postcss-merge-longhand "^7.0.3" + postcss-merge-rules "^7.0.3" postcss-minify-font-values "^7.0.0" postcss-minify-gradients "^7.0.0" - postcss-minify-params "^7.0.1" - postcss-minify-selectors "^7.0.2" + postcss-minify-params "^7.0.2" + postcss-minify-selectors "^7.0.3" postcss-normalize-charset "^7.0.0" postcss-normalize-display-values "^7.0.0" postcss-normalize-positions "^7.0.0" postcss-normalize-repeat-style "^7.0.0" postcss-normalize-string "^7.0.0" postcss-normalize-timing-functions "^7.0.0" - postcss-normalize-unicode "^7.0.1" + postcss-normalize-unicode "^7.0.2" postcss-normalize-url "^7.0.0" postcss-normalize-whitespace "^7.0.0" postcss-ordered-values "^7.0.1" - postcss-reduce-initial "^7.0.1" + postcss-reduce-initial "^7.0.2" postcss-reduce-transforms "^7.0.0" postcss-svgo "^7.0.1" - postcss-unique-selectors "^7.0.1" + postcss-unique-selectors "^7.0.2" cssnano-utils@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-5.0.0.tgz#b53a0343dd5d21012911882db6ae7d2eae0e3687" integrity sha512-Uij0Xdxc24L6SirFr25MlwC2rCFX6scyUmuKpzI+JQ7cyqDEwD42fJ0xfB3yLfOnRDU5LKGgjQ9FA6LYh76GWQ== -cssnano@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-7.0.2.tgz#a36578a30aaf3d90da2a95cbebd41d9178d81bd6" - integrity sha512-LXm/Xx6TNLzfHM2lBaIQHfvtdW5QfdbyLzfJAWZrclCAb47yVa0/yJG69+amcw3Lq0YZ+kyU40rbsMPLcMt9aw== +cssnano@^7.0.5: + version "7.0.5" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-7.0.5.tgz#97186daaf96f4db447227ee2d823ce6332f77beb" + integrity sha512-Aq0vqBLtpTT5Yxj+hLlLfNPFuRQCDIjx5JQAhhaedQKLNDvDGeVziF24PS+S1f0Z5KCxWvw0QVI3VNHNBITxVQ== dependencies: - cssnano-preset-default "^7.0.2" - lilconfig "^3.1.1" + cssnano-preset-default "^7.0.5" + lilconfig "^3.1.2" csso@^4.0.2: version "4.2.0" @@ -4348,7 +4324,7 @@ csstype@^3.0.2: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.3.tgz#2b410bbeba38ba9633353aff34b05d9755d065f8" integrity sha512-jPl+wbWPOWJ7SXsWyqGRk3lGecbar0Cb0OvZF/r/ZU011R4YqiRehgkQ9p4eQfo9DSDLqLL3wHwfxeJiuIsNag== -current-module-paths@^1.1.0, current-module-paths@^1.1.1: +current-module-paths@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/current-module-paths/-/current-module-paths-1.1.1.tgz#f0ee3298cd1a6839503b46796aac9e19add3f9e6" integrity sha512-8Ga5T8oMXBaSsHq9Gj+bddX7kHSaJKsl2vaAd3ep51eQLkr4W18eFEmEZM5bLo1zrz8tt3jE1U8QK9QGhaLR4g== @@ -4394,10 +4370,10 @@ data-view-byte-offset@^1.0.0: es-errors "^1.3.0" is-data-view "^1.0.1" -debug@*, debug@4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== +debug@*, debug@4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.6: + version "4.3.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b" + integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== dependencies: ms "2.1.2" @@ -4798,10 +4774,10 @@ ejs@^3.1.6: dependencies: jake "^10.8.5" -electron-to-chromium@^1.4.796: - version "1.4.807" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.807.tgz#4d6c5ea1516f0164ac5bfd487ccd4ee9507c8f01" - integrity sha512-kSmJl2ZwhNf/bcIuCH/imtNOKlpkLDn2jqT5FJ+/0CXjhnFaOa9cOe9gHKKy71eM49izwuQjZhKk+lWQ1JxB7A== +electron-to-chromium@^1.5.4: + version "1.5.7" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.7.tgz#425d2a7f76ecfa564fdca1040d11fb1979851f3c" + integrity sha512-6FTNWIWMxMy/ZY6799nBlPtF1DFDQ6VQJ7yyDP27SJNt5lwtQ5ufqVvHylb3fdQefvRcgA3fKcFMJi9OLwBRNw== emittery@^0.13.1: version "0.13.1" @@ -4840,10 +4816,10 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" -enhanced-resolve@^5.17.0: - version "5.17.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz#d037603789dd9555b89aaec7eb78845c49089bc5" - integrity sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA== +enhanced-resolve@^5.17.1: + version "5.17.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz#67bfbbcc2f81d511be77d686a90267ef7f898a15" + integrity sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" @@ -4875,7 +4851,7 @@ error-ex@^1.3.1, error-ex@^1.3.2: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.4, es-abstract@^1.19.2, es-abstract@^1.20.1, es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2, es-abstract@^1.23.3: +es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.4, es-abstract@^1.17.5, es-abstract@^1.19.2, es-abstract@^1.20.1, es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2, es-abstract@^1.23.3: version "1.23.3" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== @@ -5118,41 +5094,41 @@ eslint-plugin-jest-formatting@^3.1.0: resolved "https://registry.yarnpkg.com/eslint-plugin-jest-formatting/-/eslint-plugin-jest-formatting-3.1.0.tgz#b26dd5a40f432b642dcc880021a771bb1c93dcd2" integrity sha512-XyysraZ1JSgGbLSDxjj5HzKKh0glgWf+7CkqxbTqb7zEhW7X2WHo5SBQ8cGhnszKN+2Lj3/oevBlHNbHezoc/A== -eslint-plugin-jest@^28.6.0: - version "28.6.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-28.6.0.tgz#8410588d60bcafa68a91b6ec272e4a415502302a" - integrity sha512-YG28E1/MIKwnz+e2H7VwYPzHUYU4aMa19w0yGcwXnnmJH6EfgHahTJ2un3IyraUxNfnz/KUhJAFXNNwWPo12tg== +eslint-plugin-jest@^28.8.0: + version "28.8.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-28.8.0.tgz#54f597b5a3295ad04ec946baa245ad02b9b2bca0" + integrity sha512-Tubj1hooFxCl52G4qQu0edzV/+EZzPUeN8p2NnW5uu4fbDs+Yo7+qDVDc4/oG3FbCqEBmu/OC3LSsyiU22oghw== dependencies: - "@typescript-eslint/utils" "^6.0.0 || ^7.0.0" + "@typescript-eslint/utils" "^6.0.0 || ^7.0.0 || ^8.0.0" -eslint-plugin-react@^7.34.3: - version "7.34.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.34.3.tgz#9965f27bd1250a787b5d4cfcc765e5a5d58dcb7b" - integrity sha512-aoW4MV891jkUulwDApQbPYTVZmeuSyFrudpbTAQuj5Fv8VL+o6df2xIGpw8B0hPjAaih1/Fb0om9grCdyFYemA== +eslint-plugin-react@^7.35.0: + version "7.35.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.35.0.tgz#00b1e4559896710e58af6358898f2ff917ea4c41" + integrity sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA== dependencies: array-includes "^3.1.8" array.prototype.findlast "^1.2.5" array.prototype.flatmap "^1.3.2" - array.prototype.toreversed "^1.1.2" array.prototype.tosorted "^1.1.4" doctrine "^2.1.0" es-iterator-helpers "^1.0.19" estraverse "^5.3.0" + hasown "^2.0.2" jsx-ast-utils "^2.4.1 || ^3.0.0" minimatch "^3.1.2" object.entries "^1.1.8" object.fromentries "^2.0.8" - object.hasown "^1.1.4" object.values "^1.2.0" prop-types "^15.8.1" resolve "^2.0.0-next.5" semver "^6.3.1" string.prototype.matchall "^4.0.11" + string.prototype.repeat "^1.0.0" -eslint-plugin-testing-library@^6.2.2: - version "6.2.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-testing-library/-/eslint-plugin-testing-library-6.2.2.tgz#67e84ff891a2b3a8078ced0afa95ee6f343c00c1" - integrity sha512-1E94YOTUDnOjSLyvOwmbVDzQi/WkKm3WVrMXu6SmBr6DN95xTGZmI6HJ/eOkSXh/DlheRsxaPsJvZByDBhWLVQ== +eslint-plugin-testing-library@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-testing-library/-/eslint-plugin-testing-library-6.3.0.tgz#9c31a9941a860efdff3c06180151ab9c8142f685" + integrity sha512-GYcEErTt6EGwE0bPDY+4aehfEBpB2gDBFKohir8jlATSUvzStEyzCx8QWB/14xeKc/AwyXkzScSzMHnFojkWrA== dependencies: "@typescript-eslint/utils" "^5.58.0" @@ -5375,10 +5351,10 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -etag@^1.3.0, etag@~1.8.1: +etag@^1.8.1, etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== event-stream@~3.1.5: version "3.1.7" @@ -5684,12 +5660,12 @@ find-pkg@^2.0.0: dependencies: find-file-up "^2.0.1" -find-replace@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38" - integrity sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ== +find-replace@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-5.0.1.tgz#28bbcf985b5274f6edd5e087c1e4e26a08b0da21" + integrity sha512-o5/Y8HrCNRuFF5rdNTkX8Vhv6kTFTV0t1zIoigwlCdbkA9qaapRzxvWPND2VvlFa9LBI05Q1i8ml/saMqkOJUQ== dependencies: - array-back "^3.0.1" + array-back "^6.2.2" find-up@^3.0.0: version "3.0.0" @@ -6057,15 +6033,16 @@ glob@7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^10.3.7, glob@^10.4.1: - version "10.4.1" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.1.tgz#0cfb01ab6a6b438177bfe6a58e2576f6efe909c2" - integrity sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw== +glob@^10.3.7, glob@^10.4.5: + version "10.4.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" + integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== dependencies: foreground-child "^3.1.0" jackspeak "^3.1.2" minimatch "^9.0.4" minipass "^7.1.2" + package-json-from-dist "^1.0.0" path-scurry "^1.11.1" glob@^7.0.0, glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0: @@ -6601,7 +6578,7 @@ http-parser-js@>=0.5.1: resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== -http-proxy-agent@^4.0.0, http-proxy-agent@^4.0.1: +http-proxy-agent@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== @@ -6725,10 +6702,10 @@ ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -ignore@^5.0.0, ignore@^5.2.0, ignore@^5.2.4, ignore@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" - integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== +ignore@^5.0.0, ignore@^5.2.0, ignore@^5.2.4, ignore@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== immediate@~3.0.5: version "3.0.6" @@ -7937,18 +7914,19 @@ kleur@^4.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.4.tgz#8c202987d7e577766d039a8cd461934c01cda04d" integrity sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA== -known-css-properties@^0.31.0: - version "0.31.0" - resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.31.0.tgz#5c8d9d8777b3ca09482b2397f6a241e5d69a1023" - integrity sha512-sBPIUGTNF0czz0mwGGUoKKJC8Q7On1GPbCSFPfyEsfHb2DyBG0Y4QtV+EVWpINSaiGKZblDNuF5AezxSgOhesQ== +known-css-properties@^0.34.0: + version "0.34.0" + resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.34.0.tgz#ccd7e9f4388302231b3f174a8b1d5b1f7b576cea" + integrity sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ== -koa-bodyparser@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/koa-bodyparser/-/koa-bodyparser-4.3.0.tgz#274c778555ff48fa221ee7f36a9fbdbace22759a" - integrity sha512-uyV8G29KAGwZc4q/0WUAjH+Tsmuv9ImfBUF2oZVyZtaeo0husInagyn/JH85xMSxM0hEk/mbCII5ubLDuqW/Rw== +koa-bodyparser@^4.4.1: + version "4.4.1" + resolved "https://registry.yarnpkg.com/koa-bodyparser/-/koa-bodyparser-4.4.1.tgz#a908d848e142cc57d9eece478e932bf00dce3029" + integrity sha512-kBH3IYPMb+iAXnrxIhXnW+gXV8OTzCu8VPDqvcDHW9SQrbkHmqPQtiZwrltNmSq6/lpipHnT7k7PsjlVD7kK0w== dependencies: co-body "^6.0.0" copy-to "^2.0.1" + type-is "^1.6.18" koa-compose@^4.1.0: version "4.1.0" @@ -7979,13 +7957,12 @@ koa-convert@^2.0.0: co "^4.6.0" koa-compose "^4.1.0" -koa-etag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/koa-etag/-/koa-etag-3.0.0.tgz#9ef7382ddd5a82ab0deb153415c915836f771d3f" - integrity sha1-nvc4Ld1agqsN6xU0FckVg293HT8= +koa-etag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/koa-etag/-/koa-etag-4.0.0.tgz#2c2bb7ae69ca1ac6ced09ba28dcb78523c810414" + integrity sha512-1cSdezCkBWlyuB9l6c/IFoe1ANCDdPBxkDkRiaIup40xpUub6U/wwRXoKBZw/O5BifX9OlqAjYnDyzM6+l+TAg== dependencies: - etag "^1.3.0" - mz "^2.1.0" + etag "^1.8.1" koa-is-json@1, koa-is-json@^1.0.0: version "1.0.0" @@ -8014,14 +7991,14 @@ koa-range@^0.3.0: dependencies: stream-slice "^0.1.2" -koa-route@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/koa-route/-/koa-route-3.2.0.tgz#76298b99a6bcfa9e38cab6fe5c79a8733e758bce" - integrity sha1-dimLmaa8+p44yrb+XHmocz51i84= +koa-route@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/koa-route/-/koa-route-4.0.1.tgz#9c252a7aaf9bcb3c5450e57894aded1dee033dfc" + integrity sha512-ytLrdDPF/qTMh20BxZCNpIUY329SoGu84xjGYeNsp/jkGT3OpZfkuK646sDScVJQ9XdsLXJVMml1dXMA5EIuxQ== dependencies: debug "*" methods "~1.1.0" - path-to-regexp "^1.2.0" + path-to-regexp "^6.2.1" koa-send@^5.0.0, koa-send@^5.0.1: version "5.0.1" @@ -8040,16 +8017,16 @@ koa-static@^5.0.0: debug "^3.1.0" koa-send "^5.0.0" -koa@^2.13.4: - version "2.13.4" - resolved "https://registry.yarnpkg.com/koa/-/koa-2.13.4.tgz#ee5b0cb39e0b8069c38d115139c774833d32462e" - integrity sha512-43zkIKubNbnrULWlHdN5h1g3SEKXOEzoAlRsHOTFpnlDu8JlAOZSMJBLULusuXRequboiwJcj5vtYXKB3k7+2g== +koa@^2.15.3: + version "2.15.3" + resolved "https://registry.yarnpkg.com/koa/-/koa-2.15.3.tgz#062809266ee75ce0c75f6510a005b0e38f8c519a" + integrity sha512-j/8tY9j5t+GVMLeioLaxweJiKUayFhlGqNTzf2ZGwL0ZCQijd2RLHK0SLW5Tsko8YyyqCZC2cojIb0/s62qTAg== dependencies: accepts "^1.3.5" cache-content-type "^1.0.0" content-disposition "~0.5.2" content-type "^1.0.4" - cookies "~0.8.0" + cookies "~0.9.0" debug "^4.3.2" delegates "^1.0.0" depd "^2.0.0" @@ -8125,10 +8102,10 @@ lie@~3.3.0: dependencies: immediate "~3.0.5" -lilconfig@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.1.tgz#9d8a246fa753106cfc205fd2d77042faca56e5e3" - integrity sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ== +lilconfig@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.2.tgz#e4a7c3cb549e3a606c8dcc32e5ae1005e62c05cb" + integrity sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow== limit-spawn@0.0.3: version "0.0.3" @@ -8155,12 +8132,12 @@ load-json-file@^4.0.0: pify "^3.0.0" strip-bom "^3.0.0" -load-module@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/load-module/-/load-module-4.2.1.tgz#3b596a4ddee52c59106d38160aa631a0ded68867" - integrity sha512-Sbfg6R4LjvyThJpqUoADHMjyoI2+cL4msbCQeZ9kkY/CqP/TT2938eftKm7x4I2gd4/A+DEe6nePkbfWYbXwSw== +load-module@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/load-module/-/load-module-5.0.0.tgz#a2402683cd6d14049ed10fa75de681aab60dddb6" + integrity sha512-zZBnYIvAuP2TprnRisam+N/A3v+JX60pvdKoHQRKyl4xlHLQQLpp7JKNyEQ6D3Si0/QIQMgXko3PtV+cx6L7mA== dependencies: - array-back "^6.2.0" + array-back "^6.2.2" load-pkg@^4.0.0: version "4.0.0" @@ -8191,28 +8168,28 @@ loader-utils@^2.0.0: emojis-list "^3.0.0" json5 "^2.1.2" -local-web-server@^5.3.3: - version "5.3.3" - resolved "https://registry.yarnpkg.com/local-web-server/-/local-web-server-5.3.3.tgz#f2aad6440f98ca7fcb7e186e7fda5fdb7c503f01" - integrity sha512-toU0Mz/OskG/HKDtmjTiwDWDRnzFY4aQH2zPZIX7+hebBJKGr5HXuOyx/noI20I/wemkbBDontBnBch5VTgjlg== +local-web-server@^5.4.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/local-web-server/-/local-web-server-5.4.0.tgz#bacad05d7210d8faa84920d274182050e4515b4f" + integrity sha512-FkQT6ZuX+8ywks3Mol5nHtuKzf+Rhtp88PPJUkcU0fP6JzNi7s9a+dWRQ8WrCxlGe3vHij85A4R1uL4wRg06WA== dependencies: current-module-paths "^1.1.1" - lws "^4.1.2" + lws "^4.1.5" lws-basic-auth "^2.0.0" lws-blacklist "^3.0.0" - lws-body-parser "^3.0.0" + lws-body-parser "^3.0.1" lws-compress "^3.1.0" - lws-conditional-get "^2.0.0" + lws-conditional-get "^3.0.0" lws-cors "^4.2.1" lws-index "^3.1.1" lws-json "^2.0.0" - lws-log "^2.0.0" + lws-log "^3.0.0" lws-mime "^2.0.0" lws-range "^4.0.1" lws-request-monitor "^2.0.0" - lws-rewrite "^3.1.1" - lws-spa "^4.1.0" - lws-static "^3.1.0" + lws-rewrite "^4.0.0" + lws-spa "^4.1.1" + lws-static "^3.1.1" locate-path@^3.0.0: version "3.0.0" @@ -8263,11 +8240,6 @@ lockfile-lint@^4.14.0: lockfile-lint-api "^5.9.1" yargs "^17.7.2" -lodash.assignwith@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.assignwith/-/lodash.assignwith-4.2.0.tgz#127a97f02adc41751a954d24b0de17e100e038eb" - integrity sha1-EnqX8CrcQXUalU0ksN4X4QDgOOs= - lodash.camelcase@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" @@ -8391,12 +8363,12 @@ lws-blacklist@^3.0.0: array-back "^4.0.1" path-to-regexp "^6.1.0" -lws-body-parser@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lws-body-parser/-/lws-body-parser-3.0.0.tgz#0f6be7c593e8bab26ddcfb2a35b34789fca7a8b0" - integrity sha512-led36Um61ppeQoMTG7yvphn+NQPMbzuFuGUYD09eEx1UT7e8bsaLw1gkBZB9vAIkeTlXRbXjPmOqlm26eUzhfg== +lws-body-parser@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lws-body-parser/-/lws-body-parser-3.0.1.tgz#ff2026fda18d613b96f8456a6ce17de2cddacd9d" + integrity sha512-HUlTGYukWRXnmAFlpJhaJWSFsfkOP4fC9fjEiYeyI0kTy0/SaMLwcLzi5hQ/eriLZNGuF+PqnhBMtOys6nPdfw== dependencies: - koa-bodyparser "^4.3.0" + koa-bodyparser "^4.4.1" lws-compress@^3.1.0: version "3.1.0" @@ -8405,13 +8377,13 @@ lws-compress@^3.1.0: dependencies: koa-compress "^5.0.1" -lws-conditional-get@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lws-conditional-get/-/lws-conditional-get-2.0.0.tgz#3778660105e89074b0f1f85373fca249624e6103" - integrity sha512-U05yDlFJKIYa7gJZYfnc1HIEuXbKpDJztgkvNYyxCqJC28j/k9ORoNnFNOIHpBh/jlPJgV8x7uH34mIxFAryWA== +lws-conditional-get@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lws-conditional-get/-/lws-conditional-get-3.0.0.tgz#88b824b9f455f8398fbad11f797a63c714957cac" + integrity sha512-/O+JSIB889kIYgo8QFyJJayW3W0BMRc8zPHE6F5FBGtdqpsl+UsKZHFiSmJSTRn/1HGgnmcXQz2UpbB1PQYVSw== dependencies: koa-conditional-get "^2.0.0" - koa-etag "^3.0.0" + koa-etag "^4.0.0" lws-cors@^4.2.1: version "4.2.1" @@ -8434,10 +8406,10 @@ lws-json@^2.0.0: dependencies: koa-json "^2.0.2" -lws-log@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lws-log/-/lws-log-2.0.0.tgz#f721e143a465e44f66b29c23a53c0e45984748ad" - integrity sha512-YveoazSZ0Qb1Tljdm8G8yn9c+mAMXgvLMACZzh5aZIk7p8YJwiXf9r1S+xY7wbXEcKG629KfVO0B5G5gRFcyDQ== +lws-log@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lws-log/-/lws-log-3.0.0.tgz#500e262e83ca67c41492c4a88f6ac13bd78a8f1e" + integrity sha512-I0P5dcZkR97GQ92lyJHQlCZ6eRDota+4OQrEoVXSJQD1Dc8CFxy0+4ELYJke6RwEWmr0BwU65C1cCcSC1w5NFA== dependencies: koa-morgan "^1.0.1" stream-log-stats "^3.0.2" @@ -8461,47 +8433,47 @@ lws-request-monitor@^2.0.0: dependencies: byte-size "^6.2.0" -lws-rewrite@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lws-rewrite/-/lws-rewrite-3.1.1.tgz#a65ff3ea8ff6b4c0865129132bdee4346e68b566" - integrity sha512-cOeaPXIlLUVLxS6BZ52QzZVzI8JjCzlWD4RWizB5Hd+0YGO0SPa3Vgk7CIghtAOsSdjtXg/wSOap2H1h+tw8BQ== +lws-rewrite@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/lws-rewrite/-/lws-rewrite-4.0.0.tgz#e442517af13037ce6b43ceebcb8671ea1a136f6b" + integrity sha512-I9rNDyAuy/1Wz2WMWTqjxFMlUTr8CugdHlUCjIudQkt04YnRdhP32iAoRnVnLsgP1UOiM44dxTW2EomQHHfirw== dependencies: - array-back "^4.0.1" - http-proxy-agent "^4.0.1" - https-proxy-agent "^5.0.0" - koa-route "^3.2.0" - path-to-regexp "^6.1.0" + array-back "^6.2.2" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.1" + koa-route "^4.0.1" + path-to-regexp "^6.2.2" -lws-spa@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/lws-spa/-/lws-spa-4.1.0.tgz#b73989347aa79b582d4111f7915994f3f1d5e1ee" - integrity sha512-B1YhxAY02EYu7J9dKBQMpYRwOd4iOtKK3TDdUR2GnJ4nsnvoxsJnMUpg8yxGmWZ6NI8itdUdQJlwqKg/Gji/vQ== +lws-spa@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lws-spa/-/lws-spa-4.1.1.tgz#2ee598315f4b613bebfb92999377ca29e831aab7" + integrity sha512-v032GXet8j818l6vUyAlQm1HfcxPVM+Flvxptv6EcDveUJqvfNX5j1bo9PqKB8HbyEScek5OH8guFAqrSOwBNw== dependencies: koa-send "^5.0.1" -lws-static@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/lws-static/-/lws-static-3.1.0.tgz#6b1841a958ba42bc610a3e4d351e559900409a21" - integrity sha512-0fWZRluPda0raMEzTd2mY/REWsa5LxDz03j+Zer8yhFfbicJGaocTK1jOlRo/H5UEDImBdfSDZGlrmzMaF9Xcg== +lws-static@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lws-static/-/lws-static-3.1.1.tgz#4ceee35016d28936c50c629766906c5c4e363759" + integrity sha512-4Xb6rE4gVp2ZmuiVYwvFaSsMUbQ8CwxSxzHzfK6URFz4g3vVT8+e+ekGlItp8ePf9w7u9l96HU7+QDswsmwhCg== dependencies: koa-static "^5.0.0" -lws@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lws/-/lws-4.1.2.tgz#48eaa9748d86a1df534d86f85211fb133b35429c" - integrity sha512-hm6mlYa5ZM+iLbFIEiifGnXJWbNRQL80DZ5gXfkdgBJSMIvjnVyVIPpw1fCU/IMcgHBvn1iCrFc391FP12NguQ== +lws@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lws/-/lws-4.1.5.tgz#fe3d59abead8946733d7c57f97a19fc1e8d5583c" + integrity sha512-MGRogJgMXFuurf5VOUKOoBeBYYlmxvaxNX/q5SJC/GzHxAqLxcQ4I21NrGkZVmCdSladgyEyC1tm/s0sT1OMPQ== dependencies: - "@75lb/deep-merge" "^1.1.1" - ansi-escape-sequences "^6.2.1" + "@75lb/deep-merge" "^1.1.2" + ansi-escape-sequences "^6.2.2" array-back "^6.2.2" - byte-size "^8.1.0" - command-line-args "^5.2.1" - command-line-usage "^6.1.3" + byte-size "^9.0.0" + command-line-args "^6.0.0" + command-line-usage "^7.0.3" create-mixin "^3.0.0" - current-module-paths "^1.1.0" - koa "^2.13.4" - load-module "^4.2.1" - open "^8.4.0" + current-module-paths "^1.1.1" + koa "^2.15.3" + load-module "^5.0.0" + open "^8.4.2" qrcode-terminal "^0.12.0" typical "^7.1.1" walk-back "^5.1.0" @@ -9213,9 +9185,9 @@ micromark@^3.0.0: uvu "^0.5.0" micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.7.tgz#33e8190d9fe474a9895525f5618eee136d46c2e5" - integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: braces "^3.0.3" picomatch "^2.3.1" @@ -9399,15 +9371,6 @@ mute-stream@0.0.8: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== -mz@^2.1.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" - integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== - dependencies: - any-promise "^1.0.0" - object-assign "^4.0.1" - thenify-all "^1.0.0" - namedtuplemap@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/namedtuplemap/-/namedtuplemap-1.0.0.tgz#c231789c5b7b47b4b3a3e73317f03ddde1ebcb34" @@ -9503,10 +9466,10 @@ node-int64@^0.4.0: resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= -node-releases@^2.0.14: - version "2.0.14" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" - integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== +node-releases@^2.0.18: + version "2.0.18" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" + integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== node-stream-zip@^1.15.0: version "1.15.0" @@ -9623,7 +9586,7 @@ nwsapi@^2.2.0: resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== -object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -9697,15 +9660,6 @@ object.groupby@^1.0.1: es-abstract "^1.22.1" get-intrinsic "^1.2.1" -object.hasown@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.4.tgz#e270ae377e4c120cdcb7656ce66884a6218283dc" - integrity sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg== - dependencies: - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - object.values@^1.1.0, object.values@^1.1.7, object.values@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" @@ -9768,7 +9722,7 @@ open@^10.0.3, open@^10.1.0: is-inside-container "^1.0.0" is-wsl "^3.1.0" -open@^8.4.0: +open@^8.4.2: version "8.4.2" resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== @@ -9884,6 +9838,11 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +package-json-from-dist@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00" + integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw== + package-json@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/package-json/-/package-json-8.1.0.tgz#2a22806f1ed7c786c8e6ff26cfe20003bf4c6850" @@ -10066,22 +10025,15 @@ path-to-regexp@0.1.7: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== -path-to-regexp@^1.2.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" - integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== - dependencies: - isarray "0.0.1" - path-to-regexp@^2.2.1: version "2.4.0" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-2.4.0.tgz#35ce7f333d5616f1c1e1bfe266c3aba2e5b2e704" integrity sha512-G6zHoVqC6GGTQkZwF4lkuEyMbVOjoBKAEybQUypI1WTkqinCOrq2x6U2+phkJ1XsEMTy4LjtwPI7HW+NVrRR2w== -path-to-regexp@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.1.0.tgz#0b18f88b7a0ce0bfae6a25990c909ab86f512427" - integrity sha512-h9DqehX3zZZDCEm+xbfU0ZmwCGFCAAraPJWMXJ4+v32NjZJilVg3k1TcKsRgIb8IQ/izZSaydDc1OhJCZvs2Dw== +path-to-regexp@^6.1.0, path-to-regexp@^6.2.1, path-to-regexp@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.2.2.tgz#324377a83e5049cbecadc5554d6a63a9a4866b36" + integrity sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw== path-type@^3.0.0: version "3.0.0" @@ -10187,43 +10139,43 @@ possible-typed-array-names@^1.0.0: resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== -postcss-calc@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-10.0.0.tgz#aca29a1c66dd481ca30d08f6932b1274a1003716" - integrity sha512-OmjhudoNTP0QleZCwl1i6NeBwN+5MZbY5ersLZz69mjJiDVv/p57RjRuKDkHeDWr4T+S97wQfsqRTNoDHB2e3g== +postcss-calc@^10.0.1: + version "10.0.2" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-10.0.2.tgz#15f01635a27b9d38913a98c4ef2877f5b715b439" + integrity sha512-DT/Wwm6fCKgpYVI7ZEWuPJ4az8hiEHtCUeYjZXqU7Ou4QqYh1Df2yCQ7Ca6N7xqKPFkxN3fhf+u9KSoOCJNAjg== dependencies: - postcss-selector-parser "^6.0.16" + postcss-selector-parser "^6.1.2" postcss-value-parser "^4.2.0" -postcss-colormin@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-7.0.1.tgz#6534c7d1175e30f788d4ced891436ad2fa3bd173" - integrity sha512-uszdT0dULt3FQs47G5UHCduYK+FnkLYlpu1HpWu061eGsKZ7setoG7kA+WC9NQLsOJf69D5TxGHgnAdRgylnFQ== +postcss-colormin@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-7.0.2.tgz#6f3c53c13158168669f45adc3926f35cb240ef8e" + integrity sha512-YntRXNngcvEvDbEjTdRWGU606eZvB5prmHG4BF0yLmVpamXbpsRJzevyy6MZVyuecgzI2AWAlvFi8DAeCqwpvA== dependencies: - browserslist "^4.23.1" + browserslist "^4.23.3" caniuse-api "^3.0.0" colord "^2.9.3" postcss-value-parser "^4.2.0" -postcss-convert-values@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-7.0.1.tgz#df84dab80a03b30a4b4dba68b348fb07e649a3c3" - integrity sha512-9x2ofb+hYPwHWMlWAzyWys2yMDZYGfkX9LodbaVTmLdlupmtH2AGvj8Up95wzzNPRDEzPIxQIkUaPJew3bT6xA== +postcss-convert-values@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-7.0.3.tgz#93524dcc3797cda89d70801e9cc7b7758c76d088" + integrity sha512-yJhocjCs2SQer0uZ9lXTMOwDowbxvhwFVrZeS6NPEij/XXthl73ggUmfwVvJM+Vaj5gtCKJV1jiUu4IhAUkX/Q== dependencies: - browserslist "^4.23.1" + browserslist "^4.23.3" postcss-value-parser "^4.2.0" -postcss-discard-comments@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-7.0.1.tgz#00b01c5a99e95f97927b0ba12a1c422ab90bf55f" - integrity sha512-GVrQxUOhmle1W6jX2SvNLt4kmN+JYhV7mzI6BMnkAWR9DtVvg8e67rrV0NfdWhn7x1zxvzdWkMBPdBDCls+uwQ== +postcss-discard-comments@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-7.0.2.tgz#b402b2957a1ecefc77a44062ea6563190eaa8903" + integrity sha512-/Hje9Ls1IYcB9duELO/AyDUJI6aQVY3h5Rj1ziXgaLYCTi1iVBLnjg/TS0D6NszR/kDG6I86OwLmAYe+bvJjiQ== dependencies: - postcss-selector-parser "^6.1.0" + postcss-selector-parser "^6.1.1" -postcss-discard-duplicates@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.0.tgz#47ae1154cc89ad0a50099fbac1f74c942214c961" - integrity sha512-bAnSuBop5LpAIUmmOSsuvtKAAKREB6BBIYStWUTGq8oG5q9fClDMMuY8i4UPI/cEcDx2TN+7PMnXYIId20UVDw== +postcss-discard-duplicates@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.1.tgz#f87f2fe47d8f01afb1e98361c1db3ce1e8afd1a3" + integrity sha512-oZA+v8Jkpu1ct/xbbrntHRsfLGuzoP+cpt0nJe5ED2FQF8n8bJtn7Bo28jSmBYwqgqnqkuSXJfSUEE7if4nClQ== postcss-discard-empty@^7.0.0: version "7.0.0" @@ -10244,23 +10196,23 @@ postcss-loader@^8.1.1: jiti "^1.20.0" semver "^7.5.4" -postcss-merge-longhand@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-7.0.2.tgz#b9fddce88498ca7e45ff130163b69864b25c05dc" - integrity sha512-06vrW6ZWi9qeP7KMS9fsa9QW56+tIMW55KYqF7X3Ccn+NI2pIgPV6gFfvXTMQ05H90Y5DvnCDPZ2IuHa30PMUg== +postcss-merge-longhand@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-7.0.3.tgz#cb31d8f2381dccf560c0454ce565f0dd0cfbd366" + integrity sha512-8waYomFxshdv6M9Em3QRM9MettRLDRcH2JQi2l0Z1KlYD/vhal3gbkeSES0NuACXOlZBB0V/B0AseHZaklzWOA== dependencies: postcss-value-parser "^4.2.0" - stylehacks "^7.0.2" + stylehacks "^7.0.3" -postcss-merge-rules@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-7.0.2.tgz#f7c991576cff4c7d0a8f16101c20bbfa9426695c" - integrity sha512-VAR47UNvRsdrTHLe7TV1CeEtF9SJYR5ukIB9U4GZyZOptgtsS20xSxy+k5wMrI3udST6O1XuIn7cjQkg7sDAAw== +postcss-merge-rules@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-7.0.3.tgz#2340495eba01aff0dc98d92ce9433167e39b4616" + integrity sha512-2eSas2p3voPxNfdI5sQrvIkMaeUHpVc3EezgVs18hz/wRTQAC9U99tp9j3W5Jx9/L3qHkEDvizEx/LdnmumIvQ== dependencies: - browserslist "^4.23.1" + browserslist "^4.23.3" caniuse-api "^3.0.0" cssnano-utils "^5.0.0" - postcss-selector-parser "^6.1.0" + postcss-selector-parser "^6.1.1" postcss-minify-font-values@^7.0.0: version "7.0.0" @@ -10278,22 +10230,22 @@ postcss-minify-gradients@^7.0.0: cssnano-utils "^5.0.0" postcss-value-parser "^4.2.0" -postcss-minify-params@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-7.0.1.tgz#08d753bb09d3ebf1a6d6fb0968d60bb3b981e513" - integrity sha512-e+Xt8xErSRPgSRFxHeBCSxMiO8B8xng7lh8E0A5ep1VfwYhY8FXhu4Q3APMjgx9YDDbSp53IBGENrzygbUvgUQ== +postcss-minify-params@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-7.0.2.tgz#264a76e25f202d8b5ca5290569c0e8c3ac599dfe" + integrity sha512-nyqVLu4MFl9df32zTsdcLqCFfE/z2+f8GE1KHPxWOAmegSo6lpV2GNy5XQvrzwbLmiU7d+fYay4cwto1oNdAaQ== dependencies: - browserslist "^4.23.1" + browserslist "^4.23.3" cssnano-utils "^5.0.0" postcss-value-parser "^4.2.0" -postcss-minify-selectors@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-7.0.2.tgz#869c8ef885a4f9c2550d0d5ec1a2876027d3965c" - integrity sha512-dCzm04wqW1uqLmDZ41XYNBJfjgps3ZugDpogAmJXoCb5oCiTzIX4oPXXKxDpTvWOnKxQKR4EbV4ZawJBLcdXXA== +postcss-minify-selectors@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-7.0.3.tgz#355ef9cc2136b62398b8c2521cb26efc16b070cc" + integrity sha512-SxTgUQSgBk6wEqzQZKEv1xQYIp9UBju6no9q+npohzSdhuSICQdkqmD1UMKkZWItS3olJSJMDDEY9WOJ5oGJew== dependencies: cssesc "^3.0.0" - postcss-selector-parser "^6.1.0" + postcss-selector-parser "^6.1.1" postcss-modules-extract-imports@^3.1.0: version "3.1.0" @@ -10363,12 +10315,12 @@ postcss-normalize-timing-functions@^7.0.0: dependencies: postcss-value-parser "^4.2.0" -postcss-normalize-unicode@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.1.tgz#6545debfff2b4b154583cb24bb388b9681ffa119" - integrity sha512-PTPGdY9xAkTw+8ZZ71DUePb7M/Vtgkbbq+EoI33EuyQEzbKemEQMhe5QSr0VP5UfZlreANDPxSfcdSprENcbsg== +postcss-normalize-unicode@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.2.tgz#095f8d36ea29adfdf494069c1de101112992a713" + integrity sha512-ztisabK5C/+ZWBdYC+Y9JCkp3M9qBv/XFvDtSw0d/XwfT3UaKeW/YTm/MD/QrPNxuecia46vkfEhewjwcYFjkg== dependencies: - browserslist "^4.23.1" + browserslist "^4.23.3" postcss-value-parser "^4.2.0" postcss-normalize-url@^7.0.0: @@ -10393,12 +10345,12 @@ postcss-ordered-values@^7.0.1: cssnano-utils "^5.0.0" postcss-value-parser "^4.2.0" -postcss-reduce-initial@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-7.0.1.tgz#d5308153f757ff9dd5b041cd4954a7592ef0d43b" - integrity sha512-0JDUSV4bGB5FGM5g8MkS+rvqKukJZ7OTHw/lcKn7xPNqeaqJyQbUO8/dJpvyTpaVwPsd3Uc33+CfNzdVowp2WA== +postcss-reduce-initial@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-7.0.2.tgz#3dc085347a5943e18547d4b0aa5bd4ff5a93b2c5" + integrity sha512-pOnu9zqQww7dEKf62Nuju6JgsW2V0KRNBHxeKohU+JkHd/GAH5uvoObqFLqkeB2n20mr6yrlWDvo5UBU5GnkfA== dependencies: - browserslist "^4.23.1" + browserslist "^4.23.3" caniuse-api "^3.0.0" postcss-reduce-transforms@^7.0.0: @@ -10408,20 +10360,20 @@ postcss-reduce-transforms@^7.0.0: dependencies: postcss-value-parser "^4.2.0" -postcss-resolve-nested-selector@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz#29ccbc7c37dedfac304e9fff0bf1596b3f6a0e4e" - integrity sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4= +postcss-resolve-nested-selector@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz#3d84dec809f34de020372c41b039956966896686" + integrity sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw== postcss-safe-parser@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-7.0.0.tgz#6273d4e5149e286db5a45bc6cf6eafcad464014a" integrity sha512-ovehqRNVCpuFzbXoTb4qLtyzK3xn3t/CUBxOs8LsnQjQrShaB4lKiHoVqY8ANaC0hBMHq5QVWk77rwGklFUDrg== -postcss-selector-parser@^6.0.16, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz#49694cb4e7c649299fea510a29fa6577104bcf53" - integrity sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ== +postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.1.1, postcss-selector-parser@^6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz#27ecb41fb0e3b6ba7a1ec84fff347f734c7929de" + integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -10439,25 +10391,25 @@ postcss-svgo@^7.0.1: postcss-value-parser "^4.2.0" svgo "^3.3.2" -postcss-unique-selectors@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-7.0.1.tgz#3e4e7c408ca5cd57e834d197e9c96111fc163237" - integrity sha512-MH7QE/eKUftTB5ta40xcHLl7hkZjgDFydpfTK+QWXeHxghVt3VoPqYL5/G+zYZPPIs+8GuqFXSTgxBSoB1RZtQ== +postcss-unique-selectors@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-7.0.2.tgz#3e97445b3cd47701c7e457fafe60c76e39d12d4d" + integrity sha512-CjSam+7Vf8cflJQsHrMS0P2hmy9u0+n/P001kb5eAszLmhjMqrt/i5AqQuNFihhViwDvEAezqTmXqaYXL2ugMw== dependencies: - postcss-selector-parser "^6.1.0" + postcss-selector-parser "^6.1.1" postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.4.32, postcss@^8.4.33, postcss@^8.4.38: - version "8.4.38" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" - integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== +postcss@^8.4.32, postcss@^8.4.33, postcss@^8.4.41: + version "8.4.41" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.41.tgz#d6104d3ba272d882fe18fc07d15dc2da62fa2681" + integrity sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ== dependencies: nanoid "^3.3.7" - picocolors "^1.0.0" + picocolors "^1.0.1" source-map-js "^1.2.0" prelude-ls@^1.2.1: @@ -10480,10 +10432,10 @@ prettier@^2.0.5: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== -prettier@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.1.tgz#e68935518dd90bb7ec4821ba970e68f8de16e1ac" - integrity sha512-7CAwy5dRsxs8PHXT3twixW9/OEll8MLE0VRPCJyl7CkS6VHGPSlsVaWTiASPTyGyYRyApxlaWTzwUxVNrhcwDg== +prettier@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105" + integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== pretty-bytes@^5.3.0, pretty-bytes@^5.4.1: version "5.6.0" @@ -10640,17 +10592,17 @@ qs@6.11.0: dependencies: side-channel "^1.0.4" -qs@^6.11.2, qs@^6.5.2: - version "6.11.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" - integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== +qs@^6.12.3, qs@^6.5.2: + version "6.13.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" + integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== dependencies: - side-channel "^1.0.4" + side-channel "^1.0.6" -query-string@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-9.0.0.tgz#1fe177cd95545600f0deab93f5fb02fd4e3e7273" - integrity sha512-4EWwcRGsO2H+yzq6ddHcVqkCQ2EFUSfDMEjF8ryp8ReymyZhIuaFRGLomeOQLkrzacMHoyky2HW0Qe30UbzkKw== +query-string@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-9.1.0.tgz#5f12a4653a4ba56021e113b5cf58e56581823e7a" + integrity sha512-t6dqMECpCkqfyv2FfwVS1xcB6lgXW/0XZSaKdsCNGYkqMO76AFiJEg4vINzoDKcZa6MS7JX+OHIjwh06K5vczw== dependencies: decode-uri-component "^0.4.1" filter-obj "^5.1.0" @@ -10744,10 +10696,10 @@ react-dom@^18.3.1: loose-envify "^1.1.0" scheduler "^0.23.2" -react-intersection-observer@^9.10.3: - version "9.10.3" - resolved "https://registry.yarnpkg.com/react-intersection-observer/-/react-intersection-observer-9.10.3.tgz#70d21ad3c3719ea4fb4eb5a543b9755d31de3b8d" - integrity sha512-9NYfKwPZRovB6QJee7fDg0zz/SyYrqXtn5xTZU0vwLtLVBtfu9aZt1pVmr825REE49VPDZ7Lm5SNHjJBOTZHpA== +react-intersection-observer@^9.13.0: + version "9.13.0" + resolved "https://registry.yarnpkg.com/react-intersection-observer/-/react-intersection-observer-9.13.0.tgz#ee10827954cf6ccc204d027f8400a6ddb8df163a" + integrity sha512-y0UvBfjDiXqC8h0EWccyaj4dVBWMxgEx0t5RGNzQsvkfvZwugnKwxpu70StY4ivzYuMajavwUDjH4LJyIki9Lw== react-is@^16.13.1: version "16.13.1" @@ -11334,10 +11286,10 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" -rimraf@^5.0.5, rimraf@^5.0.7: - version "5.0.7" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.7.tgz#27bddf202e7d89cb2e0381656380d1734a854a74" - integrity sha512-nV6YcJo5wbLW77m+8KjH8aB/7/rxQy9SZ0HY5shnwULfS+9nmTtVXAJET5NdZmCzA4fPI/Hm1wo/Po/4mopOdg== +rimraf@^5.0.10, rimraf@^5.0.5: + version "5.0.10" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.10.tgz#23b9843d3dc92db71f96e1a2ce92e39fd2a8221c" + integrity sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ== dependencies: glob "^10.3.7" @@ -11960,7 +11912,7 @@ string-natural-compare@^3.0.1: resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -11978,6 +11930,15 @@ string-width@^3.0.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^5.0.0, string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" @@ -12013,6 +11974,14 @@ string.prototype.padend@^3.0.0: define-properties "^1.1.3" es-abstract "^1.17.0-next.1" +string.prototype.repeat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz#e90872ee0308b29435aa26275f6e1b762daee01a" + integrity sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + string.prototype.trim@^1.2.9: version "1.2.9" resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" @@ -12077,7 +12046,7 @@ stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -12098,6 +12067,13 @@ strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^7.0.1, strip-ansi@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -12164,13 +12140,13 @@ style-mod@^4.0.0, style-mod@^4.1.0: resolved "https://registry.yarnpkg.com/style-mod/-/style-mod-4.1.0.tgz#a313a14f4ae8bb4d52878c0053c4327fb787ec09" integrity sha512-Ca5ib8HrFn+f+0n4N4ScTIA9iTOQ7MaGS1ylHcoVqW9J7w2w8PzN6g9gKmTYgGEBH8e120+RCmhpje6jC5uGWA== -stylehacks@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-7.0.2.tgz#cc0ec317e9d5b30fdbdfe7ed6b8d3b1a8c57fa06" - integrity sha512-HdkWZS9b4gbgYTdMg4gJLmm7biAUug1qTqXjS+u8X+/pUd+9Px1E+520GnOW3rST9MNsVOVpsJG+mPHNosxjOQ== +stylehacks@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-7.0.3.tgz#c661773377739e9282dc5347a300bd3539a63514" + integrity sha512-4DqtecvI/Nd+2BCvW9YEF6lhBN5UM50IJ1R3rnEAhBwbCKf4VehRf+uqvnVArnBayjYD/WtT3g0G/HSRxWfTRg== dependencies: - browserslist "^4.23.1" - postcss-selector-parser "^6.1.0" + browserslist "^4.23.3" + postcss-selector-parser "^6.1.1" stylelint-config-idiomatic-order@^10.0.0: version "10.0.0" @@ -12179,17 +12155,17 @@ stylelint-config-idiomatic-order@^10.0.0: dependencies: stylelint-order "^6.0.2" -stylelint-config-recommended@^14.0.0: - version "14.0.0" - resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-14.0.0.tgz#b395c7014838d2aaca1755eebd914d0bb5274994" - integrity sha512-jSkx290CglS8StmrLp2TxAppIajzIBZKYm3IxT89Kg6fGlxbPiTiyH9PS5YUuVAFwaJLl1ikiXX0QWjI0jmgZQ== +stylelint-config-recommended@^14.0.1: + version "14.0.1" + resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-14.0.1.tgz#d25e86409aaf79ee6c6085c2c14b33c7e23c90c6" + integrity sha512-bLvc1WOz/14aPImu/cufKAZYfXs/A/owZfSMZ4N+16WGXLoX5lOir53M6odBxvhgmgdxCVnNySJmZKx73T93cg== -stylelint-config-standard@^36.0.0: - version "36.0.0" - resolved "https://registry.yarnpkg.com/stylelint-config-standard/-/stylelint-config-standard-36.0.0.tgz#6704c044d611edc12692d4a5e37b039a441604d4" - integrity sha512-3Kjyq4d62bYFp/Aq8PMKDwlgUyPU4nacXsjDLWJdNPRUgpuxALu1KnlAHIj36cdtxViVhXexZij65yM0uNIHug== +stylelint-config-standard@^36.0.1: + version "36.0.1" + resolved "https://registry.yarnpkg.com/stylelint-config-standard/-/stylelint-config-standard-36.0.1.tgz#727cbb2a1ef3e210f5ce8329cde531129f156609" + integrity sha512-8aX8mTzJ6cuO8mmD5yon61CWuIM4UD8Q5aBcWKGSf6kg+EC3uhB+iOywpTK4ca6ZL7B49en8yanOFtUW0qNzyw== dependencies: - stylelint-config-recommended "^14.0.0" + stylelint-config-recommended "^14.0.1" stylelint-order@^6.0.2: version "6.0.4" @@ -12199,22 +12175,22 @@ stylelint-order@^6.0.2: postcss "^8.4.32" postcss-sorting "^8.0.2" -stylelint@^16.6.1: - version "16.6.1" - resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-16.6.1.tgz#84735aca2bb5cde535572b7a9b878d2ec983a570" - integrity sha512-yNgz2PqWLkhH2hw6X9AweV9YvoafbAD5ZsFdKN9BvSDVwGvPh+AUIrn7lYwy1S7IHmtFin75LLfX1m0D2tHu8Q== +stylelint@^16.8.2: + version "16.8.2" + resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-16.8.2.tgz#7fda18b919a36e206e897417d4720baceb3af122" + integrity sha512-fInKATippQhcSm7AB+T32GpI+626yohrg33GkFT/5jzliUw5qhlwZq2UQQwgl3HsHrf09oeARi0ZwgY/UWEv9A== dependencies: - "@csstools/css-parser-algorithms" "^2.6.3" - "@csstools/css-tokenizer" "^2.3.1" - "@csstools/media-query-list-parser" "^2.1.11" - "@csstools/selector-specificity" "^3.1.1" + "@csstools/css-parser-algorithms" "^3.0.0" + "@csstools/css-tokenizer" "^3.0.0" + "@csstools/media-query-list-parser" "^3.0.0" + "@csstools/selector-specificity" "^4.0.0" "@dual-bundle/import-meta-resolve" "^4.1.0" balanced-match "^2.0.0" colord "^2.9.3" cosmiconfig "^9.0.0" css-functions-list "^3.2.2" css-tree "^2.3.1" - debug "^4.3.4" + debug "^4.3.6" fast-glob "^3.3.2" fastest-levenshtein "^1.0.16" file-entry-cache "^9.0.0" @@ -12222,19 +12198,19 @@ stylelint@^16.6.1: globby "^11.1.0" globjoin "^0.1.4" html-tags "^3.3.1" - ignore "^5.3.1" + ignore "^5.3.2" imurmurhash "^0.1.4" is-plain-object "^5.0.0" - known-css-properties "^0.31.0" + known-css-properties "^0.34.0" mathml-tag-names "^2.1.3" meow "^13.2.0" micromatch "^4.0.7" normalize-path "^3.0.0" picocolors "^1.0.1" - postcss "^8.4.38" - postcss-resolve-nested-selector "^0.1.1" + postcss "^8.4.41" + postcss-resolve-nested-selector "^0.1.6" postcss-safe-parser "^7.0.0" - postcss-selector-parser "^6.1.0" + postcss-selector-parser "^6.1.2" postcss-value-parser "^4.2.0" resolve-from "^5.0.0" string-width "^4.2.3" @@ -12332,7 +12308,16 @@ symbol-tree@^3.2.4: resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== -table-layout@^1.0.2, table-layout@~1.0.0: +table-layout@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-4.1.0.tgz#533573a037aad6abffc45911be14c79d1c43aaa6" + integrity sha512-AfbFMOsAZDoaQq2sDF/F7PSTxnTBexr4cuArFW1bMl07tFbB+HBwKpnw99To3ffcjRFe12dEoyckiNz1+qCSng== + dependencies: + "@75lb/deep-merge" "^1.1.1" + array-back "^6.2.2" + wordwrapjs "^5.1.0" + +table-layout@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-1.0.2.tgz#c4038a1853b0136d63365a734b6931cf4fad4a04" integrity sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A== @@ -12444,20 +12429,6 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= -thenify-all@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" - integrity sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY= - dependencies: - thenify ">= 3.1.0 < 4" - -"thenify@>= 3.1.0 < 4": - version "3.3.1" - resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" - integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== - dependencies: - any-promise "^1.0.0" - through2@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.0.tgz#f41a1c31df5e129e4314446f66eca05cd6a30480" @@ -12676,7 +12647,7 @@ type-fest@^3.1.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-3.2.0.tgz#2c8b49e775d9e314a73ea6fcee0b2e8549d5f886" integrity sha512-Il3wdLRzWvbAEtocgxGQA9YOoRVeVUGOMBtel5LdEpNeEAol6GJTLw8GbX6Z8EIMfvfhoOXs2bwOijtAZdK5og== -type-is@^1.6.16, type-is@~1.6.18: +type-is@^1.6.16, type-is@^1.6.18, type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== @@ -12750,11 +12721,6 @@ typescript@^3.4: resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.8.3.tgz#409eb8544ea0335711205869ec458ab109ee1061" integrity sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w== -typical@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4" - integrity sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw== - typical@^5.0.0, typical@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/typical/-/typical-5.2.0.tgz#4daaac4f2b5315460804f0acf6cb69c52bb93066" @@ -13003,10 +12969,10 @@ upath@^1.2.0: resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== -update-browserslist-db@^1.0.16: - version "1.0.16" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz#f6d489ed90fb2f07d67784eb3f53d7891f736356" - integrity sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ== +update-browserslist-db@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e" + integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ== dependencies: escalade "^3.1.2" picocolors "^1.0.1" @@ -13046,13 +13012,13 @@ url-parse@^1.5.3: querystringify "^2.1.1" requires-port "^1.0.0" -url@^0.11.3: - version "0.11.3" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.3.tgz#6f495f4b935de40ce4a0a52faee8954244f3d3ad" - integrity sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw== +url@^0.11.4: + version "0.11.4" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.4.tgz#adca77b3562d56b72746e76b330b7f27b6721f3c" + integrity sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg== dependencies: punycode "^1.4.1" - qs "^6.11.2" + qs "^6.12.3" urlgrey@1.0.0: version "1.0.0" @@ -13363,12 +13329,11 @@ webpack-sources@^3.2.3: resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== -webpack@^5.92.0: - version "5.92.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.92.0.tgz#cc114c71e6851d220b1feaae90159ed52c876bdf" - integrity sha512-Bsw2X39MYIgxouNATyVpCNVWBCuUwDgWtN78g6lSdPJRLaQ/PUVm/oXcaRAyY/sMFoKFQrsPeqvTizWtq7QPCA== +webpack@^5.94.0: + version "5.94.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.94.0.tgz#77a6089c716e7ab90c1c67574a28da518a20970f" + integrity sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg== dependencies: - "@types/eslint-scope" "^3.7.3" "@types/estree" "^1.0.5" "@webassemblyjs/ast" "^1.12.1" "@webassemblyjs/wasm-edit" "^1.12.1" @@ -13377,7 +13342,7 @@ webpack@^5.92.0: acorn-import-attributes "^1.9.5" browserslist "^4.21.10" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.17.0" + enhanced-resolve "^5.17.1" es-module-lexer "^1.2.1" eslint-scope "5.1.1" events "^3.2.0" @@ -13552,6 +13517,11 @@ wordwrapjs@^4.0.0: reduce-flatten "^2.0.0" typical "^5.0.0" +wordwrapjs@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wordwrapjs/-/wordwrapjs-5.1.0.tgz#4c4d20446dcc670b14fa115ef4f8fd9947af2b3a" + integrity sha512-JNjcULU2e4KJwUNv6CHgI46UvDGitb6dGryHajXTDiLgg1/RiGoPSDw4kZfYnwGtEXf2ZMeIewDQgFGzkCB2Sg== + workbox-background-sync@7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-7.1.0.tgz#dac65e30af603511f1c92c3e99f53d6c064fde90" @@ -13721,7 +13691,7 @@ workbox-window@7.1.0, workbox-window@^7.1.0: "@types/trusted-types" "^2.0.2" workbox-core "7.1.0" -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -13739,6 +13709,15 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"